Add the XMLRPC interface for admin to reset user
[rahunas] / src / rh-xmlrpc-server.c
1 /**
2  * RahuNAS XML-RPC Server implementation
3  * Author: Neutron Soutmun <neo.neutron@gmail.com>
4  *         Suriya Soutmun <darksolar@gmail.com>
5  * Date:   2008-08-07
6  */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "rahunasd.h"
11 #include "rh-xmlrpc-server.h"
12 #include "rh-radius.h"
13 #include "rh-ipset.h"
14 #include "rh-utils.h"
15 #include "rh-task.h"
16
17 extern const char* termstring;
18
19 int do_startsession(GNetXmlRpcServer *server,
20                     const gchar *command,
21                     const gchar *param,
22                     gpointer user_data,
23                     gchar **reply_string) 
24 {
25   struct rahunas_map *map = (struct rahunas_map *)user_data;
26   struct rahunas_member *members = NULL;
27   unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0};
28   struct task_req req;
29   gchar *ip = NULL;
30   gchar *username = NULL;
31   gchar *session_id = NULL;
32   gchar *mac_address = NULL;
33   gchar *session_timeout = NULL;
34   gchar *bandwidth_max_down = NULL;
35   gchar *bandwidth_max_up = NULL;
36   uint32_t id;
37
38   if (!map)
39     goto out;
40
41   if (!map->members)
42     goto out;
43
44   if (param == NULL)
45     goto out;
46
47   members = map->members;
48
49   ip          = rh_string_get_sep(param, "|", 1);
50   username    = rh_string_get_sep(param, "|", 2);
51   session_id  = rh_string_get_sep(param, "|", 3);
52   mac_address = rh_string_get_sep(param, "|", 4);
53   session_timeout    = rh_string_get_sep(param, "|", 5);
54   bandwidth_max_down = rh_string_get_sep(param, "|", 6);
55   bandwidth_max_up   = rh_string_get_sep(param, "|", 7);
56
57   if (ip == NULL || username == NULL 
58         || session_id == NULL)
59     goto out;
60
61   if (mac_address == NULL)
62     mac_address = g_strdup(DEFAULT_MAC);
63
64   id = iptoid(map, ip);
65
66   if (id < 0) {
67     *reply_string = g_strdup("Invalid IP Address");
68     goto cleanup;
69   }
70
71   req.id = id;
72   req.username = username;
73   req.session_id = session_id;
74   parse_mac(mac_address, &ethernet);
75   memcpy(req.mac_address, &ethernet, ETH_ALEN);
76   req.session_timeout = 0;
77
78   if (session_timeout != NULL) {
79     if (atol(session_timeout) != 0)
80       req.session_timeout = time(NULL) + atol(session_timeout);
81   }
82
83   if (bandwidth_max_down != NULL)
84     req.bandwidth_max_down = atol(bandwidth_max_down);
85   else
86     req.bandwidth_max_down = 0;
87
88   if (bandwidth_max_up != NULL)
89     req.bandwidth_max_up = atol(bandwidth_max_up);
90   else
91     req.bandwidth_max_up = 0;
92
93   rh_task_startsess(map, &req);
94
95   *reply_string = g_strdup_printf("Greeting! Got: IP %s, User %s, ID %s", 
96                                    ip, members[id].username, 
97                                    members[id].session_id);
98   goto cleanup;
99
100 out:
101     *reply_string = g_strdup("Invalid input parameters");
102     goto cleanup;
103
104 cleanup:
105   g_free(ip);
106   g_free(username);
107   g_free(session_id);
108   g_free(mac_address);
109   g_free(session_timeout);
110   g_free(bandwidth_max_down);
111   g_free(bandwidth_max_up);
112   return 0;
113 }
114
115 int do_stopsession(GNetXmlRpcServer *server,
116                    const gchar *command,
117                    const gchar *param,
118                    gpointer user_data,
119                    gchar **reply_string)
120 {
121   struct rahunas_map *map = (struct rahunas_map *)user_data;
122   struct rahunas_member *members;
123   struct task_req req;
124   gchar *ip = NULL;
125   gchar *mac_address = NULL;
126   gchar *cause = NULL;
127   int cause_id = 0;
128   uint32_t   id;
129   int res = 0;
130   unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0};
131
132   if (!map)
133     goto out;
134
135   if (!map->members)
136     goto out;
137
138   members = map->members;
139
140   if (param == NULL)
141     goto out;
142
143   DP("RPC Receive: %s", param);
144
145   ip          = rh_string_get_sep(param, "|", 1);
146   mac_address = rh_string_get_sep(param, "|", 2);
147   cause       = rh_string_get_sep(param, "|", 3);
148
149   if (ip == NULL)
150     goto out;
151
152   if (mac_address == NULL)
153     mac_address = g_strdup(DEFAULT_MAC);
154
155   id = iptoid(map, ip);
156
157   if (id < 0) {
158     *reply_string = g_strdup("Invalid IP Address");
159     goto cleanup;
160   }
161
162   parse_mac(mac_address, &ethernet);
163   memcpy(req.mac_address, &ethernet, ETH_ALEN);
164
165   if (members[id].flags) {
166     if (memcmp(&ethernet, &members[id].mac_address, ETH_ALEN) == 0) {
167       req.id = id;
168       
169       if (cause == NULL) {
170         req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
171       } else {
172         cause_id = atoi(cause);
173         if (cause_id >= RH_RADIUS_TERM_USER_REQUEST && 
174             cause_id <= RH_RADIUS_TERM_HOST_REQUEST) {
175           req.req_opt = cause_id;
176         } else {
177           req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
178         }
179       }
180
181       res = rh_task_stopsess(map, &req);
182       if (res == 0) {
183         *reply_string = g_strdup_printf("Client IP %s was removed!", 
184                                           idtoip(map, id));
185       } else {
186          *reply_string = g_strdup_printf("Client IP %s error remove!", 
187                                         idtoip(map, id));
188       }
189       goto cleanup;
190     } 
191   }
192
193   *reply_string = g_strdup_printf("%s", ip);
194   goto cleanup;
195
196 out:
197   *reply_string = g_strdup("Invalid input parameters");
198   goto cleanup;
199
200 cleanup:
201   g_free(ip);
202   g_free(mac_address);
203   g_free(cause);
204   return 0;
205 }
206
207 int do_getsessioninfo(GNetXmlRpcServer *server,
208                       const gchar *command,
209                       const gchar *param,
210                       gpointer user_data,
211                       gchar **reply_string)
212 {
213   struct rahunas_map *map = (struct rahunas_map *)user_data;
214   struct rahunas_member *members = NULL;
215   gchar *ip = NULL;
216   uint32_t   id;
217
218   if (!map)
219     goto out;
220
221   if (!map->members)
222     goto out;
223
224   members = map->members;
225
226   if (param == NULL)
227     goto out;
228
229   ip = param;
230   id = iptoid(map, ip);
231
232   if (id < 0) {
233     *reply_string = g_strdup("Invalid IP Address");
234     return 0;
235   }
236
237   if (members[id].flags) {
238     if (!members[id].username) {
239       *reply_string = g_strdup("Invalid Username");
240       return 0;
241     }
242
243     if (!members[id].session_id) {
244       *reply_string = g_strdup("Invalid Session ID");
245       return 0;
246     }
247     
248     *reply_string = g_strdup_printf("%s|%s|%s|%d|%s|%d", 
249                                       ip, 
250                                       members[id].username,
251                                       members[id].session_id,
252                                       members[id].session_start,
253                                       mac_tostring(members[id].mac_address),
254                                       members[id].session_timeout);
255     return 0;
256   }
257
258   *reply_string = g_strdup_printf("%s", ip);
259   return 0;
260
261 out:
262     *reply_string = g_strdup("Invalid input parameters");
263     return 0;
264 }