AT&T 2.0.19 Code drop, stage 4
[aaf/authz.git] / authz-cass / src / main / java / org / onap / aaf / dao / aaf / hl / PermLookup.java
1 /*******************************************************************************\r
2  * ============LICENSE_START====================================================\r
3  * * org.onap.aaf\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * ===========================================================================\r
7  * * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * * you may not use this file except in compliance with the License.\r
9  * * You may obtain a copy of the License at\r
10  * * \r
11  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * * \r
13  *  * Unless required by applicable law or agreed to in writing, software\r
14  * * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * * See the License for the specific language governing permissions and\r
17  * * limitations under the License.\r
18  * * ============LICENSE_END====================================================\r
19  * *\r
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
21  * *\r
22  ******************************************************************************/\r
23 package org.onap.aaf.dao.aaf.hl;\r
24 \r
25 import java.util.ArrayList;\r
26 import java.util.Date;\r
27 import java.util.HashMap;\r
28 import java.util.List;\r
29 import java.util.Map;\r
30 import java.util.Set;\r
31 import java.util.TreeSet;\r
32 \r
33 import org.onap.aaf.authz.env.AuthzTrans;\r
34 import org.onap.aaf.authz.layer.Result;\r
35 import org.onap.aaf.dao.aaf.cass.PermDAO;\r
36 import org.onap.aaf.dao.aaf.cass.RoleDAO;\r
37 import org.onap.aaf.dao.aaf.cass.Status;\r
38 import org.onap.aaf.dao.aaf.cass.UserRoleDAO;\r
39 \r
40 /**\r
41  * PermLookup is a Storage class for the various pieces of looking up Permission \r
42  * during Transactions to avoid duplicate processing\r
43  * \r
44  *\r
45  */\r
46 // Package on purpose\r
47 class PermLookup {\r
48         private AuthzTrans trans;\r
49         private String user;\r
50         private Question q;\r
51         private Result<List<UserRoleDAO.Data>> userRoles = null;\r
52         private Result<List<RoleDAO.Data>> roles = null;\r
53         private Result<Set<String>> permNames = null;\r
54         private Result<List<PermDAO.Data>> perms = null;\r
55         \r
56         private PermLookup() {}\r
57         \r
58         static PermLookup get(AuthzTrans trans, Question q, String user) {\r
59                 PermLookup lp=null;\r
60                 Map<String, PermLookup> permMap = trans.get(Question.PERMS, null);\r
61                 if (permMap == null) {\r
62                         trans.put(Question.PERMS, permMap = new HashMap<String, PermLookup>());\r
63                 } else {\r
64                         lp = permMap.get(user);\r
65                 }\r
66 \r
67                 if (lp == null) {\r
68                         lp = new PermLookup();\r
69                         lp.trans = trans;\r
70                         lp.user = user;\r
71                         lp.q = q;\r
72                         permMap.put(user, lp);\r
73                 }\r
74                 return lp;\r
75         }\r
76         \r
77         public Result<List<UserRoleDAO.Data>> getUserRoles() {\r
78                 if(userRoles==null) {\r
79                         userRoles = q.userRoleDAO.readByUser(trans,user);\r
80                         if(userRoles.isOKhasData()) {\r
81                                 List<UserRoleDAO.Data> lurdd = new ArrayList<UserRoleDAO.Data>();\r
82                                 Date now = new Date();\r
83                                 for(UserRoleDAO.Data urdd : userRoles.value) {\r
84                                         if(urdd.expires.after(now)) { // Remove Expired\r
85                                                 lurdd.add(urdd);\r
86                                         }\r
87                                 }\r
88                                 if(lurdd.size()==0) {\r
89                                         return userRoles = Result.err(Status.ERR_UserNotFound,\r
90                                                                 "%s not found or not associated with any Roles: ",\r
91                                                                 user);\r
92                                 } else {\r
93                                         return userRoles = Result.ok(lurdd);\r
94                                 }\r
95                         } else {\r
96                                 return userRoles;\r
97                         }\r
98                 } else {\r
99                         return userRoles;\r
100                 }\r
101         }\r
102 \r
103         public Result<List<RoleDAO.Data>> getRoles() {\r
104                 if(roles==null) {\r
105                         Result<List<UserRoleDAO.Data>> rur = getUserRoles();\r
106                         if(rur.isOK()) {\r
107                                 List<RoleDAO.Data> lrdd = new ArrayList<RoleDAO.Data>();\r
108                                 for (UserRoleDAO.Data urdata : rur.value) {\r
109                                         // Gather all permissions from all Roles\r
110                                             if(urdata.ns==null || urdata.rname==null) {\r
111                                                 trans.error().printf("DB Content Error: nulls in User Role %s %s", urdata.user,urdata.role);\r
112                                             } else {\r
113                                                         Result<List<RoleDAO.Data>> rlrd = q.roleDAO.read(\r
114                                                                         trans, urdata.ns, urdata.rname);\r
115                                                         if(rlrd.isOK()) {\r
116                                                                 lrdd.addAll(rlrd.value);\r
117                                                         }\r
118                                             }\r
119                                         }\r
120                                 return roles = Result.ok(lrdd);\r
121                         } else {\r
122                                 return roles = Result.err(rur);\r
123                         }\r
124                 } else {\r
125                         return roles;\r
126                 }\r
127         }\r
128 \r
129         public Result<Set<String>> getPermNames() {\r
130                 if(permNames==null) {\r
131                         Result<List<RoleDAO.Data>> rlrd = getRoles();\r
132                         if (rlrd.isOK()) {\r
133                                 Set<String> pns = new TreeSet<String>();\r
134                                 for (RoleDAO.Data rdata : rlrd.value) {\r
135                                         pns.addAll(rdata.perms(false));\r
136                                 }\r
137                                 return permNames = Result.ok(pns);\r
138                         } else {\r
139                                 return permNames = Result.err(rlrd);\r
140                         }\r
141                 } else {\r
142                         return permNames;\r
143                 }\r
144         }\r
145         \r
146         public Result<List<PermDAO.Data>> getPerms(boolean lookup) {\r
147                 if(perms==null) {\r
148                         // Note: It should be ok for a Valid user to have no permissions -\r
149                         // 8/12/2013\r
150                         Result<Set<String>> rss = getPermNames();\r
151                         if(rss.isOK()) {\r
152                                 List<PermDAO.Data> lpdd = new ArrayList<PermDAO.Data>();\r
153                                 for (String perm : rss.value) {\r
154                                         if(lookup) {\r
155                                                 Result<String[]> ap = PermDAO.Data.decodeToArray(trans, q, perm);\r
156                                                 if(ap.isOK()) {\r
157                                                         Result<List<PermDAO.Data>> rlpd = q.permDAO.read(perm,trans,ap);\r
158                                                         if (rlpd.isOKhasData()) {\r
159                                                                 for (PermDAO.Data pData : rlpd.value) {\r
160                                                                         lpdd.add(pData);\r
161                                                                 }\r
162                                                         }\r
163                                                 } else {\r
164                                                         trans.error().log("In getPermsByUser, for", user, perm);\r
165                                                 }\r
166                                         } else {\r
167                                                 Result<PermDAO.Data> pr = PermDAO.Data.decode(trans, q, perm);\r
168                                                 if (pr.notOK()) {\r
169                                                         trans.error().log("In getPermsByUser, for", user, pr.errorString());\r
170                                                 } else {\r
171                                                         lpdd.add(pr.value);\r
172                                                 }\r
173                                         }\r
174 \r
175                                 }\r
176                                 return perms = Result.ok(lpdd);\r
177                         } else {\r
178                                 return perms = Result.err(rss);\r
179                         }\r
180                 } else {\r
181                         return perms;\r
182                 }\r
183         }\r
184 }\r