148 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Hello Marek,
 | |
| 
 | |
| I have created a diffile against the 980403 release that adds
 | |
| functionality to newusers for automatic handling of users with only
 | |
| anonymous ftp login (using the guestgroup feature in ftpaccess, which
 | |
| means that the users home directory looks like '/home/user/./'). It also
 | |
| adds a commandline argument to specify an initial directory structure
 | |
| for such users, with a tarball normally containing the bin,lib,etc
 | |
| directories used in the chrooted environment.
 | |
| 
 | |
| I am using it to automatically create chunks of users with only ftp
 | |
| access for a webserver.
 | |
| 
 | |
| I have tried to follow your coding standards and I believe it is bug
 | |
| free but.. well, who knows. :) It's not much code however.
 | |
| 
 | |
| I hope you find it useful. Do what you like with it, feel free to ask if
 | |
| anything is unclear.
 | |
| 
 | |
| Best rgds,
 | |
|   Calle Karlsson
 | |
|   ckn@kash.se
 | |
| 
 | |
| diff -uNr shadow-980403.orig/src/newusers.c shadow-980403/src/newusers.c
 | |
| --- shadow-980403.orig/src/newusers.c	Fri Jan 30 00:22:43 1998
 | |
| +++ shadow-980403/src/newusers.c	Fri Apr 17 16:55:33 1998
 | |
| @@ -76,11 +76,35 @@
 | |
|  static void
 | |
|  usage(void)
 | |
|  {
 | |
| -	fprintf(stderr, "Usage: %s [ input ]\n", Prog);
 | |
| +	fprintf (stderr, "Usage: %s [-p prototype tarfile] [ input ]\n", Prog);
 | |
| +	fprintf (stderr, "The prototype tarfile is only used for users\n");
 | |
| +	fprintf (stderr, "marked as anonymous ftp users. It must be a full pathname.\n");
 | |
|  	exit(1);
 | |
|  }
 | |
|  
 | |
|  /*
 | |
| + * createuserdir - create a directory and chmod it
 | |
| + */
 | |
| +
 | |
| +static int
 | |
| +createuserdir (char * dir, int uid, int gid, int line)
 | |
| +{
 | |
| +	if (mkdir (dir, 0777 & ~getdef_num("UMASK", 077))) {
 | |
| +		fprintf (stderr, "%s: line %d: mkdir %s failed\n",
 | |
| +			 Prog, line, dir);
 | |
| +		return -1;
 | |
| +	}
 | |
| +
 | |
| +	if (chown (dir, uid, gid)) {
 | |
| +		fprintf (stderr, "%s: line %d: chown %s failed\n",
 | |
| +			 Prog, line, dir);
 | |
| +		return -1;
 | |
| +	}
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +/*
 | |
|   * add_group - create a new group or add a user to an existing group
 | |
|   */
 | |
|  
 | |
| @@ -328,6 +352,8 @@
 | |
|  main(int argc, char **argv)
 | |
|  {
 | |
|  	char	buf[BUFSIZ];
 | |
| +	char	anonproto[BUFSIZ];
 | |
| +	int	flag;
 | |
|  	char	*fields[8];
 | |
|  	int	nfields;
 | |
|  	char	*cp;
 | |
| @@ -340,12 +366,23 @@
 | |
|  
 | |
|  	Prog = Basename(argv[0]);
 | |
|  
 | |
| -	if (argc > 1 && argv[1][0] == '-')
 | |
| -		usage ();
 | |
| +	* anonproto = '\0';
 | |
| +
 | |
| +	while ((flag = getopt (argc, argv, "p:h")) != EOF) {
 | |
| +		switch (flag) {
 | |
| +		case 'p':
 | |
| +			STRFCPY(anonproto, optarg);
 | |
| +			break;
 | |
| +		case 'h':
 | |
| +		default:
 | |
| +			usage ();
 | |
| +			break;
 | |
| +		}
 | |
| +	}
 | |
|  
 | |
| -	if (argc == 2) {
 | |
| -		if (! freopen (argv[1], "r", stdin)) {
 | |
| -			snprintf(buf, sizeof buf, "%s: %s", Prog, argv[1]);
 | |
| +	if (optind < argc) {
 | |
| +		if (! freopen (argv[optind], "r", stdin)) {
 | |
| +			snprintf(buf, sizeof buf, "%s: %s", Prog, argv[optind]);
 | |
|  			perror (buf);
 | |
|  			exit (1);
 | |
|  		}
 | |
| @@ -499,15 +536,36 @@
 | |
|  		if (fields[6][0])
 | |
|  			newpw.pw_shell = fields[6];
 | |
|  
 | |
| -		if (newpw.pw_dir[0] && access(newpw.pw_dir, F_OK)) {
 | |
| -			if (mkdir (newpw.pw_dir,
 | |
| -					0777 & ~getdef_num("UMASK", 077)))
 | |
| -				fprintf (stderr, "%s: line %d: mkdir failed\n",
 | |
| -					Prog, line);
 | |
| -			else if (chown (newpw.pw_dir,
 | |
| -					newpw.pw_uid, newpw.pw_gid))
 | |
| -				fprintf (stderr, "%s: line %d: chown failed\n",
 | |
| -					Prog, line);
 | |
| +		if (newpw.pw_dir[0]) {
 | |
| +		        char * userdir = strdup (newpw.pw_dir);
 | |
| +			char * anonpart;
 | |
| +			int rc;
 | |
| +
 | |
| +			if ((anonpart = strstr (userdir, "/./"))) {
 | |
| +			        * anonpart = '\0';
 | |
| +				anonpart += 2;
 | |
| +			}
 | |
| +			
 | |
| +			if (access(userdir, F_OK))
 | |
| +				rc = createuserdir (userdir, newpw.pw_uid, newpw.pw_gid, line);
 | |
| +			else
 | |
| +				rc = 0;
 | |
| +
 | |
| +			if (rc == 0 && anonpart) {
 | |
| +				if (* anonproto) {
 | |
| +					char cmdbuf [BUFSIZ];
 | |
| +					snprintf(cmdbuf, sizeof cmdbuf,
 | |
| +						 "cd %s; tar xf %s",
 | |
| +						 userdir, anonproto);
 | |
| +					system (cmdbuf);
 | |
| +				}
 | |
| +				if (strlen (anonpart) > 1) {
 | |
| +					strcat (userdir, anonpart);
 | |
| +					if (access (userdir, F_OK))
 | |
| +						createuserdir (userdir, newpw.pw_uid, newpw.pw_gid, line);
 | |
| +				}
 | |
| +			}
 | |
| +			free (userdir);
 | |
|  		}
 | |
|  
 | |
|  		/*
 |