1 module hunt.framework.auth.HuntShiroCache;
2 
3 import hunt.cache.Cache;
4 import hunt.collection.Collection;
5 import hunt.redis;
6 import hunt.shiro;
7 
8 import hunt.Exceptions;
9 import hunt.logging.ConsoleLogger;
10 import hunt.serialization.JsonSerializer;
11 
12 import std.array;
13 import std.conv;
14 import std.json;
15 
16 alias ShiroCache = hunt.shiro.cache.Cache.Cache;
17 alias HuntCache = hunt.cache.Cache.Cache;
18 
19 
20 
21 /**
22  * 
23  */
24 class HuntShiroCache : ShiroCache!(Object, AuthorizationInfo) {
25     /**
26      * The name of this cache.
27      */
28     private string _name;
29     private HuntCache _cache;
30 
31     this(string name, HuntCache cache) {
32         _name = name;
33         _cache = cache;
34     }
35 
36     AuthorizationInfo get(Object key) {
37         version(HUNT_AUTH_DEBUG) tracef("%s, hash: %d", key.toString, key.toHash());
38         string k = key.toHash().to!string(); // key.toString();
39         if(!_cache.hasKey(k)) {
40             return null;
41         }
42         SimpleAuthorizationInfo obj = new SimpleAuthorizationInfo();
43 
44         string v = _cache.get(k);
45         if(v.empty) {
46             warningf("value is empty for key: ", k);
47             return obj;
48         }
49 
50         // version(HUNT_DEBUG) tracef("key: %s, value: %s", k, v);
51         JSONValue jv = parseJSON(v);
52         
53         string[] roles = JsonSerializer.toObject!(string[])(jv["roles"]);
54         string[] permissions = JsonSerializer.toObject!(string[])(jv["permissions"]);
55 
56         obj.addRoles(roles);
57         obj.addStringPermissions(permissions);
58 
59         return obj;
60     }
61     
62     AuthorizationInfo get(Object key, AuthorizationInfo defaultValue) {
63         AuthorizationInfo authInfo = get(key);
64         if(authInfo is null)
65             return defaultValue;
66         return authInfo;
67     }
68 
69     AuthorizationInfo put(Object key, AuthorizationInfo value) {
70         version(HUNT_DEBUG) tracef("%s, hash: %d", key.toString, key.toHash());
71         string k = key.toHash().to!string(); // key.toString();
72 
73         string[] roles;
74         Collection!(string) collection = value.getRoles();
75         if(collection !is null) {
76             roles = collection.toArray();
77         } else {
78             warning("Roles is empty");
79         }
80 
81         string[] permissions;
82         collection = value.getStringPermissions();
83         
84         if(collection !is null) {
85             permissions = collection.toArray();
86         } else {
87             warning("Permissions is empty");
88         }
89 
90         JSONValue jv;
91         jv["roles"] = roles;
92         jv["permissions"] = permissions;
93 
94         string v = jv.toString();
95         version(HUNT_HTTP_DEBUG) info(v);
96 
97         _cache.set(k, v);
98         return value;
99     }
100 
101     AuthorizationInfo remove(Object key) {
102         version(HUNT_DEBUG) infof("key: %s, hash: %d", key.toString, key.toHash());
103         string k = key.toHash().to!string(); // key.toString();
104         if(!_cache.hasKey(k)) {
105             return null;
106         }
107 
108         // AuthorizationInfo value = _cache.get(k);
109         _cache.remove(k);
110         return null;
111     }
112 
113     void clear() {
114         _cache.clear();
115     }
116 
117     int size() {
118         implementationMissing(false);
119         return 0;
120     }
121 
122     Object[] keys() {
123         implementationMissing(false);
124         return null;
125     }
126 
127     AuthorizationInfo[] values() {
128         implementationMissing(false);
129         return null;
130     }
131 }