diff --git a/src/invidious/config.cr b/src/invidious/config.cr index a8543a59..794d586c 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -167,6 +167,9 @@ class Config # The max resolution the Instance can offer property max_dash_resolution : Int32? + # List of names of the backends + property backends : Array(String) = [] of String + # Materialious redirects property materialious_domain : String? diff --git a/src/invidious/routes/switch_backend.cr b/src/invidious/routes/switch_backend.cr new file mode 100644 index 00000000..993f3fec --- /dev/null +++ b/src/invidious/routes/switch_backend.cr @@ -0,0 +1,18 @@ +{% skip_file if flag?(:api_only) %} + +module Invidious::Routes::BackendSwitcher + def self.switch(env) + referer = get_referer(env) + backend_id = env.params.query["backend_id"] + + # Checks if there is any alternative domain, like a second domain name, + # TOR or I2P address + if alt = CONFIG.alternative_domains.index(env.request.headers["Host"]) + env.response.cookies["SERVER_ID"] = Invidious::User::Cookies.server_id(CONFIG.alternative_domains[alt], backend_id) + else + env.response.cookies["SERVER_ID"] = Invidious::User::Cookies.server_id(CONFIG.domain, backend_id) + end + + env.redirect referer + end +end diff --git a/src/invidious/routing.cr b/src/invidious/routing.cr index ba05da19..620c884d 100644 --- a/src/invidious/routing.cr +++ b/src/invidious/routing.cr @@ -21,6 +21,7 @@ module Invidious::Routing get "/privacy", Routes::Misc, :privacy get "/licenses", Routes::Misc, :licenses get "/redirect", Routes::Misc, :cross_instance_redirect + get "/switchbackend", Routes::BackendSwitcher, :switch self.register_channel_routes self.register_watch_routes diff --git a/src/invidious/user/cookies.cr b/src/invidious/user/cookies.cr index a9928d0a..5036f4fb 100644 --- a/src/invidious/user/cookies.cr +++ b/src/invidious/user/cookies.cr @@ -45,5 +45,18 @@ struct Invidious::User samesite: HTTP::Cookie::SameSite::Lax ) end + + # Server ID (SERVER_ID) cookie used for Sticky Sessions + # Parameter "domain" comes from the global config + def server_id(domain : String?, server_id) : HTTP::Cookie + return HTTP::Cookie.new( + name: "SERVER_ID", + domain: domain, + value: server_id, + secure: false, + http_only: true, + samesite: HTTP::Cookie::SameSite::Lax + ) + end end end diff --git a/src/invidious/views/template.ecr b/src/invidious/views/template.ecr index f6b076fb..bd6fa83d 100644 --- a/src/invidious/views/template.ecr +++ b/src/invidious/views/template.ecr @@ -104,6 +104,17 @@ + <% if CONFIG.backends %> +