xref: /plan9/sys/src/cmd/upas/send/local.c (revision 3ff48bf5ed603850fcd251ddf13025d23d693782)
13e12c5d1SDavid du Colombier #include "common.h"
23e12c5d1SDavid du Colombier #include "send.h"
33e12c5d1SDavid du Colombier 
4bd389b36SDavid du Colombier static void
mboxfile(dest * dp,String * user,String * path,char * file)57dd7cddfSDavid du Colombier mboxfile(dest *dp, String *user, String *path, char *file)
6bd389b36SDavid du Colombier {
7bd389b36SDavid du Colombier 	char *cp;
8bd389b36SDavid du Colombier 
97dd7cddfSDavid du Colombier 	mboxpath(s_to_c(user), s_to_c(dp->addr), path, 0);
10bd389b36SDavid du Colombier 	cp = strrchr(s_to_c(path), '/');
11bd389b36SDavid du Colombier 	if(cp)
12bd389b36SDavid du Colombier 		path->ptr = cp+1;
13bd389b36SDavid du Colombier 	else
14bd389b36SDavid du Colombier 		path->ptr = path->base;
15bd389b36SDavid du Colombier 	s_append(path, file);
16bd389b36SDavid du Colombier }
17bd389b36SDavid du Colombier 
183e12c5d1SDavid du Colombier /*
193e12c5d1SDavid du Colombier  *  Check forwarding requests
203e12c5d1SDavid du Colombier  */
213e12c5d1SDavid du Colombier extern dest*
expand_local(dest * dp)223e12c5d1SDavid du Colombier expand_local(dest *dp)
233e12c5d1SDavid du Colombier {
243e12c5d1SDavid du Colombier 	Biobuf *fp;
257dd7cddfSDavid du Colombier 	String *file, *line, *s;
263e12c5d1SDavid du Colombier 	dest *rv;
27bd389b36SDavid du Colombier 	int forwardok;
287dd7cddfSDavid du Colombier 	char *user;
293e12c5d1SDavid du Colombier 
30219b2ee8SDavid du Colombier 	/* short circuit obvious security problems */
31219b2ee8SDavid du Colombier 	if(strstr(s_to_c(dp->addr), "/../")){
32219b2ee8SDavid du Colombier 		dp->status = d_unknown;
33219b2ee8SDavid du Colombier 		return 0;
34219b2ee8SDavid du Colombier 	}
35219b2ee8SDavid du Colombier 
367dd7cddfSDavid du Colombier 	/* isolate user's name if part of a path */
377dd7cddfSDavid du Colombier 	user = strrchr(s_to_c(dp->addr), '!');
387dd7cddfSDavid du Colombier 	if(user)
397dd7cddfSDavid du Colombier 		user++;
407dd7cddfSDavid du Colombier 	else
417dd7cddfSDavid du Colombier 		user = s_to_c(dp->addr);
427dd7cddfSDavid du Colombier 
437dd7cddfSDavid du Colombier 	/* if no replacement string, plug in user's name */
44bd389b36SDavid du Colombier 	if(dp->repl1 == 0){
45bd389b36SDavid du Colombier 		dp->repl1 = s_new();
467dd7cddfSDavid du Colombier 		mboxname(user, dp->repl1);
47bd389b36SDavid du Colombier 	}
48bd389b36SDavid du Colombier 
497dd7cddfSDavid du Colombier 	s = unescapespecial(s_clone(dp->repl1));
507dd7cddfSDavid du Colombier 
51bd389b36SDavid du Colombier 	/*
52bd389b36SDavid du Colombier 	 *  if this is the descendant of a `forward' file, don't
53bd389b36SDavid du Colombier 	 *  look for a forward.
54bd389b36SDavid du Colombier 	 */
55bd389b36SDavid du Colombier 	forwardok = 1;
56bd389b36SDavid du Colombier 	for(rv = dp->parent; rv; rv = rv->parent)
57bd389b36SDavid du Colombier 		if(rv->status == d_cat){
58bd389b36SDavid du Colombier 			forwardok = 0;
59bd389b36SDavid du Colombier 			break;
60bd389b36SDavid du Colombier 		}
617dd7cddfSDavid du Colombier 	file = s_new();
62bd389b36SDavid du Colombier 	if(forwardok){
633e12c5d1SDavid du Colombier 		/*
643e12c5d1SDavid du Colombier 		 *  look for `forward' file for forwarding address(es)
653e12c5d1SDavid du Colombier 		 */
667dd7cddfSDavid du Colombier 		mboxfile(dp, s, file, "forward");
677dd7cddfSDavid du Colombier 		fp = sysopen(s_to_c(file), "r", 0);
683e12c5d1SDavid du Colombier 		if (fp != 0) {
697dd7cddfSDavid du Colombier 			line = s_new();
70*3ff48bf5SDavid du Colombier 			for(;;){
71*3ff48bf5SDavid du Colombier 				if(s_read_line(fp, line) == nil)
72*3ff48bf5SDavid du Colombier 					break;
73*3ff48bf5SDavid du Colombier 				if(*(line->ptr - 1) != '\n')
74*3ff48bf5SDavid du Colombier 					break;
75*3ff48bf5SDavid du Colombier 				if(*(line->ptr - 2) == '\\')
76*3ff48bf5SDavid du Colombier 					*(line->ptr-2) = ' ';
77*3ff48bf5SDavid du Colombier 				*(line->ptr-1) = ' ';
78*3ff48bf5SDavid du Colombier 			}
793e12c5d1SDavid du Colombier 			sysclose(fp);
803e12c5d1SDavid du Colombier 			if(debug)
813e12c5d1SDavid du Colombier 				fprint(2, "forward = %s\n", s_to_c(line));
823e12c5d1SDavid du Colombier 			rv = s_to_dest(s_restart(line), dp);
833e12c5d1SDavid du Colombier 			s_free(line);
84bd389b36SDavid du Colombier 			if(rv){
853e12c5d1SDavid du Colombier 				s_free(file);
867dd7cddfSDavid du Colombier 				s_free(s);
873e12c5d1SDavid du Colombier 				return rv;
883e12c5d1SDavid du Colombier 			}
89bd389b36SDavid du Colombier 		}
90bd389b36SDavid du Colombier 	}
91bd389b36SDavid du Colombier 
92bd389b36SDavid du Colombier 	/*
937dd7cddfSDavid du Colombier 	 *  look for a 'pipe' file.  This won't work if there are
947dd7cddfSDavid du Colombier 	 *  special characters in the account name since the file
957dd7cddfSDavid du Colombier 	 *  name passes through a shell.  tdb.
96bd389b36SDavid du Colombier 	 */
977dd7cddfSDavid du Colombier 	mboxfile(dp, dp->repl1, s_reset(file), "pipeto");
98bd389b36SDavid du Colombier 	if(sysexist(s_to_c(file))){
99bd389b36SDavid du Colombier 		if(debug)
100bd389b36SDavid du Colombier 			fprint(2, "found a pipeto file\n");
101bd389b36SDavid du Colombier 		dp->status = d_pipeto;
1027dd7cddfSDavid du Colombier 		line = s_new();
1037dd7cddfSDavid du Colombier 		s_append(line, "upasname='");
1047dd7cddfSDavid du Colombier 		s_append(line, user);
1057dd7cddfSDavid du Colombier 		s_append(line, "' ");
1067dd7cddfSDavid du Colombier 		s_append(line, s_to_c(file));
1077dd7cddfSDavid du Colombier 		s_append(line, " ");
1087dd7cddfSDavid du Colombier 		s_append(line, s_to_c(dp->addr));
1097dd7cddfSDavid du Colombier 		s_append(line, " ");
1107dd7cddfSDavid du Colombier 		s_append(line, s_to_c(dp->repl1));
111bd389b36SDavid du Colombier 		s_free(dp->repl1);
1127dd7cddfSDavid du Colombier 		dp->repl1 = line;
1137dd7cddfSDavid du Colombier 		s_free(file);
1147dd7cddfSDavid du Colombier 		s_free(s);
115bd389b36SDavid du Colombier 		return dp;
116bd389b36SDavid du Colombier 	}
1173e12c5d1SDavid du Colombier 
1183e12c5d1SDavid du Colombier 	/*
1193e12c5d1SDavid du Colombier 	 *  see if the mailbox directory exists
1203e12c5d1SDavid du Colombier 	 */
1217dd7cddfSDavid du Colombier 	mboxfile(dp, s, s_reset(file), ".");
1223e12c5d1SDavid du Colombier 	if(sysexist(s_to_c(file)))
1233e12c5d1SDavid du Colombier 		dp->status = d_cat;
1243e12c5d1SDavid du Colombier 	else
1253e12c5d1SDavid du Colombier 		dp->status = d_unknown;
1263e12c5d1SDavid du Colombier 	s_free(file);
1277dd7cddfSDavid du Colombier 	s_free(s);
1283e12c5d1SDavid du Colombier 	return 0;
1293e12c5d1SDavid du Colombier }
130