Merge branch '1.1-rel'
[platform/upstream/iotivity.git] / cloud / account / src / main / java / org / iotivity / cloud / accountserver / resources / AuthResource.java
1 /*
2  *******************************************************************
3  *
4  * Copyright 2016 Samsung Electronics All Rights Reserved.
5  *
6  *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21  */
22 package org.iotivity.cloud.accountserver.resources;
23
24 import java.util.HashMap;
25 import java.util.List;
26
27 import org.iotivity.cloud.accountserver.AccountServerManager;
28 import org.iotivity.cloud.accountserver.Constants;
29 import org.iotivity.cloud.accountserver.util.CoapMessageBuilder;
30 import org.iotivity.cloud.base.Resource;
31 import org.iotivity.cloud.base.protocols.coap.CoapRequest;
32 import org.iotivity.cloud.base.protocols.coap.CoapResponse;
33 import org.iotivity.cloud.base.protocols.coap.enums.CoapMethod;
34 import org.iotivity.cloud.base.protocols.coap.enums.CoapStatus;
35 import org.iotivity.cloud.util.JSONUtil;
36 import org.iotivity.cloud.util.Logger;
37
38 import io.netty.channel.ChannelHandlerContext;
39
40 /**
41  *
42  * This class provides a set of APIs to manage user account with authorization
43  * process.
44  *
45  */
46 public class AuthResource extends Resource {
47
48     public AuthResource() {
49         setUri(Constants.AUTH_URI);
50     }
51
52     @Override
53     public void onRequestReceived(ChannelHandlerContext ctx,
54             CoapRequest request) {
55
56         Logger.d("AuthResource IN");
57
58         if (ctx == null || request == null) {
59             Logger.d("ctx or request msg is null");
60         }
61
62         else {
63             CoapMethod method = request.getRequestMethod();
64
65             switch (method) {
66                 case POST:
67                     try {
68                         handlePostRequest(ctx, request);
69                     } catch (Exception e) {
70                         e.printStackTrace();
71                     }
72                     break;
73
74                 default:
75                     Logger.w("method(" + method + ") is not supported");
76                     break;
77             }
78         }
79     }
80
81     private void handlePostRequest(ChannelHandlerContext ctx,
82             CoapRequest request) throws Exception {
83
84         String reqType = extractQuery(request, Constants.REQ_TYPE);
85
86         if (reqType == null)
87             throw new IllegalArgumentException(
88                     "request type is null in query!");
89
90         CoapResponse response;
91
92         switch (reqType) {
93             case Constants.TYPE_REGISTER:
94                 response = handleRegisterRequest(request);
95                 break;
96             case Constants.TYPE_LOGIN:
97                 response = handleLoginRequest(request);
98                 break;
99             default:
100                 throw new IllegalArgumentException(
101                         "request type is not supported");
102         }
103
104         ctx.writeAndFlush(response);
105     }
106
107     /**
108      * API for handling request for login by user account
109      *
110      * @param request
111      *            CoAP request message
112      * @return CoapResponse - CoAP response message with response result
113      *         information
114      */
115     private CoapResponse handleLoginRequest(CoapRequest request) {
116
117         String payload = request.getPayloadString();
118
119         String sessionCode = JSONUtil.parseJSON(payload,
120                 Constants.REQUEST_SESSION_CODE);
121
122         Logger.d("sessionCode: " + sessionCode);
123
124         AccountServerManager oauthServerManager = new AccountServerManager();
125         String userId = oauthServerManager.requestUserId(sessionCode);
126         Logger.d("userId: " + userId);
127
128         CoapMessageBuilder responseMessage = new CoapMessageBuilder();
129         CoapResponse coapResponse;
130
131         if (userId != null) {
132
133             ResponseObject response = new ResponseObject();
134             response.setUserId(userId);
135
136             String responseJson = convertLoginResponseToJson(response);
137             Logger.d("responseJson: " + responseJson);
138
139             coapResponse = responseMessage.buildCoapResponse(request.getToken(),
140                     responseJson, CoapStatus.CREATED);
141
142         } else {
143
144             coapResponse = responseMessage.buildCoapResponse(request.getToken(),
145                     CoapStatus.INTERNAL_SERVER_ERROR);
146
147         }
148
149         return coapResponse;
150     }
151
152     /**
153      * API for handling request for registering user account
154      *
155      * @param request
156      *            CoAP request message
157      * @return CoapResponse - CoAP response message with response result
158      *         information
159      */
160     private CoapResponse handleRegisterRequest(CoapRequest request) {
161
162         String payload = request.getPayloadString();
163
164         String authCode = JSONUtil.parseJSON(payload,
165                 Constants.REQUEST_AUTH_CODE);
166         String authServer = JSONUtil.parseJSON(payload,
167                 Constants.REQUEST_AUTH_SERVER);
168
169         Logger.d("authCode: " + authCode + ", authServer: " + authServer);
170
171         AccountServerManager oauthServerManager = new AccountServerManager();
172         String userId = null;
173         if (authCode != null && authServer != null) {
174             userId = oauthServerManager.requestUserId(authCode, authServer);
175         }
176         
177         CoapMessageBuilder responseMessage = new CoapMessageBuilder();
178         CoapResponse coapResponse;
179
180         if (userId != null) {
181             
182             String sessionCode = oauthServerManager.registerUserAccount(userId);
183
184             Logger.d("userId: " + userId + ", sessionCode: " + sessionCode);
185
186             if (sessionCode != null) {
187
188                 ResponseObject response = new ResponseObject();
189                 response.setSessionCode(sessionCode);
190                 response.setUserId(userId);
191
192                 String responseJson = convertRegisterResponseToJson(response);
193                 Logger.d("responseJson: " + responseJson);
194
195                 coapResponse = responseMessage.buildCoapResponse(
196                         request.getToken(), responseJson, CoapStatus.CREATED);
197             }
198             else  {
199                 coapResponse = responseMessage.buildCoapResponse(request.getToken(),
200                         CoapStatus.UNAUTHORIZED);                
201             }
202
203         } else {
204
205             coapResponse = responseMessage.buildCoapResponse(request.getToken(),
206                     CoapStatus.UNAUTHORIZED);
207         }
208
209         return coapResponse;
210     }
211
212     private String convertRegisterResponseToJson(ResponseObject response) {
213
214         HashMap<Object, Object> responseMap = new HashMap<Object, Object>();
215
216         String sessionCode = response.getSessionCode();
217         String userId = response.getUserId();
218
219         if (userId != null)
220             responseMap.put(Constants.RESPONSE_USER_ID, userId);
221
222         if (sessionCode != null)
223             responseMap.put(Constants.RESPONSE_SESSION_CODE, sessionCode);
224
225         String responseJson = JSONUtil.writeJSON(responseMap);
226
227         return responseJson;
228     }
229
230     private String convertLoginResponseToJson(ResponseObject response) {
231
232         HashMap<Object, Object> responseMap = new HashMap<Object, Object>();
233
234         String userId = response.getUserId();
235
236         if (userId != null)
237             responseMap.put(Constants.RESPONSE_USER_ID, userId);
238
239         String responseJson = JSONUtil.writeJSON(responseMap);
240
241         return responseJson;
242     }
243
244     private String extractQuery(CoapRequest request, String key) {
245
246         String value = null;
247
248         List<String> Segments = request.getUriQuerySegments();
249
250         if (Segments != null) {
251             for (String s : Segments) {
252
253                 String pair[] = s.split("=");
254
255                 if (pair[0].equals(key)) {
256
257                     value = pair[1];
258                 }
259             }
260         }
261
262         return value;
263     }
264
265     /*
266      * private static String getPayloadString(byte[] payload) {
267      *
268      * if (payload == null) return "";
269      *
270      * return new String(payload, Charset.forName("UTF-8")); }
271      */
272
273 }