[Simulator] Minor UI changes fixing the IOT-1087.
[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.Const;
29 import org.iotivity.cloud.accountserver.util.CoapMessageBuilder;
30 import org.iotivity.cloud.accountserver.util.JSONUtil;
31 import org.iotivity.cloud.base.Resource;
32 import org.iotivity.cloud.base.protocols.coap.CoapRequest;
33 import org.iotivity.cloud.base.protocols.coap.CoapResponse;
34 import org.iotivity.cloud.base.protocols.coap.enums.CoapMethod;
35 import org.iotivity.cloud.base.protocols.coap.enums.CoapStatus;
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 register account information of
43  * authorized user.
44  *
45  */
46 public class AuthResource extends Resource {
47
48     public AuthResource() {
49         setUri(Const.AUTH_URI);
50     }
51
52     @Override
53     public void onRequestReceived(ChannelHandlerContext ctx, CoapRequest request) {
54
55         Logger.d("AuthResource IN");
56
57         if (ctx == null || request == null) {
58             Logger.d("ctx or request msg is null");
59         }
60
61         else {
62             CoapMethod method = request.getRequestMethod();
63
64             switch (method) {
65                 case POST:
66                     try {
67                         handlePostRequest(ctx, request);
68                     } catch (Exception e) {
69                         e.printStackTrace();
70                     }
71                     break;
72
73                 default:
74                     Logger.w("method(" + method + ") is not supported");
75                     break;
76             }
77         }
78     }
79
80     /**
81      * API for handling POST message
82      * 
83      * @param ctx
84      *            ChannelHandlerContext of request message
85      * @param request
86      *            CoAP request message
87      * @throws Exception
88      */
89     private void handlePostRequest(ChannelHandlerContext ctx,
90             CoapRequest request) throws Exception {
91
92         String reqType = extractQuery(request, Const.REQ_TYPE);
93
94         if (reqType == null)
95             throw new IllegalArgumentException("request type is null in query!");
96
97         CoapResponse response = null;
98
99         switch (reqType) {
100             case Const.TYPE_REGISTER:
101                 response = handleRegisterRequest(request);
102                 break;
103             case Const.TYPE_LOGIN:
104                 response = handleLoginRequest(request);
105                 break;
106             default:
107                 throw new IllegalArgumentException(
108                         "request type is not supported");
109         }
110
111         ctx.write(response);
112     }
113
114     private CoapResponse handleLoginRequest(CoapRequest request) {
115
116         String payload = request.getPayloadString();
117
118         JSONUtil util = new JSONUtil();
119         String sessionCode = util
120                 .parseJSON(payload, Const.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 = null;
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(
140                     request.getToken(), responseJson, CoapStatus.CREATED);
141
142         } else {
143
144             coapResponse = responseMessage.buildCoapResponse(
145                     request.getToken(), CoapStatus.INTERNAL_SERVER_ERROR);
146
147         }
148
149         return coapResponse;
150     }
151
152     private CoapResponse handleRegisterRequest(CoapRequest request) {
153
154         String payload = request.getPayloadString();
155
156         JSONUtil util = new JSONUtil();
157         String authCode = util.parseJSON(payload, Const.REQUEST_AUTH_CODE);
158         String authServer = util.parseJSON(payload, Const.REQUEST_AUTH_SERVER);
159
160         Logger.d("authCode: " + authCode + ", authServer: " + authServer);
161
162         AccountServerManager oauthServerManager = new AccountServerManager();
163
164         String userId = oauthServerManager.requestUserId(authCode, authServer);
165         String sessionCode = oauthServerManager.registerUserAccount(userId);
166
167         Logger.d("userId: " + userId + ", sessionCode: " + sessionCode);
168
169         CoapMessageBuilder responseMessage = new CoapMessageBuilder();
170         CoapResponse coapResponse = null;
171
172         if (userId != null && sessionCode != null) {
173
174             ResponseObject response = new ResponseObject();
175             response.setSessionCode(sessionCode);
176             response.setUserId(userId);
177
178             String responseJson = convertRegisterResponseToJson(response);
179             Logger.d("responseJson: " + responseJson);
180
181             coapResponse = responseMessage.buildCoapResponse(
182                     request.getToken(), responseJson, CoapStatus.CREATED);
183
184         } else {
185
186             coapResponse = responseMessage.buildCoapResponse(
187                     request.getToken(), CoapStatus.UNAUTHORIZED);
188
189         }
190
191         return coapResponse;
192     }
193
194     private String convertRegisterResponseToJson(ResponseObject response) {
195
196         HashMap<Object, Object> responseMap = new HashMap<Object, Object>();
197
198         String sessionCode = response.getSessionCode();
199         String userId = response.getUserId();
200
201         if (userId != null)
202             responseMap.put(Const.RESPONSE_USER_ID, userId);
203
204         if (sessionCode != null)
205             responseMap.put(Const.RESPONSE_SESSION_CODE, sessionCode);
206
207         JSONUtil jsonUtil = new JSONUtil();
208         String responseJson = jsonUtil.writeJSON(responseMap);
209
210         return responseJson;
211     }
212
213     private String convertLoginResponseToJson(ResponseObject response) {
214
215         HashMap<Object, Object> responseMap = new HashMap<Object, Object>();
216
217         String userId = response.getUserId();
218
219         if (userId != null)
220             responseMap.put(Const.RESPONSE_USER_ID, userId);
221
222         JSONUtil jsonUtil = new JSONUtil();
223         String responseJson = jsonUtil.writeJSON(responseMap);
224
225         return responseJson;
226     }
227
228     private String extractQuery(CoapRequest request, String key) {
229
230         String value = null;
231
232         List<String> Segments = request.getUriQuerySegments();
233
234         for (String s : Segments) {
235
236             String pair[] = s.split("=");
237
238             if (pair[0].equals(key)) {
239
240                 value = pair[1];
241             }
242         }
243
244         return value;
245     }
246
247     /*
248      * private static String getPayloadString(byte[] payload) {
249      * 
250      * if (payload == null) return "";
251      * 
252      * return new String(payload, Charset.forName("UTF-8")); }
253      */
254
255 }