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