summaryrefslogtreecommitdiff
path: root/lib/nickserver/request_handler.rb
diff options
context:
space:
mode:
authorazul <azul@riseup.net>2016-08-29 10:19:22 +0000
committerazul <azul@riseup.net>2016-08-29 10:19:22 +0000
commit6e2d31e3f7c515f65d92533bcdb035438461a00c (patch)
tree4efa7445db3a0521a14d75e626d64f85434a3ea5 /lib/nickserver/request_handler.rb
parentc134e0940a44ba3fb3f0f8ee86faa8053a9e0b44 (diff)
parent0784391a21b75ca52892e992a614b0f927ade00e (diff)
Merge branch 'refactor/request-handling' into 'master'
refactor: restructure the way we handle requests to make it more consistent. Requests are handled at a lot of different ways in different styles right now. Let's make this more consistent and flexible to add email lookup at other leap providers. See merge request !2
Diffstat (limited to 'lib/nickserver/request_handler.rb')
-rw-r--r--lib/nickserver/request_handler.rb95
1 files changed, 0 insertions, 95 deletions
diff --git a/lib/nickserver/request_handler.rb b/lib/nickserver/request_handler.rb
deleted file mode 100644
index 856ec5d..0000000
--- a/lib/nickserver/request_handler.rb
+++ /dev/null
@@ -1,95 +0,0 @@
-require 'nickserver/hkp/source'
-require 'nickserver/couch_db/source'
-
-module Nickserver
- class RequestHandler
-
- def initialize(responder, adapter)
- @responder = responder
- @adapter = adapter
- end
-
- def respond_to(params, headers)
- if params && params["address"] && params["address"].any?
- by_email(params, headers)
- elsif params && params["fingerprint"] && params["fingerprint"].any?
- by_fingerprint(params)
- else
- send_not_found
- end
-
- rescue RuntimeError => exc
- puts "Error: #{exc}"
- puts exc.backtrace
- send_error(exc.to_s)
- end
-
- protected
-
- def by_email(params, headers)
- email = EmailAddress.new(params["address"].first)
- if email.invalid?
- send_error("Not a valid address")
- else
- send_key(email, headers)
- end
- end
-
- def by_fingerprint(params)
- fingerprint = params["fingerprint"].first
- if fingerprint.length == 40 && !fingerprint[/\H/]
- source = Nickserver::Hkp::Source.new(adapter)
- key_response = source.get_key_by_fingerprint(fingerprint)
- send_response key_response.status, key_response.content
- else
- send_error('Fingerprint invalid: ' + fingerprint)
- end
- end
-
- def send_key(email, headers)
- if local_address?(email, headers)
- source = Nickserver::CouchDB::Source.new(adapter)
- else
- source = Nickserver::Hkp::Source.new(adapter)
- end
- response = source.query(email)
- send_response response.status, response.content
- rescue MissingHostHeader
- send_error("HTTP request must include a Host header.")
- end
-
- #
- # Return true if the user address is for a user of this service provider.
- # e.g. if the provider is example.org, then alice@example.org returns true.
- #
- # If 'domain' is not configured, we rely on the Host header of the HTTP request.
- #
- def local_address?(email, headers)
- email.domain?(Config.domain || domain_from_headers(headers))
- end
-
- # no domain configured, use Host header
- def domain_from_headers(headers)
- host_header = headers['Host']
- raise MissingHostHeader if host_header.nil?
- host_header.split(':')[0].strip.sub(/^nicknym\./, '')
- end
-
- def send_error(msg = "not supported")
- send_response 500, "500 #{msg}\n"
- end
-
- def send_not_found(msg = "Not Found")
- send_response 404, "404 #{msg}\n"
- end
-
- def send_response(status = 200, content = '')
- responder.respond status, content
- end
-
- attr_reader :responder, :adapter
-
- class MissingHostHeader < StandardError
- end
- end
-end