blob: afd10e052d167ced7609a164df745ab114b4b13a [file] [log] [blame]
/*
// Copyright (c) 2016 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/
#ifdef OC_SECURITY
#include "oc_pstat.h"
#include "oc_api.h"
#include "oc_core_res.h"
#include "oc_doxm.h"
static oc_sec_pstat_t pstat;
oc_sec_pstat_t *
oc_sec_get_pstat(void)
{
return &pstat;
}
bool
oc_sec_provisioned(void)
{
return pstat.isop;
}
void
oc_sec_pstat_default(void)
{
pstat.isop = false;
pstat.cm = 2;
pstat.tm = 0;
pstat.om = 3;
pstat.sm = 3;
}
void
oc_sec_encode_pstat(void)
{
char uuid[37];
oc_sec_doxm_t *doxm = oc_sec_get_doxm();
oc_rep_start_root_object();
oc_process_baseline_interface(oc_core_get_resource_by_index(OCF_SEC_PSTAT));
oc_rep_set_uint(root, cm, pstat.cm);
oc_rep_set_uint(root, tm, pstat.tm);
oc_rep_set_int(root, om, pstat.om);
oc_rep_set_int(root, sm, pstat.sm);
oc_rep_set_boolean(root, isop, pstat.isop);
oc_uuid_to_str(&doxm->deviceuuid, uuid, 37);
oc_rep_set_text_string(root, deviceuuid, uuid);
oc_uuid_to_str(&doxm->rowneruuid, uuid, 37);
oc_rep_set_text_string(root, rowneruuid, uuid);
oc_rep_end_root_object();
}
void
oc_sec_decode_pstat(oc_rep_t *rep)
{
oc_sec_doxm_t *doxm = oc_sec_get_doxm();
while (rep != NULL) {
switch (rep->type) {
case BOOL:
pstat.isop = rep->value_boolean;
break;
case INT:
if (strncmp(oc_string(rep->name), "cm", 2) == 0) {
pstat.cm = rep->value_int;
} else if (strncmp(oc_string(rep->name), "tm", 2) == 0) {
pstat.tm = rep->value_int;
} else if (strncmp(oc_string(rep->name), "om", 2) == 0) {
pstat.om = rep->value_int;
} else if (strncmp(oc_string(rep->name), "sm", 2) == 0) {
pstat.sm = rep->value_int;
}
break;
case STRING:
if (strncmp(oc_string(rep->name), "deviceuuid", 10) == 0) {
oc_str_to_uuid(oc_string(rep->value_string), &doxm->deviceuuid);
} else if (strncmp(oc_string(rep->name), "rowneruuid", 10) == 0) {
oc_str_to_uuid(oc_string(rep->value_string), &doxm->rowneruuid);
}
break;
default:
break;
}
rep = rep->next;
}
}
void
get_pstat(oc_request_t *request, oc_interface_mask_t interface)
{
switch (interface) {
case OC_IF_BASELINE: {
oc_sec_encode_pstat();
oc_send_response(request, OC_STATUS_OK);
} break;
default:
break;
}
}
void
post_pstat(oc_request_t *request, oc_interface_mask_t interface)
{
oc_sec_decode_pstat(request->request_payload);
oc_send_response(request, OC_STATUS_CHANGED);
}
#endif /* OC_SECURITY */