diff --git a/TODO.txt b/TODO.txt index 9414714..83dc2e6 100644 --- a/TODO.txt +++ b/TODO.txt @@ -14,12 +14,13 @@ Milestone: v0.2.0 [ ] Abstract /email/requestToken and /msidsn/requestToken - Call it RouteRequestToken - Reference it all the places it's needed + - Finish implementing JSON parsing [ ] User Interactive Authentication [ ] Fix UiaComplete so we can use multi-stage flows -[~] User login - [ ] Logout all +[x] User login + [x] Logout all [ ] Documentation [ ] User functions diff --git a/src/Routes/RouteLogout.c b/src/Routes/RouteLogout.c index 149df84..39b3e4a 100644 --- a/src/Routes/RouteLogout.c +++ b/src/Routes/RouteLogout.c @@ -77,12 +77,17 @@ ROUTE_IMPL(RouteLogout, args) response = MatrixErrorCreate(M_NOT_FOUND); goto finish; } - Free(pathPart); - /* TODO: Implement /all */ - HttpResponseStatus(args->context, HTTP_INTERNAL_SERVER_ERROR); - response = MatrixErrorCreate(M_UNKNOWN); + if (!UserDeleteTokens(user)) + { + /* If we can't delete all of our tokens, then something is + * wrong. */ + HttpResponseStatus(args->context, HTTP_INTERNAL_SERVER_ERROR); + response = MatrixErrorCreate(M_UNKNOWN); + goto finish; + } + response = HashMapCreate(); } else { diff --git a/src/User.c b/src/User.c index 3c2f3aa..376ceab 100644 --- a/src/User.c +++ b/src/User.c @@ -599,6 +599,47 @@ UserDeleteToken(User * user, char *token) return 1; } +int +UserDeleteTokens(User * user) +{ + HashMap *devices; + char *deviceId; + JsonValue *deviceObj; + + if (!user) + { + return 0; + } + + devices = JsonValueAsObject(HashMapGet(DbJson(user->ref), "devices")); + if (!devices) + { + return 0; + } + + while (HashMapIterate(devices, &deviceId, (void **) &deviceObj)) + { + HashMap *device = JsonValueAsObject(deviceObj); + char *accessToken = JsonValueAsString(HashMapGet(device, "accessToken")); + char *refreshToken = JsonValueAsString(HashMapGet(device, "refreshToken")); + + if (accessToken) + { + DbDelete(user->db, 3, "tokens", "access", accessToken); + } + + if (refreshToken) + { + DbDelete(user->db, 3, "tokens", "refresh", refreshToken); + } + } + + JsonValueFree(HashMapDelete(DbJson(user->ref), "devices")); + HashMapSet(DbJson(user->ref), "devices", JsonValueObject(HashMapCreate())); + + return 1; +} + UserId * UserParseId(char *id, char *defaultServer) { diff --git a/src/include/User.h b/src/include/User.h index a4daa32..591e917 100644 --- a/src/include/User.h +++ b/src/include/User.h @@ -99,6 +99,9 @@ extern void extern int UserDeleteToken(User *, char *); +extern int + UserDeleteTokens(User *); + extern UserId * UserParseId(char *, char *);