d1947ced355889f0bd55c3f85251eefec9539161
[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 #include "rh-task-memset.h"
17
18 extern const char* termstring;
19
20 int do_startsession(GNetXmlRpcServer *server,
21                     const gchar *command,
22                     const gchar *param,
23                     gpointer user_data,
24                     gchar **reply_string) 
25 {
26   struct main_server *ms = (struct main_server *)user_data; 
27   struct vserver *vs = NULL;
28   unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0};
29   struct task_req req;
30   gchar *ip = NULL;
31   gchar *username = NULL;
32   gchar *session_id = NULL;
33   gchar *mac_address = NULL;
34   gchar *session_timeout = NULL;
35   gchar *bandwidth_max_down = NULL;
36   gchar *bandwidth_max_up = NULL;
37   gchar *service_class = NULL;
38   gchar *vserver_id = NULL;
39   uint32_t id;
40   GList *member_node = NULL;
41   struct rahunas_member *member = NULL;
42
43   if (param == NULL)
44     goto out;
45
46   DP("RPC Receive: %s", param);
47
48   ip          = rh_string_get_sep(param, "|", 1);
49   username    = rh_string_get_sep(param, "|", 2);
50   session_id  = rh_string_get_sep(param, "|", 3);
51   mac_address = rh_string_get_sep(param, "|", 4);
52   session_timeout    = rh_string_get_sep(param, "|", 5);
53   bandwidth_max_down = rh_string_get_sep(param, "|", 6);
54   bandwidth_max_up   = rh_string_get_sep(param, "|", 7);
55   service_class      = rh_string_get_sep(param, "|", 8);
56   vserver_id         = rh_string_get_sep(param, "|", 9);
57
58   if (ip == NULL || username == NULL || session_id == NULL 
59       || vserver_id == NULL)
60     goto out;
61
62   vs = vserver_get_by_id(ms, atoi(vserver_id));
63
64   if (vs == NULL)
65     goto out;
66
67   if (mac_address == NULL)
68     mac_address = g_strdup(DEFAULT_MAC);
69
70   id = iptoid(vs->v_map, ip);
71
72   if (id < 0) {
73     *reply_string = g_strdup("Invalid IP Address");
74     goto cleanup;
75   }
76
77   /* Check if client already registered */
78   member_node = member_get_node_by_id(vs, id);
79   if (member_node != NULL)
80     goto greeting;
81
82   req.id = id;
83   req.vserver_id = atoi(vserver_id);
84   req.username = username;
85   req.session_id = session_id;
86   parse_mac(mac_address, &ethernet);
87   memcpy(req.mac_address, &ethernet, ETH_ALEN);
88   req.session_start = 0;
89   req.session_timeout = 0;
90
91   if (session_timeout != NULL) {
92     if (atol(session_timeout) != 0)
93       req.session_timeout = time(NULL) + atol(session_timeout);
94   }
95
96   if (bandwidth_max_down != NULL)
97     req.bandwidth_max_down = atol(bandwidth_max_down);
98   else
99     req.bandwidth_max_down = 0;
100
101   if (bandwidth_max_up != NULL)
102     req.bandwidth_max_up = atol(bandwidth_max_up);
103   else
104     req.bandwidth_max_up = 0;
105
106   rh_task_startsess(vs, &req);
107   member_node = member_get_node_by_id(vs, id);
108
109 greeting:
110   if (member_node != NULL) {
111     member = (struct rahunas_member *)member_node->data;
112     *reply_string = g_strdup_printf("Greeting! Got: IP %s, User %s, ID %s, "
113                                     "VIP-IP %s",
114                                     ip, member->username, 
115                                     member->session_id, "");
116     goto cleanup;
117   }
118
119 out:
120   *reply_string = g_strdup("Invalid input parameters");
121   goto cleanup;
122
123 cleanup:
124   DP("RPC Reply: %s", *reply_string);
125   g_free(ip);
126   g_free(username);
127   g_free(session_id);
128   g_free(mac_address);
129   g_free(session_timeout);
130   g_free(bandwidth_max_down);
131   g_free(bandwidth_max_up);
132   g_free(service_class);
133   g_free(vserver_id);
134   return 0;
135 }
136
137 int do_stopsession(GNetXmlRpcServer *server,
138                    const gchar *command,
139                    const gchar *param,
140                    gpointer user_data,
141                    gchar **reply_string)
142 {
143   struct main_server *ms = (struct main_server *)user_data;
144   struct vserver *vs = NULL;
145   struct task_req req;
146   gchar *ip = NULL;
147   gchar *mac_address = NULL;
148   gchar *cause = NULL;
149   gchar *vserver_id = NULL;
150   int cause_id = 0;
151   uint32_t   id;
152   int res = 0;
153   unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0};
154   GList *member_node = NULL;
155   struct rahunas_member *member = NULL;
156
157   if (param == NULL)
158     goto out;
159
160   DP("RPC Receive: %s", param);
161
162   ip          = rh_string_get_sep(param, "|", 1);
163   mac_address = rh_string_get_sep(param, "|", 2);
164   cause       = rh_string_get_sep(param, "|", 3);
165   vserver_id  = rh_string_get_sep(param, "|", 4);
166
167   if (ip == NULL || vserver_id == NULL)
168     goto out;
169   vs = vserver_get_by_id(ms, atoi(vserver_id));
170
171   if (vs == NULL)
172     goto out;
173
174   if (mac_address == NULL)
175     mac_address = g_strdup(DEFAULT_MAC);
176
177   id = iptoid(vs->v_map, ip);
178
179   if (id < 0) {
180     *reply_string = g_strdup("Invalid IP Address");
181     goto cleanup;
182   }
183
184   parse_mac(mac_address, &ethernet);
185   memcpy(req.mac_address, &ethernet, ETH_ALEN);
186
187   member_node = member_get_node_by_id(vs, id);
188
189   if (member_node != NULL) {
190     member = (struct rahunas_member *) member_node->data;
191     if (memcmp(&ethernet, &member->mac_address, 
192         ETH_ALEN) == 0) {
193       req.id = id;
194       
195       if (cause == NULL) {
196         req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
197       } else {
198         cause_id = atoi(cause);
199         if (cause_id >= RH_RADIUS_TERM_USER_REQUEST && 
200             cause_id <= RH_RADIUS_TERM_HOST_REQUEST) {
201           req.req_opt = cause_id;
202         } else {
203           req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
204         }
205       }
206
207       res = rh_task_stopsess(vs, &req);
208       if (res == 0) {
209         *reply_string = g_strdup_printf("Client IP %s was removed!", 
210                                           idtoip(vs->v_map, id));
211       } else {
212          *reply_string = g_strdup_printf("Client IP %s error remove!", 
213                                         idtoip(vs->v_map, id));
214       }
215       goto cleanup;
216     } 
217   }
218
219   *reply_string = g_strdup_printf("%s", ip);
220   goto cleanup;
221
222 out:
223   *reply_string = g_strdup("Invalid input parameters");
224   goto cleanup;
225
226 cleanup:
227   DP("RPC Reply: %s", *reply_string);
228   g_free(ip);
229   g_free(mac_address);
230   g_free(cause);
231   g_free(vserver_id);
232   return 0;
233 }
234
235 int do_getsessioninfo(GNetXmlRpcServer *server,
236                       const gchar *command,
237                       const gchar *param,
238                       gpointer user_data,
239                       gchar **reply_string)
240 {
241   struct main_server *ms = (struct main_server *)user_data;
242   struct vserver *vs = NULL;
243   gchar *ip = NULL;
244   gchar *vserver_id = NULL;
245   uint32_t   id;
246   GList *member_node = NULL;
247   struct rahunas_member *member = NULL;
248
249   if (param == NULL)
250     goto out;
251
252   DP("RPC Receive: %s", param);
253
254   ip          = rh_string_get_sep(param, "|", 1);
255   vserver_id  = rh_string_get_sep(param, "|", 2);
256
257   if (ip == NULL || vserver_id == NULL)
258     goto out;
259
260   vs = vserver_get_by_id(ms, atoi(vserver_id));
261
262   if (vs == NULL)
263     goto out;
264
265   id = iptoid(vs->v_map, ip);
266
267   if (id < 0) {
268     *reply_string = g_strdup("Invalid IP Address");
269     goto cleanup;
270   }
271
272   member_node = member_get_node_by_id(vs, id);
273
274   if (member_node != NULL) {
275     member = (struct rahunas_member *) member_node->data;
276     if (!member->username) {
277       *reply_string = g_strdup("Invalid Username");
278       goto cleanup;
279     }
280
281     if (!member->session_id) {
282       *reply_string = g_strdup("Invalid Session ID");
283       goto cleanup;
284     }
285     
286     *reply_string = g_strdup_printf("%s|%s|%s|%d|%s|%d", 
287                                     ip, 
288                                     member->username,
289                                     member->session_id,
290                                     member->session_start,
291                                     mac_tostring(member->mac_address),
292                                     member->session_timeout);
293     goto cleanup;
294   }
295
296   *reply_string = g_strdup_printf("%s", ip);
297   goto cleanup;
298
299 out:
300   *reply_string = g_strdup("Invalid input parameters");
301    goto cleanup;
302
303 cleanup:
304   DP("RPC Reply: %s", *reply_string);
305   g_free(ip);
306   g_free(vserver_id);
307   return 0;
308 }