1 module hunt.framework.auth.SimpleUserService;
2
3 import hunt.framework.auth.UserDetails;
4 import hunt.framework.auth.UserService;
5
6 import hunt.framework.config.AuthUserConfig;
7 import hunt.framework.provider.ServiceProvider;
8 import hunt.logging;
9
10 import std.digest.sha;
11
12
13 /**
14 * Retrieve user details from a local config file.
15 */
16 class SimpleUserService : UserService {
17
18 private AuthUserConfig _userConfig;
19
20 this() {
21 _userConfig = serviceContainer.resolve!(AuthUserConfig)();
22 }
23
24 private AuthUserConfig.Role getRole(string name) {
25 foreach(AuthUserConfig.Role r; _userConfig.roles) {
26 if(r.name == name) return r;
27 }
28
29 return null;
30 }
31
32 UserDetails authenticate(string name, string password) {
33
34 foreach(AuthUserConfig.User user; _userConfig.users) {
35 if(user.name != name || user.password != password)
36 continue;
37
38 UserDetails userDetails = new UserDetails();
39 userDetails.name = name;
40 // userDetails.password = password;
41 userDetails.salt = getSalt(name, user.password);
42
43 // roles
44 foreach(string roleName; user.roles) {
45 AuthUserConfig.Role role = getRole(roleName);
46 if(role !is null) {
47 userDetails.roles ~= role.name;
48 userDetails.permissions ~= role.permissions;
49 } else {
50 warning("The role is not defined: %s", roleName);
51 }
52 }
53
54 return userDetails;
55 }
56 return null;
57 }
58
59 UserDetails getByName(string name) {
60 foreach(AuthUserConfig.User user; _userConfig.users) {
61 if(user.name != name)
62 continue;
63
64 UserDetails userDetails = new UserDetails();
65 userDetails.name = name;
66 // userDetails.password = user.password;
67 userDetails.salt = getSalt(name, user.password);
68
69 // roles
70 foreach(string roleName; user.roles) {
71 AuthUserConfig.Role role = getRole(roleName);
72 if(role !is null) {
73 userDetails.roles ~= role.name;
74 userDetails.permissions ~= role.permissions;
75 } else {
76 warning("The role is not defined: %s", roleName);
77 }
78 }
79 return userDetails;
80 }
81 return null;
82 }
83
84 UserDetails getById(ulong id) {
85 return null;
86 }
87
88 string getSalt(string name, string password) {
89 string userSalt = name;
90 auto sha256 = new SHA256Digest();
91 ubyte[] hash256 = sha256.digest(password~userSalt);
92 return toHexString(hash256);
93 }
94
95 }