neocities/app/sysops.rb

84 lines
No EOL
2 KiB
Ruby

require 'zlib'
require 'rubygems/package'
get '/sysops/proxy/map.txt' do
require_proxy_auth
domains = ''
Site.exclude(domain: nil).
exclude(domain: '').
select(:username,:domain).
all.
collect do |s|
domains << "#{s.domain} #{s.username};\n"
end
content_type :text
domains
end
get '/sysops/proxy/sslcerts.tar.gz' do
require_proxy_auth
sites = Site.ssl_sites
nginx_config = ''
tar = StringIO.new
Gem::Package::TarWriter.new(tar) do |writer|
writer.mkdir 'sslcerts', 0740
writer.mkdir 'sslcerts/certs', 0740
sites.each do |site|
writer.add_file "sslcerts/certs/#{site.username}.key", 0640 do |f|
f.write site.ssl_key
end
writer.add_file "sslcerts/certs/#{site.username}.crt", 0640 do |f|
f.write site.ssl_cert
end
nginx_config << %{
server {
listen 443 ssl;
server_name #{site.domain} *.#{site.domain};
ssl_certificate sslsites/certs/#{site.username}.crt;
ssl_certificate_key sslsites/certs/#{site.username}.key;
location / {
proxy_http_version 1.1;
proxy_set_header Host #{site.username}.neocities.org;
proxy_pass http://127.0.0.1$request_uri;
}
}
}.unindent
end
writer.add_file "sslcerts/sslsites.conf", 0640 do |f|
f.write nginx_config
end
end
tar.rewind
package = StringIO.new 'b'
package.set_encoding 'binary'
gzip = Zlib::GzipWriter.new package
gzip.write tar.read
tar.close
gzip.finish
package.rewind
attachment
package.read
end
class ProxyAccessViolation < StandardError; end
def require_proxy_auth
begin
auth = request.env['HTTP_AUTHORIZATION']
user, pass = Base64.decode64(auth.match(/Basic (.+)/)[1]).split(':')
raise ProxyAccessViolation unless pass == $config['proxy_pass']
rescue
raise ProxyAccessViolation, "Violator: #{request.ip}" unless pass == $config['proxy_pass']
end
end