Approval Batch, prep better JUnit
[aaf/authz.git] / auth / auth-certman / src / main / java / org / onap / aaf / auth / cm / mapper / Mapper2_0.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.cm.mapper;
23
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.List;
27
28 import org.onap.aaf.auth.cm.data.CertDrop;
29 import org.onap.aaf.auth.cm.data.CertRenew;
30 import org.onap.aaf.auth.cm.data.CertReq;
31 import org.onap.aaf.auth.cm.data.CertResp;
32 import org.onap.aaf.auth.cm.validation.CertmanValidator;
33 import org.onap.aaf.auth.dao.cass.ArtiDAO;
34 import org.onap.aaf.auth.dao.cass.ArtiDAO.Data;
35 import org.onap.aaf.auth.dao.cass.CertDAO;
36 import org.onap.aaf.auth.env.AuthzTrans;
37 import org.onap.aaf.auth.layer.Result;
38 import org.onap.aaf.cadi.util.FQI;
39 import org.onap.aaf.cadi.util.Vars;
40
41 import aaf.v2_0.Error;
42 import certman.v1_0.Artifacts;
43 import certman.v1_0.Artifacts.Artifact;
44 import certman.v1_0.BaseRequest;
45 import certman.v1_0.CertInfo;
46 import certman.v1_0.CertificateDrop;
47 import certman.v1_0.CertificateRenew;
48 import certman.v1_0.CertificateRequest;
49
50
51 public class Mapper2_0 implements Mapper<BaseRequest,CertInfo,Artifacts,Error> {
52     
53     @Override
54     public Class<?> getClass(API api) {
55         switch(api) {
56             case CERT_REQ: return CertificateRequest.class;
57             case CERT_RENEW: return CertificateRenew.class;
58             case CERT_DROP: return CertificateDrop.class;
59             case CERT: return CertInfo.class;
60             case ARTIFACTS: return Artifacts.class;
61             case ERROR: return Error.class;
62             case VOID: return Void.class;
63         }
64         return null;
65     }
66
67     @SuppressWarnings("unchecked")
68     @Override
69     public <A> A newInstance(API api) {
70         switch(api) {
71             case CERT_REQ: return (A) new CertificateRequest();
72             case CERT_RENEW: return (A) new CertificateRenew();
73             case CERT_DROP: return (A) new CertificateDrop();
74             case CERT: return (A) new CertInfo();
75             case ARTIFACTS: return (A) new Artifacts();
76             case ERROR: return (A)new Error();
77             case VOID: return null;
78         }
79         return null;
80     }
81
82     //////////////  Mapping Functions /////////////
83     @Override
84     public Error errorFromMessage(StringBuilder holder, String msgID, String text, Object ... var) {
85         Error err = new Error();
86         err.setMessageId(msgID);
87         // AT&T Restful Error Format requires numbers "%" placements
88         err.setText(Vars.convert(holder, text, var));
89         for (Object s : var) {
90             err.getVariables().add(s.toString());
91         }
92         return err;
93     }
94
95     /* (non-Javadoc)
96      * @see com.att.authz.certman.mapper.Mapper#toCert(org.onap.aaf.auth.env.test.AuthzTrans, org.onap.aaf.auth.layer.test.Result)
97      */
98     /* (non-Javadoc)
99      * @see com.att.authz.certman.mapper.Mapper#toCert(org.onap.aaf.auth.env.test.AuthzTrans, org.onap.aaf.auth.layer.test.Result)
100      */
101     @Override
102     public Result<CertInfo> toCert(AuthzTrans trans, Result<CertResp> in, boolean withTrustChain) throws IOException {
103         if (!in.isOK()) {
104             CertResp cin = in.value;
105             CertInfo cout = newInstance(API.CERT);
106             cout.setPrivatekey(cin.privateString());
107             String value;
108             if ((value=cin.challenge())!=null) {
109                 cout.setChallenge(value);
110             }
111             cout.getCerts().add(cin.asCertString());
112             if (cin.trustChain()!=null) {
113                 for (String c : cin.trustChain()) {
114                     cout.getCerts().add(c);
115                 }
116             }
117             if (cin.notes()!=null) {
118                 boolean first = true;
119                 StringBuilder sb = new StringBuilder();
120                 for (String n : cin.notes()) {
121                     if (first) {
122                         first = false;
123                     } else {
124                         sb.append('\n');
125                     }
126                     sb.append(n);
127                 }
128                 cout.setNotes(sb.toString());
129             }
130             
131             List<String> caIssuerDNs = cout.getCaIssuerDNs();
132             for (String s : cin.caIssuerDNs()) {
133                 caIssuerDNs.add(s);
134             }
135
136             cout.setEnv(cin.env());
137             return Result.ok(cout);
138         } else {
139             return Result.err(in);
140         }
141     }
142
143
144     @Override
145     public Result<CertInfo> toCert(AuthzTrans trans, Result<List<CertDAO.Data>> in) {
146         if (in.isOK()) {
147             CertInfo cout = newInstance(API.CERT);
148             List<String> certs = cout.getCerts();
149             for (CertDAO.Data cdd : in.value) {
150                 certs.add(cdd.x509);
151             }
152             return Result.ok(cout);
153         } else {
154             return Result.err(in);
155         }
156     }
157
158     /* (non-Javadoc)
159      * @see com.att.authz.certman.mapper.Mapper#toReq(org.onap.aaf.auth.env.test.AuthzTrans, java.lang.Object)
160      */
161     @Override
162     public Result<CertReq> toReq(AuthzTrans trans, BaseRequest req) {
163         CertificateRequest in;
164         try {
165             in = (CertificateRequest)req;
166         } catch (ClassCastException e) {
167             return Result.err(Result.ERR_BadData,"Request is not a CertificateRequest");
168         }
169
170         CertReq out = new CertReq();
171         CertmanValidator v = new CertmanValidator();
172         v.isNull("CertRequest", req)
173             .nullOrBlank("MechID", out.mechid=in.getMechid());
174         v.nullBlankMin("FQDNs", out.fqdns=in.getFqdns(),1);
175         if (v.err()) {
176             return Result.err(Result.ERR_BadData, v.errs());
177         }
178
179         out.emails = in.getEmail();
180         out.sponsor=in.getSponsor();
181         out.start = in.getStart();
182         out.end = in.getEnd();
183         out.fqdns = in.getFqdns();
184         return Result.ok(out);
185     }
186
187     /* (non-Javadoc)
188      * @see com.att.authz.certman.mapper.Mapper#toRenew(org.onap.aaf.auth.env.test.AuthzTrans, java.lang.Object)
189      */
190     @Override
191     public Result<CertRenew> toRenew(AuthzTrans trans, BaseRequest req) {
192         return Result.err(Result.ERR_NotImplemented,"Not Implemented... yet");
193     }
194
195     /* (non-Javadoc)
196      * @see com.att.authz.certman.mapper.Mapper#toDrop(org.onap.aaf.auth.env.test.AuthzTrans, java.lang.Object)
197      */
198     @Override
199     public Result<CertDrop> toDrop(AuthzTrans trans, BaseRequest req) {
200         return Result.err(Result.ERR_NotImplemented,"Not Implemented... yet");
201     }
202
203     /* (non-Javadoc)
204      * @see org.onap.aaf.auth.cm.mapper.Mapper#toArtifact(org.onap.aaf.auth.env.test.AuthzTrans, java.lang.Object)
205      */
206     @Override
207     public List<ArtiDAO.Data> toArtifact(AuthzTrans trans, Artifacts artifacts) {
208         List<ArtiDAO.Data> ladd = new ArrayList<>();
209         for (Artifact arti : artifacts.getArtifact()) {
210             ArtiDAO.Data data = new ArtiDAO.Data();
211             data.mechid = arti.getMechid();
212             data.machine = arti.getMachine();
213             data.type(true).addAll(arti.getType());
214             data.ca = arti.getCa();
215             data.dir = arti.getDir();
216             data.os_user = arti.getOsUser();
217             // Optional (on way in)
218             data.ns = arti.getNs();
219             data.renewDays = arti.getRenewDays();
220             data.notify = arti.getNotification();
221             
222             // Ignored on way in for create/update
223             data.sponsor = arti.getSponsor();
224             data.expires = null;
225             
226             // Derive Optional Data from Machine (Domain) if exists
227             if (data.machine!=null) {
228                 if (data.ca==null) {
229                     if (data.machine.endsWith(".att.com")) {
230                         data.ca = "aaf"; // default
231                     }
232                 }
233                 if (data.ns==null ) {
234                     data.ns=FQI.reverseDomain(data.machine);
235                 }
236             }
237             data.sans(true).addAll(arti.getSans());
238             ladd.add(data);
239         }
240         return ladd;
241     }
242
243     /* (non-Javadoc)
244      * @see org.onap.aaf.auth.cm.mapper.Mapper#fromArtifacts(org.onap.aaf.auth.layer.test.Result)
245      */
246     @Override
247     public Result<Artifacts> fromArtifacts(Result<List<Data>> lArtiDAO) {
248         if (lArtiDAO.isOK()) {
249             Artifacts artis = new Artifacts();
250             for (ArtiDAO.Data arti : lArtiDAO.value) {
251                 Artifact a = new Artifact();
252                 a.setMechid(arti.mechid);
253                 a.setMachine(arti.machine);
254                 a.setSponsor(arti.sponsor);
255                 a.setNs(arti.ns);
256                 a.setCa(arti.ca);
257                 a.setDir(arti.dir);
258                 a.getType().addAll(arti.type(false));
259                 a.setOsUser(arti.os_user);
260                 a.setRenewDays(arti.renewDays);
261                 a.setNotification(arti.notify);
262                 a.getSans().addAll(arti.sans(false));
263                 artis.getArtifact().add(a);
264             }
265             return Result.ok(artis);
266         } else {
267             return Result.err(lArtiDAO);
268         }
269     }
270     
271     
272
273 }