diff --git a/src/RegToken.c b/src/RegToken.c index fa041d3..2b318f6 100644 --- a/src/RegToken.c +++ b/src/RegToken.c @@ -238,6 +238,7 @@ RegTokenCreate(Db * db, char *name, char *owner, UInt64 expires, Int64 uses, int ret->uses = uses; ret->created_on = timestamp; ret->expires_on = expires; + /* TODO: #37 type mismatch: UserEncodePrivileges() returns a JsonValue */ ret->grants = UserEncodePrivileges(privileges); return ret; diff --git a/src/Routes/RoutePrivileges.c b/src/Routes/RoutePrivileges.c index 4ffa480..44ca311 100644 --- a/src/Routes/RoutePrivileges.c +++ b/src/Routes/RoutePrivileges.c @@ -98,15 +98,15 @@ ROUTE_IMPL(RoutePrivileges, path, argp) switch (HttpRequestMethodGet(args->context)) { case HTTP_POST: - privileges = UserDecodePrivileges(JsonValueAsArray(val)); + privileges = UserDecodePrivileges(val); break; case HTTP_PUT: privileges = UserGetPrivileges(user); - privileges |= UserDecodePrivileges(JsonValueAsArray(val)); + privileges |= UserDecodePrivileges(val); break; case HTTP_DELETE: privileges = UserGetPrivileges(user); - privileges &= ~UserDecodePrivileges(JsonValueAsArray(val)); + privileges &= ~UserDecodePrivileges(val); break; default: /* Impossible */ @@ -124,7 +124,7 @@ ROUTE_IMPL(RoutePrivileges, path, argp) /* Fall through */ case HTTP_GET: response = HashMapCreate(); - HashMapSet(response, "privileges", JsonValueArray(UserEncodePrivileges(UserGetPrivileges(user)))); + HashMapSet(response, "privileges", UserEncodePrivileges(UserGetPrivileges(user))); break; default: HttpResponseStatus(args->context, HTTP_BAD_REQUEST); diff --git a/src/Routes/RouteRegister.c b/src/Routes/RouteRegister.c index 3527219..7f51744 100644 --- a/src/Routes/RouteRegister.c +++ b/src/Routes/RouteRegister.c @@ -276,6 +276,7 @@ ROUTE_IMPL(RouteRegister, path, argp) if (info) { + /* TODO: #37 type mismatch: info->grants is a string array. */ UserSetPrivileges(user, UserDecodePrivileges(info->grants)); RegTokenClose(info); RegTokenFree(info); diff --git a/src/User.c b/src/User.c index d13ab90..1996255 100644 --- a/src/User.c +++ b/src/User.c @@ -749,7 +749,7 @@ UserGetPrivileges(User * user) return USER_NONE; } - return UserDecodePrivileges(JsonValueAsArray(HashMapGet(DbJson(user->ref), "privileges"))); + return UserDecodePrivileges(HashMapGet(DbJson(user->ref), "privileges")); } int @@ -768,7 +768,7 @@ UserSetPrivileges(User * user, int privileges) return 1; } - val = JsonValueArray(UserEncodePrivileges(privileges)); + val = UserEncodePrivileges(privileges); if (!val) { return 0; @@ -779,17 +779,19 @@ UserSetPrivileges(User * user, int privileges) } int -UserDecodePrivileges(Array * arr) +UserDecodePrivileges(JsonValue * val) { int privileges = USER_NONE; - + Array *arr; size_t i; - if (!arr) + if (!val || JsonValueType(val) != JSON_ARRAY) { goto finish; } + arr = JsonValueAsArray(val); + for (i = 0; i < ArraySize(arr); i++) { JsonValue *val = ArrayGet(arr, i); @@ -846,7 +848,7 @@ UserDecodePrivilege(const char *p) } } -Array * +JsonValue * UserEncodePrivileges(int privileges) { Array *arr = ArrayCreate(); @@ -878,7 +880,7 @@ UserEncodePrivileges(int privileges) #undef A finish: - return arr; + return JsonValueArray(arr); } UserId * diff --git a/src/include/User.h b/src/include/User.h index bd30803..ec266ec 100644 --- a/src/include/User.h +++ b/src/include/User.h @@ -286,13 +286,13 @@ extern int UserSetPrivileges(User *, int); * Decode the JSON that represents the user privileges into a packed * bit field for simple manipulation. */ -extern int UserDecodePrivileges(Array *); +extern int UserDecodePrivileges(JsonValue *); /** * Encode the packed bit field that represents user privileges as a * JSON value. */ -extern Array *UserEncodePrivileges(int); +extern JsonValue *UserEncodePrivileges(int); /** * Convert a string privilege into its bit in the bit field. This is