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

Add user@address:port support #3425

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Add user@address:port support
  • Loading branch information
mkg20001 authored and Ericson2314 committed Jun 21, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit a997fed90a9516fdc5ad1228097a900c365bf3be
4 changes: 2 additions & 2 deletions src/libexpr/flake/flakeref.cc
Original file line number Diff line number Diff line change
@@ -100,7 +100,7 @@ std::pair<FlakeRef, std::string> parseFlakeRefWithFragment(
.url = url,
.base = "flake:" + match.str(1),
.scheme = "flake",
.authority = "",
.authority = ParsedURLAuthority{},
.path = match[1],
};

@@ -161,7 +161,7 @@ std::pair<FlakeRef, std::string> parseFlakeRefWithFragment(
.url = base, // FIXME
.base = base,
.scheme = "git+file",
.authority = "",
.authority = {{}},
.path = flakeRoot,
.query = decodeQuery(match[2]),
};
2 changes: 1 addition & 1 deletion src/libexpr/primops/fetchTree.cc
Original file line number Diff line number Diff line change
@@ -71,7 +71,7 @@ std::string fixURI(std::string uri, EvalState & state, const std::string & defau
if (uri.find("://") == std::string::npos) {
const auto p = ParsedURL {
.scheme = defaultScheme,
.authority = "",
.authority = {{}},
.path = uri
};
return p.to_string();
4 changes: 2 additions & 2 deletions src/libfetchers/path.cc
Original file line number Diff line number Diff line change
@@ -10,8 +10,8 @@ struct PathInputScheme : InputScheme
{
if (url.scheme != "path") return {};

if (url.authority && *url.authority != "")
throw Error("path URL '%s' should not have an authority ('%s')", url.url, *url.authority);
if (url.authority && *url.authority != ParsedURLAuthority {})
throw Error("path URL '%s' should not have an authority ('%s')", url.url, url.authority->to_string());

Input input;
input.attrs.insert_or_assign("type", "path");
2 changes: 1 addition & 1 deletion src/libstore/dummy-store.cc
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@ struct DummyStoreConfig : virtual StoreConfig {

struct DummyStore : public virtual DummyStoreConfig, public virtual Store
{
DummyStore(const std::string scheme, const std::string uri, const Params & params)
DummyStore(const std::string scheme, const std::string uri, std::optional<uint16_t> port, const Params & params)
: DummyStore(params)
{ }

3 changes: 2 additions & 1 deletion src/libstore/http-binary-cache-store.cc
Original file line number Diff line number Diff line change
@@ -41,13 +41,14 @@ class HttpBinaryCacheStore : public virtual HttpBinaryCacheStoreConfig, public v
HttpBinaryCacheStore(
const std::string & scheme,
const Path & _cacheUri,
std::optional<uint16_t> port,
const Params & params)
: StoreConfig(params)
, BinaryCacheStoreConfig(params)
, HttpBinaryCacheStoreConfig(params)
, Store(params)
, BinaryCacheStore(params)
, cacheUri(scheme + "://" + _cacheUri)
, cacheUri(scheme + "://" + _cacheUri + (port ? fmt(":%d", *port) : ""))
{
if (cacheUri.back() == '/')
cacheUri.pop_back();
3 changes: 2 additions & 1 deletion src/libstore/legacy-ssh-store.cc
Original file line number Diff line number Diff line change
@@ -94,7 +94,7 @@ struct LegacySSHStore : public virtual LegacySSHStoreConfig, public virtual Stor

static std::set<std::string> uriSchemes() { return {"ssh"}; }

LegacySSHStore(const std::string & scheme, const std::string & host, const Params & params)
LegacySSHStore(const std::string & scheme, const std::string & host, std::optional<uint16_t> port, const Params & params)
: StoreConfig(params)
, CommonSSHStoreConfig(params)
, LegacySSHStoreConfig(params)
@@ -107,6 +107,7 @@ struct LegacySSHStore : public virtual LegacySSHStoreConfig, public virtual Stor
))
, master(
host,
port,
sshKey,
sshPublicHostKey,
// Use SSH master only if using more than 1 connection.
3 changes: 3 additions & 0 deletions src/libstore/local-binary-cache-store.cc
Original file line number Diff line number Diff line change
@@ -31,6 +31,7 @@ class LocalBinaryCacheStore : public virtual LocalBinaryCacheStoreConfig, public
LocalBinaryCacheStore(
const std::string scheme,
const Path & binaryCacheDir,
std::optional<uint16_t> port,
const Params & params)
: StoreConfig(params)
, BinaryCacheStoreConfig(params)
@@ -39,6 +40,8 @@ class LocalBinaryCacheStore : public virtual LocalBinaryCacheStoreConfig, public
, BinaryCacheStore(params)
, binaryCacheDir(binaryCacheDir)
{
if (port)
throw Error("file:// store does not accept a port number");
}

void init() override;
2 changes: 1 addition & 1 deletion src/libstore/local-store.cc
Original file line number Diff line number Diff line change
@@ -440,7 +440,7 @@ LocalStore::LocalStore(const Params & params)
}


LocalStore::LocalStore(std::string scheme, std::string path, const Params & params)
LocalStore::LocalStore(std::string scheme, std::string path, std::optional<uint16_t> port, const Params & params)
: LocalStore(params)
{
throw UnimplementedError("LocalStore");
2 changes: 1 addition & 1 deletion src/libstore/local-store.hh
Original file line number Diff line number Diff line change
@@ -138,7 +138,7 @@ public:
* necessary.
*/
LocalStore(const Params & params);
LocalStore(std::string scheme, std::string path, const Params & params);
LocalStore(std::string scheme, std::string path, std::optional<uint16_t> port, const Params & params);

~LocalStore();

3 changes: 3 additions & 0 deletions src/libstore/s3-binary-cache-store.cc
Original file line number Diff line number Diff line change
@@ -271,6 +271,7 @@ struct S3BinaryCacheStoreImpl : virtual S3BinaryCacheStoreConfig, public virtual
S3BinaryCacheStoreImpl(
const std::string & uriScheme,
const std::string & bucketName,
std::optional<uint16_t> port,
const Params & params)
: StoreConfig(params)
, BinaryCacheStoreConfig(params)
@@ -281,6 +282,8 @@ struct S3BinaryCacheStoreImpl : virtual S3BinaryCacheStoreConfig, public virtual
, bucketName(bucketName)
, s3Helper(profile, region, scheme, endpoint)
{
if (port)
throw Error("s3:// store does not accept a port number");
diskCache = getNarInfoDiskCache();
}

3 changes: 2 additions & 1 deletion src/libstore/ssh-store.cc
Original file line number Diff line number Diff line change
@@ -32,7 +32,7 @@ class SSHStore : public virtual SSHStoreConfig, public virtual RemoteStore
{
public:

SSHStore(const std::string & scheme, const std::string & host, const Params & params)
SSHStore(const std::string & scheme, const std::string & host, std::optional<uint16_t> port, const Params & params)
: StoreConfig(params)
, RemoteStoreConfig(params)
, CommonSSHStoreConfig(params)
@@ -42,6 +42,7 @@ class SSHStore : public virtual SSHStoreConfig, public virtual RemoteStore
, host(host)
, master(
host,
port,
sshKey,
sshPublicHostKey,
// Use SSH master only if using more than 1 connection.
7 changes: 5 additions & 2 deletions src/libstore/ssh.cc
Original file line number Diff line number Diff line change
@@ -3,9 +3,10 @@

namespace nix {

SSHMaster::SSHMaster(const std::string & host, const std::string & keyFile, const std::string & sshPublicHostKey, bool useMaster, bool compress, int logFD)
SSHMaster::SSHMaster(const std::string & host, std::optional<uint16_t> port, const std::string & keyFile, const std::string & sshPublicHostKey, bool useMaster, bool compress, int logFD)
: host(host)
, fakeSSH(host == "localhost")
, port(port)
, fakeSSH(host == "localhost" && !port)
, keyFile(keyFile)
, sshPublicHostKey(sshPublicHostKey)
, useMaster(useMaster && !fakeSSH)
@@ -36,6 +37,8 @@ void SSHMaster::addCommonSSHOpts(Strings & args)
}
if (compress)
args.push_back("-C");
if (port)
args.insert(args.end(), {"-p", std::to_string(*port)});

args.push_back("-oPermitLocalCommand=yes");
args.push_back("-oLocalCommand=echo started");
3 changes: 2 additions & 1 deletion src/libstore/ssh.hh
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ class SSHMaster
private:

const std::string host;
const std::optional<int> port;
bool fakeSSH;
const std::string keyFile;
const std::string sshPublicHostKey;
@@ -32,7 +33,7 @@ private:

public:

SSHMaster(const std::string & host, const std::string & keyFile, const std::string & sshPublicHostKey, bool useMaster, bool compress, int logFD = -1);
SSHMaster(const std::string & host, std::optional<uint16_t> port, const std::string & keyFile, const std::string & sshPublicHostKey, bool useMaster, bool compress, int logFD = -1);

struct Connection
{
30 changes: 14 additions & 16 deletions src/libstore/store-api.cc
Original file line number Diff line number Diff line change
@@ -1433,26 +1433,25 @@ std::shared_ptr<Store> openFromNonUri(const std::string & uri, const Store::Para
//
// This function now ensures that a usable connection string is available:
// * If the store to be opened is not an SSH store, nothing will be done.
// * If the URL looks like `root@[::1]` (which is allowed by the URL parser and probably
// * If the URL host looks like `[::1]` (which is allowed by the URL parser and probably
// needed to pass further flags), it
// will be transformed into `root@::1` for SSH (same for `[::1]` -> `::1`).
// * If the URL looks like `root@::1` it will be left as-is.
// will be transformed into `::1` for SSH (same for `[::1]` -> `::1`).
// * If the URL host looks like `::1` it will be left as-is.
// * In any other case, the string will be left as-is.
static std::string extractConnStr(const std::string &proto, const std::string &connStr)
static std::string extractConnStr(
const std::string & proto,
const std::string & host)
{
if (proto.rfind("ssh") != std::string::npos) {
std::smatch result;
std::regex v6AddrRegex("^((.*)@)?\\[(.*)\\]$");
std::regex v6AddrRegex("^\\[(.*)\\]$");

if (std::regex_match(connStr, result, v6AddrRegex)) {
if (result[1].matched) {
return result.str(1) + result.str(3);
}
return result.str(3);
if (std::regex_match(host, result, v6AddrRegex)) {
return result.str(1);
}
}

return connStr;
return host;
}

ref<Store> openStore(const std::string & uri_,
@@ -1463,14 +1462,13 @@ ref<Store> openStore(const std::string & uri_,
auto parsedUri = parseURL(uri_);
params.insert(parsedUri.query.begin(), parsedUri.query.end());

auto baseURI = extractConnStr(
parsedUri.scheme,
parsedUri.authority.value_or("") + parsedUri.path
);
auto authHack = parsedUri.authority.value_or(ParsedURLAuthority {});
authHack.host = extractConnStr(parsedUri.scheme, authHack.host);
authHack.host += parsedUri.path;

for (auto implem : *Implementations::registered) {
if (implem.uriSchemes.count(parsedUri.scheme)) {
auto store = implem.create(parsedUri.scheme, baseURI, params);
auto store = implem.create(parsedUri.scheme, authHack.host, authHack.port, params);
if (store) {
store->init();
store->warnUnknownSettings();
6 changes: 3 additions & 3 deletions src/libstore/store-api.hh
Original file line number Diff line number Diff line change
@@ -967,7 +967,7 @@ std::list<ref<Store>> getDefaultSubstituters();
struct StoreFactory
{
std::set<std::string> uriSchemes;
std::function<std::shared_ptr<Store> (const std::string & scheme, const std::string & uri, const Store::Params & params)> create;
std::function<std::shared_ptr<Store> (const std::string & scheme, const std::string & host, std::optional<uint16_t> optPort, const Store::Params & params)> create;
std::function<std::shared_ptr<StoreConfig> ()> getConfig;
};

@@ -982,9 +982,9 @@ struct Implementations
StoreFactory factory{
.uriSchemes = T::uriSchemes(),
.create =
([](const std::string & scheme, const std::string & uri, const Store::Params & params)
([](const std::string & scheme, const std::string & host, std::optional<uint16_t> optPort, const Store::Params & params)
-> std::shared_ptr<Store>
{ return std::make_shared<T>(scheme, uri, params); }),
{ return std::make_shared<T>(scheme, host, optPort, params); }),
.getConfig =
([]()
-> std::shared_ptr<StoreConfig>
3 changes: 3 additions & 0 deletions src/libstore/uds-remote-store.cc
Original file line number Diff line number Diff line change
@@ -36,9 +36,12 @@ UDSRemoteStore::UDSRemoteStore(const Params & params)
UDSRemoteStore::UDSRemoteStore(
const std::string scheme,
std::string socket_path,
std::optional<uint16_t> port,
const Params & params)
: UDSRemoteStore(params)
{
if (port)
throw Error("unix:// store does not accept a port number");
path.emplace(socket_path);
}

2 changes: 1 addition & 1 deletion src/libstore/uds-remote-store.hh
Original file line number Diff line number Diff line change
@@ -26,7 +26,7 @@ class UDSRemoteStore : public virtual UDSRemoteStoreConfig, public virtual Local
public:

UDSRemoteStore(const Params & params);
UDSRemoteStore(const std::string scheme, std::string path, const Params & params);
UDSRemoteStore(const std::string scheme, std::string path, std::optional<uint16_t> port, const Params & params);

std::string getUri() override;

Loading