Commit 945fe846a14dd1e1dc3a5b23c097224dbe471e50

Authored by Ariejan de Vroom
2 parents 23a8e599 0aa7f79c

Merge pull request #2007 from Partugal/patch-custom-gravatar

Allow using a custom Gravatar URL.

Default is still set to the Gravatar.com service, but allows override
for a custom gravatar-ish service.
app/decorators/commit_decorator.rb
... ... @@ -76,7 +76,7 @@ class CommitDecorator < ApplicationDecorator
76 76 source_name = send "#{options[:source]}_name".to_sym
77 77 source_email = send "#{options[:source]}_email".to_sym
78 78 text = if options[:avatar]
79   - avatar = h.image_tag h.gravatar_icon(source_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size]
  79 + avatar = h.image_tag h.gravatar_icon(source_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size], alt: ""
80 80 %Q{#{avatar} <span class="commit-#{options[:source]}-name">#{source_name}</span>}
81 81 else
82 82 source_name
... ...
app/helpers/application_helper.rb
1 1 require 'digest/md5'
  2 +require 'uri'
2 3  
3 4 module ApplicationHelper
4 5  
... ... @@ -30,13 +31,15 @@ module ApplicationHelper
30 31 args.any? { |v| v.to_s.downcase == action_name }
31 32 end
32 33  
33   - def gravatar_icon(user_email = '', size = 40)
  34 + def gravatar_icon(user_email = '', size = nil)
  35 + size = 40 if size.nil? || size <= 0
  36 +
34 37 if Gitlab.config.disable_gravatar? || user_email.blank?
35 38 'no_avatar.png'
36 39 else
37   - gravatar_prefix = request.ssl? ? "https://secure" : "http://www"
  40 + gravatar_url = request.ssl? ? Gitlab.config.gravatar_ssl_url : Gitlab.config.gravatar_url
38 41 user_email.strip!
39   - "#{gravatar_prefix}.gravatar.com/avatar/#{Digest::MD5.hexdigest(user_email.downcase)}?s=#{size}&d=mm"
  42 + sprintf(gravatar_url, {:hash => Digest::MD5.hexdigest(user_email.downcase), :email => URI.escape(user_email), :size => size})
40 43 end
41 44 end
42 45  
... ...
config/gitlab.yml.example
... ... @@ -24,6 +24,8 @@ app:
24 24 # backup_path: "/vol/backups" # default: Rails.root + backups/
25 25 # backup_keep_time: 604800 # default: 0 (forever) (in seconds)
26 26 # disable_gravatar: true # default: false - Disable user avatars from Gravatar.com
  27 + # gravatar_url: "http://" # default: http://www.gravatar.com/avatar/%{hash}?s=%{size}&d=mm
  28 + # gravatar_ssl_url: "https://" # default: https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=mm
27 29  
28 30  
29 31 #
... ...
config/initializers/1_settings.rb
... ... @@ -145,5 +145,14 @@ class Settings &lt; Settingslogic
145 145 def disable_gravatar?
146 146 app['disable_gravatar'] || false
147 147 end
  148 +
  149 + def gravatar_url
  150 + app['gravatar_url'] || 'http://www.gravatar.com/avatar/%{hash}?s=%{size}&d=mm'
  151 + end
  152 +
  153 + def gravatar_ssl_url
  154 + app['gravatar_ssl_url'] || 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=mm'
  155 + end
  156 +
148 157 end
149 158 end
... ...
spec/helpers/application_helper_spec.rb
... ... @@ -51,14 +51,36 @@ describe ApplicationHelper do
51 51 gravatar_icon('').should == 'no_avatar.png'
52 52 end
53 53  
  54 + it "should return default gravatar url" do
  55 + stub!(:request).and_return(double(:ssl? => false))
  56 + gravatar_icon(user_email).should match('http://www.gravatar.com/avatar/b58c6f14d292556214bd64909bcdb118')
  57 + end
  58 +
54 59 it "should use SSL when appropriate" do
55 60 stub!(:request).and_return(double(:ssl? => true))
56 61 gravatar_icon(user_email).should match('https://secure.gravatar.com')
57 62 end
58 63  
  64 + it "should return custom gravatar path when gravatar_url is set" do
  65 + stub!(:request).and_return(double(:ssl? => false))
  66 + Gitlab.config.stub(:gravatar_url).and_return('http://example.local/?s=%{size}&hash=%{hash}')
  67 + gravatar_icon(user_email, 20).should == 'http://example.local/?s=20&hash=b58c6f14d292556214bd64909bcdb118'
  68 + end
  69 +
59 70 it "should accept a custom size" do
60 71 stub!(:request).and_return(double(:ssl? => false))
61 72 gravatar_icon(user_email, 64).should match(/\?s=64/)
62 73 end
  74 +
  75 + it "should use default size when size is wrong" do
  76 + stub!(:request).and_return(double(:ssl? => false))
  77 + gravatar_icon(user_email, nil).should match(/\?s=40/)
  78 + end
  79 +
  80 + it "should be case insensitive" do
  81 + stub!(:request).and_return(double(:ssl? => false))
  82 + gravatar_icon(user_email).should == gravatar_icon(user_email.upcase + " ")
  83 + end
  84 +
63 85 end
64 86 end
... ...