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