@@ -53,12 +53,17 @@ def handle_stable_feed(router, feed_id)
5353 handle_auto_source_error ( router , error )
5454 end
5555
56- private
56+ def handle_public_feed_access ( router , _feed_id , feed_token , url )
57+ # Validate feed token and URL
58+ return access_denied_response ( router , url ) unless Auth . feed_url_allowed? ( feed_token , url )
5759
58- def auto_source_disabled_response ( router )
59- router . response . status = 400
60- router . response [ 'Content-Type' ] = 'application/xml'
61- XmlBuilder . build_error_feed ( message : 'The auto source feature is disabled.' , title : 'Auto Source Disabled' )
60+ strategy = router . params [ 'strategy' ] || 'ssrf_filter'
61+ rss_content = AutoSource . generate_feed_content ( url , strategy )
62+
63+ configure_auto_source_headers ( router )
64+ rss_content . to_s
65+ rescue StandardError => error
66+ handle_auto_source_error ( router , error )
6267 end
6368
6469 def handle_authenticated_feed_access ( router , url )
@@ -70,21 +75,72 @@ def handle_authenticated_feed_access(router, url)
7075 strategy = router . params [ 'strategy' ] || 'ssrf_filter'
7176 rss_content = AutoSource . generate_feed_content ( url , strategy )
7277
73- set_auto_source_headers ( router )
78+ configure_auto_source_headers ( router )
7479 rss_content . to_s
7580 end
7681
77- def handle_public_feed_access ( router , _feed_id , feed_token , url )
78- # Validate feed token and URL
79- return access_denied_response ( router , url ) unless Auth . feed_url_allowed? ( feed_token , url )
82+ def handle_auto_source_error ( router , error )
83+ router . response . status = 500
84+ router . response [ 'Content-Type' ] = 'application/xml'
85+ XmlBuilder . build_error_feed ( message : error . message )
86+ end
8087
81- strategy = router . params [ 'strategy' ] || 'ssrf_filter'
82- rss_content = AutoSource . generate_feed_content ( url , strategy )
88+ # Helper methods that need to be implemented by the main app
89+ def bad_request_response ( router , message )
90+ router . response . status = 400
91+ router . response [ 'Content-Type' ] = 'application/xml'
92+ XmlBuilder . build_access_denied_feed ( message )
93+ end
8394
84- set_auto_source_headers ( router )
85- rss_content . to_s
86- rescue StandardError => error
87- handle_auto_source_error ( router , error )
95+ def unauthorized_response ( router )
96+ router . response . status = 401
97+ router . response [ 'Content-Type' ] = 'application/xml'
98+ XmlBuilder . build_error_feed ( message : 'Unauthorized' )
99+ end
100+
101+ def access_denied_response ( router , url )
102+ router . response . status = 403
103+ router . response [ 'Content-Type' ] = 'application/xml'
104+ XmlBuilder . build_access_denied_feed ( url )
105+ end
106+
107+ def method_not_allowed_response ( router )
108+ router . response . status = 405
109+ router . response [ 'Content-Type' ] = 'application/xml'
110+ XmlBuilder . build_error_feed ( message : 'Method Not Allowed' )
111+ end
112+
113+ def internal_error_response ( router )
114+ router . response . status = 500
115+ router . response [ 'Content-Type' ] = 'application/xml'
116+ XmlBuilder . build_error_feed ( message : 'Internal Server Error' )
117+ end
118+
119+ def forbidden_origin_response ( router )
120+ router . response . status = 403
121+ router . response [ 'Content-Type' ] = 'application/xml'
122+ XmlBuilder . build_error_feed ( message : 'Forbidden Origin' )
123+ end
124+
125+ def configure_auto_source_headers ( router )
126+ router . response [ 'Content-Type' ] = 'application/xml'
127+ router . response [ 'Cache-Control' ] = 'public, max-age=3600'
128+ router . response [ 'X-Content-Type-Options' ] = 'nosniff'
129+ router . response [ 'X-XSS-Protection' ] = '1; mode=block'
130+ end
131+
132+ def validate_and_decode_base64 ( encoded_url )
133+ Base64 . urlsafe_decode64 ( encoded_url )
134+ rescue ArgumentError
135+ nil
136+ end
137+
138+ private
139+
140+ def auto_source_disabled_response ( router )
141+ router . response . status = 400
142+ router . response [ 'Content-Type' ] = 'application/xml'
143+ XmlBuilder . build_error_feed ( message : 'The auto source feature is disabled.' , title : 'Auto Source Disabled' )
88144 end
89145
90146 def handle_create_feed ( router )
@@ -143,65 +199,9 @@ def process_legacy_auto_source_request(router, encoded_url, token_data)
143199
144200 strategy = router . params [ 'strategy' ] || 'ssrf_filter'
145201 rss_content = AutoSource . generate_feed ( encoded_url , strategy )
146- set_auto_source_headers ( router )
202+ configure_auto_source_headers ( router )
147203 rss_content . to_s
148204 end
149-
150- def handle_auto_source_error ( router , error )
151- router . response . status = 500
152- router . response [ 'Content-Type' ] = 'application/xml'
153- XmlBuilder . build_error_feed ( message : error . message )
154- end
155-
156- # Helper methods that need to be implemented by the main app
157- def bad_request_response ( router , message )
158- router . response . status = 400
159- router . response [ 'Content-Type' ] = 'application/xml'
160- XmlBuilder . build_access_denied_feed ( message )
161- end
162-
163- def unauthorized_response ( router )
164- router . response . status = 401
165- router . response [ 'Content-Type' ] = 'application/xml'
166- XmlBuilder . build_error_feed ( message : 'Unauthorized' )
167- end
168-
169- def access_denied_response ( router , url )
170- router . response . status = 403
171- router . response [ 'Content-Type' ] = 'application/xml'
172- XmlBuilder . build_access_denied_feed ( url )
173- end
174-
175- def method_not_allowed_response ( router )
176- router . response . status = 405
177- router . response [ 'Content-Type' ] = 'application/xml'
178- XmlBuilder . build_error_feed ( message : 'Method Not Allowed' )
179- end
180-
181- def internal_error_response ( router )
182- router . response . status = 500
183- router . response [ 'Content-Type' ] = 'application/xml'
184- XmlBuilder . build_error_feed ( message : 'Internal Server Error' )
185- end
186-
187- def forbidden_origin_response ( router )
188- router . response . status = 403
189- router . response [ 'Content-Type' ] = 'application/xml'
190- XmlBuilder . build_error_feed ( message : 'Forbidden Origin' )
191- end
192-
193- def set_auto_source_headers ( router )
194- router . response [ 'Content-Type' ] = 'application/xml'
195- router . response [ 'Cache-Control' ] = 'public, max-age=3600'
196- router . response [ 'X-Content-Type-Options' ] = 'nosniff'
197- router . response [ 'X-XSS-Protection' ] = '1; mode=block'
198- end
199-
200- def validate_and_decode_base64 ( encoded_url )
201- Base64 . urlsafe_decode64 ( encoded_url )
202- rescue ArgumentError
203- nil
204- end
205205 end
206206 end
207207end
0 commit comments