Add support for Proton
This commit is contained in:
parent
b0d76f8f46
commit
85f2de1168
1 changed files with 100 additions and 7 deletions
|
@ -8,22 +8,26 @@ let
|
||||||
nextcloudVendor = "nextcloud";
|
nextcloudVendor = "nextcloud";
|
||||||
mkIfNotNull = value: name: lib.mkIf (value != null) { ${name} = value; };
|
mkIfNotNull = value: name: lib.mkIf (value != null) { ${name} = value; };
|
||||||
|
|
||||||
|
mkFileOption = { description }: lib.mkOption {
|
||||||
|
type = lib.types.nullOr (lib.types.either lib.types.path lib.types.str);
|
||||||
|
description = "The path to a file containing ${description}";
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
mkUsernameOption = { service }: lib.mkOption {
|
mkUsernameOption = { service }: lib.mkOption {
|
||||||
type = lib.types.nullOr lib.types.str;
|
type = lib.types.nullOr lib.types.str;
|
||||||
description = "The user name for logging in to ${service}.";
|
description = "The user name for logging in to ${service}.";
|
||||||
default = null;
|
default = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
mkPasswordOption = { service }: lib.mkOption {
|
mkPasswordOption = { service, itemKind ? "password" }: lib.mkOption {
|
||||||
type = lib.types.nullOr lib.types.str;
|
type = lib.types.nullOr lib.types.str;
|
||||||
description = "The password obscured using the `rclone obscure` command for logging in to ${service}.";
|
description = "The ${itemKind} obscured using the `rclone obscure` command for logging in to ${service}.";
|
||||||
default = null;
|
default = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
mkPasswordFileOption = { service }: lib.mkOption {
|
mkPasswordFileOption = { service, itemKind ? "password" }: mkFileOption {
|
||||||
type = lib.types.nullOr (lib.types.either lib.types.path lib.types.str);
|
description = "the ${itemKind} obscured using the `rclone obscure` command for logging in to ${service}.";
|
||||||
description = "The path to a file containing the password obscured using the `rclone obscure` command for logging in to ${service}.";
|
|
||||||
default = null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
mkServerUsernameOption = { service }: mkUsernameOption { service = "the ${service} server."; };
|
mkServerUsernameOption = { service }: mkUsernameOption { service = "the ${service} server."; };
|
||||||
|
@ -179,6 +183,90 @@ let
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
mkProtonProvider = { displayName }: (
|
||||||
|
{ config, ... }: {
|
||||||
|
imports = [
|
||||||
|
mkProvider
|
||||||
|
];
|
||||||
|
|
||||||
|
options = {
|
||||||
|
username = mkUsernameOption { service = displayName; };
|
||||||
|
obscuredPassword = mkPasswordOption { service = displayName; };
|
||||||
|
obscuredPasswordFile = mkPasswordFileOption { service = displayName; };
|
||||||
|
|
||||||
|
webAuthnToken = lib.mkOption {
|
||||||
|
type = lib.types.strMatching "[0-9]{6}";
|
||||||
|
description = "The 2 Factor Authentication code for logging in to ${displayName}.";
|
||||||
|
};
|
||||||
|
|
||||||
|
webAuthnTokenFile = mkFileOption {
|
||||||
|
description = "the 2 Factor Authentication code for logging in to ${displayName}.";
|
||||||
|
};
|
||||||
|
|
||||||
|
clientID = lib.mkOption {
|
||||||
|
type = lib.types.nullOr lib.types.str;
|
||||||
|
description = "The client key.";
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
accessToken = lib.mkOption {
|
||||||
|
type = lib.types.nullOr lib.types.str;
|
||||||
|
description = "The access token.";
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
refreshToken = lib.mkOption {
|
||||||
|
type = lib.types.nullOr lib.types.str;
|
||||||
|
description = "The refresh token.";
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
saltedKeyPass = lib.mkOption {
|
||||||
|
type = lib.types.nullOr lib.types.str;
|
||||||
|
description = "The salted key pass.";
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
enableCaching = lib.mkOption {
|
||||||
|
type = lib.types.nullOr lib.types.bool;
|
||||||
|
description = "Whether to enable ${displayName}'s integrated caching.";
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
mailboxPassword = mkPasswordOption { service = displayName; itemKind = "mailbox password"; };
|
||||||
|
mailboxPasswordFile = mkPasswordFileOption { service = displayName; itemKind = "mailbox password"; };
|
||||||
|
clientIDFile = mkFileOption { description = "the client key."; };
|
||||||
|
accessTokenFile = mkFileOption { description = "the access token."; };
|
||||||
|
refreshTokenFile = mkFileOption { description = "the refresh token."; };
|
||||||
|
saltedKeyPassFile = mkFileOption { description = "the salted key pass."; };
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
config = lib.mkMerge [
|
||||||
|
{ type = "protondrive"; }
|
||||||
|
(mkIfNotNull config.username "username")
|
||||||
|
(mkIfNotNull config.obscuredPassword "password")
|
||||||
|
(mkIfNotNull config.webAuthnToken "2fa")
|
||||||
|
(mkIfNotNull config.mailboxPassword "mailbox_password")
|
||||||
|
(mkIfNotNull config.clientID "client_uid")
|
||||||
|
(mkIfNotNull config.accessToken "client_access_token")
|
||||||
|
(mkIfNotNull config.refreshToken "client_refresh_token")
|
||||||
|
(mkIfNotNull config.saltedKeyPass "client_salted_key_pass")
|
||||||
|
(mkIfNotNull config.enableCaching "enable_caching")
|
||||||
|
];
|
||||||
|
|
||||||
|
secrets = lib.mkMerge [
|
||||||
|
(mkIfNotNull config.obscuredPasswordFile "RCLONE_PROTONDRIVE_PASSWORD")
|
||||||
|
(mkIfNotNull config.webAuthnTokenFile "RCLONE_PROTONDRIVE_2FA")
|
||||||
|
(mkIfNotNull config.mailboxPasswordFile "RCLONE_PROTONDRIVE_MAILBOX_PASSWORD")
|
||||||
|
(mkIfNotNull config.clientIDFile "RCLONE_PROTONDRIVE_CLIENT_UID")
|
||||||
|
(mkIfNotNull config.accessTokenFile "RCLONE_PROTONDRIVE_CLIENT_ACCESS_TOKEN")
|
||||||
|
(mkIfNotNull config.refreshTokenFile "RCLONE_PROTONDRIVE_CLIENT_REFRESH_TOKEN")
|
||||||
|
(mkIfNotNull config.saltedKeyPassFile "RCLONE_PROTONDRIVE_CLIENT_SALTED_KEY_PASS")
|
||||||
|
];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
syncProviders = {
|
syncProviders = {
|
||||||
${manualVendor} = {
|
${manualVendor} = {
|
||||||
displayName = "Custom";
|
displayName = "Custom";
|
||||||
|
@ -198,6 +286,11 @@ let
|
||||||
displayName = owncloudName;
|
displayName = owncloudName;
|
||||||
module = mkOwncloudProvider { };
|
module = mkOwncloudProvider { };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
proton = rec {
|
||||||
|
displayName = "Proton";
|
||||||
|
module = mkProtonProvider { inherit displayName; };
|
||||||
|
};
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
options = {
|
options = {
|
||||||
|
@ -277,7 +370,7 @@ in {
|
||||||
(lib.generators.toINI { } { name = sync.config; });
|
(lib.generators.toINI { } { name = sync.config; });
|
||||||
script = pkgs.writeShellScriptBin serviceName ''
|
script = pkgs.writeShellScriptBin serviceName ''
|
||||||
${sync.secretsScript}
|
${sync.secretsScript}
|
||||||
bash -c echo hello world
|
cat ${configFile}
|
||||||
'';
|
'';
|
||||||
in
|
in
|
||||||
(lib.getExe script);
|
(lib.getExe script);
|
||||||
|
|
Loading…
Reference in a new issue