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 int forward_loop(char *, char *);
5 5cdb1798 2005-10-29 devnull
6 5cdb1798 2005-10-29 devnull /* bind the destinations to the commands to be executed */
7 5cdb1798 2005-10-29 devnull extern dest *
8 5cdb1798 2005-10-29 devnull up_bind(dest *destp, message *mp, int checkforward)
9 5cdb1798 2005-10-29 devnull {
10 5cdb1798 2005-10-29 devnull dest *list[2]; /* lists of unbound destinations */
11 5cdb1798 2005-10-29 devnull int li; /* index into list[2] */
12 5cdb1798 2005-10-29 devnull dest *bound=0; /* bound destinations */
13 5cdb1798 2005-10-29 devnull dest *dp;
14 5cdb1798 2005-10-29 devnull int i;
15 5cdb1798 2005-10-29 devnull
16 5cdb1798 2005-10-29 devnull list[0] = destp;
17 5cdb1798 2005-10-29 devnull list[1] = 0;
18 5cdb1798 2005-10-29 devnull
19 5cdb1798 2005-10-29 devnull /*
20 5cdb1798 2005-10-29 devnull * loop once to check for:
21 5cdb1798 2005-10-29 devnull * - forwarding rights
22 5cdb1798 2005-10-29 devnull * - addressing loops
23 5cdb1798 2005-10-29 devnull * - illegal characters
24 5cdb1798 2005-10-29 devnull * - characters that need escaping
25 5cdb1798 2005-10-29 devnull */
26 5cdb1798 2005-10-29 devnull for (dp = d_rm(&list[0]); dp != 0; dp = d_rm(&list[0])) {
27 5cdb1798 2005-10-29 devnull if (!checkforward)
28 5cdb1798 2005-10-29 devnull dp->authorized = 1;
29 5cdb1798 2005-10-29 devnull dp->addr = escapespecial(dp->addr);
30 5cdb1798 2005-10-29 devnull if (forward_loop(s_to_c(dp->addr), thissys)) {
31 5cdb1798 2005-10-29 devnull dp->status = d_eloop;
32 5cdb1798 2005-10-29 devnull d_same_insert(&bound, dp);
33 5cdb1798 2005-10-29 devnull } else if(forward_loop(s_to_c(mp->sender), thissys)) {
34 5cdb1798 2005-10-29 devnull dp->status = d_eloop;
35 5cdb1798 2005-10-29 devnull d_same_insert(&bound, dp);
36 5cdb1798 2005-10-29 devnull } else if(shellchars(s_to_c(dp->addr))) {
37 5cdb1798 2005-10-29 devnull dp->status = d_syntax;
38 5cdb1798 2005-10-29 devnull d_same_insert(&bound, dp);
39 5cdb1798 2005-10-29 devnull } else
40 5cdb1798 2005-10-29 devnull d_insert(&list[1], dp);
41 5cdb1798 2005-10-29 devnull }
42 5cdb1798 2005-10-29 devnull li = 1;
43 5cdb1798 2005-10-29 devnull
44 5cdb1798 2005-10-29 devnull /* Loop until all addresses are bound or address loop detected */
45 5cdb1798 2005-10-29 devnull for (i=0; list[li]!=0 && i<32; ++i, li ^= 1) {
46 5cdb1798 2005-10-29 devnull /* Traverse the current list. Bound items are put on the
47 5cdb1798 2005-10-29 devnull * `bound' list. Unbound items are put on the next list to
48 5cdb1798 2005-10-29 devnull * traverse, `list[li^1]'.
49 5cdb1798 2005-10-29 devnull */
50 5cdb1798 2005-10-29 devnull for (dp = d_rm(&list[li]); dp != 0; dp = d_rm(&list[li])){
51 5cdb1798 2005-10-29 devnull dest *newlist;
52 5cdb1798 2005-10-29 devnull
53 5cdb1798 2005-10-29 devnull rewrite(dp, mp);
54 5cdb1798 2005-10-29 devnull if(debug)
55 5cdb1798 2005-10-29 devnull fprint(2, "%s -> %s\n", s_to_c(dp->addr),
56 5cdb1798 2005-10-29 devnull dp->repl1 ? s_to_c(dp->repl1):"");
57 5cdb1798 2005-10-29 devnull switch (dp->status) {
58 5cdb1798 2005-10-29 devnull case d_auth:
59 5cdb1798 2005-10-29 devnull /* authorize address if not already authorized */
60 5cdb1798 2005-10-29 devnull if(!dp->authorized){
61 5cdb1798 2005-10-29 devnull authorize(dp);
62 5cdb1798 2005-10-29 devnull if(dp->status==d_auth)
63 5cdb1798 2005-10-29 devnull d_insert(&list[li^1], dp);
64 5cdb1798 2005-10-29 devnull else
65 5cdb1798 2005-10-29 devnull d_insert(&bound, dp);
66 5cdb1798 2005-10-29 devnull }
67 5cdb1798 2005-10-29 devnull break;
68 5cdb1798 2005-10-29 devnull case d_cat:
69 5cdb1798 2005-10-29 devnull /* address -> local */
70 5cdb1798 2005-10-29 devnull newlist = expand_local(dp);
71 5cdb1798 2005-10-29 devnull if (newlist == 0) {
72 5cdb1798 2005-10-29 devnull /* append to mailbox (or error) */
73 5cdb1798 2005-10-29 devnull d_same_insert(&bound, dp);
74 5cdb1798 2005-10-29 devnull } else if (newlist->status == d_undefined) {
75 5cdb1798 2005-10-29 devnull /* Forward to ... */
76 5cdb1798 2005-10-29 devnull d_insert(&list[li^1], newlist);
77 5cdb1798 2005-10-29 devnull } else {
78 5cdb1798 2005-10-29 devnull /* Pipe to ... */
79 5cdb1798 2005-10-29 devnull d_same_insert(&bound, newlist);
80 5cdb1798 2005-10-29 devnull }
81 5cdb1798 2005-10-29 devnull break;
82 5cdb1798 2005-10-29 devnull case d_pipe:
83 5cdb1798 2005-10-29 devnull /* address -> command */
84 5cdb1798 2005-10-29 devnull d_same_insert(&bound, dp);
85 5cdb1798 2005-10-29 devnull break;
86 5cdb1798 2005-10-29 devnull case d_alias:
87 5cdb1798 2005-10-29 devnull /* address -> rewritten address */
88 5cdb1798 2005-10-29 devnull newlist = s_to_dest(dp->repl1, dp);
89 5cdb1798 2005-10-29 devnull if(newlist != 0)
90 5cdb1798 2005-10-29 devnull d_insert(&list[li^1], newlist);
91 5cdb1798 2005-10-29 devnull else
92 5cdb1798 2005-10-29 devnull d_same_insert(&bound, dp);
93 5cdb1798 2005-10-29 devnull break;
94 5cdb1798 2005-10-29 devnull case d_translate:
95 5cdb1798 2005-10-29 devnull /* pipe to a translator */
96 5cdb1798 2005-10-29 devnull newlist = translate(dp);
97 5cdb1798 2005-10-29 devnull if (newlist != 0)
98 5cdb1798 2005-10-29 devnull d_insert(&list[li^1], newlist);
99 5cdb1798 2005-10-29 devnull else
100 5cdb1798 2005-10-29 devnull d_same_insert(&bound, dp);
101 5cdb1798 2005-10-29 devnull break;
102 5cdb1798 2005-10-29 devnull default:
103 5cdb1798 2005-10-29 devnull /* error */
104 5cdb1798 2005-10-29 devnull d_same_insert(&bound, dp);
105 5cdb1798 2005-10-29 devnull break;
106 5cdb1798 2005-10-29 devnull }
107 5cdb1798 2005-10-29 devnull }
108 5cdb1798 2005-10-29 devnull }
109 5cdb1798 2005-10-29 devnull
110 5cdb1798 2005-10-29 devnull /* mark remaining comands as "forwarding loops" */
111 5cdb1798 2005-10-29 devnull for (dp = d_rm(&list[li]); dp != 0; dp = d_rm(&list[li])) {
112 5cdb1798 2005-10-29 devnull dp->status = d_loop;
113 5cdb1798 2005-10-29 devnull d_same_insert(&bound, dp);
114 5cdb1798 2005-10-29 devnull }
115 5cdb1798 2005-10-29 devnull
116 5cdb1798 2005-10-29 devnull return bound;
117 5cdb1798 2005-10-29 devnull }
118 5cdb1798 2005-10-29 devnull
119 5cdb1798 2005-10-29 devnull /* Return TRUE if a forwarding loop exists, i.e., the String `system'
120 5cdb1798 2005-10-29 devnull * is found more than 4 times in the return address.
121 5cdb1798 2005-10-29 devnull */
122 5cdb1798 2005-10-29 devnull static int
123 5cdb1798 2005-10-29 devnull forward_loop(char *addr, char *system)
124 5cdb1798 2005-10-29 devnull {
125 5cdb1798 2005-10-29 devnull int len = strlen(system), found = 0;
126 5cdb1798 2005-10-29 devnull
127 5cdb1798 2005-10-29 devnull while (addr = strchr(addr, '!'))
128 5cdb1798 2005-10-29 devnull if (!strncmp(++addr, system, len)
129 5cdb1798 2005-10-29 devnull && addr[len] == '!' && ++found == 4)
130 5cdb1798 2005-10-29 devnull return 1;
131 5cdb1798 2005-10-29 devnull return 0;
132 5cdb1798 2005-10-29 devnull }