bec8ed25b3f97c76e04b1a4ca337a015b168db36
[iotivity.git] / resource / csdk / security / include / internal / secureresourcemanager.h
1 //******************************************************************
2 //
3 // Copyright 2015 Intel Mobile Communications GmbH All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
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
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
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.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #ifndef SECURITYRESOURCEMANAGER_H_
22 #define SECURITYRESOURCEMANAGER_H_
23
24 #include "securevirtualresourcetypes.h"
25 #include "cainterface.h"
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 typedef enum SubjectIdentityType
32 {
33     SUBJECT_ID_TYPE_ERROR = 0,
34     SUBJECT_ID_TYPE_UUID,     // Subject refers to a UUID
35     SUBJECT_ID_TYPE_ROLE,     // Subject refers to a Role
36 } SubjectIdentityType_t;
37
38 /**
39  * The context for a single request to be processed by the Security
40  * Resource Manager.
41  */
42 typedef struct SRMRequestContext
43 {
44     const CAEndpoint_t      *endPoint;                          // ptr to the Endpoint for this request
45     OicSecSvrType_t         resourceType;                       // SVR type (or "not an SVR")
46     char                    resourceUri[MAX_URI_LENGTH + 1];    // URI of the requested resource
47     uint16_t                requestedPermission;                // bitmask permissions of request
48     CAResponseInfo_t        responseInfo;                       // The response for this request
49     bool                    responseSent;                       // Is servicing this request complete?
50     SRMAccessResponse_t     responseVal;                        // The SRM internal response code
51     const CARequestInfo_t   *requestInfo;                       // ptr to info for this request
52     bool                    secureChannel;                      // Was request recv'd over secure channel?
53     bool                    slowResponseSent;                   // Is a full response still needed?
54     OicSecDiscoverable_t    discoverable;                       // Is resource discoverable?
55     SubjectIdentityType_t   subjectIdType;                      // The type of Subject ID in this
56                                                                 // request.
57     OicUuid_t               subjectUuid;                        // The UUID of the Subject (valid
58                                                                 // iff IdType is UUID_TYPE).
59     // Developer note: when adding support for an additional type (e.g.
60     // ROLE_TYPE) suggest adding a new var to hold the Subject ID for that type.
61 #ifdef MULTIPLE_OWNER
62     uint8_t*                payload;
63     size_t                  payloadSize;
64 #endif //MULTIPLE_OWNER
65 } SRMRequestContext_t;
66
67 /**
68  * Register Persistent storage callback.
69  *
70  * @param  persistentStorageHandler [IN] Pointers to open, read, write, close & unlink handlers.
71  *
72  * @return ::OC_STACK_OK  is no errors and successful. ::OC_STACK_INVALID_PARAM for invalid parameter.
73  */
74 OCStackResult SRMRegisterPersistentStorageHandler(OCPersistentStorage* persistentStorageHandler);
75
76 /**
77  * Get Persistent storage handler pointer.
78  *
79  * @return The pointer to Persistent Storage callback handler.
80  */
81 OCPersistentStorage* SRMGetPersistentStorageHandler();
82
83 /**
84  * Register request and response callbacks. Requests and responses are delivered in these callbacks.
85  *
86  * @param reqHandler Request handler callback ( for GET,PUT ..etc)
87  * @param respHandler Response handler callback.
88  * @param errHandler Error handler callback.
89  *
90  * @return ::OC_STACK_OK  is no errors and successful. ::OC_STACK_INVALID_PARAM for invalid parameter.
91  */
92 OCStackResult SRMRegisterHandler(CARequestCallback reqHandler,
93                                  CAResponseCallback respHandler,
94                                  CAErrorCallback errHandler);
95
96 /**
97  * Initialize all secure resources ( /oic/sec/cred, /oic/sec/acl, /oic/sec/pstat etc).
98  * @return  ::OC_STACK_OK for Success, otherwise some error value.
99  */
100 OCStackResult SRMInitSecureResources();
101
102 /**
103  * Perform cleanup for secure resources ( /oic/sec/cred, /oic/sec/acl, /oic/sec/pstat etc).
104  */
105 void SRMDeInitSecureResources();
106
107 /**
108  * Provisioning API response callback.
109  *
110  * @param object endpoint instance.
111  * @param responseInfo instance of CAResponseInfo_t structure.
112  *
113  * @return true if received response is for provisioning API false otherwise.
114  */
115 typedef bool (*SPResponseCallback) (const CAEndpoint_t *object,
116                                     const CAResponseInfo_t *responseInfo);
117
118 /**
119  * Function to register provisoning API's response callback.
120  *
121  * @param respHandler response handler callback.
122  */
123 void SRMRegisterProvisioningResponseHandler(SPResponseCallback respHandler);
124
125 /**
126  * Check the security resource URI.
127  * @param uri Pointers to security resource URI.
128  * @return true if the URI is one of security resources, otherwise false.
129  */
130 bool SRMIsSecurityResourceURI(const char* uri);
131
132 /**
133  * Get the resource type from the URI.
134  * @param   uri [IN] Pointers to security resource URI.
135  * @return  SVR type (note that "NOT_A_SVR_RESOURCE" is returned if not a SVR)
136  */
137 OicSecSvrType_t GetSvrTypeFromUri(const char* uri);
138
139 extern const OicSecRole_t EMPTY_ROLE;
140
141 /**
142  * Determine if a role is non-empty.
143  *
144  * @param[in]  role     Role to check
145  *
146  * @return true if role is non-empty, false if role is empty
147  */
148 bool IsNonEmptyRole(const OicSecRole_t *role);
149
150 #ifdef __cplusplus
151 }
152 #endif
153
154 #endif /* SECURITYRESOURCEMANAGER_H_ */