From de48efcf2a6b5fb096fd209b1efea482f743c19c Mon Sep 17 00:00:00 2001 From: Azul Date: Tue, 22 Jan 2013 12:02:18 +0100 Subject: some basic webfinger routes, controller, presenters, views --- users/app/controllers/webfinger_controller.rb | 15 ++++++++ users/app/helpers/users_helper.rb.orig | 47 ++++++++++++++++++++++++++ users/app/models/user.rb | 2 ++ users/app/views/emails/_email.html.haml.orig | 12 +++++++ users/app/views/webfinger/host_meta.erb | 11 ++++++ users/app/views/webfinger/search.erb | 6 ++++ users/config/routes.rb | 2 ++ users/lib/.webfinger.rb.swp | Bin 0 -> 12288 bytes users/lib/leap_web_users/engine.rb | 2 ++ users/lib/webfinger.rb | 6 ++++ users/lib/webfinger/host_meta_presenter.rb | 17 ++++++++++ users/lib/webfinger/user_presenter.rb | 16 +++++++++ 12 files changed, 136 insertions(+) create mode 100644 users/app/controllers/webfinger_controller.rb create mode 100644 users/app/helpers/users_helper.rb.orig create mode 100644 users/app/views/emails/_email.html.haml.orig create mode 100644 users/app/views/webfinger/host_meta.erb create mode 100644 users/app/views/webfinger/search.erb create mode 100644 users/lib/.webfinger.rb.swp create mode 100644 users/lib/webfinger.rb create mode 100644 users/lib/webfinger/host_meta_presenter.rb create mode 100644 users/lib/webfinger/user_presenter.rb (limited to 'users') diff --git a/users/app/controllers/webfinger_controller.rb b/users/app/controllers/webfinger_controller.rb new file mode 100644 index 0000000..e86cd2d --- /dev/null +++ b/users/app/controllers/webfinger_controller.rb @@ -0,0 +1,15 @@ +class WebfingerController < ApplicationController + + layout false + + def host_meta + @host_meta = Webfinger::HostMetaPresenter.new(request) + end + + def search + username = params[:q].split('@')[0].to_s.downcase + + user = User.find_by_login(username) + @subject = Webfinger::UserPresenter.new(user, request) + end +end diff --git a/users/app/helpers/users_helper.rb.orig b/users/app/helpers/users_helper.rb.orig new file mode 100644 index 0000000..ed027d3 --- /dev/null +++ b/users/app/helpers/users_helper.rb.orig @@ -0,0 +1,47 @@ +module UsersHelper + + def user_form_with(partial, options = {}) + user_form(options) do |f| + options[:f] = f + render :partial => partial, + :layout => 'legend_and_submit', + :locals => options + end + end + + def user_form(options = {}) + simple_form_for @user, + :html => user_form_html_options(options), + :validate => true do |f| + yield f + end + end + + def user_form_html_options(options) + { :class => user_form_html_classes(options).join(" "), + :id => dom_id(@user, options[:legend]) + } + end + + def user_form_html_classes(options) + classes = %W/form-horizontal user form/ + classes << options[:legend] + classes << (@user.new_record? ? 'new' : 'edit') + classes.compact + end + +<<<<<<< HEAD + def user_field(field) + value = @user.send(field) + value = value.to_s(:long) if field.end_with? '_at' + value || 'not set' +======= + def wrapped(item, options = {}) + options[:as] ||= :div + content_tag options[:as], :class => dom_class(item), :id => dom_id(item) do + yield + end +>>>>>>> more flexible email partial + end + +end diff --git a/users/app/models/user.rb b/users/app/models/user.rb index 292fb13..eff7abd 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -9,6 +9,8 @@ class User < CouchRest::Model::Base property :email_forward, String, :accessible => true property :email_aliases, [LocalEmail] + property :public_key + validates :login, :password_salt, :password_verifier, :presence => true diff --git a/users/app/views/emails/_email.html.haml.orig b/users/app/views/emails/_email.html.haml.orig new file mode 100644 index 0000000..440870d --- /dev/null +++ b/users/app/views/emails/_email.html.haml.orig @@ -0,0 +1,12 @@ +<<<<<<< HEAD +%li.pull-right + %code= email + - if params[:action] == 'edit' +======= += wrapped(email, local_assigns) do + = email + - if local_assigns[:with].try(:include?, :delete) +>>>>>>> more flexible email partial + = link_to(user_email_alias_path(@user, email), :method => :delete) do + %i.icon-remove +.clearfix diff --git a/users/app/views/webfinger/host_meta.erb b/users/app/views/webfinger/host_meta.erb new file mode 100644 index 0000000..23b4039 --- /dev/null +++ b/users/app/views/webfinger/host_meta.erb @@ -0,0 +1,11 @@ + + + + <%= @host_meta.subject %> + + + + + diff --git a/users/app/views/webfinger/search.erb b/users/app/views/webfinger/search.erb new file mode 100644 index 0000000..0bcb7e5 --- /dev/null +++ b/users/app/views/webfinger/search.erb @@ -0,0 +1,6 @@ + + + acct:<%= @subject.email_identifier %> + "<%= user_url(@subject.subject) %>" + + diff --git a/users/config/routes.rb b/users/config/routes.rb index 0c2d8d9..4127862 100644 --- a/users/config/routes.rb +++ b/users/config/routes.rb @@ -18,4 +18,6 @@ Rails.application.routes.draw do resources :email_aliases, :only => [:destroy], :id => /.*/ end + get "/.well-known/host-meta" => 'webfinger#host_meta' + get "/webfinger" => 'webfinger#search' end diff --git a/users/lib/.webfinger.rb.swp b/users/lib/.webfinger.rb.swp new file mode 100644 index 0000000..09528c6 Binary files /dev/null and b/users/lib/.webfinger.rb.swp differ diff --git a/users/lib/leap_web_users/engine.rb b/users/lib/leap_web_users/engine.rb index 7033576..f8ed71c 100644 --- a/users/lib/leap_web_users/engine.rb +++ b/users/lib/leap_web_users/engine.rb @@ -7,6 +7,8 @@ require "ruby-srp" require "warden/session_serializer" require "warden/strategies/secure_remote_password" +require "webfinger" + module LeapWebUsers class Engine < ::Rails::Engine diff --git a/users/lib/webfinger.rb b/users/lib/webfinger.rb new file mode 100644 index 0000000..dd49b41 --- /dev/null +++ b/users/lib/webfinger.rb @@ -0,0 +1,6 @@ +module Webfinger + + autoload :HostMetaPresenter, 'webfinger/host_meta_presenter' + autoload :UserPresenter, 'webfinger/user_presenter' + +end diff --git a/users/lib/webfinger/host_meta_presenter.rb b/users/lib/webfinger/host_meta_presenter.rb new file mode 100644 index 0000000..3901a28 --- /dev/null +++ b/users/lib/webfinger/host_meta_presenter.rb @@ -0,0 +1,17 @@ +require 'uri' + +class Webfinger::HostMetaPresenter + def initialize(request) + @request = request + end + + def subject + url = URI.parse(@request.url) + url.path = '' + url.to_s + end + + def webfinger_template(path = 'webfinger', query_param='q') + "#{subject}/#{path}?#{query_param}={uri}" + end +end diff --git a/users/lib/webfinger/user_presenter.rb b/users/lib/webfinger/user_presenter.rb new file mode 100644 index 0000000..bbfc908 --- /dev/null +++ b/users/lib/webfinger/user_presenter.rb @@ -0,0 +1,16 @@ +class Webfinger::UserPresenter + attr_accessor :subject + + def initialize(subject, request) + @subject = subject + @request = request + end + + def email_identifier + "#{@subject.username}@#{@request.host}" + end + + def key + Base64.encode64(@subject.public_key.to_s) + end +end -- cgit v1.2.3 From 0d1da13914675790daaf8def26f27017bf2d2a44 Mon Sep 17 00:00:00 2001 From: Azul Date: Tue, 22 Jan 2013 13:07:03 +0100 Subject: render 404 if needed --- users/app/controllers/webfinger_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'users') diff --git a/users/app/controllers/webfinger_controller.rb b/users/app/controllers/webfinger_controller.rb index e86cd2d..ac05934 100644 --- a/users/app/controllers/webfinger_controller.rb +++ b/users/app/controllers/webfinger_controller.rb @@ -8,8 +8,8 @@ class WebfingerController < ApplicationController def search username = params[:q].split('@')[0].to_s.downcase - - user = User.find_by_login(username) + user = User.find_by_login(username) || not_found @subject = Webfinger::UserPresenter.new(user, request) end + end -- cgit v1.2.3 From 31d18779fe1af0c55b72be7bc554302322025ee5 Mon Sep 17 00:00:00 2001 From: Azul Date: Tue, 22 Jan 2013 15:46:47 +0100 Subject: adding json jrd responses to webfinger --- users/app/controllers/webfinger_controller.rb | 3 +++ users/app/views/webfinger/search.erb | 6 ------ users/app/views/webfinger/search.xml.erb | 6 ++++++ users/lib/webfinger/user_presenter.rb | 12 ++++++++++++ 4 files changed, 21 insertions(+), 6 deletions(-) delete mode 100644 users/app/views/webfinger/search.erb create mode 100644 users/app/views/webfinger/search.xml.erb (limited to 'users') diff --git a/users/app/controllers/webfinger_controller.rb b/users/app/controllers/webfinger_controller.rb index ac05934..d3a4ad3 100644 --- a/users/app/controllers/webfinger_controller.rb +++ b/users/app/controllers/webfinger_controller.rb @@ -1,15 +1,18 @@ class WebfingerController < ApplicationController + respond_to :xml, :json layout false def host_meta @host_meta = Webfinger::HostMetaPresenter.new(request) + respond_with @host_meta end def search username = params[:q].split('@')[0].to_s.downcase user = User.find_by_login(username) || not_found @subject = Webfinger::UserPresenter.new(user, request) + respond_with @subject end end diff --git a/users/app/views/webfinger/search.erb b/users/app/views/webfinger/search.erb deleted file mode 100644 index 0bcb7e5..0000000 --- a/users/app/views/webfinger/search.erb +++ /dev/null @@ -1,6 +0,0 @@ - - - acct:<%= @subject.email_identifier %> - "<%= user_url(@subject.subject) %>" - - diff --git a/users/app/views/webfinger/search.xml.erb b/users/app/views/webfinger/search.xml.erb new file mode 100644 index 0000000..0bcb7e5 --- /dev/null +++ b/users/app/views/webfinger/search.xml.erb @@ -0,0 +1,6 @@ + + + acct:<%= @subject.email_identifier %> + "<%= user_url(@subject.subject) %>" + + diff --git a/users/lib/webfinger/user_presenter.rb b/users/lib/webfinger/user_presenter.rb index bbfc908..8184c52 100644 --- a/users/lib/webfinger/user_presenter.rb +++ b/users/lib/webfinger/user_presenter.rb @@ -1,4 +1,5 @@ class Webfinger::UserPresenter + include Rails.application.routes.url_helpers attr_accessor :subject def initialize(subject, request) @@ -13,4 +14,15 @@ class Webfinger::UserPresenter def key Base64.encode64(@subject.public_key.to_s) end + + def to_json(options) + { + subject: "acct:#{email_identifier}", + aliases: [ user_url(@subject, :host => @request.host) ], + links: { + public_key: { type: 'PGP', href: key } + } + }.to_json(options) + end + end -- cgit v1.2.3 From 493dea794285f0874a9235fe14e4350bd53c2a9f Mon Sep 17 00:00:00 2001 From: Azul Date: Tue, 22 Jan 2013 16:23:48 +0100 Subject: removed accidentaily commited files --- users/app/helpers/users_helper.rb.orig | 47 ---------------------------- users/app/views/emails/_email.html.haml.orig | 12 ------- 2 files changed, 59 deletions(-) delete mode 100644 users/app/helpers/users_helper.rb.orig delete mode 100644 users/app/views/emails/_email.html.haml.orig (limited to 'users') diff --git a/users/app/helpers/users_helper.rb.orig b/users/app/helpers/users_helper.rb.orig deleted file mode 100644 index ed027d3..0000000 --- a/users/app/helpers/users_helper.rb.orig +++ /dev/null @@ -1,47 +0,0 @@ -module UsersHelper - - def user_form_with(partial, options = {}) - user_form(options) do |f| - options[:f] = f - render :partial => partial, - :layout => 'legend_and_submit', - :locals => options - end - end - - def user_form(options = {}) - simple_form_for @user, - :html => user_form_html_options(options), - :validate => true do |f| - yield f - end - end - - def user_form_html_options(options) - { :class => user_form_html_classes(options).join(" "), - :id => dom_id(@user, options[:legend]) - } - end - - def user_form_html_classes(options) - classes = %W/form-horizontal user form/ - classes << options[:legend] - classes << (@user.new_record? ? 'new' : 'edit') - classes.compact - end - -<<<<<<< HEAD - def user_field(field) - value = @user.send(field) - value = value.to_s(:long) if field.end_with? '_at' - value || 'not set' -======= - def wrapped(item, options = {}) - options[:as] ||= :div - content_tag options[:as], :class => dom_class(item), :id => dom_id(item) do - yield - end ->>>>>>> more flexible email partial - end - -end diff --git a/users/app/views/emails/_email.html.haml.orig b/users/app/views/emails/_email.html.haml.orig deleted file mode 100644 index 440870d..0000000 --- a/users/app/views/emails/_email.html.haml.orig +++ /dev/null @@ -1,12 +0,0 @@ -<<<<<<< HEAD -%li.pull-right - %code= email - - if params[:action] == 'edit' -======= -= wrapped(email, local_assigns) do - = email - - if local_assigns[:with].try(:include?, :delete) ->>>>>>> more flexible email partial - = link_to(user_email_alias_path(@user, email), :method => :delete) do - %i.icon-remove -.clearfix -- cgit v1.2.3 From 40edf176142bd6092f13bd9f9fb72a2c69d4b052 Mon Sep 17 00:00:00 2001 From: Azul Date: Tue, 22 Jan 2013 16:45:01 +0100 Subject: fixing xml and adding json representation for host_meta --- users/app/views/webfinger/host_meta.erb | 11 ----------- users/app/views/webfinger/host_meta.xml.erb | 11 +++++++++++ users/lib/.webfinger.rb.swp | Bin 12288 -> 0 bytes users/lib/webfinger/host_meta_presenter.rb | 9 +++++++++ 4 files changed, 20 insertions(+), 11 deletions(-) delete mode 100644 users/app/views/webfinger/host_meta.erb create mode 100644 users/app/views/webfinger/host_meta.xml.erb delete mode 100644 users/lib/.webfinger.rb.swp (limited to 'users') diff --git a/users/app/views/webfinger/host_meta.erb b/users/app/views/webfinger/host_meta.erb deleted file mode 100644 index 23b4039..0000000 --- a/users/app/views/webfinger/host_meta.erb +++ /dev/null @@ -1,11 +0,0 @@ - - - - <%= @host_meta.subject %> - - - - - diff --git a/users/app/views/webfinger/host_meta.xml.erb b/users/app/views/webfinger/host_meta.xml.erb new file mode 100644 index 0000000..37c9d1e --- /dev/null +++ b/users/app/views/webfinger/host_meta.xml.erb @@ -0,0 +1,11 @@ + + + + <%= @host_meta.subject %> + + + + + diff --git a/users/lib/.webfinger.rb.swp b/users/lib/.webfinger.rb.swp deleted file mode 100644 index 09528c6..0000000 Binary files a/users/lib/.webfinger.rb.swp and /dev/null differ diff --git a/users/lib/webfinger/host_meta_presenter.rb b/users/lib/webfinger/host_meta_presenter.rb index 3901a28..b48729c 100644 --- a/users/lib/webfinger/host_meta_presenter.rb +++ b/users/lib/webfinger/host_meta_presenter.rb @@ -14,4 +14,13 @@ class Webfinger::HostMetaPresenter def webfinger_template(path = 'webfinger', query_param='q') "#{subject}/#{path}?#{query_param}={uri}" end + + def to_json(options) + { + subject: subject, + links: { + lrdd: { type: 'application/xrd+xml', template: webfinger_template } + } + }.to_json(options) + end end -- cgit v1.2.3 From efe76ee1d9badbad12b0cc42affb7b3d0572797c Mon Sep 17 00:00:00 2001 From: jessib Date: Tue, 22 Jan 2013 15:09:54 -0800 Subject: Rough way to allow user to paste in their key, but certainly we will want different display. --- users/app/models/user.rb | 2 +- users/app/views/users/_public_key_field.html.haml | 1 + users/app/views/users/edit.html.haml | 1 + users/config/locales/en.yml | 2 ++ 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 users/app/views/users/_public_key_field.html.haml (limited to 'users') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index eff7abd..80d49a3 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -9,7 +9,7 @@ class User < CouchRest::Model::Base property :email_forward, String, :accessible => true property :email_aliases, [LocalEmail] - property :public_key + property :public_key, :accessible => true validates :login, :password_salt, :password_verifier, :presence => true diff --git a/users/app/views/users/_public_key_field.html.haml b/users/app/views/users/_public_key_field.html.haml new file mode 100644 index 0000000..af88cbd --- /dev/null +++ b/users/app/views/users/_public_key_field.html.haml @@ -0,0 +1 @@ += f.input :public_key, :as => :text, :hint => t(:use_ascii_key), :input_html => {:class => "span5", :rows => 20} # will want to tweak this to be wide enough (maybe smaller text?) diff --git a/users/app/views/users/edit.html.haml b/users/app/views/users/edit.html.haml index 03088d8..d1c19ee 100644 --- a/users/app/views/users/edit.html.haml +++ b/users/app/views/users/edit.html.haml @@ -8,6 +8,7 @@ %legend=t :email_address Your email address is = render user.email_address, :as => :span + = user_form_with 'public_key_field', :legend => :public_key = user_form_with 'email_forward_field', :legend => :forward_email = user_form_with 'email_aliases', :legend => :add_email_alias = render 'tabs/tabs', :tabs => [:account, :email] diff --git a/users/config/locales/en.yml b/users/config/locales/en.yml index 7a6ab90..493b5db 100644 --- a/users/config/locales/en.yml +++ b/users/config/locales/en.yml @@ -13,10 +13,12 @@ en: set_email_address: "Set email address" forward_email: "Forward email" email_aliases: "Email aliases" + public_key: "Public Key" add_email_alias: "Add email alias" user_updated_successfully: "Settings have been updated successfully." user_created_successfully: "Successfully created your account." email_alias_destroyed_successfully: "Successfully removed the alias '%{alias}'." + use_ascii_key: "Use ASCII-armored PGP key" activemodel: models: -- cgit v1.2.3 From def5a00415ebced58bb0f7c1254f6cbedb27a23f Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 23 Jan 2013 09:23:18 +0100 Subject: make raising not found error less confusing --- users/app/controllers/webfinger_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'users') diff --git a/users/app/controllers/webfinger_controller.rb b/users/app/controllers/webfinger_controller.rb index d3a4ad3..f28dd3e 100644 --- a/users/app/controllers/webfinger_controller.rb +++ b/users/app/controllers/webfinger_controller.rb @@ -10,7 +10,8 @@ class WebfingerController < ApplicationController def search username = params[:q].split('@')[0].to_s.downcase - user = User.find_by_login(username) || not_found + user = User.find_by_login(username) + raise RECORD_NOT_FOUND, 'User not found' unless user.present? @subject = Webfinger::UserPresenter.new(user, request) respond_with @subject end -- cgit v1.2.3 From b530279a144ad5fb35070952898c8e6ae3ba68ea Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 23 Jan 2013 09:39:50 +0100 Subject: not inluding link to key if there is none --- users/app/views/webfinger/search.xml.erb | 4 +++- users/lib/webfinger/user_presenter.rb | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) (limited to 'users') diff --git a/users/app/views/webfinger/search.xml.erb b/users/app/views/webfinger/search.xml.erb index 0bcb7e5..270383e 100644 --- a/users/app/views/webfinger/search.xml.erb +++ b/users/app/views/webfinger/search.xml.erb @@ -2,5 +2,7 @@ acct:<%= @subject.email_identifier %> "<%= user_url(@subject.subject) %>" - + <%- if @subject.key.present? %> + + <% end %> diff --git a/users/lib/webfinger/user_presenter.rb b/users/lib/webfinger/user_presenter.rb index 8184c52..8288bff 100644 --- a/users/lib/webfinger/user_presenter.rb +++ b/users/lib/webfinger/user_presenter.rb @@ -12,16 +12,22 @@ class Webfinger::UserPresenter end def key - Base64.encode64(@subject.public_key.to_s) + if @subject.public_key.present? + Base64.encode64(@subject.public_key.to_s) + end + end + + def links + links = {} + links[:public_key] = { type: 'PGP', href: key } if key + return links end def to_json(options) { subject: "acct:#{email_identifier}", aliases: [ user_url(@subject, :host => @request.host) ], - links: { - public_key: { type: 'PGP', href: key } - } + links: links }.to_json(options) end -- cgit v1.2.3 From 30f406de954bac1da5fef7cdd753c0af16f11051 Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 23 Jan 2013 13:13:41 +0100 Subject: added unit tests for user presenter changed the way the presenter works. Will need functional testing --- users/app/controllers/webfinger_controller.rb | 4 +- users/app/views/webfinger/search.xml.erb | 10 +++-- users/lib/webfinger/host_meta_presenter.rb | 2 +- users/lib/webfinger/user_presenter.rb | 36 ++++++++------- .../unit/webfinger/.user_presenter_test.rb.swp | Bin 0 -> 12288 bytes users/test/unit/webfinger/user_presenter_test.rb | 49 +++++++++++++++++++++ 6 files changed, 79 insertions(+), 22 deletions(-) create mode 100644 users/test/unit/webfinger/.user_presenter_test.rb.swp create mode 100644 users/test/unit/webfinger/user_presenter_test.rb (limited to 'users') diff --git a/users/app/controllers/webfinger_controller.rb b/users/app/controllers/webfinger_controller.rb index f28dd3e..8872802 100644 --- a/users/app/controllers/webfinger_controller.rb +++ b/users/app/controllers/webfinger_controller.rb @@ -12,8 +12,8 @@ class WebfingerController < ApplicationController username = params[:q].split('@')[0].to_s.downcase user = User.find_by_login(username) raise RECORD_NOT_FOUND, 'User not found' unless user.present? - @subject = Webfinger::UserPresenter.new(user, request) - respond_with @subject + @presenter = Webfinger::UserPresenter.new(user, request) + respond_with @presenter end end diff --git a/users/app/views/webfinger/search.xml.erb b/users/app/views/webfinger/search.xml.erb index 270383e..27f26d1 100644 --- a/users/app/views/webfinger/search.xml.erb +++ b/users/app/views/webfinger/search.xml.erb @@ -1,8 +1,10 @@ - acct:<%= @subject.email_identifier %> - "<%= user_url(@subject.subject) %>" - <%- if @subject.key.present? %> - + <%= @presenter.subject %> + <%- @presenter.aliases.each do |user_alias| %> + "<%= user_alias %>" + <% end %> + <%- @presenter.links.each do |rel, link| %> + type=<%=link[:type]%> href="<%= link[:key] %>"/> <% end %> diff --git a/users/lib/webfinger/host_meta_presenter.rb b/users/lib/webfinger/host_meta_presenter.rb index b48729c..6a6235f 100644 --- a/users/lib/webfinger/host_meta_presenter.rb +++ b/users/lib/webfinger/host_meta_presenter.rb @@ -15,7 +15,7 @@ class Webfinger::HostMetaPresenter "#{subject}/#{path}?#{query_param}={uri}" end - def to_json(options) + def to_json(options = {}) { subject: subject, links: { diff --git a/users/lib/webfinger/user_presenter.rb b/users/lib/webfinger/user_presenter.rb index 8288bff..41153a8 100644 --- a/users/lib/webfinger/user_presenter.rb +++ b/users/lib/webfinger/user_presenter.rb @@ -1,20 +1,26 @@ class Webfinger::UserPresenter include Rails.application.routes.url_helpers - attr_accessor :subject + attr_accessor :user - def initialize(subject, request) - @subject = subject + def initialize(user, request) + @user = user @request = request end - def email_identifier - "#{@subject.username}@#{@request.host}" + def to_json(options = {}) + { + subject: subject, + aliases: aliases, + links: links + }.to_json(options) end - def key - if @subject.public_key.present? - Base64.encode64(@subject.public_key.to_s) - end + def subject + "acct:#{@user.email_address}" + end + + def aliases + [ user_url(@user, :host => @request.host) ] end def links @@ -23,12 +29,12 @@ class Webfinger::UserPresenter return links end - def to_json(options) - { - subject: "acct:#{email_identifier}", - aliases: [ user_url(@subject, :host => @request.host) ], - links: links - }.to_json(options) + protected + + def key + if @user.public_key.present? + Base64.encode64(@user.public_key.to_s) + end end end diff --git a/users/test/unit/webfinger/.user_presenter_test.rb.swp b/users/test/unit/webfinger/.user_presenter_test.rb.swp new file mode 100644 index 0000000..5b92867 Binary files /dev/null and b/users/test/unit/webfinger/.user_presenter_test.rb.swp differ diff --git a/users/test/unit/webfinger/user_presenter_test.rb b/users/test/unit/webfinger/user_presenter_test.rb new file mode 100644 index 0000000..7f7a0d4 --- /dev/null +++ b/users/test/unit/webfinger/user_presenter_test.rb @@ -0,0 +1,49 @@ +require 'test_helper' +require 'webfinger' +require 'json' + +class Webfinger::UserPresenterTest < ActiveSupport::TestCase + + + setup do + @user = stub( + username: 'testuser', + email_address: "testuser@#{APP_CONFIG[:domain]}" + ) + @request = stub( + host: APP_CONFIG[:domain] + ) + end + + test "user without key has no links" do + @user.stubs :public_key => nil + presenter = Webfinger::UserPresenter.new(@user, @request) + assert_equal Hash.new, presenter.links + end + + test "user with key has corresponding link" do + @user.stubs :public_key => "here's a key" + presenter = Webfinger::UserPresenter.new(@user, @request) + assert_equal [:public_key], presenter.links.keys + assert_equal "PGP", presenter.links[:public_key][:type] + assert_equal presenter.send(:key), presenter.links[:public_key][:href] + end + + test "key is base64 encoded" do + @user.stubs :public_key => "here's a key" + presenter = Webfinger::UserPresenter.new(@user, @request) + assert_equal Base64.encode64(@user.public_key), presenter.send(:key) + end + + test "creates proper json representation" do + @user.stubs :public_key => "here's a key" + presenter = Webfinger::UserPresenter.new(@user, @request) + hash = JSON.parse presenter.to_json + assert_equal ["subject", "links", "aliases"].sort, hash.keys.sort + hash.each do |key, value| + assert_equal presenter.send(key.to_sym).to_json, value.to_json + end + end + + +end -- cgit v1.2.3 From efb9f511f426b9d6f3af63608e77f80c4b823fb0 Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 23 Jan 2013 15:52:38 +0100 Subject: added a small test for HostMetaPresenter and using links hash in xml view --- users/app/views/webfinger/host_meta.xml.erb | 10 ++++----- users/lib/webfinger/host_meta_presenter.rb | 22 +++++++++++-------- .../unit/webfinger/.user_presenter_test.rb.swp | Bin 12288 -> 0 bytes .../unit/webfinger/host_meta_presenter_test.rb | 24 +++++++++++++++++++++ 4 files changed, 42 insertions(+), 14 deletions(-) delete mode 100644 users/test/unit/webfinger/.user_presenter_test.rb.swp create mode 100644 users/test/unit/webfinger/host_meta_presenter_test.rb (limited to 'users') diff --git a/users/app/views/webfinger/host_meta.xml.erb b/users/app/views/webfinger/host_meta.xml.erb index 37c9d1e..cfcbcc0 100644 --- a/users/app/views/webfinger/host_meta.xml.erb +++ b/users/app/views/webfinger/host_meta.xml.erb @@ -3,9 +3,9 @@ <%= @host_meta.subject %> - - - + <%- @host_meta.links.each do |rel, link| %> + + <%- end %> diff --git a/users/lib/webfinger/host_meta_presenter.rb b/users/lib/webfinger/host_meta_presenter.rb index 6a6235f..84ab7a9 100644 --- a/users/lib/webfinger/host_meta_presenter.rb +++ b/users/lib/webfinger/host_meta_presenter.rb @@ -5,22 +5,26 @@ class Webfinger::HostMetaPresenter @request = request end + def to_json(options = {}) + { + subject: subject, + links: links + }.to_json(options) + end + def subject url = URI.parse(@request.url) url.path = '' url.to_s end - def webfinger_template(path = 'webfinger', query_param='q') - "#{subject}/#{path}?#{query_param}={uri}" + def links + { lrdd: { type: 'application/xrd+xml', template: webfinger_template } } end - def to_json(options = {}) - { - subject: subject, - links: { - lrdd: { type: 'application/xrd+xml', template: webfinger_template } - } - }.to_json(options) + protected + + def webfinger_template(path = 'webfinger', query_param='q') + "#{subject}/#{path}?#{query_param}={uri}" end end diff --git a/users/test/unit/webfinger/.user_presenter_test.rb.swp b/users/test/unit/webfinger/.user_presenter_test.rb.swp deleted file mode 100644 index 5b92867..0000000 Binary files a/users/test/unit/webfinger/.user_presenter_test.rb.swp and /dev/null differ diff --git a/users/test/unit/webfinger/host_meta_presenter_test.rb b/users/test/unit/webfinger/host_meta_presenter_test.rb new file mode 100644 index 0000000..af86404 --- /dev/null +++ b/users/test/unit/webfinger/host_meta_presenter_test.rb @@ -0,0 +1,24 @@ +require 'test_helper' +require 'webfinger' +require 'json' + +class Webfinger::HostMetaPresenterTest < ActiveSupport::TestCase + + setup do + @request = stub( + url: "https://#{APP_CONFIG[:domain]}/.well-known/host-meta" + ) + @meta = Webfinger::HostMetaPresenter.new(@request) + end + + test "creates proper json" do + hash = JSON.parse @meta.to_json + assert_equal ["subject", "links"].sort, hash.keys.sort + hash.each do |key, value| + assert_equal @meta.send(key.to_sym).to_json, value.to_json + end + end + +end + + -- cgit v1.2.3 From c7de46aba95085baaba3775671a47182d781221a Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 23 Jan 2013 16:18:38 +0100 Subject: functional test for webfinger --- users/test/functional/webfinger_controller_test.rb | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 users/test/functional/webfinger_controller_test.rb (limited to 'users') diff --git a/users/test/functional/webfinger_controller_test.rb b/users/test/functional/webfinger_controller_test.rb new file mode 100644 index 0000000..6597b69 --- /dev/null +++ b/users/test/functional/webfinger_controller_test.rb @@ -0,0 +1,33 @@ +require 'test_helper' + +class WebfingerControllerTest < ActionController::TestCase + + test "get host meta xml" do + get :host_meta, :format => :xml + assert_response :success + assert_equal "application/xml", response.content_type + end + + test "get host meta json" do + get :host_meta, :format => :json + assert_response :success + assert_equal "application/json", response.content_type + end + + test "get user webfinger xml" do + @user = stub_record :user, :public_key => 'my public key' + User.stubs(:find_by_login).with(@user.login).returns(@user) + get :search, :q => @user.email_address.to_s, :format => :xml + assert_response :success + assert_equal "application/xml", response.content_type + end + + test "get user webfinger json" do + @user = stub_record :user, :public_key => 'my public key' + User.stubs(:find_by_login).with(@user.login).returns(@user) + get :search, :q => @user.email_address.to_s, :format => :json + assert_response :success + assert_equal "application/json", response.content_type + end + +end -- cgit v1.2.3 From 9d053b6c9b61c68bf11f95bcb37631a518f1fba4 Mon Sep 17 00:00:00 2001 From: jessib Date: Thu, 24 Jan 2013 11:38:11 -0800 Subject: Removing aliases from webfinger as the link wouldn't work anyway, and don't want to leak ID information. --- users/app/views/webfinger/search.xml.erb | 3 --- users/lib/webfinger/user_presenter.rb | 5 ----- users/test/unit/webfinger/user_presenter_test.rb | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) (limited to 'users') diff --git a/users/app/views/webfinger/search.xml.erb b/users/app/views/webfinger/search.xml.erb index 27f26d1..7328552 100644 --- a/users/app/views/webfinger/search.xml.erb +++ b/users/app/views/webfinger/search.xml.erb @@ -1,9 +1,6 @@ <%= @presenter.subject %> - <%- @presenter.aliases.each do |user_alias| %> - "<%= user_alias %>" - <% end %> <%- @presenter.links.each do |rel, link| %> type=<%=link[:type]%> href="<%= link[:key] %>"/> <% end %> diff --git a/users/lib/webfinger/user_presenter.rb b/users/lib/webfinger/user_presenter.rb index 41153a8..329f477 100644 --- a/users/lib/webfinger/user_presenter.rb +++ b/users/lib/webfinger/user_presenter.rb @@ -10,7 +10,6 @@ class Webfinger::UserPresenter def to_json(options = {}) { subject: subject, - aliases: aliases, links: links }.to_json(options) end @@ -19,10 +18,6 @@ class Webfinger::UserPresenter "acct:#{@user.email_address}" end - def aliases - [ user_url(@user, :host => @request.host) ] - end - def links links = {} links[:public_key] = { type: 'PGP', href: key } if key diff --git a/users/test/unit/webfinger/user_presenter_test.rb b/users/test/unit/webfinger/user_presenter_test.rb index 7f7a0d4..04aeb22 100644 --- a/users/test/unit/webfinger/user_presenter_test.rb +++ b/users/test/unit/webfinger/user_presenter_test.rb @@ -39,7 +39,7 @@ class Webfinger::UserPresenterTest < ActiveSupport::TestCase @user.stubs :public_key => "here's a key" presenter = Webfinger::UserPresenter.new(@user, @request) hash = JSON.parse presenter.to_json - assert_equal ["subject", "links", "aliases"].sort, hash.keys.sort + assert_equal ["subject", "links"].sort, hash.keys.sort hash.each do |key, value| assert_equal presenter.send(key.to_sym).to_json, value.to_json end -- cgit v1.2.3