forked from mastodon/mastodon
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Validate nodeinfo response by schema (mastodon#21395)
* add json-schema to :test in Gemfile * Create node_info_2.0_schema.json * test match_response_schema * Create match_response_schema.rb * Update nodeinfo_controller_spec.rb * Rename spec/support/node_info_2.0_schema.json to spec/support/schema/node_info_2.0_schema.json * Update match_response_schema.rb * cleanup * additionally validate the json schema itself disable throwing errors test the schema matcher * rename nodeinfo schema to nodeinfo_2.0 * use Rails.root.join to construct the path * prettify json * sync Gemfile.lock
- Loading branch information
Showing
5 changed files
with
184 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
RSpec::Matchers.define :match_json_schema do |schema| | ||
match do |input_json| | ||
schema_path = Rails.root.join('spec', 'support', 'schema', "#{schema}.json").to_s | ||
JSON::Validator.validate(schema_path, input_json, validate_schema: true) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,170 @@ | ||
{ | ||
"$schema": "http://json-schema.org/draft-04/schema#", | ||
"id": "http://nodeinfo.diaspora.software/ns/schema/2.0#", | ||
"description": "NodeInfo schema version 2.0.", | ||
"type": "object", | ||
"additionalProperties": false, | ||
"required": [ | ||
"version", | ||
"software", | ||
"protocols", | ||
"services", | ||
"openRegistrations", | ||
"usage", | ||
"metadata" | ||
], | ||
"properties": { | ||
"version": { | ||
"description": "The schema version, must be 2.0.", | ||
"enum": ["2.0"] | ||
}, | ||
"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" | ||
} | ||
} | ||
}, | ||
"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 | ||
} | ||
} | ||
} |