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:
parent
ca15435625
commit
c1c32e3268
@ -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>
|
||||||
|
@ -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: {
|
||||||
|
@ -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: {
|
||||||
|
@ -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",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user