Merge branch 'master' into hs/proposal-appservice-login
commit
24fedc2299
@ -1,16 +1,39 @@
|
|||||||
steps:
|
steps:
|
||||||
- label: ":books: Build spec"
|
- label: ":snake: Build swagger definitions for matrix.org"
|
||||||
command:
|
command:
|
||||||
- python3 -m venv env
|
# Install the python dependencies necessary to build the spec
|
||||||
- env/bin/pip install -r scripts/requirements.txt
|
- python3 -m venv env && . env/bin/activate
|
||||||
- ". env/bin/activate; scripts/generate-matrix-org-assets"
|
- pip install -r scripts/requirements.txt
|
||||||
|
# Build the spec
|
||||||
|
- scripts/generate-matrix-org-assets
|
||||||
artifact_paths:
|
artifact_paths:
|
||||||
- assets.tar.gz
|
- assets.tar.gz
|
||||||
plugins:
|
plugins:
|
||||||
- docker#v3.0.1:
|
- docker#v3.7.0:
|
||||||
image: "python:3.6"
|
image: python:3.9
|
||||||
|
|
||||||
- label: "rebuild matrix.org"
|
- label: "rebuild matrix.org"
|
||||||
trigger: "matrix-dot-org"
|
trigger: "matrix-dot-org"
|
||||||
async: true
|
async: true
|
||||||
branches: "master"
|
branches: "master"
|
||||||
|
|
||||||
|
- label: ":books: Build the spec"
|
||||||
|
command:
|
||||||
|
# Install package dependencies
|
||||||
|
- apk add nodejs npm git hugo
|
||||||
|
# Install the node dependencies necessary to build the spec
|
||||||
|
- npm i
|
||||||
|
# Pull all git submodules, required for the hugo theme
|
||||||
|
- git submodule update --init --recursive
|
||||||
|
# Pull current proposal information
|
||||||
|
- npm run get-proposals
|
||||||
|
# Build the spec, will build to './spec'
|
||||||
|
# Set the baseURL as we're deploying to https://spec.matrix.org/unstable
|
||||||
|
- hugo --baseURL "/unstable" -d "spec"
|
||||||
|
# Compress the result and make it available as an artifact
|
||||||
|
- tar -czf spec.tar.gz spec
|
||||||
|
artifact_paths:
|
||||||
|
- spec.tar.gz
|
||||||
|
plugins:
|
||||||
|
- docker#v3.7.0:
|
||||||
|
image: alpine
|
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
name: Clarity problem
|
||||||
|
about: Report an area of the spec that is unclear.
|
||||||
|
title: ''
|
||||||
|
labels: 'clarification'
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Link to problem area**:
|
||||||
|
|
||||||
|
**Issue**
|
||||||
|
What is wrong? How can we improve?
|
@ -0,0 +1,8 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Matrix Spec Discussion
|
||||||
|
url: "https://matrix.to/#/#matrix-spec:matrix.org"
|
||||||
|
about: Questions about the spec and proposal process can be asked here.
|
||||||
|
- name: Matrix Security Policy
|
||||||
|
url: https://www.matrix.org/security-disclosure-policy/
|
||||||
|
about: Learn more about our security disclosure policy.
|
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
name: Cosmetic issue
|
||||||
|
about: Report an issue with how the spec looks.
|
||||||
|
title: ''
|
||||||
|
labels: 'aesthetic'
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Link to problem area**:
|
||||||
|
|
||||||
|
**Issue**
|
||||||
|
What is wrong? What can we do to improve?
|
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
name: Spec idea
|
||||||
|
about: Suggest a future MSC idea.
|
||||||
|
title: ''
|
||||||
|
labels: 'improvement'
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Suggestion**
|
||||||
|
What would you like to see in Matrix? If your idea is vaguely complete enough, we
|
||||||
|
recommend submitting [an MSC](https://matrix.org/docs/spec/proposals) instead.
|
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
name: Documentation error
|
||||||
|
about: Report an issue with the spec itself (incorrect text).
|
||||||
|
title: ''
|
||||||
|
labels: 'spec-bug'
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Link to problem area**:
|
||||||
|
|
||||||
|
**Issue**
|
||||||
|
What is wrong?
|
||||||
|
|
||||||
|
**Expected behaviour**
|
||||||
|
How can the issue be fixed? Links to implementations/documents which prove the spec is wrong are appreciated.
|
@ -1,15 +1,21 @@
|
|||||||
/api/node_modules
|
/api/node_modules
|
||||||
/assets
|
/assets
|
||||||
/assets.tar.gz
|
/assets.tar.gz
|
||||||
|
/data/msc
|
||||||
/env*
|
/env*
|
||||||
|
/node_modules
|
||||||
|
/resources
|
||||||
/scripts/gen
|
/scripts/gen
|
||||||
/scripts/continuserv/continuserv
|
/scripts/continuserv/continuserv
|
||||||
/scripts/speculator/speculator
|
/scripts/speculator/speculator
|
||||||
/scripts/swagger
|
/scripts/swagger
|
||||||
/scripts/tmp
|
/scripts/tmp
|
||||||
/templating/out
|
/templating/out
|
||||||
|
/hugo-config.toml
|
||||||
|
/public
|
||||||
*.pyc
|
*.pyc
|
||||||
*.swp
|
*.swp
|
||||||
_rendered.rst
|
_rendered.rst
|
||||||
/.vscode/
|
/.vscode/
|
||||||
/.idea/
|
/.idea/
|
||||||
|
/spec/
|
@ -0,0 +1,4 @@
|
|||||||
|
[submodule "themes/docsy"]
|
||||||
|
path = themes/docsy
|
||||||
|
url = https://github.com/matrix-org/docsy.git
|
||||||
|
branch = master
|
@ -0,0 +1,96 @@
|
|||||||
|
# Matrix Specification
|
||||||
|
|
||||||
|
This repository contains the Matrix Specification, rendered at [spec.matrix.org](http://spec.matrix.org/).
|
||||||
|
|
||||||
|
Developers looking to use Matrix should join [#matrix-dev:matrix.org](https://matrix.to/#/#matrix-dev:matrix.org)
|
||||||
|
on Matrix for help.
|
||||||
|
|
||||||
|
Spec authors and proposal writers are welcome to join [#matrix-spec:matrix.org](https://matrix.to/#/#matrix-spec:matrix.org).
|
||||||
|
We welcome contributions! See [CONTRIBUTING.rst](./CONTRIBUTING.rst) for details.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
The Matrix spec is compiled with [Hugo](https://gohugo.io/) (a static site generator) with the following structure:
|
||||||
|
|
||||||
|
* `/assets`: assets that need postprocessing using [Hugo Pipes](https://gohugo.io/hugo-pipes/introduction/).
|
||||||
|
For example, Sass files would go here.
|
||||||
|
|
||||||
|
* `/content`: files that will become pages in the site go here. Typically these are Markdown files with some YAML front
|
||||||
|
matter indicating, [among other things](https://gohugo.io/content-management/front-matter/), what layout should be
|
||||||
|
applied to this page. The organization of files under `/content` determines the organization of pages in the built
|
||||||
|
site.
|
||||||
|
|
||||||
|
* `/data`: this can contain TOML, YAML, or JSON files. Files kept here are directly available to template code as
|
||||||
|
[data objects](https://gohugo.io/templates/data-templates/), so templates don't need to load them from a file and
|
||||||
|
parse them. This is also where our Swagger/OpenAPI definitions and schemas are.
|
||||||
|
|
||||||
|
* `/layouts`: this contains [Hugo templates](https://gohugo.io/templates/). Some templates define the overall layout of
|
||||||
|
a page: for example, whether it has header, footer, sidebar, and so on.
|
||||||
|
* `/layouts/partials`: these templates can be called from other templates, so they can be used to factor out
|
||||||
|
template code that's used in more than one template. An obvious example here is something like a sidebar, where
|
||||||
|
several different page layouts might all include the sidebar. But also, partial templates can return values: this
|
||||||
|
means they can be used like functions, that can be called by multiple templates to do some common processing.
|
||||||
|
* `/layouts/shortcodes`: these templates can be called directly from files in `/content`.
|
||||||
|
|
||||||
|
* `/static`: static files which don't need preprocessing. JS or CSS files could live here.
|
||||||
|
|
||||||
|
* `/themes`: you can use just Hugo or use it with a theme. Themes primarily provide additional templates, which are
|
||||||
|
supplied in a `/themes/$theme_name/layouts` directory. You can use a theme but customise it by providing your own
|
||||||
|
versions of any of the theme layouts in the base `/layouts` directory. That is, if a theme provides
|
||||||
|
`/themes/$theme_name/layouts/sidebar.html` and you provide `/layouts/sidebar.html`, then your version of the
|
||||||
|
template will be used.
|
||||||
|
|
||||||
|
It also has the following top-level file:
|
||||||
|
|
||||||
|
* `config.toml`: site-wide configuration settings. Some of these are built-in and you can add your own. Config settings
|
||||||
|
defined here are available in templates. All these directories above are configurable via `config.toml` settings.
|
||||||
|
|
||||||
|
Additionally, the following directories may be of interest:
|
||||||
|
|
||||||
|
* `/attic`: Here contains historical sections of specification and legacy drafts for the specification.
|
||||||
|
* `/changelogs`: Various bits of changelog for the specification areas.
|
||||||
|
* `/data-definitions`: Bits of structured data consumable by Matrix implementations.
|
||||||
|
* `/meta`: Documentation relating to the spec's processes that are otherwise untracked (release instructions, etc).
|
||||||
|
* `/scripts`: Various scripts for generating the spec and validating its contents.
|
||||||
|
* `/proposals`: Matrix Spec Change (MSC) proposals. See <https://spec.matrix.org/unstable/proposals/>.
|
||||||
|
|
||||||
|
## Authoring changes to the spec
|
||||||
|
|
||||||
|
Please read [CONTRIBUTING.rst](./CONTRIBUTING.rst) before authoring a change to the spec. Note that spec authoring takes
|
||||||
|
place after an MSC has been accepted, not as part of a proposal itself.
|
||||||
|
|
||||||
|
1. Install the extended version (often the OS default) of Hugo: <https://gohugo.io/getting-started/installing>
|
||||||
|
2. Run `git submodule update --init --recursive` for good measure.
|
||||||
|
3. Run `npm i` to install the dependencies. Note that this will require NodeJS to be installed.
|
||||||
|
4. Run `npm run get-proposals` to seed proposal data. This is merely for populating the content of the "Spec Change Proposals"
|
||||||
|
page and is not required.
|
||||||
|
5. Run `hugo serve` to run a local webserver which builds whenever a file change is detected. If watching doesn't appear
|
||||||
|
to be working for you, try `hugo serve --disableFastRender` instead.
|
||||||
|
6. Edit the specification 🙂
|
||||||
|
|
||||||
|
We use a highly customized [Docsy](https://www.docsy.dev/) theme for our generated site, which uses Bootstrap and Font
|
||||||
|
Awesome. If you're looking at making design-related changes to the spec site, please coordinate with us in
|
||||||
|
[#matrix-docs:matrix.org](https://matrix.to/#/#matrix-docs:matrix.org) before opening a PR.
|
||||||
|
|
||||||
|
## Building the specification
|
||||||
|
|
||||||
|
If for some reason you're not a CI/CD system and want to render a static version of the spec for yourself, follow the above
|
||||||
|
steps for authoring changes to the specification and instead of `hugo serve` run `hugo -d "spec"` - this will generate the
|
||||||
|
spec to `/spec`. If you'd like to serve the spec off a path instead of a domain root (eg: `/unstable`), add `--baseURL "/unstable"`
|
||||||
|
to the `hugo -d "spec"` command.
|
||||||
|
|
||||||
|
For building the swagger definitions, create a python3 virtualenv and activate it. Then run `pip install -r ./scripts/requirements.txt`
|
||||||
|
and finally `python ./scripts/dump-swagger.py` to generate it to `./scripts/swagger/api-docs.json`. To make use of the generated file,
|
||||||
|
there are a number of options:
|
||||||
|
|
||||||
|
* It can be uploaded from your filesystem to an online editor/viewer such as [on the swagger website](http://editor.swagger.io/).
|
||||||
|
* You can run a local HTTP server by running `./scripts/swagger-http-server.py`, and then view the documentation via an
|
||||||
|
online viewer; for example, at <http://petstore.swagger.io/?url=http://localhost:8000/api-docs.json>.
|
||||||
|
* You can host the swagger UI yourself. See <https://github.com/swagger-api/swagger-ui#how-to-run> for advice on how to
|
||||||
|
do so.
|
||||||
|
|
||||||
|
## Issue tracking
|
||||||
|
|
||||||
|
Specification issues are tracked on github at <https://github.com/matrix-org/matrix-doc/issues>.
|
||||||
|
|
||||||
|
See [meta/github-labels.rst](./meta/github-labels.rst) for information on what the labels mean.
|
@ -1,143 +0,0 @@
|
|||||||
This repository contains the Matrix specification.
|
|
||||||
|
|
||||||
If you want to ask more about the specification, join us on
|
|
||||||
`#matrix-dev:matrix.org <http://matrix.to/#/#matrix-dev:matrix.org>`_.
|
|
||||||
|
|
||||||
We welcome contributions to the spec! See the notes below on `Building the
|
|
||||||
specification`_, and `<CONTRIBUTING.rst>`_ to get started making contributions.
|
|
||||||
|
|
||||||
Note that the Matrix Project lists, which were previously kept in this
|
|
||||||
repository, are now in https://github.com/matrix-org/matrix.org.
|
|
||||||
|
|
||||||
Structure of this repository
|
|
||||||
============================
|
|
||||||
|
|
||||||
- ``api`` : `OpenAPI`_ (swagger) specifications for the the HTTP APIs.
|
|
||||||
- ``attic``: historical sections of specification for reference
|
|
||||||
purposes.
|
|
||||||
- ``changelogs``: change logs for the various parts of the
|
|
||||||
specification.
|
|
||||||
- ``drafts``: Previously, contained documents which were under discussion for
|
|
||||||
future incusion into the specification and/or supporting documentation. This
|
|
||||||
is now historical, as we use separate discussion documents (see
|
|
||||||
`<CONTRIBUTING.rst>`_).
|
|
||||||
- ``event-schemas``: the `JSON Schema`_ for all Matrix events
|
|
||||||
contained in the specification, along with example JSON files.
|
|
||||||
- ``meta``: documents outlining the processes involved when writing
|
|
||||||
documents, e.g. documentation style, guidelines.
|
|
||||||
- ``scripts``: scripts to generate formatted versions of the
|
|
||||||
documentation, typically HTML.
|
|
||||||
- ``specification``: the specification split up into sections.
|
|
||||||
|
|
||||||
.. _OpenAPI: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md
|
|
||||||
.. _JSON Schema: http://json-schema.org/
|
|
||||||
|
|
||||||
Building the specification
|
|
||||||
==========================
|
|
||||||
|
|
||||||
The Matrix Spec is generated by a set of scripts, from the RST documents, API
|
|
||||||
specs and event schemas in this repository.
|
|
||||||
|
|
||||||
Preparation
|
|
||||||
-----------
|
|
||||||
|
|
||||||
To use the scripts, it is best to create a Python 3.4+ virtualenv as follows::
|
|
||||||
|
|
||||||
virtualenv -p python3 env
|
|
||||||
env/bin/pip install -r scripts/requirements.txt
|
|
||||||
|
|
||||||
(Benjamin Saunders has contributed a script for `Nix`_ users, which can be
|
|
||||||
invoked with ``nix-shell scripts/contrib/shell.nix``.)
|
|
||||||
|
|
||||||
.. TODO: Possibly we need some libs installed; should record what they are.
|
|
||||||
|
|
||||||
.. _`Nix`: https://nixos.org/nix/
|
|
||||||
|
|
||||||
Generating the specification
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
To rebuild the specification, use ``scripts/gendoc.py``::
|
|
||||||
|
|
||||||
source env/bin/activate
|
|
||||||
./scripts/gendoc.py
|
|
||||||
|
|
||||||
The above will write the rendered version of the specification to
|
|
||||||
``scripts/gen``. To view it, point your browser at ``scripts/gen/index.html``.
|
|
||||||
|
|
||||||
Windows users
|
|
||||||
~~~~~~~~~~~~~
|
|
||||||
The ``source`` program does not exist on Windows, so instead run one of the
|
|
||||||
``activate`` files in ``.\env\Scripts\`` to activate the virtual environment.
|
|
||||||
|
|
||||||
If you're on Windows Vista or higher, be sure that the "Symbolic Links"
|
|
||||||
option was selected when installing Git prior to cloning this repository. If
|
|
||||||
you're still seeing errors about files not being found it is likely because
|
|
||||||
the symlink at ``api/client-server/definitions/event-schemas`` looks like a
|
|
||||||
file. To correct the problem, open an Administrative/Elevated Command Prompt in your
|
|
||||||
cloned matrix-doc directory and run the following::
|
|
||||||
|
|
||||||
cd api\client-server\definitions
|
|
||||||
del event-schemas
|
|
||||||
mklink /D event-schemas "..\..\..\event-schemas"
|
|
||||||
|
|
||||||
This will delete the file and replace it with a symlink. Git should not detect
|
|
||||||
this as a change, and you should be able to go back to building the project.
|
|
||||||
|
|
||||||
Generating the OpenAPI (Swagger) specs
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
`Swagger`_ is a framework for representing RESTful APIs. We use it to generate
|
|
||||||
interactive documentation for our APIs.
|
|
||||||
|
|
||||||
Before the Swagger docs can be used in the Swagger UI (or other tool expecting
|
|
||||||
a Swagger specs, they must be combined into a single json file. This can be
|
|
||||||
done as follows::
|
|
||||||
|
|
||||||
source env/bin/activate
|
|
||||||
./scripts/dump-swagger.py
|
|
||||||
|
|
||||||
By default, ``dump-swagger`` will write to ``scripts/swagger/api-docs.json``.
|
|
||||||
|
|
||||||
To make use of the generated file, there are a number of options:
|
|
||||||
|
|
||||||
* It can be uploaded from your filesystem to an online editor/viewer such as
|
|
||||||
http://editor.swagger.io/
|
|
||||||
* You can run a local HTTP server by running
|
|
||||||
``./scripts/swagger-http-server.py``, and then view the documentation via an
|
|
||||||
online viewer; for example, at
|
|
||||||
http://petstore.swagger.io/?url=http://localhost:8000/api-docs.json
|
|
||||||
* You can host the swagger UI yourself. See
|
|
||||||
https://github.com/swagger-api/swagger-ui#how-to-run for advice on how to do
|
|
||||||
so.
|
|
||||||
|
|
||||||
.. _`Swagger`: http://swagger.io/
|
|
||||||
|
|
||||||
Continuserv
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Continuserv is a script which will rebuild the specification every time a file
|
|
||||||
is changed, and will serve it to a browser over HTTP. It is intended for use by
|
|
||||||
specification authors, so that they can quickly see the effects of their
|
|
||||||
changes.
|
|
||||||
|
|
||||||
It is written in Go, so you will need the ``go`` compiler installed on your
|
|
||||||
computer. You will also need to install fsnotify by running::
|
|
||||||
|
|
||||||
go get gopkg.in/fsnotify/fsnotify.v1
|
|
||||||
|
|
||||||
Then, create a virtualenv as described above under `Preparation`_,
|
|
||||||
and::
|
|
||||||
|
|
||||||
source env/bin/activate
|
|
||||||
go run ./scripts/continuserv/main.go
|
|
||||||
|
|
||||||
You will then be able to view the generated spec by visiting
|
|
||||||
http://localhost:8000/index.html.
|
|
||||||
|
|
||||||
Issue tracking
|
|
||||||
==============
|
|
||||||
|
|
||||||
Issues with the Matrix specification are tracked in `GitHub
|
|
||||||
<https://github.com/matrix-org/matrix-doc/issues>`_.
|
|
||||||
|
|
||||||
See `meta/github-labels.rst <meta/github-labels.rst>`_ for notes on what the labels mean.
|
|
@ -1,2 +0,0 @@
|
|||||||
This directory contains swagger-compatible representations of our APIs. See
|
|
||||||
the main README.rst for details on how to make use of them.
|
|
@ -1 +0,0 @@
|
|||||||
../../../event-schemas
|
|
@ -1,38 +0,0 @@
|
|||||||
// Backbone.js 0.9.2
|
|
||||||
|
|
||||||
// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
|
|
||||||
// Backbone may be freely distributed under the MIT license.
|
|
||||||
// For all details and documentation:
|
|
||||||
// http://backbonejs.org
|
|
||||||
(function(){var l=this,y=l.Backbone,z=Array.prototype.slice,A=Array.prototype.splice,g;g="undefined"!==typeof exports?exports:l.Backbone={};g.VERSION="0.9.2";var f=l._;!f&&"undefined"!==typeof require&&(f=require("underscore"));var i=l.jQuery||l.Zepto||l.ender;g.setDomLibrary=function(a){i=a};g.noConflict=function(){l.Backbone=y;return this};g.emulateHTTP=!1;g.emulateJSON=!1;var p=/\s+/,k=g.Events={on:function(a,b,c){var d,e,f,g,j;if(!b)return this;a=a.split(p);for(d=this._callbacks||(this._callbacks=
|
|
||||||
{});e=a.shift();)f=(j=d[e])?j.tail:{},f.next=g={},f.context=c,f.callback=b,d[e]={tail:g,next:j?j.next:f};return this},off:function(a,b,c){var d,e,h,g,j,q;if(e=this._callbacks){if(!a&&!b&&!c)return delete this._callbacks,this;for(a=a?a.split(p):f.keys(e);d=a.shift();)if(h=e[d],delete e[d],h&&(b||c))for(g=h.tail;(h=h.next)!==g;)if(j=h.callback,q=h.context,b&&j!==b||c&&q!==c)this.on(d,j,q);return this}},trigger:function(a){var b,c,d,e,f,g;if(!(d=this._callbacks))return this;f=d.all;a=a.split(p);for(g=
|
|
||||||
z.call(arguments,1);b=a.shift();){if(c=d[b])for(e=c.tail;(c=c.next)!==e;)c.callback.apply(c.context||this,g);if(c=f){e=c.tail;for(b=[b].concat(g);(c=c.next)!==e;)c.callback.apply(c.context||this,b)}}return this}};k.bind=k.on;k.unbind=k.off;var o=g.Model=function(a,b){var c;a||(a={});b&&b.parse&&(a=this.parse(a));if(c=n(this,"defaults"))a=f.extend({},c,a);b&&b.collection&&(this.collection=b.collection);this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");this.changed={};this._silent=
|
|
||||||
{};this._pending={};this.set(a,{silent:!0});this.changed={};this._silent={};this._pending={};this._previousAttributes=f.clone(this.attributes);this.initialize.apply(this,arguments)};f.extend(o.prototype,k,{changed:null,_silent:null,_pending:null,idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;if(b=this._escapedAttributes[a])return b;b=this.get(a);return this._escapedAttributes[a]=f.escape(null==
|
|
||||||
b?"":""+b)},has:function(a){return null!=this.get(a)},set:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c||(c={});if(!d)return this;d instanceof o&&(d=d.attributes);if(c.unset)for(e in d)d[e]=void 0;if(!this._validate(d,c))return!1;this.idAttribute in d&&(this.id=d[this.idAttribute]);var b=c.changes={},h=this.attributes,g=this._escapedAttributes,j=this._previousAttributes||{};for(e in d){a=d[e];if(!f.isEqual(h[e],a)||c.unset&&f.has(h,e))delete g[e],(c.silent?this._silent:
|
|
||||||
b)[e]=!0;c.unset?delete h[e]:h[e]=a;!f.isEqual(j[e],a)||f.has(h,e)!=f.has(j,e)?(this.changed[e]=a,c.silent||(this._pending[e]=!0)):(delete this.changed[e],delete this._pending[e])}c.silent||this.change(c);return this},unset:function(a,b){(b||(b={})).unset=!0;return this.set(a,null,b)},clear:function(a){(a||(a={})).unset=!0;return this.set(f.clone(this.attributes),a)},fetch:function(a){var a=a?f.clone(a):{},b=this,c=a.success;a.success=function(d,e,f){if(!b.set(b.parse(d,f),a))return!1;c&&c(b,d)};
|
|
||||||
a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},save:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c=c?f.clone(c):{};if(c.wait){if(!this._validate(d,c))return!1;e=f.clone(this.attributes)}a=f.extend({},c,{silent:!0});if(d&&!this.set(d,c.wait?a:c))return!1;var h=this,i=c.success;c.success=function(a,b,e){b=h.parse(a,e);if(c.wait){delete c.wait;b=f.extend(d||{},b)}if(!h.set(b,c))return false;i?i(h,a):h.trigger("sync",h,a,c)};c.error=g.wrapError(c.error,
|
|
||||||
h,c);b=this.isNew()?"create":"update";b=(this.sync||g.sync).call(this,b,this,c);c.wait&&this.set(e,a);return b},destroy:function(a){var a=a?f.clone(a):{},b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};if(this.isNew())return d(),!1;a.success=function(e){a.wait&&d();c?c(b,e):b.trigger("sync",b,e,a)};a.error=g.wrapError(a.error,b,a);var e=(this.sync||g.sync).call(this,"delete",this,a);a.wait||d();return e},url:function(){var a=n(this,"urlRoot")||n(this.collection,"url")||t();
|
|
||||||
return this.isNew()?a:a+("/"==a.charAt(a.length-1)?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return null==this.id},change:function(a){a||(a={});var b=this._changing;this._changing=!0;for(var c in this._silent)this._pending[c]=!0;var d=f.extend({},a.changes,this._silent);this._silent={};for(c in d)this.trigger("change:"+c,this,this.get(c),a);if(b)return this;for(;!f.isEmpty(this._pending);){this._pending=
|
|
||||||
{};this.trigger("change",this,a);for(c in this.changed)!this._pending[c]&&!this._silent[c]&&delete this.changed[c];this._previousAttributes=f.clone(this.attributes)}this._changing=!1;return this},hasChanged:function(a){return!arguments.length?!f.isEmpty(this.changed):f.has(this.changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this.changed):!1;var b,c=!1,d=this._previousAttributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return!arguments.length||
|
|
||||||
!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},isValid:function(){return!this.validate(this.attributes)},_validate:function(a,b){if(b.silent||!this.validate)return!0;var a=f.extend({},this.attributes,a),c=this.validate(a,b);if(!c)return!0;b&&b.error?b.error(this,c,b):this.trigger("error",this,c,b);return!1}});var r=g.Collection=function(a,b){b||(b={});b.model&&(this.model=b.model);b.comparator&&(this.comparator=b.comparator);
|
|
||||||
this._reset();this.initialize.apply(this,arguments);a&&this.reset(a,{silent:!0,parse:b.parse})};f.extend(r.prototype,k,{model:o,initialize:function(){},toJSON:function(a){return this.map(function(b){return b.toJSON(a)})},add:function(a,b){var c,d,e,g,i,j={},k={},l=[];b||(b={});a=f.isArray(a)?a.slice():[a];c=0;for(d=a.length;c<d;c++){if(!(e=a[c]=this._prepareModel(a[c],b)))throw Error("Can't add an invalid model to a collection");g=e.cid;i=e.id;j[g]||this._byCid[g]||null!=i&&(k[i]||this._byId[i])?
|
|
||||||
l.push(c):j[g]=k[i]=e}for(c=l.length;c--;)a.splice(l[c],1);c=0;for(d=a.length;c<d;c++)(e=a[c]).on("all",this._onModelEvent,this),this._byCid[e.cid]=e,null!=e.id&&(this._byId[e.id]=e);this.length+=d;A.apply(this.models,[null!=b.at?b.at:this.models.length,0].concat(a));this.comparator&&this.sort({silent:!0});if(b.silent)return this;c=0;for(d=this.models.length;c<d;c++)if(j[(e=this.models[c]).cid])b.index=c,e.trigger("add",e,this,b);return this},remove:function(a,b){var c,d,e,g;b||(b={});a=f.isArray(a)?
|
|
||||||
a.slice():[a];c=0;for(d=a.length;c<d;c++)if(g=this.getByCid(a[c])||this.get(a[c]))delete this._byId[g.id],delete this._byCid[g.cid],e=this.indexOf(g),this.models.splice(e,1),this.length--,b.silent||(b.index=e,g.trigger("remove",g,this,b)),this._removeReference(g);return this},push:function(a,b){a=this._prepareModel(a,b);this.add(a,b);return a},pop:function(a){var b=this.at(this.length-1);this.remove(b,a);return b},unshift:function(a,b){a=this._prepareModel(a,b);this.add(a,f.extend({at:0},b));return a},
|
|
||||||
shift:function(a){var b=this.at(0);this.remove(b,a);return b},get:function(a){return null==a?void 0:this._byId[null!=a.id?a.id:a]},getByCid:function(a){return a&&this._byCid[a.cid||a]},at:function(a){return this.models[a]},where:function(a){return f.isEmpty(a)?[]:this.filter(function(b){for(var c in a)if(a[c]!==b.get(c))return!1;return!0})},sort:function(a){a||(a={});if(!this.comparator)throw Error("Cannot sort a set without a comparator");var b=f.bind(this.comparator,this);1==this.comparator.length?
|
|
||||||
this.models=this.sortBy(b):this.models.sort(b);a.silent||this.trigger("reset",this,a);return this},pluck:function(a){return f.map(this.models,function(b){return b.get(a)})},reset:function(a,b){a||(a=[]);b||(b={});for(var c=0,d=this.models.length;c<d;c++)this._removeReference(this.models[c]);this._reset();this.add(a,f.extend({silent:!0},b));b.silent||this.trigger("reset",this,b);return this},fetch:function(a){a=a?f.clone(a):{};void 0===a.parse&&(a.parse=!0);var b=this,c=a.success;a.success=function(d,
|
|
||||||
e,f){b[a.add?"add":"reset"](b.parse(d,f),a);c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},create:function(a,b){var c=this,b=b?f.clone(b):{},a=this._prepareModel(a,b);if(!a)return!1;b.wait||c.add(a,b);var d=b.success;b.success=function(e,f){b.wait&&c.add(e,b);d?d(e,f):e.trigger("sync",a,f,b)};a.save(null,b);return a},parse:function(a){return a},chain:function(){return f(this.models).chain()},_reset:function(){this.length=0;this.models=[];this._byId=
|
|
||||||
{};this._byCid={}},_prepareModel:function(a,b){b||(b={});a instanceof o?a.collection||(a.collection=this):(b.collection=this,a=new this.model(a,b),a._validate(a.attributes,b)||(a=!1));return a},_removeReference:function(a){this==a.collection&&delete a.collection;a.off("all",this._onModelEvent,this)},_onModelEvent:function(a,b,c,d){("add"==a||"remove"==a)&&c!=this||("destroy"==a&&this.remove(b,d),b&&a==="change:"+b.idAttribute&&(delete this._byId[b.previous(b.idAttribute)],this._byId[b.id]=b),this.trigger.apply(this,
|
|
||||||
arguments))}});f.each("forEach,each,map,reduce,reduceRight,find,detect,filter,select,reject,every,all,some,any,include,contains,invoke,max,min,sortBy,sortedIndex,toArray,size,first,initial,rest,last,without,indexOf,shuffle,lastIndexOf,isEmpty,groupBy".split(","),function(a){r.prototype[a]=function(){return f[a].apply(f,[this.models].concat(f.toArray(arguments)))}});var u=g.Router=function(a){a||(a={});a.routes&&(this.routes=a.routes);this._bindRoutes();this.initialize.apply(this,arguments)},B=/:\w+/g,
|
|
||||||
C=/\*\w+/g,D=/[-[\]{}()+?.,\\^$|#\s]/g;f.extend(u.prototype,k,{initialize:function(){},route:function(a,b,c){g.history||(g.history=new m);f.isRegExp(a)||(a=this._routeToRegExp(a));c||(c=this[b]);g.history.route(a,f.bind(function(d){d=this._extractParameters(a,d);c&&c.apply(this,d);this.trigger.apply(this,["route:"+b].concat(d));g.history.trigger("route",this,b,d)},this));return this},navigate:function(a,b){g.history.navigate(a,b)},_bindRoutes:function(){if(this.routes){var a=[],b;for(b in this.routes)a.unshift([b,
|
|
||||||
this.routes[b]]);b=0;for(var c=a.length;b<c;b++)this.route(a[b][0],a[b][1],this[a[b][1]])}},_routeToRegExp:function(a){a=a.replace(D,"\\$&").replace(B,"([^/]+)").replace(C,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,b){return a.exec(b).slice(1)}});var m=g.History=function(){this.handlers=[];f.bindAll(this,"checkUrl")},s=/^[#\/]/,E=/msie [\w.]+/;m.started=!1;f.extend(m.prototype,k,{interval:50,getHash:function(a){return(a=(a?a.location:window.location).href.match(/#(.*)$/))?a[1]:
|
|
||||||
""},getFragment:function(a,b){if(null==a)if(this._hasPushState||b){var a=window.location.pathname,c=window.location.search;c&&(a+=c)}else a=this.getHash();a.indexOf(this.options.root)||(a=a.substr(this.options.root.length));return a.replace(s,"")},start:function(a){if(m.started)throw Error("Backbone.history has already been started");m.started=!0;this.options=f.extend({},{root:"/"},this.options,a);this._wantsHashChange=!1!==this.options.hashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=
|
|
||||||
!(!this.options.pushState||!window.history||!window.history.pushState);var a=this.getFragment(),b=document.documentMode;if(b=E.exec(navigator.userAgent.toLowerCase())&&(!b||7>=b))this.iframe=i('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow,this.navigate(a);this._hasPushState?i(window).bind("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!b?i(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,
|
|
||||||
this.interval));this.fragment=a;a=window.location;b=a.pathname==this.options.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,!0),window.location.replace(this.options.root+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&b&&a.hash&&(this.fragment=this.getHash().replace(s,""),window.history.replaceState({},document.title,a.protocol+"//"+a.host+this.options.root+this.fragment));if(!this.options.silent)return this.loadUrl()},
|
|
||||||
stop:function(){i(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);m.started=!1},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a==this.fragment&&this.iframe&&(a=this.getFragment(this.getHash(this.iframe)));if(a==this.fragment)return!1;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(a){var b=this.fragment=this.getFragment(a);return f.any(this.handlers,
|
|
||||||
function(a){if(a.route.test(b))return a.callback(b),!0})},navigate:function(a,b){if(!m.started)return!1;if(!b||!0===b)b={trigger:b};var c=(a||"").replace(s,"");this.fragment!=c&&(this._hasPushState?(0!=c.indexOf(this.options.root)&&(c=this.options.root+c),this.fragment=c,window.history[b.replace?"replaceState":"pushState"]({},document.title,c)):this._wantsHashChange?(this.fragment=c,this._updateHash(window.location,c,b.replace),this.iframe&&c!=this.getFragment(this.getHash(this.iframe))&&(b.replace||
|
|
||||||
this.iframe.document.open().close(),this._updateHash(this.iframe.location,c,b.replace))):window.location.assign(this.options.root+a),b.trigger&&this.loadUrl(a))},_updateHash:function(a,b,c){c?a.replace(a.toString().replace(/(javascript:|#).*$/,"")+"#"+b):a.hash=b}});var v=g.View=function(a){this.cid=f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()},F=/^(\S+)\s*(.*)$/,w="model,collection,el,id,attributes,className,tagName".split(",");
|
|
||||||
f.extend(v.prototype,k,{tagName:"div",$:function(a){return this.$el.find(a)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();return this},make:function(a,b,c){a=document.createElement(a);b&&i(a).attr(b);c&&i(a).html(c);return a},setElement:function(a,b){this.$el&&this.undelegateEvents();this.$el=a instanceof i?a:i(a);this.el=this.$el[0];!1!==b&&this.delegateEvents();return this},delegateEvents:function(a){if(a||(a=n(this,"events"))){this.undelegateEvents();
|
|
||||||
for(var b in a){var c=a[b];f.isFunction(c)||(c=this[a[b]]);if(!c)throw Error('Method "'+a[b]+'" does not exist');var d=b.match(F),e=d[1],d=d[2],c=f.bind(c,this),e=e+(".delegateEvents"+this.cid);""===d?this.$el.bind(e,c):this.$el.delegate(d,e,c)}}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+this.cid)},_configure:function(a){this.options&&(a=f.extend({},this.options,a));for(var b=0,c=w.length;b<c;b++){var d=w[b];a[d]&&(this[d]=a[d])}this.options=a},_ensureElement:function(){if(this.el)this.setElement(this.el,
|
|
||||||
!1);else{var a=n(this,"attributes")||{};this.id&&(a.id=this.id);this.className&&(a["class"]=this.className);this.setElement(this.make(this.tagName,a),!1)}}});o.extend=r.extend=u.extend=v.extend=function(a,b){var c=G(this,a,b);c.extend=this.extend;return c};var H={create:"POST",update:"PUT","delete":"DELETE",read:"GET"};g.sync=function(a,b,c){var d=H[a];c||(c={});var e={type:d,dataType:"json"};c.url||(e.url=n(b,"url")||t());if(!c.data&&b&&("create"==a||"update"==a))e.contentType="application/json",
|
|
||||||
e.data=JSON.stringify(b.toJSON());g.emulateJSON&&(e.contentType="application/x-www-form-urlencoded",e.data=e.data?{model:e.data}:{});if(g.emulateHTTP&&("PUT"===d||"DELETE"===d))g.emulateJSON&&(e.data._method=d),e.type="POST",e.beforeSend=function(a){a.setRequestHeader("X-HTTP-Method-Override",d)};"GET"!==e.type&&!g.emulateJSON&&(e.processData=!1);return i.ajax(f.extend(e,c))};g.wrapError=function(a,b,c){return function(d,e){e=d===b?e:d;a?a(b,e,c):b.trigger("error",b,e,c)}};var x=function(){},G=function(a,
|
|
||||||
b,c){var d;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};f.extend(d,a);x.prototype=a.prototype;d.prototype=new x;b&&f.extend(d.prototype,b);c&&f.extend(d,c);d.prototype.constructor=d;d.__super__=a.prototype;return d},n=function(a,b){return!a||!a[b]?null:f.isFunction(a[b])?a[b]():a[b]},t=function(){throw Error('A "url" property or function must be specified');}}).call(this);
|
|
@ -1,16 +0,0 @@
|
|||||||
/* latin */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Droid Sans';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
src: local('Droid Sans'), local('DroidSans'), url(http://fonts.gstatic.com/s/droidsans/v5/s-BiyweUPV0v-yRb-cjciPk_vArhqVIZ0nv9q090hN8.woff2), format('woff2');
|
|
||||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
|
||||||
}
|
|
||||||
/* latin */
|
|
||||||
@font-face {
|
|
||||||
font-family: 'Droid Sans';
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 700;
|
|
||||||
src: local('Droid Sans Bold'), local('DroidSans-Bold'), url(http://fonts.gstatic.com/s/droidsans/v5/EFpQQyG9GqCrobXxL-KRMYWiMMZ7xLd792ULpGE4W_Y.woff2), format('woff2');
|
|
||||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,18 +0,0 @@
|
|||||||
/*
|
|
||||||
* jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
|
|
||||||
* http://benalman.com/projects/jquery-bbq-plugin/
|
|
||||||
*
|
|
||||||
* Copyright (c) 2010 "Cowboy" Ben Alman
|
|
||||||
* Dual licensed under the MIT and GPL licenses.
|
|
||||||
* http://benalman.com/about/license/
|
|
||||||
*/
|
|
||||||
(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
|
|
||||||
/*
|
|
||||||
* jQuery hashchange event - v1.2 - 2/11/2010
|
|
||||||
* http://benalman.com/projects/jquery-hashchange-plugin/
|
|
||||||
*
|
|
||||||
* Copyright (c) 2010 "Cowboy" Ben Alman
|
|
||||||
* Dual licensed under the MIT and GPL licenses.
|
|
||||||
* http://benalman.com/about/license/
|
|
||||||
*/
|
|
||||||
(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
|
|
@ -1 +0,0 @@
|
|||||||
(function(b){b.fn.slideto=function(a){a=b.extend({slide_duration:"slow",highlight_duration:3E3,highlight:true,highlight_color:"#FFFF99"},a);return this.each(function(){obj=b(this);b("body").animate({scrollTop:obj.offset().top},a.slide_duration,function(){a.highlight&&b.ui.version&&obj.effect("highlight",{color:a.highlight_color},a.highlight_duration)})})}})(jQuery);
|
|
@ -1,8 +0,0 @@
|
|||||||
/*
|
|
||||||
jQuery Wiggle
|
|
||||||
Author: WonderGroup, Jordan Thomas
|
|
||||||
URL: http://labs.wondergroup.com/demos/mini-ui/index.html
|
|
||||||
License: MIT (http://en.wikipedia.org/wiki/MIT_License)
|
|
||||||
*/
|
|
||||||
jQuery.fn.wiggle=function(o){var d={speed:50,wiggles:3,travel:5,callback:null};var o=jQuery.extend(d,o);return this.each(function(){var cache=this;var wrap=jQuery(this).wrap('<div class="wiggle-wrap"></div>').css("position","relative");var calls=0;for(i=1;i<=o.wiggles;i++){jQuery(this).animate({left:"-="+o.travel},o.speed).animate({left:"+="+o.travel*2},o.speed*2).animate({left:"-="+o.travel},o.speed,function(){calls++;if(jQuery(cache).parent().hasClass('wiggle-wrap')){jQuery(cache).parent().replaceWith(cache);}
|
|
||||||
if(calls==o.wiggles&&jQuery.isFunction(o.callback)){o.callback();}});}});};
|
|
@ -1,125 +0,0 @@
|
|||||||
/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 */
|
|
||||||
html,
|
|
||||||
body,
|
|
||||||
div,
|
|
||||||
span,
|
|
||||||
applet,
|
|
||||||
object,
|
|
||||||
iframe,
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
h5,
|
|
||||||
h6,
|
|
||||||
p,
|
|
||||||
blockquote,
|
|
||||||
pre,
|
|
||||||
a,
|
|
||||||
abbr,
|
|
||||||
acronym,
|
|
||||||
address,
|
|
||||||
big,
|
|
||||||
cite,
|
|
||||||
code,
|
|
||||||
del,
|
|
||||||
dfn,
|
|
||||||
em,
|
|
||||||
img,
|
|
||||||
ins,
|
|
||||||
kbd,
|
|
||||||
q,
|
|
||||||
s,
|
|
||||||
samp,
|
|
||||||
small,
|
|
||||||
strike,
|
|
||||||
strong,
|
|
||||||
sub,
|
|
||||||
sup,
|
|
||||||
tt,
|
|
||||||
var,
|
|
||||||
b,
|
|
||||||
u,
|
|
||||||
i,
|
|
||||||
center,
|
|
||||||
dl,
|
|
||||||
dt,
|
|
||||||
dd,
|
|
||||||
ol,
|
|
||||||
ul,
|
|
||||||
li,
|
|
||||||
fieldset,
|
|
||||||
form,
|
|
||||||
label,
|
|
||||||
legend,
|
|
||||||
table,
|
|
||||||
caption,
|
|
||||||
tbody,
|
|
||||||
tfoot,
|
|
||||||
thead,
|
|
||||||
tr,
|
|
||||||
th,
|
|
||||||
td,
|
|
||||||
article,
|
|
||||||
aside,
|
|
||||||
canvas,
|
|
||||||
details,
|
|
||||||
embed,
|
|
||||||
figure,
|
|
||||||
figcaption,
|
|
||||||
footer,
|
|
||||||
header,
|
|
||||||
hgroup,
|
|
||||||
menu,
|
|
||||||
nav,
|
|
||||||
output,
|
|
||||||
ruby,
|
|
||||||
section,
|
|
||||||
summary,
|
|
||||||
time,
|
|
||||||
mark,
|
|
||||||
audio,
|
|
||||||
video {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
border: 0;
|
|
||||||
font-size: 100%;
|
|
||||||
font: inherit;
|
|
||||||
vertical-align: baseline;
|
|
||||||
}
|
|
||||||
/* HTML5 display-role reset for older browsers */
|
|
||||||
article,
|
|
||||||
aside,
|
|
||||||
details,
|
|
||||||
figcaption,
|
|
||||||
figure,
|
|
||||||
footer,
|
|
||||||
header,
|
|
||||||
hgroup,
|
|
||||||
menu,
|
|
||||||
nav,
|
|
||||||
section {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
ol,
|
|
||||||
ul {
|
|
||||||
list-style: none;
|
|
||||||
}
|
|
||||||
blockquote,
|
|
||||||
q {
|
|
||||||
quotes: none;
|
|
||||||
}
|
|
||||||
blockquote:before,
|
|
||||||
blockquote:after,
|
|
||||||
q:before,
|
|
||||||
q:after {
|
|
||||||
content: '';
|
|
||||||
content: none;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
border-spacing: 0;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,211 +0,0 @@
|
|||||||
var appName;
|
|
||||||
var popupMask;
|
|
||||||
var popupDialog;
|
|
||||||
var clientId;
|
|
||||||
var realm;
|
|
||||||
|
|
||||||
function handleLogin() {
|
|
||||||
var scopes = [];
|
|
||||||
|
|
||||||
if(window.swaggerUi.api.authSchemes
|
|
||||||
&& window.swaggerUi.api.authSchemes.oauth2
|
|
||||||
&& window.swaggerUi.api.authSchemes.oauth2.scopes) {
|
|
||||||
scopes = window.swaggerUi.api.authSchemes.oauth2.scopes;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(window.swaggerUi.api
|
|
||||||
&& window.swaggerUi.api.info) {
|
|
||||||
appName = window.swaggerUi.api.info.title;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(popupDialog.length > 0)
|
|
||||||
popupDialog = popupDialog.last();
|
|
||||||
else {
|
|
||||||
popupDialog = $(
|
|
||||||
[
|
|
||||||
'<div class="api-popup-dialog">',
|
|
||||||
'<div class="api-popup-title">Select OAuth2.0 Scopes</div>',
|
|
||||||
'<div class="api-popup-content">',
|
|
||||||
'<p>Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.',
|
|
||||||
'<a href="#">Learn how to use</a>',
|
|
||||||
'</p>',
|
|
||||||
'<p><strong>' + appName + '</strong> API requires the following scopes. Select which ones you want to grant to Swagger UI.</p>',
|
|
||||||
'<ul class="api-popup-scopes">',
|
|
||||||
'</ul>',
|
|
||||||
'<p class="error-msg"></p>',
|
|
||||||
'<div class="api-popup-actions"><button class="api-popup-authbtn api-button green" type="button">Authorize</button><button class="api-popup-cancel api-button gray" type="button">Cancel</button></div>',
|
|
||||||
'</div>',
|
|
||||||
'</div>'].join(''));
|
|
||||||
$(document.body).append(popupDialog);
|
|
||||||
|
|
||||||
popup = popupDialog.find('ul.api-popup-scopes').empty();
|
|
||||||
for (i = 0; i < scopes.length; i ++) {
|
|
||||||
scope = scopes[i];
|
|
||||||
str = '<li><input type="checkbox" id="scope_' + i + '" scope="' + scope.scope + '"/>' + '<label for="scope_' + i + '">' + scope.scope;
|
|
||||||
if (scope.description) {
|
|
||||||
str += '<br/><span class="api-scope-desc">' + scope.description + '</span>';
|
|
||||||
}
|
|
||||||
str += '</label></li>';
|
|
||||||
popup.append(str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var $win = $(window),
|
|
||||||
dw = $win.width(),
|
|
||||||
dh = $win.height(),
|
|
||||||
st = $win.scrollTop(),
|
|
||||||
dlgWd = popupDialog.outerWidth(),
|
|
||||||
dlgHt = popupDialog.outerHeight(),
|
|
||||||
top = (dh -dlgHt)/2 + st,
|
|
||||||
left = (dw - dlgWd)/2;
|
|
||||||
|
|
||||||
popupDialog.css({
|
|
||||||
top: (top < 0? 0 : top) + 'px',
|
|
||||||
left: (left < 0? 0 : left) + 'px'
|
|
||||||
});
|
|
||||||
|
|
||||||
popupDialog.find('button.api-popup-cancel').click(function() {
|
|
||||||
popupMask.hide();
|
|
||||||
popupDialog.hide();
|
|
||||||
});
|
|
||||||
popupDialog.find('button.api-popup-authbtn').click(function() {
|
|
||||||
popupMask.hide();
|
|
||||||
popupDialog.hide();
|
|
||||||
|
|
||||||
var authSchemes = window.swaggerUi.api.authSchemes;
|
|
||||||
var host = window.location;
|
|
||||||
var redirectUrl = host.protocol + '//' + host.host + "/o2c.html";
|
|
||||||
var url = null;
|
|
||||||
|
|
||||||
var p = window.swaggerUi.api.authSchemes;
|
|
||||||
for (var key in p) {
|
|
||||||
if (p.hasOwnProperty(key)) {
|
|
||||||
var o = p[key].grantTypes;
|
|
||||||
for(var t in o) {
|
|
||||||
if(o.hasOwnProperty(t) && t === 'implicit') {
|
|
||||||
var dets = o[t];
|
|
||||||
url = dets.loginEndpoint.url + "?response_type=token";
|
|
||||||
window.swaggerUi.tokenName = dets.tokenName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var scopes = []
|
|
||||||
var o = $('.api-popup-scopes').find('input:checked');
|
|
||||||
|
|
||||||
for(k =0; k < o.length; k++) {
|
|
||||||
scopes.push($(o[k]).attr("scope"));
|
|
||||||
}
|
|
||||||
|
|
||||||
window.enabledScopes=scopes;
|
|
||||||
|
|
||||||
url += '&redirect_uri=' + encodeURIComponent(redirectUrl);
|
|
||||||
url += '&realm=' + encodeURIComponent(realm);
|
|
||||||
url += '&client_id=' + encodeURIComponent(clientId);
|
|
||||||
url += '&scope=' + encodeURIComponent(scopes);
|
|
||||||
|
|
||||||
window.open(url);
|
|
||||||
});
|
|
||||||
|
|
||||||
popupMask.show();
|
|
||||||
popupDialog.show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function handleLogout() {
|
|
||||||
for(key in window.authorizations.authz){
|
|
||||||
window.authorizations.remove(key)
|
|
||||||
}
|
|
||||||
window.enabledScopes = null;
|
|
||||||
$('.api-ic.ic-on').addClass('ic-off');
|
|
||||||
$('.api-ic.ic-on').removeClass('ic-on');
|
|
||||||
|
|
||||||
// set the info box
|
|
||||||
$('.api-ic.ic-warning').addClass('ic-error');
|
|
||||||
$('.api-ic.ic-warning').removeClass('ic-warning');
|
|
||||||
}
|
|
||||||
|
|
||||||
function initOAuth(opts) {
|
|
||||||
var o = (opts||{});
|
|
||||||
var errors = [];
|
|
||||||
|
|
||||||
appName = (o.appName||errors.push("missing appName"));
|
|
||||||
popupMask = (o.popupMask||$('#api-common-mask'));
|
|
||||||
popupDialog = (o.popupDialog||$('.api-popup-dialog'));
|
|
||||||
clientId = (o.clientId||errors.push("missing client id"));
|
|
||||||
realm = (o.realm||errors.push("missing realm"));
|
|
||||||
|
|
||||||
if(errors.length > 0){
|
|
||||||
log("auth unable initialize oauth: " + errors);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$('pre code').each(function(i, e) {hljs.highlightBlock(e)});
|
|
||||||
$('.api-ic').click(function(s) {
|
|
||||||
if($(s.target).hasClass('ic-off'))
|
|
||||||
handleLogin();
|
|
||||||
else {
|
|
||||||
handleLogout();
|
|
||||||
}
|
|
||||||
false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function onOAuthComplete(token) {
|
|
||||||
if(token) {
|
|
||||||
if(token.error) {
|
|
||||||
var checkbox = $('input[type=checkbox],.secured')
|
|
||||||
checkbox.each(function(pos){
|
|
||||||
checkbox[pos].checked = false;
|
|
||||||
});
|
|
||||||
alert(token.error);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var b = token[window.swaggerUi.tokenName];
|
|
||||||
if(b){
|
|
||||||
// if all roles are satisfied
|
|
||||||
var o = null;
|
|
||||||
$.each($('.auth #api_information_panel'), function(k, v) {
|
|
||||||
var children = v;
|
|
||||||
if(children && children.childNodes) {
|
|
||||||
var requiredScopes = [];
|
|
||||||
$.each((children.childNodes), function (k1, v1){
|
|
||||||
var inner = v1.innerHTML;
|
|
||||||
if(inner)
|
|
||||||
requiredScopes.push(inner);
|
|
||||||
});
|
|
||||||
var diff = [];
|
|
||||||
for(var i=0; i < requiredScopes.length; i++) {
|
|
||||||
var s = requiredScopes[i];
|
|
||||||
if(window.enabledScopes && window.enabledScopes.indexOf(s) == -1) {
|
|
||||||
diff.push(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(diff.length > 0){
|
|
||||||
o = v.parentNode;
|
|
||||||
$(o.parentNode).find('.api-ic.ic-on').addClass('ic-off');
|
|
||||||
$(o.parentNode).find('.api-ic.ic-on').removeClass('ic-on');
|
|
||||||
|
|
||||||
// sorry, not all scopes are satisfied
|
|
||||||
$(o).find('.api-ic').addClass('ic-warning');
|
|
||||||
$(o).find('.api-ic').removeClass('ic-error');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o = v.parentNode;
|
|
||||||
$(o.parentNode).find('.api-ic.ic-off').addClass('ic-on');
|
|
||||||
$(o.parentNode).find('.api-ic.ic-off').removeClass('ic-off');
|
|
||||||
|
|
||||||
// all scopes are satisfied
|
|
||||||
$(o).find('.api-ic').addClass('ic-info');
|
|
||||||
$(o).find('.api-ic').removeClass('ic-warning');
|
|
||||||
$(o).find('.api-ic').removeClass('ic-error');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
window.authorizations.add("oauth2", new ApiKeyAuthorization("Authorization", "Bearer " + b, "header"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,32 +0,0 @@
|
|||||||
// Underscore.js 1.3.3
|
|
||||||
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
|
|
||||||
// Underscore is freely distributable under the MIT license.
|
|
||||||
// Portions of Underscore are inspired or borrowed from Prototype,
|
|
||||||
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
|
||||||
// For all details and documentation:
|
|
||||||
// http://documentcloud.github.com/underscore
|
|
||||||
(function(){function r(a,c,d){if(a===c)return 0!==a||1/a==1/c;if(null==a||null==c)return a===c;a._chain&&(a=a._wrapped);c._chain&&(c=c._wrapped);if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return!1;switch(e){case "[object String]":return a==""+c;case "[object Number]":return a!=+a?c!=+c:0==a?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
|
|
||||||
c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if("object"!=typeof a||"object"!=typeof c)return!1;for(var f=d.length;f--;)if(d[f]==a)return!0;d.push(a);var f=0,g=!0;if("[object Array]"==e){if(f=a.length,g=f==c.length)for(;f--&&(g=f in a==f in c&&r(a[f],c[f],d)););}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return!1;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&r(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,h)&&!f--)break;
|
|
||||||
g=!f}}d.pop();return g}var s=this,I=s._,o={},k=Array.prototype,p=Object.prototype,i=k.slice,J=k.unshift,l=p.toString,K=p.hasOwnProperty,y=k.forEach,z=k.map,A=k.reduce,B=k.reduceRight,C=k.filter,D=k.every,E=k.some,q=k.indexOf,F=k.lastIndexOf,p=Array.isArray,L=Object.keys,t=Function.prototype.bind,b=function(a){return new m(a)};"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(exports=module.exports=b),exports._=b):s._=b;b.VERSION="1.3.3";var j=b.each=b.forEach=function(a,
|
|
||||||
c,d){if(a!=null)if(y&&a.forEach===y)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===o)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===o)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(z&&a.map===z)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(A&&
|
|
||||||
a.reduce===A){e&&(c=b.bind(c,e));return f?a.reduce(c,d):a.reduce(c)}j(a,function(a,b,i){if(f)d=c.call(e,d,a,b,i);else{d=a;f=true}});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(B&&a.reduceRight===B){e&&(c=b.bind(c,e));return f?a.reduceRight(c,d):a.reduceRight(c)}var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=function(a,
|
|
||||||
c,b){var e;G(a,function(a,g,h){if(c.call(b,a,g,h)){e=a;return true}});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(C&&a.filter===C)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(D&&a.every===D)return a.every(c,b);j(a,function(a,g,h){if(!(e=e&&c.call(b,
|
|
||||||
a,g,h)))return o});return!!e};var G=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(E&&a.some===E)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return o});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;if(q&&a.indexOf===q)return a.indexOf(c)!=-1;return b=G(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
|
|
||||||
function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&
|
|
||||||
(e={value:a,computed:b})});return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){d=Math.floor(Math.random()*(f+1));b[f]=b[d];b[d]=a});return b};b.sortBy=function(a,c,d){var e=b.isFunction(c)?c:function(a){return a[c]};return b.pluck(b.map(a,function(a,b,c){return{value:a,criteria:e.call(d,a,b,c)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c===void 0?1:d===void 0?-1:c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};
|
|
||||||
j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:b.isArray(a)||b.isArguments(a)?i.call(a):a.toArray&&b.isFunction(a.toArray)?a.toArray():b.values(a)};b.size=function(a){return b.isArray(a)?a.length:b.keys(a).length};b.first=b.head=b.take=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,
|
|
||||||
0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,
|
|
||||||
e=[];a.length<3&&(c=true);b.reduce(d,function(d,g,h){if(c?b.last(d)!==g||!d.length:!b.include(d,g)){d.push(g);e.push(a[h])}return d},[]);return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1),true);return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=
|
|
||||||
i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,d){if(a==null)return-1;var e;if(d){d=b.sortedIndex(a,c);return a[d]===c?d:-1}if(q&&a.indexOf===q)return a.indexOf(c);d=0;for(e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(F&&a.lastIndexOf===F)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){if(arguments.length<=
|
|
||||||
1){b=a||0;a=0}for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;){g[f++]=a;a=a+d}return g};var H=function(){};b.bind=function(a,c){var d,e;if(a.bind===t&&t)return t.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));H.prototype=a.prototype;var b=new H,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=
|
|
||||||
i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(null,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i,j=b.debounce(function(){h=
|
|
||||||
g=false},c);return function(){d=this;e=arguments;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);j()},c));g?h=true:i=a.apply(d,e);j();g=true;return i}};b.debounce=function(a,b,d){var e;return function(){var f=this,g=arguments;d&&!e&&a.apply(f,g);clearTimeout(e);e=setTimeout(function(){e=null;d||a.apply(f,g)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));
|
|
||||||
return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=L||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&
|
|
||||||
c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.pick=function(a){var c={};j(b.flatten(i.call(arguments,1)),function(b){b in a&&(c[b]=a[b])});return c};b.defaults=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty=
|
|
||||||
function(a){if(a==null)return true;if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};b.isArguments=function(a){return l.call(a)=="[object Arguments]"};b.isArguments(arguments)||(b.isArguments=function(a){return!(!a||!b.has(a,"callee"))});b.isFunction=function(a){return l.call(a)=="[object Function]"};
|
|
||||||
b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isFinite=function(a){return b.isNumber(a)&&isFinite(a)};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,
|
|
||||||
b){return K.call(a,b)};b.noConflict=function(){s._=I;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.result=function(a,c){if(a==null)return null;var d=a[c];return b.isFunction(d)?d.call(a):d};b.mixin=function(a){j(b.functions(a),function(c){M(c,b[c]=a[c])})};var N=0;b.uniqueId=
|
|
||||||
function(a){var b=N++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var u=/.^/,n={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},v;for(v in n)n[n[v]]=v;var O=/\\|'|\r|\n|\t|\u2028|\u2029/g,P=/\\(\\|'|r|n|t|u2028|u2029)/g,w=function(a){return a.replace(P,function(a,b){return n[b]})};b.template=function(a,c,d){d=b.defaults(d||{},b.templateSettings);a="__p+='"+a.replace(O,function(a){return"\\"+n[a]}).replace(d.escape||
|
|
||||||
u,function(a,b){return"'+\n_.escape("+w(b)+")+\n'"}).replace(d.interpolate||u,function(a,b){return"'+\n("+w(b)+")+\n'"}).replace(d.evaluate||u,function(a,b){return"';\n"+w(b)+"\n;__p+='"})+"';\n";d.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",e=new Function(d.variable||"obj","_",a);if(c)return e(c,b);c=function(a){return e.call(this,a,b)};c.source="function("+(d.variable||"obj")+"){\n"+a+"}";return c};
|
|
||||||
b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var x=function(a,c){return c?b(a).chain():a},M=function(a,c){m.prototype[a]=function(){var a=i.call(arguments);J.call(a,this._wrapped);return x(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return x(d,
|
|
||||||
this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return x(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
|
|
@ -1,302 +0,0 @@
|
|||||||
# Copyright 2018 New Vector Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
swagger: '2.0'
|
|
||||||
info:
|
|
||||||
title: "Matrix Identity Service Establishing Associations API"
|
|
||||||
version: "1.0.0"
|
|
||||||
host: localhost:8090
|
|
||||||
schemes:
|
|
||||||
- https
|
|
||||||
basePath: /_matrix/identity/api/v1
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
paths:
|
|
||||||
"/3pid/getValidated3pid":
|
|
||||||
get:
|
|
||||||
summary: Check whether ownership of a 3pid was validated.
|
|
||||||
description: |-
|
|
||||||
Determines if a given 3pid has been validated by a user.
|
|
||||||
operationId: getValidated3pid
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: sid
|
|
||||||
description: The Session ID generated by the ``requestToken`` call.
|
|
||||||
required: true
|
|
||||||
x-example: 1234
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: client_secret
|
|
||||||
description: The client secret passed to the ``requestToken`` call.
|
|
||||||
required: true
|
|
||||||
x-example: monkeys_are_GREAT
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: Validation information for the session.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"medium": "email",
|
|
||||||
"validated_at": 1457622739026,
|
|
||||||
"address": "louise@bobs.burgers"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
medium:
|
|
||||||
type: string
|
|
||||||
description: The medium type of the 3pid.
|
|
||||||
address:
|
|
||||||
type: string
|
|
||||||
description: The address of the 3pid being looked up.
|
|
||||||
validated_at:
|
|
||||||
type: integer
|
|
||||||
description: |-
|
|
||||||
Timestamp, in milliseconds, indicating the time that the 3pid
|
|
||||||
was validated.
|
|
||||||
required: ['medium', 'address', 'validated_at']
|
|
||||||
400:
|
|
||||||
description: |-
|
|
||||||
The session has not been validated.
|
|
||||||
|
|
||||||
If the session has not been validated, then ``errcode`` will be
|
|
||||||
``M_SESSION_NOT_VALIDATED``. If the session has timed out, then
|
|
||||||
``errcode`` will be ``M_SESSION_EXPIRED``.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_SESSION_NOT_VALIDATED",
|
|
||||||
"error": "This validation session has not yet been completed"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
||||||
404:
|
|
||||||
description: The Session ID or client secret were not found.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_NO_VALID_SESSION",
|
|
||||||
"error": "No valid session was found matching that sid and client secret"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
||||||
"/3pid/bind":
|
|
||||||
post:
|
|
||||||
summary: Publish an association between a session and a Matrix user ID.
|
|
||||||
description: |-
|
|
||||||
Publish an association between a session and a Matrix user ID.
|
|
||||||
|
|
||||||
Future calls to ``/lookup`` for any of the session\'s 3pids will return
|
|
||||||
this association.
|
|
||||||
|
|
||||||
Note: for backwards compatibility with previous drafts of this
|
|
||||||
specification, the parameters may also be specified as
|
|
||||||
``application/x-form-www-urlencoded`` data. However, this usage is
|
|
||||||
deprecated.
|
|
||||||
operationId: bind
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: body
|
|
||||||
name: body
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
example: {
|
|
||||||
"sid": "1234",
|
|
||||||
"client_secret": "monkeys_are_GREAT",
|
|
||||||
"mxid": "@ears:matrix.org"
|
|
||||||
}
|
|
||||||
properties:
|
|
||||||
sid:
|
|
||||||
type: string
|
|
||||||
description: The Session ID generated by the ``requestToken`` call.
|
|
||||||
client_secret:
|
|
||||||
type: string
|
|
||||||
description: The client secret passed to the ``requestToken`` call.
|
|
||||||
mxid:
|
|
||||||
type: string
|
|
||||||
description: The Matrix user ID to associate with the 3pids.
|
|
||||||
required: ["sid", "client_secret", "mxid"]
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: The association was published.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"address": "louise@bobs.burgers",
|
|
||||||
"medium": "email",
|
|
||||||
"mxid": "@ears:matrix.org",
|
|
||||||
"not_before": 1428825849161,
|
|
||||||
"not_after": 4582425849161,
|
|
||||||
"ts": 1428825849161,
|
|
||||||
"signatures": {
|
|
||||||
"matrix.org": {
|
|
||||||
"ed25519:0": "ENiU2YORYUJgE6WBMitU0mppbQjidDLanAusj8XS2nVRHPu+0t42OKA/r6zV6i2MzUbNQ3c3MiLScJuSsOiVDQ"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
address:
|
|
||||||
type: string
|
|
||||||
description: The 3pid address of the user being looked up.
|
|
||||||
medium:
|
|
||||||
type: string
|
|
||||||
description: The medium type of the 3pid.
|
|
||||||
mxid:
|
|
||||||
type: string
|
|
||||||
description: The Matrix user ID associated with the 3pid.
|
|
||||||
not_before:
|
|
||||||
type: integer
|
|
||||||
description: A unix timestamp before which the association is not known to be valid.
|
|
||||||
not_after:
|
|
||||||
type: integer
|
|
||||||
description: A unix timestamp after which the association is not known to be valid.
|
|
||||||
ts:
|
|
||||||
type: integer
|
|
||||||
description: The unix timestamp at which the association was verified.
|
|
||||||
signatures:
|
|
||||||
type: object
|
|
||||||
description: |-
|
|
||||||
The signatures of the verifying identity servers which show that the
|
|
||||||
association should be trusted, if you trust the verifying identity
|
|
||||||
services.
|
|
||||||
$ref: "../../schemas/server-signatures.yaml"
|
|
||||||
required:
|
|
||||||
- address
|
|
||||||
- medium
|
|
||||||
- mxid
|
|
||||||
- not_before
|
|
||||||
- not_after
|
|
||||||
- ts
|
|
||||||
- signatures
|
|
||||||
400:
|
|
||||||
description: |-
|
|
||||||
The association was not published.
|
|
||||||
|
|
||||||
If the session has not been validated, then ``errcode`` will be
|
|
||||||
``M_SESSION_NOT_VALIDATED``. If the session has timed out, then
|
|
||||||
``errcode`` will be ``M_SESSION_EXPIRED``.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_SESSION_NOT_VALIDATED",
|
|
||||||
"error": "This validation session has not yet been completed"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
||||||
404:
|
|
||||||
description: The Session ID or client secret were not found
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_NO_VALID_SESSION",
|
|
||||||
"error": "No valid session was found matching that sid and client secret"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
||||||
"/3pid/unbind":
|
|
||||||
post:
|
|
||||||
summary: Remove an association between a session and a Matrix user ID.
|
|
||||||
description: |-
|
|
||||||
Remove an association between a session and a Matrix user ID.
|
|
||||||
|
|
||||||
Future calls to ``/lookup`` for any of the session's 3pids will not
|
|
||||||
return the removed association.
|
|
||||||
|
|
||||||
The identity server should authenticate the request in one of two
|
|
||||||
ways:
|
|
||||||
|
|
||||||
1. The request is signed by the homeserver which controls the ``user_id``.
|
|
||||||
2. The request includes the ``sid`` and ``client_secret`` parameters,
|
|
||||||
as per ``/3pid/bind``, which proves ownership of the 3PID.
|
|
||||||
|
|
||||||
If this endpoint returns a JSON Matrix error, that error should be passed
|
|
||||||
through to the client requesting an unbind through a homeserver, if the
|
|
||||||
homeserver is acting on behalf of a client.
|
|
||||||
operationId: unbind
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: body
|
|
||||||
name: body
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
example: {
|
|
||||||
"sid": "1234",
|
|
||||||
"client_secret": "monkeys_are_GREAT",
|
|
||||||
"mxid": "@ears:example.org",
|
|
||||||
"threepid": {
|
|
||||||
"medium": "email",
|
|
||||||
"address": "monkeys_have_ears@example.org"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
properties:
|
|
||||||
sid:
|
|
||||||
type: string
|
|
||||||
description: The Session ID generated by the ``requestToken`` call.
|
|
||||||
client_secret:
|
|
||||||
type: string
|
|
||||||
description: The client secret passed to the ``requestToken`` call.
|
|
||||||
mxid:
|
|
||||||
type: string
|
|
||||||
description: The Matrix user ID to remove from the 3pids.
|
|
||||||
threepid:
|
|
||||||
type: object
|
|
||||||
title: 3PID
|
|
||||||
description: |-
|
|
||||||
The 3PID to remove. Must match the 3PID used to generate the session
|
|
||||||
if using ``sid`` and ``client_secret`` to authenticate this request.
|
|
||||||
properties:
|
|
||||||
medium:
|
|
||||||
type: string
|
|
||||||
description: |-
|
|
||||||
A medium from the `3PID Types`_ Appendix, matching the medium
|
|
||||||
of the identifier to unbind.
|
|
||||||
address:
|
|
||||||
type: string
|
|
||||||
description: The 3PID address to remove.
|
|
||||||
required: ['medium', 'address']
|
|
||||||
required: ["threepid", "mxid"]
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: The association was successfully removed.
|
|
||||||
examples:
|
|
||||||
application/json: {}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
400:
|
|
||||||
description: |-
|
|
||||||
If the response body is not a JSON Matrix error, the identity server
|
|
||||||
does not support unbinds. If a JSON Matrix error is in the response
|
|
||||||
body, the requesting party should respect the error.
|
|
||||||
404:
|
|
||||||
description: |-
|
|
||||||
If the response body is not a JSON Matrix error, the identity server
|
|
||||||
does not support unbinds. If a JSON Matrix error is in the response
|
|
||||||
body, the requesting party should respect the error.
|
|
||||||
403:
|
|
||||||
description: |-
|
|
||||||
The credentials supplied to authenticate the request were invalid.
|
|
||||||
This may also be returned if the identity server does not support
|
|
||||||
the chosen authentication method (such as blocking homeservers from
|
|
||||||
unbinding identifiers).
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_FORBIDDEN",
|
|
||||||
"error": "Invalid homeserver signature"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
||||||
501:
|
|
||||||
description: |-
|
|
||||||
If the response body is not a JSON Matrix error, the identity server
|
|
||||||
does not support unbinds. If a JSON Matrix error is in the response
|
|
||||||
body, the requesting party should respect the error.
|
|
@ -1,177 +0,0 @@
|
|||||||
# Copyright 2018 New Vector Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
swagger: '2.0'
|
|
||||||
info:
|
|
||||||
title: "Matrix Identity Service Email Associations API"
|
|
||||||
version: "1.0.0"
|
|
||||||
host: localhost:8090
|
|
||||||
schemes:
|
|
||||||
- https
|
|
||||||
basePath: /_matrix/identity/api/v1
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
paths:
|
|
||||||
"/validate/email/requestToken":
|
|
||||||
post:
|
|
||||||
summary: Request a token for validating an email address.
|
|
||||||
description: |-
|
|
||||||
Create a session for validating an email address.
|
|
||||||
|
|
||||||
The identity server will send an email containing a token. If that
|
|
||||||
token is presented to the identity server in the future, it indicates
|
|
||||||
that that user was able to read the email for that email address, and
|
|
||||||
so we validate ownership of the email address.
|
|
||||||
|
|
||||||
Note that homeservers offer APIs that proxy this API, adding
|
|
||||||
additional behaviour on top, for example,
|
|
||||||
``/register/email/requestToken`` is designed specifically for use when
|
|
||||||
registering an account and therefore will inform the user if the email
|
|
||||||
address given is already registered on the server.
|
|
||||||
|
|
||||||
Note: for backwards compatibility with previous drafts of this
|
|
||||||
specification, the parameters may also be specified as
|
|
||||||
``application/x-form-www-urlencoded`` data. However, this usage is
|
|
||||||
deprecated.
|
|
||||||
operationId: emailRequestToken
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: body
|
|
||||||
name: body
|
|
||||||
schema:
|
|
||||||
$ref: "definitions/request_email_validation.yaml"
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: Session created.
|
|
||||||
schema:
|
|
||||||
$ref: "definitions/sid.yaml"
|
|
||||||
400:
|
|
||||||
description: |
|
|
||||||
An error ocurred. Some possible errors are:
|
|
||||||
|
|
||||||
- ``M_INVALID_EMAIL``: The email address provided was invalid.
|
|
||||||
- ``M_EMAIL_SEND_ERROR``: The validation email could not be sent.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_INVALID_EMAIL",
|
|
||||||
"error": "The email address is not valid"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
||||||
"/validate/email/submitToken":
|
|
||||||
post:
|
|
||||||
summary: Validate ownership of an email address.
|
|
||||||
description: |-
|
|
||||||
Validate ownership of an email address.
|
|
||||||
|
|
||||||
If the three parameters are consistent with a set generated by a
|
|
||||||
``requestToken`` call, ownership of the email address is considered to
|
|
||||||
have been validated. This does not publish any information publicly, or
|
|
||||||
associate the email address with any Matrix user ID. Specifically,
|
|
||||||
calls to ``/lookup`` will not show a binding.
|
|
||||||
|
|
||||||
The identity server is free to match the token case-insensitively, or
|
|
||||||
carry out other mapping operations such as unicode
|
|
||||||
normalisation. Whether to do so is an implementation detail for the
|
|
||||||
identity server. Clients must always pass on the token without
|
|
||||||
modification.
|
|
||||||
|
|
||||||
Note: for backwards compatibility with previous drafts of this
|
|
||||||
specification, the parameters may also be specified as
|
|
||||||
``application/x-form-www-urlencoded`` data. However, this usage is
|
|
||||||
deprecated.
|
|
||||||
operationId: emailSubmitTokenPost
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: body
|
|
||||||
name: body
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
example: {
|
|
||||||
"sid": "1234",
|
|
||||||
"client_secret": "monkeys_are_GREAT",
|
|
||||||
"token": "atoken"
|
|
||||||
}
|
|
||||||
properties:
|
|
||||||
sid:
|
|
||||||
type: string
|
|
||||||
description: The session ID, generated by the ``requestToken`` call.
|
|
||||||
client_secret:
|
|
||||||
type: string
|
|
||||||
description: The client secret that was supplied to the ``requestToken`` call.
|
|
||||||
token:
|
|
||||||
type: string
|
|
||||||
description: The token generated by the ``requestToken`` call and emailed to the user.
|
|
||||||
required: ["sid", "client_secret", "token"]
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description:
|
|
||||||
The success of the validation.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"success": true
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
description: Whether the validation was successful or not.
|
|
||||||
required: ['success']
|
|
||||||
get:
|
|
||||||
summary: Validate ownership of an email address.
|
|
||||||
description: |-
|
|
||||||
Validate ownership of an email address.
|
|
||||||
|
|
||||||
If the three parameters are consistent with a set generated by a
|
|
||||||
``requestToken`` call, ownership of the email address is considered to
|
|
||||||
have been validated. This does not publish any information publicly, or
|
|
||||||
associate the email address with any Matrix user ID. Specifically,
|
|
||||||
calls to ``/lookup`` will not show a binding.
|
|
||||||
|
|
||||||
Note that, in contrast with the POST version, this endpoint will be
|
|
||||||
used by end-users, and so the response should be human-readable.
|
|
||||||
operationId: emailSubmitTokenGet
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: sid
|
|
||||||
required: true
|
|
||||||
description: The session ID, generated by the ``requestToken`` call.
|
|
||||||
x-example: 1234
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: client_secret
|
|
||||||
required: true
|
|
||||||
description: The client secret that was supplied to the ``requestToken`` call.
|
|
||||||
x-example: monkeys_are_GREAT
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: token
|
|
||||||
required: true
|
|
||||||
description: The token generated by the ``requestToken`` call and emailed to the user.
|
|
||||||
x-example: atoken
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: Email address is validated.
|
|
||||||
"3xx":
|
|
||||||
description: |-
|
|
||||||
Email address is validated, and the ``next_link`` parameter was
|
|
||||||
provided to the ``requestToken`` call. The user must be redirected
|
|
||||||
to the URL provided by the ``next_link`` parameter.
|
|
||||||
"4xx":
|
|
||||||
description:
|
|
||||||
Validation failed.
|
|
@ -1,97 +0,0 @@
|
|||||||
# Copyright 2018 New Vector Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
swagger: '2.0'
|
|
||||||
info:
|
|
||||||
title: "Matrix Identity Service Ephemeral Invitation Signing API"
|
|
||||||
version: "1.0.0"
|
|
||||||
host: localhost:8090
|
|
||||||
schemes:
|
|
||||||
- https
|
|
||||||
basePath: /_matrix/identity/api/v1
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
paths:
|
|
||||||
"/sign-ed25519":
|
|
||||||
post:
|
|
||||||
summary: Sign invitation details
|
|
||||||
description: |-
|
|
||||||
Sign invitation details.
|
|
||||||
|
|
||||||
The identity server will look up ``token`` which was stored in a call
|
|
||||||
to ``store-invite``, and fetch the sender of the invite.
|
|
||||||
operationId: blindlySignStuff
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: body
|
|
||||||
name: body
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
example: {
|
|
||||||
"mxid": "@foo:bar.com",
|
|
||||||
"token": "sometoken",
|
|
||||||
"private_key": "base64encodedkey"
|
|
||||||
}
|
|
||||||
properties:
|
|
||||||
mxid:
|
|
||||||
type: string
|
|
||||||
description: The Matrix user ID of the user accepting the invitation.
|
|
||||||
token:
|
|
||||||
type: string
|
|
||||||
description: The token from the call to ``store-invite``.
|
|
||||||
private_key:
|
|
||||||
type: string
|
|
||||||
description: The private key, encoded as `Unpadded base64`_.
|
|
||||||
required: ["mxid", "token", "private_key"]
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: The signed JSON of the mxid, sender, and token.
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
mxid:
|
|
||||||
type: string
|
|
||||||
description: The Matrix user ID of the user accepting the invitation.
|
|
||||||
sender:
|
|
||||||
type: string
|
|
||||||
description: The Matrix user ID of the user who sent the invitation.
|
|
||||||
signatures:
|
|
||||||
type: object
|
|
||||||
description: The signature of the mxid, sender, and token.
|
|
||||||
$ref: "../../schemas/server-signatures.yaml"
|
|
||||||
token:
|
|
||||||
type: string
|
|
||||||
description: The token for the invitation.
|
|
||||||
required: ['mxid', 'sender', 'signatures', 'token']
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"mxid": "@foo:bar.com",
|
|
||||||
"sender": "@baz:bar.com",
|
|
||||||
"signatures": {
|
|
||||||
"my.id.server": {
|
|
||||||
"ed25519:0": "def987"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"token": "abc123"
|
|
||||||
}
|
|
||||||
404:
|
|
||||||
description: The token was not found.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_UNRECOGNIZED",
|
|
||||||
"error": "Didn't recognize token"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
@ -1,171 +0,0 @@
|
|||||||
# Copyright 2016 OpenMarket Ltd
|
|
||||||
# Copyright 2017 Kamax.io
|
|
||||||
# Copyright 2017 New Vector Ltd
|
|
||||||
# Copyright 2018 New Vector Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
swagger: '2.0'
|
|
||||||
info:
|
|
||||||
title: "Matrix Identity Service Lookup API"
|
|
||||||
version: "1.0.0"
|
|
||||||
host: localhost:8090
|
|
||||||
schemes:
|
|
||||||
- https
|
|
||||||
basePath: /_matrix/identity/api/v1
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
paths:
|
|
||||||
"/lookup":
|
|
||||||
get:
|
|
||||||
summary: Look up the Matrix user ID for a 3pid.
|
|
||||||
description: Look up the Matrix user ID for a 3pid.
|
|
||||||
operationId: lookupUser
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: medium
|
|
||||||
required: true
|
|
||||||
description: The medium type of the 3pid. See the `3PID Types`_ Appendix.
|
|
||||||
x-example: "email"
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: address
|
|
||||||
required: true
|
|
||||||
description: The address of the 3pid being looked up. See the `3PID Types`_ Appendix.
|
|
||||||
x-example: "louise@bobs.burgers"
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description:
|
|
||||||
The association for that 3pid, or an empty object if no association is known.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"address": "louise@bobs.burgers",
|
|
||||||
"medium": "email",
|
|
||||||
"mxid": "@ears:matrix.org",
|
|
||||||
"not_before": 1428825849161,
|
|
||||||
"not_after": 4582425849161,
|
|
||||||
"ts": 1428825849161,
|
|
||||||
"signatures": {
|
|
||||||
"matrix.org": {
|
|
||||||
"ed25519:0": "ENiU2YORYUJgE6WBMitU0mppbQjidDLanAusj8XS2nVRHPu+0t42OKA/r6zV6i2MzUbNQ3c3MiLScJuSsOiVDQ"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
address:
|
|
||||||
type: string
|
|
||||||
description: The 3pid address of the user being looked up, matching the address requested.
|
|
||||||
medium:
|
|
||||||
type: string
|
|
||||||
description: A medium from the `3PID Types`_ Appendix, matching the medium requested.
|
|
||||||
mxid:
|
|
||||||
type: string
|
|
||||||
description: The Matrix user ID associated with the 3pid.
|
|
||||||
not_before:
|
|
||||||
type: integer
|
|
||||||
description: A unix timestamp before which the association is not known to be valid.
|
|
||||||
not_after:
|
|
||||||
type: integer
|
|
||||||
description: A unix timestamp after which the association is not known to be valid.
|
|
||||||
ts:
|
|
||||||
type: integer
|
|
||||||
description: The unix timestamp at which the association was verified.
|
|
||||||
signatures:
|
|
||||||
type: object
|
|
||||||
description: The signatures of the verifying identity servers which show that the association should be trusted, if you trust the verifying identity servers.
|
|
||||||
$ref: "../../schemas/server-signatures.yaml"
|
|
||||||
required:
|
|
||||||
- address
|
|
||||||
- medium
|
|
||||||
- mxid
|
|
||||||
- not_before
|
|
||||||
- not_after
|
|
||||||
- ts
|
|
||||||
- signatures
|
|
||||||
"/bulk_lookup":
|
|
||||||
post:
|
|
||||||
summary: Lookup Matrix user IDs for a list of 3pids.
|
|
||||||
description: Lookup Matrix user IDs for a list of 3pids.
|
|
||||||
operationId: lookupUsers
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: body
|
|
||||||
name: body
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
example: {
|
|
||||||
"threepids":
|
|
||||||
[
|
|
||||||
["email","user@example.org"],
|
|
||||||
["msisdn", "123456789"],
|
|
||||||
["email","user2@example.org"]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
properties:
|
|
||||||
threepids:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: array
|
|
||||||
title: 3PID mappings
|
|
||||||
minItems: 2
|
|
||||||
maxItems: 2
|
|
||||||
items:
|
|
||||||
# TODO: Give real names to these values. Adding a `title` does not work.
|
|
||||||
#- type: 3PID Medium
|
|
||||||
#- type: 3PID Address
|
|
||||||
- type: string
|
|
||||||
- type: string
|
|
||||||
description: |-
|
|
||||||
An array of arrays containing the `3PID Types`_ with the ``medium``
|
|
||||||
in first position and the ``address`` in second position.
|
|
||||||
required:
|
|
||||||
- "threepids"
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: A list of known 3PID mappings for the supplied 3PIDs.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"threepids": [
|
|
||||||
["email","user@example.org", "@bla:example.org"],
|
|
||||||
["msisdn", "123456789", "@blah2:example.com"]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
threepids:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: array
|
|
||||||
title: 3PID mappings
|
|
||||||
minItems: 3
|
|
||||||
maxItems: 3
|
|
||||||
items:
|
|
||||||
# TODO: Give real names to these values. Adding a `title` does not work.
|
|
||||||
#- type: 3PID Medium
|
|
||||||
#- type: 3PID Address
|
|
||||||
#- type: Matrix User ID
|
|
||||||
- type: string
|
|
||||||
- type: string
|
|
||||||
- type: string
|
|
||||||
description: |-
|
|
||||||
An array of array containing the `3PID Types`_ with the ``medium``
|
|
||||||
in first position, the ``address`` in second position and Matrix user
|
|
||||||
ID in third position.
|
|
||||||
required:
|
|
||||||
- "threepids"
|
|
@ -1,179 +0,0 @@
|
|||||||
# Copyright 2018 New Vector Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
swagger: '2.0'
|
|
||||||
info:
|
|
||||||
title: "Matrix Identity Service Phone Number Associations API"
|
|
||||||
version: "1.0.0"
|
|
||||||
host: localhost:8090
|
|
||||||
schemes:
|
|
||||||
- https
|
|
||||||
basePath: /_matrix/identity/api/v1
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
paths:
|
|
||||||
"/validate/msisdn/requestToken":
|
|
||||||
post:
|
|
||||||
summary: Request a token for validating a phone number.
|
|
||||||
description: |-
|
|
||||||
Create a session for validating a phone number.
|
|
||||||
|
|
||||||
The identity server will send an SMS message containing a token. If
|
|
||||||
that token is presented to the identity server in the future, it
|
|
||||||
indicates that that user was able to read the SMS for that phone
|
|
||||||
number, and so we validate ownership of the phone number.
|
|
||||||
|
|
||||||
Note that homeservers offer APIs that proxy this API, adding
|
|
||||||
additional behaviour on top, for example,
|
|
||||||
``/register/msisdn/requestToken`` is designed specifically for use when
|
|
||||||
registering an account and therefore will inform the user if the phone
|
|
||||||
number given is already registered on the server.
|
|
||||||
|
|
||||||
Note: for backwards compatibility with previous drafts of this
|
|
||||||
specification, the parameters may also be specified as
|
|
||||||
``application/x-form-www-urlencoded`` data. However, this usage is
|
|
||||||
deprecated.
|
|
||||||
operationId: msisdnRequestToken
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: body
|
|
||||||
name: body
|
|
||||||
schema:
|
|
||||||
$ref: "definitions/request_msisdn_validation.yaml"
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: Session created.
|
|
||||||
schema:
|
|
||||||
$ref: "definitions/sid.yaml"
|
|
||||||
400:
|
|
||||||
description: |
|
|
||||||
An error ocurred. Some possible errors are:
|
|
||||||
|
|
||||||
- ``M_INVALID_ADDRESS``: The phone number provided was invalid.
|
|
||||||
- ``M_SEND_ERROR``: The validation SMS could not be sent.
|
|
||||||
- ``M_DESTINATION_REJECTED``: The identity server cannot deliver an
|
|
||||||
SMS to the provided country or region.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_INVALID_ADDRESS",
|
|
||||||
"error": "The phone number is not valid"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
||||||
"/validate/msisdn/submitToken":
|
|
||||||
post:
|
|
||||||
summary: Validate ownership of a phone number.
|
|
||||||
description: |-
|
|
||||||
Validate ownership of a phone number.
|
|
||||||
|
|
||||||
If the three parameters are consistent with a set generated by a
|
|
||||||
``requestToken`` call, ownership of the phone number is considered to
|
|
||||||
have been validated. This does not publish any information publicly, or
|
|
||||||
associate the phone number address with any Matrix user
|
|
||||||
ID. Specifically, calls to ``/lookup`` will not show a binding.
|
|
||||||
|
|
||||||
The identity server is free to match the token case-insensitively, or
|
|
||||||
carry out other mapping operations such as unicode
|
|
||||||
normalisation. Whether to do so is an implementation detail for the
|
|
||||||
identity server. Clients must always pass on the token without
|
|
||||||
modification.
|
|
||||||
|
|
||||||
Note: for backwards compatibility with previous drafts of this
|
|
||||||
specification, the parameters may also be specified as
|
|
||||||
``application/x-form-www-urlencoded`` data. However, this usage is
|
|
||||||
deprecated.
|
|
||||||
operationId: msisdnSubmitTokenPost
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: body
|
|
||||||
name: body
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
example: {
|
|
||||||
"sid": "1234",
|
|
||||||
"client_secret": "monkeys_are_GREAT",
|
|
||||||
"token": "atoken"
|
|
||||||
}
|
|
||||||
properties:
|
|
||||||
sid:
|
|
||||||
type: string
|
|
||||||
description: The session ID, generated by the ``requestToken`` call.
|
|
||||||
client_secret:
|
|
||||||
type: string
|
|
||||||
description: The client secret that was supplied to the ``requestToken`` call.
|
|
||||||
token:
|
|
||||||
type: string
|
|
||||||
description: The token generated by the ``requestToken`` call and sent to the user.
|
|
||||||
required: ["sid", "client_secret", "token"]
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description:
|
|
||||||
The success of the validation.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"success": true
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
success:
|
|
||||||
type: boolean
|
|
||||||
description: Whether the validation was successful or not.
|
|
||||||
required: ['success']
|
|
||||||
get:
|
|
||||||
summary: Validate ownership of a phone number.
|
|
||||||
description: |-
|
|
||||||
Validate ownership of a phone number.
|
|
||||||
|
|
||||||
If the three parameters are consistent with a set generated by a
|
|
||||||
``requestToken`` call, ownership of the phone number address is
|
|
||||||
considered to have been validated. This does not publish any
|
|
||||||
information publicly, or associate the phone number with any Matrix
|
|
||||||
user ID. Specifically, calls to ``/lookup`` will not show a binding.
|
|
||||||
|
|
||||||
Note that, in contrast with the POST version, this endpoint will be
|
|
||||||
used by end-users, and so the response should be human-readable.
|
|
||||||
operationId: msisdnSubmitTokenGet
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: sid
|
|
||||||
required: true
|
|
||||||
description: The session ID, generated by the ``requestToken`` call.
|
|
||||||
x-example: 1234
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: client_secret
|
|
||||||
required: true
|
|
||||||
description: The client secret that was supplied to the ``requestToken`` call.
|
|
||||||
x-example: monkeys_are_GREAT
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: token
|
|
||||||
required: true
|
|
||||||
description: The token generated by the ``requestToken`` call and sent to the user.
|
|
||||||
x-example: atoken
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: Phone number is validated.
|
|
||||||
"3xx":
|
|
||||||
description: |-
|
|
||||||
Phone number address is validated, and the ``next_link`` parameter
|
|
||||||
was provided to the ``requestToken`` call. The user must be
|
|
||||||
redirected to the URL provided by the ``next_link`` parameter.
|
|
||||||
"4xx":
|
|
||||||
description:
|
|
||||||
Validation failed.
|
|
@ -1,46 +0,0 @@
|
|||||||
# Copyright 2018 Kamax Sàrl
|
|
||||||
# Copyright 2018 New Vector Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
swagger: "2.0"
|
|
||||||
info:
|
|
||||||
title: "Matrix Identity Service Ping API"
|
|
||||||
version: "1.0.0"
|
|
||||||
host: localhost:8090
|
|
||||||
schemes:
|
|
||||||
- https
|
|
||||||
basePath: /_matrix/identity
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
paths:
|
|
||||||
"/api/v1":
|
|
||||||
get:
|
|
||||||
summary: Checks that an identity server is available at this API endpoint.
|
|
||||||
description: |-
|
|
||||||
Checks that an identity server is available at this API endpoint.
|
|
||||||
|
|
||||||
To discover that an identity server is available at a specific URL,
|
|
||||||
this endpoint can be queried and will return an empty object.
|
|
||||||
|
|
||||||
This is primarly used for auto-discovery and health check purposes
|
|
||||||
by entities acting as a client for the identity server.
|
|
||||||
operationId: ping
|
|
||||||
deprecated: true
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: An identity server is ready to serve requests.
|
|
||||||
examples:
|
|
||||||
application/json: {}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
@ -1,129 +0,0 @@
|
|||||||
# Copyright 2016 OpenMarket Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
swagger: '2.0'
|
|
||||||
info:
|
|
||||||
title: "Matrix Identity Service Public Key API"
|
|
||||||
version: "1.0.0"
|
|
||||||
host: localhost:8090
|
|
||||||
schemes:
|
|
||||||
- https
|
|
||||||
basePath: /_matrix/identity/api/v1
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
paths:
|
|
||||||
"/pubkey/{keyId}":
|
|
||||||
get:
|
|
||||||
summary: Get a public key.
|
|
||||||
description: |-
|
|
||||||
Get the public key for the passed key ID.
|
|
||||||
operationId: getPubKey
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: path
|
|
||||||
type: string
|
|
||||||
name: keyId
|
|
||||||
required: true
|
|
||||||
description: |-
|
|
||||||
The ID of the key. This should take the form algorithm:identifier
|
|
||||||
where algorithm identifies the signing algorithm, and the identifier
|
|
||||||
is an opaque string.
|
|
||||||
x-example: "ed25519:0"
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description:
|
|
||||||
The public key exists.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"public_key": "VXuGitF39UH5iRfvbIknlvlAVKgD1BsLDMvBf0pmp7c"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
public_key:
|
|
||||||
type: string
|
|
||||||
description: Unpadded Base64 encoded public key.
|
|
||||||
required: ['public_key']
|
|
||||||
404:
|
|
||||||
description:
|
|
||||||
The public key was not found.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_NOT_FOUND",
|
|
||||||
"error": "The public key was not found"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
||||||
"/pubkey/isvalid":
|
|
||||||
get:
|
|
||||||
summary: Check whether a long-term public key is valid.
|
|
||||||
description: |-
|
|
||||||
Check whether a long-term public key is valid. The response should always
|
|
||||||
be the same, provided the key exists.
|
|
||||||
operationId: isPubKeyValid
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: public_key
|
|
||||||
required: true
|
|
||||||
description: |-
|
|
||||||
The unpadded base64-encoded public key to check.
|
|
||||||
x-example: "VXuGitF39UH5iRfvbIknlvlAVKgD1BsLDMvBf0pmp7c"
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description:
|
|
||||||
The validity of the public key.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"valid": true
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
valid:
|
|
||||||
type: boolean
|
|
||||||
description: Whether the public key is recognised and is currently valid.
|
|
||||||
required: ['valid']
|
|
||||||
"/pubkey/ephemeral/isvalid":
|
|
||||||
get:
|
|
||||||
summary: Check whether a short-term public key is valid.
|
|
||||||
description: |-
|
|
||||||
Check whether a short-term public key is valid.
|
|
||||||
operationId: isEphemeralPubKeyValid
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: query
|
|
||||||
type: string
|
|
||||||
name: public_key
|
|
||||||
required: true
|
|
||||||
description: |-
|
|
||||||
The unpadded base64-encoded public key to check.
|
|
||||||
x-example: "VXuGitF39UH5iRfvbIknlvlAVKgD1BsLDMvBf0pmp7c"
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description:
|
|
||||||
The validity of the public key.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"valid": true
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
valid:
|
|
||||||
type: boolean
|
|
||||||
description: Whether the public key is recognised and is currently valid.
|
|
||||||
required: ['valid']
|
|
@ -1,161 +0,0 @@
|
|||||||
# Copyright 2018 New Vector Ltd
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
swagger: '2.0'
|
|
||||||
info:
|
|
||||||
title: "Matrix Identity Service Store Invitations API"
|
|
||||||
version: "1.0.0"
|
|
||||||
host: localhost:8090
|
|
||||||
schemes:
|
|
||||||
- https
|
|
||||||
basePath: /_matrix/identity/api/v1
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
paths:
|
|
||||||
"/store-invite":
|
|
||||||
post:
|
|
||||||
summary: Store pending invitations to a user's 3pid.
|
|
||||||
description: |-
|
|
||||||
Store pending invitations to a user's 3pid.
|
|
||||||
|
|
||||||
In addition to the request parameters specified below, an arbitrary
|
|
||||||
number of other parameters may also be specified. These may be used in
|
|
||||||
the invite message generation described below.
|
|
||||||
|
|
||||||
The service will generate a random token and an ephemeral key used for
|
|
||||||
accepting the invite.
|
|
||||||
|
|
||||||
The service also generates a ``display_name`` for the inviter, which is
|
|
||||||
a redacted version of ``address`` which does not leak the full contents
|
|
||||||
of the ``address``.
|
|
||||||
|
|
||||||
The service records persistently all of the above information.
|
|
||||||
|
|
||||||
It also generates an email containing all of this data, sent to the
|
|
||||||
``address`` parameter, notifying them of the invitation.
|
|
||||||
|
|
||||||
Also, the generated ephemeral public key will be listed as valid on
|
|
||||||
requests to ``/_matrix/identity/api/v1/pubkey/ephemeral/isvalid``.
|
|
||||||
|
|
||||||
Currently, invites may only be issued for 3pids of the ``email`` medium.
|
|
||||||
|
|
||||||
Optional fields in the request should be populated to the best of the
|
|
||||||
server's ability. Identity servers may use these variables when notifying
|
|
||||||
the ``address`` of the pending invite for display purposes.
|
|
||||||
operationId: storeInvite
|
|
||||||
deprecated: true
|
|
||||||
parameters:
|
|
||||||
- in: body
|
|
||||||
name: body
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
medium:
|
|
||||||
type: string
|
|
||||||
description: The literal string ``email``.
|
|
||||||
example: "email"
|
|
||||||
address:
|
|
||||||
type: string
|
|
||||||
description: The email address of the invited user.
|
|
||||||
example: "foo@example.com"
|
|
||||||
room_id:
|
|
||||||
type: string
|
|
||||||
description: The Matrix room ID to which the user is invited
|
|
||||||
example: "!something:example.org"
|
|
||||||
sender:
|
|
||||||
type: string
|
|
||||||
description: The Matrix user ID of the inviting user
|
|
||||||
example: "@bob:example.com"
|
|
||||||
room_alias:
|
|
||||||
type: string
|
|
||||||
description: |-
|
|
||||||
The Matrix room alias for the room to which the user is
|
|
||||||
invited. This should be retrieved from the ``m.room.canonical_alias``
|
|
||||||
state event.
|
|
||||||
example: "#somewhere:exmaple.org"
|
|
||||||
room_avatar_url:
|
|
||||||
type: string
|
|
||||||
description: |-
|
|
||||||
The Content URI for the room to which the user is invited. This should
|
|
||||||
be retrieved from the ``m.room.avatar`` state event.
|
|
||||||
example: "mxc://example.org/s0meM3dia"
|
|
||||||
room_join_rules:
|
|
||||||
type: string
|
|
||||||
description: |-
|
|
||||||
The ``join_rule`` for the room to which the user is invited. This should
|
|
||||||
be retrieved from the ``m.room.join_rules`` state event.
|
|
||||||
example: "public"
|
|
||||||
room_name:
|
|
||||||
type: string
|
|
||||||
description: |-
|
|
||||||
The name of the room to which the user is invited. This should be retrieved
|
|
||||||
from the ``m.room.name`` state event.
|
|
||||||
example: "Bob's Emporium of Messages"
|
|
||||||
sender_display_name:
|
|
||||||
type: string
|
|
||||||
description: The display name of the user ID initiating the invite.
|
|
||||||
example: "Bob Smith"
|
|
||||||
sender_avatar_url:
|
|
||||||
type: string
|
|
||||||
description: The Content URI for the avatar of the user ID initiating the invite.
|
|
||||||
example: "mxc://example.org/an0th3rM3dia"
|
|
||||||
required: ["medium", "address", "room_id", "sender"]
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: The invitation was stored.
|
|
||||||
schema:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
token:
|
|
||||||
type: string
|
|
||||||
description: |
|
|
||||||
The generated token. Must be a string consisting of the
|
|
||||||
characters ``[0-9a-zA-Z.=_-]``. Its length must not exceed
|
|
||||||
255 characters and it must not be empty.
|
|
||||||
public_keys:
|
|
||||||
type: array
|
|
||||||
description: |
|
|
||||||
A list of [server's long-term public key, generated ephemeral
|
|
||||||
public key].
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
display_name:
|
|
||||||
type: string
|
|
||||||
description: The generated (redacted) display_name.
|
|
||||||
required: ['token', 'public_keys', 'display_name']
|
|
||||||
example:
|
|
||||||
application/json: {
|
|
||||||
"token": "sometoken",
|
|
||||||
"public_keys": [
|
|
||||||
"serverpublickey",
|
|
||||||
"ephemeralpublickey"
|
|
||||||
],
|
|
||||||
"display_name": "f...@b..."
|
|
||||||
}
|
|
||||||
400:
|
|
||||||
description: |
|
|
||||||
An error has occured.
|
|
||||||
|
|
||||||
If the 3pid is already bound to a Matrix user ID, the error code
|
|
||||||
will be ``M_THREEPID_IN_USE``. If the medium is unsupported, the
|
|
||||||
error code will be ``M_UNRECOGNIZED``.
|
|
||||||
examples:
|
|
||||||
application/json: {
|
|
||||||
"errcode": "M_THREEPID_IN_USE",
|
|
||||||
"error": "Binding already known",
|
|
||||||
"mxid": "@alice:example.com"
|
|
||||||
}
|
|
||||||
schema:
|
|
||||||
$ref: "../client-server/definitions/errors/error.yaml"
|
|
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="75" height="32" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g fill="#000" fill-rule="nonzero">
|
||||||
|
<path d="M.936.732V31.25H3.13v.732H.095V0h3.034v.732zM9.386 10.407v1.544h.044a4.461 4.461 0 0 1 1.487-1.368c.58-.323 1.245-.485 1.993-.485.72 0 1.377.14 1.972.42.595.279 1.047.771 1.355 1.477.338-.5.796-.941 1.377-1.323.58-.383 1.266-.574 2.06-.574.602 0 1.16.074 1.674.22.514.148.954.383 1.322.707.366.323.653.746.859 1.268.205.522.308 1.15.308 1.887v7.633H20.71v-6.464c0-.383-.015-.743-.044-1.082a2.305 2.305 0 0 0-.242-.882 1.473 1.473 0 0 0-.584-.596c-.257-.146-.606-.22-1.047-.22-.44 0-.796.085-1.068.253-.272.17-.485.39-.639.662a2.654 2.654 0 0 0-.308.927 7.074 7.074 0 0 0-.078 1.048v6.354h-3.128v-6.398c0-.338-.007-.673-.021-1.004a2.825 2.825 0 0 0-.188-.916 1.411 1.411 0 0 0-.55-.673c-.258-.168-.636-.253-1.135-.253a2.33 2.33 0 0 0-.584.1 1.94 1.94 0 0 0-.705.374c-.228.184-.422.449-.584.794-.161.346-.242.798-.242 1.357v6.619H6.434V10.407h2.952zM25.842 12.084a3.751 3.751 0 0 1 1.233-1.17 5.37 5.37 0 0 1 1.685-.629 9.579 9.579 0 0 1 1.884-.187c.573 0 1.153.04 1.74.121.588.081 1.124.24 1.609.475.484.235.88.562 1.19.981.308.42.462.975.462 1.666v5.934c0 .516.03 1.008.088 1.478.058.471.161.824.308 1.06H32.87a4.435 4.435 0 0 1-.22-1.104c-.5.515-1.087.876-1.762 1.081a7.084 7.084 0 0 1-2.071.31c-.544 0-1.05-.067-1.52-.2a3.472 3.472 0 0 1-1.234-.617 2.87 2.87 0 0 1-.826-1.059c-.199-.426-.298-.934-.298-1.522 0-.647.114-1.18.342-1.6.227-.419.52-.753.881-1.004.36-.25.771-.437 1.234-.562.462-.125.929-.224 1.399-.298.47-.073.932-.132 1.387-.176.456-.044.86-.11 1.212-.199.353-.088.631-.217.837-.386.206-.169.301-.415.287-.74 0-.337-.055-.606-.166-.804a1.217 1.217 0 0 0-.44-.464 1.737 1.737 0 0 0-.639-.22 5.292 5.292 0 0 0-.782-.055c-.617 0-1.101.132-1.454.397-.352.264-.558.706-.617 1.323h-3.128c.044-.735.227-1.345.55-1.83zm6.179 4.423a5.095 5.095 0 0 1-.639.165 9.68 9.68 0 0 1-.716.11c-.25.03-.5.067-.749.11a5.616 5.616 0 0 0-.694.177 2.057 2.057 0 0 0-.594.298c-.17.125-.305.284-.408.474-.103.192-.154.434-.154.728 0 .28.051.515.154.706.103.192.242.342.419.453.176.11.381.187.617.231.234.044.477.066.726.066.617 0 1.094-.102 1.432-.309.338-.205.587-.452.75-.739.16-.286.26-.576.297-.87.036-.295.055-.53.055-.707v-1.17a1.4 1.4 0 0 1-.496.277zM43.884 10.407v2.096h-2.291v5.647c0 .53.088.883.264 1.059.176.177.529.265 1.057.265.177 0 .345-.007.507-.022.161-.015.316-.037.463-.066v2.426a7.49 7.49 0 0 1-.882.089 21.67 21.67 0 0 1-.947.022c-.484 0-.944-.034-1.377-.1a3.233 3.233 0 0 1-1.145-.386 2.04 2.04 0 0 1-.782-.816c-.191-.353-.287-.816-.287-1.39v-6.728H36.57v-2.096h1.894v-3.42h3.129v3.42h2.29zM48.355 10.407v2.118h.044a3.907 3.907 0 0 1 1.454-1.754 4.213 4.213 0 0 1 1.036-.497 3.734 3.734 0 0 1 1.145-.176c.206 0 .433.037.683.11v2.912a5.862 5.862 0 0 0-.528-.077 5.566 5.566 0 0 0-.595-.033c-.573 0-1.058.096-1.454.287a2.52 2.52 0 0 0-.958.783 3.143 3.143 0 0 0-.518 1.158 6.32 6.32 0 0 0-.154 1.434v5.14h-3.128V10.407h2.973zM54.039 8.642V6.06h3.128v2.582H54.04zm3.128 1.765v11.405H54.04V10.407h3.128zM58.797 10.407h3.569l2.005 2.978 1.982-2.978h3.459l-3.745 5.339 4.208 6.067h-3.57l-2.378-3.596-2.38 3.596h-3.502l4.097-6.001zM74.094 31.25V.732H71.9V0h3.035v31.982H71.9v-.732z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.1 KiB |
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2020, 2021 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
$primary: #FFF;
|
||||||
|
$secondary: #0098D4;
|
||||||
|
$dark: #333;
|
||||||
|
$gray-100: #FBFBFB;
|
||||||
|
|
||||||
|
$secondary-background: #E5F5FB;
|
||||||
|
$secondary-lighter-background: #F4FaFC;
|
||||||
|
$secondary-lightest-background: #FBFDFD;
|
||||||
|
|
||||||
|
|
||||||
|
$warning: #FF6666;
|
||||||
|
$note: $secondary;
|
||||||
|
|
||||||
|
$note-background: $secondary-background;
|
||||||
|
$warning-background: #FFE0E0;
|
||||||
|
|
||||||
|
$table-row-alternate: $secondary-lightest-background;
|
||||||
|
$table-row-default: $secondary-lighter-background;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Opt to serve fonts locally by overriding web-font-path to be a non-google fonts URL.
|
||||||
|
This is only possible with our modified docsy theme: https://github.com/matrix-org/docsy
|
||||||
|
*/
|
||||||
|
$web-font-path: "../css/fonts/Inter.css";
|
||||||
|
$google_font_name: "Inter";
|
@ -0,0 +1,428 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2020, 2021 The Matrix.org Foundation C.I.C.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Custom SCSS for the Matrix spec
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import "variables_project";
|
||||||
|
@import "variables";
|
||||||
|
|
||||||
|
/* Overrides for the navbar */
|
||||||
|
.td-navbar {
|
||||||
|
box-shadow: 0px 0px 8px rgba(179, 179, 179, 0.25);
|
||||||
|
min-height: 5rem;
|
||||||
|
|
||||||
|
.navbar-brand {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
|
||||||
|
.navbar-version {
|
||||||
|
color: $secondary;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $black;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Styles for the sidebar nav */
|
||||||
|
.td-sidebar-nav {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
overscroll-behavior: contain;
|
||||||
|
|
||||||
|
&>.td-sidebar-nav__section {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&>.td-sidebar-nav__section > li > a.td-sidebar-link {
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
font-size: 1.3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is to make the width of the items that have sub-items (like room versions)
|
||||||
|
the same as the width of items that don't (like changelog) */
|
||||||
|
.pr-md-3, .px-md-3 {
|
||||||
|
padding-right: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.indent-1 {
|
||||||
|
padding-left: 1rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.indent-2 {
|
||||||
|
padding-left: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
a, a.td-sidebar-link {
|
||||||
|
color: $gray-800;
|
||||||
|
font-weight: $font-weight-normal;
|
||||||
|
padding-top: .2rem;
|
||||||
|
padding-bottom: .2rem;
|
||||||
|
|
||||||
|
display: block;
|
||||||
|
transition: all 100ms ease-in-out;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $secondary-lighter-background;
|
||||||
|
color: $gray-800;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active, &active:hover {
|
||||||
|
background-color: $secondary-background;
|
||||||
|
font-weight: $font-weight-normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
@supports (position: sticky) {
|
||||||
|
.td-sidebar-nav {
|
||||||
|
/* This overrides calc(100vh - 10rem);, which gives us a blank space at the bottom of the sidebar */
|
||||||
|
max-height: calc(100vh - 6rem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Customise footer */
|
||||||
|
footer {
|
||||||
|
box-shadow: 0px 0px 8px rgba(179, 179, 179, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Auto numbering for headings */
|
||||||
|
.td-content {
|
||||||
|
|
||||||
|
counter-reset: h2;
|
||||||
|
|
||||||
|
&> h2 {
|
||||||
|
counter-reset: h3
|
||||||
|
}
|
||||||
|
|
||||||
|
&> h3 {
|
||||||
|
counter-reset: h4
|
||||||
|
}
|
||||||
|
|
||||||
|
&> h4 {
|
||||||
|
counter-reset: h5
|
||||||
|
}
|
||||||
|
|
||||||
|
&> h5 {
|
||||||
|
counter-reset: h6
|
||||||
|
}
|
||||||
|
|
||||||
|
&> h2:not(.no-numbers):before {
|
||||||
|
display: inline; visibility: visible; counter-increment: h2; content: counter(h2) ". "
|
||||||
|
}
|
||||||
|
|
||||||
|
&> h3:not(.no-numbers):before {
|
||||||
|
display: inline; visibility: visible; counter-increment: h3; content: counter(h2) "." counter(h3) ". "
|
||||||
|
}
|
||||||
|
|
||||||
|
&> h4:not(.no-numbers):before {
|
||||||
|
display: inline; visibility: visible; counter-increment: h4; content: counter(h2) "." counter(h3) "." counter(h4) ". "
|
||||||
|
}
|
||||||
|
|
||||||
|
&> h5:not(.no-numbers):before {
|
||||||
|
display: inline; visibility: visible; counter-increment: h5; content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) ". "
|
||||||
|
}
|
||||||
|
|
||||||
|
&> h6:not(.no-numbers):before {
|
||||||
|
display: inline; visibility: visible; counter-increment: h6; content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "." counter(h6) ". "
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adjust heading anchors for site header */
|
||||||
|
.td-content {
|
||||||
|
&> h2,
|
||||||
|
&> h3,
|
||||||
|
&> h4,
|
||||||
|
&> h5,
|
||||||
|
&> h6,
|
||||||
|
.rendered-data h1 {
|
||||||
|
scroll-margin-top: 5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Styles for the table of contents */
|
||||||
|
#toc {
|
||||||
|
padding-top: .5rem;
|
||||||
|
padding-left: 1.5rem;
|
||||||
|
|
||||||
|
ol {
|
||||||
|
padding-left: 1rem;
|
||||||
|
counter-reset: section;
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#TableOfContents {
|
||||||
|
&>ol>li {
|
||||||
|
margin-bottom: .5rem;
|
||||||
|
|
||||||
|
&>a {
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ol {
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&>ol>li>a {
|
||||||
|
padding-left: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&>ol>li>ol>li>a {
|
||||||
|
padding-left: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&>ol>li>ol>li>ol>li>a {
|
||||||
|
padding-left: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&>ol>li>ol>li>ol>li>ol>li>a {
|
||||||
|
padding-left: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&>ol>li>ol>li>ol>li>ol>li>ol>li>a {
|
||||||
|
padding-left: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
li a:before {
|
||||||
|
counter-increment: section;
|
||||||
|
content: counters(section, ".") " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
#toc-title {
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
font-size: 1.3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Styles for alert boxes */
|
||||||
|
.alert {
|
||||||
|
&.note {
|
||||||
|
&:not(.omit-title):before {
|
||||||
|
content: "INFO: ";
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
}
|
||||||
|
border: 2px solid $note;
|
||||||
|
border-left-width: 5px;
|
||||||
|
background: $note-background;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.rationale {
|
||||||
|
&:not(.omit-title):before {
|
||||||
|
content: "RATIONALE: ";
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
}
|
||||||
|
border: 2px solid $note;
|
||||||
|
border-left-width: 5px;
|
||||||
|
background: $note-background;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.warning {
|
||||||
|
&:not(.omit-title):before {
|
||||||
|
content: "WARNING: ";
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
}
|
||||||
|
border: 2px solid $warning;
|
||||||
|
border-left-width: 5px;
|
||||||
|
background: $warning-background;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Styles for sections that are rendered from data, such as HTTP APIs and event schemas */
|
||||||
|
.rendered-data {
|
||||||
|
margin: 1rem 0 3rem 0;
|
||||||
|
|
||||||
|
details {
|
||||||
|
|
||||||
|
summary {
|
||||||
|
padding: .5rem 0;
|
||||||
|
list-style-position: outside;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.deprecated-inline {
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: " — DEPRECATED";
|
||||||
|
color: $warning;
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 1.3rem;
|
||||||
|
|
||||||
|
.endpoint {
|
||||||
|
color: $secondary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
font-size: 1.3rem;
|
||||||
|
margin: 3rem 0 .5rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
margin: 1.5rem 0 .75rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 + table, h3 + table, h3 + div.highlight {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border-bottom: 2px solid $dark;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
max-width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
p code, table code {
|
||||||
|
background-color: $white;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100%;
|
||||||
|
margin: 4rem 0;
|
||||||
|
|
||||||
|
caption {
|
||||||
|
caption-side: top;
|
||||||
|
color: $dark;
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td, caption {
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
background-color: $white;
|
||||||
|
}
|
||||||
|
|
||||||
|
caption, tr {
|
||||||
|
background-color: $table-row-default;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:nth-child(even) {
|
||||||
|
background-color: $table-row-alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.basic-info, &.basic-info th, &.basic-info td {
|
||||||
|
table-layout: fixed;
|
||||||
|
margin: 1rem 0 .5rem 0;
|
||||||
|
background-color: $white;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.basic-info th {
|
||||||
|
width: 15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-name, .col-type, .col-status {
|
||||||
|
width: 25%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-description {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-status-description {
|
||||||
|
width: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
border: 0;
|
||||||
|
border-left: solid 5px $secondary;
|
||||||
|
}
|
||||||
|
|
||||||
|
.http-api-method {
|
||||||
|
font-weight: $font-weight-bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Miscellaneous custom bits */
|
||||||
|
|
||||||
|
/* Update link colours for MAtrix style */
|
||||||
|
a, a:hover {
|
||||||
|
color: $secondary;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is needed to stop the bottom of the Matrix icon from getting snipped off. */
|
||||||
|
.td-navbar .navbar-brand svg {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Give code samples and pre elements full-width */
|
||||||
|
.td-content > .highlight, .td-content > pre {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The default CSS applies a style for blockquotes but only to immediate children
|
||||||
|
of .td-content. This applies the same style to any blockquotes that descend from
|
||||||
|
.td-content. */
|
||||||
|
.td-content blockquote {
|
||||||
|
padding: 0 0 0 1rem;
|
||||||
|
margin-bottom: $spacer;
|
||||||
|
color: $gray-600;
|
||||||
|
border-left: 6px solid $secondary;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Make padding symmetrical (this selector is used in the default styles to apply padding-left: 3rem)
|
||||||
|
*/
|
||||||
|
.pl-md-5, .px-md-5 {
|
||||||
|
padding-right: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adjust default styles for info banner */
|
||||||
|
.pageinfo-primary {
|
||||||
|
max-width: 80%;
|
||||||
|
margin-left: 0;
|
||||||
|
border: 0;
|
||||||
|
border-left: solid 5px $secondary;
|
||||||
|
background-color: $gray-100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pageinfo-unstable {
|
||||||
|
background-image: url('../icons/unstable.png');
|
||||||
|
background-position: left 1rem center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
padding-left: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Full-width tables */
|
||||||
|
.td-content > table {
|
||||||
|
width: 100%;
|
||||||
|
display: table;
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
Fix various typos throughout the specification.
|
@ -1 +1 @@
|
|||||||
Add key backup (``/room_keys/*``) endpoints.
|
Add key backup (`/room_keys/*`) endpoints.
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
Document how clients can advise recipients that it is withholding decryption keys as per [MSC2399](https://github.com/matrix-org/matrix-doc/pull/2399).
|
@ -0,0 +1 @@
|
|||||||
|
Add cross-signing properties to the response of `POST /keys/query` per [MSC1756](https://github.com/matrix-org/matrix-doc/pull/1756).
|
@ -0,0 +1 @@
|
|||||||
|
Add `POST /keys/device_signing/upload` and `POST /keys/signatures/upload` per [MSC1756](https://github.com/matrix-org/matrix-doc/pull/1756).
|
@ -1 +1 @@
|
|||||||
Fix issues with ``age`` and ``unsigned`` being shown in the wrong places.
|
Fix issues with `age` and `unsigned` being shown in the wrong places.
|
||||||
|
@ -1 +1 @@
|
|||||||
Remove unimplemented ``m.login.oauth2`` and ``m.login.token`` user-interactive authentication mechanisms.
|
Remove unimplemented `m.login.oauth2` and `m.login.token` user-interactive authentication mechanisms.
|
||||||
|
@ -1 +1 @@
|
|||||||
Remove ``room_id`` from ``/sync`` examples.
|
Remove `room_id` from `/sync` examples.
|
||||||
|
@ -1 +1 @@
|
|||||||
Improve consistency and clarity of event schema ``title``\ s.
|
Improve consistency and clarity of event schema `title` s.
|
||||||
|
@ -1 +1 @@
|
|||||||
Add a ``device_id`` parameter to login fallback per `MSC2604 <https://github.com/matrix-org/matrix-doc/pull/2604>`_.
|
Add a `device_id` parameter to login fallback per [MSC2604](https://github.com/matrix-org/matrix-doc/pull/2604).
|
||||||
|
@ -1 +1 @@
|
|||||||
Clarify the behaviour of ``state`` for ``/sync`` with lazy-loading.
|
Clarify the behaviour of `state` for `/sync` with lazy-loading.
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
Added support for `reason` on all membership events and related endpoints as per [MSC2367](https://github.com/matrix-org/matrix-doc/pull/2367).
|
@ -0,0 +1 @@
|
|||||||
|
Add a 404 `M_NOT_FOUND` error to push rule endpoints as per [MSC2663](https://github.com/matrix-org/matrix-doc/pull/2663).
|
@ -0,0 +1 @@
|
|||||||
|
Make `reason` and `score` parameters optional in the content reporting API (MSC2414).
|
@ -0,0 +1 @@
|
|||||||
|
Allow guests to get the list of members for a room (MSC2689).
|
@ -0,0 +1 @@
|
|||||||
|
Fix various typos throughout the specification.
|
@ -0,0 +1 @@
|
|||||||
|
Clarify description of m.room.redaction event.
|
@ -0,0 +1 @@
|
|||||||
|
Fix various typos throughout the specification.
|
@ -0,0 +1 @@
|
|||||||
|
Fix various typos throughout the specification.
|
@ -0,0 +1 @@
|
|||||||
|
Fix various typos throughout the specification.
|
@ -0,0 +1 @@
|
|||||||
|
Mark `messages` as a required JSON body field in `PUT /_matrix/client/r0/sendToDevice/{eventType}/{txnId}` calls.
|
@ -0,0 +1 @@
|
|||||||
|
Correct examples of `client_secret` request body parameters so that they do not include invalid characters.
|
@ -0,0 +1 @@
|
|||||||
|
Fix example MXC URI for m.presence.
|
@ -0,0 +1 @@
|
|||||||
|
Add support for spoilers ([MSC2010](https://github.com/matrix-org/matrix-doc/pull/2010) and [MSC2557](https://github.com/matrix-org/matrix-doc/pull/2557)), and `color` attribute ([MSC2422](https://github.com/matrix-org/matrix-doc/pull/2422)).
|
@ -0,0 +1 @@
|
|||||||
|
Clarify that event bodies are untrusted, as per [MSC2801](https://github.com/matrix-org/matrix-doc/pull/2801).
|
@ -0,0 +1 @@
|
|||||||
|
Add `<details>` and `<summary>` to the suggested HTML subset as per [MSC2184](https://github.com/matrix-org/matrix-doc/pull/2184).
|
@ -0,0 +1 @@
|
|||||||
|
Fix various typos throughout the specification.
|
@ -0,0 +1 @@
|
|||||||
|
Fix the maximum event size restriction (65535 bytes -> 65536).
|
@ -0,0 +1 @@
|
|||||||
|
Add `m.key.verification.ready` and `m.key.verification.done` to key verification framework as per [MSC2366](https://github.com/matrix-org/matrix-doc/pull/2366).
|
@ -0,0 +1 @@
|
|||||||
|
Add key verification using in-room messages as per [MSC2241](https://github.com/matrix-org/matrix-doc/pull/2241).
|
@ -0,0 +1 @@
|
|||||||
|
Add information about using SSSS for cross-signing and key backup.
|
@ -0,0 +1 @@
|
|||||||
|
Add key verification method using QR codes ([MSC1544](https://github.com/matrix-org/matrix-doc/pull/1544)).
|
@ -0,0 +1 @@
|
|||||||
|
Add key verification using in-room messages as per [MSC2241](https://github.com/matrix-org/matrix-doc/pull/2241).
|
@ -0,0 +1 @@
|
|||||||
|
Document how clients can simplify usage of Secure Secret Storage ([MSC2874](https://github.com/uhoreg/matrix-doc/pull/new/single_ssss_spec)).
|
@ -0,0 +1 @@
|
|||||||
|
Add support for knocking, as per [MSC2403](https://github.com/matrix-org/matrix-doc/pull/2403).
|
@ -0,0 +1 @@
|
|||||||
|
Add `/knock` endpoint as per [MSC2403](https://github.com/matrix-org/matrix-doc/pull/2403).
|
@ -0,0 +1 @@
|
|||||||
|
Multiple SSO providers are possible through `m.login.sso` as per [MSC2858](https://github.com/matrix-org/matrix-doc/pull/2858).
|
@ -0,0 +1 @@
|
|||||||
|
`/login/sso/redirect/{idpId}` has been added as per [MSC2858](https://github.com/matrix-org/matrix-doc/pull/2858).
|
@ -0,0 +1 @@
|
|||||||
|
Add `device_id` to `/account/whoami` response as per [MSC2033](https://github.com/matrix-org/matrix-doc/pull/2033).
|
@ -0,0 +1 @@
|
|||||||
|
Downgrade identity server discovery failures to `FAIL_PROMPT` as per [MSC2284](https://github.com/matrix-org/matrix-doc/pull/2284).
|
@ -0,0 +1 @@
|
|||||||
|
Deprecate starting verifications that don't start with `m.key.verification.request` as per [MSC3122](https://github.com/matrix-org/matrix-doc/pull/3122).
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue