Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NixOS/nix
base: 82e551159448
Choose a base ref
...
head repository: NixOS/nix
compare: eb458ad1b2d5
Choose a head ref
  • 2 commits
  • 2 files changed
  • 2 contributors

Commits on Dec 9, 2020

  1. libstore/openStore: fix stores with IPv6 addresses

    In `nixStable` (2.3.7 to be precise) it's possible to connect to stores
    using an IPv6 address:
    
      nix ping-store --store ssh://root@2001:db8::1
    
    This is also useful for `nixops(1)` where you could specify an IPv6
    address in `deployment.targetHost`.
    
    However, this behavior is broken on `nixUnstable` and fails with the
    following error:
    
      $ nix store ping --store ssh://root@2001:db8::1
      don't know how to open Nix store 'ssh://root@2001:db8::1'
    
    This happened because `openStore` from `libstore` uses the `parseURL`
    function from `libfetchers` which expects a valid URL as defined in
    RFC2732. However, this is unsupported by `ssh(1)`:
    
      $ nix store ping --store 'ssh://root@[2001:db8::1]'
      cannot connect to 'root@[2001:db8::1]'
    
    This patch now allows both ways of specifying a store (`root@2001:db8::1`) and
    also `root@[2001:db8::1]` since the latter one is useful to pass query
    parameters to the remote store.
    
    In order to achieve this, the following changes were made:
    
    * The URL regex from `url-parts.hh` now allows an IPv6 address in the
      form `2001:db8::1` and also `[2001:db8::1]`.
    
    * In `libstore`, a new function named `extractConnStr` ensures that a
      proper URL is passed to e.g. `ssh(1)`:
    
      * If a URL looks like either `[2001:db8::1]` or `root@[2001:db8::1]`,
        the brackets will be removed using a regex. No additional validation
        is done here as only strings parsed by `parseURL` are expected.
    
      * In any other case, the string will be left untouched.
    
    * The rules above only apply for `LegacySSHStore` and `SSHStore` (a.k.a
      `ssh://` and `ssh-ng://`).
    
    Unresolved questions:
    
    * I'm not really sure whether we want to allow both variants of IPv6
      addresses in the URL parser. However it should be noted that both seem
      to be possible according to RFC2732:
    
      > This document incudes an update to the generic syntax for Uniform
      > Resource Identifiers defined in RFC 2396 [URL].  It defines a syntax
      > for IPv6 addresses and allows the use of "[" and "]" within a URI
      > explicitly for this reserved purpose.
    
    * Currently, it's not supported to specify a port number behind the
      hostname, however it seems as this is not really supported by the URL
      parser. Hence, this is probably out of scope here.
    Ma27 committed Dec 9, 2020
    Copy the full SHA
    93a8a00 View commit details
    Browse the repository at this point in the history
  2. Merge pull request #4319 from Ma27/store-v6-addr

    libstore/openStore: fix stores with IPv6 addresses
    edolstra committed Dec 9, 2020
    Copy the full SHA
    eb458ad View commit details
    Browse the repository at this point in the history