]> git.sesse.net Git - itkacl/blob - libpam-itkacl-0.4/pam_itkacl.c
Release a new version of the Apache module, with the context support.
[itkacl] / libpam-itkacl-0.4 / pam_itkacl.c
1
2 #define PAM_SM_ACCOUNT
3
4 #include <stdio.h>
5 #include <unistd.h>
6 #include <stdarg.h>
7 #include <string.h>
8 #include <syslog.h>
9 #include <security/pam_modules.h>
10
11 #include "itkacl.h"
12
13 /* --- authentication management functions --- */
14
15 PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,
16                                    int argc, const char **argv)
17 {
18         return PAM_AUTH_ERR;
19 }
20
21 PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags, int argc,
22                               const char **argv)
23 {
24
25         return PAM_CRED_UNAVAIL;
26 }
27
28 /* --- account management functions --- */
29
30 PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t * pamh, int flags, int argc,
31                                 const char **argv)
32 {
33         char realm[256], errmsg[256];
34         const char *username;
35         int ret;
36
37         openlog("pam_itkacl", 0, LOG_AUTHPRIV);
38
39         /* We want and need exactly one argument: realm='whatever' */
40         if (argc != 1) {
41                 syslog(LOG_CRIT, "wrong number of arguments: expected 1, got %d", argc);
42                 return PAM_SERVICE_ERR;
43         }
44         if (sscanf(argv[0], "realm='%[^']'", realm) != 1) {
45                 syslog(LOG_CRIT, "realm in bad format: got %s, expected realm='/foo/bar'", argv[0]);
46                 return PAM_SERVICE_ERR;
47         }
48
49         /* Get the user name from PAM */
50         ret = pam_get_item(pamh, PAM_USER, (const void **)&username);
51         if (ret != PAM_SUCCESS || username == NULL) {
52                 syslog(LOG_CRIT, "Couldn't get username from PAM");
53                 return PAM_USER_UNKNOWN;
54         }
55
56         /* Root should always be able to log in */
57         if (strcmp(username, "root") == 0)
58                 return PAM_SUCCESS;
59
60         ret = itkacl_check(realm, username, errmsg, 256);
61         if (ret == -1) {
62                 syslog(LOG_ERR, "itkacl_check() returned an error: %s", errmsg);
63                 return PAM_SERVICE_ERR;
64         }
65
66         if (ret == 0) {
67                 return PAM_SUCCESS;
68         } else {
69                 return PAM_ACCT_EXPIRED;
70         }
71 }
72
73 /* --- password management --- */
74
75 PAM_EXTERN int pam_sm_chauthtok(pam_handle_t * pamh, int flags, int argc,
76                                 const char **argv)
77 {
78         return PAM_AUTHTOK_ERR;
79 }
80
81 /* --- session management --- */
82
83 PAM_EXTERN int pam_sm_open_session(pam_handle_t * pamh, int flags,
84                                    int argc, const char **argv)
85 {
86         return PAM_SYSTEM_ERR;
87 }
88
89 PAM_EXTERN int pam_sm_close_session(pam_handle_t * pamh, int flags,
90                                     int argc, const char **argv)
91 {
92         return PAM_SYSTEM_ERR;
93 }
94
95 /* end of module definition */
96
97 /* static module data */
98 #ifdef PAM_STATIC
99 struct pam_module _pam_itkacl_modstruct = {
100         "pam_itkacl",
101         pam_sm_authenticate,
102         pam_sm_setcred,
103         pam_sm_acct_mgmt,
104         pam_sm_open_session,
105         pam_sm_close_session,
106         pam_sm_chauthtok
107 };
108 #endif