Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: read proxy origin from QubesDB when available; otherwise environment #1895

Closed
wants to merge 27 commits into from

Commits on Mar 7, 2024

  1. Configuration menu
    Copy the full SHA
    321fc9a View commit details
    Browse the repository at this point in the history
  2. Rewrite proxy in Rust, with v2 behavior

    We identified multiple features that the current implementation of the
    proxy is unable to support (e.g. progress reporting, resuming
    downloads), necessitating a new protocol dubbed "v2". We are taking the
    opportunity to rewrite this component in Rust.
    
    Normal operation is mostly the same, input is received as a JSON blob
    (parsed and validated by serde) and output in our custom JSON response
    format. The `url` crate (from servo) is used to assemble and validate
    the target URL, and `reqwest` fires off the HTTP request.
    
    Downloads are now streamed back to the client over stdout, and metadata
    passed over stderr.
    
    Tests and further integration will happen in follow-up commits.
    
    Refs #1678.
    
    Co-authored-by: Kunal Mehta <[email protected]>
    cfm and legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    e40eefb View commit details
    Browse the repository at this point in the history
  3. Test Rust proxy

    Rewrite the existing tests to be integration tests against a compiled
    Rust binary. We use the httpbin library to start up a Python webserver
    and instruct the proxy to connect to it. This allows to test connection
    properties that aren't recordable in the VCR format, like timeouts or
    streamed responses.
    
    The tests are reorganized to be split into proxy handling and error
    handling.
    legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    6a78dcf View commit details
    Browse the repository at this point in the history
  4. Integrate proxy v2 into SDK

    The SDK will now unconditionally use proxy v2: in development mode,
    it'll shell out directly, while production mode will invoke it over
    qrexec. The dev `./run.sh` script will compile the proxy so it's ready
    for use before the client starts up.
    
    New typed dataclasses represent the two types of responses that can be
    returned. No user-facting changes are happening at this stage, but this
    will enable future client features.
    
    The union return of send_json_request() means that we need instanceof
    assertions to make mypy happy.
    
    One minor logic bug in API.get_submission() was fixed in the case that
    no request is made (an undefined exception would've been raised previously).
    legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    fce59ed View commit details
    Browse the repository at this point in the history
  5. Refactor and update SDK tests to use lightweight VCR interface

    We can't use VCR.py's "custom_patches" parameter because our
    API._send_json_request() is RPC- rather than connection-oriented.  But
    we can just instrument _send_json_request() directly, which is what we
    do here.
    
    We subclass vcr.cassette.Cassette to handle identical requests with
    different responses, which was suggestd by @vickyliin as a workaround
    for kevin1024/vcrpy#753.
    
    Now that the SDK‒proxy connection is itself instrumented, there's only
    one path to test, with no special error-handling logic required, so
    merge TestAPIProxy into TestAPI.
    
    I considered merging TestAPI and TestShared as well, now that (without
    TestAPIProxy) TestAPI is the only subclass of TestShared.  But
    reorganizing the alphabetized helpers in TestShared versus the
    strictly-sequenced TestAPI methods can wait.
    
    The tests are also now more patient with slow deletion operations.
    I'd want to DRY up this logic if this pattern shows up in more places,
    but it would require adding another level of indirection.  A @Retry
    decorator isn't appropriate at the level of the test method, and a
    context manager can't loop over its closure.
    
    And re-apply the hack from 880635d by renaming test_logout to start with
    a "z" so it runs last.
    cfm authored and legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    20c7035 View commit details
    Browse the repository at this point in the history
  6. Add make regenerate-sdk-cassettes and use in SDK CI

    Help the developer through regenerating SDK cassettes against a
    development server, as well as in CI.
    cfm authored and legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    dd37b00 View commit details
    Browse the repository at this point in the history
  7. Build Rust code in package

    * Switch to `Arch: any` because the package contains compiled code and
      this enables debhelper's automatic shlibs dependency system.
    * Rename the binary to `securedrop-proxy` because that's the Rust name.
    legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    7d4f3c2 View commit details
    Browse the repository at this point in the history
  8. Configuration menu
    Copy the full SHA
    8084a2b View commit details
    Browse the repository at this point in the history
  9. Configuration menu
    Copy the full SHA
    669deac View commit details
    Browse the repository at this point in the history
  10. Switch functional tests to use custom VCR setup

    Same as the SDK, use our custom VCRAPI wrapper instead of pytest-vcr.
    
    Because each of the functional tests log in and out, document the server
    hack needed to run them one after another in the README.
    legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    2c5b29d View commit details
    Browse the repository at this point in the history
  11. Remove Python implementation of proxy

    Now replaced by the Rust version.
    legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    cc76caf View commit details
    Browse the repository at this point in the history
  12. Some Rust audits

    legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    4bbdd6e View commit details
    Browse the repository at this point in the history
  13. Configuration menu
    Copy the full SHA
    3c1df77 View commit details
    Browse the repository at this point in the history
  14. Remove requests dependency

    Fixes #1761.
    legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    5161952 View commit details
    Browse the repository at this point in the history
  15. Review some crates

    legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    a99e6a3 View commit details
    Browse the repository at this point in the history
  16. Another Rust audit

    legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    9aa2290 View commit details
    Browse the repository at this point in the history
  17. feat(read): split implementation on "qubesdb" feature

    Co-authored-by: Kunal Mehta <[email protected]>
    cfm and legoktm committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    59564da View commit details
    Browse the repository at this point in the history
  18. Configuration menu
    Copy the full SHA
    1fec128 View commit details
    Browse the repository at this point in the history
  19. Configuration menu
    Copy the full SHA
    185a843 View commit details
    Browse the repository at this point in the history
  20. Configuration menu
    Copy the full SHA
    6e17717 View commit details
    Browse the repository at this point in the history
  21. Configuration menu
    Copy the full SHA
    59259fd View commit details
    Browse the repository at this point in the history

Commits on Mar 11, 2024

  1. Configuration menu
    Copy the full SHA
    4853d4b View commit details
    Browse the repository at this point in the history
  2. fix(read): explicitly handle qbd_read() = NUL

    Since qdb_read() returns a pointer, not a byte-slice, we can't rely on
    the nul-byte handling of the CStr::from_bytes*() functions.
    cfm committed Mar 11, 2024
    Configuration menu
    Copy the full SHA
    a615d80 View commit details
    Browse the repository at this point in the history

Commits on Mar 12, 2024

  1. Configuration menu
    Copy the full SHA
    238a3f5 View commit details
    Browse the repository at this point in the history
  2. docs(read): safety

    cfm committed Mar 12, 2024
    Configuration menu
    Copy the full SHA
    8c477b7 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    b132932 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    14873c6 View commit details
    Browse the repository at this point in the history