2017c908be4f9b1565af0a1c88db6217cb174776
[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")) switch(i++) {
33                 case 0:
34                         JsonObjectAppend(j, NewJsonNumber(      HKEY("serv_pid"),               atol(buf)));
35                         break;
36                 case 1:
37                         JsonObjectAppend(j, NewJsonPlainString( HKEY("serv_nodename"),          buf, -1));
38                         break;
39                 case 2:
40                         JsonObjectAppend(j, NewJsonPlainString( HKEY("serv_humannode"),         buf, -1));
41                         break;
42                 case 3:
43                         JsonObjectAppend(j, NewJsonPlainString( HKEY("serv_fqdn"),              buf, -1));
44                         break;
45                 case 4:
46                         JsonObjectAppend(j, NewJsonPlainString( HKEY("serv_software"),          buf, -1));
47                         break;
48                 case 5:
49                         JsonObjectAppend(j, NewJsonNumber(      HKEY("serv_rev_level"),         atol(buf)));
50                         break;
51                 case 6:
52                         JsonObjectAppend(j, NewJsonPlainString( HKEY("serv_bbs_city"),          buf, -1));
53                         break;
54                 case 7:
55                         JsonObjectAppend(j, NewJsonPlainString( HKEY("serv_sysadm"),            buf, -1));
56                         break;
57                 case 14:
58                         JsonObjectAppend(j, NewJsonBool(        HKEY("serv_supports_ldap"),     atoi(buf)));
59                         break;
60                 case 15:
61                         JsonObjectAppend(j, NewJsonBool(        HKEY("serv_newuser_disabled"),  atoi(buf)));
62                         break;
63                 case 16:
64                         JsonObjectAppend(j, NewJsonPlainString( HKEY("serv_default_cal_zone"),  buf, -1));
65                         break;
66                 case 20:
67                         JsonObjectAppend(j, NewJsonBool(        HKEY("serv_supports_sieve"),    atoi(buf)));
68                         break;
69                 case 21:
70                         JsonObjectAppend(j, NewJsonBool(        HKEY("serv_fulltext_enabled"),  atoi(buf)));
71                         break;
72                 case 22:
73                         JsonObjectAppend(j, NewJsonPlainString( HKEY("serv_svn_revision"),      buf, -1));
74                         break;
75                 case 23:
76                         JsonObjectAppend(j, NewJsonBool(        HKEY("serv_supports_openid"),   atoi(buf)));
77                         break;
78                 case 24:
79                         JsonObjectAppend(j, NewJsonBool(        HKEY("serv_supports_guest"),    atoi(buf)));
80                         break;
81         }
82
83         StrBuf *sj = NewStrBuf();
84         SerializeJson(sj, j, 1);        // '1' == free the source array
85
86         add_response_header(h, strdup("Content-type"), strdup("application/json"));
87         h->response_code = 200;
88         h->response_string = strdup("OK");
89         h->response_body_length = StrLength(sj);
90         h->response_body = SmashStrBuf(&sj);
91 }
92
93
94 /*
95  * Dispatcher for paths starting with /ctdl/c/
96  */
97 void ctdl_c(struct http_transaction *h, struct ctdlsession *c)
98 {
99         if (!strcasecmp(h->uri, "/ctdl/c/info")) {
100                 serv_info(h, c);
101         }
102         else {
103                 do_404(h);
104         }
105 }