Created
January 20, 2017 22:08
-
-
Save zhovner/13cdb2daa76057fbe3f2b012e9fce306 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
with AWS.Status; | |
with AWS.Response; | |
package Worker_Echoes.Apple.Captive is | |
function Service (Request : AWS.Status.Data) | |
return AWS.Response.Data; | |
end Worker_Echoes.Apple.Captive; | |
with Ada.Strings.Fixed; | |
with AWS.URL; | |
with AWS.Messages; | |
with Worker_Echoes.Protected_Strings; | |
with Worker_Echoes.Config; | |
package body Worker_Echoes.Apple.Captive is | |
use AWS; | |
use all type AWS.Messages.Status_Code; | |
Last_CNA_CNS_Peername : Protected_Strings.Protected_String; | |
------------- | |
-- Service -- | |
------------- | |
function Service (Request : Status.Data) return Response.Data is | |
URL_Object : constant URL.Object := Status.URI (Request); | |
URL_String : constant String := URL.URL (URL_Object); | |
User_Agent : constant String := Status.User_Agent (Request); | |
begin | |
if User_Agent'Length >= 6 and then User_Agent (User_Agent'Last - 5 .. User_Agent'Last) = " wispr" then | |
if Last_CNA_CNS_Peername.Get = Status.Peername (Request) then | |
return Response.Build | |
(Status_Code => S200, | |
Content_Type => "text/html; charset=utf-8", | |
Message_Body => "<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>"); | |
elsif URL_String = "http://captive.apple.com/hotspot-1.html" then | |
return Response.Build | |
(Status_Code => S200, | |
Content_Type => "text/html; charset=utf-8", | |
Message_Body => "<HTML><HEAD></HEAD><BODY></BODY></HTML>"); | |
else | |
return Response.URL ("http://captive.apple.com/hotspot-1.html"); | |
end if; | |
elsif Ada.Strings.Fixed.Index (User_Agent, "Safari") = 0 then | |
Last_CNA_CNS_Peername.Set (Status.Peername (Request)); | |
-- 1. Not sure if intact "<BODY>Success</BODY>" matters, but probably yes. | |
-- 2. There was no delay previously, thus A had to be created before BODY is processed. | |
-- Now it's possible to click A with id, but touching working code was avoided. | |
return Response.Build | |
(Status_Code => S200, | |
Content_Type => "text/html; charset=utf-8", | |
Message_Body => "<HTML><HEAD><SCRIPT>" & | |
"window.setTimeout (function () {" & | |
"var A = document.createElement (""a"");" & | |
"A.setAttribute (""href"", ""http://captive.apple.com/hotspot-2.html"");" & | |
"var Body = document.getElementsByTagName (""body"");" & | |
"if (Body.length > 0) {" & | |
"Body = Body [0];" & | |
"} else {" & | |
"Body = document.createElement (""body"");" & | |
"document.getElementsByTagName (""html"") [0].appendChild (Body);" & | |
"}" & | |
"Body.appendChild (A);" & | |
"A.click ();" & | |
"}, 1000);" & | |
"</SCRIPT>" & | |
"<STYLE>body { display: none; }</STYLE>" & | |
"<TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>"); | |
else | |
Protected_Strings.Reset (Last_CNA_CNS_Peername, Status.Peername (Request)); -- reset if matches | |
return Response.URL (Config.Get_Target_URL); | |
end if; | |
end Service; | |
end Worker_Echoes.Apple.Captive; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment