diff --git a/Schema/AdminDeactivate.json b/Schema/AdminDeactivate.json new file mode 100644 index 0000000..7df6a04 --- /dev/null +++ b/Schema/AdminDeactivate.json @@ -0,0 +1,14 @@ +{ + "header": "Schema\/AdminDeactivate.h", + "types": { + "DeactivateRequest": { + "fields": { + "reason": { + "type": "string" + } + }, + "type": "struct" + } + }, + "guard": "TELODENDRIA_SCHEMA_ADMINDEACTIVATE_H" +} diff --git a/Schema/RequestToken.json b/Schema/RequestToken.json new file mode 100644 index 0000000..1f05393 --- /dev/null +++ b/Schema/RequestToken.json @@ -0,0 +1,21 @@ +{ + "header": "Schema\/RequestToken.h", + "types": { + "RequestToken": { + "fields": { + "client_secret": { "type": "string" }, + "send_attempt": { "type": "integer" }, + "next_link": { "type": "string" }, + "id_access_token": { "type": "string" }, + "id_server": { "type": "string" }, + + "email": { "type": "string" }, + + "country": { "type": "string" }, + "phone_number": { "type": "string" } + }, + "type": "struct" + } + }, + "guard": "TELODENDRIA_SCHEMA_REQUESTTOKEN_H" +} diff --git a/src/Routes/RouteAdminDeactivate.c b/src/Routes/RouteAdminDeactivate.c index 0cb9ac0..5e52a67 100644 --- a/src/Routes/RouteAdminDeactivate.c +++ b/src/Routes/RouteAdminDeactivate.c @@ -28,7 +28,8 @@ #include #include -#include + +#include ROUTE_IMPL(RouteAdminDeactivate, path, argp) { @@ -38,6 +39,7 @@ ROUTE_IMPL(RouteAdminDeactivate, path, argp) JsonValue *val; char *reason = "Deactivated by admin"; + char *err; char *removedLocalpart = ArrayGet(path, 0); char *token; @@ -48,6 +50,8 @@ ROUTE_IMPL(RouteAdminDeactivate, path, argp) HttpRequestMethod method = HttpRequestMethodGet(args->context); + DeactivateRequest deactReq; + if ((method != HTTP_DELETE) && (method != HTTP_PUT)) { char * msg = "Route only supports DELETE and PUT as for now."; @@ -63,10 +67,10 @@ ROUTE_IMPL(RouteAdminDeactivate, path, argp) HttpResponseStatus(args->context, HTTP_BAD_REQUEST); return MatrixErrorCreate(M_NOT_JSON, NULL); } - val = HashMapGet(request, "reason"); - if (val && JsonValueType(val) == JSON_STRING) + if (!DeactivateRequestFromJson(request, &deactReq, &err)) { - reason = JsonValueAsString(val); + HttpResponseStatus(args->context, HTTP_BAD_REQUEST); + return MatrixErrorCreate(M_BAD_JSON, err); } } @@ -100,7 +104,7 @@ ROUTE_IMPL(RouteAdminDeactivate, path, argp) response = HashMapCreate(); JsonSet(response, JsonValueString(removedLocalpart), 1, "user"); - JsonSet(response, JsonValueString(reason), 1, "reason"); + JsonSet(response, JsonValueString(deactReq.reason), 1, "reason"); JsonSet(response, JsonValueString(UserGetName(user)), 1, "banned_by"); } else @@ -112,6 +116,7 @@ ROUTE_IMPL(RouteAdminDeactivate, path, argp) finish: UserUnlock(user); UserUnlock(removed); + DeactivateRequestFree(&deactReq); JsonFree(request); return response; } diff --git a/src/Routes/RouteRequestToken.c b/src/Routes/RouteRequestToken.c index 76a9ee2..2106b9b 100644 --- a/src/Routes/RouteRequestToken.c +++ b/src/Routes/RouteRequestToken.c @@ -26,14 +26,31 @@ #include #include +#include + ROUTE_IMPL(RouteRequestToken, path, argp) { RouteArgs *args = argp; char *type = ArrayGet(path, 0); HashMap *request; HashMap *response; - JsonValue *val; - char *str; + + char *msg; + + RequestToken reqTok; + + Int64 minusOne = Int64Neg(Int64Create(0, 1)); + + reqTok.client_secret = NULL; + reqTok.next_link = NULL; + reqTok.id_access_token = NULL; + reqTok.id_server = NULL; + + reqTok.email = NULL; + reqTok.country = NULL; + reqTok.phone_number = NULL; + + reqTok.send_attempt = minusOne; if (HttpRequestMethodGet(args->context) != HTTP_POST) { @@ -48,87 +65,92 @@ ROUTE_IMPL(RouteRequestToken, path, argp) return MatrixErrorCreate(M_NOT_JSON, NULL); } - val = HashMapGet(request, "client_secret"); - if (!val || JsonValueType(val) != JSON_STRING) + if (!RequestTokenFromJson(request, &reqTok, &msg)) { HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } - str = JsonValueAsString(val); - if (strlen(str) > 255 || StrBlank(str)) + if (!reqTok.client_secret) { + msg = "'client_secret' is not set"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } - val = HashMapGet(request, "send_attempt"); - if (!val || JsonValueType(val) != JSON_INTEGER) + if (strlen(reqTok.client_secret) > 255 || StrBlank(reqTok.client_secret)) { + msg = "'client_secret' is blank or too long"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } - val = HashMapGet(request, "next_link"); - if (val && JsonValueType(val) != JSON_STRING) + if (Int64Eq(reqTok.send_attempt, minusOne)) { + msg = "Invalid or inexistent 'send_attempt'"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } - val = HashMapGet(request, "id_access_token"); - if (val && JsonValueType(val) != JSON_STRING) + if (!reqTok.next_link) { + msg = "'next_link' is not set"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } - - val = HashMapGet(request, "id_server"); - if (val && JsonValueType(val) != JSON_STRING) + if (!reqTok.id_access_token) { + msg = "'id_access_token' is not set"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); + goto finish; + } + if (!reqTok.id_server) + { + msg = "'id_server' is not set"; + HttpResponseStatus(args->context, HTTP_BAD_REQUEST); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } if (StrEquals(type, "email")) { - val = HashMapGet(request, "email"); - if (val && JsonValueType(val) != JSON_STRING) + if (!reqTok.email) { + msg = "Type is set to 'email' yet none was set"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } } else if (StrEquals(type, "msisdn")) { - val = HashMapGet(request, "country"); - if (val && JsonValueType(val) != JSON_STRING) + if (!reqTok.country) { + msg = "Type is set to 'msisdn' yet no country is set"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } - str = JsonValueAsString(val); - if (strlen(str) != 2) + if (strlen(reqTok.country) != 2) { + msg = "Invalid country tag, length must be 2"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } - val = HashMapGet(request, "phone_number"); - if (val && JsonValueType(val) != JSON_STRING) + if (!reqTok.phone_number) { + msg = "Type is set to 'msisdn' yet phone_number is unset"; HttpResponseStatus(args->context, HTTP_BAD_REQUEST); - response = MatrixErrorCreate(M_BAD_JSON, NULL); + response = MatrixErrorCreate(M_BAD_JSON, msg); goto finish; } }