Esempio n. 1
0
/*===========================================================================
 *===========================================================================*/
void
display_adapters(struct mg_connection *c, const struct mg_request_info *ri, void *user_data)
{
	struct Squirrel *squirrel = (struct Squirrel *)user_data;
	char errbuf[1024];
	unsigned interface_channel = 0;
	char *action = mg_get_var(c, "action");

	pixie_enter_critical_section(squirrel->cs);

	/* If a CGI request was sent to change an adapter status, then do that change */
	if (action)
		; //change_adapter_status(

	mg_headers_ok(c, "text/html");
	X(c, "Connection: close\r\n");
	X(c, "\r\n");

	//X(c, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\r\n");
	X(c,"<html>\n");
	X(c,"<head>\n");
	X(c," <title>Squirrel WiFi monitor / Adapters</title>\n");
	X(c," <link rel=\"stylesheet\" type=\"text/css\" href=\"squirrel.css\" />\n");
	X(c," <link rel=\"Shortcut Icon\" href=\"favicon.ico\" type=\"image/x-icon\">\n");
	X(c,"</head>\n");
	X(c,"<body>\n");


	display_topmenu(c, ri, user_data, 0);

	if (!pcap.is_available) {
		X(c, "<h1>ERROR: no libpcap</h1>\n");
		X(c, " On Unix, install libpcap from tcpdump site. On Windows, instal WinPcap from WinDump site.\n");
		goto _return;
	} else if (pcap.findalldevs(&alldevs, errbuf) == -1) {
		X(c, "<h1>ERROR: no adapters found</h1>\n");
		X(c, "<p>%s</p>\n", errbuf);
		X(c, "<p>Make sure you have root/administrator privileges</p>\n");
		goto _return;
	} else if (alldevs == NULL) {
		X(c, "<h1>ERROR: no adapters found</h1>\n");
		X(c, "<p>Make sure you have root/administrator privileges</p>\n");
		goto _return;
	} else {
		pcap_if_t *d;
		unsigned i=0;

		/* Print the list */
		X(c, "<table class=\"bssids\">\n");
		X(c, " <tr><th>Index</th><th>Name</th><th>Driver</th><th>Description</th><th>Monitor</th><th>Channel</th></tr>\n");
		for(d=alldevs; d; d=d->next)
		{
			const char *driver = "";
			if (strstr(d->name, "\\airpcap")) {
				driver = "airpcap";
			} else {
				driver = "airpcap";
			}
			++i;
			X(c, " <tr>\n");
			X(c, "  <td class=\"index\"><a href=\"monitor.php?index=%d\">%d</a></td>\n", i, i);
			X(c, "  <td><a href=\"adapter/%s.html\">%s</td>\n", d->name, d->name);
			if (strstr(d->name, "\\airpcap")) {
				X(c, "  <td>airpcap</td>\n\n");  
			} else {
				X(c, "  <td>ndis</td>\n");  
			}
			if (d->description)
				X(c, "  <td>%s</td>\n", d->description);
			else
				X(c, "  <td>%s</td>\n", "");
	
			if (squirrel_get_interface_status(squirrel, d->name, &interface_channel)) {
				X(c, "  <td id=\"status\">"
						"<form action=\"/adapters.html\">"
						"<input type=\"hidden\" name=\"adapter\" value=\"%s\">"
						"<input type=\"submit\" name=\"action\" value=\"Stop\">"
						"</form></td>\n", d->name);
				if (interface_channel == 0)
					X(c, "  <td id=\"channel\">%s</td>\n", "");
				else if (interface_channel == (unsigned)-1)
					X(c, "  <td id=\"channel\">%s</td>\n", "scan");
				else
					X(c, "  <td id=\"channel\">%u</td>\n", interface_channel);

			} else {
				X(c, "  <td id=\"status\">"
						"<form action=\"/adapters.html\">"
						"<input type=\"hidden\" name=\"adapter\" value=\"%s\">"
						"<input type=\"submit\" name=\"action\" value=\"Start\">"
						"</form></td>\n", d->name);
					X(c, "  <td id=\"channel\">%s</td>\n", "");
			}

		}
		X(c, "</table>\n");
	}
_return:
	pixie_leave_critical_section(squirrel->cs);
}
Esempio n. 2
0
/*===========================================================================
 *===========================================================================*/
void
display_station_item(struct mg_connection *c, const struct mg_request_info *ri, void *user_data)
{
	struct SQDB *sqdb = (struct SQDB*)user_data;
	unsigned char mac_address[6];
	char mac_address_str[16];
	char buf[64];
    struct TMP_STATIONS *stations = NULL;
    unsigned station_count = 0;
    unsigned i;

	if (strstr(ri->uri, ".xml")) {
		xml_station_item(c, ri, user_data);
		return;
	}
	pixie_enter_critical_section(sqdb->cs);

	if (memcmp(ri->uri, "/station/", 9) != 0) {
		mg_printf(c, "404 Not Found\r\nConnection: closed\r\n\r\n");
		goto _return;
	}

	/*
	 * Lookup this BSSID entry
	 */
	parse_mac_address(mac_address, sizeof(mac_address), ri->uri+strlen("/station/"));
	stations = sqdb_find_station(sqdb, mac_address, &station_count);
	if (stations == 0 || station_count == 0) {
		mg_printf(c, "404 Not Found\r\nConnection: closed\r\n\r\n");
		goto _return;
	}


	
	sprintf_s(mac_address_str, sizeof(mac_address_str), "%02x%02x%02x%02x%02x%02x", 
					mac_address[0],mac_address[1],mac_address[2],
					mac_address[3],mac_address[4],mac_address[5]
					);

	mg_headers_ok(c, "text/html");
	X(c, "Connection: close\r\n");
	X(c, "\r\n");

	//X(c, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\r\n");
	X(c,"<html>\n");
	X(c,"<head>\n");
	X(c," <title>Squirrel WiFi monitor</title>\n");
	X(c," <link rel=\"stylesheet\" type=\"text/css\" href=\"../squirrel.css\" />\n");
	X(c," <link rel=\"Shortcut Icon\" href=\"../favicon.ico\" type=\"image/x-icon\">\n");
	X(c," <script type=\"text/javascript\" src=\"../squirrel.js\"></script>\n");
	X(c, "<script type=\"text/javascript\">var bssid_item_address = '%s';</script>\n", mac_address_str);
	X(c,"</head>\n");
	X(c,"<body onLoad=\"setInterval(refresh_station_item,1000)\">\n");

	display_topmenu(c, ri, user_data, 1);

    for (i=0; i<station_count; i++) {
        struct TMP_STATIONS *tmp = &stations[i];

        /*
         * ASSOCIATED station
         */
        if (tmp->type == 2) {
            struct SQDB_SubStation *sta = tmp->sta.associated;
            struct SQDB_AccessPoint *ap = tmp->sta.accesspoint;

	        X(c, "<table id=\"station\" class=\"station\">\n");
            X(c, "  <tr id=\"0\"><th colspan=\"6\" class=\"title\">ASSOCIATED STATION</th></tr>\n");
	        X(c, "  <tr id=\"1\">\n");
	        X(c, "   <th>MAC:</th><td id=\"mac\" class=\"mac\">[%02x:%02x:%02x:%02x:%02x:%02x]</td>\n",
					        mac_address[0],mac_address[1],mac_address[2],
					        mac_address[3],mac_address[4],mac_address[5],
					        mac_address[0],mac_address[1],mac_address[2],
					        mac_address[3],mac_address[4],mac_address[5]
					        );
	        X(c, "   <th>Data Sent:</th><td id=\"dataout\" class=\"sent\">%s</td>\n", format_unsigned(sta->data_sent,buf,sizeof(buf)));
	        X(c, "   <th>Data Recv:</th><td id=\"datain\" class=\"sent\">%s</td>\n", format_unsigned(sta->data_received,buf,sizeof(buf)));
	        X(c, "  </tr>\n");
	        X(c, "  <tr id=\"2\">\n");
	        X(c, "   <th>SSID:</th><td id=\"essid\" class=\"essid\"><a href=\"/bssid/%02x%02x%02x%02x%02x%02x.html\">%.*s</a></td>\n", 
                ap->bssid[0], ap->bssid[1], ap->bssid[2], 
                ap->bssid[3], ap->bssid[4], ap->bssid[5], 
                ap->ssid.length, ap->ssid.value);
	        X(c, "   <th>Ctrl Sent:</th><td id=\"ctrlout\" class=\"sent\">%s</td>\n", format_unsigned(sta->ctrl_sent,buf,sizeof(buf)));
	        X(c, "   <th>Ctrl Recv:</th><td id=\"ctrlin\" class=\"sent\">%s</td>\n", format_unsigned(sta->ctrl_received,buf,sizeof(buf)));
	        X(c, "  </tr>\n");
	        X(c, "  <tr id=\"4\">\n");
	        X(c, "   <th>BSSID:</th><td id=\"bssid\" class=\"bssid\"><a href=\"/bssid/%02x%02x%02x%02x%02x%02x.html\">%02x:%02x:%02x:%02x:%02x:%02x</a></td>\n", 
                ap->bssid[0], ap->bssid[1], ap->bssid[2], 
                ap->bssid[3], ap->bssid[4], ap->bssid[5], 
                ap->bssid[0], ap->bssid[1], ap->bssid[2], 
                ap->bssid[3], ap->bssid[4], ap->bssid[5]
                );
	        X(c, "   <th>Power:</th><td id=\"power\" class=\"power\">%s</td>\n", format_signed(sta->dbm,buf,sizeof(buf)));
	        X(c, "   <th>Channels:</th><td id=\"channels\" class=\"channels\">");
	        {
		        unsigned j;
		        for (j=0; j<ap->channel_count; j++) {
			        X(c, "%u%c", ap->channels[j], (j+1<ap->channel_count?',':' '));
		        }
	        }
            X(c, "</td>\n");
	        X(c, "  </tr>\n");
	        X(c, "  <tr id=\"6\">\n");
	        X(c, "   <th>MANUF:</th><td id=\"manuf\" class=\"manuf\">%s</td>\n", manuf_from_mac(mac_address));
	        X(c, "   <th>Desc:</th><td id=\"manuf2\" class=\"manuf2\" colspan=\"3\">%s</td>\n", manuf2_from_mac(mac_address));
	        X(c, "  </tr>\n");
	        X(c, "  <tr id=\"7\">\n");
	        X(c, "   <th>Info:</th><td id=\"manuf\" class=\"manuf\" colspan=\"5\">\n");
            {
                struct NVPair *nv = sta->data;
                while (nv) {
                    X(c, "    %s = %s<br/>\n", nv->name, nv->value);
                    nv = nv->next;
                }
            }
            X(c, "   </th>\n");
	        X(c, "  </tr>\n");
	        X(c, "</table><br/>\n");
        }

        if (tmp->type == 1) {
            struct SQDB_Station *sta = tmp->sta.unassociated;

	        X(c, "<table id=\"station\" class=\"station\">\n");
            X(c, "  <tr id=\"0\"><th colspan=\"6\" class=\"title\">UNASSOCIATED PROBER</th></tr>\n");
	        X(c, "  <tr id=\"1\">\n");
	        X(c, "   <th>MAC:</th><td id=\"mac\" class=\"mac\">[%02x:%02x:%02x:%02x:%02x:%02x]</td>\n",
					        mac_address[0],mac_address[1],mac_address[2],
					        mac_address[3],mac_address[4],mac_address[5],
					        mac_address[0],mac_address[1],mac_address[2],
					        mac_address[3],mac_address[4],mac_address[5]
					        );
	        X(c, "   <th>Probes:</th><td id=\"dataout\" class=\"sent\">%s</td>\n", format_unsigned(sta->probe_count,buf,sizeof(buf)));
	        X(c, "   <th>Responses:</th><td id=\"datain\" class=\"sent\">%s</td>\n", format_unsigned(0,buf,sizeof(buf)));
	        X(c, "  </tr>\n");
	        X(c, "  <tr id=\"7\">\n");
	        X(c, "   <th>SSIDs:</th><td id=\"essid\" class=\"essid\" colspan=\"5\">\n");
            {
                struct EntrySSID *s;
                for (s=&sta->ssid; s; s = s->next) {
                    char defanged[1024];
                    defang_ssid(defanged, sizeof(defanged), (const char*)s->ssid.value, s->ssid.length);
                    X(c, "%s<br/>", defanged);
                }
            }
            X(c, "   </th>\n");
	        X(c, "  </tr>\n");
	        X(c, "</table><br/>\n");
        }
    }

	X(c,	"</body>\n"
			"</html>\n"
			);

_return:
	pixie_leave_critical_section(sqdb->cs);
    if (stations)
        free(stations);
}
Esempio n. 3
0
/*===========================================================================
 *===========================================================================*/
void
display_adapter(struct mg_connection *c, const struct mg_request_info *ri, void *user_data)
{
	struct Squirrel *squirrel = (struct Squirrel *)user_data;
	char adapter_name[256];
	char description[256];
	unsigned exists;
	const char *driver = "";
	unsigned interface_channel = 0;

	pixie_enter_critical_section(squirrel->cs);

	if (memcmp(ri->uri, "/adapter/", 9) != 0) {
		mg_printf(c, "404 Not Found\r\nConnection: closed\r\n\r\n");
		goto _return;
	} else
		sprintf_s(adapter_name, sizeof(adapter_name), "%s", ri->uri+9);

	if (strlen(adapter_name) > 5 && memcmp(adapter_name+strlen(adapter_name)-5, ".html", 5) == 0)
		adapter_name[strlen(adapter_name)-5] = '\0';
	if (strlen(adapter_name) > 7 && memcmp(adapter_name, "airpcap", 7) == 0 && strlen(adapter_name) < sizeof(adapter_name)-5) {
		memmove(adapter_name+4, adapter_name, strlen(adapter_name)+1);
		memcpy(adapter_name, "\\\\.\\", 4);
	}

	exists = adapter_description(adapter_name, description, sizeof(description));
	if (!exists) {
		mg_printf(c, "404 Not Found\r\nConnection: closed\r\n\r\n");
		goto _return;
	}
	if (strstr(adapter_name, "\\airpcap")) {
		driver = "airpcap";
	} else {
		driver = "ndis";
	}

	mg_headers_ok(c, "text/html");
	X(c, "Connection: close\r\n");
	X(c, "\r\n");

	//X(c, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\r\n");
	X(c,"<html>\n");
	X(c,"<head>\n");
	X(c," <title>Squirrel WiFi monitor / Adapter</title>\n");
	X(c," <link rel=\"stylesheet\" type=\"text/css\" href=\"../squirrel.css\" />\n");
	X(c," <link rel=\"Shortcut Icon\" href=\"../favicon.ico\" type=\"image/x-icon\">\n");
	X(c,"</head>\n");
	X(c,"<body>\n");

	display_topmenu(c, ri, user_data, 0);

	/*
	 * Do any necessary changes
	 */
	{
		char *status = mg_get_var(c, "status");
		char *channel = mg_get_var(c, "channel");

		if (status && channel) {
			unsigned is_running = squirrel_get_interface_status(squirrel, adapter_name, &interface_channel);
			unsigned new_channel;
			if (strcmp(channel, "scan") == 0)
				new_channel = (unsigned)-1;
			else if (isdigit(channel[0]))
				new_channel = atoi(channel);
			else
				new_channel = 0;

			if (is_running && strcmp(status, "monitor") != 0) {
				/* Turn off the adapter */
				squirrel_set_interface_status(squirrel, adapter_name, 0, 0);
				X(c, "<b>Turned off adapter</b>\n");
			} else if (!is_running && strcmp(status, "monitor") == 0) {
				launch_thread(squirrel, adapter_name);
				squirrel_set_interface_status(squirrel, adapter_name, 1, new_channel);
				X(c, "<b>Turned on adapter, channel %u</b>\n", new_channel);
			} else if (is_running && interface_channel != new_channel) {
				squirrel_set_interface_status(squirrel, adapter_name, 1, new_channel);
				X(c, "<b>Changed channel to %u</b>\n", new_channel);
			} else
				X(c, "<b>Nothing changed</b>\n");
		}
		if (status)
			free(status);
		if (channel)
			free(channel);
	}

	X(c, "<table class=\"adapter\">\n");
	X(c, "  <tr><th>Adapter:</th><td>%s</td></tr>\n", adapter_name);
	X(c, "  <tr><th>Description:</th><td>%s</td></tr>\n", description);
	X(c, "  <tr><th>Driver:</th><td>%s</td></tr>\n", driver);
	X(c, "  <tr><th>Monitor Mode:</th><td>%s</td></tr>\n", can_monitor_mode(adapter_name)?"yes":"no");
	X(c, "  <tr><th>Can Transmit:</th><td>%s</td></tr>\n", can_transmit(adapter_name)?"yes":"no");


	if (squirrel_get_interface_status(squirrel, adapter_name, &interface_channel)) {
		X(c, "  <tr><th>Status:</th><td>%s</td></tr>\n", "monitoring");
		if (interface_channel == 0)
			X(c, "  <tr><th>Channel:</th><td>%s</td></tr>\n", "");
		else if (interface_channel == (unsigned)-1)
			X(c, "  <tr><th>Channel:</th><td>%s</td></tr>\n", "scan");
		else
			X(c, "  <tr><th>Channel:</th><td>%u</td></tr>\n", interface_channel);

	} else {
		X(c, "  <tr><th>Status:</th><td>%s</td></tr>\n", "off");
		X(c, "  <tr><th>Channel:</th><td>%s</td></tr>\n", "");
	}
	X(c, "</table>\n");

	X(c, "<hr/>\n");
	X(c, "<form action=\"%s.html\">\n", adapter_name);
	X(c, " <input type=\"radio\" name=\"status\" value=\"monitor\" /> Monitor<br/>\n");
	X(c, " <input type=\"radio\" name=\"status\" value=\"off\" /> Off<br/>\n");
	X(c, " Channel: <input type=\"text\" name=\"channel\" value=\"scan\"/><br/>\n");
	X(c, " <input type=\"submit\" value=\"Submit\">\n");
	X(c, "</form>\n");

_return:
	pixie_leave_critical_section(squirrel->cs);
}