diff --git a/frontend/src/components/dialog/generate-share-link.js b/frontend/src/components/dialog/generate-share-link.js index 5a8ac8c3e1..840d254648 100644 --- a/frontend/src/components/dialog/generate-share-link.js +++ b/frontend/src/components/dialog/generate-share-link.js @@ -3,8 +3,9 @@ import PropTypes from 'prop-types'; import moment from 'moment'; import copy from 'copy-to-clipboard'; import { Button, Form, FormGroup, Label, Input, InputGroup, InputGroupAddon, Alert } from 'reactstrap'; -import { gettext, shareLinkExpireDaysMin, shareLinkExpireDaysMax } from '../../utils/constants'; +import { gettext, shareLinkExpireDaysMin, shareLinkExpireDaysMax, shareLinkPasswordMinLength } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import SharedLinkInfo from '../../models/shared-link-info'; import toaster from '../toast'; @@ -68,7 +69,7 @@ class GenerateShareLink extends React.Component { } generatePassword = () => { - let val = Math.random().toString(36).substr(5); + let val = Utils.generatePassword(shareLinkPasswordMinLength); this.setState({ password: val, passwdnew: val @@ -165,7 +166,7 @@ class GenerateShareLink extends React.Component { this.setState({errorInfo: 'Please enter password'}); return false; } - if (password.length < 8) { + if (password.length < shareLinkPasswordMinLength) { this.setState({errorInfo: 'Password is too short'}); return false; } @@ -237,6 +238,10 @@ class GenerateShareLink extends React.Component { } render() { + + let passwordLengthTip = gettext('(at least {passwordLength} characters)'); + passwordLengthTip = passwordLengthTip.replace('{passwordLength}', shareLinkPasswordMinLength); + if (this.state.sharedLinkInfo) { let sharedLinkInfo = this.state.sharedLinkInfo; return ( @@ -293,7 +298,7 @@ class GenerateShareLink extends React.Component { {this.state.isShowPasswordInput && {/* todo translate */} - {' '}{gettext('(at least 8 characters)')} + {' '}{passwordLengthTip} diff --git a/frontend/src/components/dialog/generate-upload-link.js b/frontend/src/components/dialog/generate-upload-link.js index 2e349f679c..fd671a579f 100644 --- a/frontend/src/components/dialog/generate-upload-link.js +++ b/frontend/src/components/dialog/generate-upload-link.js @@ -2,8 +2,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import copy from 'copy-to-clipboard'; import { Button, Form, FormGroup, FormText, Label, Input, InputGroup, InputGroupAddon, Alert } from 'reactstrap'; -import { gettext } from '../../utils/constants'; +import { gettext, shareLinkPasswordMinLength } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import { Utils } from '../../utils/utils'; import SharedUploadInfo from '../../models/shared-upload-info'; import toaster from '../toast'; @@ -56,7 +57,7 @@ class GenerateUploadLink extends React.Component { } generatePassword = () => { - let val = Math.random().toString(36).substr(5); + let val = Utils.generatePassword(shareLinkPasswordMinLength); this.setState({ password: val, passwordnew: val @@ -84,7 +85,7 @@ class GenerateUploadLink extends React.Component { errorInfo: gettext('Please enter password') }); } - else if (this.state.showPasswordInput && (this.state.showPasswordInput && this.state.password.length < 8)) { + else if (this.state.showPasswordInput && (this.state.showPasswordInput && this.state.password.length < shareLinkPasswordMinLength)) { this.setState({ errorInfo: gettext('Password is too short') }); @@ -121,6 +122,10 @@ class GenerateUploadLink extends React.Component { } render() { + + let passwordLengthTip = gettext('(at least {passwordLength} characters)'); + passwordLengthTip = passwordLengthTip.replace('{passwordLength}', shareLinkPasswordMinLength); + if (this.state.sharedUploadInfo) { let sharedUploadInfo = this.state.sharedUploadInfo; return ( @@ -151,7 +156,7 @@ class GenerateUploadLink extends React.Component { {this.state.showPasswordInput && {/* todo translate */} - {' '}{gettext('(at least 8 characters)')} + {' '}{passwordLengthTip} diff --git a/frontend/src/utils/constants.js b/frontend/src/utils/constants.js index fcc07050bb..2f51bfe9f3 100644 --- a/frontend/src/utils/constants.js +++ b/frontend/src/utils/constants.js @@ -35,6 +35,7 @@ export const enableUploadFolder = window.app.pageOptions.enableUploadFolder === export const enableResumableFileUpload = window.app.pageOptions.enableResumableFileUpload === 'True'; export const storages = window.app.pageOptions.storages; // storage backends export const enableRepoSnapshotLabel = window.app.pageOptions.enableRepoSnapshotLabel; +export const shareLinkPasswordMinLength = window.app.pageOptions.shareLinkPasswordMinLength; export const shareLinkExpireDaysMin = window.app.pageOptions.shareLinkExpireDaysMin; export const shareLinkExpireDaysMax = window.app.pageOptions.shareLinkExpireDaysMax; export const maxFileName = window.app.pageOptions.maxFileName; diff --git a/frontend/src/utils/utils.js b/frontend/src/utils/utils.js index a39a5f8b2a..b9bd17c5fd 100644 --- a/frontend/src/utils/utils.js +++ b/frontend/src/utils/utils.js @@ -813,4 +813,13 @@ export const Utils = { } }, + generatePassword: function(passwordLength) { + let possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789'; + let password = ''; + for (let i = 0; i < passwordLength; i++) { + password += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return password; + } + }; diff --git a/seahub/templates/base_for_react.html b/seahub/templates/base_for_react.html index 0dd23e9f9a..9424d82aee 100644 --- a/seahub/templates/base_for_react.html +++ b/seahub/templates/base_for_react.html @@ -73,6 +73,7 @@ return storages; })(), enableRepoSnapshotLabel: {% if enable_repo_snapshot_label %} true {% else %} false {% endif %}, + shareLinkPasswordMinLength: {{ share_link_password_min_length }}, shareLinkExpireDaysMin: "{{ share_link_expire_days_min }}", shareLinkExpireDaysMax: "{{ share_link_expire_days_max }}", maxFileName: "{{ max_file_name }}",