diff --git a/frontend/src/api/pub.js b/frontend/src/api/pub.js index 5afd0913..b4d4a2dd 100644 --- a/frontend/src/api/pub.js +++ b/frontend/src/api/pub.js @@ -1,23 +1,47 @@ -import { fetchJSON, removePrefix } from './utils' +import { fetchURL, removePrefix } from './utils' import { baseURL } from '@/utils/constants' -export async function fetch(hash, password = "") { - return fetchJSON(`/api/public/share/${hash}`, { +export async function fetch (url, password = "") { + url = removePrefix(url) + + const res = await fetchURL(`/api/public/share${url}`, { headers: {'X-SHARE-PASSWORD': password}, }) + + if (res.status === 200) { + let data = await res.json() + data.url = `/share${url}` + + if (data.isDir) { + if (!data.url.endsWith('/')) data.url += '/' + data.items = data.items.map((item, index) => { + item.index = index + item.url = `${data.url}${encodeURIComponent(item.name)}` + + if (item.isDir) { + item.url += '/' + } + + return item + }) + } + + return data + } else { + throw new Error(res.status) + } } export function download(format, hash, token, ...files) { let url = `${baseURL}/api/public/dl/${hash}` - const prefix = `/share/${hash}` if (files.length === 1) { - url += removePrefix(files[0], prefix) + '?' + url += encodeURIComponent(files[0]) + '?' } else { let arg = '' for (let file of files) { - arg += removePrefix(file, prefix) + ',' + arg += encodeURIComponent(file) + ',' } arg = arg.substring(0, arg.length - 1) diff --git a/frontend/src/api/utils.js b/frontend/src/api/utils.js index ffe7844c..4659a260 100644 --- a/frontend/src/api/utils.js +++ b/frontend/src/api/utils.js @@ -33,12 +33,8 @@ export async function fetchJSON (url, opts) { } } -export function removePrefix (url, prefix) { - if (url.startsWith('/files')) { - url = url.slice(6) - } else if (prefix) { - url = url.replace(prefix, '') - } +export function removePrefix (url) { + url = url.split('/').splice(2).join('/') if (url === '') url = '/' if (url[0] !== '/') url = '/' + url diff --git a/frontend/src/views/Share.vue b/frontend/src/views/Share.vue index e3897fad..383f494e 100644 --- a/frontend/src/views/Share.vue +++ b/frontend/src/views/Share.vue @@ -31,7 +31,7 @@ {{ $t('buttons.download') }}
- +
@@ -122,7 +122,6 @@ export default { }, data: () => ({ error: null, - path: '', showLimit: 500, password: '', attemptedPasswordLogin: false, @@ -158,10 +157,9 @@ export default { if (this.token !== ''){ queryArg = `?token=${this.token}` } - return `${baseURL}/api/public/dl/${this.hash}${this.path}${queryArg}` - }, - fullLink: function () { - return window.location.origin + this.link + + const path = this.$route.path.split('/').splice(2).join('/') + return `${baseURL}/api/public/dl/${path}${queryArg}` }, humanSize: function () { if (this.req.isDir) { @@ -193,20 +191,19 @@ export default { this.setLoading(true) this.error = null + if (this.password !== ''){ + this.attemptedPasswordLogin = true + } + + let url = this.$route.path + if (url === '') url = '/' + if (url[0] !== '/') url = '/' + url + try { - if (this.password !== ''){ - this.attemptedPasswordLogin = true - } - let file = await api.fetch(encodeURIComponent(this.$route.params.pathMatch), this.password) - this.path = file.path - if (this.path.endsWith('/')) this.path = this.path.slice(0, -1) + let file = await api.fetch(url, this.password) this.token = file.token || '' - if (file.isDir) file.items = file.items.map((item, index) => { - item.index = index - item.url = `/share/${this.hash}${this.path}/${encodeURIComponent(item.name)}` - return item - }) + this.updateRequest(file) this.setLoading(false) } catch (e) { @@ -228,7 +225,7 @@ export default { }, download () { if (this.selectedCount === 1 && !this.req.items[this.selected[0]].isDir) { - api.download(null, this.hash, this.token, this.req.items[this.selected[0]].url) + api.download(null, this.hash, this.token, this.req.items[this.selected[0]].path) return } @@ -240,7 +237,7 @@ export default { let files = [] for (let i of this.selected) { - files.push(this.req.items[i].url) + files.push(this.req.items[i].path) } api.download(format, this.hash, this.token, ...files)