Skip to content

Commit a0573be

Browse files
add delete user and get user implementations
1 parent 8c68f5d commit a0573be

10 files changed

Lines changed: 386 additions & 160 deletions

File tree

examples/posix/wh_posix_server/wh_posix_server_cfg.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,7 @@ static whAuthCb default_auth_cb = {
668668
.UserGet = wh_AuthBase_UserGet,
669669
.UserSetCredentials = wh_AuthBase_UserSetCredentials
670670
};
671+
static whAuthContext auth_ctx = {0};
671672

672673
/**
673674
* @brief Configure a default auth context for the server
@@ -683,7 +684,6 @@ int wh_PosixServer_ExampleAuthConfig(void* conf)
683684
{
684685
int rc;
685686
whServerConfig* s_conf = (whServerConfig*)conf;
686-
static whAuthContext auth_ctx = {0};
687687
static void* auth_backend_context = NULL; /* No backend context needed for stubs */
688688
static whAuthConfig auth_config = {0};
689689

src/wh_auth.c

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ int wh_Auth_Logout(whAuthContext* context, whUserId user_id)
143143
return WH_ERROR_BADARGS;
144144
}
145145

146-
rc = context->cb->Logout(context->context, user_id);
146+
rc = context->cb->Logout(context->context, context->user.user_id, user_id);
147147
if (rc != WH_ERROR_OK) {
148148
return rc;
149149
}
@@ -156,25 +156,29 @@ int wh_Auth_Logout(whAuthContext* context, whUserId user_id)
156156

157157
/* Check on request authorization and action permissions for current user
158158
* logged in */
159-
int wh_Auth_CheckRequestAuthorization(whAuthContext* context, uint8_t client_id,
160-
uint16_t group, uint16_t action)
159+
int wh_Auth_CheckRequestAuthorization(whAuthContext* context, uint16_t group,
160+
uint16_t action)
161161
{
162-
printf("In authorization check: Client ID: %d, Group: %d, Action: %d\n",
163-
client_id, group, action);
162+
uint16_t user_id = context->user.user_id;
164163

165-
return context->cb->CheckRequestAuthorization(context->context, client_id,
164+
printf("In authorization check: User ID: %d, Group: %d, Action: %d\n",
165+
user_id, group, action);
166+
167+
return context->cb->CheckRequestAuthorization(context->context, user_id,
166168
group, action);
167169
}
168170

169171

170172
/* Check on key ID use after request has been parsed */
171-
int wh_Auth_CheckKeyAuthorization(whAuthContext* context, uint8_t client_id,
172-
uint32_t key_id, uint16_t action)
173+
int wh_Auth_CheckKeyAuthorization(whAuthContext* context, uint32_t key_id,
174+
uint16_t action)
173175
{
174-
printf("In key authorization check: Client ID: %d, Key ID: %d, Action: %d\n",
175-
client_id, key_id, action);
176+
uint16_t user_id = context->user.user_id;
177+
178+
printf("In key authorization check: User ID: %d, Key ID: %d, Action: %d\n",
179+
user_id, key_id, action);
176180

177-
return context->cb->CheckKeyAuthorization(context->context, client_id, key_id,
181+
return context->cb->CheckKeyAuthorization(context->context, user_id, key_id,
178182
action);
179183
}
180184

@@ -195,14 +199,19 @@ int wh_Auth_UserAdd(whAuthContext* context, const char* username,
195199
method, credentials, credentials_len);
196200
}
197201

202+
198203
int wh_Auth_UserDelete(whAuthContext* context, whUserId user_id)
199204
{
200-
/* TODO: Delete user */
201-
(void)context;
202-
(void)user_id;
203-
return WH_ERROR_NOTIMPL;
205+
if ( (context == NULL) ||
206+
(context->cb == NULL) ||
207+
(context->cb->UserDelete == NULL) ) {
208+
return WH_ERROR_BADARGS;
209+
}
210+
211+
return context->cb->UserDelete(context->context, user_id);
204212
}
205213

214+
206215
int wh_Auth_UserSetPermissions(whAuthContext* context, whUserId user_id,
207216
whAuthPermissions permissions)
208217
{
@@ -213,14 +222,16 @@ int wh_Auth_UserSetPermissions(whAuthContext* context, whUserId user_id,
213222
return WH_ERROR_NOTIMPL;
214223
}
215224

216-
int wh_Auth_UserGet(whAuthContext* context, whUserId user_id,
217-
whAuthUser* out_user)
225+
int wh_Auth_UserGet(whAuthContext* context, const char* username, whUserId* out_user_id,
226+
whAuthPermissions* out_permissions)
218227
{
219-
/* TODO: Get user information */
220-
(void)context;
221-
(void)user_id;
222-
(void)out_user;
223-
return WH_ERROR_NOTIMPL;
228+
if ( (context == NULL) ||
229+
(context->cb == NULL) ||
230+
(context->cb->UserGet == NULL) ) {
231+
return WH_ERROR_BADARGS;
232+
}
233+
234+
return context->cb->UserGet(context->context, username, out_user_id, out_permissions);
224235
}
225236

226237
int wh_Auth_UserSetCredentials(whAuthContext* context, whUserId user_id,

src/wh_auth_base.c

Lines changed: 68 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "wolfhsm/wh_error.h"
3232

3333
#include "wolfhsm/wh_message.h"
34+
#include "wolfhsm/wh_message_auth.h"
3435
#include "wolfhsm/wh_auth_base.h"
3536

3637
/* simple base user list */
@@ -49,10 +50,20 @@ static whAuthBase_User users[WH_AUTH_BASE_MAX_USERS];
4950

5051
int wh_AuthBase_Init(void* context, const void *config)
5152
{
53+
whAuthPermissions permissions;
54+
int rc;
55+
uint16_t out_user_id;
56+
5257
/* TODO: Initialize auth manager context */
5358
(void)context;
5459
(void)config;
55-
return WH_ERROR_OK;
60+
61+
memset(&permissions, 0xFF, sizeof(whAuthPermissions));
62+
/* add a demo user with admin permissions */
63+
rc = wh_AuthBase_UserAdd(context, "admin", &out_user_id, permissions,
64+
WH_AUTH_METHOD_PIN, "1234", 4);
65+
printf("Admin user added with ID: %d\n", out_user_id);
66+
return rc;
5667
}
5768

5869
int wh_AuthBase_Cleanup(void* context)
@@ -169,7 +180,8 @@ int wh_AuthBase_Login(void* context, uint8_t client_id,
169180
return WH_ERROR_OK;
170181
}
171182

172-
int wh_AuthBase_Logout(void* context, uint16_t user_id)
183+
int wh_AuthBase_Logout(void* context, uint16_t current_user_id,
184+
uint16_t user_id)
173185
{
174186
whAuthBase_User* user;
175187

@@ -182,6 +194,7 @@ int wh_AuthBase_Logout(void* context, uint16_t user_id)
182194
}
183195

184196
/* @TODO there likely should be restrictions here on who can logout who */
197+
(void)current_user_id;
185198

186199
user = &users[user_id - 1];
187200
user->user.is_active = false;
@@ -191,77 +204,90 @@ int wh_AuthBase_Logout(void* context, uint16_t user_id)
191204

192205

193206
int wh_AuthBase_CheckRequestAuthorization(void* context,
194-
uint8_t client_id, uint16_t group, uint16_t action)
207+
uint16_t user_id, uint16_t group, uint16_t action)
195208
{
196209
int rc;
197-
whAuthContext* auth_context = (whAuthContext*)context;
198210

211+
printf("In authorization check: User ID: %d, Group: %d, Action: %d\n",
212+
user_id, group, action);
199213

200-
printf("In authorization check: Client ID: %d, Group: %d, Action: %d\n",
201-
client_id, group, action);
202-
203-
if (auth_context == NULL) {
204-
printf("This likely should be fail case when no authorization context is set\n");
205-
return WH_ERROR_OK;
206-
}
207-
208-
if (auth_context->user.user_id == WH_USER_ID_INVALID) {
214+
if (user_id == WH_USER_ID_INVALID) {
209215
/* allow user login request attempt */
210-
if (group == WH_MESSAGE_GROUP_AUTH &&
211-
action == WH_AUTH_ACTION_LOGIN) {
212-
rc = WH_ERROR_OK;
216+
if (group == WH_MESSAGE_GROUP_AUTH) {
217+
if (action == WH_MESSAGE_AUTH_ACTION_LOGIN) {
218+
rc = WH_ERROR_OK;
219+
}
220+
else {
221+
printf("User does not have permissions for the action");
222+
rc = WH_ERROR_ACCESS;
223+
}
213224
}
214225
else {
215226
printf("No user associated with session");
216-
rc = WH_ERROR_ACCESS;
227+
rc = WH_ERROR_OK; /*rc = WH_ERROR_ACCESS;*/
217228
}
218229
}
219230
else {
220231
int groupIndex = (group >> 8) & 0xFF;
232+
whAuthBase_User* user = &users[user_id - 1];
221233

222234
/* check if user has permissions for the group and action */
223-
if (auth_context->user.permissions.groupPermissions & group) {
224-
if (auth_context->user.permissions.actionPermissions[groupIndex] & action) {
225-
rc = WH_ERROR_OK;
235+
236+
/* some operations a user logged in should by default have access to;
237+
* - logging out
238+
* - updating own credentials */
239+
if (group == WH_MESSAGE_GROUP_AUTH &&
240+
(action == WH_MESSAGE_AUTH_ACTION_LOGOUT ||
241+
action == WH_MESSAGE_AUTH_ACTION_USER_SET_CREDENTIALS)) {
242+
rc = WH_ERROR_OK;
243+
}
244+
else {
245+
if (user->user.permissions.groupPermissions & group) {
246+
if (user->user.permissions.actionPermissions[groupIndex] & action) {
247+
rc = WH_ERROR_OK;
248+
}
249+
else {
250+
printf("User does not have permissions for the action");
251+
rc = WH_ERROR_ACCESS;
252+
}
226253
}
227254
else {
228-
printf("User does not have permissions for the action");
255+
printf("User does not have permissions for the group");
229256
rc = WH_ERROR_ACCESS;
230257
}
231258
}
232-
else {
233-
printf("User does not have permissions for the group");
234-
rc = WH_ERROR_ACCESS;
235-
}
236259
}
237260

261+
(void)context;
238262
return rc;
239263
}
240264

241265
/* authorization check on key usage after the request has been parsed and before
242266
* the action is done */
243-
int wh_AuthBase_CheckKeyAuthorization(void* context, uint8_t client_id,
267+
int wh_AuthBase_CheckKeyAuthorization(void* context, uint16_t user_id,
244268
uint32_t key_id, uint16_t action)
245269
{
246-
int rc;
247-
whAuthContext* auth_context = (whAuthContext*)context;
270+
int rc = WH_ERROR_OK;
248271

249-
printf("In key authorization check: Client ID: %d, Key ID: %d, Action: %d\n",
250-
client_id, key_id, action);
272+
printf("In key authorization check: User ID: %d, Key ID: %d, Action: %d\n",
273+
user_id, key_id, action);
251274

252-
if (auth_context->user.user_id == WH_USER_ID_INVALID) {
275+
if (user_id == WH_USER_ID_INVALID) {
253276
rc = WH_ERROR_ACCESS;
254277
}
255278
else {
279+
/*
256280
if (auth_context->user.permissions.keyId == key_id) {
257281
rc = WH_ERROR_OK;
258282
}
259283
else {
260284
printf("User does not have access to the key");
261285
rc = WH_ERROR_ACCESS;
262286
}
287+
*/
263288
}
264289

290+
(void)context;
265291
return rc;
266292
}
267293

@@ -289,7 +315,6 @@ int wh_AuthBase_UserAdd(void* context, const char* username,
289315
}
290316

291317
if (i >= WH_AUTH_BASE_MAX_USERS) {
292-
printf("User list is full");
293318
return WH_ERROR_BUFFER_SIZE;
294319
}
295320
userId = i + 1; /* save 0 fron WH_USER_ID_INVALID */
@@ -320,42 +345,42 @@ int wh_AuthBase_UserAdd(void* context, const char* username,
320345

321346
int wh_AuthBase_UserDelete(void* context, uint16_t user_id)
322347
{
323-
whAuthContext* auth_context = (whAuthContext*)context;
324348
whAuthBase_User* user = &users[user_id];
325349
if (user->user.user_id == WH_USER_ID_INVALID) {
326350
return WH_ERROR_NOTFOUND;
327351
}
328352
memset(user, 0, sizeof(whAuthBase_User));
329-
(void)auth_context;
353+
(void)context;
330354
return WH_ERROR_OK;
331355
}
332356

333357
int wh_AuthBase_UserSetPermissions(void* context, uint16_t user_id,
334358
whAuthPermissions permissions)
335359
{
336-
whAuthContext* auth_context = (whAuthContext*)context;
337360
whAuthBase_User* user = &users[user_id];
338361
if (user->user.user_id == WH_USER_ID_INVALID) {
339362
return WH_ERROR_NOTFOUND;
340363
}
341364
user->user.permissions = permissions;
342-
(void)auth_context;
365+
(void)context;
343366
return WH_ERROR_OK;
344367
}
345368

346-
int wh_AuthBase_UserGet(void* context, uint16_t user_id,
347-
whAuthUser* out_user)
369+
370+
int wh_AuthBase_UserGet(void* context, const char* username, uint16_t* out_user_id,
371+
whAuthPermissions* out_permissions)
348372
{
349-
whAuthContext* auth_context = (whAuthContext*)context;
350-
whAuthBase_User* user = &users[user_id];
351-
if (user->user.user_id == WH_USER_ID_INVALID) {
373+
whAuthBase_User* user = FindUser(username);
374+
if (user == NULL) {
352375
return WH_ERROR_NOTFOUND;
353376
}
354-
memcpy(out_user, &user->user, sizeof(whAuthUser));
355-
(void)auth_context;
377+
*out_user_id = user->user.user_id;
378+
*out_permissions = user->user.permissions;
379+
(void)context;
356380
return WH_ERROR_OK;
357381
}
358382

383+
359384
int wh_AuthBase_UserSetCredentials(void* context, uint16_t user_id,
360385
whAuthMethod method,
361386
const void* current_credentials, uint16_t current_credentials_len,

0 commit comments

Comments
 (0)