Offer "alias" field in room create form

Tries its best to not allow aliases that are too
long (full alias including leading #, : in the
middle, and homeserver domain name must not exceed
255 bytes.

Change-Id: I1e784a94cb599eca7e30736d666b20e37aad5444
This commit is contained in:
Timo Paulssen 2020-04-17 00:09:56 +02:00
parent ca15435625
commit c1c32e3268
4 changed files with 69 additions and 2 deletions

View File

@ -29,20 +29,73 @@ function generateRoomRecord() {
return { return {
room_name: "", room_name: "",
public: true, public: true,
alias: "",
} }
} }
const validateDisplayName = fieldval => fieldval === undefined ? "synapseadmin.rooms.room_name_required" : fieldval.length === 0 ? "synapseadmin.rooms.room_name_required" : undefined; const validateDisplayName = fieldval => fieldval === undefined ? "synapseadmin.rooms.room_name_required" : fieldval.length === 0 ? "synapseadmin.rooms.room_name_required" : undefined;
function approximateAliasLength(alias, homeserver) {
/* TODO maybe handle punycode in homeserver URL */
var te;
// Support for TextEncoder is quite widespread, but the polyfill is
// pretty large; We will only underestimate the size with the regular
// length attribute of String, so we never prevent the user from using
// an alias that is short enough for the server, but too long for our
// heuristic.
try {
te = new TextEncoder();
}
catch (err) {
if (err instanceof ReferenceError) {
te = undefined;
}
}
const aliasLength = te === undefined ? alias.length : te.encode(alias).length;
return (
"#".length +
aliasLength +
":".length +
homeserver.length
);
}
const validateAlias = fieldval => {
if (fieldval === undefined) {
return undefined;
}
const homeserver = localStorage.getItem("home_server");
if (approximateAliasLength(fieldval, homeserver) > 255) {
return "synapseadmin.rooms.alias_too_long";
}
}
const removeLeadingWhitespace = fieldVal => fieldVal === undefined ? undefined : fieldVal.trimStart(); const removeLeadingWhitespace = fieldVal => fieldVal === undefined ? undefined : fieldVal.trimStart();
const validateHasAliasIfPublic = formdata => {
let errors = {};
if (formdata.public) {
if (formdata.alias === undefined || formdata.alias.trim().length === 0) {
errors.alias = "synapseadmin.rooms.alias_required_if_public"
}
}
return errors;
}
export const RoomCreate = props => ( export const RoomCreate = props => (
<Create record={generateRoomRecord()} {...props}> <Create record={generateRoomRecord()} {...props}>
<SimpleForm> <SimpleForm validate={validateHasAliasIfPublic}>
<TextInput source="room_name" <TextInput source="room_name"
label="synapseadmin.rooms.room_name"
parse={removeLeadingWhitespace} parse={removeLeadingWhitespace}
validate={validateDisplayName}/> validate={validateDisplayName}/>
<TextInput source="alias"
parse={removeLeadingWhitespace}
validate={validateAlias}/>
<BooleanInput source="public" <BooleanInput source="public"
label="synapseadmin.rooms.make_public"/> label="synapseadmin.rooms.make_public"/>
</SimpleForm> </SimpleForm>

View File

@ -21,6 +21,12 @@ export default {
make_public: "Öffentlicher Raum", make_public: "Öffentlicher Raum",
room_name_required: room_name_required:
"Muss angegeben werden", "Muss angegeben werden",
alias_required_if_public:
"Muss für öffentliche Räume angegeben werden.",
alias:
"Alias",
alias_too_long:
"Darf zusammen mit der Domain des Homeservers 255 bytes nicht überschreiten"
} }
}, },
resources: { resources: {

View File

@ -21,6 +21,12 @@ export default {
make_public: "Make room public", make_public: "Make room public",
room_name_required: room_name_required:
"Must be provided", "Must be provided",
alias_required_if_public:
"Must be provided for a public room",
alias:
"Alias",
alias_too_long:
"Must not exceed 255 bytes including the domain of the homeserver."
} }
}, },
resources: { resources: {

View File

@ -83,8 +83,10 @@ const roomCreationProvider = {
const newParams = { ...params.data, const newParams = { ...params.data,
public: undefined, public: undefined,
room_name: undefined, room_name: undefined,
alias: undefined,
name: params.data.room_name, name: params.data.room_name,
room_alias_name: params.data.alias,
visibility: params.data.public ? "public" : "private", visibility: params.data.public ? "public" : "private",
} }