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