Merge branch '0.2.x' into develop

This commit is contained in:
Benjamin Neff 2021-10-24 21:14:25 +02:00
commit 3861eb9fef
No known key found for this signature in database
GPG key ID: 971464C3F1A90194
14 changed files with 119 additions and 25 deletions

View file

@ -1,3 +1,13 @@
# 0.2.7
## Features
* Add `remote_photo_path` to `AccountMigration` entity [#119](https://github.com/diaspora/diaspora_federation/pull/119)
## Bug fixes
* Only parse each nested element name once from the XML [#118](https://github.com/diaspora/diaspora_federation/pull/118)
# 0.2.6 # 0.2.6
## Bug fixes ## Bug fixes

View file

@ -1,18 +1,18 @@
PATH PATH
remote: . remote: .
specs: specs:
diaspora_federation (0.2.6) diaspora_federation (0.2.7)
faraday (~> 1.0) faraday (~> 1.0)
faraday_middleware (~> 1.0) faraday_middleware (~> 1.0)
nokogiri (~> 1.6, >= 1.6.8) nokogiri (~> 1.6, >= 1.6.8)
typhoeus (~> 1.0) typhoeus (~> 1.0)
valid (~> 1.0) valid (~> 1.0)
diaspora_federation-json_schema (0.2.6) diaspora_federation-json_schema (0.2.7)
diaspora_federation-rails (0.2.6) diaspora_federation-rails (0.2.7)
actionpack (>= 5.2, < 7) actionpack (>= 5.2, < 7)
diaspora_federation (= 0.2.6) diaspora_federation (= 0.2.7)
diaspora_federation-test (0.2.6) diaspora_federation-test (0.2.7)
diaspora_federation (= 0.2.6) diaspora_federation (= 0.2.7)
fabrication (~> 2.16) fabrication (~> 2.16)
uuid (~> 2.3, >= 2.3.8) uuid (~> 2.3, >= 2.3.8)

View file

@ -9,14 +9,15 @@ This entity is sent when a person changes their diaspora* ID (e.g. when a user m
| Property | Type | Description | | Property | Type | Description |
| ----------- | ---------------------------- | ------------------------------------------------------------------------------------ | | ----------- | ---------------------------- | ------------------------------------------------------------------------------------ |
| `author` | [diaspora\* ID][diaspora-id] | The diaspora\* ID of the sender of the entity. The entity may be sent by either old user identity or new user identity. | | `author` | [diaspora\* ID][diaspora-id] | The diaspora\* ID of the sender of the entity. The entity may be sent by either old user identity or new user identity. |
| `person` | [Profile][profile] | New profile of a person. | | `profile` | [Profile][profile] | New profile of a person. |
| `signature` | [Signature][signature] | Signature that validates original and target diaspora* IDs with the private key of the second identity, other than the entity author. So if the author is the old identity then this signature is made with the new identity key, and vice versa. | | `signature` | [Signature][signature] | Signature that validates original and target diaspora* IDs with the private key of the second identity, other than the entity author. So if the author is the old identity then this signature is made with the new identity key, and vice versa. |
## Optional Properties ## Optional Properties
| Property | Type | Description | | Property | Type | Description |
| ----------- | ---------------------------- | ------------------------------------------------------------------------------------ | | ------------------- | ---------------------------- | ------------------------------------------------------------------------------------ |
| `old_identity` | [diaspora\* ID][diaspora-id] | The diaspora\* ID of the closed account. This field is mandatory if the author of the entity is the new identity. | | `old_identity` | [diaspora\* ID][diaspora-id] | The diaspora\* ID of the closed account. This field is mandatory if the author of the entity is the new identity. |
| `remote_photo_path` | [URL][url] | The URL to the path (without filenames) of the migrated photos on the new pod. |
### Signature ### Signature
@ -59,9 +60,11 @@ AccountMigration:old-diaspora-id@example.org:new-diaspora-id@example.com
07b1OIY6sTUQwV5pbpgFK0uz6W4cu+oQnlg410Q4uISUOdNOlBdYqhZJm62VFhgvzt4TZXfiJgoupFkRjP0BsaVaZuP2zKMNvO3ngWOeJRf2oRK4Ub5cEA/g7yijkRc+7y8r1iLJ31MFb1czyeCsLxw9Ol8SvAJddogGiLHDhjE= 07b1OIY6sTUQwV5pbpgFK0uz6W4cu+oQnlg410Q4uISUOdNOlBdYqhZJm62VFhgvzt4TZXfiJgoupFkRjP0BsaVaZuP2zKMNvO3ngWOeJRf2oRK4Ub5cEA/g7yijkRc+7y8r1iLJ31MFb1czyeCsLxw9Ol8SvAJddogGiLHDhjE=
</signature> </signature>
<old_identity>alice@example.org</old_identity> <old_identity>alice@example.org</old_identity>
<remote_photo_path>https://newpod.example.net/uploads/images/</remote_photo_path>
</account_migration> </account_migration>
~~~ ~~~
[diaspora-id]: {{ site.baseurl }}/federation/types.html#diaspora-id [diaspora-id]: {{ site.baseurl }}/federation/types.html#diaspora-id
[profile]: {{ site.baseurl }}/entities/profile.html [profile]: {{ site.baseurl }}/entities/profile.html
[signature]: {{ site.baseurl }}/federation/types.html#signature [signature]: {{ site.baseurl }}/federation/types.html#signature
[url]: {{ site.baseurl }}/federation/types.html#url

View file

@ -35,6 +35,11 @@ module DiasporaFederation
# @return [String] old identity # @return [String] old identity
property :old_identity, :string, default: nil property :old_identity, :string, default: nil
# @!attribute [r] remote_photo_path
# The url to the path of the photos on the new pod. Can be empty if photos weren't migrated.
# @return [String] remote photo path
property :remote_photo_path, :string, optional: true
# Returns diaspora* ID of the old person identity. # Returns diaspora* ID of the old person identity.
# @return [String] diaspora* ID of the old person identity # @return [String] diaspora* ID of the old person identity
def old_identity def old_identity

View file

@ -14,7 +14,7 @@ module DiasporaFederation
def parse(root_node) def parse(root_node)
from_xml_sanity_validation(root_node) from_xml_sanity_validation(root_node)
hash = root_node.element_children.map {|child| hash = root_node.element_children.uniq(&:name).map {|child|
property, type = find_property_for(child.name) property, type = find_property_for(child.name)
if property if property
value = parse_element_from_node(child.name, type, root_node) value = parse_element_from_node(child.name, type, root_node)

View file

@ -45,6 +45,7 @@ module DiasporaFederation
author { Fabricate.sequence(:diaspora_id) } author { Fabricate.sequence(:diaspora_id) }
profile {|attrs| Fabricate(:profile_entity, author: attrs[:author]) } profile {|attrs| Fabricate(:profile_entity, author: attrs[:author]) }
old_identity { Fabricate.sequence(:diaspora_id) } old_identity { Fabricate.sequence(:diaspora_id) }
remote_photo_path "https://diaspora.example.tld/uploads/images/"
end end
Fabricator(:person_entity, class_name: DiasporaFederation::Entities::Person) do Fabricator(:person_entity, class_name: DiasporaFederation::Entities::Person) do

View file

@ -11,6 +11,8 @@ module DiasporaFederation
rule :profile, :not_nil rule :profile, :not_nil
rule :old_identity, :diaspora_id rule :old_identity, :diaspora_id
rule :remote_photo_path, URI: [:path]
end end
end end
end end

View file

@ -12,7 +12,7 @@ module DiasporaFederation
rule :public, :boolean rule :public, :boolean
rule :remote_photo_path, :not_empty rule :remote_photo_path, [:not_empty, URI: [:path]]
rule :remote_photo_name, :not_empty rule :remote_photo_name, :not_empty

View file

@ -2,5 +2,5 @@
module DiasporaFederation module DiasporaFederation
# the gem version # the gem version
VERSION = "0.2.6" VERSION = "0.2.7"
end end

View file

@ -8,10 +8,11 @@ module DiasporaFederation
let(:new_diaspora_id) { new_user.diaspora_id } let(:new_diaspora_id) { new_user.diaspora_id }
let(:data) { let(:data) {
hash.tap {|hash| hash.dup.tap {|data|
properties = described_class.new(hash).send(:enriched_properties) properties = described_class.new(hash).send(:enriched_properties)
hash[:signature] = properties[:signature] data[:signature] = properties[:signature]
hash[:profile] = Entities::Profile.new(hash[:profile].to_h.tap {|profile| profile[:edited_at] = nil }) data[:profile] = Entities::Profile.new(hash[:profile].to_h.tap {|profile| profile[:edited_at] = nil })
data[:remote_photo_path] = "http://localhost:3000/uploads/images/"
} }
} }
let(:signature_data) { "AccountMigration:#{old_diaspora_id}:#{new_diaspora_id}" } let(:signature_data) { "AccountMigration:#{old_diaspora_id}:#{new_diaspora_id}" }
@ -128,6 +129,7 @@ module DiasporaFederation
</profile> </profile>
<signature>#{data[:signature]}</signature> <signature>#{data[:signature]}</signature>
<old_identity>#{data[:old_identity]}</old_identity> <old_identity>#{data[:old_identity]}</old_identity>
<remote_photo_path>#{data[:remote_photo_path]}</remote_photo_path>
</account_migration> </account_migration>
XML XML
@ -167,6 +169,7 @@ module DiasporaFederation
</profile> </profile>
<signature>#{data[:signature]}</signature> <signature>#{data[:signature]}</signature>
<old_identity>#{data[:old_identity]}</old_identity> <old_identity>#{data[:old_identity]}</old_identity>
<remote_photo_path>#{data[:remote_photo_path]}</remote_photo_path>
</account_migration> </account_migration>
XML XML
@ -220,5 +223,50 @@ module DiasporaFederation
}.to raise_error Entity::ValidationError }.to raise_error Entity::ValidationError
end end
end end
context "optional values" do
let(:hash) {
{
author: old_diaspora_id,
profile: Entities::Profile.new(author: new_diaspora_id)
}
}
it "uses default values when parsing" do
minimal_xml = <<~XML
<account_migration>
<author>#{data[:author]}</author>
<profile>
<author>#{data[:profile].author}</author>
</profile>
<signature>#{data[:signature]}</signature>
</account_migration>
XML
parsed_xml = Nokogiri::XML(minimal_xml).root
parsed_instance = Entity.entity_class(parsed_xml.name).from_xml(parsed_xml)
expect(parsed_instance.old_identity).to eq(data[:author])
expect(parsed_instance.remote_photo_path).to be_nil
end
it "adds old_identity when author is the old identity" do
expected_xml = <<~XML
<account_migration>
<author>#{data[:author]}</author>
<profile>
<author>#{data[:profile].author}</author>
<searchable>true</searchable>
<public>false</public>
<nsfw>false</nsfw>
</profile>
<signature>#{data[:signature]}</signature>
<old_identity>#{data[:author]}</old_identity>
</account_migration>
XML
entity = Entities::AccountMigration.new(hash)
expect(entity.to_xml.to_s.strip).to eq(expected_xml.strip)
end
end
end end
end end

View file

@ -123,6 +123,14 @@ module DiasporaFederation
expect(parsed[0][:multi].first.to_h).to eq(child_entity2.to_h) expect(parsed[0][:multi].first.to_h).to eq(child_entity2.to_h)
expect(parsed[0][:asdf]).to eq("QWERT") expect(parsed[0][:asdf]).to eq("QWERT")
end end
it "parses array entities only once" do
expect(Entities::OtherEntity).to receive(:from_xml).twice.and_call_original
parsed = Parsers::XmlParser.new(Entities::TestNestedEntity).parse(nested_payload)
expect(parsed[0][:multi]).to have(2).items
end
end end
it "doesn't drop extra properties" do it "doesn't drop extra properties" do

View file

@ -23,5 +23,16 @@ module DiasporaFederation
let(:property) { :old_identity } let(:property) { :old_identity }
end end
end end
describe "#remote_photo_path" do
let(:property) { :remote_photo_path }
it_behaves_like "a property with a value validation/restriction" do
let(:wrong_values) { [] }
let(:correct_values) { [nil] }
end
it_behaves_like "a url path validator"
end
end end
end end

View file

@ -26,11 +26,17 @@ module DiasporaFederation
let(:property) { :public } let(:property) { :public }
end end
%i[remote_photo_name remote_photo_path].each do |prop| describe "#remote_photo_path" do
describe "##{prop}" do let(:property) { :remote_photo_path }
it_behaves_like "a property that mustn't be empty" do
let(:property) { prop } it_behaves_like "a property that mustn't be empty"
end
it_behaves_like "a url path validator"
end
describe "#remote_photo_name" do
it_behaves_like "a property that mustn't be empty" do
let(:property) { :remote_photo_name }
end end
end end

View file

@ -1,15 +1,15 @@
PATH PATH
remote: ../.. remote: ../..
specs: specs:
diaspora_federation (0.2.6) diaspora_federation (0.2.7)
faraday (~> 1.0) faraday (~> 1.0)
faraday_middleware (~> 1.0) faraday_middleware (~> 1.0)
nokogiri (~> 1.6, >= 1.6.8) nokogiri (~> 1.6, >= 1.6.8)
typhoeus (~> 1.0) typhoeus (~> 1.0)
valid (~> 1.0) valid (~> 1.0)
diaspora_federation-json_schema (0.2.6) diaspora_federation-json_schema (0.2.7)
diaspora_federation-test (0.2.6) diaspora_federation-test (0.2.7)
diaspora_federation (= 0.2.6) diaspora_federation (= 0.2.7)
fabrication (~> 2.16) fabrication (~> 2.16)
uuid (~> 2.3, >= 2.3.8) uuid (~> 2.3, >= 2.3.8)