daemon: add nice value in service file to improve performance
[platform/upstream/pulseaudio.git] / src / pulsecore / cynara.c
1 #include <pulsecore/cynara.h>
2
3 #include <config.h>
4 #include <pulsecore/log.h>
5
6 #include <cynara-creds-socket.h>
7 #include <cynara-client.h>
8 #include <cynara-session.h>
9
10 void cynara_log(const char *string, int cynara_status) {
11     const int buflen = 255;
12     char buf[buflen];
13
14     int ret = cynara_strerror(cynara_status, buf, buflen);
15     if (ret != CYNARA_API_SUCCESS) {
16         strncpy(buf, "cynara_strerror failed", buflen);
17         buf[buflen - 1] = '\0';
18     }
19     if (cynara_status < 0)
20         pa_log_error("%s: %s", string, buf);
21     else
22         pa_log_debug("%s: %s", string, buf);
23 }
24
25 bool cynara_check_privilege(int fd, const char *privilege, pid_t allowed_pid) {
26     cynara *p_cynara = NULL;
27     cynara_configuration *p_conf = NULL;
28
29     int ret = 0;
30     bool result = false;
31
32     char *user = NULL;
33     char *client = NULL;
34     char *session = NULL;
35     pid_t pid = 0;
36
37     ret = cynara_configuration_create(&p_conf);
38     cynara_log("cynara_configuration_create()", ret);
39     if (ret != CYNARA_API_SUCCESS) {
40         goto CLEANUP;
41     }
42
43     ret = cynara_configuration_set_cache_size(p_conf, 0);
44     cynara_log("cynara_configuration_set_cache_size()", ret);
45     if (ret != CYNARA_API_SUCCESS) {
46         goto CLEANUP;
47     }
48
49     ret = cynara_initialize(&p_cynara, p_conf);
50     cynara_log("cynara_initialize()", ret);
51     if (ret != CYNARA_API_SUCCESS) {
52         goto CLEANUP;
53     }
54
55     ret = cynara_creds_socket_get_user(fd, USER_METHOD_DEFAULT, &user);
56     cynara_log("cynara_creds_socket_get_user()", ret);
57     if (ret != CYNARA_API_SUCCESS) {
58         goto CLEANUP;
59     }
60
61     ret = cynara_creds_socket_get_pid(fd, &pid);
62     cynara_log("cynara_creds_socket_get_pid()", ret);
63     if (ret != CYNARA_API_SUCCESS) {
64         goto CLEANUP;
65     }
66
67     if (pid == allowed_pid) {
68         pa_log_info("identical to allowed pid");
69         result = true;
70         goto CLEANUP;
71     }
72
73     ret = cynara_creds_socket_get_client(fd, CLIENT_METHOD_DEFAULT, &client);
74     cynara_log("cynara_creds_socket_get_client()", ret);
75     if (ret != CYNARA_API_SUCCESS) {
76         goto CLEANUP;
77     }
78
79     session = cynara_session_from_pid(pid);
80     if (session == NULL) {
81         pa_log_error("cynara_session_from_pid(): failed");
82         goto CLEANUP;
83     }
84
85
86     pa_log_debug("cynara credentials - client: %s, session: %s, user: %s, privilege: %s", client, session, user, privilege);
87
88     ret = cynara_check(p_cynara, client, session, user, privilege);
89     cynara_log("cynara_check()", ret);
90     if (ret == CYNARA_API_ACCESS_ALLOWED) {
91         result = true;
92     }
93
94 CLEANUP:
95     cynara_configuration_destroy(p_conf);
96     cynara_finish(p_cynara);
97     free(user);
98     free(session);
99     free(client);
100     return result;
101 }