Add a MassMail Batch Program
[aaf/authz.git] / auth / auth-oauth / src / main / java / org / onap / aaf / auth / oauth / mapper / Mapper1_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.oauth.mapper;
23
24 import java.util.Map;
25 import java.util.Map.Entry;
26 import java.util.Set;
27
28 import javax.servlet.http.HttpServletRequest;
29
30 import org.onap.aaf.auth.dao.cass.OAuthTokenDAO;
31 import org.onap.aaf.auth.dao.cass.OAuthTokenDAO.Data;
32 import org.onap.aaf.auth.layer.Result;
33 import org.onap.aaf.auth.oauth.service.OAuthService;
34 import org.onap.aaf.auth.oauth.service.OCreds;
35 import org.onap.aaf.auth.oauth.service.OAuthService.CLIENT_TYPE;
36 import org.onap.aaf.auth.oauth.service.OAuthService.GRANT_TYPE;
37 import org.onap.aaf.cadi.util.Holder;
38 import org.onap.aaf.cadi.oauth.OAuth2Principal;
39 import org.onap.aaf.cadi.util.Vars;
40 import org.onap.aaf.misc.env.util.Split;
41
42 import aaf.v2_0.Error;
43 import aafoauth.v2_0.Introspect;
44 import aafoauth.v2_0.Token;
45 import aafoauth.v2_0.TokenRequest;
46
47
48 public class Mapper1_0 extends MapperIntrospect1_0 implements Mapper<TokenRequest,Token,Introspect,Error> {
49     @Override
50     public Class<?> getClass(API api) {
51         switch(api) {
52             case TOKEN_REQ:        return TokenRequest.class;
53             case TOKEN:         return Token.class;
54             case INTROSPECT:     return Introspect.class;
55             case ERROR:         return Error.class;
56             case VOID:             return Void.class;
57         }
58         return null;
59     }
60
61     @SuppressWarnings("unchecked")
62     @Override
63     public <A> A newInstance(API api) {
64         switch(api) {
65             case TOKEN_REQ:        return (A)new TokenRequest();
66             case TOKEN:         return (A)new Token();
67             case INTROSPECT:     return (A)new Introspect();
68             case ERROR:         return (A)new Error();
69             case VOID:             return null;
70         }
71         return null;
72     }
73
74     //////////////  Mapping Functions /////////////
75     @Override
76     public Error errorFromMessage(StringBuilder holder, String msgID, String text, Object ... var) {
77         Error err = new Error();
78         err.setMessageId(msgID);
79         // AT&T Restful Error Format requires numbers "%" placements
80         err.setText(Vars.convert(holder, text, var));
81         for (Object s : var) {
82             err.getVariables().add(s.toString());
83         }
84         return err;
85     }
86
87     @Override
88     public TokenRequest tokenReqFromParams(HttpServletRequest req) {
89         TokenRequest tr = new TokenRequest();
90         boolean data = false;
91         Map<String, String[]> map = req.getParameterMap();
92         for (Entry<String, String[]> es : map.entrySet()) {
93             switch(es.getKey()) {
94                 case "client_id":
95                     if (es.getValue().length==1) {
96                         tr.setClientId(es.getValue()[0]);
97                         data = true;
98                     }
99                     break;
100                 case "client_secret":
101                     if (es.getValue().length==1) {
102                         tr.setClientSecret(es.getValue()[0]);
103                         data = true;
104                     }
105                     break;
106                 case "username":
107                     if (es.getValue().length==1) {
108                         tr.setUsername(es.getValue()[0]);
109                         data = true;
110                     }
111                     break;
112                 case "password":
113                     if (es.getValue().length==1) {
114                         tr.setPassword(es.getValue()[0]);
115                         data = true;
116                     }
117                     break;
118                 case "scope":
119                     if (es.getValue().length==1) {
120                         tr.setScope(es.getValue()[0]);
121                         data = true;
122                     }
123                     break;
124                 case "grant_type":
125                     if (es.getValue().length==1) {
126                         tr.setGrantType(es.getValue()[0]);
127                         data = true;
128                     }
129                     break;
130                 case "refresh_token":
131                     if (es.getValue().length==1) {
132                         tr.setRefreshToken(es.getValue()[0]);
133                         data = true;
134                     }
135                     break;
136
137             }
138         }
139         return data?tr:null;
140     }
141
142
143
144     /* (non-Javadoc)
145      * @see org.onap.aaf.auth.oauth.mapper.Mapper#credsFromReq(javax.servlet.http.HttpServletRequest)
146      */
147     @Override
148     public OCreds credsFromReq(TokenRequest tokReq) {
149         return new OCreds(tokReq.getClientId(),tokReq.getClientSecret(),
150                          tokReq.getUsername(),tokReq.getPassword());
151     }
152
153     /* (non-Javadoc)
154      * @see org.onap.aaf.auth.oauth.mapper.Mapper#tokenReq(java.lang.Object)
155      */
156     @Override
157     public Data clientTokenReq(TokenRequest tokReq, Holder<GRANT_TYPE> hgt) {
158         OAuthTokenDAO.Data tdd = new OAuthTokenDAO.Data();
159         tdd.client_id = tokReq.getClientId();
160         tdd.user = tokReq.getUsername();
161         if (tokReq.getRefreshToken()!=null) {
162             tdd.refresh=tokReq.getRefreshToken();
163         }
164
165         for (GRANT_TYPE ttt : GRANT_TYPE.values()) {
166             if (ttt.name().equals(tokReq.getGrantType())) {
167                 hgt.set(ttt);
168                 break;
169             }
170         }
171
172         switch(hgt.get()) {
173             case client_credentials:
174             case password:
175             case refresh_token:
176                 tdd.type = CLIENT_TYPE.confidential.ordinal();
177                 break;
178             default:
179                 tdd.type = CLIENT_TYPE.unknown.ordinal();
180                 break;
181         }
182         String scopes=tokReq.getScope();
183         if (scopes!=null) {
184             Set<String> ss = tdd.scopes(true);
185             for (String s: Split.split(' ', tokReq.getScope())) {
186                 ss.add(s);
187             }
188         }
189
190         tdd.state = tokReq.getState();
191         return tdd;
192     }
193
194     @Override
195     public Result<Token> tokenFromData(Result<Data> rd) {
196         if (rd.notOK()) {
197             return Result.err(rd);
198         }
199         Data d = rd.value;
200         Token token = new Token();
201         if (OAuthService.TOKEN_TYPE.values().length>d.type) {
202             token.setTokenType(OAuthService.TOKEN_TYPE.values()[d.type].name());
203         } else {
204             token.setTokenType("Invalid");
205         }
206         token.setAccessToken(d.id);
207         token.setRefreshToken(d.refresh);
208         token.setExpiresIn((int)(d.exp_sec-(System.currentTimeMillis())/1000));
209         token.setScope(getScopes(d.scopes(false)));
210         token.setState(d.state);
211         return Result.ok(token);
212     }
213
214
215
216     /* (non-Javadoc)
217      * @see org.onap.aaf.auth.oauth.mapper.Mapper#fromPrincipal(org.onap.aaf.cadi.oauth.OAuth2Principal)
218      */
219     @Override
220     public Introspect fromPrincipal(OAuth2Principal p) {
221         return p.tokenPerm().getIntrospect();
222     }
223
224 }