static int _special_process(request *r, const char *mac, const char *redir_url) { t_offline_client *o_client = NULL; LOCK_OFFLINE_CLIENT_LIST(); o_client = offline_client_list_find_by_mac(mac); if(o_client == NULL) { o_client = offline_client_list_add(r->clientAddr, mac); } else { o_client->last_login = time(NULL); } UNLOCK_OFFLINE_CLIENT_LIST(); if(_is_apple_captive(r->request.host)) { unsigned int interval = time(NULL) - o_client->first_login; debug(LOG_INFO, "Into captive.apple.com hit_counts %d interval %d\n", o_client->hit_counts, interval); LOCK_OFFLINE_CLIENT_LIST(); o_client->hit_counts++; UNLOCK_OFFLINE_CLIENT_LIST(); if(o_client->client_type == 1 ) { if(o_client->hit_counts < 5 && interval < 30 ) http_send_js_redirect_ex(r, redir_url); else { http_send_apple_redirect(r, redir_url); } } else { LOCK_OFFLINE_CLIENT_LIST(); o_client->client_type = 1; UNLOCK_OFFLINE_CLIENT_LIST(); http_send_js_redirect_ex(r, redir_url); } return 1; } return 0; }
static int _special_process(request *r, const char *mac, const char *redir_url) { t_offline_client *o_client = NULL; if(_is_apple_captive(r->request.host)) { int interval = 0; LOCK_OFFLINE_CLIENT_LIST(); o_client = offline_client_list_find_by_mac(mac); if(o_client == NULL) { o_client = offline_client_list_add(r->clientAddr, mac); } else { o_client->last_login = time(NULL); interval = o_client->last_login - o_client->first_login; } debug(LOG_INFO, "Into captive.apple.com hit_counts %d interval %d http version %d\n", o_client->hit_counts, interval, r->request.version); o_client->hit_counts++; if(o_client->client_type == 1 ) { UNLOCK_OFFLINE_CLIENT_LIST(); if(interval > 20 && r->request.version == HTTP_1_0) { fw_set_mac_temporary(mac, 0); http_send_apple_redirect(r, redir_url); } else if(o_client->hit_counts > 2 && r->request.version == HTTP_1_0) http_send_apple_redirect(r, redir_url); else { http_send_redirect_to_auth(r, redir_url, "Redirect to login page"); } } else { o_client->client_type = 1; UNLOCK_OFFLINE_CLIENT_LIST(); http_relay_wisper(r); } return 1; } return 0; }
/* * @return A string containing human-readable status text. MUST BE free()d by caller */ char * get_status_text() { pstr_t *pstr = pstr_new(); s_config *config; t_auth_serv *auth_server; t_client *sublist, *current; int count; time_t uptime = 0; unsigned int days = 0, hours = 0, minutes = 0, seconds = 0; t_trusted_mac *p; t_offline_client *oc_list; pstr_cat(pstr, "WiFiDog status\n\n"); uptime = time(NULL) - started_time; days = (unsigned int)uptime / (24 * 60 * 60); uptime -= days * (24 * 60 * 60); hours = (unsigned int)uptime / (60 * 60); uptime -= hours * (60 * 60); minutes = (unsigned int)uptime / 60; uptime -= minutes * 60; seconds = (unsigned int)uptime; pstr_cat(pstr, "Version: " VERSION "\n"); pstr_append_sprintf(pstr, "Uptime: %ud %uh %um %us\n", days, hours, minutes, seconds); pstr_cat(pstr, "Has been restarted: "); if (restart_orig_pid) { pstr_append_sprintf(pstr, "yes (from PID %d)\n", restart_orig_pid); } else { pstr_cat(pstr, "no\n"); } pstr_append_sprintf(pstr, "Internet Connectivity: %s\n", (is_online()? "yes" : "no")); pstr_append_sprintf(pstr, "Auth server reachable: %s\n", (is_auth_online()? "yes" : "no")); pstr_append_sprintf(pstr, "Clients served this session: %lu\n\n", served_this_session); LOCK_CLIENT_LIST(); count = client_list_dup(&sublist); UNLOCK_CLIENT_LIST(); current = sublist; pstr_append_sprintf(pstr, "%d clients " "connected.\n", count); count = 1; while (current != NULL) { pstr_append_sprintf(pstr, "\nClient %d status [%d]\n", count, current->is_online); pstr_append_sprintf(pstr, " IP: %s MAC: %s\n", current->ip, current->mac); pstr_append_sprintf(pstr, " Token: %s\n", current->token); pstr_append_sprintf(pstr, " First Login: %lld\n", (long long)current->first_login); pstr_append_sprintf(pstr, " Name: %s\n", current->name != NULL?current->name:"null"); pstr_append_sprintf(pstr, " Downloaded: %llu\n Uploaded: %llu\n", current->counters.incoming, current->counters.outgoing); count++; current = current->next; } client_list_destroy(sublist); LOCK_OFFLINE_CLIENT_LIST(); pstr_append_sprintf(pstr, "%d clients " "unconnected.\n", offline_client_number()); oc_list = client_get_first_offline_client(); while(oc_list != NULL) { pstr_append_sprintf(pstr, " IP: %s MAC: %s Last Login: %lld Hit Counts: %d Client Type: %d Temp Passed: %d\n", oc_list->ip, oc_list->mac, (long long)oc_list->last_login, oc_list->hit_counts, oc_list->client_type, oc_list->temp_passed); oc_list = oc_list->next; } UNLOCK_OFFLINE_CLIENT_LIST(); config = config_get_config(); LOCK_CONFIG(); if (config->trustedmaclist != NULL) { pstr_cat(pstr, "\nTrusted MAC addresses:\n"); for (p = config->trustedmaclist; p != NULL; p = p->next) { pstr_append_sprintf(pstr, " %s\n", p->mac); } } pstr_cat(pstr, "\nAuthentication servers:\n"); for (auth_server = config->auth_servers; auth_server != NULL; auth_server = auth_server->next) { pstr_append_sprintf(pstr, " Host: %s (%s)\n", auth_server->authserv_hostname, auth_server->last_ip); } UNLOCK_CONFIG(); return pstr_to_string(pstr); }