diff --git a/frontend/src/components/file-uploader/file-uploader.js b/frontend/src/components/file-uploader/file-uploader.js index 34f0bca42a..247ae84626 100644 --- a/frontend/src/components/file-uploader/file-uploader.js +++ b/frontend/src/components/file-uploader/file-uploader.js @@ -55,6 +55,7 @@ class FileUploader extends React.Component { this.loaded = 0; this.bitrateInterval = 500; // Interval in milliseconds to calculate the bitrate window.onbeforeunload = this.onbeforeunload; + this.isUploadLinkLoaded = false; } componentDidMount() { @@ -188,14 +189,27 @@ class FileUploader extends React.Component { }); } else { this.setUploadFileList(this.resumable.files); - this.resumableUpload(resumableFile); + let { repoID, path } = this.props; + seafileAPI.getUploadLink(repoID, path).then(res => { + this.resumable.opts.target = res.data + '?ret-json=1'; + this.resumableUpload(resumableFile); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }); } } else { this.setUploadFileList(this.resumable.files); - if (isFile) { - this.resumableUpload(resumableFile); - } else { - this.resumable.upload(); + if (!this.isUploadLinkLoaded) { + this.isUploadLinkLoaded = true; + let { repoID, path } = this.props; + seafileAPI.getUploadLink(repoID, path).then(res => { + this.resumable.opts.target = res.data + '?ret-json=1'; + this.resumable.upload(); + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); + }); } } } @@ -384,6 +398,8 @@ class FileUploader extends React.Component { onComplete = () => { this.notifiedFolders = []; + // reset upload link loaded + this.isUploadLinkLoaded = false; this.setState({allFilesUploaded: true}); } @@ -392,6 +408,8 @@ class FileUploader extends React.Component { } onError = (message) => { + // reset upload link loaded + this.isUploadLinkLoaded = false; // After the error, the user can switch windows Utils.registerGlobalVariable('uploader', 'totalProgress', 100); } @@ -445,52 +463,24 @@ class FileUploader extends React.Component { onFileUpload = () => { this.uploadInput.current.removeAttribute('webkitdirectory'); - let repoID = this.props.repoID; - seafileAPI.getUploadLink(repoID, this.props.path).then(res => { - this.resumable.opts.target = res.data + '?ret-json=1'; - if (Utils.isIEBrower()) { - this.uploadInput.current.click(); - } - }).catch(error => { - let errMessage = Utils.getErrorMsg(error); - toaster.danger(errMessage); - }); - if (!Utils.isIEBrower()) { + this.uploadInput.current.click(); - } } onFolderUpload = () => { this.uploadInput.current.setAttribute('webkitdirectory', 'webkitdirectory'); - let repoID = this.props.repoID; - seafileAPI.getUploadLink(repoID, this.props.path).then(res => { - this.resumable.opts.target = res.data + '?ret-json=1'; - if (Utils.isIEBrower()) { - this.uploadInput.current.click(); - } - }).catch(error => { - let errMessage = Utils.getErrorMsg(error); - toaster.danger(errMessage); - }); - if (!Utils.isIEBrower()) { this.uploadInput.current.click(); - } } onDragStart = () => { - let repoID = this.props.repoID; this.uploadInput.current.setAttribute('webkitdirectory', 'webkitdirectory'); - seafileAPI.getUploadLink(repoID, this.props.path).then(res => { - this.resumable.opts.target = res.data + '?ret-json=1'; - }).catch(error => { - let errMessage = Utils.getErrorMsg(error); - toaster.danger(errMessage); - }); } onCloseUploadDialog = () => { this.loaded = 0; this.resumable.files = []; + // reset upload link loaded + this.isUploadLinkLoaded = false; this.setState({isUploadProgressDialogShow: false, uploadFileList: []}); Utils.registerGlobalVariable('uploader', 'isUploadProgressDialogShow', false); } @@ -532,12 +522,14 @@ class FileUploader extends React.Component { totalProgress: '100', uploadFileList: uploadFileList }); + // reset upload link loaded + this.isUploadLinkLoaded = false; } onUploadRetry = (resumableFile) => { seafileAPI.getUploadLink(this.props.repoID, this.props.path).then(res => { - this.resumable.opts.target = res.data; + this.resumable.opts.target = res.data + '?ret-json=1'; let retryFileList = this.state.retryFileList.filter(item => { return item.uniqueIdentifier !== resumableFile.uniqueIdentifier; @@ -563,7 +555,7 @@ class FileUploader extends React.Component { onUploadRetryAll = () => { seafileAPI.getUploadLink(this.props.repoID, this.props.path).then(res => { - this.resumable.opts.target = res.data; + this.resumable.opts.target = res.data + '?ret-json=1'; this.state.retryFileList.forEach(item => { item.error = false; this.retryUploadFile(item); @@ -632,14 +624,22 @@ class FileUploader extends React.Component { uploadFile = () => { let resumableFile = this.resumable.files[this.resumable.files.length - 1]; - this.setState({ - isUploadRemindDialogShow: false, - isUploadProgressDialogShow: true, - uploadFileList: [...this.state.uploadFileList, resumableFile] - }, () => { - this.resumable.upload(); + let { repoID, path } = this.props; + seafileAPI.getUploadLink(repoID, path).then((res) => { // get upload link + this.resumable.opts.target = res.data + '?ret-json=1'; + this.setState({ + isUploadRemindDialogShow: false, + isUploadProgressDialogShow: true, + uploadFileList: [...this.state.uploadFileList, resumableFile] + }, () => { + this.resumable.upload(); + }); + Utils.registerGlobalVariable('uploader', 'isUploadProgressDialogShow', true); + + }).catch(error => { + let errMessage = Utils.getErrorMsg(error); + toaster.danger(errMessage); }); - Utils.registerGlobalVariable('uploader', 'isUploadProgressDialogShow', true); } cancelFileUpload = () => { diff --git a/frontend/src/pages/lib-content-view/lib-content-view.js b/frontend/src/pages/lib-content-view/lib-content-view.js index d9e626e4de..c37648d143 100644 --- a/frontend/src/pages/lib-content-view/lib-content-view.js +++ b/frontend/src/pages/lib-content-view/lib-content-view.js @@ -797,8 +797,13 @@ class LibContentView extends React.Component { this.showFile(path); } else { let url = siteRoot + 'lib/' + item.repo_id + '/file' + Utils.encodePath(path); - let newWindow = window.open('about:blank'); - newWindow.location.href = url; + let isWeChat = Utils.isWeChat(); + if (!isWeChat) { + let newWindow = window.open('about:blank'); + newWindow.location.href = url; + } else { + location.href = url; + } } } } else { @@ -806,8 +811,13 @@ class LibContentView extends React.Component { this.showDir(path); } else { let url = siteRoot + 'lib/' + item.repo_id + '/file' + Utils.encodePath(path); - let newWindow = window.open('about:blank'); - newWindow.location.href = url; + let isWeChat = Utils.isWeChat(); + if (!isWeChat) { + let newWindow = window.open('about:blank'); + newWindow.location.href = url; + } else { + location.href = url; + } } } } @@ -1069,6 +1079,7 @@ class LibContentView extends React.Component { this.showColumnMarkdownFile(direntPath); } else { const url = siteRoot + 'lib/' + repoID + '/file' + Utils.encodePath(direntPath); + let isWeChat = Utils.isWeChat(); if (!isWeChat) { let newWindow = window.open('about:blank'); diff --git a/seahub/api2/views.py b/seahub/api2/views.py index 364fe0d651..71012fdbe1 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -1274,6 +1274,7 @@ class Repo(APIView): } if repo.encrypted: repo_json["enc_version"] = repo.enc_version + repo_json["salt"] = repo.salt if repo.enc_version == 3 else '' repo_json["magic"] = repo.magic repo_json["random_key"] = repo.random_key diff --git a/seahub/auth/views.py b/seahub/auth/views.py index edf5caa626..dc09a4a832 100644 --- a/seahub/auth/views.py +++ b/seahub/auth/views.py @@ -248,6 +248,8 @@ def logout(request, next_page=None, if shib_logout_return: shib_logout_url += shib_logout_return response = HttpResponseRedirect(shib_logout_url) + response.delete_cookie('seahub_auth') + return response # Local logout for cas user. if getattr(settings, 'ENABLE_CAS', False):