diff --git a/src/Routes/RouteLogin.c b/src/Routes/RouteLogin.c index 332d217..6bf49ae 100644 --- a/src/Routes/RouteLogin.c +++ b/src/Routes/RouteLogin.c @@ -48,7 +48,7 @@ ROUTE_IMPL(RouteLogin, args) char *password; char *type; - char *username; + UserId *userId = NULL; Db *db = args->matrixArgs->db; @@ -160,9 +160,17 @@ ROUTE_IMPL(RouteLogin, args) break; } - username = JsonValueAsString(val); + userId = UserParseId(JsonValueAsString(val), + args->matrixArgs->config->serverName); + if (!userId) + { + HttpResponseStatus(args->context, HTTP_BAD_REQUEST); + response = MatrixErrorCreate(M_BAD_JSON); + break; + } - if (!UserExists(db, username)) + if (strcmp(userId->server, args->matrixArgs->config->serverName) != 0 + || !UserExists(db, userId->localpart)) { HttpResponseStatus(args->context, HTTP_FORBIDDEN); response = MatrixErrorCreate(M_FORBIDDEN); @@ -225,7 +233,7 @@ ROUTE_IMPL(RouteLogin, args) refreshToken = JsonValueAsBoolean(val); } - user = UserLock(db, username); + user = UserLock(db, userId->localpart); if (!user) { @@ -284,6 +292,7 @@ ROUTE_IMPL(RouteLogin, args) break; } + UserFreeId(userId); JsonFree(request); return response; } diff --git a/src/User.c b/src/User.c index 7bb9010..8935658 100644 --- a/src/User.c +++ b/src/User.c @@ -598,3 +598,72 @@ UserDeleteToken(User * user, char *token) return 1; } + +UserId * +UserParseId(char *id, char *defaultServer) +{ + UserId *userId; + + if (!id) + { + return NULL; + } + + id = StrDuplicate(id); + if (!id) + { + return NULL; + } + + userId = Malloc(sizeof(UserId)); + if (!userId) + { + goto finish; + } + + /* Fully-qualified user ID */ + if (*id == '@') + { + char *localStart = id + 1; + char *serverStart = localStart; + + while (*serverStart != ':' && *serverStart != '\0') + { + serverStart++; + } + + if (*serverStart == '\0') + { + Free(userId); + userId = NULL; + goto finish; + } + + *serverStart = '\0'; + serverStart++; + + userId->localpart = StrDuplicate(localStart); + userId->server = StrDuplicate(serverStart); + } + else + { + /* Treat it as just a localpart */ + userId->localpart = StrDuplicate(id); + userId->server = StrDuplicate(defaultServer); + } + +finish: + Free(id); + return userId; +} + +void +UserFreeId(UserId *id) +{ + if (id) + { + Free(id->localpart); + Free(id->server); + Free(id); + } +} diff --git a/src/include/User.h b/src/include/User.h index 3b26af6..a4daa32 100644 --- a/src/include/User.h +++ b/src/include/User.h @@ -42,6 +42,12 @@ typedef struct UserLoginInfo char *refreshToken; } UserLoginInfo; +typedef struct UserId +{ + char *localpart; + char *server; +} UserId; + extern int UserValidate(char *, char *); @@ -93,4 +99,10 @@ extern void extern int UserDeleteToken(User *, char *); +extern UserId * + UserParseId(char *, char *); + +extern void + UserFreeId(UserId *); + #endif /* TELODENDRIA_USER_H */