* Removed the semi-broken "chat room" functionality in the chat system, and
[citadel.git] / citadel / policy.c
1 /* $Id$ */
2 #include "sysdep.h"
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <sys/stat.h>
7 #include <string.h>
8 #include <time.h>
9 #include <limits.h>
10 #include "citadel.h"
11 #include "server.h"
12 #include "database.h"
13 #include "config.h"
14 #include "room_ops.h"
15 #include "sysdep_decls.h"
16 #include "support.h"
17 #include "user_ops.h"
18 #include "msgbase.h"
19 #include "citserver.h"
20 #include "tools.h"
21
22
23 /*
24  * Retrieve the applicable expire policy for a specific room
25  */
26 void GetExpirePolicy(struct ExpirePolicy *epbuf, struct quickroom *qrbuf) {
27         struct floor flbuf;
28
29         /* If the room has its own policy, return it */ 
30         if (qrbuf->QRep.expire_mode != 0) {
31                 memcpy(epbuf, &qrbuf->QRep, sizeof(struct ExpirePolicy));
32                 return;
33                 }
34
35         /* Otherwise, if the floor has its own policy, return it */     
36         getfloor(&flbuf, qrbuf->QRfloor);
37         if (flbuf.f_ep.expire_mode != 0) {
38                 memcpy(epbuf, &flbuf.f_ep, sizeof(struct ExpirePolicy));
39                 return;
40                 }
41
42         /* Otherwise, fall back on the system default */
43         memcpy(epbuf, &config.c_ep, sizeof(struct ExpirePolicy));
44         }
45
46
47 /*
48  * Get Policy EXpire
49  */
50 void cmd_gpex(char *argbuf) {
51         struct ExpirePolicy exp;
52         struct floor flbuf;
53         char which[256];
54
55         extract(which, argbuf, 0);
56         if (!strcasecmp(which, "room")) {
57                 memcpy(&exp, &CC->quickroom.QRep, sizeof(struct ExpirePolicy));
58                 }
59         else if (!strcasecmp(which, "floor")) {
60                 getfloor(&flbuf, CC->quickroom.QRfloor);
61                 memcpy(&exp, &flbuf.f_ep, sizeof(struct ExpirePolicy));
62                 }
63         else if (!strcasecmp(which, "site")) {
64                 memcpy(&exp, &config.c_ep, sizeof(struct ExpirePolicy));
65                 }
66         else {
67                 cprintf("%d Invalid keyword.\n", ERROR);
68                 return;
69                 }
70
71         cprintf("%d %d|%d\n", OK, exp.expire_mode, exp.expire_value);
72         }
73
74
75 /*
76  * Set Policy EXpire
77  */
78 void cmd_spex(char *argbuf) {
79         struct ExpirePolicy exp;
80         struct floor flbuf;
81         char which[256];
82
83         memset(&exp, 0, sizeof(struct ExpirePolicy));
84         extract(which, argbuf, 0);
85         exp.expire_mode = extract_int(argbuf, 1);
86         exp.expire_value = extract_int(argbuf, 2);
87
88         if ((exp.expire_mode < 0) || (exp.expire_mode > 3)) {
89                 cprintf("%d Invalid policy.\n", ERROR);
90                 return;
91                 }
92
93         if (!strcasecmp(which, "room")) {
94                 if (!is_room_aide()) {
95                         cprintf("%d Higher access required.\n",
96                                 ERROR+HIGHER_ACCESS_REQUIRED);
97                         return;
98                         }
99                 lgetroom(&CC->quickroom, CC->quickroom.QRname);
100                 memcpy(&CC->quickroom.QRep, &exp, sizeof(struct ExpirePolicy));
101                 lputroom(&CC->quickroom);
102                 cprintf("%d ok\n", OK);
103                 return;
104                 }
105
106         if (CC->usersupp.axlevel < 6) {
107                 cprintf("%d Higher access required.\n",
108                         ERROR+HIGHER_ACCESS_REQUIRED);
109                 return;
110                 }
111
112         if (!strcasecmp(which, "floor")) {
113                 lgetfloor(&flbuf, CC->quickroom.QRfloor);
114                 memcpy(&flbuf.f_ep, &exp, sizeof(struct ExpirePolicy));
115                 lputfloor(&flbuf, CC->quickroom.QRfloor);
116                 cprintf("%d ok\n", OK);
117                 return;
118                 }
119
120         else if (!strcasecmp(which, "site")) {
121                 if (exp.expire_mode == EXPIRE_NEXTLEVEL) {
122                         cprintf("%d Invalid policy (no higher level)\n",
123                                 ERROR);
124                         return;
125                         }
126                 memcpy(&config.c_ep, &exp, sizeof(struct ExpirePolicy));
127                 put_config();
128                 cprintf("%d ok\n", OK);
129                 return;
130                 }
131
132         else {
133                 cprintf("%d Invalid keyword.\n", ERROR);
134                 return;
135                 }
136
137         }
138
139