4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd All Rights Reserved
6 * Contact: Bumjin Im <bj.im@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License
22 #ifndef SECURITY_SERVER_H
23 #define SECURITY_SERVER_H
25 #include <sys/types.h>
26 #include <privilege-control.h>
29 * @file security-server.h
31 * @brief This file contains APIs of the Security Server
35 * @defgroup SecurityFW
38 * @defgroup SECURITY_SERVER Security Server
40 * @brief Security Server client library functions
45 * @addtogroup SECURITY_SERVER
50 * ====================================================================================================
55 * -- Company Name -- | Modification Date | Description of Changes
56 * -----------------------------------------------------------------------
57 * --- Samsung ------ | --- 2010-07-25 -- | First created
64 * exported by the foundation API.
65 * result codes begin with the start error code and extend into negative direction.
68 #define SECURITY_SERVER_API_SUCCESS 0
69 /*! \brief indicating the result of the one specific API is successful */
70 #define SECURITY_SERVER_API_ERROR_SOCKET -1
72 /*! \brief indicating the socket between client and Security Server has been failed */
73 #define SECURITY_SERVER_API_ERROR_BAD_REQUEST -2
75 /*! \brief indicating the response from Security Server is malformed */
76 #define SECURITY_SERVER_API_ERROR_BAD_RESPONSE -3
78 /*! \brief indicating the transmitting request has been failed */
79 #define SECURITY_SERVER_API_ERROR_SEND_FAILED -4
81 /*! \brief indicating the receiving response has been failed */
82 #define SECURITY_SERVER_API_ERROR_RECV_FAILED -5
84 /*! \brief indicating requesting object is not exist */
85 #define SECURITY_SERVER_API_ERROR_NO_SUCH_OBJECT -6
87 /*! \brief indicating the authentication between client and server has been failed */
88 #define SECURITY_SERVER_API_ERROR_AUTHENTICATION_FAILED -7
90 /*! \brief indicating the API's input parameter is malformed */
91 #define SECURITY_SERVER_API_ERROR_INPUT_PARAM -8
93 /*! \brief indicating the output buffer size which is passed as parameter is too small */
94 #define SECURITY_SERVER_API_ERROR_BUFFER_TOO_SMALL -9
96 /*! \brief indicating system is running out of memory state */
97 #define SECURITY_SERVER_API_ERROR_OUT_OF_MEMORY -10
99 /*! \brief indicating the access has been denied by Security Server */
100 #define SECURITY_SERVER_API_ERROR_ACCESS_DENIED -11
102 /*! \brief indicating Security Server has been failed for some reason */
103 #define SECURITY_SERVER_API_ERROR_SERVER_ERROR -12
105 /*! \brief indicating given cookie is not exist in the database */
106 #define SECURITY_SERVER_API_ERROR_NO_SUCH_COOKIE -13
108 /*! \brief indicating there is no phone password set */
109 #define SECURITY_SERVER_API_ERROR_NO_PASSWORD -14
111 /*! \brief indicating password exists in system */
112 #define SECURITY_SERVER_API_ERROR_PASSWORD_EXIST -15
114 /*! \brief indicating password mismatch */
115 #define SECURITY_SERVER_API_ERROR_PASSWORD_MISMATCH -16
117 /*! \brief indicating password retry timeout is not occurred yet */
118 #define SECURITY_SERVER_API_ERROR_PASSWORD_RETRY_TIMER -17
120 /*! \brief indicating password retry timeout is not occurred yet */
121 #define SECURITY_SERVER_API_ERROR_PASSWORD_MAX_ATTEMPTS_EXCEEDED -18
123 /*! \brief indicating password retry timeout is not occurred yet */
124 #define SECURITY_SERVER_API_ERROR_PASSWORD_EXPIRED -19
126 /*! \brief indicating password retry timeout is not occurred yet */
127 #define SECURITY_SERVER_API_ERROR_PASSWORD_REUSED -20
129 /*! \brief indicating the error with unknown reason */
130 #define SECURITY_SERVER_API_ERROR_UNKNOWN -255
142 * Retreives Linux group ID from object name which is passed by parameter
145 * This API may be used before security_server_check_privilege() API by middleware daemon to get group ID of a specific object.
147 * \par Typical use case:
148 * In middleware daemon, before checking privilege of a service the daemon need to know the GID of the service. This API support the functionality.
150 * \par Method of function operation:
151 * Opens /etc/group file and searches the object name as group name. If there is matching result, returns GID as integer
153 * \par Sync (or) Async:
154 * This is a Synchronous API.
156 * \par Important notes:
157 * - This API is only allowed to be called by pre-defined middleware daemon
159 * \param[in] object Name of the object which is kwnown by the caller.
161 * \return matching gid (positive integer) on success, or negative error code on error.
163 * \par Prospective clients:
166 * \par Known issues/bugs:
174 * security_server_get_object_name(), security_server_check_privilege()
180 * #include <security-server.h>
184 * // You have to make sure that the input param '*object' is defined in the platform
185 * retval = security_server_get_gid("telephony_makecall");
188 * printf("%s", "Error has occurred\n");
194 * Access to this function requires SMACK rule: "<app_label> security-server::api-get-gid w"
196 int security_server_get_gid(const char *object);
202 * Retreives object name as mull terminated string from Linux group ID which is passed by parameter
205 * This API may be used to get object name if the caller process only knows GID of the object.
207 * \par Typical use case:
208 * In middleware daemon, by some reason, need to know object name from the Linux group ID, then call this API to retrieve object name as string
210 * \par Method of function operation:
211 * Opens /etc/group file and searches matching gid. If there is matching result, returns name of the group as null terminated string
213 * \par Sync (or) Async:
214 * This is a Synchronous API.
216 * \par Important notes:
217 * - This API is only allowed to be called by pre-defined middleware daemon
219 * \param[in] gid Linux group ID which needed to be retrieved as object name.
220 * \param[out] object Place holder for matching object name for gid.
221 * \param[in] max_object_size Allocated byte size of parameter "object".
223 * \return 0 on success, or negative error code on error.
225 * \par Prospective clients:
226 * Inhouse middleware.
228 * \par Known issues/bugs:
231 * \pre output parameter object must be malloced before calling this API not to make memory curruption
236 * security_server_get_gid()
242 * #include <security-server.h>
245 * char objectname[20];
248 * retval = security_server_get_object_name(6005, objectname, sizeof(objectname));
251 * printf("%s", "Error has occurred\n");
257 * Access to this function requires SMACK rule: "<app_label> security-server::api-get-object-name w"
259 int security_server_get_object_name(gid_t gid, char *object, size_t max_object_size);
265 * Request cookie to the Security Server. Cookie is a random bit stream which is used as ticket for user space object.
268 * This API may be used by application and client middleware process to get access to middleware daemons.
270 * \par Typical use case:
271 * When an application process wants to get access to some middleware object, first call this API to get cookie value. Then it calls the service API to get service with the cookie value.
273 * \par Method of function operation:
274 * Caller process just send request message. Security Server checks proc file system to get list of gIDs the caller belongs, then create a random cookie and responds to caller.
276 * \par Sync (or) Async:
277 * This is a Synchronous API.
279 * \par Important notes:
280 * Cookie needs to be stored relatively secure.
282 * \param[out] cookie Place holder for cookie value.
283 * \param[in] max_cookie Allocated byte size of parameter "cookie".
285 * \return 0 on success, or negative error code on error.
287 * \par Prospective clients:
290 * \par Known issues/bugs:
293 * \pre output parameter cookie must be malloced before calling this API not to make memory curruption
294 * Size of the cookie can be retrieved by security_server_get_cookie_size() API.
298 * \see security_server_check_privilege(), security_server_get_cookie_size()
304 * #include <security-server.h>
307 * size_t cookie_size;
308 * cookie_size = security_server_get_cookie_size();
309 * unsigned char cookie[cookie_size];
312 * retval = security_server_request_cookie(cookie, cookie_size);
315 * printf("%s", "Error has occurred\n");
321 * Access to this function not requires SMACK rule
323 int security_server_request_cookie(char *cookie, size_t bufferSize);
329 * This API gets the cookie's byte size which is issued by Security Server.
332 * This API may be used by application and middleware process to get size of cookie before getting and storing cookie value.
334 * \par Typical use case:
335 * When an application process wants to get access to some middleware object, first call this API to get cookie value. Then it calls the service API to get service with the cookie value.
337 * \par Method of function operation:
338 * This API just returns pre-defined integer value as cookie size.
340 * \par Sync (or) Async:
341 * This is a Synchronous API.
343 * \par Important notes:
346 * \return Always returns byte size of the cookie.
348 * \par Prospective clients:
351 * \par Known issues/bugs:
358 * \see security_server_request_cookie()
364 * #include <security-server.h>
367 * size_t cookie_size;
370 * cookie_size = security_server_get_cookie_size();
371 * unsigned char cookie[cookie_size];
373 * char objectname[20];
374 * retval = security_server_request_cookie(cookie, cookie_size);
377 * printf("%s", "Error has occurred\n");
383 * Access to this function not requires SMACK rule
385 int security_server_get_cookie_size(void);
391 * This API checks the cookie is allowed to access to given object.
394 * This API may be used by middleware process to ask the client application has privilege for the given object.
396 * \par Typical use case:
397 * When middleware server receives request message from client application process with cookie value, it calls this API to ask to Security Server that the client application has privilege to access the service. If yes, then the middleware daemon can continue service, if not, it can return error to client application.
399 * \par Method of function operation:
400 * When Security Server receives this request, it searches cookie database and check the cookie is there, if there is matching cookie, then it checks the cookie has the privilege. It returns success if there is match, if not, it returns error.
402 * \par Sync (or) Async:
403 * This is a Synchronous API.
405 * \par Important notes:
406 * Cookie value needs to be stored relatively secure\n
407 * Privilege should be pre-defined by Platform design.
409 * \param[in] cookie Received cookie value from client application
410 * \param[in] privilege Object group ID which the client application wants to access
412 * \return 0 on success, or negative error code on error.
414 * \par Prospective clients:
415 * Only pre-defiend middleware daemons
417 * \par Known issues/bugs:
423 * \see security_server_request_cookie(), security_server_get_gid(), security_server_get_cookie_size()
429 * #include <security-server.h>
432 * size_t cookie_size;
434 * cookie_size = security_server_get_cookie_size();
435 * unsigned char recved_cookie[cookie_size];
437 * ... // Receiving request with cookie
439 * call_gid = security_server_get_gid("telephony_makecall");
440 * retval = security_server_check_privilege(recved_cookie, (gid_t)call_gid);
443 * if(retval == SECURITY_SERVER_API_ERROR_ACCESS_DENIED)
445 * printf("%s", "access has been denied\n");
448 * printf("%s", "Error has occurred\n");
454 * Access to this function requires SMACK rule: "<app_label> security-server::api-cookie-check w"
456 int security_server_check_privilege(const char *cookie, gid_t privilege);
458 int security_server_check_privilege_by_cookie(const char *cookie,
460 const char *access_rights);
462 int security_server_check_privilege_by_sockfd(int sockfd,
464 const char *access_rights);
468 * This API searchs a cookie value and returns PID of the given cookie.
471 * This API may be used by middleware process to ask the client application has privilege for the given object.
473 * \par Typical use case:
474 * In some cases, a middleware server wants to know PID of the application process. But if the middleware server uses non-direct IPC such as dbus, it's nearly impossible to know and guarantee peer PID. By using this API, the middleware server can retrieve a PID of the requesting process.
476 * \par Method of function operation:
477 * When Security Server receives this request, it searches cookie database and check the cookie is there, if there is matching cookie, then it returns corresponding PID for the cookie.
479 * \par Sync (or) Async:
480 * This is a Synchronous API.
482 * \par Important notes:
483 * Cookie value needs to be stored relatively secure\n
484 * This API is abled to be called only by pre-defined middleware servers.
486 * \param[in] cookie Received cookie value from client application. Cookie is not a null terminated human readable string. Make sure you're code doesn't have any string related process on the cookie.
488 * \return positive integer on success meaning the PID, 0 means the cookie is for root process, negative integer error code on error.
490 * \par Prospective clients:
491 * Only pre-defiend middleware daemons
493 * \par Known issues/bugs:
500 * \see security_server_request_cookie(), security_server_get_cookie_size()
502 * \remarks the cookie is not a null terminated string. Cookie is a BINARY byte stream of such length which can be retrieved by security_server_get_cookie_size() API.
503 * Therefore, please do not use strcpy() family to process cookie value. You MUST use memcpy() function to process cookie value.
504 * You also have to know that the cookie value doesn't carry any null terminator. So you don't need to allocate 1 more byte of the cookie size.
508 * #include <security-server.h>
511 * size_t cookie_size;
513 * cookie_size = security_server_get_cookie_size();
514 * unsigned char recved_cookie[cookie_size];
516 * ... // Receiving request with cookie
518 * peerpid = security_server_get_cookie_pid(recved_cookie);
521 * printf("%s", "Error has occurred\n");
527 * Access to this function requires SMACK rule: "<app_label> security-server::api-cookie-check w"
529 int security_server_get_cookie_pid(const char *cookie);
535 * This API checks phone validity of password, to check existance, expiration, remaining attempts.
538 * This API should be used by applications which needs phone password check. Caller application should behave properly after this API call.
540 * \par Typical use case:
541 * Lock screen can call this API before it shows unlock screen, if there is password, lock screen can show password input UI, if not, lock screen can show just unlock screen
543 * \par Method of function operation:
544 * Sends a validate request to security server and security server replies with password information.
546 * \par Sync (or) Async:
547 * This is a Synchronous API.
549 * \par Important notes:
550 * Password file should be stored safely. The password file will be stored by security server and only allowed itself to read/write, and data is will be securely hashed\n
552 * \param[out] current_attempts Number of password check missed attempts.
553 * \param[out] max_attempts Number of maximum attempts that the password locks. 0 means infinite
554 * \param[out] valid_secs Remaining time in second which represents this password will be expired. 0xFFFFFFFF means infinite
556 * \return 0 if there is no password set, other negative integer error code on error.
558 * \par Prospective clients:
559 * Applications which can unlock UI
561 * \par Known issues/bugs:
568 * \see security_server_set_pwd(), security_server_chk_pwd()
570 * \remarks If password file is currupted or accitentally deleted, this API may not synchronized with security-server, but security-server will check file status on next request.
574 * #include <security-server.h>
577 * unsigned int attempt, max_attempt, expire_sec;
579 * ret = security_server_is_pwd_valid(&attempt, &max_attempt, &expire_sec);
580 * if(is_pwd_set == SECURITY_SERVER_API_ERROR_NO_PASSWORD)
582 * printf("%s", "There is no password exists\n");
584 * else if(is_pwd_set == SECURITY_SERVER_SUCCESS && expire_sec > 0 && attempt < max_attempts)
586 * printf("%s", "Password is valid by now\n");
590 * printf("%s", "Something wrong\n");
596 * Access to this function requires SMACK rule: "<app_label> security-server::api-password-check w"
598 int security_server_is_pwd_valid(unsigned int *current_attempts,
599 unsigned int *max_attempts,
600 unsigned int *valid_secs);
606 * This API sets phone password only if current password matches.
609 * This API should be used by setting application when the user changes his/her phone password.
611 * \par Typical use case:
612 * Setting application calls this API to change phone password. Caller needs current password to grant the change.
614 * \par Method of function operation:
615 * Sends current password with new password to security-server, security-server checks current password and set new password to current only when current password is correct. Caller application can determine maximum number of attempts and expiration time in days
617 * \par Sync (or) Async:
618 * This is a Synchronous API.
620 * \par Important notes:
621 * There is retry timer on this API to limit replay attack. You will get error if you called this API too often.\n
623 * \param[in] cur_pwd Null terminated current password string. It can be NULL pointer if there is no password set yet - by calling security_server_is_pwd_empty()
624 * \param[in] new_pwd Null terminated new password string. It must not a NULL pointer.
625 * \param[in] max_challenge Maximum number of attempts that user can try to check the password without success in serial. 0 means infinity.
626 * \param[in] valid_period_in_days. Number of days that this password is valid. 0 means infinity
628 * \return 0 on seccuess, negative integer error code on error.
630 * \par Prospective clients:
631 * Platform's THE ONLY setting application and some dedicated privileged processes
633 * \par Known issues/bugs:
640 * \see security_server_is_pwd_valid(), security_server_chk_pwd(), security_server_reset_pwd()
642 * \remarks Only setting application can call this API. The password file will be acces controlled and securely hashed. Security-server will remain previous password file to recover unexpected password file curruption.
643 * \remarks If current password exists and it's expired, or max attempts reached, you cannot call this API. You have to call security_server_reset_pwd() API.
647 * #include <security-server.h>
650 * unsigned int attempt, max_attempt, expire_sec;
652 * ret = security_server_is_pwd_valid(&attempt, &max_attempt, &expire_sec);
653 * if(is_pwd_set == SECURITY_SERVER_API_ERROR_NO_PASSWORD)
655 * printf("%s", "There is no password exists\n");
656 * ret = security_server_set_pwd(NULL, "this_is_new_pwd", 20, 365);
657 * if(ret != SECURITY_SERVER_API_SUCCESS)
659 * printf("%s", "we have error\n");
663 * else if(is_pwd_set == SECURITY_SERVER_SUCCESS && expire_sec > 0 && attempt < max_attempts)
665 * printf("%s", "Password is valid by now\n");
666 * ret = security_server_set_pwd("this_is_current_pwd", "this_is_new_pwd", 20, 365);
667 * if(ret != SECURITY_SERVER_API_SUCCESS)
669 * printf("%s", "we have error\n");
675 * printf("%s", "Something wrong\n");
681 * Access to this function requires SMACK rule: "<app_label> security-server::api-password-set w"
683 int security_server_set_pwd(const char *cur_pwd,
685 const unsigned int max_challenge,
686 const unsigned int valid_period_in_days);
691 * This API sets validity period for currently setup password.
694 * This API should be used by Enterprise authorities to modify password policy. To be used only with valid password setup.
696 * \par Typical use case:
697 * Authorized application calls this API to change current passwords validity when password policy needs to be changed.
699 * \par Method of function operation:
700 * Function attempts to find currently set password and changes its current validity to passed number of days. Retry counter for the password is reset to zero.
701 * If there is no password set, function returns proper error code.
703 * \par Sync (or) Async:
704 * This is a Synchronous API.
705 * \param[in] valid_period_in_days. Number of days that this password is valid. 0 means infinity
707 * \return 0 on success, negative integer error code on error.
709 * \par Prospective clients:
710 * Platform's THE ONLY setting application and some dedicated privileged processes
712 * \par Known issues/bugs:
713 * Identifying calling peer is not ready yet, should be based on SMACK somehow.
715 * \see security_server_is_pwd_valid(), security_server_chk_pwd(), security_server_reset_pwd()
717 * Access to this function requires SMACK rule: "<app_label> security-server::api-password-set w"
719 int security_server_set_pwd_validity(const unsigned int valid_period_in_days);
724 * This API sets maximum number of attempts for currently setup password.
727 * This API should be used by Enterprise authorities to modify password policy. To be used only with valid password setup.
729 * \par Typical use case:
730 * Authorized application calls this API to change current passwords max attempt number when password policy needs to be changed.
732 * \par Method of function operation:
733 * Function attempts to find currently set password and changes its max attempt number to passed one. Retry counter for the password is reset to zero.
734 * If there is no password set, function returns proper error code.
736 * \par Sync (or) Async:
737 * This is a Synchronous API.
738 * \param[in] max_challenge Maximum number of attempts that user can try to check the password without success in serial. 0 means infinity.
740 * \return 0 on success, negative integer error code on error.
742 * \par Prospective clients:
743 * Platform's THE ONLY setting application and some dedicated privileged processes
745 * \par Known issues/bugs:
746 * Identifying calling peer is not ready yet, should be based on SMACK somehow.
748 * \see security_server_is_pwd_valid(), security_server_chk_pwd(), security_server_reset_pwd()
750 * Access to this function requires SMACK rule: "<app_label> security-server::api-password-set w"
752 int security_server_set_pwd_max_challenge(const unsigned int max_challenge);
756 * This API sets phone password only if current password is invalid or user forgot the password.
759 * This API should be used by setting application or dedicated processes when the user changes his/her phone password.
761 * \par Typical use case:
762 * User forgots the password. He calls emergency manager(auto or manual) for reset password. Emergency manager calls this API and reset phone password.
764 * \par Method of function operation:
765 * Resetting phone password with input string without any matching current password.
767 * \par Sync (or) Async:
768 * This is a Synchronous API.
770 * \par Important notes:
771 * There is retry timer on this API to limit replay attack. You will get error if you called this API too often.\n
773 * \param[in] new_pwd Null terminated new password string. It must not a NULL pointer.
774 * \param[in] max_challenge Maximum number of attempts that user can try to check the password without success in serial. 0 means infinity.
775 * \param[in] valid_period_in_days. Number of days that this password is valid. 0 means infinity
777 * \return 0 on seccuess, negative integer error code on error.
779 * \par Prospective clients:
780 * Platform's THE ONLY setting application and some dedicated privileged processes
782 * \par Known issues/bugs:
789 * \see security_server_is_pwd_valid(), security_server_chk_pwd(), security_server_set_pwd()
791 * \remarks Only dedicated applications can call this API. The password file will be acces controlled and securely hashed. Security-server will remain previous password file to recover unexpected password file curruption.
795 * #include <security-server.h>
798 * unsigned int attempt, max_attempt, expire_sec;
800 * ret = security_server_set_pwd("this_is_new_pwd", 20, 365);
801 * if(retval != SECURITY_SERVER_API_SUCCESS)
803 * printf("%s", "we have error\n");
810 * Access to this function requires SMACK rule: "<app_label> security-server::api-password-set w"
812 int security_server_reset_pwd(const char *new_pwd,
813 const unsigned int max_challenge,
814 const unsigned int valid_period_in_days);
818 * This API compares stored phone password with challenged input value.
821 * This API should be used by applications which has phone UI lock capability.
823 * \par Typical use case:
824 * Lock screen calls this API after user typed phone password and pressed okay.
826 * \par Method of function operation:
827 * Sends challenged password to security-server, security-server compares hashed current password and hashed challenged password.
829 * \par Sync (or) Async:
830 * This is a Synchronous API.
832 * \par Important notes:
833 * There is retry timer on this API to limit replay attack. You will get error if you called this API too often.\n
835 * \param[in] challenge Null terminated challenged password string. It must not a NULL pointer.
836 * \param[out] current_attempts Number of password check missed attempts.
837 * \param[out] max_attempts Number of maximum attempts that the password locks. 0 means infinite
838 * \param[out] valid_secs Remaining time in second which represents this password will be expired. 0xFFFFFFFF means infinite
840 * \return 0 on seccuess, negative integer error code on error.
842 * \par Prospective clients:
843 * Applications which has phone UI lock feature.
845 * \par Known issues/bugs:
852 * \see security_server_is_pwd_valid(), security_server_set_pwd()
854 * \remarks The password file will be acces controlled and securely hashed. Security-server will remain previous password file to recover unexpected password file curruption.
858 * #include <security-server.h>
861 * unsigned int attempt, max_attempt, expire_sec;
863 * retval = security_server_chk_pwd("is_this_password", &attmpt, &max_attempt, &expire_sec);
864 * if(retval == SECURITY_SERVER_API_ERROR_PASSWORD_MISMATCH)
866 * printf("%s", "Oh you typed wrong password\n");
869 * else if(retval == SECURITY_SERVER_API_SUCCESS)
871 * printf("%s", "You remember your password.\n");
878 * Access to this function requires SMACK rule: "<app_label> security-server::api-password-check w"
880 int security_server_chk_pwd(const char *challenge,
881 unsigned int *current_attempt,
882 unsigned int *max_attempt,
883 unsigned int *valid_secs);
888 * This API set the number of password history which should be maintained. Once this number set, user cannot reuse recent number of passwords which is described in this history value
891 * This API should be used only by dedicated process in the platform.
893 * \par Typical use case:
894 * Enterprise manager calls this API when the enterprise wants to enforce harder password policy.
896 * \par Method of function operation:
897 * When enterprise manager (MDM) is trying to change the security policy for phone password, it calls this API background to change the history policy.
899 * \par Sync (or) Async:
900 * This is a Synchronous API.
902 * \par Important notes:
903 * There is retry timer on this API to limit replay attack. You will get error if you called this API too often.\n
905 * \param[in] number_of_history Number of history to be checked when user tries to change password. Maximum is currently 50
907 * \return 0 on seccuess, negative integer error code on error.
909 * \par Prospective clients:
910 * MDM client, Enterprise manager.
912 * \par Known issues/bugs:
919 * \see security_server_set_pwd()
921 * \remarks The password file will be acces controlled and securely hashed. Security-server will remain previous password file to recover unexpected password file curruption.
925 * #include <security-server.h>
929 * ret = security_server_set_pwd_history(100);
930 * if(ret != SECURITY_SERVER_API_SUCCESS)
932 * printf("%s", "You have error\n");
939 * Access to this function requires SMACK rule: "<app_label> security-server::api-password-set w"
941 int security_server_set_pwd_history(int number_of_history);
944 * This function allows to get process SMACK label by passing cookie assigned
945 * to process. Function returns pointer to allocated buffer with label.
946 * User has to free the buffer after using.
948 * \param[in] Pointer to cookie
950 * \return Pointer to SMACK label or NULL
952 * \par For free label use free(), label allocated by calloc()
953 * User responsibility is to free resource.
955 * Access to this function requires SMACK rule: "<app_label> security-server::api-cookie-check w"
957 char *security_server_get_smacklabel_cookie(const char *cookie);
960 * This function allows to get process SMACK label by passing socket descriptor.
961 * Function returns pointer to allocated buffer with label.
962 * User has to free the buffer after using.
964 * \param[in] Socket descriptor
966 * \return Pointer to SMACK label or NULL
968 * \par For free label use free(), label allocated by calloc().
969 * User responsibility is to free resource.
971 * Access to this function not requires SMACK rule
973 char *security_server_get_smacklabel_sockfd(int fd);
976 * This function will give permissions "rwxat" from
977 * (subject) customer_label to caller process (object).
978 * Object label will be extracted from socket.
980 * Access to this function requires SMACK rule: "<app_label> security-server::api-data-share w"
982 int security_server_app_give_access(const char *customer_label, int customer_pid);
985 * This function allows middleware to check priviliges of process with specified PID.
986 * Service is able to check proces acces to the specified object label with specified
989 * \param[in] PID number of process to be checked
990 * \param[in] SMACK object label
991 * \param[in] SMACK access rights to be checked
993 * \return Privilege confirm or error code
994 * SECURITY_SERVER_SUCCESS - on succes
996 * Access to this function requires SMACK rule: "<app_label> security-server::api-privilege-by-pid w"
998 int security_server_check_privilege_by_pid(int pid, const char *object, const char *access_rights);
1001 * This function allows middleware to enable permissions for specified app_id.
1003 * \param[in] Application ID
1004 * \param[in] Application type definet in enum at the beginning of this file
1005 * \param[in] Permissions list
1006 * \param[in] Persistent
1008 * \return SECURITY_SERVER_SUCCESS on success or error code on fail
1010 * Access to this function requires SMACK rule: "<app_label> security-server::api-app-permissions w"
1012 int security_server_app_enable_permissions(const char *app_id, app_type_t app_type, const char **perm_list, int persistent);
1015 * This function allows middleware to disable permissions for specified app_id.
1017 * \param[in] Application ID
1018 * \param[in] Application type definet in enum at the beginning of this file
1019 * \param[in] Permissions list
1021 * \return SECURITY_SERVER_SUCCESS on success or error code on fail
1023 * Access to this function requires SMACK rule: "<app_label> security-server::api-app-permissions w"
1025 int security_server_app_disable_permissions(const char *app_id, app_type_t app_type, const char **perm_list);
1028 * This function allows middleware to get UID assigned to cookie
1031 * \param[out] Handler to store UID
1033 * \return SECURITY_SERVER_SUCCESS on success or error code on fail
1035 * Access to this function requires SMACK rule: "<app_label> security-server::api-cookie-check w"
1037 int security_server_get_uid_by_cookie(const char *cookie, uid_t *uid);
1040 * This function allows middleware to get GID assigned to cookie
1043 * \param[out] Handler to store GID
1045 * \return SECURITY_SERVER_SUCCESS on success or error code on fail
1047 * Access to this function requires SMACK rule: "<app_label> security-server::api-cookie-check w"
1049 int security_server_get_gid_by_cookie(const char *cookie, gid_t *gid);