diff options
| author | Omar Roth <omarroth@protonmail.com> | 2019-10-27 00:19:05 -0400 |
|---|---|---|
| committer | Omar Roth <omarroth@protonmail.com> | 2019-10-27 00:19:05 -0400 |
| commit | 0cf187dee73ede397c1ef67a61133d9736738fd5 (patch) | |
| tree | ac45cf4224be39f7165e1a537cd702502f4257e8 | |
| parent | bdeb325bad15ea32a3f039de39418a88a6ab6180 (diff) | |
| download | invidious-0cf187dee73ede397c1ef67a61133d9736738fd5.tar.gz invidious-0cf187dee73ede397c1ef67a61133d9736738fd5.tar.bz2 invidious-0cf187dee73ede397c1ef67a61133d9736738fd5.zip | |
Add support for image captcha in Google login
| -rw-r--r-- | src/invidious.cr | 36 | ||||
| -rw-r--r-- | src/invidious/helpers/handlers.cr | 2 | ||||
| -rw-r--r-- | src/invidious/views/login.ecr | 18 |
3 files changed, 42 insertions, 14 deletions
diff --git a/src/invidious.cr b/src/invidious.cr index b0447865..58bc35f8 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -1390,8 +1390,7 @@ get "/login" do |env| captcha_type ||= "image" tfa = env.params.query["tfa"]? - tfa ||= false - prompt = "" + prompt = nil templated "login" end @@ -1444,7 +1443,7 @@ post "/login" do |env| headers["Content-Type"] = "application/x-www-form-urlencoded;charset=utf-8" headers["Google-Accounts-XSRF"] = "1" - headers["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" + headers["User-Agent"] = random_user_agent response = client.post("/_/signin/sl/lookup", headers, login_req(lookup_req)) lookup_results = JSON.parse(response.body[5..-1]) @@ -1453,10 +1452,17 @@ post "/login" do |env| user_hash = lookup_results[0][2] + if token = env.params.body["token"]? + answer = env.params.body["answer"]? + captcha = {token, answer} + else + captcha = nil + end + challenge_req = { user_hash, nil, 1, nil, {1, nil, nil, nil, - {password, nil, true}, + {password, captcha, true}, }, {nil, nil, {2, 1, nil, 1, @@ -1484,11 +1490,14 @@ post "/login" do |env| next templated "error" end - # TODO: Handle Google's CAPTCHA - if captcha = challenge_results[0][-1]?.try &.[-1]?.try &.as_h?.try &.["5001"]?.try &.[-1].as_a? - error_message = "Unhandled CAPTCHA. Please try again later." - env.response.status_code = 401 - next templated "error" + if token = challenge_results[0][-1]?.try &.[-1]?.try &.as_h?.try &.["5001"]?.try &.[-1].as_a?.try &.[-1].as_s + account_type = "google" + captcha_type = "image" + prompt = nil + tfa = tfa_code + captcha = {tokens: [token], question: ""} + + next templated "login" end if challenge_results[0][-1]?.try &.[5] == "INCORRECT_ANSWER_ENTERED" @@ -1547,7 +1556,7 @@ post "/login" do |env| prompt = "Google verification code" end - tfa = true + tfa = nil captcha = nil next templated "login" end @@ -5770,6 +5779,13 @@ get "/vi/:id/:name" do |env| end end +get "/Captcha" do |env| + client = make_client(LOGIN_URL) + response = client.get(env.request.resource) + env.response.headers["Content-Type"] = response.headers["Content-Type"] + response.body +end + # Undocumented, creates anonymous playlist with specified 'video_ids', max 50 videos get "/watch_videos" do |env| response = YT_POOL.client &.get(env.request.resource) diff --git a/src/invidious/helpers/handlers.cr b/src/invidious/helpers/handlers.cr index 5b60c1be..456618cf 100644 --- a/src/invidious/helpers/handlers.cr +++ b/src/invidious/helpers/handlers.cr @@ -226,7 +226,7 @@ end class HTTP::Client private def handle_response(response) - if @socket.is_a?(OpenSSL::SSL::Socket::Client) && @host.ends_with? "googlevideo.com" + if @socket.is_a?(OpenSSL::SSL::Socket::Client) && @host.ends_with?("googlevideo.com") close unless response.keep_alive? || @socket.as(OpenSSL::SSL::Socket::Client).@in_buffer_rem.empty? if @socket.as(OpenSSL::SSL::Socket::Client).@in_buffer_rem.empty? diff --git a/src/invidious/views/login.ecr b/src/invidious/views/login.ecr index 8518ca81..4b5c7e6d 100644 --- a/src/invidious/views/login.ecr +++ b/src/invidious/views/login.ecr @@ -21,7 +21,8 @@ <hr> - <% if account_type == "invidious" %> + <% case account_type when %> + <% when "invidious" %> <form class="pure-form pure-form-stacked" action="/login?referer=<%= URI.encode_www_form(referer) %>&type=invidious" method="post"> <fieldset> <% if email %> @@ -84,7 +85,7 @@ <% end %> </fieldset> </form> - <% elsif account_type == "google" %> + <% when "google" %> <form class="pure-form pure-form-stacked" action="/login?referer=<%= URI.encode_www_form(referer) %>&type=google" method="post"> <fieldset> <% if email %> @@ -101,11 +102,22 @@ <input required class="pure-input-1" name="password" type="password" placeholder="<%= translate(locale, "Password") %>"> <% end %> - <% if tfa %> + <% if prompt %> <label for="tfa"><%= translate(locale, prompt) %> :</label> <input required class="pure-input-1" name="tfa" type="text" placeholder="<%= translate(locale, prompt) %>"> <% end %> + <% if tfa %> + <input type="hidden" name="tfa" value="<%= tfa %>"> + <% end %> + + <% if captcha %> + <img style="width:50%" src="/Captcha?v=2&ctoken=<%= captcha[:tokens][0] %>"/> + <input type="hidden" name="token" value="<%= captcha[:tokens][0] %>"> + <label for="answer"><%= translate(locale, "Answer") %> :</label> + <input type="text" name="answer" type="text" placeholder="<%= translate(locale, "Answer") %>"> + <% end %> + <button type="submit" class="pure-button pure-button-primary"><%= translate(locale, "Sign In") %></button> </fieldset> </form> |
