|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)access.c 1.4 (Berkeley) 3/12/86";
3: #endif
4:
5: #include "common.h"
6: #include <sys/socket.h>
7: #include <netinet/in.h>
8: #include <arpa/inet.h>
9: #include <netdb.h>
10:
11: /*
12: * host_access -- determine if the client has permission to
13: * read, transfer, and/or post news. read->transfer.
14: *
15: * Parameters: "read" is a pointer to storage for
16: * an integer, which we set to 1 if the
17: * client can read news, 0 otherwise.
18: *
19: * "post" is a pointer to storage for
20: * an integer,which we set to 1 if the
21: * client can post news, 0 otherwise.
22: *
23: * Returns: Nothing.
24: *
25: * Side effects: None.
26: */
27:
28: #ifdef LOG
29: char hostname[256];
30: #endif
31:
32: host_access(canread, canpost, canxfer)
33: int *canread, *canpost, *canxfer;
34: {
35: char hostornet[MAX_STRLEN];
36: char readperm[MAX_STRLEN], postperm[MAX_STRLEN];
37: char host_name[MAX_STRLEN], net_name[MAX_STRLEN];
38: char line[MAX_STRLEN];
39: char *cp;
40: int ncanread, ncanpost, ncanxfer;
41: int netmatch;
42: int count, sockt, length;
43: unsigned long net_addr;
44: struct netent *np;
45: struct sockaddr_in sin;
46: struct hostent *hp;
47: FILE *acs_fp;
48:
49: *canread = *canpost = *canxfer = 0;
50:
51: sockt = fileno(stdin);
52: length = sizeof (struct sockaddr_in);
53: #ifdef DEBUG
54: *canread = *canpost = *canxfer = 1;
55: return;
56: #endif
57:
58: if (getpeername(sockt, (struct sockaddr *) &sin, &length) < 0) {
59: if (isatty(sockt)) {
60: #ifdef LOG
61: (void) strcpy(hostname, "stdin");
62: #endif
63: *canread = 1;
64: } else {
65: syslog(LOG_ERR, "host_access: getpeername: %m");
66: #ifdef LOG
67: (void) strcpy(hostname, "unknown");
68: #endif
69: }
70: return;
71: }
72:
73: /*
74: * At this point, sin.sin_addr.s_addr is the address of
75: * the host in network order.
76: */
77:
78: net_addr = inet_netof(sin.sin_addr); /* net_addr in host order */
79:
80: np = getnetbyaddr(net_addr, AF_INET);
81: if (np != NULL)
82: (void) strcpy(net_name, np->n_name);
83: else
84: (void) strcpy(net_name,inet_ntoa(*(struct in_addr *)&net_addr));
85:
86: hp = gethostbyaddr((char *) &sin.sin_addr.s_addr, sizeof(long),
87: AF_INET);
88: if (hp != NULL)
89: (void) strcpy(host_name, hp->h_name);
90: else
91: (void) strcpy(host_name, inet_ntoa(sin.sin_addr));
92:
93: #ifdef LOG
94: syslog(LOG_INFO, "%s connect\n", host_name);
95: (void) strcpy(hostname, host_name);
96: #endif
97:
98: /*
99: * So, now we have host_name and net_name.
100: * Our strategy at this point is:
101: *
102: * for each line, get the first word
103: *
104: * If it matches "host_name", we have a direct
105: * match; parse and return.
106: *
107: * If it matches "net_name", we have a net match;
108: * parse and set flags.
109: *
110: * If it matches the literal "default", note we have
111: * a net match; parse.
112: */
113:
114: acs_fp = fopen(ACCESS_FILE, "r");
115: if (acs_fp == NULL)
116: return;
117:
118: while (fgets(line, sizeof(line), acs_fp) != NULL) {
119: if ((cp = index(line, '\n')) != NULL)
120: *cp = '\0';
121: if ((cp = index(line, '#')) != NULL)
122: *cp = '\0';
123: if (*line == '\0')
124: continue;
125:
126: count = sscanf(line, "%s %s %s", hostornet, readperm, postperm);
127:
128: if (count < 3)
129: continue;
130:
131: if (strcmp(hostornet, host_name) == 0) {
132: *canread = (readperm[0] == 'r' || readperm[0] == 'R');
133: *canxfer = (*canread || readperm[0] == 'X'
134: || readperm[0] == 'x');
135: *canpost = (postperm[0] == 'p' || postperm[0] == 'P');
136: (void) fclose(acs_fp);
137: return;
138: }
139:
140: if (strcmp(hostornet, net_name) == 0 ||
141: strcmp(hostornet, "default") == 0) {
142: netmatch = 1;
143: ncanread = (readperm[0] == 'r' || readperm[0] == 'R');
144: ncanxfer = (ncanread || readperm[0] == 'X'
145: || readperm[0] == 'x');
146: ncanpost = (postperm[0] == 'p' || postperm[0] == 'P');
147: }
148: }
149:
150: (void) fclose(acs_fp);
151:
152: if (netmatch) {
153: *canread = ncanread;
154: *canpost = ncanpost;
155: *canxfer = ncanxfer;
156: }
157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.