2 * //******************************************************************
4 * // Copyright 2016 Samsung Electronics All Rights Reserved.
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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
12 * // http://www.apache.org/licenses/LICENSE-2.0
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.
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
22 package org.iotivity.cloud.accountserver.resources;
24 import java.util.HashMap;
25 import java.util.List;
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;
38 import io.netty.channel.ChannelHandlerContext;
42 * This class provides a set of APIs to manage user account with authorization
46 public class AuthResource extends Resource {
48 public AuthResource() {
49 setUri(Constants.AUTH_URI);
53 public void onRequestReceived(ChannelHandlerContext ctx,
54 CoapRequest request) {
56 Logger.d("AuthResource IN");
58 if (ctx == null || request == null) {
59 Logger.d("ctx or request msg is null");
63 CoapMethod method = request.getRequestMethod();
68 handlePostRequest(ctx, request);
69 } catch (Exception e) {
75 Logger.w("method(" + method + ") is not supported");
81 private void handlePostRequest(ChannelHandlerContext ctx,
82 CoapRequest request) throws Exception {
84 String reqType = extractQuery(request, Constants.REQ_TYPE);
87 throw new IllegalArgumentException(
88 "request type is null in query!");
90 CoapResponse response;
93 case Constants.TYPE_REGISTER:
94 response = handleRegisterRequest(request);
96 case Constants.TYPE_LOGIN:
97 response = handleLoginRequest(request);
100 throw new IllegalArgumentException(
101 "request type is not supported");
104 ctx.writeAndFlush(response);
108 * API for handling request for login by user account
111 * CoAP request message
112 * @return CoapResponse - CoAP response message with response result
115 private CoapResponse handleLoginRequest(CoapRequest request) {
117 String payload = request.getPayloadString();
119 String sessionCode = JSONUtil.parseJSON(payload,
120 Constants.REQUEST_SESSION_CODE);
122 Logger.d("sessionCode: " + sessionCode);
124 AccountServerManager oauthServerManager = new AccountServerManager();
125 String userId = oauthServerManager.requestUserId(sessionCode);
126 Logger.d("userId: " + userId);
128 CoapMessageBuilder responseMessage = new CoapMessageBuilder();
129 CoapResponse coapResponse;
131 if (userId != null) {
133 ResponseObject response = new ResponseObject();
134 response.setUserId(userId);
136 String responseJson = convertLoginResponseToJson(response);
137 Logger.d("responseJson: " + responseJson);
139 coapResponse = responseMessage.buildCoapResponse(request.getToken(),
140 responseJson, CoapStatus.CREATED);
144 coapResponse = responseMessage.buildCoapResponse(request.getToken(),
145 CoapStatus.INTERNAL_SERVER_ERROR);
153 * API for handling request for registering user account
156 * CoAP request message
157 * @return CoapResponse - CoAP response message with response result
160 private CoapResponse handleRegisterRequest(CoapRequest request) {
162 String payload = request.getPayloadString();
164 String authCode = JSONUtil.parseJSON(payload,
165 Constants.REQUEST_AUTH_CODE);
166 String authServer = JSONUtil.parseJSON(payload,
167 Constants.REQUEST_AUTH_SERVER);
169 Logger.d("authCode: " + authCode + ", authServer: " + authServer);
171 AccountServerManager oauthServerManager = new AccountServerManager();
172 String userId = null;
173 if (authCode != null && authServer != null) {
174 userId = oauthServerManager.requestUserId(authCode, authServer);
177 CoapMessageBuilder responseMessage = new CoapMessageBuilder();
178 CoapResponse coapResponse;
180 if (userId != null) {
182 String sessionCode = oauthServerManager.registerUserAccount(userId);
184 Logger.d("userId: " + userId + ", sessionCode: " + sessionCode);
186 if (sessionCode != null) {
188 ResponseObject response = new ResponseObject();
189 response.setSessionCode(sessionCode);
190 response.setUserId(userId);
192 String responseJson = convertRegisterResponseToJson(response);
193 Logger.d("responseJson: " + responseJson);
195 coapResponse = responseMessage.buildCoapResponse(
196 request.getToken(), responseJson, CoapStatus.CREATED);
199 coapResponse = responseMessage.buildCoapResponse(request.getToken(),
200 CoapStatus.UNAUTHORIZED);
205 coapResponse = responseMessage.buildCoapResponse(request.getToken(),
206 CoapStatus.UNAUTHORIZED);
212 private String convertRegisterResponseToJson(ResponseObject response) {
214 HashMap<Object, Object> responseMap = new HashMap<Object, Object>();
216 String sessionCode = response.getSessionCode();
217 String userId = response.getUserId();
220 responseMap.put(Constants.RESPONSE_USER_ID, userId);
222 if (sessionCode != null)
223 responseMap.put(Constants.RESPONSE_SESSION_CODE, sessionCode);
225 String responseJson = JSONUtil.writeJSON(responseMap);
230 private String convertLoginResponseToJson(ResponseObject response) {
232 HashMap<Object, Object> responseMap = new HashMap<Object, Object>();
234 String userId = response.getUserId();
237 responseMap.put(Constants.RESPONSE_USER_ID, userId);
239 String responseJson = JSONUtil.writeJSON(responseMap);
244 private String extractQuery(CoapRequest request, String key) {
248 List<String> Segments = request.getUriQuerySegments();
250 if (Segments != null) {
251 for (String s : Segments) {
253 String pair[] = s.split("=");
255 if (pair[0].equals(key)) {
266 * private static String getPayloadString(byte[] payload) {
268 * if (payload == null) return "";
270 * return new String(payload, Charset.forName("UTF-8")); }