auth.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. /*
  2. *********************************************************************************************************
  3. * uC/Common
  4. * Common Features for Micrium Stacks
  5. *
  6. * Copyright 2013-2020 Silicon Laboratories Inc. www.silabs.com
  7. *
  8. * SPDX-License-Identifier: APACHE-2.0
  9. *
  10. * This software is subject to an open source license and is distributed by
  11. * Silicon Laboratories Inc. pursuant to the terms of the Apache License,
  12. * Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
  13. *
  14. *********************************************************************************************************
  15. */
  16. /*
  17. *********************************************************************************************************
  18. *
  19. * uC/Common - Authentication Module (Auth)
  20. *
  21. * Filename : auth.c
  22. * Version : V1.02.00
  23. *********************************************************************************************************
  24. * Note(s) : (1) 'goto' statements were used in this software module. Their usage
  25. * is restricted to cleanup purposes in exceptional program flow (e.g.
  26. * error handling), in compliance with CERT MEM12-C and MISRA C:2012
  27. * rules 15.2, 15.3 and 15.4.
  28. *********************************************************************************************************
  29. */
  30. /*
  31. *********************************************************************************************************
  32. *********************************************************************************************************
  33. * INCLUDE FILES
  34. *********************************************************************************************************
  35. *********************************************************************************************************
  36. */
  37. #include <lib_str.h>
  38. #include "kal.h"
  39. #include "auth.h"
  40. /*
  41. *********************************************************************************************************
  42. *********************************************************************************************************
  43. * LOCAL DATA TYPES
  44. *********************************************************************************************************
  45. *********************************************************************************************************
  46. */
  47. typedef struct auth_user_credentials { /* --------------- AUTH USER CREDENTIALS -------------- */
  48. AUTH_USER User; /* User structure. */
  49. CPU_CHAR Pwd[AUTH_PWD_MAX_LENGTH]; /* Password for this user. */
  50. } AUTH_USER_CREDENTIALS;
  51. /*
  52. *********************************************************************************************************
  53. *********************************************************************************************************
  54. * GLOBAL VARIABLES
  55. *********************************************************************************************************
  56. *********************************************************************************************************
  57. */
  58. AUTH_USER Auth_RootUser = {
  59. { 'r', 'o', 'o', 't', '\0' },
  60. AUTH_RIGHT_ROOT
  61. };
  62. /*
  63. *********************************************************************************************************
  64. *********************************************************************************************************
  65. * LOCAL GLOBAL VARIABLES
  66. *********************************************************************************************************
  67. *********************************************************************************************************
  68. */
  69. static KAL_LOCK_HANDLE Auth_LockHandle;
  70. static CPU_SIZE_T Auth_UserNbr = 1;
  71. static AUTH_USER_CREDENTIALS Auth_UsersCredentials[AUTH_NB_USERS_MAX] = {
  72. {
  73. {
  74. { 'r', 'o', 'o', 't', '\0' },
  75. AUTH_RIGHT_ROOT
  76. },
  77. { 'a', 'd', 'm', 'i', 'n', '\0' }
  78. }
  79. };
  80. /*
  81. *********************************************************************************************************
  82. *********************************************************************************************************
  83. * LOCAL FUNCTION PROTOTYPES
  84. *********************************************************************************************************
  85. *********************************************************************************************************
  86. */
  87. static CPU_BOOLEAN Auth_GetUserHandler (const CPU_CHAR *p_name,
  88. AUTH_USER *p_user,
  89. RTOS_ERR *p_err);
  90. /*
  91. *********************************************************************************************************
  92. *********************************************************************************************************
  93. * GLOBAL FUNCTIONS
  94. *********************************************************************************************************
  95. *********************************************************************************************************
  96. */
  97. /*
  98. *********************************************************************************************************
  99. * Auth_Init()
  100. *
  101. * Description : (1) Initialize Authentication module:
  102. *
  103. * (a) Create Lock.
  104. *
  105. * Argument(s) : p_err Pointer to variable that will receive the return error code from this function :
  106. *
  107. * --------------- RETURNED BY KAL_LockCreate() --------------
  108. * See KAL_LockCreate() for additional return error codes.
  109. *
  110. * Return(s) : DEF_OK, if initialization was successful.
  111. * DEF_FAIL, otherwise.
  112. *
  113. * Note(s) : none.
  114. *********************************************************************************************************
  115. */
  116. CPU_BOOLEAN Auth_Init (RTOS_ERR *p_err)
  117. {
  118. CPU_BOOLEAN res = DEF_OK;
  119. Auth_LockHandle = KAL_LockCreate("Auth Lock",
  120. KAL_OPT_CREATE_NONE,
  121. p_err);
  122. if (*p_err != RTOS_ERR_NONE) {
  123. res = DEF_FAIL;
  124. }
  125. return (res);
  126. }
  127. /*
  128. *********************************************************************************************************
  129. * Auth_CreateUser()
  130. *
  131. * Description : Create a user and fill the user structure provided.
  132. *
  133. * Argument(s) : p_name Pointer to user name string.
  134. *
  135. * p_pwd Pointer to password string.
  136. *
  137. * p_user Pointer to user object to fill.
  138. *
  139. * p_err Pointer to variable that will receive the return error code from this function :
  140. *
  141. * RTOS_ERR_NONE
  142. * RTOS_ERR_INVALID_STR_LEN
  143. * RTOS_ERR_NO_MORE_RSRC
  144. * RTOS_ERR_ALREADY_EXISTS
  145. *
  146. * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
  147. * See KAL_LockAcquire/Release() for additional return error codes.
  148. *
  149. * Return(s) : DEF_OK, if user created successfully.
  150. * DEF_FAIL, otherwise.
  151. *
  152. * Note(s) : None.
  153. *********************************************************************************************************
  154. */
  155. CPU_BOOLEAN Auth_CreateUser (const CPU_CHAR *p_name,
  156. const CPU_CHAR *p_pwd,
  157. AUTH_USER *p_user,
  158. RTOS_ERR *p_err)
  159. {
  160. AUTH_USER_CREDENTIALS *p_user_cred;
  161. CPU_SIZE_T name_len;
  162. CPU_SIZE_T pwd_len;
  163. CPU_SIZE_T i;
  164. CPU_INT16S cmp_result;
  165. CPU_BOOLEAN result = DEF_FAIL;
  166. RTOS_ERR local_err;
  167. KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
  168. if (*p_err != RTOS_ERR_NONE) {
  169. goto exit;
  170. }
  171. name_len = Str_Len_N(p_name, AUTH_NAME_MAX_LENGTH + 1);
  172. pwd_len = Str_Len_N(p_pwd, AUTH_PWD_MAX_LENGTH + 1);
  173. if (name_len > AUTH_NAME_MAX_LENGTH) {
  174. *p_err = RTOS_ERR_INVALID_STR_LEN;
  175. goto exit_release;
  176. }
  177. if (pwd_len > AUTH_PWD_MAX_LENGTH) {
  178. *p_err = RTOS_ERR_INVALID_STR_LEN;
  179. goto exit_release;
  180. }
  181. if (Auth_UserNbr >= AUTH_NB_USERS_MAX) {
  182. *p_err = RTOS_ERR_NO_MORE_RSRC;
  183. goto exit_release;
  184. }
  185. for (i = 0; i < Auth_UserNbr; ++i) {
  186. cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_name, name_len);
  187. if (cmp_result == 0) {
  188. *p_err = RTOS_ERR_ALREADY_EXISTS;
  189. goto exit_release;
  190. }
  191. }
  192. p_user_cred = &Auth_UsersCredentials[Auth_UserNbr];
  193. ++Auth_UserNbr;
  194. name_len = DEF_MIN(name_len + 1, AUTH_NAME_MAX_LENGTH);
  195. pwd_len = DEF_MIN(pwd_len + 1, AUTH_PWD_MAX_LENGTH);
  196. (void)Str_Copy_N(p_user_cred->User.Name,
  197. p_name,
  198. name_len);
  199. (void)Str_Copy_N(p_user_cred->Pwd,
  200. p_pwd,
  201. pwd_len);
  202. p_user_cred->User.Rights = AUTH_RIGHT_NONE;
  203. (void)Str_Copy_N(p_user->Name,
  204. p_name,
  205. name_len);
  206. p_user->Rights = AUTH_RIGHT_NONE;
  207. result = DEF_OK;
  208. *p_err = RTOS_ERR_NONE;
  209. exit_release:
  210. KAL_LockRelease(Auth_LockHandle, &local_err);
  211. (void)local_err;
  212. exit:
  213. return (result);
  214. }
  215. /*
  216. *********************************************************************************************************
  217. * Auth_ChangePassword()
  218. *
  219. * Description : Change the user's password.
  220. *
  221. * Argument(s) : p_user Pointer to user object.
  222. *
  223. * p_pwd Pointer to the new password.
  224. *
  225. * p_as_user Pointer to user that have the permission level to do the action.
  226. * Must be the same as p_user or the ROOT user.
  227. *
  228. * p_err Pointer to variable that will receive the return error code from this function :
  229. *
  230. * RTOS_ERR_NONE
  231. * RTOS_ERR_INVALID_STR_LEN
  232. * RTOS_ERR_PERMISSION
  233. * RTOS_ERR_NOT_FOUND
  234. *
  235. * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
  236. * See KAL_LockAcquire/Release() for additional return error codes.
  237. *
  238. * Return(s) : DEF_OK, if password changed successfully.
  239. * DEF_FAIL, otherwise.
  240. *
  241. * Note(s) : none.
  242. *********************************************************************************************************
  243. */
  244. #if 0
  245. CPU_BOOLEAN Auth_ChangePassword ( AUTH_USER *p_user,
  246. const CPU_CHAR *p_pwd,
  247. const AUTH_USER *p_as_user,
  248. RTOS_ERR *p_err)
  249. {
  250. CPU_SIZE_T name_len;
  251. CPU_SIZE_T pwd_len;
  252. CPU_SIZE_T i;
  253. CPU_INT16S cmp_result;
  254. CPU_BOOLEAN result = DEF_FAIL;
  255. RTOS_ERR local_err;
  256. KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
  257. if (*p_err != RTOS_ERR_NONE) {
  258. goto exit;
  259. }
  260. name_len = Str_Len_N(p_user->Name, AUTH_NAME_MAX_LENGTH + 1);
  261. pwd_len = Str_Len_N(p_pwd, AUTH_PWD_MAX_LENGTH + 1);
  262. if (pwd_len > AUTH_PWD_MAX_LENGTH) {
  263. *p_err = RTOS_ERR_INVALID_STR_LEN;
  264. goto exit_release;
  265. }
  266. if ((Str_Cmp(p_as_user->Name, p_user->Name) != 0) &&
  267. (DEF_BIT_IS_CLR(p_as_user->Rights, AUTH_RIGHT_ROOT) == DEF_YES)) {
  268. *p_err = RTOS_ERR_PERMISSION;
  269. goto exit_release;
  270. }
  271. for (i = 0; i < Auth_UserNbr; ++i) {
  272. cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_user->Name, name_len);
  273. if (cmp_result == 0) {
  274. (void)Str_Copy_N(Auth_UsersCredentials[i].Pwd,
  275. p_pwd,
  276. pwd_len);
  277. result = DEF_OK;
  278. *p_err = RTOS_ERR_NONE;
  279. goto exit_release;
  280. }
  281. }
  282. *p_err = RTOS_ERR_NOT_FOUND;
  283. exit_release:
  284. KAL_LockRelease(Auth_LockHandle, &local_err);
  285. (void)local_err;
  286. exit:
  287. return (result);
  288. }
  289. #endif
  290. /*
  291. *********************************************************************************************************
  292. * Auth_GetUser()
  293. *
  294. * Description : Get the user structure with the given name.
  295. *
  296. * Argument(s) : p_name Pointer to user name string to retrieve.
  297. *
  298. * p_user Pointer to user object that will be filled with the data retrieved.
  299. *
  300. * p_err Pointer to variable that will receive the return error code from this function :
  301. *
  302. * RTOS_ERR_NONE
  303. *
  304. * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
  305. * See KAL_LockAcquire/Release() for additional return error codes.
  306. *
  307. * ------------ RETURNED BY Auth_GetUserHandler() ------------
  308. * See Auth_GetUserHandler() for additional return error codes.
  309. *
  310. * Return(s) : DEF_OK, if user was successfully found.
  311. * DEF_FAIL, otherwise.
  312. *
  313. * Note(s) : none.
  314. *********************************************************************************************************
  315. */
  316. CPU_BOOLEAN Auth_GetUser (const CPU_CHAR *p_name,
  317. AUTH_USER *p_user,
  318. RTOS_ERR *p_err)
  319. {
  320. CPU_BOOLEAN result;
  321. RTOS_ERR local_err;
  322. KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
  323. if (*p_err != RTOS_ERR_NONE) {
  324. result = DEF_FAIL;
  325. goto exit;
  326. }
  327. result = Auth_GetUserHandler(p_name, p_user, p_err);
  328. KAL_LockRelease(Auth_LockHandle, &local_err);
  329. (void)local_err;
  330. exit:
  331. return (result);
  332. }
  333. /*
  334. *********************************************************************************************************
  335. * Auth_ValidateCredentials()
  336. *
  337. * Description : Validates the user and password tuple with known users.
  338. *
  339. * Argument(s) : p_name Pointer to user name string.
  340. *
  341. * p_pwd Pointer to password string.
  342. *
  343. * p_user Pointer to user object that will be filled with the data retrieved.
  344. *
  345. * p_err Pointer to variable that will receive the return error code from this function :
  346. *
  347. * RTOS_ERR_NONE
  348. * RTOS_ERR_INVALID_STR_LEN
  349. * RTOS_ERR_INVALID_CREDENTIALS
  350. *
  351. * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
  352. * See KAL_LockAcquire/Release() for additional return error codes.
  353. *
  354. * Return(s) : DEF_OK, if credentials are valid.
  355. * DEF_FAIL, otherwise.
  356. *
  357. * Note(s) : none.
  358. *********************************************************************************************************
  359. */
  360. CPU_BOOLEAN Auth_ValidateCredentials (const CPU_CHAR *p_name,
  361. const CPU_CHAR *p_pwd,
  362. AUTH_USER *p_user,
  363. RTOS_ERR *p_err)
  364. {
  365. CPU_SIZE_T name_len;
  366. CPU_SIZE_T pwd_len;
  367. CPU_SIZE_T i;
  368. CPU_INT16S cmp_result;
  369. CPU_BOOLEAN result = DEF_FAIL;
  370. RTOS_ERR local_err;
  371. KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
  372. if (*p_err != RTOS_ERR_NONE) {
  373. goto exit;
  374. }
  375. name_len = Str_Len_N(p_name, AUTH_NAME_MAX_LENGTH + 1);
  376. pwd_len = Str_Len_N(p_pwd, AUTH_PWD_MAX_LENGTH + 1);
  377. if (name_len > AUTH_NAME_MAX_LENGTH) {
  378. *p_err = RTOS_ERR_INVALID_STR_LEN;
  379. goto exit_release;
  380. }
  381. if (pwd_len > AUTH_PWD_MAX_LENGTH) {
  382. *p_err = RTOS_ERR_INVALID_STR_LEN;
  383. goto exit_release;
  384. }
  385. for (i = 0; i < Auth_UserNbr; ++i) {
  386. cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_name, name_len);
  387. if (cmp_result == 0) {
  388. cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].Pwd, p_pwd, pwd_len);
  389. if (cmp_result == 0) {
  390. (void)Str_Copy_N(p_user->Name, p_name, name_len);
  391. p_user->Rights = Auth_UsersCredentials[i].User.Rights;
  392. result = DEF_OK;
  393. *p_err = RTOS_ERR_NONE;
  394. goto exit_release;
  395. }
  396. break;
  397. }
  398. }
  399. *p_err = RTOS_ERR_INVALID_CREDENTIALS;
  400. exit_release:
  401. KAL_LockRelease(Auth_LockHandle, &local_err);
  402. (void)local_err;
  403. exit:
  404. return (result);
  405. }
  406. /*
  407. *********************************************************************************************************
  408. * Auth_GrantRight()
  409. *
  410. * Description : Grants a right to a user as another user (limits the rights granted).
  411. *
  412. * Argument(s) : right New right to grant.
  413. *
  414. * p_user Pointer to user object that will received the new right.
  415. *
  416. * p_as_user Pointer to user that has the permission level to do the action.
  417. *
  418. * p_err Pointer to variable that will receive the return error code from this function :
  419. *
  420. * RTOS_ERR_NONE
  421. * RTOS_ERR_PERMISSION
  422. * RTOS_ERR_NOT_FOUND
  423. *
  424. * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
  425. * See KAL_LockAcquire/Release() for additional return error codes.
  426. *
  427. * ------------ RETURNED BY Auth_GetUserHandler() ------------
  428. * See Auth_GetUserHandler() for additional return error codes.
  429. *
  430. * Return(s) : DEF_OK, if right was granted successfully.
  431. * DEF_FAIL, otherwise.
  432. *
  433. * Note(s) : none.
  434. *********************************************************************************************************
  435. */
  436. CPU_BOOLEAN Auth_GrantRight (AUTH_RIGHT right,
  437. AUTH_USER *p_user,
  438. AUTH_USER *p_as_user,
  439. RTOS_ERR *p_err)
  440. {
  441. CPU_SIZE_T name_len;
  442. CPU_SIZE_T i;
  443. CPU_INT16S cmp_result;
  444. CPU_BOOLEAN result = DEF_FAIL;
  445. RTOS_ERR local_err;
  446. KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
  447. if (*p_err != RTOS_ERR_NONE) {
  448. goto exit;
  449. }
  450. (void)Auth_GetUserHandler(p_as_user->Name, p_as_user, p_err);
  451. if (*p_err != RTOS_ERR_NONE) {
  452. goto exit_release;
  453. }
  454. if (((DEF_BIT_IS_SET(p_as_user->Rights, AUTH_RIGHT_MNG) == DEF_NO) ||
  455. (DEF_BIT_IS_SET(p_as_user->Rights, right) == DEF_NO)) &&
  456. (DEF_BIT_IS_SET(p_as_user->Rights, AUTH_RIGHT_ROOT) == DEF_NO)) {
  457. *p_err = RTOS_ERR_PERMISSION;
  458. goto exit_release;
  459. }
  460. name_len = Str_Len_N(p_user->Name, AUTH_NAME_MAX_LENGTH + 1);
  461. for (i = 0; i < Auth_UserNbr; ++i) {
  462. cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_user->Name, name_len);
  463. if (cmp_result == 0) {
  464. DEF_BIT_SET(Auth_UsersCredentials[i].User.Rights, right);
  465. p_user->Rights = Auth_UsersCredentials[i].User.Rights;
  466. result = DEF_OK;
  467. *p_err = RTOS_ERR_NONE;
  468. goto exit_release;
  469. }
  470. }
  471. *p_err = RTOS_ERR_NOT_FOUND;
  472. exit_release:
  473. KAL_LockRelease(Auth_LockHandle, &local_err);
  474. (void)local_err;
  475. exit:
  476. return (result);
  477. }
  478. /*
  479. *********************************************************************************************************
  480. * Auth_RevokeRight()
  481. *
  482. * Description : Revokes the right of a specified user.
  483. *
  484. * Argument(s) : right Right to revoke.
  485. *
  486. * p_user Pointer to user object which right will be revoked.
  487. *
  488. * p_as_user Pointer to user that has the permission level to do the action.
  489. *
  490. * p_err Pointer to variable that will receive the return error code from this function :
  491. *
  492. * RTOS_ERR_NONE
  493. * RTOS_ERR_PERMISSION
  494. * RTOS_ERR_NOT_FOUND
  495. *
  496. * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
  497. * See KAL_LockAcquire/Release() for additional return error codes.
  498. *
  499. * ------------ RETURNED BY Auth_GetUserHandler() ------------
  500. * See Auth_GetUserHandler() for additional return error codes.
  501. *
  502. * Return(s) : DEF_OK, if right was revoked successfully.
  503. * DEF_FAIL, otherwise.
  504. *
  505. * Note(s) : none.
  506. *********************************************************************************************************
  507. */
  508. CPU_BOOLEAN Auth_RevokeRight (AUTH_RIGHT right,
  509. AUTH_USER *p_user,
  510. AUTH_USER *p_as_user,
  511. RTOS_ERR *p_err)
  512. {
  513. CPU_SIZE_T name_len;
  514. CPU_SIZE_T i;
  515. CPU_INT16S cmp_result;
  516. CPU_BOOLEAN result = DEF_FAIL;
  517. RTOS_ERR local_err;
  518. KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
  519. if (*p_err != RTOS_ERR_NONE) {
  520. goto exit;
  521. }
  522. (void)Auth_GetUserHandler(p_as_user->Name, p_as_user, p_err);
  523. if (*p_err != RTOS_ERR_NONE) {
  524. goto exit_release;
  525. }
  526. /* This implementation allows the ROOT user ... */
  527. /* ... to revoke it's own ROOT right. */
  528. if (((DEF_BIT_IS_SET(p_as_user->Rights, AUTH_RIGHT_MNG) == DEF_NO) ||
  529. (DEF_BIT_IS_SET(p_as_user->Rights, right) == DEF_NO) ) &&
  530. (DEF_BIT_IS_SET(p_as_user->Rights, AUTH_RIGHT_ROOT) == DEF_NO ) ) {
  531. *p_err = RTOS_ERR_PERMISSION;
  532. goto exit_release;
  533. }
  534. name_len = Str_Len_N(p_user->Name, AUTH_NAME_MAX_LENGTH + 1);
  535. for (i = 0; i < Auth_UserNbr; ++i) {
  536. cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_user->Name, name_len);
  537. if (cmp_result == 0) {
  538. DEF_BIT_CLR(Auth_UsersCredentials[i].User.Rights, right);
  539. p_user->Rights = Auth_UsersCredentials[i].User.Rights;
  540. result = DEF_OK;
  541. *p_err = RTOS_ERR_NONE;
  542. goto exit_release;
  543. }
  544. }
  545. *p_err = RTOS_ERR_NOT_FOUND;
  546. exit_release:
  547. KAL_LockRelease(Auth_LockHandle, &local_err);
  548. (void)local_err;
  549. exit:
  550. return (result);
  551. }
  552. /*
  553. *********************************************************************************************************
  554. *********************************************************************************************************
  555. * LOCAL FUNCTIONS
  556. *********************************************************************************************************
  557. *********************************************************************************************************
  558. */
  559. /*
  560. *********************************************************************************************************
  561. * Auth_GetUserHandler()
  562. *
  563. * Description : Get the user structure with the given name.
  564. *
  565. * Argument(s) : p_name Pointer to user name string to retrieve.
  566. *
  567. * p_user Pointer to user object that will be filled with the data retrieved.
  568. *
  569. * p_err Pointer to variable that will receive the return error code from this function :
  570. *
  571. * RTOS_ERR_NONE
  572. * RTOS_ERR_NOT_FOUND
  573. *
  574. * Return(s) : DEF_OK, if user was successfully found.
  575. * DEF_FAIL, otherwise.
  576. *
  577. * Note(s) : None.
  578. *********************************************************************************************************
  579. */
  580. static CPU_BOOLEAN Auth_GetUserHandler (const CPU_CHAR *p_name,
  581. AUTH_USER *p_user,
  582. RTOS_ERR *p_err)
  583. {
  584. CPU_SIZE_T name_len;
  585. CPU_SIZE_T i;
  586. CPU_INT16S cmp_result;
  587. CPU_BOOLEAN result;
  588. name_len = Str_Len_N(p_name, AUTH_NAME_MAX_LENGTH + 1);
  589. for (i = 0; i < Auth_UserNbr; ++i) {
  590. cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_user->Name, name_len);
  591. if (cmp_result == 0) {
  592. (void)Str_Copy_N(p_user->Name,
  593. Auth_UsersCredentials[i].User.Name,
  594. name_len);
  595. p_user->Rights = Auth_UsersCredentials[i].User.Rights;
  596. result = DEF_OK;
  597. *p_err = RTOS_ERR_NONE;
  598. goto exit;
  599. }
  600. }
  601. result = DEF_FAIL;
  602. *p_err = RTOS_ERR_NOT_FOUND;
  603. exit:
  604. return (result);
  605. }