[AAF-21] Updated Copyright Headers for AAF
[aaf/authz.git] / authz-core / src / main / java / com / att / authz / env / AuthzEnv.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 com.att.authz.env;\r
24 \r
25 import java.io.ByteArrayOutputStream;\r
26 import java.io.IOException;\r
27 import java.io.InputStream;\r
28 import java.util.Map.Entry;\r
29 import java.util.Properties;\r
30 \r
31 import com.att.cadi.Access;\r
32 import com.att.cadi.Symm;\r
33 import com.att.cadi.config.Config;\r
34 import com.att.inno.env.APIException;\r
35 import com.att.inno.env.Decryptor;\r
36 import com.att.inno.env.Encryptor;\r
37 import com.att.inno.env.impl.Log4JLogTarget;\r
38 import com.att.inno.env.log4j.LogFileNamer;\r
39 import com.att.rosetta.env.RosettaEnv;\r
40 \r
41 \r
42 /**\r
43  * AuthzEnv is the Env tailored to Authz Service\r
44  * \r
45  * Most of it is derived from RosettaEnv, but it also implements Access, which\r
46  * is an Interface that Allows CADI to interact with Container Logging\r
47  * \r
48  *\r
49  */\r
50 public class AuthzEnv extends RosettaEnv implements Access {\r
51         private long[] times = new long[20];\r
52         private int idx = 0;\r
53         //private int mask = Level.AUDIT.maskOf();\r
54 \r
55         public AuthzEnv() {\r
56                 super();\r
57         }\r
58 \r
59         public AuthzEnv(String ... args) {\r
60                 super(args);\r
61         }\r
62 \r
63         public AuthzEnv(Properties props) {\r
64                 super(Config.CADI_PROP_FILES,props);\r
65         }\r
66         \r
67 \r
68         @Override\r
69         public AuthzTransImpl newTrans() {\r
70                 synchronized(this) {\r
71                         times[idx]=System.currentTimeMillis();\r
72                         if(++idx>=times.length)idx=0;\r
73                 }\r
74                 return new AuthzTransImpl(this);\r
75         }\r
76 \r
77         /**\r
78          *  Create a Trans, but do not include in Weighted Average\r
79          * @return\r
80          */\r
81         public AuthzTrans newTransNoAvg() {\r
82                 return new AuthzTransImpl(this);\r
83         }\r
84 \r
85         public long transRate() {\r
86                 int count = 0;\r
87                 long pot = 0;\r
88                 long prev = 0;\r
89                 for(int i=idx;i<times.length;++i) {\r
90                         if(times[i]>0) {\r
91                                 if(prev>0) {\r
92                                         ++count;\r
93                 pot += times[i]-prev;\r
94                                 }\r
95                                 prev = times[i]; \r
96                         }\r
97                 }\r
98                 for(int i=0;i<idx;++i) {\r
99                         if(times[i]>0) {\r
100                                 if(prev>0) {\r
101                                         ++count;\r
102                                         pot += times[i]-prev;\r
103                                 }\r
104                                 prev = times[i]; \r
105                         }\r
106                 }\r
107 \r
108                 return count==0?300000L:pot/count; // Return Weighted Avg, or 5 mins, if none avail.\r
109         }\r
110         \r
111         @Override\r
112         public ClassLoader classLoader() {\r
113                 return getClass().getClassLoader();\r
114         }\r
115 \r
116         @Override\r
117         public void load(InputStream is) throws IOException {\r
118                 Properties props = new Properties();\r
119                 props.load(is);\r
120                 for(Entry<Object, Object> es : props.entrySet()) {\r
121                         String key = es.getKey().toString();\r
122                         String value =es.getValue().toString();\r
123                         put(staticSlot(key==null?null:key.trim()),value==null?null:value.trim());\r
124                 }\r
125         }\r
126 \r
127         @Override\r
128         public void log(Level lvl, Object... msgs) {\r
129 //              if(lvl.inMask(mask)) {\r
130 //                      switch(lvl) {\r
131 //                              case INIT:\r
132 //                                      init().log(msgs);\r
133 //                                      break;\r
134 //                              case AUDIT:\r
135 //                                      audit().log(msgs);\r
136 //                                      break;\r
137 //                              case DEBUG:\r
138 //                                      debug().log(msgs);\r
139 //                                      break;\r
140 //                              case ERROR:\r
141 //                                      error().log(msgs);\r
142 //                                      break;\r
143 //                              case INFO:\r
144 //                                      info().log(msgs);\r
145 //                                      break;\r
146 //                              case WARN:\r
147 //                                      warn().log(msgs);\r
148 //                                      break;\r
149 //                              case NONE:\r
150 //                                      break;\r
151 //                      }\r
152 //              }\r
153         }\r
154 \r
155         @Override\r
156         public void log(Exception e, Object... msgs) {\r
157                 error().log(e,msgs);\r
158         }\r
159 \r
160         //@Override\r
161         public void printf(Level level, String fmt, Object... elements) {\r
162                 if(willLog(level)) {\r
163                         log(level,String.format(fmt, elements));\r
164                 }\r
165         }\r
166 \r
167         /* (non-Javadoc)\r
168          * @see com.att.cadi.Access#willLog(com.att.cadi.Access.Level)\r
169          */\r
170         @Override\r
171         public boolean willLog(Level level) {\r
172                 \r
173 //              if(level.inMask(mask)) {\r
174 //                      switch(level) {\r
175 //                              case INIT:\r
176 //                                      return init().isLoggable();\r
177 //                              case AUDIT:\r
178 //                                      return audit().isLoggable();\r
179 //                              case DEBUG:\r
180 //                                      return debug().isLoggable();\r
181 //                              case ERROR:\r
182 //                                      return error().isLoggable();\r
183 //                              case INFO:\r
184 //                                      return info().isLoggable();\r
185 //                              case WARN:\r
186 //                                      return warn().isLoggable();\r
187 //                              case NONE:\r
188 //                                      return false;\r
189 //                      }\r
190 //              }\r
191                 return false;\r
192         }\r
193 \r
194         @Override\r
195         public void setLogLevel(Level level) {\r
196                 super.debug().isLoggable();\r
197                 //level.toggle(mask);\r
198         }\r
199 \r
200         public void setLog4JNames(String path, String root, String _service, String _audit, String _init, String _trace) throws APIException {\r
201                 LogFileNamer lfn = new LogFileNamer(root);\r
202                 if(_service==null) {\r
203                         throw new APIException("AuthzEnv.setLog4JNames \"_service\" required (as default).  Others can be null");\r
204                 }\r
205                 String service=_service=lfn.setAppender(_service); // when name is split, i.e. authz|service, the Appender is "authz", and "service"\r
206                 String audit=_audit==null?service:lfn.setAppender(_audit);     // is part of the log-file name\r
207                 String init=_init==null?service:lfn.setAppender(_init);\r
208                 String trace=_trace==null?service:lfn.setAppender(_trace);\r
209                 //TODO Validate path on Classpath\r
210                 lfn.configure(path);\r
211                 super.fatal = new Log4JLogTarget(service,org.apache.log4j.Level.FATAL);\r
212                 super.error = new Log4JLogTarget(service,org.apache.log4j.Level.ERROR);\r
213                 super.warn = new Log4JLogTarget(service,org.apache.log4j.Level.WARN);\r
214                 super.audit = new Log4JLogTarget(audit,org.apache.log4j.Level.WARN);\r
215                 super.init = new Log4JLogTarget(init,org.apache.log4j.Level.WARN);\r
216                 super.info = new Log4JLogTarget(service,org.apache.log4j.Level.INFO);\r
217                 super.debug = new Log4JLogTarget(service,org.apache.log4j.Level.DEBUG);\r
218                 super.trace = new Log4JLogTarget(trace,org.apache.log4j.Level.TRACE);\r
219         }\r
220         \r
221         private static final byte[] ENC="enc:???".getBytes();\r
222         public String decrypt(String encrypted, final boolean anytext) throws IOException {\r
223                 if(encrypted==null) {\r
224                         throw new IOException("Password to be decrypted is null");\r
225                 }\r
226                 if(anytext || encrypted.startsWith("enc:")) {\r
227                         if(decryptor.equals(Decryptor.NULL) && getProperty(Config.CADI_KEYFILE)!=null) {\r
228                                 final Symm s = Symm.obtain(this);\r
229                                 decryptor = new Decryptor() {\r
230                                         private Symm symm = s;\r
231                                         @Override\r
232                                         public String decrypt(String encrypted) {\r
233                                                 try {\r
234                                                         return (encrypted!=null && (anytext || encrypted.startsWith(Symm.ENC)))\r
235                                                                         ? symm.depass(encrypted)\r
236                                                                         : encrypted;\r
237                                                 } catch (IOException e) {\r
238                                                         return "";\r
239                                                 }\r
240                                         }\r
241                                 };\r
242                                 encryptor = new Encryptor() {\r
243                                         @Override\r
244                                         public String encrypt(String data) {\r
245                                                 ByteArrayOutputStream baos = new ByteArrayOutputStream();\r
246                                                 try {\r
247                                                         baos.write(ENC);\r
248                                                         return "enc:???"+s.enpass(data);\r
249                                                 } catch (IOException e) {\r
250                                                         return "";\r
251                                                 }\r
252                                         }\r
253         \r
254                                 };\r
255                         }\r
256                         return decryptor.decrypt(encrypted);\r
257                 } else {\r
258                         return encrypted;\r
259                 }\r
260         }\r
261         \r
262         \r
263         \r
264 }\r