indent -kr -i8 -l132 on everything in webcit-ng
[citadel.git] / webcit-ng / ctdl_commands.c
1 /*
2  * Copyright (c) 1996-2018 by the citadel.org team
3  *
4  * This program is open source software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 3.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  */
12
13 #include "webcit.h"
14
15
16 /*
17  * /ctdl/c/info returns a JSON representation of the output of an INFO command.
18  */
19 void serv_info(struct http_transaction *h, struct ctdlsession *c)
20 {
21         char buf[1024];
22
23         ctdl_printf(c, "INFO");
24         ctdl_readline(c, buf, sizeof(buf));
25         if (buf[0] != '1') {
26                 do_502(h);
27                 return;
28         }
29
30         JsonValue *j = NewJsonObject(HKEY("serv_info"));
31         int i = 0;
32         while (ctdl_readline(c, buf, sizeof(buf)), strcmp(buf, "000"))
33                 switch (i++) {
34                 case 0:
35                         JsonObjectAppend(j, NewJsonNumber(HKEY("serv_pid"), atol(buf)));
36                         break;
37                 case 1:
38                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_nodename"), buf, -1));
39                         break;
40                 case 2:
41                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_humannode"), buf, -1));
42                         break;
43                 case 3:
44                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_fqdn"), buf, -1));
45                         break;
46                 case 4:
47                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_software"), buf, -1));
48                         break;
49                 case 5:
50                         JsonObjectAppend(j, NewJsonNumber(HKEY("serv_rev_level"), atol(buf)));
51                         break;
52                 case 6:
53                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_bbs_city"), buf, -1));
54                         break;
55                 case 7:
56                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_sysadm"), buf, -1));
57                         break;
58                 case 14:
59                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_supports_ldap"), atoi(buf)));
60                         break;
61                 case 15:
62                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_newuser_disabled"), atoi(buf)));
63                         break;
64                 case 16:
65                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_default_cal_zone"), buf, -1));
66                         break;
67                 case 20:
68                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_supports_sieve"), atoi(buf)));
69                         break;
70                 case 21:
71                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_fulltext_enabled"), atoi(buf)));
72                         break;
73                 case 22:
74                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_svn_revision"), buf, -1));
75                         break;
76                 case 23:
77                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_supports_openid"), atoi(buf)));
78                         break;
79                 case 24:
80                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_supports_guest"), atoi(buf)));
81                         break;
82                 }
83
84         StrBuf *sj = NewStrBuf();
85         SerializeJson(sj, j, 1);        // '1' == free the source array
86
87         add_response_header(h, strdup("Content-type"), strdup("application/json"));
88         h->response_code = 200;
89         h->response_string = strdup("OK");
90         h->response_body_length = StrLength(sj);
91         h->response_body = SmashStrBuf(&sj);
92 }
93
94
95 /*
96  * Dispatcher for paths starting with /ctdl/c/
97  */
98 void ctdl_c(struct http_transaction *h, struct ctdlsession *c)
99 {
100         if (!strcasecmp(h->uri, "/ctdl/c/info")) {
101                 serv_info(h, c);
102         } else {
103                 do_404(h);
104         }
105 }