]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/uid.c
Merge remote-tracking branch 'remotes/origin/branch-netatalk-2-1'
[netatalk.git] / etc / afpd / uid.c
1 /*
2  * $Id: uid.c,v 1.14 2005-04-28 20:49:45 bfernhomberg Exp $
3  * code: jeff@univrel.pr.uconn.edu
4  *
5  * These functions are abstracted here, so that all calls for resolving
6  * user/group names can be centrally changed (good for OS dependant calls
7  * across the package).
8  */
9
10 #ifdef HAVE_CONFIG_H
11 #include "config.h"
12 #endif /* HAVE_CONFIG_H */
13
14 /* don't compile this file at all unless FORCE_UIDGID is set */
15 #ifdef FORCE_UIDGID
16
17 #include <stdio.h>
18 #include <string.h>
19 #include <errno.h>
20 #include <atalk/logger.h>
21
22 /* functions for username and group */
23 #include <pwd.h>
24 #include <grp.h>
25 #include "uid.h"
26
27 #ifdef HAVE_UNISTD_H
28 #include <unistd.h>
29 #endif /* HAVE_UNISTD_H */
30
31 extern uid_t    uuid; 
32
33 void save_uidgid ( pair )
34 uidgidset *pair;
35 {
36     pair->uid = geteuid ();
37     pair->gid = getegid ();
38
39
40 void restore_uidgid ( pair )
41 uidgidset *pair;
42 {
43     uid_t uid
44     gid_t gid;   
45     
46     uid = geteuid ();
47     gid = getegid ();
48
49     if (uid == pair->uid && gid == pair->gid)
50        return;
51
52     if (seteuid(0) < 0) {
53         LOG(log_error, logtype_afpd, "set_uidgid: Could not switch back to root: %s",
54                                 strerror(errno));
55     }
56
57     if ( setegid ( pair->gid ) < 0 )
58         LOG(log_error, logtype_afpd, "restore_uidgid: unable to setegid '%s': %s",
59             pair->gid, strerror(errno) );
60
61     if ( seteuid ( pair->uid ) < 0 )
62         LOG(log_error, logtype_afpd, "restore_uidgid: unable to seteuid '%s': %s",
63             pair->uid, strerror(errno) );
64     else
65         uuid = pair->uid;       /* ugly hack for utommode */
66 }
67
68 void set_uidgid ( this_volume )
69 const struct vol        *this_volume;
70 {
71     int         uid, gid;   /* derived ones go in here */
72
73     /* check to see if we have to switch users */
74     uid = user_to_uid ( (this_volume)->v_forceuid);
75     gid = group_to_gid ( (this_volume)->v_forcegid);
76
77     if ((!uid || uid == geteuid()) && (!gid || gid == getegid()))
78        return;
79
80     if ( seteuid(0) < 0) {
81         LOG(log_error, logtype_afpd, "set_uidgid: Could not switch back to root: %s",
82                                 strerror(errno));
83         return;
84     }
85
86     /* check to see if we have to switch groups */
87     if ( gid ) {
88         if ( setegid ( gid ) < 0 )
89             LOG(log_error, logtype_afpd, "set_uidgid: unable to setegid '%s': %s",
90                 (this_volume)->v_forcegid, strerror(errno) );
91     } /* end of checking for (this_volume)->v_forcegid */
92
93     if ( uid) {
94         if ( seteuid ( uid ) < 0 )
95             LOG(log_error, logtype_afpd, "set_uidgid: unable to seteuid '%s': %s",
96                 (this_volume)->v_forceuid, strerror(errno) );
97         else
98             uuid = uid; /* ugly hack for utommode */
99
100     } /* end of checking for (this_volume)->v_forceuid */
101
102 } /* end function void set_uidgid ( username, group ) */
103
104 int user_to_uid ( username )
105 char    *username;
106 {
107     struct passwd *this_passwd;
108
109     /* check for anything */
110     if ( !username || strlen ( username ) < 1 ) return 0;
111
112     /* grab the /etc/passwd record relating to username */
113     this_passwd = getpwnam ( username );
114
115     /* return false if there is no structure returned */
116     if (this_passwd == NULL) return 0;
117
118     /* return proper uid */
119     return this_passwd->pw_uid;
120
121 } /* end function int user_to_uid ( username ) */
122
123 int group_to_gid ( group )
124 char    *group;
125 {
126     struct group *this_group;
127
128     /* check for anything */
129     if ( !group || strlen ( group ) < 1 ) return 0;
130
131     /* grab the /etc/groups record relating to group */
132     this_group = getgrnam ( group );
133
134     /* return false if there is no structure returned */
135     if (this_group == NULL) return 0;
136
137     /* return proper gid */
138     return this_group->gr_gid;
139
140 } /* end function int group_to_gid ( group ) */
141
142 #endif /* FORCE_UIDGID */