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