Added parameters for allowed hosts and networks
authorAndreas Tonnesen <andreto@olsr.org>
Wed, 29 Dec 2004 19:55:54 +0000 (19:55 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Wed, 29 Dec 2004 19:55:54 +0000 (19:55 +0000)
lib/httpinfo/Makefile
lib/httpinfo/README_HTTPINFO
lib/httpinfo/src/olsrd_httpinfo.c
lib/httpinfo/src/olsrd_plugin.c
lib/httpinfo/src/olsrd_plugin.h

index 78ead8d..ff79cbd 100644 (file)
@@ -13,7 +13,7 @@ LIBDIR ?= $(INSTALL_PREFIX)/usr/lib
 ifeq ($(OS), linux)
 NAME ?= olsrd_httpinfo.so.0.1
 NAMEFLAGS ?= -Wl,-soname,$(NAME)
-CFLAGS ?= -g -O2 -Dlinux -Wall -Wmissing-prototypes -Wstrict-prototypes
+CFLAGS ?= -g -O2 -fPIC -Dlinux -Wall -Wmissing-prototypes -Wstrict-prototypes
 LDFLAGS ?= -fPIC -shared
 LIBS ?= -lc -lm
 INSTALL_LIB =  install -D -m 755 $(NAME) $(LIBDIR)/$(NAME);\
@@ -22,7 +22,7 @@ else
 ifeq ($(OS), win32)
 NAME ?= olsrd_httpinfo.dll
 NAMEFLAGS ?= -o $(NAME)
-CFLAGS ?= -g -O2 -DWIN32 -mno-cygwin -I../../src/win32 -Wall -Wmissing-prototypes -Wstrict-prototypes
+CFLAGS ?= -g -O2 -fPIC -DWIN32 -mno-cygwin -I../../src/win32 -Wall -Wmissing-prototypes -Wstrict-prototypes
 LDFLAGS ?= -mno-cygwin -shared
 LIBS ?= -lws2_32
 COMPATOBJ = ../../src/win32/compat.o
index d9af99c..e9a1ea1 100644 (file)
@@ -1,16 +1,43 @@
 HTTP MINI-SERVER PLUGIN FOR OLSRD 0.1
 by Andreas T√łnnesen(andreto@olsr.org)
 
+ ABOUT
+
 This plugin implements a tiny HTTP server that
 will gespond to a GET request by returning a HTML
 formatted page contanin various information about
 the currently running olsrd process.
 
-The plugin takes one parameter "Port" to set the
-TCP port on which the server is to run. It defaults
-to 8080.
+ PARAMETERS
+
+The plugin takes the parameter "Port" "[portnumber]" 
+to set the TCP port on which the server is to run. 
+It defaults to 8080.
 Now remember to open this port in your firewall if 
 planning to access the HTTP server from a remote host!
+The parameter "Host" "[IP address]" is used to allow
+access from a single host(muliple such entries can
+be set) and the parameter "Net" "[IP net] [IP mask]"
+is used to allow access from entire net-ranges.
+To allow access from all hosts do:
+ PlParam   "0.0.0.0" "0.0.0.0"
+
+A configuration example:
+LoadPlugin "olsrd_httpinfo.so.0.1"
+{
+    PlParam     "port"   "80"
+    PlParam     "Host"   "163.24.87.3"
+    PlParam     "Host"   "80.23.53.22"
+    PlParam     "Net"    "10.0.0.0 255.0.0.0"
+    PlParam     "Net"    "192.168.0.0 255.255.0.0"
+}
+
+This will run the webserver on port 80(the normal
+HTTP port) and allow access from the hosts 163.24.87.3
+and 80.23.53.22 and the networks 10.0.0.0/8 and
+192.168.0.0/16.
+access is always allowed from 127.0.0.1(localhost).
+
 
 NOTE!
 If running olsrd 0.4.8, the plugin will not be able
index 40590ff..5e92193 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_httpinfo.c,v 1.24 2004/12/28 20:32:51 kattemat Exp $
+ * $Id: olsrd_httpinfo.c,v 1.25 2004/12/29 19:55:54 kattemat Exp $
  */
 
 /*
@@ -99,6 +99,9 @@ build_mid_body(char *, olsr_u32_t);
 char *
 sockaddr_to_string(struct sockaddr *);
 
+olsr_bool
+check_allowed_ip(union olsr_ip_addr *);
+
 static struct timeval start_time;
 static struct http_stats stats;
 static int client_sockets[MAX_CLIENTS];
@@ -207,6 +210,13 @@ parse_http_request(int fd)
       goto close_connection;
     }
 
+  if(!check_allowed_ip((union olsr_ip_addr *)&pin.sin_addr.s_addr))
+    {
+      olsr_printf(1, "HTTP request from non-allowed host %s!\n", 
+                 olsr_ip_to_string((union olsr_ip_addr *)&pin.sin_addr.s_addr));
+      close(client_sockets[curr_clients]);
+    }
+
   addr = inet_ntoa(pin.sin_addr);
 
 
@@ -897,6 +907,37 @@ build_mid_body(char *buf, olsr_u32_t bufsize)
   return size;
 }
 
+
+
+olsr_bool
+check_allowed_ip(union olsr_ip_addr *addr)
+{
+  struct allowed_host *allh = allowed_hosts;
+  struct allowed_net *alln = allowed_nets;
+
+  if(addr->v4 == ntohl(INADDR_LOOPBACK))
+    return OLSR_TRUE;
+
+  /* check hosts */
+  while(allh)
+    {
+      if(addr->v4 == allh->host.v4)
+       return OLSR_TRUE;
+      allh = allh->next;
+    }
+
+  /* check nets */
+  while(alln)
+    {
+      if((addr->v4 & alln->mask.v4) == (alln->net.v4 & alln->mask.v4))
+       return OLSR_TRUE;
+      alln = alln->next;
+    }
+
+  return OLSR_FALSE;
+}
+
+
 /**
  *Converts a olsr_ip_addr to a string
  *Goes for both IPv4 and IPv6
index ac09096..a535dd8 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_plugin.c,v 1.6 2004/12/19 17:16:24 kattemat Exp $
+ * $Id: olsrd_plugin.c,v 1.7 2004/12/29 19:55:54 kattemat Exp $
  */
 
 /*
@@ -129,6 +129,61 @@ register_olsr_param(char *key, char *value)
      http_port = atoi(value);
      printf("(HTTPINFO) listening on port: %d\n", http_port);
     }
+
+  if(!strcmp(key, "host") || !strcmp(key, "Host"))
+    {
+      struct in_addr in;
+      struct allowed_host *ah;
+      
+      if(inet_aton(value, &in) == 0)
+       return 0;
+
+      ah = malloc(sizeof(struct allowed_host));
+      if(!ah)
+       {
+         fprintf(stderr, "(HTTPINFO) register param host out of memory!\n");
+         exit(0);
+       }
+      ah->host.v4 = in.s_addr;
+      ah->next = allowed_hosts;
+      allowed_hosts = ah;
+      return 1;
+    }
+
+  if(!strcmp(key, "net") || !strcmp(key, "Net"))
+    {
+      struct in_addr net, mask;
+      struct allowed_net *an;
+      char sz_net[100], sz_mask[100]; /* IPv6 in the future */
+
+      if(sscanf(value, "%100s %100s", sz_net, sz_mask) != 2)
+       {
+         olsr_printf(1, "(HTTPINFO) Error parsing net param \"%s\"!\n", value);
+         return 0;
+       }
+
+      if(inet_aton(sz_net, &net) == 0)
+       return 0;
+
+      if(inet_aton(sz_mask, &mask) == 0)
+       return 0;
+
+      an = malloc(sizeof(struct allowed_net));
+      if(!an)
+       {
+         fprintf(stderr, "(HTTPINFO) register param net out of memory!\n");
+         exit(0);
+       }
+
+      an->net.v4 = net.s_addr;
+      an->mask.v4 = mask.s_addr;
+
+      an->next = allowed_nets;
+      allowed_nets = an;
+      return 1;
+      
+    }
+
   return 1;
 }
 
index fb0258c..dc5f52b 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_plugin.h,v 1.7 2004/12/28 20:32:51 kattemat Exp $
+ * $Id: olsrd_plugin.h,v 1.8 2004/12/29 19:55:54 kattemat Exp $
  */
 
 /*
@@ -141,6 +141,22 @@ union hna_netmask
 #define MAXIFS         8 /* Maximum number of interfaces (from defs.h) in uOLSRd */
 
 
+struct allowed_host
+{
+  union olsr_ip_addr       host;
+  struct allowed_host     *next;
+};
+
+struct allowed_net
+{
+  union olsr_ip_addr       net;
+  union olsr_ip_addr       mask;
+  struct allowed_net      *next;
+};
+
+struct allowed_host   *allowed_hosts;
+struct allowed_net    *allowed_nets;
+
 
 /*
  * Neighbor structures