分类 wifidog源码 下的文章

wifidog如何判断用户不在线?

wifidog如何判断用户不在线?

    if (p1->counters.last_updated +
                        (config->checkinterval * config->clienttimeout)
                        <= current_time) {
        /* Timing out user */
        debug(LOG_INFO, "%s - Inactive for more than %ld seconds, removing client and denying in firewall",
                p1->ip, config->checkinterval * config->clienttimeout);
        fw_deny(p1->ip, p1->mac, p1->fw_connection_state);
        client_list_delete(p1);

        /* Advertise the logout if we have an auth server */
        if (config->auth_servers != NULL) {
                                UNLOCK_CLIENT_LIST();
                                auth_server_request(&authresponse, REQUEST_TYPE_LOGOUT, ip, mac, token, 0, 0, session_id);
                                LOCK_CLIENT_LIST();
        }

wifidog发送logout 请求的地方一个是客户端主动触发wifidog下线请求,另一个就在上述代码所述。
这段代码主要是用来判断客户端是否在一定时间内没上网,如果是,wifidog会将其踢出,然后告诉服务器这个客户端已经下线了。

这里可以改成客户端连接一段时间后再踢下线,同样可以改成发现用户没有连接路由器直接踢下线,后者需要用到arp 包来ping 客户端,前者只要在客户端连接之后加个上线时间再在上述代码的if 判断处改成当前时间减去上线时间即可。

本文章由 http://www.wifidog.pro/2015/03/25/wifidog%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E7%94%A8%E6%88%B7%E4%B8%8D%E5%9C%A8%E7%BA%BF.html 整理编辑,转载请注明出处

wifidog认证服务器Wiwiz Auth API集成示例代码(Java/JSP版)

<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>

<%@ page import="java.net.URL"%>
<%@ page import="java.net.URLConnection"%>
<%@ page import="java.net.URLEncoder"%>

<%
String userkey = "246DD22C084BB40E";    // 替换为你的User Key

//****************************************************
// 取得接收到的传入参数
//****************************************************

String pTokencode = request.getParameter("tokencode");  // 接收到的传入参数"tokencode"
String pSrvurl = request.getParameter("srvurl");        // 接收到的传入参数"srvurl"


/* 如必要,把传入参数存放于Session对象中 */
if(pTokencode != null)
    session.setAttribute("tokencode", pTokencode);
if(pSrvurl != null) 
    session.setAttribute("srvurl", pSrvurl);
%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Language" content="zh">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<title> Wiwiz Auth API使用示例 </title>
</head>
<body>

<form method="post">

用户名: <input type="text" name="username" />
<br>

密码: <input type="password" name="pswd" />
<br>

<input type="submit" name="login" value="登录" />

<%
if(request.getParameter("login") != null) { // "登录"按钮按下后的处理

    //****************************************************
    // 第1步. 根据您的具体需要或业务,进行用户登录验证处理
    //****************************************************

    boolean loginSuccess = false;
    //
    // 根据系统自身的业务需求进行自己的账户验证/登录验证等处理
    //  ......
    //

    loginSuccess = true; // 这里假设用户登录已验证

    if(loginSuccess == false) {

        out.println("登录失败!");   // 如果登录失败则报错

    } else {

        //****************************************************
        // 第2步. 调用Wiwiz Auth API,进行预认证
        // 重要: 请在服务器端的程序中进行此处理(例如,ASP、C#、JSP/Servet、PHP...),
        //      而不要在直接客户端代码中进行此处理(例如,HTML/Javascript)
        //****************************************************

        // 参数 "action" : 必须!
        // 设置为"1"将使用户认证成功
        // 设置为"0"将使用户认证失败
        String action = "1";

        // 参数 "tokencode": 必须!
        // 设置与同名传入参数相同的值
        String tokencode = (String) session.getAttribute("tokencode");

        // 参数 "srvurl": 必须!
        // 设置与同名传入参数相同的值
        String srvurl = (String) session.getAttribute("srvurl");

        // 参数 "endtime" : 可选
        // 格式: yyyy-mm-dd hh:MM:ss  例如: 2012-05-31 21:39:00
        // 设置此参数将使用户的Internet连接在指定时间关闭
        // 注意: 对此参数的值必须进行url编码  
        String endtime = URLEncoder.encode("2012-05-31 21:39:00", "utf-8");

        // 参数 "postauth" : 可选
        // 例如: http://www.YourDomain.com
        // 设置此参数将设置用户在通过认证后显示的页面地址
        // 注意: 对此参数的值应进行url编码   
        String postauth = "http://www.wiwiz.com";

        String parameters =
                "wiwiz_auth_api=1&ver=1.0"+ // 参数 "wiwiz_auth_api" 与 "ver". 固定值
                "&tokencode="+ tokencode +  // 参数 "tokencode". 设置方法参考上面的说明
                "&userkey="+ userkey +      // 参数 "userkey". 设置方法参考上面的说明
                "&action="+ action +        // 参数 "action". 设置方法参考上面的说明
                "&endtime="+ endtime +      // 参数 "endtime". 设置方法参考上面的说明
                "&postauth="+ postauth;     // 参数 "postauth". 设置方法参考上面的说明

        URL u = new URL(srvurl);            // 使用传入参数"srvurl"的值作为请求地址
        URLConnection uc = u.openConnection();
        uc.setDoOutput(true);
        uc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        PrintWriter pw = new PrintWriter(uc.getOutputStream());
        pw.println(parameters);
        pw.close();

        BufferedReader in = new BufferedReader(
        new InputStreamReader(uc.getInputStream()));
        String verifycode = in.readLine();  // 获取verifycode,即Wiwiz服务端返回的验证结果
        in.close();

        String userstring = "username:" + request.getParameter("username"); // 设置自定义追踪信息(可选),本例中设为用户名

        if(verifycode.startsWith("ERR")) {
            // 如果报错,则显示错误代码
            out.println("Error: "+ verifycode);

        } else {
            // 如没有报错则进行第3步。

            //****************************************************
            // 第3步. 调用Wiwiz Auth API,完成认证
            //****************************************************  
            String redirectUrl = srvurl +           // 使用传入参数"srvurl"的值作为跳转地址的前缀
                    "?wiwiz_auth_api_login=1"+      // 参数 "wiwiz_auth_api_login",固定值
                    "&tokencode="+ tokencode +      // 参数 "tokencode",设置与同名传入参数相同的值
                    "&verifycode="+ verifycode +    // 参数 "verifycode",Wiwiz服务端返回的验证结果
                    "&userstring=" + userstring;    // 参数 "userstring"(可选),用户设置的自定义追踪信息

            response.sendRedirect(redirectUrl); // 最后,进行跳转
        }
    }
}
%>

</form>

</body>
</html>

本文章由 http://www.wifidog.pro/2015/03/20/wifidog%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8java-jsp%E7%89%88.html 整理编辑,转载请注明出处

WifiDog 配置参数视频详解

GatewayID default 

GatewayInterface br0
#GatewayAddress 192.168.1.1
GatewayPort 2060

HtmlMessageFile /opt/wifidog/etc/wifidog.html


AuthServer {
    Hostname                 www.wifidog.pro (Mandatory; Default: NONE) 
    SSLAvailable             no (Optional; Default: no; Possible values: yes, no)
    SSLPort                  443 (Optional; Default: 443)
    HTTPPort                 80 (Optional; Default: 80)
    Path                     /example/ (Optional; Default: /wifidog/ Note:  The path must be both prefixed and suffixed by /.  Use a single / for server root.)
    LoginScriptPathFragment  (Optional; Default: login/? Note:  This is the script the user will be sent to for login.)
    PortalScriptPathFragment (Optional; Default: portal/? Note:  This is the script the user will be sent to after a successfull login.)
    MsgScriptPathFragment    (Optional; Default: gw_message.php? Note:  This is the script the user will be sent to upon error to read a readable message.)
    PingScriptPathFragment    (Optional; Default: ping/? Note:  This is the script the user will be sent to upon error to read a readable message.)
    AuthScriptPathFragment    (Optional; Default: auth/? Note:  This is the script the user will be sent to upon error to read a readable message.)
}

AuthServer {
    Hostname auth.wifidog.pro
    SSLAvailable yes
    Path /
}

AuthServer {
    Hostname auth2.wifidog.pro
    SSLAvailable yes
    Path /
}


Daemon 1 


HTTPDMaxConn 10 


CheckInterval 60

ClientTimeout 5


TrustedMACList 00:00:DE:AD:BE:AF,00:00:C0:1D:F0:0D


FirewallRuleSet global {

    FirewallRule block to 192.168.0.0/16
    FirewallRule block to 10.0.0.0/8
    FirewallRule allow udp to 69.90.85.0/27
    FirewallRule allow tcp port 80 to 69.90.89.205

}


FirewallRuleSet validating-users {
    FirewallRule allow to 0.0.0.0/0
}


FirewallRuleSet known-users {
    FirewallRule allow to 0.0.0.0/0
}


FirewallRuleSet unknown-users {
    FirewallRule allow udp port 53
    FirewallRule allow tcp port 53
    FirewallRule allow udp port 67
    FirewallRule allow tcp port 67
}

FirewallRuleSet locked-users {
    FirewallRule block to 0.0.0.0/0
}

本文章由http://www.wifidog.pro/2015/03/19/WifiDog%E9%85%8D%E7%BD%AE%E5%8F%82%E6%95%B0%E8%A7%86%E9%A2%91%E8%AF%A6%E8%A7%A3.html整理编辑,转载请注明出处

如何制作自定义wifidog认证页面

本文是新版的关于如何制作自定义认证页面的指南。此新版指南对制作自定义认证页面的方法做了很大的简化。认证的处理使用JavaScript进行了封装,用户无需再关心传入与传出的参数处理。同时,还支持用户使用自己的代码来自定义报错机制。

  • 尽管我们不推荐,但你依然可以参考旧版的指南来制作自定义认证页面。

你需要创建类似以下样例的页面作为自定义认证页面,并请阅读下面的“要点说明”:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<!-- 必须引入AuthPageScript.js -->
<script src="http://cp.wiwiz.com/as/AuthPageScript.js"></script>
<script>
/* 回调函数。“获取验证码”按钮按下后,将自动调用此函数。可根据code值自行改写该函数。 */
function WiwizSmsVerifyMsg(code) {
    if    (code == "-1") {
        alert("手机号码不可为空!");
    } else if(code == "0") {
        alert("验证码已通过短信发送至您的手机,请注意查收。然后请在认证页面输入验证码。");
    } else if(code == "1") {
        alert("该热点不允许进行手机号码验证。如有疑问请您联系热点管理员。");
    } else if(code == "2") {
        alert("该热点不允许进行手机号码验证。如有疑问请您联系热点管理员。");
    } else if(code == "3") {
        alert("该手机号码不允许进行验证。如有疑问请您联系热点管理员。");
    } else if(code == "4") {
        alert("手机号码验证过于频繁,请稍后再试。");
    } else if(code == "5") {
        alert("该手机号码进行验证次数已超过今日上限。");
    } else if(code == "6") {
        alert("热点认证服务已暂停,不可进行手机验证。");
    } else if(code == "7") {
        alert("该热点手机验证次数已超过配额。请联系热点管理员。");
    } else if(code == "8") {
        alert("请求已超时,请刷新认证页面。");
    } else if(code == "9") {
        alert("请使用上一次通过短信接收到的验证码。");
    } else if(code == "99") {
        alert("验证短信发送失败。请检查手机号码的有效性,或联系热点管理员。");
    } else if(code == "999") {
        alert("系统异常,验证短信发送失败。请联系热点管理员。");
    } else {
        alert("系统异常。请联系热点管理员。");
    }
}
/* 回调函数。“认证”按钮按下后,如报错将自动调用此函数。可根据code值自行改写该函数。 */
function WiwizAuthPageError(code) {
    if     (code == 1) {
        alert("您无法使用此网络,除非您认同此协议条款。");
    } else if(code == 2) {
        alert("请输入用户名。");
    } else if(code == 3) {
        alert("用户名或密码错误。");
    } else if(code == 4) {
        alert("电子招待券无效。");
    } else if(code == 5) {
        alert("超过该电子招待券的最大使用人数限制。");
    } else if(code == 6) {
        alert("超过最大在线用户数。");
    } else if(code == 7) {
        alert("请输入手机号码。");
    } else if(code == 8) {
        alert("热点已停用。");
    } else if(code == 32) {
        alert("账户存在异常,暂时锁定中。");
    } else if(code == 35) {
        alert("手机验证码错误或已超时。");
    } else if(code == 36) {
        alert("该手机号码不允许进行验证。如有疑问请您联系热点管理员。");
    } else if(code == 37) {
        alert("该手机号码进行验证次数已超过今日上限。");
    } else {
        alert("未知错误。错误码:"+ code);
    }
}
</script>
</head>
<body>
<form name="myform" id="myform" action="" method="post">
热点介绍文本<br>
使用协议与条款文本...... <br>
<!-- 以下各参数应根据热点的认证方式正确设置 -->
<!-- 参数: agree 代表认同协议 -->
<input name="agree" id="agree" type="checkbox" value="1"  />
<label for="agree">我认同协议</label>
<br>
<!-- 参数: username 代表用户名 -->
用户名:
<input name="username" id="username" type="text" value="" />
<br>
<!-- 参数: pswd 代表密码 -->
密码:
<input name="pswd" id="pswd" type="password" />
<br>
<!-- 参数: encrypt 代表是否对密码加密 -->
<input name="encrypt" id="encrypt" type="checkbox" value="1" checked /><label for="encrypt">加密密码</label>
<br>
<!-- 参数: voucher 代表电子招待券 -->
电子招待券:
<input name="voucher" id="voucher" type="text" />
<br>
<!-- 参数: phonenum 代表手机号码 -->
手机号码:
<input name="phonenum" id="phonenum" type="text" value="" />
<!-- 用于取得发送手机验证码短信的按钮,onclick事件必须调用WiwizSmsVerify()函数
    WiwizSmsVerify()参数说明:
    参数1(必须): 手机号码
    参数2(必须): HotSpot ID
 -->
<input type="button" value="获取验证码" onclick="WiwizSmsVerify(document.getElementById('phonenum').value, WiwizGetQueryParameter('gw_id'));" />
<br>
<!-- 参数: phonecode 代表手机验证码 -->
手机验证码:
<input name="phonecode" id="phonecode" type="text" value="" />
<br>

<!-- 参数: userstring 代表自定义追踪信息 -->
<input name="userstring" id="userstring" type="HIDDEN" value="" />

<!-- 用于开始触发认证的按钮,onclick事件必须调用WiwizStartAuth()函数 -->
<input type="button" name="login" value="   认证   " onclick="WiwizStartAuth();" />
<br>
<!-- 以下是一些非必须的可选链接 -->
<a href="#" onclick="window.open('http://cp.wiwiz.com/as/s/viewhotspot/?gw_id='+ WiwizGetQueryParameter('gw_id')); return false;">更多信息</a>
<a href="http://cp.wiwiz.com/as/s/register/" target="_blank">注册</a>
<a href="http://cp.wiwiz.com/as/s/remindpswd/" target="_blank">忘记密码?</a>
</form>
</body></html>

[要点说明]

  1. 页面HTML代码中必须通过script标签引入AuthPageScript.js。如果你使用的是“自定义认证页面HTML”(而不是“自定义认证页面URL”),那么它的路径应该是”/as/AuthPageScript.js”。
  2. 认证页面样式可自由定义。但用于认证的各表单域必须被包含。包含的用于认证的表单域应与设置热点时的认证规则一致。
  3. “获取验证码”按钮按下时,需调用WiwizSmsVerify()函数方可发送短信。调用后,系统将会自动调用WiwizSmsVerifyMsg()回调函数。用户可根据需要对函数内容由自由重写。
  4. “认证”按钮按下时,需调用WiwizStartAuth()函数方可进行认证。调用后,如有错误,系统将会自动调用WiwizAuthPageError()回调函数。用户可根据需要对函数内容由自由重写。如果没有错误,则自动调用函数WiwizBeforeAuthDone(),它也可以重写。最后,认证通过并跳转到“认证后页面”。

本文章由 http://www.wifidog.pro/2015/03/19/wifidog%E8%AE%A4%E8%AF%81%E9%A1%B5%E9%9D%A2%E5%88%B6%E4%BD%9C.html 整理编辑,转载请注明出处