예제 #1
0
    private ListRecordsOutput GetRecords(KyprClient client, Shared.Models.InMemory.Vault vault)
    {
        var output = new ListRecordsOutput();

        client.UnlockVault(vault);
        client.UnlockRecordSummaries(vault);

        output.Vault = new()
        {
            Id    = vault.Id !.Value,
            Label = vault.Summary !.Label,
        };

        var records = Deleted
            ? client.ListDeletedRecords(vault)
            : client.ListRecords(vault);

        foreach (var r in records)
        {
            output.Records.Add(new()
            {
                Id    = r.Id !.Value,
                Label = r.Summary !.Label,
            });
        }

        return(output);
    }
예제 #2
0
    public async Task Create_Vaults_List_Vaults()
    {
        var username = "******";
        var password = "******";

        var vaultLabels = Enumerable.Range(1, 10)
                          .Select(_ => "Vault " + Guid.NewGuid())
                          .ToList();

        using var client1 = new KyprClient(_server1);
        await client1.CreateAccountAsync(username + "1", password);

        var acct1   = client1.Account;
        var vaults1 = await Task.WhenAll(vaultLabels.Select(async x => await client1.CreateVaultAsync(x)).ToList());

        using var client2 = new KyprClient(_server1);
        await client2.CreateAccountAsync(username + "2", password);

        var acct2 = client2.Account;

        var vaults2 = await Task.WhenAll(vaultLabels.Select(async x => await client2.CreateVaultAsync(x)).ToList());

        Assert.Equal(vaults1, client1.ListVaults());
        Assert.Equal(vaults2, client2.ListVaults());
    }
예제 #3
0
    public async Task Create_Vault_Unique_Vault_Keys()
    {
        var username    = "******";
        var password    = "******";
        var vaultLabel1 = "Vault #1";
        var vaultLabel2 = "Vault #2";

        using var client1 = new KyprClient(_server1);
        using var client2 = new KyprClient(_server1);

        await client1.CreateAccountAsync(username + "1", password);

        var acct1       = client1.Account;
        var acct1Vault1 = await client1.CreateVaultAsync(vaultLabel1);

        var acct1Vault2 = await client1.CreateVaultAsync(vaultLabel2);

        await client2.CreateAccountAsync(username + "2", password);

        var acct2       = client2.Account;
        var acct2Vault1 = await client1.CreateVaultAsync(vaultLabel1);

        var acct2Vault2 = await client1.CreateVaultAsync(vaultLabel2);

        Assert.NotEqual(
            acct1Vault1 !.SecretKey,
            acct1Vault2 !.SecretKey);

        Assert.NotEqual(
            acct1Vault1 !.SecretKey,
            acct2Vault1 !.SecretKey);
    }
예제 #4
0
    /// <summary>
    /// Resolves a Vault reference to a specific Vault instance, or failing
    /// that, will print an appropriate error message to console and return
    /// <c>null</c>.
    /// </summary>
    public Vault?GetVault(KyprClient client, string vaultRef)
    {
        client.UnlockVaults();

        // First try by Id
        var vaults = client.ListVaults().Where(x =>
                                               x.Id.ToString() !.StartsWith(vaultRef !, StringComparison.OrdinalIgnoreCase));

        if (vaults.Count() == 0)
        {
            // Next try by label
            vaults = client.ListVaults().Where(x =>
                                               x.Summary !.Label !.StartsWith(vaultRef !, StringComparison.OrdinalIgnoreCase));
        }
        if (vaults.Count() == 0)
        {
            _console.WriteError("no Vaults match the specified reference.");
            return(null);
        }
        if (vaults.Count() > 1)
        {
            _console.WriteError("multiple Vaults match the specified reference.");
            return(null);
        }

        return(vaults.Single());
    }
예제 #5
0
    public async Task Create_Records_and_Recover_With_Second_Client()
    {
        var username = "******";
        var password = "******";

        var recordLabels = Enumerable.Range(1, 10)
                           .Select(_ => Guid.NewGuid())
                           .SelectMany(x => Enumerable.Range(1, 5).Select(_ =>
                                                                          x + "-_" + Guid.NewGuid()))
                           .ToList();
        var recordValues = recordLabels.ToDictionary(x => x, x => Guid.NewGuid().ToString());

        using (var client1 = new KyprClient(_server1))
        {
            await client1.CreateAccountAsync(username, password);

            var vault1 = await client1.CreateVaultAsync("vault1");

            foreach (var rl in recordLabels)
            {
                await client1.SaveRecordAsync(vault1, new()
                {
                    Summary = new()
                    {
                        Label    = "Record " + rl,
                        Username = "******" + recordValues[rl],
                    },
                    Content = new()
                    {
                        Password = "******" + recordValues[rl],
                    }
                });
            }
        }

        using var client1a = new KyprClient(_server2);
        await client1a.AuthenticateAccountAsync(username, password);

        await client1a.RefreshVaultsAsync();

        var vault1a = client1a.Vaults.Single();

        client1a.UnlockVault(vault1a);
        client1a.UnlockRecordSummaries(vault1a);

        Assert.Equal("vault1", vault1a.Summary !.Label);

        foreach (var rl in recordLabels)
        {
            var rlParts = rl.Split("_");
            var hits1   = client1a.SearchRecords(vault1a, rlParts[0]);
            var hits2   = client1a.SearchRecords(vault1a, rlParts[1]);

            Assert.Equal(5, hits1.Count());
            Assert.Single(hits2);
        }

        Assert.Equal(vault1a.Records, client1a.SearchRecords(vault1a, "RECORD"));
    }
예제 #6
0
    public async Task Create_and_Lock_and_Unlock_Account()
    {
        var username = "******";
        var password = "******";

        using var client = new KyprClient(_server1);

        await client.CreateAccountAsync(username, password);

        client.LockAccount();

        client.UnlockAccount(password);
    }
예제 #7
0
    public async Task Create_and_Lock_and_Fail_Unlock_Account_With_Bad_Password()
    {
        var username = "******";
        var password = "******";

        using var client = new KyprClient(_server1);

        await client.CreateAccountAsync(username, password);

        client.LockAccount();

        Assert.Throws <CryptographicException>(() =>
                                               client.UnlockAccount("not" + password));
    }
예제 #8
0
    /// <summary>
    /// Resolves a Record reference to a specific Record instance, or failing
    /// that, will print an appropriate error message to console and return
    /// <c>null</c>.
    /// </summary>
    public Record?GetRecord(KyprClient client, ref Vault?vault, string recordRef)
    {
        IEnumerable <Vault>?vaults;

        if (vault != null)
        {
            client.UnlockVault(vault);
            client.UnlockRecordSummaries(vault);
            vaults = new[] { vault };
        }
        else
        {
            client.UnlockVaults();
            vaults = client.ListVaults();
            foreach (var v in vaults)
            {
                client.UnlockRecordSummaries(v);
            }
        }

        var records = vaults
                      .SelectMany(x => x.Records.Select(y => (vault: x, record: y)))
                      .Where(x => x.record.Id.ToString() !.StartsWith(recordRef !, StringComparison.OrdinalIgnoreCase));

        if (records.Count() == 0)
        {
            // Next try by label
            records = vaults
                      .SelectMany(x => x.Records.Select(y => (vault: x, record: y)))
                      .Where(x => x.record.Summary !.Label !.StartsWith(recordRef !, StringComparison.OrdinalIgnoreCase));
        }
        if (records.Count() == 0)
        {
            _console.WriteError("no Records match the specified reference.");
            return(null);
        }
        if (records.Count() > 1)
        {
            _console.WriteError("multiple Records match the specified reference.");
            return(null);
        }

        var match = records.Single();

        vault = match.vault;

        return(match.record);
    }
예제 #9
0
    public async Task Create_and_Search_Records()
    {
        using var server1 = await GetTestServiceClient();

        var username = "******";
        var password = "******";

        var recordLabels = Enumerable.Range(1, 10)
                           .Select(_ => Guid.NewGuid())
                           .SelectMany(x => Enumerable.Range(1, 5).Select(_ =>
                                                                          x + "-_" + Guid.NewGuid()))
                           .ToList();

        using var client = new KyprClient(server1);

        await client.CreateAccountAsync(username, password);

        var vault = await client.CreateVaultAsync("Vault #1");

        foreach (var rl in recordLabels)
        {
            await client.SaveRecordAsync(vault, new()
            {
                Summary = new()
                {
                    Label    = "Record " + rl,
                    Username = Guid.NewGuid().ToString(),
                },
                Content = new()
                {
                    Password = "******",
                }
            });
        }

        foreach (var rl in recordLabels)
        {
            var rlParts = rl.Split("_");
            var hits1   = client.SearchRecords(vault, rlParts[0]);
            var hits2   = client.SearchRecords(vault, rlParts[1]);

            Assert.Equal(5, hits1.Count());
            Assert.Single(hits2);
        }

        Assert.Equal(vault.Records, client.SearchRecords(vault, "RECORD"));
    }
예제 #10
0
    public async Task Create_Account_Unique_Master_Keys()
    {
        var username = "******";
        var password = "******";

        using var client1 = new KyprClient(_server1);
        using var client2 = new KyprClient(_server1);

        await client1.CreateAccountAsync(username + "1", password);

        await client2.CreateAccountAsync(username + "2", password);

        var acct1 = client1.Account;
        var acct2 = client2.Account;

        Assert.NotEqual(
            acct1 !.MasterKey,
            acct2 !.MasterKey);
    }
예제 #11
0
    public async Task Create_Lock_and_Unlock_Vault()
    {
        var username = "******";
        var password = "******";

        using var client = new KyprClient(_server1);

        await client.CreateAccountAsync(username, password);

        var vault = await client.CreateVaultAsync("vault1");

        Assert.NotEmpty(vault.SecretKey);

        client.LockVault(vault);
        Assert.Null(vault.SecretKey);

        client.UnlockVault(vault);
        Assert.NotEmpty(vault.SecretKey);

        client.LockAccount();
        Assert.Null(vault.SecretKey);
    }
예제 #12
0
    public async Task Create_Records_and_Recover_With_Second_Server_and_Session()
    {
        var username = "******";
        var password = "******";

        var recordLabels = Enumerable.Range(1, 10)
                           .Select(_ => Guid.NewGuid())
                           .SelectMany(x => Enumerable.Range(1, 5).Select(_ =>
                                                                          x + "-_" + Guid.NewGuid()))
                           .ToList();
        var recordValues = recordLabels.ToDictionary(x => x, x => Guid.NewGuid().ToString());

        KyprSession?session;
        Account?    account;

        using (var client1 = new KyprClient(_server1))
        {
            await client1.CreateAccountAsync(username, password);

            session = client1.Session;
            account = client1.Account;

            var vault1 = await client1.CreateVaultAsync("vault1");

            foreach (var rl in recordLabels)
            {
                await client1.SaveRecordAsync(vault1, new()
                {
                    Summary = new()
                    {
                        Label    = "Record " + rl,
                        Username = "******" + recordValues[rl],
                    },
                    Content = new()
                    {
                        Password = "******" + recordValues[rl],
                    }
                });
            }
        }

        using var server  = new ServerImpl(_loggerFactory.CreateLogger <ServerImpl>(), _db2, session);
        using var client2 = new KyprClient(server);

        client2.Session = session;
        client2.Account = account;

        // This was automatically locked by
        // client1 when it was disposed
        Assert.True(client2.IsAccountLocked());
        client2.UnlockAccount(password);

        await client2.RefreshVaultsAsync();

        var vault1a = client2.Vaults.Single();

        client2.UnlockVault(vault1a);
        client2.UnlockRecordSummaries(vault1a);

        Assert.Equal("vault1", vault1a.Summary !.Label);

        var records = client2.ListRecords(vault1a).ToArray();

        Assert.Equal(50, records.Length);

        foreach (var rl in recordLabels)
        {
            var rlParts = rl.Split("_");
            var hits1   = client2.SearchRecords(vault1a, rlParts[0]);
            var hits2   = client2.SearchRecords(vault1a, rlParts[1]);

            Assert.Equal(5, hits1.Count());
            Assert.Single(hits2);
        }

        Assert.Equal(vault1a.Records, client2.SearchRecords(vault1a, "RECORD"));
    }
예제 #13
0
    public async Task Create_Lock_and_Unlock_Records()
    {
        var username = "******";
        var password = "******";

        var recordLabels = Enumerable.Range(1, 10)
                           .Select(_ => Guid.NewGuid())
                           .SelectMany(x => Enumerable.Range(1, 5).Select(_ =>
                                                                          x + "-_" + Guid.NewGuid()))
                           .ToList();
        var recordValues = recordLabels.ToDictionary(x => x, x => Guid.NewGuid().ToString());

        using var client = new KyprClient(_server1);

        await client.CreateAccountAsync(username, password);

        var vault = await client.CreateVaultAsync("vault1");

        foreach (var rl in recordLabels)
        {
            await client.SaveRecordAsync(vault, new()
            {
                Summary = new()
                {
                    Label    = "Record " + rl,
                    Username = "******" + recordValues[rl],
                },
                Content = new()
                {
                    Password = "******" + recordValues[rl],
                }
            });
        }

        client.LockAccount();
        // Vault should be locked
        Assert.Null(vault.SecretKey);
        // All records should be locked
        foreach (var r in vault.Records)
        {
            Assert.Null(r.Summary);
            Assert.Null(r.SummarySer);

            Assert.Null(r.Content);
            Assert.Null(r.ContentSer);
        }

        client.UnlockAccount(password);
        client.UnlockVault(vault);
        Assert.NotEmpty(vault.SecretKey);
        client.UnlockRecordSummaries(vault);
        foreach (var r in vault.Records)
        {
            Assert.NotNull(r.Summary);
            Assert.NotEmpty(r.SummarySer);

            Assert.Null(r.Content);
            Assert.Null(r.ContentSer);
        }

        foreach (var r in vault.Records)
        {
            client.UnlockRecord(vault, r);

            Assert.NotNull(r.Summary);
            Assert.NotEmpty(r.SummarySer);

            Assert.NotNull(r.Content);
            Assert.NotEmpty(r.ContentSer);
        }

        foreach (var rl in recordLabels)
        {
            var rlParts = rl.Split("_");
            var hits1   = client.SearchRecords(vault, rlParts[0]);
            var hits2   = client.SearchRecords(vault, rlParts[1]);

            Assert.Equal(5, hits1.Count());
            Assert.Single(hits2);
        }

        Assert.Equal(vault.Records, client.SearchRecords(vault, "RECORD"));
    }
예제 #14
0
    public async Task Create_Vaults_List_Vaults()
    {
        using var server1 = await GetTestServiceClient();

        var username = "******";
        var password = "******";

        var vaultLabels = Enumerable.Range(1, 10)
                          .Select(_ => "Vault " + Guid.NewGuid())
                          .ToList();

        using var client1 = new KyprClient(server1);
        await client1.CreateAccountAsync(username + "1", password);

        var vaults1 = vaultLabels
                      .Select(x => client1.CreateVaultAsync(x).Result)
                      .OrderBy(x => x.Id)
                      .Select(x => JsonSerializer.Serialize(x))
                      .ToList();

        using var client2 = new KyprClient(server1);
        await client2.CreateAccountAsync(username + "2", password);

        var vaults2 = vaultLabels
                      .Select(x => client2.CreateVaultAsync(x).Result)
                      .OrderBy(x => x.Id)
                      .Select(x => JsonSerializer.Serialize(x))
                      .ToList();

        var listedVaults1 = client1.ListVaults()
                            .OrderBy(x => x.Id)
                            .Select(x => JsonSerializer.Serialize(x))
                            .ToList();
        var listedVaults2 = client2.ListVaults()
                            .OrderBy(x => x.Id)
                            .Select(x => JsonSerializer.Serialize(x))
                            .ToList();

        Assert.Equal(vaultLabels.Count, listedVaults1.Count);
        Assert.Equal(vaultLabels.Count, listedVaults2.Count);

        Assert.Equal(vaults1, listedVaults1);
        Assert.Equal(vaults2, listedVaults2);

        using var client3 = new KyprClient(server1);
        await client3.AuthenticateAccountAsync(username + "1", password);

        await client3.RefreshVaultsAsync();

        client3.UnlockVaults();
        var listedVaults3 = client3.ListVaults()
                            .OrderBy(x => x.Id)
                            .Select(x => JsonSerializer.Serialize(x))
                            .ToList();

        _testOut.WriteLine(JsonSerializer.Serialize(vaults1));
        _testOut.WriteLine(JsonSerializer.Serialize(listedVaults3));

        Assert.Equal(vaultLabels.Count, listedVaults3.Count);
        Assert.Equal(vaults1, listedVaults3);
    }