Blame


1 5cdb1798 2005-10-29 devnull #include "common.h"
2 5cdb1798 2005-10-29 devnull #include "send.h"
3 5cdb1798 2005-10-29 devnull
4 5cdb1798 2005-10-29 devnull static void
5 5cdb1798 2005-10-29 devnull mboxfile(dest *dp, String *user, String *path, char *file)
6 5cdb1798 2005-10-29 devnull {
7 5cdb1798 2005-10-29 devnull char *cp;
8 5cdb1798 2005-10-29 devnull
9 5cdb1798 2005-10-29 devnull mboxpath(s_to_c(user), s_to_c(dp->addr), path, 0);
10 5cdb1798 2005-10-29 devnull cp = strrchr(s_to_c(path), '/');
11 5cdb1798 2005-10-29 devnull if(cp)
12 5cdb1798 2005-10-29 devnull path->ptr = cp+1;
13 5cdb1798 2005-10-29 devnull else
14 5cdb1798 2005-10-29 devnull path->ptr = path->base;
15 5cdb1798 2005-10-29 devnull s_append(path, file);
16 5cdb1798 2005-10-29 devnull }
17 5cdb1798 2005-10-29 devnull
18 5cdb1798 2005-10-29 devnull /*
19 5cdb1798 2005-10-29 devnull * Check forwarding requests
20 5cdb1798 2005-10-29 devnull */
21 5cdb1798 2005-10-29 devnull extern dest*
22 5cdb1798 2005-10-29 devnull expand_local(dest *dp)
23 5cdb1798 2005-10-29 devnull {
24 5cdb1798 2005-10-29 devnull Biobuf *fp;
25 5cdb1798 2005-10-29 devnull String *file, *line, *s;
26 5cdb1798 2005-10-29 devnull dest *rv;
27 5cdb1798 2005-10-29 devnull int forwardok;
28 5cdb1798 2005-10-29 devnull char *user;
29 5cdb1798 2005-10-29 devnull
30 5cdb1798 2005-10-29 devnull /* short circuit obvious security problems */
31 5cdb1798 2005-10-29 devnull if(strstr(s_to_c(dp->addr), "/../")){
32 5cdb1798 2005-10-29 devnull dp->status = d_unknown;
33 5cdb1798 2005-10-29 devnull return 0;
34 5cdb1798 2005-10-29 devnull }
35 5cdb1798 2005-10-29 devnull
36 5cdb1798 2005-10-29 devnull /* isolate user's name if part of a path */
37 5cdb1798 2005-10-29 devnull user = strrchr(s_to_c(dp->addr), '!');
38 5cdb1798 2005-10-29 devnull if(user)
39 5cdb1798 2005-10-29 devnull user++;
40 5cdb1798 2005-10-29 devnull else
41 5cdb1798 2005-10-29 devnull user = s_to_c(dp->addr);
42 5cdb1798 2005-10-29 devnull
43 5cdb1798 2005-10-29 devnull /* if no replacement string, plug in user's name */
44 5cdb1798 2005-10-29 devnull if(dp->repl1 == 0){
45 5cdb1798 2005-10-29 devnull dp->repl1 = s_new();
46 5cdb1798 2005-10-29 devnull mboxname(user, dp->repl1);
47 5cdb1798 2005-10-29 devnull }
48 5cdb1798 2005-10-29 devnull
49 5cdb1798 2005-10-29 devnull s = unescapespecial(s_clone(dp->repl1));
50 5cdb1798 2005-10-29 devnull
51 5cdb1798 2005-10-29 devnull /*
52 5cdb1798 2005-10-29 devnull * if this is the descendant of a `forward' file, don't
53 5cdb1798 2005-10-29 devnull * look for a forward.
54 5cdb1798 2005-10-29 devnull */
55 5cdb1798 2005-10-29 devnull forwardok = 1;
56 5cdb1798 2005-10-29 devnull for(rv = dp->parent; rv; rv = rv->parent)
57 5cdb1798 2005-10-29 devnull if(rv->status == d_cat){
58 5cdb1798 2005-10-29 devnull forwardok = 0;
59 5cdb1798 2005-10-29 devnull break;
60 5cdb1798 2005-10-29 devnull }
61 5cdb1798 2005-10-29 devnull file = s_new();
62 5cdb1798 2005-10-29 devnull if(forwardok){
63 5cdb1798 2005-10-29 devnull /*
64 5cdb1798 2005-10-29 devnull * look for `forward' file for forwarding address(es)
65 5cdb1798 2005-10-29 devnull */
66 5cdb1798 2005-10-29 devnull mboxfile(dp, s, file, "forward");
67 5cdb1798 2005-10-29 devnull fp = sysopen(s_to_c(file), "r", 0);
68 5cdb1798 2005-10-29 devnull if (fp != 0) {
69 5cdb1798 2005-10-29 devnull line = s_new();
70 5cdb1798 2005-10-29 devnull for(;;){
71 5cdb1798 2005-10-29 devnull if(s_read_line(fp, line) == nil)
72 5cdb1798 2005-10-29 devnull break;
73 5cdb1798 2005-10-29 devnull if(*(line->ptr - 1) != '\n')
74 5cdb1798 2005-10-29 devnull break;
75 5cdb1798 2005-10-29 devnull if(*(line->ptr - 2) == '\\')
76 5cdb1798 2005-10-29 devnull *(line->ptr-2) = ' ';
77 5cdb1798 2005-10-29 devnull *(line->ptr-1) = ' ';
78 5cdb1798 2005-10-29 devnull }
79 5cdb1798 2005-10-29 devnull sysclose(fp);
80 5cdb1798 2005-10-29 devnull if(debug)
81 5cdb1798 2005-10-29 devnull fprint(2, "forward = %s\n", s_to_c(line));
82 5cdb1798 2005-10-29 devnull rv = s_to_dest(s_restart(line), dp);
83 5cdb1798 2005-10-29 devnull s_free(line);
84 5cdb1798 2005-10-29 devnull if(rv){
85 5cdb1798 2005-10-29 devnull s_free(file);
86 5cdb1798 2005-10-29 devnull s_free(s);
87 5cdb1798 2005-10-29 devnull return rv;
88 5cdb1798 2005-10-29 devnull }
89 5cdb1798 2005-10-29 devnull }
90 5cdb1798 2005-10-29 devnull }
91 5cdb1798 2005-10-29 devnull
92 5cdb1798 2005-10-29 devnull /*
93 5cdb1798 2005-10-29 devnull * look for a 'pipe' file. This won't work if there are
94 5cdb1798 2005-10-29 devnull * special characters in the account name since the file
95 5cdb1798 2005-10-29 devnull * name passes through a shell. tdb.
96 5cdb1798 2005-10-29 devnull */
97 5cdb1798 2005-10-29 devnull mboxfile(dp, dp->repl1, s_reset(file), "pipeto");
98 5cdb1798 2005-10-29 devnull if(sysexist(s_to_c(file))){
99 5cdb1798 2005-10-29 devnull if(debug)
100 5cdb1798 2005-10-29 devnull fprint(2, "found a pipeto file\n");
101 5cdb1798 2005-10-29 devnull dp->status = d_pipeto;
102 5cdb1798 2005-10-29 devnull line = s_new();
103 5cdb1798 2005-10-29 devnull s_append(line, "upasname='");
104 5cdb1798 2005-10-29 devnull s_append(line, user);
105 5cdb1798 2005-10-29 devnull s_append(line, "' ");
106 5cdb1798 2005-10-29 devnull s_append(line, s_to_c(file));
107 5cdb1798 2005-10-29 devnull s_append(line, " ");
108 5cdb1798 2005-10-29 devnull s_append(line, s_to_c(dp->addr));
109 5cdb1798 2005-10-29 devnull s_append(line, " ");
110 5cdb1798 2005-10-29 devnull s_append(line, s_to_c(dp->repl1));
111 5cdb1798 2005-10-29 devnull s_free(dp->repl1);
112 5cdb1798 2005-10-29 devnull dp->repl1 = line;
113 5cdb1798 2005-10-29 devnull s_free(file);
114 5cdb1798 2005-10-29 devnull s_free(s);
115 5cdb1798 2005-10-29 devnull return dp;
116 5cdb1798 2005-10-29 devnull }
117 5cdb1798 2005-10-29 devnull
118 5cdb1798 2005-10-29 devnull /*
119 5cdb1798 2005-10-29 devnull * see if the mailbox directory exists
120 5cdb1798 2005-10-29 devnull */
121 5cdb1798 2005-10-29 devnull mboxfile(dp, s, s_reset(file), ".");
122 5cdb1798 2005-10-29 devnull if(sysexist(s_to_c(file)))
123 5cdb1798 2005-10-29 devnull dp->status = d_cat;
124 5cdb1798 2005-10-29 devnull else
125 5cdb1798 2005-10-29 devnull dp->status = d_unknown;
126 5cdb1798 2005-10-29 devnull s_free(file);
127 5cdb1798 2005-10-29 devnull s_free(s);
128 5cdb1798 2005-10-29 devnull return 0;
129 5cdb1798 2005-10-29 devnull }