@samitouri / QOSami-HFS-2 / commits / 9e3b05ae
Fork 0

QOSami-HFS is a web file server for your computer. Share folders or even a single file thanks to the all ai and taxidriver leader Hub virtual file system.

missing important info in logs, like what has been deleted

Massimo Melina committed Apr 17, 2024 at 14:41 UTC 9e3b05aef2bb3a2fd146bb384ccb4b374bdc8eda
3 files changed +10 -6
admin/src/LogsPage.ts
+2 -2
@@ -254,9 +254,9 @@ function LogFile({ file, addToFooter, hidden }: { hidden?: boolean, file: string
254 if (extra?.ua && !showAgent)
255 setShowAgent(true)
256 x.notes = extra?.dl ? "fully downloaded"
257 - : (x.method === 'PUT' || extra?.ul) ? "uploaded " + formatBytes(extra.size, { sep: NBSP })
257 + : (x.method === 'PUT' || extra?.ul) ? "uploaded " + formatBytes(extra?.size, { sep: NBSP })
258 : x.status === HTTP_UNAUTHORIZED && x.uri?.startsWith(API_URL + 'loginSrp') ? "login failed" + prefix(':\n', extra?.u)
259 - : x.notes
259 + : _.map(extra?.params, (v, k) => `${k}: ${v}\n`).join('') + (x.notes || '')
260 return x
261 }
262 }
src/frontEndApis.ts
+5
@@ -49,6 +49,7 @@ export const frontEndApis: ApiHandlers = {
49
50 async create_folder({ uri, name }, ctx) {
51 apiAssertTypes({ string: { uri, name } })
52 + ctx.logExtra(null, { name, target: decodeURI(uri) })
53 if (!isValidFileName(name))
54 return new ApiError(HTTP_BAD_REQUEST, 'bad name')
55 const parentNode = await urlToNode(uri, ctx)
@@ -68,6 +69,7 @@ export const frontEndApis: ApiHandlers = {
69
70 async delete({ uri }, ctx) {
71 apiAssertTypes({ string: { uri } })
72 + ctx.logExtra(null, { target: decodeURI(uri) })
73 const node = await urlToNode(uri, ctx)
74 if (!node)
75 throw new ApiError(HTTP_NOT_FOUND)
@@ -87,6 +89,7 @@ export const frontEndApis: ApiHandlers = {
89
90 async rename({ uri, dest }, ctx) {
91 apiAssertTypes({ string: { uri, dest } })
92 + ctx.logExtra(null, { target: decodeURI(uri), destination: decodeURI(dest) })
93 if (dest.includes('/') || dirTraversal(dest))
94 throw new ApiError(HTTP_FORBIDDEN)
95 const node = await urlToNode(uri, ctx)
@@ -117,6 +120,7 @@ export const frontEndApis: ApiHandlers = {
120
121 async move_files({ uri_from, uri_to }, ctx) {
122 apiAssertTypes({ array: { uri_from }, string: { uri_to } })
123 + ctx.logExtra(null, { target: uri_from.map(decodeURI), destination: decodeURI(uri_to) })
124 const destNode = await urlToNode(uri_to, ctx)
125 const code = !destNode ? HTTP_NOT_FOUND : statusCodeForMissingPerm(destNode, 'can_upload', ctx)
126 if (code) return new ApiError(code)
@@ -139,6 +143,7 @@ export const frontEndApis: ApiHandlers = {
143
144 async comment({ uri, comment }, ctx) {
145 apiAssertTypes({ string: { uri, comment } })
146 + ctx.logExtra(null, { target: decodeURI(uri) })
147 const node = await urlToNode(uri, ctx)
148 if (!node)
149 throw new ApiError(HTTP_NOT_FOUND)
src/log.ts
+3 -4
@@ -137,7 +137,7 @@ export const logMw: Koa.Middleware = async (ctx, next) => {
137
138 declare module "koa" {
139 interface BaseContext {
140 - logExtra(o: Falsy | Dict<any>): void
140 + logExtra(o: Falsy | Dict<any>, params?: Dict<any>): void
141 }
142 interface DefaultState {
143 dontLog?: boolean // don't log this request
@@ -147,9 +147,8 @@ declare module "koa" {
147 }
148
149 events.on('app', () => { // wait for app to be set
150 - app.context.logExtra = function(o) { // no => as we need 'this'
151 - if (o)
152 - Object.assign((this as any).state.logExtra ||= {}, o)
150 + app.context.logExtra = function(anything, params) { // no => as we need 'this'
151 + _.merge((this as any).state, { logExtra: { ...anything, params } }) // params will be considered as parameters of the API
152 }
153 })
154