Fix Merge error
[aaf/authz.git] / auth / auth-cass / src / main / java / org / onap / aaf / auth / direct / DirectAAFLur.java
1 /**
2  * ============LICENSE_START====================================================
3  * org.onap.aaf
4  * ===========================================================================
5  * Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
6  * ===========================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END====================================================
19  *
20  */
21
22 package org.onap.aaf.auth.direct;
23
24 import static org.onap.aaf.auth.layer.Result.OK;
25
26 import java.security.Principal;
27 import java.util.List;
28
29 import org.onap.aaf.auth.dao.cass.NsSplit;
30 import org.onap.aaf.auth.dao.cass.PermDAO;
31 import org.onap.aaf.auth.dao.cass.PermDAO.Data;
32 import org.onap.aaf.auth.dao.cass.Status;
33 import org.onap.aaf.auth.dao.hl.Question;
34 import org.onap.aaf.auth.env.AuthzEnv;
35 import org.onap.aaf.auth.env.AuthzTrans;
36 import org.onap.aaf.auth.env.NullTrans;
37 import org.onap.aaf.auth.layer.Result;
38 import org.onap.aaf.cadi.Access.Level;
39 import org.onap.aaf.cadi.Lur;
40 import org.onap.aaf.cadi.Permission;
41 import org.onap.aaf.cadi.lur.LocalPermission;
42 import org.onap.aaf.misc.env.util.Split;
43
44 public class DirectAAFLur implements Lur {
45     private final AuthzEnv env;
46     private final Question question;
47
48     public DirectAAFLur(AuthzEnv env, Question question/*, TokenMgr tm*/) {
49         this.env = env;
50         this.question = question;
51     }
52
53     @Override
54     public boolean fish(Principal bait, Permission ... pond) {
55         return fish(env.newTransNoAvg(),bait,pond);
56     }
57
58     public boolean fish(AuthzTrans trans, Principal bait, Permission ... pond) {
59         boolean rv = false;
60         Result<List<Data>> pdr = question.getPermsByUser(trans, bait.getName(),false);
61         switch(pdr.status) {
62             case OK:
63                 for (PermDAO.Data d : pdr.value) {
64                     if (!rv) {
65                         for (Permission p : pond) {
66                             if (new PermPermission(d).match(p)) {
67                                 rv=true;
68                                 break;
69                             }
70                         }
71                     }
72                 }
73                 break;
74             case Status.ERR_UserRoleNotFound:
75             case Status.ERR_BadData:
76                 return false;
77             default:
78                 trans.error().log("Can't access Cassandra to fulfill Permission Query: ",pdr.status,"-",pdr.details);
79         }
80         return rv;
81     }
82
83     @Override
84     public void fishAll(Principal bait, List<Permission> permissions) {
85         Result<List<Data>> pdr = question.getPermsByUser(env.newTrans(), bait.getName(),false);
86         switch(pdr.status) {
87             case OK:
88                 for (PermDAO.Data d : pdr.value) {
89                     permissions.add(new PermPermission(d));
90                 }
91                 break;
92             default:
93                 env.error().log("Can't access Cassandra to fulfill Permission Query: ",pdr.status,"-", pdr.details);
94         }
95     }
96
97     @Override
98     public void destroy() {
99     }
100
101     @Override
102     public boolean handlesExclusively(Permission ... pond) {
103         return false;
104     }
105
106     /**
107      * Small Class implementing CADI's Permission with Cassandra Data
108      * @author Jonathan
109      *
110      */
111     public static class PermPermission implements Permission {
112         private PermDAO.Data data;
113
114         public PermPermission(PermDAO.Data d) {
115             data = d;
116         }
117
118         public PermPermission(AuthzTrans trans, Question q, String p) {
119             data = PermDAO.Data.create(trans, q, p);
120         }
121
122         public PermPermission(String ns, String type, String instance, String action) {
123             data = new PermDAO.Data();
124             data.ns = ns;
125             data.type = type;
126             data.instance = instance;
127             data.action = action;
128         }
129
130         @Override
131         public String getKey() {
132             return data.type;
133         }
134
135         @Override
136         public boolean match(Permission p) {
137             if (p==null) {
138                 return false;
139             }
140             PermDAO.Data pd;
141             if (p instanceof DirectAAFLur.PermPermission) {
142                 pd = ((DirectAAFLur.PermPermission)p).data;
143                 if (data.ns.equals(pd.ns))
144                     if (data.type.equals(pd.type))
145                         if (data.instance!=null && (data.instance.equals(pd.instance) || "*".equals(data.instance)))
146                             if (data.action!=null && (data.action.equals(pd.action) || "*".equals(data.action)))
147                                 return true;
148             } else{
149                 String[] lp = p.getKey().split("\\|");
150                 if (lp.length<3) {
151                     return false;
152                 }
153                 if (data.fullType().equals(lp[0]))
154                     if (data.instance!=null && (data.instance.equals(lp[1]) || "*".equals(data.instance)))
155                         if (data.action!=null && (data.action.equals(lp[2]) || "*".equals(data.action)))
156                             return true;
157             }
158             return false;
159         }
160
161         @Override
162         public String permType() {
163             return "AAFLUR";
164         }
165
166     }
167
168     public String toString() {
169         return "DirectAAFLur is enabled";
170
171     }
172
173     /* (non-Javadoc)
174      * @see org.onap.aaf.cadi.Lur#handles(java.security.Principal)
175      */
176     @Override
177     public boolean handles(Principal principal) {
178         return true;
179     }
180
181     @Override
182     public Permission createPerm(String p) {
183         String[] params = Split.split('|', p);
184         if (params.length==3) {
185             Result<NsSplit> nss = question.deriveNsSplit(NullTrans.singleton(), params[0]);
186             if (nss.isOK()) {
187                 return new PermPermission(nss.value.ns,nss.value.name,params[1],params[2]);
188             }
189         }
190         return new LocalPermission(p);
191     }
192
193     @Override
194     public void clear(Principal p, StringBuilder sb) {
195         AuthzTrans trans = env.newTrans();
196         question.clearCache(trans,"all");
197         env.log(Level.AUDIT, p.getName(), "has cleared Cache for",getClass().getSimpleName());
198         trans.auditTrail(0, sb);
199     }
200 }