From 143ed1f43ac7a061e7a71ad0e028db655d2275c8 Mon Sep 17 00:00:00 2001 From: irl Date: Mon, 2 Dec 2024 00:00:28 +0000 Subject: [PATCH] docs: some reorganisation of documentation --- .gitignore | 7 ++ docs/_static/proxies/architecture.png | Bin 86557 -> 0 bytes docs/conf.py | 4 +- docs/index.rst | 14 +-- docs/publisher/api.rst | 153 +------------------------ docs/user/index.rst | 2 +- docs/user/{proxies.rst => mirrors.rst} | 99 +--------------- requirements-docs.txt | 4 + schemas/publisher.yaml | 132 +++++++++++++++++++++ 9 files changed, 164 insertions(+), 251 deletions(-) delete mode 100644 docs/_static/proxies/architecture.png rename docs/user/{proxies.rst => mirrors.rst} (50%) create mode 100644 requirements-docs.txt create mode 100644 schemas/publisher.yaml diff --git a/.gitignore b/.gitignore index a87af34..0feee07 100644 --- a/.gitignore +++ b/.gitignore @@ -163,3 +163,10 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. .idea/ + +# Testing Onion keys +/scripts/self_signed_onion_service/ +/scripts/future_onion_service/ +/scripts/expired_onion_service/ +/scripts/wrong_name_onion_service/ +/scripts/new_onion.rest diff --git a/docs/_static/proxies/architecture.png b/docs/_static/proxies/architecture.png deleted file mode 100644 index 5fafcd4347e814272a9ea98c987dc874a8d5918a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86557 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

iCg6yCPIb{#)stGk?BKa^DyN7`le=$wN$+EG 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 diff --git a/docs/conf.py b/docs/conf.py index b141ed6..dfff045 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -19,6 +19,8 @@ author = 'Bypass Censorship' # ones. extensions = [ 'sphinx.ext.autodoc', + 'sphinxcontrib.mermaid', + 'sphinxcontrib.openapi' ] # Add any paths that contain templates here, relative to this directory. @@ -35,7 +37,7 @@ exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'alabaster' +html_theme = 'furo' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, diff --git a/docs/index.rst b/docs/index.rst index 7302abf..a863530 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,23 +4,23 @@ Documentation Home .. image:: /_static/home.png :width: 800 -.. toctree:: - :maxdepth: 2 - :caption: Publisher Guide - - publisher/api.rst - .. toctree:: :maxdepth: 2 :caption: User Guide user/index.rst - user/proxies.rst + user/mirrors.rst user/eotk.rst user/bridges.rst user/lists.rst user/automation.rst +.. toctree:: + :maxdepth: 2 + :caption: Publisher Guide + + publisher/api.rst + .. toctree:: :maxdepth: 2 :caption: Admin Guide diff --git a/docs/publisher/api.rst b/docs/publisher/api.rst index 5b8c2dd..179e445 100644 --- a/docs/publisher/api.rst +++ b/docs/publisher/api.rst @@ -1,149 +1,6 @@ -===================== -Bypass Censorship API -===================== +============= +Publisher API +============= -Introduction ------------- - -The Bypass Censorship API allows publishers to interact with the Bypass Censorship platform and to obtain short links, -snapshot links, and mirror links for their content. - -.. note:: - - This documentation is generic and applies to any deployment of the Bypass Censorship platform. - For the base URL and authentication details specific to your use, contact your vendor. - -The API supports the following endpoints: - -.. list-table:: - :header-rows: 1 - - * - Endpoint - - Method - - Description - * - /me - - GET - - Retrieve information about the authenticated user's pool. - * - /link - - GET - - Generate a short link or a direct mirror link. - * - / - - GET - - Redirect to the live mirror associated with the given hash. - -Authentication --------------- - -The API endpoints are protected by authentication. The authentication method depends on the endpoint: - -- /me endpoint: The API key is provided in the request arguments using the `key` parameter. If no API key is provided, the "public" resource pool is used. -- /link endpoint: The API key is provided in the request arguments using the `key` parameter. If no API key is provided, the "public" resource pool is used. - -Endpoints ---------- - -/me -^^^ - -Retrieve information about the authenticated user's pool. - -- Method: GET -- URL: /me - -Query Parameters: - -- `key` (optional): The API key of the pool. If not provided, the public API key is used. - -Response: - -- Success: Returns the information about the pool in JSON format. -- Failure: Returns a 403 response if the API key is invalid. - -/link -^^^^^ - -Generate a circumvention link for a specific resource. -This may create a new link or return an already existing link if it has been previously created. - -- Method: GET -- URL: /link - -Query Parameters: - -- `url` (required): The URL for which a circumvention link needs to be generated. -- `type` (optional): The type of link to generate. Valid values are "live", "short", or "snapshot". If not provided, "direct" is used. -- `key` (optional): The API key of the pool. If not provided, the public API key is used. -- `expiry` (optional): The duration that a snapshot will remain published for. Valid values are "long" and "short". If not provided, "short" is used. -- `footer_text` (optional): Defines the footer text to be used when publishing a snapshot. -- `footer_link` (optional): Defines the footer link to be used when publishing a snapshot. - -When `footer_text` is not specified, no footer link will be added to a snapshot. -When `footer_link` is not specified, but footer text is specified, a link will be added to a live mirror of the -snapshotted article. - -When `type` is specified as "snapshot" and a private API key is specified, a request will be made to the resource to -check the status code returned. If the status code is not 200 and a snapshot had previously been published then that -snapshot will be deleted and future attempts to access it will fail. This mechanism may be used by publishers to -perform self-service take downs of unwanted snapshots. - -Response: - -- Success: Returns the generated link in JSON format. -- Failure: Returns a 403 response if the resource is not on a supported domain. -- Failure: Returns a 404 response if no live mirror exists for the resource. -- Failure: Returns a 500 response if it was not possible to generate a snapshot for a resource. - -/ -^^^^^^^ - -Redirect to the live mirror associated with the given hash. - -- Method: GET -- URL: / - -Path Parameters: - -- `hash` (required): The hash associated with the short link. - -Query Parameters: - -- `force` (optional): Always redirect to a mirror and ignore GeoIP information. -- `force_ip` (optional): Override the client IP address and base the GeoIP lookup on this IP address instead. - -Response: - -- Success: Redirects the client to the original URL. -- Failure: Returns a 404 response if the hash is invalid or not found. - -Example Usage -------------- - -.. code-block:: bash - - $ curl -X GET /me?key= - $ curl -X GET /link?url=&type=&key= - $ curl -X GET / - -Note: Replace ``, ``, ``, and `` with actual values. - -Authentication and Permissions -------------------------------- - -The API endpoints require valid API keys for authentication. The API key can be obtained from the pool configuration. - -API keys have different permissions: - -- Public API Key: Can be used to access live mirror links, snapshots, and resolve short links. -- Private API Key: Can be used to access live mirror links, snapshots, and create new short links. - -Response Format ---------------- - -The API endpoints return JSON responses. -Successful responses contain the requested data, while failure responses provide relevant error messages. - -Error Handling --------------- - -In case of errors, the API endpoints return appropriate HTTP status codes and error messages. -Clients should handle these errors gracefully and take appropriate actions. +.. openapi:: ../../schemas/publisher.yaml + :examples: diff --git a/docs/user/index.rst b/docs/user/index.rst index d494463..5e7d3bd 100644 --- a/docs/user/index.rst +++ b/docs/user/index.rst @@ -11,7 +11,7 @@ to counter the measures put in place by the censor. Collateral Freedom ------------------ -*Used by:* :doc:`Web Proxies `, :doc:`Tor Bridges ` +*Used by:* :doc:`Web Mirrors `, :doc:`Tor Bridges ` "Collateral freedom" is an anti-censorship strategy that attempts to make it economically prohibitive for censors to block an Internet resource. diff --git a/docs/user/proxies.rst b/docs/user/mirrors.rst similarity index 50% rename from docs/user/proxies.rst rename to docs/user/mirrors.rst index 0b0b484..d070125 100644 --- a/docs/user/proxies.rst +++ b/docs/user/mirrors.rst @@ -1,36 +1,23 @@ -Web Proxies +Web Mirrors =========== Background ---------- -A web proxy can help users by providing alternate URLs to access censored resources, allowing them to bypass technical censorship and access information that may be otherwise unavailable. +A web mirror can help users by providing alternate URLs to access censored resources, allowing them to bypass technical censorship and access information that may be otherwise unavailable. Web proxies work by forwarding requests to the original website, and providing a different URL to access that content. By accessing the web proxy URL, users can access the same content that would be blocked by censors if accessed through the original website's URL. -Web proxies also use frequently changing URLs to evade censorship, making it more difficult for censors to block access to the content. +Web mirrors also use frequently changing URLs to evade censorship, making it more difficult for censors to block access to the content. This assumption of a limited lifetime is built-in to the system, allowing for automated block detection to trigger the deployment of new URLs, and for the :doc:`distribution lists ` to allow applications and end-users to discover new URLs. Additionally, web proxies can be accessed via a normal web browser, making them easily accessible to users without requiring any special software or technical knowledge. -Simple vs. Smart Proxies -^^^^^^^^^^^^^^^^^^^^^^^^ - -We currently distinguish between simple and smart proxies. -This distinction will become redundant in the future as we aim to allow for all providers to offer the smart proxy functionality. -Smart proxies differ from simple proxies in that they perform active rewriting of the responses from the original website. -This modifies links to resources to ensure that they are always loaded via the mirror system rather than from the original—blocked—website. - -Smart proxies are only supported on AWS right now. - Architecture ------------ -.. image:: /_static/proxies/architecture.png - :width: 800 - Before configuring any web origins to create mirrors, you must first configure an origin group. The group is used to organise larger numbers of web origins so that mirrors can be created for them with a shared configuration. The shared configuration will include which pools will require mirrors for the origins. @@ -38,9 +25,8 @@ The shared configuration will include which pools will require mirrors for the o For each configured origin group, a smart proxy instance will be created at each provider where proxies are deployed. This instance runs the active proxy that will rewrite URLs in responses from the origin webserver to ensure that all resources are loaded via the mirrors. Some providers, e.g. Fastly, do not require an instance as they already provide the means for URL re-writing in their standard functionality. -No smart proxy instance will be created for providers where it is not necessary. -Web origins represent the original website that has been blocked. +Web origins represent the source website that has been blocked. Web Origins ----------- @@ -52,7 +38,7 @@ CDNs (Content Delivery Networks) can impose rate limiting on websites to ensure efficiently utilized, to protect the websites from DDoS (Distributed Denial of Service) attacks and to maintain the quality of service for all the websites using the CDN. -These rate limits will be sized according to the expected rate of requests from an average user, however the proxy +These rate limits will be sized according to the expected rate of requests from an average user, however the mirror system is a bottleneck that aggregates requests from multiple users and passes these on to the original CDN. When a single system is used to send a large number of requests to a CDN like this, the CDN may interpret this as a denial of service (DoS) attack and prevent access to the website. @@ -92,85 +78,10 @@ Auto-Rotate Select this field if you want to enable auto-rotation for the mirror. This means that the mirror will automatically redeploy with a new domain name if it is detected to be blocked. This field is optional and is enabled by default. -Smart Proxy -""""""""""" - -.. note:: This is a transitional option that will be removed once all platforms support smart proxies. - -Select this field if the mirror requires a smart proxy to function properly. This is an optional field and is disabled -by default. Enabling this will limit the platforms that the mirror can be deployed to as not all platforms support -smart proxies at this time. - Asset Domain """""""""""" -.. note:: This is a transitional option that will be removed once all platforms support smart proxies. - Select this field if you want to use mirrors of this domain to host assets for other domains. This is an optional field and is disabled by default. All of the asset domains within a group will be available for all mirrors using smart proxies. The smart proxy will rewrite URLs for the asset domains that are included in the source code of the mirror hosted by a smart proxy. - -Static Origins --------------- - -Static origins can be used to host static content at a cloud provider, and then have mirrors generated for that content -rather than proxying to an external web server. - -Once created a static origin will provide you with details on where and how to upload the web content. - -Static origins can also be extended with additional resources: - -* `Keanu Convene `_ - A matrix-based chat platform that supports sharing of any kind. Rooms are - private and encrypted by default. No software is required to join a room other than a web browser, and participants - can be invited via a link. -* `Clean Insights `_ - A private measurement platform. It is focused on assisting in - answering key questions about app usage patterns, and not on enabling invasive surveillance of all user habits. - -These resources can be added/removed after the creation of the static origin without having to change the static storage -location or access credentials. - -New Static Origin -^^^^^^^^^^^^^^^^^ - -To create a new static origin, click "Create new static origin" at the top of the list. This will present -you with the new static origin form: - -.. image:: /_static/static/new.png - :width: 800 - -Description -""""""""""" - -Enter a brief description of the static website that you are creating in this field. This is also a required field. - -Group -""""" - -Select the group that you want the origin to belong to from the drop-down menu in this field. This is a required field. - -Auto-Rotate -""""""""""" - -Select this field if you want to enable auto-rotation for the mirror. This means that the mirror will automatically -redeploy with a new domain name if it is detected to be blocked. This field is optional and is enabled by default. - -Matrix Homeserver -""""""""""""""""" - -Select the Matrix homeserver from the drop-down box to enable Keanu Convene on mirrors of this static origin. - -Keanu Convene Path -"""""""""""""""""" - -Enter the subdirectory to present the Keanu Convene application at on the mirror. This defaults to "talk". - -Enable Clean Insights -""""""""""""""""""""" - -When enabled, a Clean Insights Measurement Proxy endpoint is deployed on the mirror to allow for submission of results -from any of the supported Clean Insights SDKs. - -Web Proxies ------------ - diff --git a/requirements-docs.txt b/requirements-docs.txt new file mode 100644 index 0000000..61de458 --- /dev/null +++ b/requirements-docs.txt @@ -0,0 +1,4 @@ +furo +sphinx +sphinxcontrib-mermaid +sphinxcontrib-openapi \ No newline at end of file diff --git a/schemas/publisher.yaml b/schemas/publisher.yaml new file mode 100644 index 0000000..01edea7 --- /dev/null +++ b/schemas/publisher.yaml @@ -0,0 +1,132 @@ +openapi: 3.0.3 +info: + title: Bypass Censorship API + description: | + The Bypass Censorship API allows publishers to interact with the Bypass Censorship platform and to obtain short links, + snapshot links, and mirror links for their content. + + **Note**: This documentation is generic and applies to any deployment of the Bypass Censorship platform. + For the base URL and authentication details specific to your use, contact your vendor. + version: 1.0.0 +servers: + - url: https://example.com + description: Example server +paths: + /me: + get: + summary: Retrieve information about the authenticated user's pool + parameters: + - name: key + in: query + description: The API key of the pool. If not provided, the public API key is used. + required: false + schema: + type: string + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + description: Information about the user's pool + '403': + description: Invalid API key + /link: + get: + summary: Generate a circumvention link for a specific resource + parameters: + - name: url + in: query + description: The URL for which a circumvention link needs to be generated. + required: true + schema: + type: string + - name: type + in: query + description: | + The type of link to generate. Valid values are "live", "short", or "snapshot". + If not provided, "direct" is used. + required: false + schema: + type: string + enum: [live, short, snapshot, direct] + - name: key + in: query + description: The API key of the pool. If not provided, the public API key is used. + required: false + schema: + type: string + - name: expiry + in: query + description: | + The duration that a snapshot will remain published for. Valid values are "long" and "short". + If not provided, "short" is used. + required: false + schema: + type: string + enum: [long, short] + - name: footer_text + in: query + description: Defines the footer text to be used when publishing a snapshot. + required: false + schema: + type: string + - name: footer_link + in: query + description: Defines the footer link to be used when publishing a snapshot. + required: false + schema: + type: string + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + description: Generated circumvention link + '403': + description: Resource not on a supported domain + '404': + description: No live mirror exists for the resource + '500': + description: Could not generate a snapshot for the resource + /{hash}: + get: + summary: Redirect to the live mirror associated with the given hash + parameters: + - name: hash + in: path + description: The hash associated with the short link + required: true + schema: + type: string + - name: force + in: query + description: Always redirect to a mirror and ignore GeoIP information. + required: false + schema: + type: boolean + - name: force_ip + in: query + description: Override the client IP address and base the GeoIP lookup on this IP address instead. + required: false + schema: + type: string + responses: + '302': + description: Redirects the client to the original URL + headers: + Location: + description: The URL of the live mirror + schema: + type: string + '404': + description: The hash is invalid or not found +components: + securitySchemes: + apiKeyAuth: + type: apiKey + in: query + name: key