Adding application/jrd+json webfinger resource
This commit is contained in:
		
							parent
							
								
									7bb72ff198
								
							
						
					
					
						commit
						d5e086a47b
					
				
					 6 changed files with 54 additions and 10 deletions
				
			
		| 
						 | 
					@ -1,27 +1,29 @@
 | 
				
			||||||
class XrdController < ApplicationController
 | 
					class XrdController < ApplicationController
 | 
				
			||||||
  before_action :set_format
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def host_meta
 | 
					  def host_meta
 | 
				
			||||||
    @webfinger_template = "#{webfinger_url}?resource={uri}"
 | 
					    @webfinger_template = "#{webfinger_url}?resource={uri}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    respond_to do |format|
 | 
				
			||||||
 | 
					      format.xml { render content_type: 'application/xrd+xml' }
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def webfinger
 | 
					  def webfinger
 | 
				
			||||||
    @account = Account.find_local!(username_from_resource)
 | 
					    @account = Account.find_local!(username_from_resource)
 | 
				
			||||||
    @canonical_account_uri = "acct:#{@account.username}@#{Rails.configuration.x.local_domain}"
 | 
					    @canonical_account_uri = "acct:#{@account.username}@#{Rails.configuration.x.local_domain}"
 | 
				
			||||||
    @magic_key = pem_to_magic_key(@account.keypair.public_key)
 | 
					    @magic_key = pem_to_magic_key(@account.keypair.public_key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    respond_to do |format|
 | 
				
			||||||
 | 
					      format.xml  { render content_type: 'application/xrd+xml' }
 | 
				
			||||||
 | 
					      format.json { render content_type: 'application/jrd+json' }
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  rescue ActiveRecord::RecordNotFound
 | 
					  rescue ActiveRecord::RecordNotFound
 | 
				
			||||||
    head 404
 | 
					    head 404
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def set_format
 | 
					 | 
				
			||||||
    request.format = 'xml'
 | 
					 | 
				
			||||||
    response.headers['Content-Type'] = 'application/xrd+xml'
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def username_from_resource
 | 
					  def username_from_resource
 | 
				
			||||||
    if resource_param.start_with?('acct:')
 | 
					    if resource_param.start_with?('acct:') || resource_param.include?('@')
 | 
				
			||||||
      resource_param.split('@').first.gsub('acct:', '')
 | 
					      resource_param.split('@').first.gsub('acct:', '')
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      url = Addressable::URI.parse(resource_param)
 | 
					      url = Addressable::URI.parse(resource_param)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										16
									
								
								app/views/xrd/webfinger.json.rabl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/views/xrd/webfinger.json.rabl
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					object @account
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					node(:subject) { @canonical_account_uri }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					node(:aliases) do
 | 
				
			||||||
 | 
					  [TagManager.instance.url_for(@account)]
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					node(:links) do
 | 
				
			||||||
 | 
					  [
 | 
				
			||||||
 | 
					    { rel: 'http://webfinger.net/rel/profile-page', type: 'text/html', href: TagManager.instance.url_for(@account) },
 | 
				
			||||||
 | 
					    { rel: 'http://schemas.google.com/g/2010#updates-from', type: 'application/atom+xml', href: account_url(@account, format: 'atom') },
 | 
				
			||||||
 | 
					    { rel: 'salmon', href: api_salmon_url(@account.id) },
 | 
				
			||||||
 | 
					    { rel: 'magic-public-key', href: "data:application/magic-public-key,#{@magic_key}" }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
# Be sure to restart your server when you modify this file.
 | 
					# Be sure to restart your server when you modify this file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Add new mime types for use in respond_to blocks:
 | 
					Mime::Type.register "application/json", :json, %w( text/x-json application/jsonrequest application/jrd+json )
 | 
				
			||||||
# Mime::Type.register "text/richtext", :rtf
 | 
					Mime::Type.register "text/xml",         :xml,  %w( application/xml application/atom+xml application/xrd+xml )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										19
									
								
								spec/javascript/components/display_name.test.jsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								spec/javascript/components/display_name.test.jsx
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,19 @@
 | 
				
			||||||
 | 
					import { expect } from 'chai';
 | 
				
			||||||
 | 
					import { render } from 'enzyme';
 | 
				
			||||||
 | 
					import Immutable  from 'immutable';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import DisplayName from '../../../app/assets/javascripts/components/components/display_name'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('<DisplayName />', () => {
 | 
				
			||||||
 | 
					  const account = Immutable.fromJS({
 | 
				
			||||||
 | 
					    username: 'bar',
 | 
				
			||||||
 | 
					    acct: 'bar@baz',
 | 
				
			||||||
 | 
					    display_name: 'Foo'
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const wrapper = render(<DisplayName account={account} />);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('renders display name', () => {
 | 
				
			||||||
 | 
					    expect(wrapper.text()).to.match(/Foo @bar@baz/);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,7 @@ window.React     = React;
 | 
				
			||||||
function loadStories () {
 | 
					function loadStories () {
 | 
				
			||||||
  require('./stories/loading_indicator.story.jsx');
 | 
					  require('./stories/loading_indicator.story.jsx');
 | 
				
			||||||
  require('./stories/button.story.jsx');
 | 
					  require('./stories/button.story.jsx');
 | 
				
			||||||
 | 
					  require('./stories/tabs_bar.story.jsx');
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
configure(loadStories, module);
 | 
					configure(loadStories, module);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								storybook/stories/tabs_bar.story.jsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								storybook/stories/tabs_bar.story.jsx
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					import TabsBar from '../../app/assets/javascripts/components/features/ui/components/tabs_bar.jsx'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					storiesOf('TabsBar', module)
 | 
				
			||||||
 | 
					  .add('default state', () => (
 | 
				
			||||||
 | 
					    <TabsBar />
 | 
				
			||||||
 | 
					  ));
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue