Add config options for managing user accounts
[webgit] / src / options.c
1 /*
2     cehtehs git web frontend
3
4   Copyright (C)
5     2007, 2008,         Christian Thaeter <ct@pipapo.org>
6
7   This program is free software: you can redistribute it and/or modify
8   it under the terms of the GNU Affero General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU Affero General Public License for more details.
16
17   You should have received a copy of the GNU Affero General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "options.h"
22 #include "query.h"
23
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <stdint.h>
27
28 static int
29 conf_query_opt (struct webgit_query* query, char* arg)
30 {
31   (void) query;
32   if (arg)
33     setenv ("QUERY_STRING", arg, 1);
34   else
35     return -1;
36   return 0;
37 }
38
39 static int
40 conf_method_opt (struct webgit_query* query, char* arg)
41 {
42   (void) query;
43   if (arg)
44     setenv ("REQUEST_METHOD", arg, 1);
45   else
46     return -1;
47   return 0;
48 }
49
50 static int
51 conf_cookie_opt (struct webgit_query* query, char* arg)
52 {
53   (void) query;
54   if (arg)
55     setenv ("HTTP_COOKIE", arg, 1);
56   else
57     return -1;
58   return 0;
59 }
60
61 static int
62 conf_repo_opt (struct webgit_query* query, char* arg)
63 {
64   webgit_query_add_repo (query, arg);
65   return 0;
66 }
67
68 static int
69 conf_conf_opt (struct webgit_query* query, char* arg)
70 {
71   (void) query;
72   setenv ("WEBGIT_CONFIG", arg, 1);
73   return 0;
74 }
75
76 static int
77 conf_rxpd_opt (struct webgit_query* query, char* arg)
78 {
79   char* delim = strchr (arg, ':');
80
81   free (query->rxpd);
82   query->rxpd = cwa_strndup (arg, SIZE_MAX);
83   return 0;
84 }
85
86
87 static int
88 conf_skindir_opt (struct webgit_query* query, char* arg)
89 {
90   free (query->skindir);
91   query->skindir = cwa_strndup (arg, SIZE_MAX);
92   return 0;
93 }
94
95
96 static int
97 conf_webskindir_opt (struct webgit_query* query, char* arg)
98 {
99   free (query->webskindir);
100   query->webskindir = cwa_strndup (arg, SIZE_MAX);
101   return 0;
102 }
103
104
105 static int
106 conf_skin_opt (struct webgit_query* query, char* arg)
107 {
108   free (query->skin);
109   query->skin = cwa_strndup (arg, SIZE_MAX);
110   return 0;
111 }
112
113
114 static int
115 conf_maxage_opt (struct webgit_query* query, char* arg)
116 {
117   query->maxage = atol (arg) * 86400UL;
118   return 0;
119 }
120
121
122 static int
123 conf_count_opt (struct webgit_query* query, char* arg)
124 {
125   query->count_def = atoi (arg);
126   return 0;
127 }
128
129
130 static int
131 conf_secret_opt (struct webgit_query* query, char* arg)
132 {
133   free (query->secret);
134   query->secret = cwa_strndup (arg, SIZE_MAX);
135   return 0;
136 }
137
138
139 static int
140 conf_accountdir_opt (struct webgit_query* query, char* arg)
141 {
142   free (query->accountdir);
143   query->accountdir = cwa_strndup (arg, SIZE_MAX);
144   return 0;
145 }
146
147
148 int
149 webgit_commandline_dispatch (int argc, char**argv, struct webgit_query* query)
150 {
151 #define CONF_OPT(name, _) {"--"#name, conf_##name##_opt},
152   struct cmd_table{
153     char* name;
154     int (*cb)(struct webgit_query* query, char* arg);
155   } cmds[] = {CONF_OPTS {"", NULL}};
156 #undef CONF_OPT
157
158   for (int i = 1; i<argc; ++i)
159     {
160       for (struct cmd_table* j = cmds; j->cb; ++j)
161         {
162           if (!strncmp (j->name, argv[i], strlen (j->name)))
163             {
164               if (j->cb (query, argv[i+1]))
165                 {
166                   html_list_append (error_log,
167                                     html_fmt (
168                                               "Commandline parsing error '%s' '%s'\n",
169                                               argv[i], argv[i+1])
170                                     );
171                   return -1;
172                 }
173               break;
174             }
175         }
176     }
177
178   return 0;
179 }
180
181 int
182 webgit_configfile_dispatch (const char* file, struct webgit_query* query)
183 {
184 #define CONF_OPT(name, _) {#name, conf_##name##_opt},
185   struct cmd_table{
186     char* name;
187     int (*cb)(struct webgit_query* query, char* arg);
188   } cmds[] = {CONF_OPTS {"", NULL}};
189 #undef CONF_OPT
190
191   if (!file || *file == '\0')
192     return 0;
193
194   FILE* f = fopen (file, "r");
195   if (!f)
196     {
197       html_list_append (error_log,
198                         html_fmt (
199                                   "Configfile opening error '%s'\n", file)
200                         );
201       return -1;
202     }
203
204   char buf[1024];
205
206   while (fgets(buf, 1024, f))
207     {
208       /* lines beginning with '#' are comments */
209       if (*buf == '#')
210         continue;
211
212       /* strip newline at end */
213       char* m = strchr (buf, '\n');
214       if (m)
215         *m = '\0';
216
217       /* first space char is delimiter */
218       m = strchr (buf, ' ');
219       if (m)
220         *m = '\0';
221       else
222         continue;
223
224       for (struct cmd_table* j = cmds; j->cb; ++j)
225         {
226           if (!strncmp (j->name, buf, strlen (j->name)))
227             {
228               if (j->cb (query, m+1))
229                 {
230                   fclose (f);
231                   html_list_append (error_log,
232                                     html_fmt (
233                                               "Configfile parsing error '%s' '%s'\n",
234                                               buf, m+1)
235                                     );
236                   return -1;
237                 }
238               break;
239             }
240         }
241
242     }
243
244   fclose (f);
245
246   return 0;
247 }
248
249
250 /*
251 //      Local Variables:
252 //      mode: C
253 //      c-file-style: "gnu"
254 //      indent-tabs-mode: nil
255 //      End:
256 */