Added ability to share folder for view rendering

This commit is contained in:
Jonathan Sheely 2024-03-18 20:45:51 -04:00
parent 05bfae264a
commit 3c56c91c46
5 changed files with 37 additions and 4 deletions

View File

@ -34,3 +34,6 @@ export async function create(url, password = "", expires = "", unit = "hours") {
export function getShareURL(share) { export function getShareURL(share) {
return createURL("share/" + share.hash, {}, false); return createURL("share/" + share.hash, {}, false);
} }
export function getViewURL(share) {
return createURL("api/public/view/" + share.hash + "/index.html", {}, false);
}

View File

@ -32,6 +32,16 @@
<i class="material-icons">content_paste</i> <i class="material-icons">content_paste</i>
</button> </button>
</td> </td>
<td class="small">
<button
class="action copy-clipboard"
:data-clipboard-text="buildViewLink(link)"
:aria-label="$t('buttons.copyToClipboard')"
:title="$t('buttons.copyToClipboard')"
>
<i class="material-icons">content_paste_search</i>
</button>
</td>
<td class="small" v-if="hasDownloadLink()"> <td class="small" v-if="hasDownloadLink()">
<button <button
class="action copy-clipboard" class="action copy-clipboard"
@ -225,6 +235,9 @@ export default {
buildLink(share) { buildLink(share) {
return api.getShareURL(share); return api.getShareURL(share);
}, },
buildViewLink(share) {
return api.getViewURL(share);
},
hasDownloadLink() { hasDownloadLink() {
return ( return (
this.selected.length === 1 && !this.req.items[this.selected[0]].isDir this.selected.length === 1 && !this.req.items[this.selected[0]].isDir

View File

@ -88,6 +88,7 @@ func NewHandler(
public := api.PathPrefix("/public").Subrouter() public := api.PathPrefix("/public").Subrouter()
public.PathPrefix("/dl").Handler(monkey(publicDlHandler, "/api/public/dl/")).Methods("GET") public.PathPrefix("/dl").Handler(monkey(publicDlHandler, "/api/public/dl/")).Methods("GET")
public.PathPrefix("/view").Handler(monkey(publicViewHandler, "/api/public/view/")).Methods("GET")
public.PathPrefix("/share").Handler(monkey(publicShareHandler, "/api/public/share/")).Methods("GET") public.PathPrefix("/share").Handler(monkey(publicShareHandler, "/api/public/share/")).Methods("GET")
return stripPrefix(server.BaseURL, r), nil return stripPrefix(server.BaseURL, r), nil

View File

@ -115,6 +115,15 @@ var publicDlHandler = withHashFile(func(w http.ResponseWriter, r *http.Request,
return rawDirHandler(w, r, d, file) return rawDirHandler(w, r, d, file)
}) })
var publicViewHandler = withHashFile(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) {
file := d.raw.(*files.FileInfo)
if !file.IsDir {
return rawFileHandler(w, r, file, false)
}
return rawDirHandler(w, r, d, file, false)
})
func authenticateShareRequest(r *http.Request, l *share.Link) (int, error) { func authenticateShareRequest(r *http.Request, l *share.Link) (int, error) {
if l.PasswordHash == "" { if l.PasswordHash == "" {
return 0, nil return 0, nil

View File

@ -158,7 +158,7 @@ func addFile(ar archiver.Writer, d *data, path, commonPath string) error {
return nil return nil
} }
func rawDirHandler(w http.ResponseWriter, r *http.Request, d *data, file *files.FileInfo) (int, error) { func rawDirHandler(w http.ResponseWriter, r *http.Request, d *data, file *files.FileInfo, setContentDispositionOptional ...bool) (int, error) {
filenames, err := parseQueryFiles(r, file, d.user) filenames, err := parseQueryFiles(r, file, d.user)
if err != nil { if err != nil {
return http.StatusInternalServerError, err return http.StatusInternalServerError, err
@ -187,7 +187,10 @@ func rawDirHandler(w http.ResponseWriter, r *http.Request, d *data, file *files.
name = "_" + name name = "_" + name
} }
name += extension name += extension
w.Header().Set("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(name))
if len(setContentDispositionOptional) == 0 || (len(setContentDispositionOptional) > 0 && setContentDispositionOptional[0]) {
w.Header().Set("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(name))
}
for _, fname := range filenames { for _, fname := range filenames {
err = addFile(ar, d, fname, commonDir) err = addFile(ar, d, fname, commonDir)
@ -199,14 +202,18 @@ func rawDirHandler(w http.ResponseWriter, r *http.Request, d *data, file *files.
return 0, nil return 0, nil
} }
func rawFileHandler(w http.ResponseWriter, r *http.Request, file *files.FileInfo) (int, error) { func rawFileHandler(w http.ResponseWriter, r *http.Request, file *files.FileInfo, setContentDispositionOptional ...bool) (int, error) {
fd, err := file.Fs.Open(file.Path) fd, err := file.Fs.Open(file.Path)
if err != nil { if err != nil {
return http.StatusInternalServerError, err return http.StatusInternalServerError, err
} }
defer fd.Close() defer fd.Close()
setContentDisposition(w, r, file) // Check if setContentDispositionOptional is provided and false
if len(setContentDispositionOptional) == 0 || (len(setContentDispositionOptional) > 0 && setContentDispositionOptional[0]) {
setContentDisposition(w, r, file)
}
w.Header().Add("Content-Security-Policy", `script-src 'none';`) w.Header().Add("Content-Security-Policy", `script-src 'none';`)
w.Header().Set("Cache-Control", "private") w.Header().Set("Cache-Control", "private")
http.ServeContent(w, r, file.Name, file.ModTime, fd) http.ServeContent(w, r, file.Name, file.ModTime, fd)