Some inconsistencies have been dealt with. Authorization rules are documented.
parent
67adb6ef51
commit
3d8d74e8b7
23
TODO.md
23
TODO.md
|
@ -8,15 +8,26 @@ A combinaison of both is fine as long as the logic is comprehensively documented
|
||||||
A simple error message is given instead of specific messages for each recurring error.
|
A simple error message is given instead of specific messages for each recurring error.
|
||||||
In the same time, some exceptions (such as **AdminAuthenticationException**) are used a few times for the same kind of errors.
|
In the same time, some exceptions (such as **AdminAuthenticationException**) are used a few times for the same kind of errors.
|
||||||
|
|
||||||
**Authorization rules** should be clear and documented.
|
|
||||||
Currently, some operations are restricted to an admin, defined explicitely by the user *admin* boolean.
|
|
||||||
These operations could be delegated to simple users with some specific fine-grained authorizations.
|
|
||||||
|
|
||||||
Requests work mostly on current user, but some take a *UserID* to identify another user.
|
Requests work mostly on current user, but some take a *UserID* to identify another user.
|
||||||
Requests should either always work on current user (which implies to create new requests working on another user) or always take an optional *UserID* parameter.
|
Requests should either always work on current user (which implies to create new requests working on another user) or always take an optional *UserID* parameter.
|
||||||
|
|
||||||
Some requests require to be authenticated without either accessing confidential data or modifying any entry in the database.
|
### Authorization rules
|
||||||
**Check for inconsistencies**.
|
|
||||||
|
Logged users can:
|
||||||
|
- retrieve public data of any user **individually**
|
||||||
|
- change their own data: password, email address, profile entries (except the read-only ones)
|
||||||
|
- delete their account
|
||||||
|
|
||||||
|
Admins with 'Read' permission on the '*' resource can:
|
||||||
|
- list users
|
||||||
|
|
||||||
|
Admins with 'Edit' permission on the '*' resource can:
|
||||||
|
- change data of another user
|
||||||
|
|
||||||
|
Admins with 'Admin' permission on the '*' resource (or the 'admin' boolean) can:
|
||||||
|
- change read-only profile entries and permissions
|
||||||
|
- delete a user
|
||||||
|
- uprank and downrank admins
|
||||||
|
|
||||||
### Structures, not classes
|
### Structures, not classes
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
class AuthD::Request
|
class AuthD::Request
|
||||||
IPC::JSON.message ListUsers, 8 do
|
IPC::JSON.message ListUsers, 8 do
|
||||||
|
|
||||||
|
# Since the list could be long, here is a way to get it at a reasonable pace.
|
||||||
|
property offset : Int32 = 0
|
||||||
|
# By default, authd will send 10 users at a time.
|
||||||
|
|
||||||
def initialize()
|
def initialize()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -10,7 +15,8 @@ class AuthD::Request
|
||||||
# Test if the user is a moderator.
|
# Test if the user is a moderator.
|
||||||
logged_user.assert_permission("authd", "*", User::PermissionLevel::Read)
|
logged_user.assert_permission("authd", "*", User::PermissionLevel::Read)
|
||||||
|
|
||||||
Response::UsersList.new authd.users.to_h.map &.[1].to_public
|
list = authd.users.to_h.map &.[1].to_public
|
||||||
|
Response::UsersList.new list[offset..offset+10]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
AuthD.requests << ListUsers
|
AuthD.requests << ListUsers
|
||||||
|
|
|
@ -2,7 +2,11 @@ class AuthD::Request
|
||||||
IPC::JSON.message SearchUser, 13 do
|
IPC::JSON.message SearchUser, 13 do
|
||||||
property user : String
|
property user : String
|
||||||
|
|
||||||
def initialize(@user)
|
# Since the list could be long, here is a way to get it at a reasonable pace.
|
||||||
|
property offset : Int32 = 0
|
||||||
|
# By default, authd will send 10 users at a time.
|
||||||
|
|
||||||
|
def initialize(@user, @offset = 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle(authd : AuthD::Service, fd : Int32)
|
def handle(authd : AuthD::Service, fd : Int32)
|
||||||
|
@ -31,7 +35,7 @@ class AuthD::Request
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Response::MatchingUsers.new matching_users
|
Response::MatchingUsers.new matching_users[offset..offset+10]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
AuthD.requests << SearchUser
|
AuthD.requests << SearchUser
|
||||||
|
|
Loading…
Reference in New Issue