bin/104248: pw does not support the setting of the mode of the home
directory
Dr. Markus Waldeck
waldeck at gmx.de
Mon Oct 9 23:50:16 PDT 2006
>Number: 104248
>Category: bin
>Synopsis: pw does not support the setting of the mode of the home directory
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Oct 10 06:50:14 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator: Dr. Markus Waldeck
>Release: 6.1
>Organization:
>Environment:
FreeBSD fb 6.1-RELEASE FreeBSD 6.1-RELEASE #0: Sun May 7 04:32:43 UTC 2006 root at opus.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
>Description:
There is not possibility to set the mode of the home directory when a new user is created.
Instead the mode (0755) is hard coded (!) in the pw source code.
>How-To-Repeat:
>Fix:
I have made a patch for pw (attached).
New option: -A
New entry for pw.conf: homemode
Patch attached with submission follows:
diff -rc pw/pw.8 pwM/pw.8
*** pw/pw.8 Wed Aug 23 07:46:41 2006
--- pwM/pw.8 Tue Oct 3 12:09:27 2006
***************
*** 55,60 ****
--- 55,61 ----
.Op Fl N
.Op Fl P
.Op Fl Y
+ .Op Fl A Ar mode
.Nm
.Op Fl V Ar etcdir
.Ar useradd
diff -rc pw/pw.c pwM/pw.c
*** pw/pw.c Wed Aug 23 07:46:41 2006
--- pwM/pw.c Tue Oct 3 12:27:22 2006
***************
*** 106,112 ****
static const char *opts[W_NUM][M_NUM] =
{
{ /* user */
! "V:C:qn:u:c:d:e:p:g:G:mk:s:oL:i:w:h:H:Db:NPy:Y",
"V:C:qn:u:rY",
"V:C:qn:u:c:d:e:p:g:G:ml:k:s:w:L:h:H:FNPY",
"V:C:qn:u:FPa7",
--- 106,112 ----
static const char *opts[W_NUM][M_NUM] =
{
{ /* user */
! "V:C:qn:u:c:d:e:p:g:G:mk:A:s:oL:i:w:h:H:Db:NPy:Y",
"V:C:qn:u:rY",
"V:C:qn:u:c:d:e:p:g:G:ml:k:s:w:L:h:H:FNPY",
"V:C:qn:u:FPa7",
diff -rc pw/pw.conf.5 pwM/pw.conf.5
*** pw/pw.conf.5 Wed Aug 23 07:46:41 2006
--- pwM/pw.conf.5 Tue Oct 3 11:22:52 2006
***************
*** 78,83 ****
--- 78,85 ----
log user/group modifications to this file
.It home
root directory for home directories
+ .It homemode
+ file permission for home directories
.It shellpath
paths in which to locate shell programs
.It shells
diff -rc pw/pw.h pwM/pw.h
*** pw/pw.h Wed Aug 23 07:46:41 2006
--- pwM/pw.h Tue Oct 3 11:22:52 2006
***************
*** 81,86 ****
--- 81,87 ----
char *newmail; /* Mail to send to new accounts */
char *logfile; /* Where to log changes */
char *home; /* Where to create home directory */
+ mode_t homemode; /* Which mode for the home directory */
char *shelldir; /* Where shells are located */
char **shells; /* List of shells */
char *shell_default; /* Default shell */
Only in pwM: pw.patch
diff -rc pw/pw_conf.c pwM/pw_conf.c
*** pw/pw_conf.c Wed Aug 23 07:46:41 2006
--- pwM/pw_conf.c Tue Oct 3 12:43:34 2006
***************
*** 47,52 ****
--- 47,53 ----
_UC_NEWMAIL,
_UC_LOGFILE,
_UC_HOMEROOT,
+ _UC_HOMEMODE,
_UC_SHELLPATH,
_UC_SHELLS,
_UC_DEFAULTSHELL,
***************
*** 90,95 ****
--- 91,97 ----
NULL, /* Mail to send to new accounts */
"/var/log/userlog", /* Where to log changes */
"/home", /* Where to create home directory */
+ 0755, /* Which mode for the home directory */
"/bin", /* Where shells are located */
system_shells, /* List of shells (first is default) */
bourne_shell, /* Default shell */
***************
*** 139,144 ****
--- 141,147 ----
"newmail",
"logfile",
"home",
+ "homemode",
"shellpath",
"shells",
"defaultshell",
***************
*** 255,260 ****
--- 258,264 ----
static char const toks[] = " \t\r\n,=";
char *q = strtok(NULL, toks);
int i = 0;
+ mode_t *modeset;
while (i < _UC_FIELDS && strcmp(p, kwds[i]) != 0)
++i;
***************
*** 290,295 ****
--- 294,305 ----
config.logfile = (q == NULL || !boolean_val(q, 1))
? NULL : newstr(q);
break;
+ case _UC_HOMEMODE:
+ modeset = setmode(q);
+ config.homemode = (q == NULL || !boolean_val(q, 1))
+ ? 0755 : getmode(modeset, 0755);
+ free(modeset);
+ break;
case _UC_HOMEROOT:
config.home = (q == NULL || !boolean_val(q, 1))
? "/home" : newstr(q);
***************
*** 412,417 ****
--- 422,431 ----
break;
case _UC_HOMEROOT:
val = config.home;
+ break;
+ case _UC_HOMEMODE:
+ sprintf(buf, "%04o", config.homemode);
+ quote = 0;
break;
case _UC_SHELLPATH:
val = config.shelldir;
diff -rc pw/pw_user.c pwM/pw_user.c
*** pw/pw_user.c Wed Aug 23 07:46:41 2006
--- pwM/pw_user.c Tue Oct 3 11:56:19 2006
***************
*** 76,81 ****
--- 76,82 ----
* -u uid user id
* -c comment user name/comment
* -d directory home directory
+ * -A mode file permissions of the home directory
* -e date account expiry date
* -p date password expiry date
* -g grp primary group
***************
*** 157,162 ****
--- 158,172 ----
}
/*
+ * Setting of the mode for the home directory
+ */
+ if ((arg = getarg(args, 'A')) != NULL) {
+ mode_t *modeset = setmode(arg->val);
+ cnf->homemode = getmode(modeset, 0);
+ free(modeset);
+ }
+
+ /*
* If we'll need to use it or we're updating it,
* then create the base home directory if necessary
*/
***************
*** 181,187 ****
if (strchr(cnf->home+1, '/') == NULL) {
strcpy(dbuf, "/usr");
strncat(dbuf, cnf->home, MAXPATHLEN-5);
! if (mkdir(dbuf, 0755) != -1 || errno == EEXIST) {
chown(dbuf, 0, 0);
/*
* Skip first "/" and create symlink:
--- 191,197 ----
if (strchr(cnf->home+1, '/') == NULL) {
strcpy(dbuf, "/usr");
strncat(dbuf, cnf->home, MAXPATHLEN-5);
! if (mkdir(dbuf, cnf->homemode) != -1 || errno == EEXIST) {
chown(dbuf, 0, 0);
/*
* Skip first "/" and create symlink:
***************
*** 197,203 ****
while ((p = strchr(++p, '/')) != NULL) {
*p = '\0';
if (stat(dbuf, &st) == -1) {
! if (mkdir(dbuf, 0755) == -1)
goto direrr;
chown(dbuf, 0, 0);
} else if (!S_ISDIR(st.st_mode))
--- 207,213 ----
while ((p = strchr(++p, '/')) != NULL) {
*p = '\0';
if (stat(dbuf, &st) == -1) {
! if (mkdir(dbuf, cnf->homemode) == -1)
goto direrr;
chown(dbuf, 0, 0);
} else if (!S_ISDIR(st.st_mode))
***************
*** 206,212 ****
}
}
if (stat(dbuf, &st) == -1) {
! if (mkdir(dbuf, 0755) == -1) {
direrr: err(EX_OSFILE, "mkdir '%s'", dbuf);
}
chown(dbuf, 0, 0);
--- 216,222 ----
}
}
if (stat(dbuf, &st) == -1) {
! if (mkdir(dbuf, cnf->homemode) == -1) {
direrr: err(EX_OSFILE, "mkdir '%s'", dbuf);
}
chown(dbuf, 0, 0);
***************
*** 763,769 ****
* existing files will *not* be overwritten.
*/
if (!PWALTDIR() && getarg(args, 'm') != NULL && pwd->pw_dir && *pwd->pw_dir == '/' && pwd->pw_dir[1]) {
! copymkdir(pwd->pw_dir, cnf->dotdir, 0755, pwd->pw_uid, pwd->pw_gid);
pw_log(cnf, mode, W_USER, "%s(%ld) home %s made",
pwd->pw_name, (long) pwd->pw_uid, pwd->pw_dir);
}
--- 773,779 ----
* existing files will *not* be overwritten.
*/
if (!PWALTDIR() && getarg(args, 'm') != NULL && pwd->pw_dir && *pwd->pw_dir == '/' && pwd->pw_dir[1]) {
! copymkdir(pwd->pw_dir, cnf->dotdir, cnf->homemode, pwd->pw_uid, pwd->pw_gid);
pw_log(cnf, mode, W_USER, "%s(%ld) home %s made",
pwd->pw_name, (long) pwd->pw_uid, pwd->pw_dir);
}
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list