1 /* *****************************************************************
3 * Copyright 2016 Samsung Electronics All Rights Reserved.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * *****************************************************************/
23 #include "payload_logging.h"
25 #include "ocpayload.h"
26 #include "psinterface.h"
27 #include "securevirtualresourcetypes.h"
28 #include "doxmresource.h"
29 #include "oic_malloc.h"
30 #include "oic_string.h"
31 #include "pmutility.h"
32 #include "credresource.h"
33 #include "payload_logging.h"
34 #include "cacommonutil.h"
37 #include "cloudAuth.h"
38 #include "cloudCommon.h"
40 #define TAG "cloudAuth"
44 #define MAX_URI_QUERY MAX_URI_LENGTH + MAX_QUERY_LENGTH
58 static sessionObject_t sessionObject = {NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL};
61 * Session free function
63 * @return OCStackResult application result
65 static void SessionFree()
67 OICFree(sessionObject.accesstoken);
68 OICFree(sessionObject.refreshtoken);
69 OICFree(sessionObject.tokentype);
70 OICFree(sessionObject.uid);
71 OICFree(sessionObject.redirecturi);
72 OICFree(sessionObject.certificate);
73 OICFree(sessionObject.sid);
75 memset(&sessionObject, 0, sizeof(sessionObject_t));
79 * Session parse payload
82 * @param[in] sessionObject session data
83 * @return OCStackResult application result
85 static OCStackResult SessionParsePayload(OCRepPayload *payload)
87 VERIFY_NON_NULL_RET(payload, TAG, "NULL payload", OC_STACK_ERROR);
91 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_ACCESS_TOKEN,
92 &sessionObject.accesstoken))
94 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_ACCESS_TOKEN);
96 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_REFRESH_TOKEN,
97 &sessionObject.refreshtoken))
99 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_REFRESH_TOKEN);
101 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_TOKEN_TYPE,
102 &sessionObject.tokentype))
104 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_TOKEN_TYPE);
107 if (!OCRepPayloadGetPropInt(payload, OC_RSRVD_EXPIRES_IN, &tmp))
109 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_EXPIRES_IN);
113 sessionObject.expiresin = tmp;
115 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_USER_UUID,
118 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_USER_UUID);
120 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_REDIRECT_URI,
121 &sessionObject.redirecturi))
123 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_REDIRECT_URI);
125 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_CERTIFICATE,
126 &sessionObject.certificate))
128 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_CERTIFICATE);
130 if (!OCRepPayloadGetPropString(payload, OC_RSRVD_SUBJECT_ID,
133 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_SUBJECT_ID);
140 * Sends Sign Up request to cloud
142 * @param[in] ctx context
143 * @param[in] handle handle
144 * @param[in] response response from peer
145 * @return OCStackApplicationResult application result
147 static OCStackApplicationResult handleCloudSignUpResponse(void *ctx,
149 OCClientResponse *response)
154 VERIFY_NON_NULL_RET(response, TAG, "Received NULL response", OC_STACK_DELETE_TRANSACTION);
156 if (response->payload)
158 OIC_LOG(INFO, TAG, "Payload received");
159 OIC_LOG_PAYLOAD(DEBUG, response->payload);
162 if (response->result != LOGIN_OK)
164 OIC_LOG_V(ERROR, TAG, "Login error: %d",response->result);
168 SessionParsePayload((OCRepPayload*)response->payload);
169 OIC_LOG(INFO, TAG, "Sign Up OK");
172 return OC_STACK_DELETE_TRANSACTION;
175 OCStackResult CloudSignUp(const OCDevAddr *endPoint,
176 const char *authProvider,
177 const char *authToken)
179 char uri[MAX_URI_LENGTH] = { 0 };
181 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endPoint", OC_STACK_INVALID_PARAM);
182 VERIFY_NON_NULL_RET(authProvider, TAG, "NULL endPoint", OC_STACK_INVALID_PARAM);
183 VERIFY_NON_NULL_RET(authToken, TAG, "NULL endPoint", OC_STACK_INVALID_PARAM);
185 char *deviceId = getDeviceId();
186 VERIFY_NON_NULL_RET(deviceId, TAG, "Can't get the device id", OC_STACK_ERROR);
188 snprintf(uri, MAX_URI_LENGTH, DEFAULT_QUERY,
189 endPoint->addr, endPoint->port, OC_RSRVD_ACCOUNT_URI);
191 OCCallbackData cbData;
192 memset(&cbData, 0, sizeof(OCCallbackData));
193 cbData.cb = handleCloudSignUpResponse;
194 cbData.cd = unlockMenu;
196 OCRepPayload *payload = OCRepPayloadCreate();
197 VERIFY_NON_NULL_RET(payload, TAG, "Failed to allocate payload", OC_STACK_NO_MEMORY);
199 OCRepPayloadSetPropString(payload, OC_RSRVD_DEVICE_ID, deviceId);
200 OCRepPayloadSetPropString(payload, OC_RSRVD_AUTHPROVIDER, authProvider);
201 OCRepPayloadSetPropString(payload, OC_RSRVD_AUTHCODE, authToken);
205 return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
206 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
210 * Sends Sign In request to cloud
212 * @param[in] ctx context
213 * @param[in] handle handle
214 * @param[in] response response from peer
215 * @return OCStackApplicationResult application result
217 static OCStackApplicationResult handleCloudSignInResponse(void *ctx,
219 OCClientResponse *response)
224 VERIFY_NON_NULL_RET(response, TAG, "Received NULL response", OC_STACK_DELETE_TRANSACTION);
226 if (response->payload)
228 OIC_LOG(INFO, TAG, "Payload received");
229 OIC_LOG_PAYLOAD(DEBUG, response->payload);
232 if (response->result != LOGIN_OK)
234 OIC_LOG_V(ERROR, TAG, "Sign In error: result: %d", response->result);
235 return OC_STACK_DELETE_TRANSACTION;
238 sessionObject.expiresin = 0;
240 if (!OCRepPayloadGetPropInt((OCRepPayload*)response->payload, OC_RSRVD_EXPIRES_IN, &tmp))
242 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_EXPIRES_IN);
246 sessionObject.expiresin = tmp;
249 OIC_LOG(INFO, TAG, "Sign In OK");
251 return OC_STACK_DELETE_TRANSACTION;
254 static OCStackApplicationResult handleCloudSignOutResponse(void *ctx,
256 OCClientResponse *response)
261 VERIFY_NON_NULL_RET(response, TAG, "Received NULL response", OC_STACK_DELETE_TRANSACTION);
263 if (response->payload)
265 OIC_LOG(INFO, TAG, "Payload received");
266 OIC_LOG_PAYLOAD(DEBUG, response->payload);
269 if (response->result != LOGIN_OK)
271 OIC_LOG(ERROR, TAG, "Sign Out error");
272 return OC_STACK_DELETE_TRANSACTION;
275 OIC_LOG(INFO, TAG, "Sign Out OK");
277 return OC_STACK_DELETE_TRANSACTION;
281 * Sends Sign In/Out request to cloud
283 * @param[in] endPoint peer endPoint
284 * @param[in] signIn is it Sign In or Sign Out request
285 * @return OCStackApplicationResult application result
287 static OCStackResult CloudSign(const OCDevAddr *endPoint, bool signIn)
289 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endPoint", OC_STACK_INVALID_PARAM);
290 VERIFY_NON_NULL_RET(sessionObject.uid, TAG,
291 "UID is missing. Please run Sign Up first", OC_STACK_ERROR);
292 VERIFY_NON_NULL_RET(sessionObject.accesstoken, TAG,
293 "accesstoken is missing. Please run Sign Up first", OC_STACK_ERROR);
295 char *deviceId = getDeviceId();
296 VERIFY_NON_NULL_RET(deviceId, TAG, "Can't get the device id", OC_STACK_ERROR);
298 OCRepPayload* payload = OCRepPayloadCreate();
299 VERIFY_NON_NULL_RET(payload, TAG, "Failed to allocate payload", OC_STACK_NO_MEMORY);
301 OCRepPayloadSetPropString(payload, OC_RSRVD_USER_UUID, sessionObject.uid);
302 OCRepPayloadSetPropString(payload, OC_RSRVD_DEVICE_ID, deviceId);
303 OCRepPayloadSetPropString(payload, OC_RSRVD_ACCESS_TOKEN, sessionObject.accesstoken);
304 OCRepPayloadSetPropBool(payload, OC_RSRVD_LOGIN, signIn);
308 char uri[MAX_URI_QUERY] = { 0 };
309 snprintf(uri, MAX_URI_QUERY, DEFAULT_QUERY,
310 endPoint->addr, endPoint->port,
311 OC_RSRVD_ACCOUNT_SESSION_URI);
313 OCCallbackData cbData;
314 memset(&cbData, 0, sizeof(OCCallbackData));
315 cbData.cb = signIn? handleCloudSignInResponse : handleCloudSignOutResponse;
316 cbData.cd = unlockMenu;
318 return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
319 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
322 OCStackResult CloudSignIn(const OCDevAddr *endPoint)
324 return CloudSign(endPoint, true);
327 OCStackResult CloudSignOut(const OCDevAddr *endPoint)
329 return CloudSign(endPoint, false);