866e7c5c6fa444f15649622029239b3f5e6c35fe
[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 *vip_user = 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   vip_user           = 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   req.vip_user = atoi (vip_user);
107
108   rh_task_startsess(vs, &req);
109   member_node = member_get_node_by_id(vs, id);
110
111 greeting:
112   if (member_node != NULL) {
113     member = (struct rahunas_member *)member_node->data;
114     *reply_string = g_strdup_printf("Greeting! Got: IP %s, User %s, ID %s, "
115                                     "VIP-IP %s",
116                                     ip, member->username, 
117                                     member->session_id, "");
118     goto cleanup;
119   }
120
121 out:
122   *reply_string = g_strdup("Invalid input parameters");
123   goto cleanup;
124
125 cleanup:
126   DP("RPC Reply: %s", *reply_string);
127   g_free(ip);
128   g_free(username);
129   g_free(session_id);
130   g_free(mac_address);
131   g_free(session_timeout);
132   g_free(bandwidth_max_down);
133   g_free(bandwidth_max_up);
134   g_free(vip_user);
135   g_free(vserver_id);
136   return 0;
137 }
138
139 int do_stopsession(GNetXmlRpcServer *server,
140                    const gchar *command,
141                    const gchar *param,
142                    gpointer user_data,
143                    gchar **reply_string)
144 {
145   struct main_server *ms = (struct main_server *)user_data;
146   struct vserver *vs = NULL;
147   struct task_req req;
148   gchar *ip = NULL;
149   gchar *mac_address = NULL;
150   gchar *cause = NULL;
151   gchar *vserver_id = NULL;
152   int cause_id = 0;
153   uint32_t   id;
154   int res = 0;
155   unsigned char ethernet[ETH_ALEN] = {0,0,0,0,0,0};
156   GList *member_node = NULL;
157   struct rahunas_member *member = NULL;
158
159   if (param == NULL)
160     goto out;
161
162   DP("RPC Receive: %s", param);
163
164   ip          = rh_string_get_sep(param, "|", 1);
165   mac_address = rh_string_get_sep(param, "|", 2);
166   cause       = rh_string_get_sep(param, "|", 3);
167   vserver_id  = rh_string_get_sep(param, "|", 4);
168
169   if (ip == NULL || vserver_id == NULL)
170     goto out;
171   vs = vserver_get_by_id(ms, atoi(vserver_id));
172
173   if (vs == NULL)
174     goto out;
175
176   if (mac_address == NULL)
177     mac_address = g_strdup(DEFAULT_MAC);
178
179   id = iptoid(vs->v_map, ip);
180
181   if (id < 0) {
182     *reply_string = g_strdup("Invalid IP Address");
183     goto cleanup;
184   }
185
186   parse_mac(mac_address, &ethernet);
187   memcpy(req.mac_address, &ethernet, ETH_ALEN);
188
189   member_node = member_get_node_by_id(vs, id);
190
191   if (member_node != NULL) {
192     member = (struct rahunas_member *) member_node->data;
193     if (memcmp(&ethernet, &member->mac_address, 
194         ETH_ALEN) == 0) {
195       req.id = id;
196       
197       if (cause == NULL) {
198         req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
199       } else {
200         cause_id = atoi(cause);
201         if (cause_id >= RH_RADIUS_TERM_USER_REQUEST && 
202             cause_id <= RH_RADIUS_TERM_HOST_REQUEST) {
203           req.req_opt = cause_id;
204         } else {
205           req.req_opt = RH_RADIUS_TERM_USER_REQUEST;
206         }
207       }
208
209       res = rh_task_stopsess(vs, &req);
210       if (res == 0) {
211         *reply_string = g_strdup_printf("Client IP %s was removed!", 
212                                           idtoip(vs->v_map, id));
213       } else {
214          *reply_string = g_strdup_printf("Client IP %s error remove!", 
215                                         idtoip(vs->v_map, id));
216       }
217       goto cleanup;
218     } 
219   }
220
221   *reply_string = g_strdup_printf("%s", ip);
222   goto cleanup;
223
224 out:
225   *reply_string = g_strdup("Invalid input parameters");
226   goto cleanup;
227
228 cleanup:
229   DP("RPC Reply: %s", *reply_string);
230   g_free(ip);
231   g_free(mac_address);
232   g_free(cause);
233   g_free(vserver_id);
234   return 0;
235 }
236
237 int do_getsessioninfo(GNetXmlRpcServer *server,
238                       const gchar *command,
239                       const gchar *param,
240                       gpointer user_data,
241                       gchar **reply_string)
242 {
243   struct main_server *ms = (struct main_server *)user_data;
244   struct vserver *vs = NULL;
245   gchar *ip = NULL;
246   gchar *vserver_id = NULL;
247   uint32_t   id;
248   GList *member_node = NULL;
249   struct rahunas_member *member = NULL;
250
251   if (param == NULL)
252     goto out;
253
254   DP("RPC Receive: %s", param);
255
256   ip          = rh_string_get_sep(param, "|", 1);
257   vserver_id  = rh_string_get_sep(param, "|", 2);
258
259   if (ip == NULL || vserver_id == NULL)
260     goto out;
261
262   vs = vserver_get_by_id(ms, atoi(vserver_id));
263
264   if (vs == NULL)
265     goto out;
266
267   id = iptoid(vs->v_map, ip);
268
269   if (id < 0) {
270     *reply_string = g_strdup("Invalid IP Address");
271     goto cleanup;
272   }
273
274   member_node = member_get_node_by_id(vs, id);
275
276   if (member_node != NULL) {
277     member = (struct rahunas_member *) member_node->data;
278     if (!member->username) {
279       *reply_string = g_strdup("Invalid Username");
280       goto cleanup;
281     }
282
283     if (!member->session_id) {
284       *reply_string = g_strdup("Invalid Session ID");
285       goto cleanup;
286     }
287     
288     *reply_string = g_strdup_printf("%s|%s|%s|%d|%s|%d", 
289                                     ip, 
290                                     member->username,
291                                     member->session_id,
292                                     member->session_start,
293                                     mac_tostring(member->mac_address),
294                                     member->session_timeout);
295     goto cleanup;
296   }
297
298   *reply_string = g_strdup_printf("%s", ip);
299   goto cleanup;
300
301 out:
302   *reply_string = g_strdup("Invalid input parameters");
303    goto cleanup;
304
305 cleanup:
306   DP("RPC Reply: %s", *reply_string);
307   g_free(ip);
308   g_free(vserver_id);
309   return 0;
310 }