don't show uploader's ip if you are not admin
Massimo Melina committed
Aug 24, 2024 at 17:40 UTC
c8a2bdb7ab983b67c9039fa71cffd2cef909a100
3 files changed
+19
-5
frontend/src/fileMenu.ts
+8
-1
@@ -99,7 +99,8 @@ export function openFileMenu(entry: DirEntry, ev: MouseEvent, addToMenu: (FileMe
99
const {t} = useI18N()
100
const details = useApi('get_file_details', { uris: [entry.uri] }).data?.details?.[0]
101
const showProps = [ ...props,
102
- with_(details?.upload, x => x && { id: 'uploader', label: t`Uploader`, value: x.ip + prefix(' (', x.username, ')') })
102
+ with_(renderUploaderFromDetails(details), value =>
103
+ value && { id: 'uploader', label: t`Uploader`, value })
104
]
105
return h(Fragment, {},
106
h('dl', { className: 'file-dialog-properties' },
@@ -200,4 +201,10 @@ export function makeOnClickOpen(entry: DirEntry) {
201
return setTimeout(() => getHFS().navigate(entry.uri)) // couldn't find the reason why navigating sync is reverted back
202
location.href = entry.uri
203
}
204
+}
205
+
206
+function renderUploaderFromDetails(details: any) {
207
+ if (!details) return
208
+ const { upload: u } = details
209
+ return u && `${u.username||''}${prefix('@', u.ip)}`
210
}
\ No newline at end of file
plugins/list-uploader/public/main.js
+3
-2
@@ -10,10 +10,11 @@
10
const text = React.useMemo(() => {
11
if (!data || data === true) return ''
12
const { upload: x } = data
13
+ const shouldShowIpWithUser = display === 'ip+user' && x.ip || display === 'tooltip' && HFS.state.adminUrl
14
return !x ? ''
15
: display === 'user' ? x.username
15
- : display === 'ip' || !x.username ? x.ip
16
- : x.ip + ' (' + x.username + ')'
16
+ : display === 'ip' || !x.username && shouldShowIpWithUser ? x.ip
17
+ : shouldShowIpWithUser ? x.ip + ' (' + x.username + ')' : x.username
18
}, [data])
19
const iconOnly = display === 'tooltip'
20
return text && HFS.h('span', { className: 'uploader', title: HFS.t`Uploader` + (iconOnly ? ' ' + text : '') },
src/frontEndApis.ts
+8
-2
@@ -15,6 +15,8 @@ import { getUploadMeta } from './upload'
15
import { apiAssertTypes, deleteNode } from './misc'
16
import { getCommentFor, setCommentFor } from './comments'
17
import { SendListReadable } from './SendList'
18
+import { ctxAdminAccess } from './adminApis'
19
+import _ from 'lodash'
20
21
export const frontEndApis: ApiHandlers = {
22
get_file_list,
@@ -34,6 +36,7 @@ export const frontEndApis: ApiHandlers = {
36
async get_file_details({ uris }, ctx) {
37
if (typeof uris?.[0] !== 'string')
38
return new ApiError(HTTP_BAD_REQUEST, 'bad uris')
39
+ const isAdmin = ctxAdminAccess(ctx)
40
return {
41
details: await Promise.all(uris.map(async (uri: any) => {
42
if (typeof uri !== 'string')
@@ -41,8 +44,11 @@ export const frontEndApis: ApiHandlers = {
44
const node = await urlToNode(uri, ctx)
45
if (!node)
46
return false
44
- const upload = node.source && await getUploadMeta(node.source).catch(() => undefined)
45
- return upload && { upload }
47
+ let upload = node.source && await getUploadMeta(node.source).catch(() => undefined)
48
+ if (!upload) return
49
+ if (!isAdmin)
50
+ upload = _.omit(upload, 'ip')
51
+ return { upload }
52
}))
53
}
54
},