Date: Thu, 19 Dec 2002 02:19:06 -0500 From: Kutulu <kutulu@basement.kutulu.org> To: freebsd-questions@freebsd.org Cc: kutulu@kutulu.org Subject: new pw(8) feature - home directory permissions. Message-ID: <20021219071906.GA79994@basement.kutulu.org>
next in thread | raw e-mail | index | archive | help
--0F1p//8PRICkK4MW
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
(I apologize in advance if this is too mundane for -hackers...)
After seeing multiple people on IRC ask how to specify the permissions for the home directory
adduser(8) creates, I went in and added that feature to pw(8).
A diff is attached. As this is my first FreeBSD diff ever, comments from veteran hackers are
highly requested. If this is something people find useful, I will also go into adduser(8) and
add support for the new flag there, and of course, edit the man pages.
In particular, I want someone who knows what they're doing to make sure I have my types and
signs and such correct. I also don't like 'f' as the name of the option but the obvious ones
('m' and 'p') are taken.
Thanks,
--Mike Edenfield
--0F1p//8PRICkK4MW
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="pw.homeperms.diff"
diff -ur pw.old/pw.c pw/pw.c
--- pw.old/pw.c Sat Apr 6 00:19:11 2002
+++ pw/pw.c Thu Dec 19 01:41:56 2002
@@ -106,7 +106,7 @@
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:Db:NPy:Y",
+ "V:C:qn:u:c:d:e:f:p:g:G:mk:s:oL:i:w: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:FNPY",
"V:C:qn:u:FPa7",
@@ -306,6 +306,7 @@
"\t-u uid user id\n"
"\t-c comment user name/comment\n"
"\t-d directory home directory\n"
+ "\t-f perms permissions for home dir\n"
"\t-e date account expiry date\n"
"\t-p date password expiry date\n"
"\t-g grp initial group\n"
@@ -321,6 +322,7 @@
"\t-V etcdir alternate /etc location\n"
"\t-D set user defaults\n"
"\t-b dir default home root dir\n"
+ "\t-f perms default home dir permissions\n"
"\t-e period default expiry period\n"
"\t-p period default password change period\n"
"\t-g group default group\n"
diff -ur pw.old/pw.h pw/pw.h
--- pw.old/pw.h Sat Apr 6 00:19:11 2002
+++ pw/pw.h Thu Dec 19 01:49:01 2002
@@ -81,6 +81,7 @@
char *newmail; /* Mail to send to new accounts */
char *logfile; /* Where to log changes */
char *home; /* Where to create home directory */
+ mode_t homeperms; /* What permission to give home directory */
char *shelldir; /* Where shells are located */
char **shells; /* List of shells */
char *shell_default; /* Default shell */
@@ -97,6 +98,7 @@
#define _PATH_PW_CONF "/etc/pw.conf"
#define _UC_MAXLINE 1024
#define _UC_MAXSHELLS 32
+#define _UC_DEFPERMS S_IRWXU || S_IRGRP || S_IROTH
struct userconf *read_userconfig(char const * file);
int write_userconfig(char const * file);
diff -ur pw.old/pw_conf.c pw/pw_conf.c
--- pw.old/pw_conf.c Sat Apr 6 00:19:11 2002
+++ pw/pw_conf.c Thu Dec 19 02:02:25 2002
@@ -32,6 +32,7 @@
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
+#include <sys/stat.h>
#include "pw.h"
@@ -47,6 +48,7 @@
_UC_NEWMAIL,
_UC_LOGFILE,
_UC_HOMEROOT,
+ _UC_HOMEPERMS,
_UC_SHELLPATH,
_UC_SHELLS,
_UC_DEFAULTSHELL,
@@ -90,6 +92,7 @@
NULL, /* Mail to send to new accounts */
"/var/log/userlog", /* Where to log changes */
"/home", /* Where to create home directory */
+ _UC_DEFPERMS, /* Permissions to give home directory */
"/bin", /* Where shells are located */
system_shells, /* List of shells (first is default) */
bourne_shell, /* Default shell */
@@ -114,6 +117,7 @@
"\n# Mail this file to new user (/etc/newuser.msg or no)\n",
"\n# Log add/change/remove information in this file\n",
"\n# Root directory in which $HOME directory is created\n",
+ "\n# Permissions given to newly-created $HOME directory\n",
"\n# Colon separated list of directories containing valid shells\n",
"\n# Comma separated list of available shells (without paths)\n",
"\n# Default shell (without path)\n",
@@ -139,6 +143,7 @@
"newmail",
"logfile",
"home",
+ "homeperms",
"shellpath",
"shells",
"defaultshell",
@@ -294,6 +299,10 @@
config.home = (q == NULL || !boolean_val(q, 1))
? "/home" : newstr(q);
break;
+ case _UC_HOMEPERMS:
+ if ((q = unquote(q)) != NULL && isdigit(*q))
+ config.homeperms = (mode_t) strtol(q, (char **)NULL, 8);
+ break;
case _UC_SHELLPATH:
config.shelldir = (q == NULL || !boolean_val(q, 1))
? "/bin" : newstr(q);
@@ -412,6 +421,10 @@
break;
case _UC_HOMEROOT:
val = config.home;
+ break;
+ case _UC_HOMEPERMS:
+ sprintf(buf, "%lu", (unsigned long) config.homeperms);
+ quote = 0;
break;
case _UC_SHELLPATH:
val = config.shelldir;
diff -ur pw.old/pw_user.c pw/pw_user.c
--- pw.old/pw_user.c Mon Nov 4 20:38:02 2002
+++ pw/pw_user.c Thu Dec 19 02:01:15 2002
@@ -76,6 +76,7 @@
* -u uid user id
* -c comment user name/comment
* -d directory home directory
+ * -f perms permissions on directory
* -e date account expiry date
* -p date password expiry date
* -g grp primary group
@@ -155,6 +156,11 @@
cnf->home = arg->val;
}
+ if ((arg = getarg(args, 'f')) != NULL) {
+ if (isdigit(*(arg->val)))
+ cnf->homeperms = (mode_t) strtol(arg->val, (char **)NULL, 8);
+ }
+
/*
* If we'll need to use it or we're updating it,
* then create the base home directory if necessary
@@ -745,7 +751,7 @@
* 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);
+ copymkdir(pwd->pw_dir, cnf->dotdir, cnf->homeperms, 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);
}
--0F1p//8PRICkK4MW--
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021219071906.GA79994>
