aboutsummaryrefslogtreecommitdiff
path: root/docker/crupest-api/CrupestApi/CrupestApi.Secrets/SecretsService.cs
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-12-06 18:32:21 +0800
committercrupest <crupest@outlook.com>2022-12-20 20:32:52 +0800
commit930269ad13bfd935a8d1c9a3cb90d92900dc1f94 (patch)
tree84ba25cc92cf75e3ac150209c65ad043774144df /docker/crupest-api/CrupestApi/CrupestApi.Secrets/SecretsService.cs
parenta389635f5b6e1c6033e3dec80816370d396c39c8 (diff)
downloadcrupest-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.cs140
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)