AT&T 2.0.19 Code drop, stage 3
[aaf/authz.git] / auth / auth-core / src / main / java / org / onap / aaf / auth / validation / Validator.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.validation;
23
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.regex.Pattern;
27
28 import org.onap.aaf.auth.layer.Result;
29
30
31 public class Validator {
32         private static final String ESSENTIAL = "\\x25\\x28\\x29\\x2C-\\x2E\\x30-\\x39\\x3D\\x40-\\x5A\\x5F\\x61-\\x7A";
33         private static final Pattern ESSENTIAL_CHARS = Pattern.compile("["+ESSENTIAL+"]+");
34         public static final Pattern ACTION_CHARS = Pattern.compile(
35                                 "["+ESSENTIAL+"]+" +    // All AlphaNumeric+
36                                 "|\\*"                                          // Just Star
37                                 );
38         public static final Pattern INST_CHARS = Pattern.compile(
39                                 "["+ESSENTIAL+"]+[\\*]*" +                              // All AlphaNumeric+ possibly ending with *
40                                 "|\\*" +                                                                // Just Star
41                                 "|(([:/]\\*)|([:/][!]{0,1}["+ESSENTIAL+"]+[\\*]*[:/]*))+"       // Key :asdf:*:sdf*:sdk
42                                 );
43         public static final Pattern ID_CHARS = Pattern.compile("[\\w.-]+@[\\w.-]+");
44         public static final Pattern NAME_CHARS = Pattern.compile("[\\w.-]+");
45         public static final Pattern DESC_CHAR = Pattern.compile("["+ESSENTIAL+"\\x20]+");
46         public static List<String> nsKeywords;
47         protected final Pattern actionChars;
48         protected final Pattern instChars;
49         private StringBuilder msgs;
50
51         static {
52                 nsKeywords = new ArrayList<String>();
53                 nsKeywords.add(".access");
54                 nsKeywords.add(".owner");
55                 nsKeywords.add(".admin");
56                 nsKeywords.add(".member");
57                 nsKeywords.add(".perm");
58                 nsKeywords.add(".role");
59                 nsKeywords.add(".ns");
60                 nsKeywords.add(".cred");
61         }
62
63         public Validator() {
64                 actionChars = ACTION_CHARS;
65                 instChars = INST_CHARS;
66         }
67         
68         public final String errs() {
69                 return msgs.toString();
70         }
71
72         public final Validator nullOrBlank(String name, String str) {
73                 if(str==null) {
74                         msg(name + " is null.");
75                 } else if(str.length()==0) {
76                         msg(name + " is blank.");
77                 }
78                 return this;
79         }
80
81         public final Validator isNull(String name, Object o) {
82                 if(o==null) {
83                         msg(name + " is null.");
84                 }
85                 return this;
86         }
87
88         protected final boolean noMatch(String str, Pattern p) {
89                 return !p.matcher(str).matches();
90         }
91         protected final boolean nob(String str, Pattern p) {
92                 return str==null || !p.matcher(str).matches(); 
93         }
94
95         protected final void msg(String ... strs) {
96                 if(msgs==null) {
97                         msgs=new StringBuilder();
98                 }
99                 for(String str : strs) {
100                         msgs.append(str);
101                 }
102                 msgs.append('\n');
103         }
104
105         public final boolean err() {
106                 return msgs!=null;
107         }
108
109         public final Validator notOK(Result<?> res) {
110                 if(res==null) {
111                         msgs.append("Result object is blank");
112                 } else if(res.notOK()) {
113                         msgs.append(res.getClass().getSimpleName() + " is not OK");
114                 }
115                 return this;
116         }
117
118         protected Validator intRange(String text, int target, int start, int end) {
119                 if(target<start || target>end) {
120                         msg(text + " is out of range (" + start + '-' + end + ')');
121                 }
122                 return this;
123         }
124
125         protected Validator floatRange(String text, float target, float start, float end) {
126                 if(target<start || target>end) {
127                         msg(text + " is out of range (" + start + '-' + end + ')');
128                 }
129                 return this;
130         }
131
132         protected Validator description(String type, String description) {
133                 if(description!=null) {
134                         if(noMatch(description, DESC_CHAR)) {
135                                 msg(type + " Description is invalid.");
136                         }
137                 }
138                 return this;
139         }
140
141         public final Validator permType(String type) {
142                 if(nob(type,NAME_CHARS)) {
143                         msg("Perm Type [" +type + "] is invalid.");
144                 }
145                 return this;
146         }
147
148         public final Validator permType(String type, String ns) {
149                 if(nob(type,NAME_CHARS)) {
150                         msg("Perm Type [" + (ns==null?"":ns+(type.length()==0?"":'.'))+type + "] is invalid.");
151                 }
152                 return this;
153         }
154
155         public final Validator permInstance(String instance) {
156                 if(nob(instance,instChars)) {
157                         msg("Perm Instance [" + instance + "] is invalid.");
158                 }
159                 return this;
160         }
161
162         public final Validator permAction(String action) {
163                 // TODO check for correct Splits?  Type|Instance|Action ?
164                 if(nob(action, actionChars)) {
165                         msg("Perm Action [" + action + "] is invalid.");
166                 }
167                 return this;
168         }
169
170         public final Validator role(String role) {
171                 if(nob(role, NAME_CHARS)) {
172                         msg("Role [" + role + "] is invalid.");
173                 }
174                 return this;
175         }
176
177         public final Validator ns(String ns) {
178                 if(nob(ns,NAME_CHARS)){
179                         msg("NS [" + ns + "] is invalid.");
180                 } 
181                 for(String s : nsKeywords) {
182                         if(ns.endsWith(s)) {
183                                 msg("NS [" + ns + "] may not be named with NS keywords");
184                                 break;
185                         }
186                 }
187                 return this;
188         }
189
190         public final Validator key(String key) {
191                 if(nob(key,NAME_CHARS)) {
192                         msg("NS Prop Key [" + key + "] is invalid");
193                 }
194                 return this;
195         }
196
197         public final Validator value(String value) {
198                 if(nob(value,ESSENTIAL_CHARS)) {
199                         msg("NS Prop value [" + value + "] is invalid");
200                 }
201                 return this;
202         }
203
204 }