forked from Telodendria/Telodendria
[MOD/WIP] Take into account room IDs
This might need a refactor.
This commit is contained in:
parent
78daf86eb3
commit
c1933a2184
2 changed files with 43 additions and 10 deletions
21
src/Parser.c
21
src/Parser.c
|
@ -267,6 +267,26 @@ ParseCommonID(char *str, CommonID *id)
|
|||
|
||||
switch (sigil)
|
||||
{
|
||||
case '$':
|
||||
/* For event IDs, it depends on the version, so we're just
|
||||
* accepting it all. */
|
||||
if (!ParseUserLocalpart(&str, &id->local))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (*str == ':')
|
||||
{
|
||||
(*str)++;
|
||||
if (!ParseServerName(&str, &id->server))
|
||||
{
|
||||
Free(id->local);
|
||||
id->local = NULL;
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case '!':
|
||||
case '#': /* It seems like the localpart should be the same as the
|
||||
user's: everything, except ':'. */
|
||||
case '@':
|
||||
|
@ -280,7 +300,6 @@ ParseCommonID(char *str, CommonID *id)
|
|||
id->local = NULL;
|
||||
return 0;
|
||||
}
|
||||
/* TODO: Match whenever str is valid. */
|
||||
if (!ParseServerName(&str, &id->server))
|
||||
{
|
||||
Free(id->local);
|
||||
|
|
|
@ -41,7 +41,7 @@ ROUTE_IMPL(RouteAliasDirectory, path, argp)
|
|||
HashMap *response;
|
||||
|
||||
Db *db = args->matrixArgs->db;
|
||||
DbRef *ref;
|
||||
DbRef *ref = NULL;
|
||||
HashMap *aliases;
|
||||
JsonValue *val;
|
||||
|
||||
|
@ -49,17 +49,23 @@ ROUTE_IMPL(RouteAliasDirectory, path, argp)
|
|||
char *msg;
|
||||
User *user = NULL;
|
||||
|
||||
CommonID commonID;
|
||||
CommonID aliasID;
|
||||
CommonID roomID;
|
||||
Config *config;
|
||||
|
||||
commonID.sigil = '\0';
|
||||
commonID.local = NULL;
|
||||
commonID.server.hostname = NULL;
|
||||
commonID.server.port = NULL;
|
||||
aliasID.sigil = '\0';
|
||||
aliasID.local = NULL;
|
||||
aliasID.server.hostname = NULL;
|
||||
aliasID.server.port = NULL;
|
||||
|
||||
roomID.sigil = '\0';
|
||||
roomID.local = NULL;
|
||||
roomID.server.hostname = NULL;
|
||||
roomID.server.port = NULL;
|
||||
|
||||
config = ConfigLock(db);
|
||||
|
||||
if (!ParseCommonID(alias, &commonID) || commonID.sigil != '#')
|
||||
if (!ParseCommonID(alias, &aliasID) || aliasID.sigil != '#')
|
||||
{
|
||||
msg = "Invalid room alias.";
|
||||
HttpResponseStatus(args->context, HTTP_BAD_REQUEST);
|
||||
|
@ -118,7 +124,7 @@ ROUTE_IMPL(RouteAliasDirectory, path, argp)
|
|||
/* Check for server name.
|
||||
* TODO: Take the port into account, that might need a
|
||||
* refactor for it to use a ServerPart */
|
||||
if (!StrEquals(commonID.server.hostname, config->serverName))
|
||||
if (!StrEquals(aliasID.server.hostname, config->serverName))
|
||||
{
|
||||
HttpResponseStatus(args->context, HTTP_BAD_REQUEST);
|
||||
response = MatrixErrorCreate(M_INVALID_PARAM, "Invalid servername");
|
||||
|
@ -149,6 +155,13 @@ ROUTE_IMPL(RouteAliasDirectory, path, argp)
|
|||
|
||||
/* TODO: Validate room ID to make sure it is well
|
||||
* formed. */
|
||||
if (!ParseCommonID(JsonValueAsString(HashMapGet(request, "room_id")), &roomID) || aliasID.sigil != '!')
|
||||
{
|
||||
msg = "Invalid room ID.";
|
||||
HttpResponseStatus(args->context, HTTP_BAD_REQUEST);
|
||||
response = MatrixErrorCreate(M_INVALID_PARAM, msg);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
newAlias = HashMapCreate();
|
||||
HashMapSet(newAlias, "createdBy", JsonValueString(UserGetName(user)));
|
||||
|
@ -185,7 +198,8 @@ ROUTE_IMPL(RouteAliasDirectory, path, argp)
|
|||
}
|
||||
|
||||
finish:
|
||||
CommonIDFree(commonID);
|
||||
CommonIDFree(aliasID);
|
||||
CommonIDFree(roomID);
|
||||
ConfigUnlock(config);
|
||||
UserUnlock(user);
|
||||
DbUnlock(db, ref);
|
||||
|
|
Loading…
Reference in a new issue