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