From 8c1b926008f8f814330de9cbce597c245d4d568a Mon Sep 17 00:00:00 2001 From: or-else Date: Wed, 6 Nov 2019 11:25:07 +0300 Subject: [PATCH] enforce maximum title length for topics and users --- src/config.js | 3 +++ src/views/create-account-view.jsx | 5 +++-- src/views/info-view.jsx | 13 +++++++------ src/widgets/new-topic-group.jsx | 11 +++++++---- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/config.js b/src/config.js index 767b9c69..3c83b51b 100644 --- a/src/config.js +++ b/src/config.js @@ -69,6 +69,9 @@ export const MAX_IMAGE_DIM = 768; // hidden under "+X more" export const MAX_ONLINE_IN_TOPIC = 4; +// Maximum length of topic title (and Private comment) or user name. +export const MAX_TITLE_LENGTH = 40; + // Link for "Contact Us". export const LINK_CONTACT_US = 'email:info@tinode.co'; diff --git a/src/views/create-account-view.jsx b/src/views/create-account-view.jsx index c226db4b..1acaf49f 100644 --- a/src/views/create-account-view.jsx +++ b/src/views/create-account-view.jsx @@ -9,6 +9,8 @@ import VisiblePassword from '../widgets/visible-password.jsx'; import LocalStorageUtil from '../lib/local-storage.js'; import { vcard } from '../lib/utils.js'; +import { MAX_TITLE_LENGTH } from '../config.js'; + export default class CreateAccountView extends React.PureComponent { constructor(props) { super(props); @@ -59,12 +61,11 @@ export default class CreateAccountView extends React.PureComponent { handleSubmit(e) { e.preventDefault(); - // TODO: check email for validity this.setState({errorCleared: false}); this.props.onCreateAccount( this.state.login.trim(), this.state.password.trim(), - vcard(this.state.fn, this.state.imageDataUrl), + vcard(this.state.fn.trim().substring(0, MAX_TITLE_LENGTH), this.state.imageDataUrl), {'meth': 'email', 'val': this.state.email}); } diff --git a/src/views/info-view.jsx b/src/views/info-view.jsx index 4fa007d7..ad448f04 100644 --- a/src/views/info-view.jsx +++ b/src/views/info-view.jsx @@ -15,7 +15,7 @@ import MoreButton from '../widgets/more-button.jsx'; import PermissionsEditor from '../widgets/permissions-editor.jsx'; import TagManager from '../widgets/tag-manager.jsx'; -import { NO_ACCESS_MODE } from '../config.js'; +import { MAX_TITLE_LENGTH, NO_ACCESS_MODE } from '../config.js'; import { makeImageUrl } from '../lib/blob-helpers.js'; import { arrayEqual, vcard } from '../lib/utils.js'; @@ -277,17 +277,18 @@ class InfoView extends React.Component { } handleFullNameUpdate(fn) { - fn = fn.trim(); + fn = fn.trim().substring(0, MAX_TITLE_LENGTH); if (this.state.fullName !== fn) { this.setState({fullName: fn}); this.props.onTopicDescUpdate(this.props.topic, vcard(fn, null), null); } } - handlePrivateUpdate(priv) { - if (this.state.priv !== priv) { - this.setState({private: priv}); - this.props.onTopicDescUpdate(this.props.topic, null, priv || Tinode.DEL_CHAR); + handlePrivateUpdate(comment) { + comment = comment.trim().substring(0, MAX_TITLE_LENGTH); + if (this.state.private !== comment) { + this.setState({private: comment}); + this.props.onTopicDescUpdate(this.props.topic, null, comment || Tinode.DEL_CHAR); } } diff --git a/src/widgets/new-topic-group.jsx b/src/widgets/new-topic-group.jsx index 293ed398..40a79b37 100644 --- a/src/widgets/new-topic-group.jsx +++ b/src/widgets/new-topic-group.jsx @@ -4,6 +4,8 @@ import { FormattedMessage } from 'react-intl'; import AvatarUpload from './avatar-upload.jsx'; import TagManager from './tag-manager.jsx'; +import { MAX_TITLE_LENGTH } from '../config.js'; + export default class NewTopicGroup extends React.PureComponent { constructor(props) { super(props); @@ -41,10 +43,11 @@ export default class NewTopicGroup extends React.PureComponent { handleSubmit(e) { e.preventDefault(); - if (this.state.fn && this.state.fn.trim()) { - this.props.onSubmit(this.state.fn.trim(), - this.state.imageDataUrl, this.state.private.trim(), - this.state.tags); + + const fn = this.state.fn.trim().substring(0, MAX_TITLE_LENGTH); + const comment = this.state.private.trim().substring(0, MAX_TITLE_LENGTH); + if (fn) { + this.props.onSubmit(fn, this.state.imageDataUrl, comment, this.state.tags); } }