Skip to content
Open
Show file tree
Hide file tree
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
62 changes: 54 additions & 8 deletions src/AgileConfig.Server.Apisite/Controllers/ConfigController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,21 @@ public class ConfigController : Controller
private readonly IConfigService _configService;
private readonly ITinyEventBus _tinyEventBus;
private readonly IUserService _userService;
private readonly IPermissionService _permissionService;

public ConfigController(
IConfigService configService,
IAppService appService,
IUserService userService,
ITinyEventBus tinyEventBus
ITinyEventBus tinyEventBus,
IPermissionService permissionService
)
{
_configService = configService;
_appService = appService;
_userService = userService;
_tinyEventBus = tinyEventBus;
_permissionService = permissionService;
}

[TypeFilter(typeof(PermissionCheckAttribute), Arguments = new object[] { Functions.Config_Add })]
Expand Down Expand Up @@ -74,6 +77,7 @@ public async Task<IActionResult> Add([FromBody] ConfigVM model, EnvString env)
config.OnlineStatus = OnlineStatus.WaitPublish;
config.EditStatus = EditStatus.Add;
config.Env = env.Value;
config.Sensitive = model.Sensitive;

var result = await _configService.AddAsync(config, env.Value);

Expand Down Expand Up @@ -126,6 +130,7 @@ public async Task<IActionResult> AddRange([FromBody] List<ConfigVM> model, EnvSt
config.OnlineStatus = OnlineStatus.WaitPublish;
config.EditStatus = EditStatus.Add;
config.Env = env.Value;
config.Sensitive = item.Sensitive;

addConfigs.Add(config);
}
Expand Down Expand Up @@ -172,7 +177,8 @@ public async Task<IActionResult> Edit([FromBody] ConfigVM model, [FromQuery] Env
{
Key = config.Key,
Group = config.Group,
Value = config.Value
Value = config.Value,
Sensitive = config.Sensitive
};
if (config.Group != model.Group || config.Key != model.Key)
{
Expand All @@ -192,6 +198,7 @@ public async Task<IActionResult> Edit([FromBody] ConfigVM model, [FromQuery] Env
config.Group = model.Group;
config.UpdateTime = DateTime.Now;
config.Env = env.Value;
config.Sensitive = model.Sensitive;

if (!IsOnlyUpdateDescription(config, oldConfig))
{
Expand Down Expand Up @@ -229,13 +236,33 @@ private bool IsOnlyUpdateDescription(Config newConfig, Config oldConfig)
newConfig.Value == oldConfig.Value;
}

/// <summary>
/// Mask sensitive configuration values with "******" when the current user lacks
/// the Config_ViewSensitive permission.
/// </summary>
private async Task MaskSensitiveConfigs(List<Config> configs)
{
var userId = await this.GetCurrentUserId(_userService);
if (string.IsNullOrEmpty(userId)) return;

var userPermissions = await _permissionService.GetUserPermission(userId);
if (userPermissions.Contains(Functions.Config_ViewSensitive)) return;

foreach (var config in configs)
{
if (config.Sensitive) config.Value = "******";
}
}

[HttpGet]
public async Task<IActionResult> All(string env)
{
ISettingService.IfEnvEmptySetDefault(ref env);

var configs = await _configService.GetAllConfigsAsync(env);

await MaskSensitiveConfigs(configs);

return Json(new
{
success = true,
Expand Down Expand Up @@ -286,6 +313,8 @@ public async Task<IActionResult> Search(string appId, string group, string key,
var page = configs.Skip((current - 1) * pageSize).Take(pageSize).ToList();
var total = configs.Count();

await MaskSensitiveConfigs(page);

return Json(new
{
current,
Expand All @@ -305,6 +334,9 @@ public async Task<IActionResult> Get(string id, EnvString env)

var config = await _configService.GetAsync(id, env.Value);

if (config != null)
await MaskSensitiveConfigs(new List<Config> { config });

return Json(new
{
success = config != null,
Expand Down Expand Up @@ -486,7 +518,10 @@ public IActionResult PreViewJsonFile()
var jsonFile = files.First();
using (var stream = jsonFile.OpenReadStream())
{
var dict = JsonConfigurationFileParser.Parse(stream);
// Try parsing as JSONC first; fall back to standard JSON if no comments found
var parseResult = JsonCConfigurationFileParser.Parse(stream);
var dict = parseResult.values;
var descriptions = parseResult.descriptions;

var addConfigs = new List<Config>();
foreach (var key in dict.Keys)
Expand All @@ -503,7 +538,7 @@ public IActionResult PreViewJsonFile()

var config = new Config();
config.Key = newKey;
config.Description = "";
config.Description = descriptions.TryGetValue(key, out var desc) ? desc : "";
config.Value = dict[key];
config.Group = group;
config.Id = Guid.NewGuid().ToString();
Expand Down Expand Up @@ -531,6 +566,8 @@ public async Task<IActionResult> ExportJson(string appId, EnvString env)

var configs = await _configService.GetByAppIdAsync(appId, env.Value);

await MaskSensitiveConfigs(configs);

var dict = new Dictionary<string, string>();
configs.ForEach(x =>
{
Expand Down Expand Up @@ -685,6 +722,9 @@ public async Task<IActionResult> GetKvList(string appId, EnvString env)
var configs = await _configService.GetByAppIdAsync(appId, env.Value);
// When displaying text format, exclude deleted configurations.
configs = configs.Where(x => x.EditStatus != EditStatus.Deleted).ToList();

await MaskSensitiveConfigs(configs);

var kvList = new List<KeyValuePair<string, string>>();
foreach (var config in configs)
kvList.Add(new KeyValuePair<string, string>(_configService.GenerateKey(config), config.Value));
Expand All @@ -711,14 +751,20 @@ public async Task<IActionResult> GetJson(string appId, EnvString env)
var configs = await _configService.GetByAppIdAsync(appId, env.Value);
// When producing JSON, exclude deleted configurations.
configs = configs.Where(x => x.EditStatus != EditStatus.Deleted).ToList();
var dict = new Dictionary<string, string>();

await MaskSensitiveConfigs(configs);

var values = new Dictionary<string, string>();
var descriptions = new Dictionary<string, string>();
configs.ForEach(x =>
{
var key = _configService.GenerateKey(x);
dict.Add(key, x.Value);
values.Add(key, x.Value);
if (!string.IsNullOrWhiteSpace(x.Description))
descriptions.Add(key, x.Description);
});

var json = DictionaryConvertToJson.ToJson(dict);
var json = DictionaryConvertToJsonC.ToJsonC(values, descriptions);

return Json(new
{
Expand All @@ -738,7 +784,7 @@ public async Task<IActionResult> SaveJson([FromBody] SaveJsonVM data, string app

if (string.IsNullOrEmpty(data.json)) throw new ArgumentNullException("data.json");

var result = await _configService.SaveJsonAsync(data.json, appId, env.Value, data.isPatch);
var result = await _configService.SaveJsonCAsync(data.json, appId, env.Value, data.isPatch);

return Json(new
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ public class ApiConfigVM : IAppIdModel
/// </summary>
public string Description { get; set; }

/// <summary>
/// Whether this configuration item contains sensitive data.
/// </summary>
public bool Sensitive { get; set; }

/// <summary>
/// Application ID.
/// </summary>
Expand Down Expand Up @@ -74,7 +79,8 @@ public static ConfigVM ToConfigVM(this ApiConfigVM model)
Group = model.Group,
Key = model.Key,
Value = model.Value,
Description = model.Description
Description = model.Description,
Sensitive = model.Sensitive
};
}
}
2 changes: 2 additions & 0 deletions src/AgileConfig.Server.Apisite/Models/ConfigVM.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public class ConfigVM : IAppIdModel
[MaxLength(200, ErrorMessage = "描述长度不能超过200位")]
public string Description { get; set; }

public bool Sensitive { get; set; }

public OnlineStatus OnlineStatus { get; set; }
public ConfigStatus Status { get; set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,9 @@ public static ApiConfigVM ToApiConfigVM(this Config config)
Value = config.Value,
Status = config.Status,
OnlineStatus = config.OnlineStatus,
EditStatus = config.EditStatus
EditStatus = config.EditStatus,
Description = config.Description,
Sensitive = config.Sensitive
};

return vm;
Expand Down
Loading