Skip to content

Commit cba2adc

Browse files
committed
fix csp + progress proxy + allow omit public_url
1 parent 42b955d commit cba2adc

File tree

6 files changed

+53
-16
lines changed

6 files changed

+53
-16
lines changed

config/config.example.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,20 @@ db:
8080
## Both parameter can have identical URL when Invidious is hosted in
8181
## an internal network or at home or locally (localhost).
8282
##
83+
## NOTE: If public_url is omitted, Invidious will use its built-in proxy
84+
## to route companion requests through /companion, which is useful for
85+
## simple setups where companion runs on the same network. When using
86+
## the built-in proxy, CSP headers are not modified since requests
87+
## stay within the same domain.
88+
##
8389
## Accepted values: "http(s)://<IP-HOSTNAME>:<Port>"
8490
## Default: <none>
8591
##
8692
#invidious_companion:
8793
# - private_url: "http://localhost:8282/companion"
8894
# public_url: "http://localhost:8282/companion"
95+
# # Example with built-in proxy (omit public_url):
96+
# # - private_url: "http://localhost:8282/companion"
8997

9098
##
9199
## API key for Invidious companion, used for securing the communication

src/invidious/config.cr

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ class Config
8282

8383
@[YAML::Field(converter: Preferences::URIConverter)]
8484
property public_url : URI = URI.parse("")
85+
86+
# Indicates if this companion instance uses the built-in proxy
87+
property builtin_proxy : Bool = false
8588
end
8689

8790
# Number of threads to use for crawling videos from channels (for updating subscriptions)
@@ -271,6 +274,14 @@ class Config
271274
puts "Config: The value of 'invidious_companion_key' needs to be a size of 16 characters."
272275
exit(1)
273276
end
277+
278+
# Set public_url to built-in proxy path when omitted
279+
config.invidious_companion.each do |companion|
280+
if companion.public_url.to_s.empty?
281+
companion.public_url = URI.parse("/companion")
282+
companion.builtin_proxy = true
283+
end
284+
end
274285
elsif config.signature_server
275286
puts("WARNING: inv-sig-helper is deprecated. Please switch to Invidious companion: https://docs.invidious.io/companion-installation/")
276287
else

src/invidious/routes/companion.cr

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,33 @@
11
module Invidious::Routes::Companion
22
# /companion
33
def self.get_companion(env)
4-
url = env.request.path.lchop("/companion")
4+
url = env.request.path
5+
if env.request.query
6+
url += "?#{env.request.query}"
7+
end
58

69
begin
7-
COMPANION_POOL.client &.get(url, env.request.header) do |resp|
8-
return self.proxy_companion(env, resp)
10+
COMPANION_POOL.client do |wrapper|
11+
puts env.request.headers
12+
wrapper.client.get(url, env.request.headers) do |resp|
13+
return self.proxy_companion(env, resp)
14+
end
915
end
1016
rescue ex
1117
end
1218
end
1319

1420
def self.options_companion(env)
15-
url = env.request.path.lchop("/companion")
21+
url = env.request.path
22+
if env.request.query
23+
url += "?#{env.request.query}"
24+
end
1625

1726
begin
18-
COMPANION_POOL.client &.options(url, env.request.header) do |resp|
19-
return self.proxy_companion(env, resp)
27+
COMPANION_POOL.client do |wrapper|
28+
wrapper.client.options(url, env.request.headers) do |resp|
29+
return self.proxy_companion(env, resp)
30+
end
2031
end
2132
rescue ex
2233
end

src/invidious/routes/embed.cr

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,14 +209,17 @@ module Invidious::Routes::Embed
209209

210210
if CONFIG.invidious_companion.present?
211211
invidious_companion = CONFIG.invidious_companion.sample
212-
invidious_companion_urls = CONFIG.invidious_companion.map do |companion|
212+
invidious_companion_urls = CONFIG.invidious_companion.reject(&.builtin_proxy).map do |companion|
213213
uri =
214214
"#{companion.public_url.scheme}://#{companion.public_url.host}#{companion.public_url.port ? ":#{companion.public_url.port}" : ""}"
215215
end.join(" ")
216-
env.response.headers["Content-Security-Policy"] =
217-
env.response.headers["Content-Security-Policy"]
218-
.gsub("media-src", "media-src #{invidious_companion_urls}")
219-
.gsub("connect-src", "connect-src #{invidious_companion_urls}")
216+
217+
if !invidious_companion_urls.empty?
218+
env.response.headers["Content-Security-Policy"] =
219+
env.response.headers["Content-Security-Policy"]
220+
.gsub("media-src", "media-src #{invidious_companion_urls}")
221+
.gsub("connect-src", "connect-src #{invidious_companion_urls}")
222+
end
220223
end
221224

222225
rendered "embed"

src/invidious/routes/watch.cr

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,17 @@ module Invidious::Routes::Watch
194194

195195
if CONFIG.invidious_companion.present?
196196
invidious_companion = CONFIG.invidious_companion.sample
197-
invidious_companion_urls = CONFIG.invidious_companion.map do |companion|
197+
invidious_companion_urls = CONFIG.invidious_companion.reject(&.builtin_proxy).map do |companion|
198198
uri =
199199
"#{companion.public_url.scheme}://#{companion.public_url.host}#{companion.public_url.port ? ":#{companion.public_url.port}" : ""}"
200200
end.join(" ")
201-
env.response.headers["Content-Security-Policy"] =
202-
env.response.headers["Content-Security-Policy"]
203-
.gsub("media-src", "media-src #{invidious_companion_urls}")
204-
.gsub("connect-src", "connect-src #{invidious_companion_urls}")
201+
202+
if !invidious_companion_urls.empty?
203+
env.response.headers["Content-Security-Policy"] =
204+
env.response.headers["Content-Security-Policy"]
205+
.gsub("media-src", "media-src #{invidious_companion_urls}")
206+
.gsub("connect-src", "connect-src #{invidious_companion_urls}")
207+
end
205208
end
206209

207210
templated "watch"

src/invidious/routing.cr

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ module Invidious::Routing
4646
self.register_api_v1_routes
4747
self.register_api_manifest_routes
4848
self.register_video_playback_routes
49+
self.register_companion_routes
4950
end
5051

5152
# -------------------

0 commit comments

Comments
 (0)