61b06730333fd6af7a8422c5dd793cc00e8befdb
[citadel.git] / webcit-ng / server / ctdl_commands.c
1 // Copyright (c) 1996-2022 by the citadel.org team
2 //
3 // This program is open source software.  Use, duplication, or
4 // disclosure is subject to the GNU General Public License v3.
5
6 #include "webcit.h"
7
8
9 // /ctdl/c/info returns a JSON representation of the output of an INFO command.
10 void serv_info(struct http_transaction *h, struct ctdlsession *c) {
11         char buf[1024];
12
13         ctdl_printf(c, "INFO");
14         ctdl_readline(c, buf, sizeof(buf));
15         if (buf[0] != '1') {
16                 do_502(h);
17                 return;
18         }
19
20         JsonValue *j = NewJsonObject(HKEY("serv_info"));
21         int i = 0;
22         while (ctdl_readline(c, buf, sizeof(buf)), strcmp(buf, "000"))
23                 switch (i++) {
24                 case 0:
25                         JsonObjectAppend(j, NewJsonNumber(HKEY("serv_pid"), atol(buf)));
26                         break;
27                 case 1:
28                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_nodename"), buf, -1));
29                         break;
30                 case 2:
31                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_humannode"), buf, -1));
32                         break;
33                 case 3:
34                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_fqdn"), buf, -1));
35                         break;
36                 case 4:
37                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_software"), buf, -1));
38                         break;
39                 case 5:
40                         JsonObjectAppend(j, NewJsonNumber(HKEY("serv_rev_level"), atol(buf)));
41                         break;
42                 case 6:
43                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_bbs_city"), buf, -1));
44                         break;
45                 case 7:
46                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_sysadm"), buf, -1));
47                         break;
48                 case 14:
49                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_supports_ldap"), atoi(buf)));
50                         break;
51                 case 15:
52                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_newuser_disabled"), atoi(buf)));
53                         break;
54                 case 16:
55                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_default_cal_zone"), buf, -1));
56                         break;
57                 case 20:
58                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_supports_sieve"), atoi(buf)));
59                         break;
60                 case 21:
61                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_fulltext_enabled"), atoi(buf)));
62                         break;
63                 case 22:
64                         JsonObjectAppend(j, NewJsonPlainString(HKEY("serv_svn_revision"), buf, -1));
65                         break;
66                 case 23:
67                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_supports_openid"), atoi(buf)));
68                         break;
69                 case 24:
70                         JsonObjectAppend(j, NewJsonBool(HKEY("serv_supports_guest"), atoi(buf)));
71                         break;
72                 }
73
74         StrBuf *sj = NewStrBuf();
75         SerializeJson(sj, j, 1);        // '1' == free the source array
76
77         add_response_header(h, strdup("Content-type"), strdup("application/json"));
78         h->response_code = 200;
79         h->response_string = strdup("OK");
80         h->response_body_length = StrLength(sj);
81         h->response_body = SmashStrBuf(&sj);
82 }
83
84
85 // Dispatcher for paths starting with /ctdl/c/
86 void ctdl_c(struct http_transaction *h, struct ctdlsession *c) {
87         if (!strcasecmp(h->url, "/ctdl/c/info")) {
88                 serv_info(h, c);
89         }
90         else {
91                 do_404(h);
92         }
93 }