Tokens: Server side generated tokens.
All checks were successful
Invidious CI / build (push) Successful in 5m48s
All checks were successful
Invidious CI / build (push) Successful in 5m48s
#18
This commit is contained in:
parent
9878a3d4d6
commit
20ebfedca5
6 changed files with 144 additions and 0 deletions
62
crystal_formatters.py
Normal file
62
crystal_formatters.py
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
import lldb
|
||||||
|
|
||||||
|
class CrystalArraySyntheticProvider:
|
||||||
|
def __init__(self, valobj, internal_dict):
|
||||||
|
self.valobj = valobj
|
||||||
|
self.buffer = None
|
||||||
|
self.size = 0
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
if self.valobj.type.is_pointer:
|
||||||
|
self.valobj = self.valobj.Dereference()
|
||||||
|
self.size = int(self.valobj.child[0].value)
|
||||||
|
self.type = self.valobj.type
|
||||||
|
self.buffer = self.valobj.child[3]
|
||||||
|
|
||||||
|
def num_children(self):
|
||||||
|
size = 0 if self.size is None else self.size
|
||||||
|
return size
|
||||||
|
|
||||||
|
def get_child_index(self, name):
|
||||||
|
try:
|
||||||
|
return int(name.lstrip('[').rstrip(']'))
|
||||||
|
except:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
def get_child_at_index(self,index):
|
||||||
|
if index >= self.size:
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
elementType = self.buffer.type.GetPointeeType()
|
||||||
|
offset = elementType.size * index
|
||||||
|
return self.buffer.CreateChildAtOffset('[' + str(index) + ']', offset, elementType)
|
||||||
|
except Exception as e:
|
||||||
|
print('Got exception %s' % (str(e)))
|
||||||
|
return None
|
||||||
|
|
||||||
|
def findType(name, module):
|
||||||
|
cachedTypes = module.GetTypes()
|
||||||
|
for idx in range(cachedTypes.GetSize()):
|
||||||
|
type = cachedTypes.GetTypeAtIndex(idx)
|
||||||
|
if type.name == name:
|
||||||
|
return type
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def CrystalString_SummaryProvider(value, dict):
|
||||||
|
error = lldb.SBError()
|
||||||
|
if value.TypeIsPointerType():
|
||||||
|
value = value.Dereference()
|
||||||
|
process = value.GetTarget().GetProcess()
|
||||||
|
byteSize = int(value.child[0].value)
|
||||||
|
len = int(value.child[1].value)
|
||||||
|
len = byteSize or len
|
||||||
|
strAddr = value.child[2].load_addr
|
||||||
|
val = process.ReadCStringFromMemory(strAddr, len + 1, error)
|
||||||
|
return '"%s"' % val
|
||||||
|
|
||||||
|
|
||||||
|
def __lldb_init_module(debugger, dict):
|
||||||
|
debugger.HandleCommand(r'type synthetic add -l crystal_formatters.CrystalArraySyntheticProvider -x "^Array\(.+\)(\s*\**)?" -w Crystal')
|
||||||
|
debugger.HandleCommand(r'type summary add -F crystal_formatters.CrystalString_SummaryProvider -x "^(String|\(String \| Nil\))(\s*\**)?$" -w Crystal')
|
||||||
|
debugger.HandleCommand(r'type category enable Crystal')
|
|
@ -22,4 +22,28 @@ module Tokens
|
||||||
def get_visitor_data
|
def get_visitor_data
|
||||||
return @@visitor_data
|
return @@visitor_data
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def generate_tokens(user : String)
|
||||||
|
po_token = ""
|
||||||
|
visitor_data = ""
|
||||||
|
attempts = 0
|
||||||
|
|
||||||
|
LOGGER.debug("Generating po_token and visitor_data for user: '#{user}'")
|
||||||
|
REDIS_DB.publish("generate-token", "#{user}")
|
||||||
|
|
||||||
|
while REDIS_DB.get("invidious:#{user}:po_token").nil? && REDIS_DB.get("invidious:#{user}:visitor_data").nil?
|
||||||
|
if attempts > 50
|
||||||
|
break
|
||||||
|
end
|
||||||
|
LOGGER.debug("Waiting for tokens to arrive at redis for user: '#{user}'")
|
||||||
|
attempts += 1
|
||||||
|
sleep 250.milliseconds
|
||||||
|
end
|
||||||
|
|
||||||
|
po_token = REDIS_DB.get("invidious:#{user}:po_token")
|
||||||
|
visitor_data = REDIS_DB.get("invidious:#{user}:visitor_data")
|
||||||
|
|
||||||
|
LOGGER.debug("Tokens successfully generated for user: '#{user}'")
|
||||||
|
return {po_token, visitor_data}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -349,4 +349,40 @@ module Invidious::Routes::Account
|
||||||
return "{}"
|
return "{}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# poToken and visitorData tokens generation
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
# Generates a poToken & visitorData for the user, server side
|
||||||
|
def generate_tokens(env)
|
||||||
|
locale = env.get("preferences").as(Preferences).locale
|
||||||
|
preferences = env.get("preferences").as(Preferences)
|
||||||
|
|
||||||
|
user = env.get? "user"
|
||||||
|
sid = env.get? "sid"
|
||||||
|
referer = get_referer(env)
|
||||||
|
|
||||||
|
if !user
|
||||||
|
return env.redirect referer
|
||||||
|
end
|
||||||
|
|
||||||
|
user = user.as(User)
|
||||||
|
|
||||||
|
po_token, visitor_data = Tokens.generate_tokens(user.email)
|
||||||
|
|
||||||
|
if po_token.nil? || visitor_data.nil?
|
||||||
|
return error_template(500, "Internal server error. Please submit an issue here IF THE ISSUE PERSISTS: https://git.nadeko.net/Fijxu/invidious/issues")
|
||||||
|
end
|
||||||
|
|
||||||
|
user.preferences.po_token = po_token
|
||||||
|
user.preferences.visitor_data = visitor_data
|
||||||
|
|
||||||
|
Invidious::Database::Users.update_preferences(user)
|
||||||
|
|
||||||
|
REDIS_DB.del("invidious:#{user.email}:po_token")
|
||||||
|
REDIS_DB.del("invidious:#{user.email}:visitor_data")
|
||||||
|
|
||||||
|
templated "user/tokens"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -77,6 +77,7 @@ module Invidious::Routing
|
||||||
post "/authorize_token", Routes::Account, :post_authorize_token
|
post "/authorize_token", Routes::Account, :post_authorize_token
|
||||||
get "/token_manager", Routes::Account, :token_manager
|
get "/token_manager", Routes::Account, :token_manager
|
||||||
post "/token_ajax", Routes::Account, :token_ajax
|
post "/token_ajax", Routes::Account, :token_ajax
|
||||||
|
get "/generate_tokens", Routes::Account, :generate_tokens
|
||||||
post "/subscription_ajax", Routes::Subscriptions, :toggle_subscription
|
post "/subscription_ajax", Routes::Subscriptions, :toggle_subscription
|
||||||
get "/subscription_manager", Routes::Subscriptions, :subscription_manager
|
get "/subscription_manager", Routes::Subscriptions, :subscription_manager
|
||||||
end
|
end
|
||||||
|
|
|
@ -136,6 +136,12 @@
|
||||||
<input name="visitor_data" id="visitor_data" type="text" value="<%= preferences.visitor_data %>">
|
<input name="visitor_data" id="visitor_data" type="text" value="<%= preferences.visitor_data %>">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<% if env.get?("user") %>
|
||||||
|
<div class="pure-control-group">
|
||||||
|
<a href="/generate_tokens?referer=<%= URI.encode_www_form(referer) %>"><%= translate(locale, "Generate po_token and visitor_data for your account") %></a>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<legend><%= translate(locale, "preferences_category_visual") %></legend>
|
<legend><%= translate(locale, "preferences_category_visual") %></legend>
|
||||||
|
|
||||||
<div class="pure-control-group">
|
<div class="pure-control-group">
|
||||||
|
|
15
src/invidious/views/user/tokens.ecr
Normal file
15
src/invidious/views/user/tokens.ecr
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<% content_for "header" do %>
|
||||||
|
<title><%= translate(locale, "Invidious token generator") %> - Invidious</title>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<div class="pure-g">
|
||||||
|
<div class="pure-u-1 pure-u-lg-1-5"></div>
|
||||||
|
<div class="pure-u-1 pure-u-lg-3-5">
|
||||||
|
<div class="h-box">
|
||||||
|
<p>po_token and visitor_data successfully generated!</p>
|
||||||
|
<p>po_token: <%= po_token %></p>
|
||||||
|
<p>visitor_data: <%= visitor_data %></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="pure-u-1 pure-u-lg-1-5"></div>
|
||||||
|
</div>
|
Loading…
Reference in a new issue