diff options
author | crupest <crupest@outlook.com> | 2022-12-06 18:32:21 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-12-20 20:32:52 +0800 |
commit | 930269ad13bfd935a8d1c9a3cb90d92900dc1f94 (patch) | |
tree | 84ba25cc92cf75e3ac150209c65ad043774144df /docker/crupest-api/CrupestApi/CrupestApi.Secrets/SecretsService.cs | |
parent | a389635f5b6e1c6033e3dec80816370d396c39c8 (diff) | |
download | crupest-930269ad13bfd935a8d1c9a3cb90d92900dc1f94.tar.gz crupest-930269ad13bfd935a8d1c9a3cb90d92900dc1f94.tar.bz2 crupest-930269ad13bfd935a8d1c9a3cb90d92900dc1f94.zip |
Develop secret api. v14
Diffstat (limited to 'docker/crupest-api/CrupestApi/CrupestApi.Secrets/SecretsService.cs')
-rw-r--r-- | docker/crupest-api/CrupestApi/CrupestApi.Secrets/SecretsService.cs | 140 |
1 files changed, 31 insertions, 109 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Secrets/SecretsService.cs b/docker/crupest-api/CrupestApi/CrupestApi.Secrets/SecretsService.cs index 5cdcc54..23a0e82 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Secrets/SecretsService.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Secrets/SecretsService.cs @@ -3,18 +3,20 @@ using System.Diagnostics; using System.Security.Cryptography; using System.Text; using CrupestApi.Commons; +using CrupestApi.Commons.Crud; using Dapper; using Microsoft.Data.Sqlite; using Microsoft.Extensions.Options; namespace CrupestApi.Secrets; -public class SecretsService : ISecretsService +public class SecretsService : CrudService<SecretInfo>, ISecretsService { private readonly IOptionsSnapshot<CrupestApiConfig> _crupestApiConfig; private readonly ILogger<SecretsService> _logger; - public SecretsService(IOptionsSnapshot<CrupestApiConfig> crupestApiConfig, ILogger<SecretsService> logger) + public SecretsService(IOptionsSnapshot<CrupestApiConfig> crupestApiConfig, ILogger<SecretsService> logger, ServiceProvider services) + : base(services) { _crupestApiConfig = crupestApiConfig; _logger = logger; @@ -25,55 +27,15 @@ public class SecretsService : ISecretsService return Path.Combine(_crupestApiConfig.Value.DataDir, "secrets.db"); } - private async Task<SqliteConnection> EnsureDatabase() + public override string GetDbConnectionString() { - var dataSource = GetDatabasePath(); - var connectionStringBuilder = new SqliteConnectionStringBuilder() - { - DataSource = dataSource - }; - - if (!File.Exists(dataSource)) - { - _logger.LogInformation("Data source {0} does not exist. Create one.", dataSource); - connectionStringBuilder.Mode = SqliteOpenMode.ReadWriteCreate; - var connectionString = connectionStringBuilder.ToString(); - var connection = new SqliteConnection(connectionString); - var transaction = await connection.BeginTransactionAsync(); - - connection.Execute(@" -CREATE TABLE secrets ( - Id INTEGER PRIMARY KEY AUTOINCREMENT, - Key TEXT NOT NULL, - Secret TEXT NOT NULL, - Description TEXT NOT NULL, - ExpireTime TEXT, - Revoked INTEGER NOT NULL, - CreateTime TEXT NOT NULL -); - -CREATE INDEX secrets_key ON secrets (key); - -INSERT INTO secrets (Key, Secret, Description, ExpireTime, Revoked, CreateTime) VALUES (@SecretManagementKey, 'crupest', 'This is the default secret management key.', NULL, 0, @CreateTime); - ", - new - { - SecretManagementKey = SecretsConstants.SecretManagementKey, - CreateTime = DateTime.Now.ToString("O"), - }); - - await transaction.CommitAsync(); + var fileName = GetDatabasePath(); - _logger.LogInformation("{0} created with 'crupest' as the default secret management value. Please immediate revoke it and create a new one.", dataSource); - return connection; - } - else + return new SqliteConnectionStringBuilder() { - _logger.LogInformation("Data source {0} already exists. Will use it."); - connectionStringBuilder.Mode = SqliteOpenMode.ReadWrite; - var connectionString = connectionStringBuilder.ToString(); - return new SqliteConnection(connectionString); - } + DataSource = fileName, + Mode = SqliteOpenMode.ReadWriteCreate + }.ToString(); } private string GenerateRandomKey(int length) @@ -88,83 +50,43 @@ INSERT INTO secrets (Key, Secret, Description, ExpireTime, Revoked, CreateTime) return result.ToString(); } - private async Task<SecretInfo> GetSecretAsync(IDbConnection dbConnection, string secret) + public async Task<SecretInfo> CreateSecretAsync(SecretInfo secretInfo) { - var result = await dbConnection.QueryFirstOrDefaultAsync<SecretInfo>(@" -SELECT Id, Key, Secret, Description, ExpireTime, Revoked, CreateTime FROM secrets WHERE Secret = @Secret; - ", new + if (secretInfo.Secret is not null) { - Secret = secret - }); - - return result; - - } - - public async Task<SecretInfo?> GetSecretAsync(string secret) - { - using var dbConnection = await EnsureDatabase(); - return await GetSecretAsync(dbConnection, secret); - } + throw new ArgumentException("Secret is auto generated. Don't specify it explicit.") + } - public async Task<SecretInfo> CreateSecretAsync(string key, string description, DateTime? expireTime = null) - { - var dbConnection = await EnsureDatabase(); + secretInfo.Secret = GenerateRandomKey(16); + secretInfo.CreateTime = DateTime.Now; - var secret = GenerateRandomKey(16); - var now = DateTime.Now; + await InsertAsync(_table.GenerateInsertClauseFromObject(secretInfo)); - dbConnection.Execute(@" -INSERT INTO secrets (Key, Secret, Description, ExpireTime, Revoked, CreateTime) VALUES (@Key, @Secret, @Description, @ExpireTime, 0, @CreateTime); - ", - new - { - Key = key, - Secret = secret, - Description = description, - ExpireTime = expireTime?.ToString("O"), - CreateTime = now.ToString("O"), - }); - - return new SecretInfo(key, secret, description, expireTime, false, now); + return secretInfo; } public async Task<List<SecretInfo>> GetSecretListAsync(bool includeExpired = false, bool includeRevoked = false) { - var dbConnection = await EnsureDatabase(); - - var query = await dbConnection.QueryAsync<SecretInfo>(@" -SELECT Key, Secret, Description, ExpireTime, Revoked, CreateTime FROM secrets -WHERE @IncludeExpired OR ExpireTime IS NULL OR ExpireTime > @Now AND - @IncludeRevoked OR Revoked = 0; - ", new - { - IncludeExpired = includeExpired, - IncludeRevoked = includeRevoked, - Now = DateTime.Now.ToString("O"), - }); - - return query.ToList(); + return (await QueryAsync()).ToList(); } public async Task<List<SecretInfo>> GetSecretListByKeyAsync(string key, bool includeExpired = false, bool includeRevoked = false) { - var dbConnection = await EnsureDatabase(); + WhereClause where = WhereClause.Create(); - var query = await dbConnection.QueryAsync<SecretInfo>(@" -SELECT Key, Secret, Description, ExpireTime, Revoked, CreateTime FROM secrets -WHERE Key = @Key AND -(@IncludeExpired OR ExpireTime IS NULL OR ExpireTime > @Now) AND -(@IncludeRevoked OR Revoked = 0); - ", new + where.Eq(nameof(SecretInfo.Key), key); + + if (!includeExpired) { - Key = key, - IncludeExpired = includeExpired, - IncludeRevoked = includeRevoked, - Now = DateTime.Now.ToString("O"), - }); + where.Add(nameof(SecretInfo.ExpireTime), "<=", ) + } + + if (!includeRevoked) + { + where.Eq(nameof(SecretInfo.Revoked), false); + } - return query.ToList(); + return (await QueryAsync(where)).ToList(); } public async Task<SecretInfo> ModifySecretAsync(string secret, SecretModifyRequest modifyRequest) |