diff options
author | Benjamin Neff <benjamin@coding4coffee.ch> | 2022-07-23 04:55:00 +0300 |
---|---|---|
committer | Benjamin Neff <benjamin@coding4coffee.ch> | 2022-07-23 17:59:37 +0300 |
commit | 49ba740b45c57e4ec745736c84226dc55b18d10b (patch) | |
tree | 23613ce55d04dbdf7ff23c1006fd0335893f79e8 | |
parent | e984fa7d91a287bc0882cc3db2f451158035243b (diff) |
Add NodeInfo 2.1
-rw-r--r-- | app/presenters/node_info_presenter.rb | 2 | ||||
-rw-r--r-- | lib/node_info.rb | 31 | ||||
-rw-r--r-- | spec/controllers/node_info_controller_spec.rb | 5 | ||||
-rw-r--r-- | spec/presenters/node_info_presenter_spec.rb | 31 | ||||
-rw-r--r-- | vendor/nodeinfo/schemas/2.0.json | 2 | ||||
-rw-r--r-- | vendor/nodeinfo/schemas/2.1.json | 188 |
6 files changed, 251 insertions, 8 deletions
diff --git a/app/presenters/node_info_presenter.rb b/app/presenters/node_info_presenter.rb index 8eeda65d3..f0c231e27 100644 --- a/app/presenters/node_info_presenter.rb +++ b/app/presenters/node_info_presenter.rb @@ -30,6 +30,8 @@ class NodeInfoPresenter def add_static_data(doc) doc.software.name = "diaspora" + doc.software.repository = "https://github.com/diaspora/diaspora" + doc.software.homepage = "https://diasporafoundation.org/" doc.protocols.protocols << "diaspora" end diff --git a/lib/node_info.rb b/lib/node_info.rb index f2118af26..6237daeca 100644 --- a/lib/node_info.rb +++ b/lib/node_info.rb @@ -4,13 +4,13 @@ require "pathname" require "json-schema" module NodeInfo - VERSIONS = %w(1.0 2.0).freeze - SCHEMAS = {} + VERSIONS = %w[1.0 2.0 2.1].freeze + SCHEMAS = {} # rubocop:disable Style/MutableConstant private_constant :VERSIONS, :SCHEMAS - # rubocop:disable Metrics/BlockLength Document = Struct.new(:version, :software, :protocols, :services, :open_registrations, :usage, :metadata) do - Software = Struct.new(:name, :version) do + # rubocop:disable Lint/ConstantDefinitionInBlock + Software = Struct.new(:name, :version, :repository, :homepage) do def initialize(name=nil, version=nil) super(name, version) end @@ -21,6 +21,13 @@ module NodeInfo "version" => version } end + + def version_21_hash + version_10_hash.merge( + "repository" => repository, + "homepage" => homepage + ) + end end Protocols = Struct.new(:protocols) do @@ -80,6 +87,7 @@ module NodeInfo } end end + # rubocop:enable Lint/ConstantDefinitionInBlock def self.build new.tap do |doc| @@ -98,6 +106,8 @@ module NodeInfo version_10_hash when "2.0" version_20_hash + when "2.1" + version_21_hash end end @@ -144,6 +154,18 @@ module NodeInfo ) end + def version_21_hash + deep_compact( + "version" => "2.1", + "software" => software.version_21_hash, + "protocols" => protocols.version_20_array, + "services" => services.version_10_hash, + "openRegistrations" => open_registrations, + "usage" => usage.version_10_hash, + "metadata" => metadata + ) + end + def deep_compact(hash) hash.tap do |hash| hash.reject! {|_, value| @@ -153,7 +175,6 @@ module NodeInfo end end end - # rubocop:enable Metrics/BlockLength def self.schema(version) SCHEMAS[version] ||= JSON.parse( diff --git a/spec/controllers/node_info_controller_spec.rb b/spec/controllers/node_info_controller_spec.rb index fcad4bc31..5c2925cbb 100644 --- a/spec/controllers/node_info_controller_spec.rb +++ b/spec/controllers/node_info_controller_spec.rb @@ -20,6 +20,9 @@ describe NodeInfoController do }, { "rel" => "http://nodeinfo.diaspora.software/ns/schema/2.0", "href" => node_info_url("2.0") + }, { + "rel" => "http://nodeinfo.diaspora.software/ns/schema/2.1", + "href" => node_info_url("2.1") }] end end @@ -33,7 +36,7 @@ describe NodeInfoController do end end - %w(1.0 2.0).each do |version| + %w[1.0 2.0 2.1].each do |version| context "version #{version}" do it "responds to JSON" do get :document, params: {version: version}, format: :json diff --git a/spec/presenters/node_info_presenter_spec.rb b/spec/presenters/node_info_presenter_spec.rb index 8929213b0..005a042a6 100644 --- a/spec/presenters/node_info_presenter_spec.rb +++ b/spec/presenters/node_info_presenter_spec.rb @@ -183,5 +183,36 @@ describe NodeInfoPresenter do ) end end + + context "version 2.1" do + it "provides generic pod data in json" do + expect(NodeInfoPresenter.new("2.1").as_json.as_json).to eq( + "version" => "2.1", + "software" => { + "name" => "diaspora", + "version" => AppConfig.version_string, + "repository" => "https://github.com/diaspora/diaspora", + "homepage" => "https://diasporafoundation.org/" + }, + "protocols" => ["diaspora"], + "services" => { + "inbound" => [], + "outbound" => AppConfig.configured_services.map(&:to_s) + }, + "openRegistrations" => AppConfig.settings.enable_registrations?, + "usage" => { + "users" => {} + }, + "metadata" => { + "nodeName" => AppConfig.settings.pod_name, + "camo" => { + "markdown" => AppConfig.privacy.camo.proxy_markdown_images?, + "opengraph" => AppConfig.privacy.camo.proxy_opengraph_thumbnails?, + "remotePods" => AppConfig.privacy.camo.proxy_remote_pod_images? + } + } + ) + end + end end end diff --git a/vendor/nodeinfo/schemas/2.0.json b/vendor/nodeinfo/schemas/2.0.json index ddaca625e..da56bed13 100644 --- a/vendor/nodeinfo/schemas/2.0.json +++ b/vendor/nodeinfo/schemas/2.0.json @@ -1,5 +1,3 @@ - - { "$schema": "http://json-schema.org/draft-04/schema#", "id": "http://nodeinfo.diaspora.software/ns/schema/2.0#", diff --git a/vendor/nodeinfo/schemas/2.1.json b/vendor/nodeinfo/schemas/2.1.json new file mode 100644 index 000000000..561e64479 --- /dev/null +++ b/vendor/nodeinfo/schemas/2.1.json @@ -0,0 +1,188 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "http://nodeinfo.diaspora.software/ns/schema/2.1#", + "description": "NodeInfo schema version 2.1.", + "type": "object", + "additionalProperties": false, + "required": [ + "version", + "software", + "protocols", + "services", + "openRegistrations", + "usage", + "metadata" + ], + "properties": { + "version": { + "description": "The schema version, must be 2.1.", + "enum": [ + "2.1" + ] + }, + "software": { + "description": "Metadata about server software in use.", + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "description": "The canonical name of this server software.", + "type": "string", + "pattern": "^[a-z0-9-]+$" + }, + "version": { + "description": "The version of this server software.", + "type": "string" + }, + "repository": { + "description": "The url of the source code repository of this server software.", + "type": "string" + }, + "homepage": { + "description": "The url of the homepage of this server software.", + "type": "string" + } + } + }, + "protocols": { + "description": "The protocols supported on this server.", + "type": "array", + "minItems": 1, + "items": { + "enum": [ + "activitypub", + "buddycloud", + "dfrn", + "diaspora", + "libertree", + "ostatus", + "pumpio", + "tent", + "xmpp", + "zot" + ] + } + }, + "services": { + "description": "The third party sites this server can connect to via their application API.", + "type": "object", + "additionalProperties": false, + "required": [ + "inbound", + "outbound" + ], + "properties": { + "inbound": { + "description": "The third party sites this server can retrieve messages from for combined display with regular traffic.", + "type": "array", + "minItems": 0, + "items": { + "enum": [ + "atom1.0", + "gnusocial", + "imap", + "pnut", + "pop3", + "pumpio", + "rss2.0", + "twitter" + ] + } + }, + "outbound": { + "description": "The third party sites this server can publish messages to on the behalf of a user.", + "type": "array", + "minItems": 0, + "items": { + "enum": [ + "atom1.0", + "blogger", + "buddycloud", + "diaspora", + "dreamwidth", + "drupal", + "facebook", + "friendica", + "gnusocial", + "google", + "insanejournal", + "libertree", + "linkedin", + "livejournal", + "mediagoblin", + "myspace", + "pinterest", + "pnut", + "posterous", + "pumpio", + "redmatrix", + "rss2.0", + "smtp", + "tent", + "tumblr", + "twitter", + "wordpress", + "xmpp" + ] + } + } + } + }, + "openRegistrations": { + "description": "Whether this server allows open self-registration.", + "type": "boolean" + }, + "usage": { + "description": "Usage statistics for this server.", + "type": "object", + "additionalProperties": false, + "required": [ + "users" + ], + "properties": { + "users": { + "description": "statistics about the users of this server.", + "type": "object", + "additionalProperties": false, + "properties": { + "total": { + "description": "The total amount of on this server registered users.", + "type": "integer", + "minimum": 0 + }, + "activeHalfyear": { + "description": "The amount of users that signed in at least once in the last 180 days.", + "type": "integer", + "minimum": 0 + }, + "activeMonth": { + "description": "The amount of users that signed in at least once in the last 30 days.", + "type": "integer", + "minimum": 0 + } + } + }, + "localPosts": { + "description": "The amount of posts that were made by users that are registered on this server.", + "type": "integer", + "minimum": 0 + }, + "localComments": { + "description": "The amount of comments that were made by users that are registered on this server.", + "type": "integer", + "minimum": 0 + } + } + }, + "metadata": { + "description": "Free form key value pairs for software specific values. Clients should not rely on any specific key present.", + "type": "object", + "minProperties": 0, + "additionalProperties": true + } + } +} |