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