Commit f0911965 authored by nickchen's avatar nickchen 🎨

fix: keyController

parent 316ed58b
......@@ -111,7 +111,9 @@ namespace backstage.Controllers
{
var result = new ResultModel();
string msg;
if (string.IsNullOrEmpty(key_name))
#region name空值檢查
if (string.IsNullOrEmpty(key_name))
{
result.IsSuccess = false;
......@@ -131,16 +133,72 @@ namespace backstage.Controllers
result.Message = msg;
return result;
}
#endregion
#region name重複檢查
var url = _config["IP"] + "/security/key/list";
var httpMethod = HttpMethod.Post;
var parameters = new Dictionary<string, string>
{
// step1 create key
var url = _config["IP"] + "/security/key/generate";
var httpMethod = HttpMethod.Post;
var parameters = new Dictionary<string, string>
};
var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
if (apiResult.IsSuccess)
{
try
{
var response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString());
if (response.r == 0)
{
var keylist = JsonConvert.DeserializeObject<List<Key>>(response.d.ToString());
var keyNameRepeat = keylist.Where(x => x.name == key_name).FirstOrDefault();
if (keyNameRepeat != null)
{
result.IsSuccess = false;
switch (_currentLanguage)
{
case "en":
msg = "key name already exists.";
break;
case "zh":
msg = "鑰匙名稱已存在";
break;
default:
msg = "鑰匙名稱已存在";
break;
}
result.Message = msg;
return result;
}
}
else
{
result.IsSuccess = false;
result.Message = "error.";
return result;
}
}
catch (Exception e)
{
result.IsSuccess = false;
result.Message = "error.";
return result;
}
}
else
{
result.IsSuccess = false;
result.Message = "error.";
return result;
}
#endregion
// step1 create key
url = _config["IP"] + "/security/key/generate";
httpMethod = HttpMethod.Post;
};
if (!string.IsNullOrEmpty(key1) && !string.IsNullOrEmpty(key1))
{
parameters = new Dictionary<string, string>
......@@ -148,7 +206,7 @@ namespace backstage.Controllers
{ "QRData","["+key1+","+key2+"]"}
};
}
var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
if (apiResult.IsSuccess)
{
try
......@@ -156,6 +214,10 @@ namespace backstage.Controllers
var Response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString());
if (Response.r == 0)
{
var keys = Response.QRData;
#region 回傳兩張qrcode(棄用)
/*
// 取得 wwwroot 資料夾的絕對路徑
string wwwrootPath = _webHostEnvironment.WebRootPath;
......@@ -184,10 +246,13 @@ namespace backstage.Controllers
}
}
}
result.Data = downloadPaths;
#region step2 combine key
url = _config["IP"] + "/security/key/combine";
*/
#endregion
#region step2 combine key
url = _config["IP"] + "/security/key/combine";
parameters = new Dictionary<string, string>
{
......@@ -217,10 +282,12 @@ namespace backstage.Controllers
break;
}
result.IsSuccess = true;
result.Message = msg;
result.Data = keys;// 回傳兩把key
return result;
return result;
}
else
{
......@@ -361,17 +428,77 @@ namespace backstage.Controllers
{
var result = new ResultModel();
string msg;
#region key/list
var url = _config["IP"] + "/security/key";
var httpMethod = HttpMethod.Put;
var parameters = new Dictionary<string, string>
#region name重複檢查
var url = _config["IP"] + "/security/key/list";
var httpMethod = HttpMethod.Post;
var parameters = new Dictionary<string, string>
{
};
var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
if (apiResult.IsSuccess)
{
try
{
var response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString());
if (response.r == 0)
{
var keylist = JsonConvert.DeserializeObject<List<Key>>(response.d.ToString());
var keyNameRepeat = keylist.Where(x => x.name == name).FirstOrDefault();
if (keyNameRepeat != null)
{
result.IsSuccess = false;
switch (_currentLanguage)
{
case "en":
msg = "key name already exists.";
break;
case "zh":
msg = "鑰匙名稱已存在";
break;
default:
msg = "鑰匙名稱已存在";
break;
}
result.Message = msg;
return result;
}
}
else
{
result.IsSuccess = false;
result.Message = "error.";
return result;
}
}
catch (Exception e)
{
result.IsSuccess = false;
result.Message = "error.";
return result;
}
}
else
{
result.IsSuccess = false;
result.Message = "error.";
return result;
}
#endregion
#region key/list
url = _config["IP"] + "/security/key";
httpMethod = HttpMethod.Put;
parameters = new Dictionary<string, string>
{
{ "id",keyId.ToString()},
{ "name",name},
{ "active",active.ToString()},
};
var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
if (apiResult.IsSuccess)
{
try
......
......@@ -25,6 +25,7 @@ using System.Dynamic;
using TokenVault_management.Models;
using Microsoft.Extensions.Localization;
using Microsoft.AspNetCore.Localization;
using DocumentFormat.OpenXml.Wordprocessing;
namespace backstage.Controllers
{
......@@ -1881,8 +1882,8 @@ namespace backstage.Controllers
<td>{vault.created}</td>
<td>{enabletext}</td>
<td>
<button class=""btn btnPermission btn-sm permissionBtn"" data-Merchant_id=""{merchantId}"" data-vault_id=""{vault.vault_id}"">{permission}</button>
<button class=""btn btnPermission btn-sm fieldsBtn"" data-Merchant_id=""{merchantId}"" data-vault_id=""{vault.vault_id}"" >{Fields}</button>
<button class=""btn btnPermission btn-sm permissionBtn"" data-merchant_id=""{merchantId}"" data-vault_id=""{vault.vault_id}"">{permission}</button>
<button class=""btn btnPermission btn-sm fieldsBtn"" data-merchant_id=""{merchantId}"" data-vault_id=""{vault.vault_id}"" >{Fields}</button>
</td>
<td>{vault.tokenCount}</td>
......@@ -1890,10 +1891,10 @@ namespace backstage.Controllers
</tr>";
outputHtml += htmlCode;
/*<button class=""btn btnPermission btn-sm backupBtn"" data-toggle=""modal"" data-target=""#backup-modal"" data-Merchant_id=""{merchantId}"" data-vault_id=""{vault.vault_id}"" data-vault_name=""{vault.name}"">{backup}</button>
<button class=""btn btnPermission btn-sm restituteBtn"" data-Merchant_id=""{merchantId}"" data-vault_id=""{vault.vault_id}"" >{restitute}</button>*/
//<button class=""btn btnPermission btn-sm backupBtn"" data-toggle=""modal"" data-target=""#backup-modal"" data-merchant_id=""{merchantId}"" data-vault_id=""{vault.vault_id}"" data-vault_name=""{vault.name}"">{backup}</button>
//<button class=""btn btnPermission btn-sm restituteBtn"" data-merchant_id=""{merchantId}"" data-vault_id=""{vault.vault_id}"" >{restitute}</button>
}
return Content(outputHtml);
return Content(outputHtml);
}
else
......@@ -2332,7 +2333,73 @@ namespace backstage.Controllers
}
}
/// <summary>
/// 備份vault ajax
/// </summary>
/// <param name="vault_id"></param>
/// <param name="merchant_id"></param>
/// <returns></returns>
[Authorize(Policy = "AdminOnly")]
[HttpGet]
public async Task<ResultModel> Backup(int vault_id, int merchant_id)
{
var result = new ResultModel();
// 取得使用者的 "token" Claim 值
string token = User.FindFirstValue("token");
string msg;
var url = _config["IP"] + "/v2/vault/entry/backup";
var httpMethod = HttpMethod.Post;
var parameters = new Dictionary<string, string>
{
{ "vault_id",vault_id.ToString()},
{ "merchant_id",merchant_id.ToString()}
};
var apiResult = await _callApi.CallAPI(url, parameters, httpMethod);
if (apiResult.IsSuccess)
{
try
{
var response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString());
var jsonRe = JsonConvert.SerializeObject(response.d);
var resultData = new
{
fileName = "vault.json",
json = jsonRe
};
result.IsSuccess = true;
result.Message = "Success.";
result.Data = resultData;
return result;
}
catch (Exception e)
{
}
}
var data = new[]
{
new { Id = 1, Name = "John" },
new { Id = 2, Name = "Jane" }
}; // 取得要匯出的資料
var json = JsonConvert.SerializeObject(data); // 將資料序列化為JSON字串
var bytes = Encoding.UTF8.GetBytes(json); // 將JSON字串轉換為位元組陣列
var fileName = "data.json";
//return File(bytes, "application/json", fileName); // 回傳檔案結果
return new ResultModel();
}
}
}
......
......@@ -12,7 +12,8 @@ namespace TokenVault_management.Models
public int count { get; set; }
public Object m { get; set; }
public Object data { get; set; }
public string[] img { get; set; }
public Object d { get; set; }
public string[] QRData { get; set; }
public string flags { get; set; }
public List<string> failInfo { get; set; }
......
......@@ -234,6 +234,9 @@
<data name="Please confirm to delete key." xml:space="preserve">
<value>請確認刪除鑰匙</value>
</data>
<data name="Please keep key1 and key2 safe." xml:space="preserve">
<value>請妥善保存鑰匙1和鑰匙2。</value>
</data>
<data name="Please save the QR code properly." xml:space="preserve">
<value>請妥善儲存QR code</value>
</data>
......
......@@ -336,10 +336,26 @@
<div class="modal-body">
<div class="row">
<div class="col-12 text-center">
<p class="qr-code-message">@Localizer["Please save the QR code properly."]</p>
<p class="qr-code-message">@Localizer["Please keep key1 and key2 safe."]</p>
<p class="text-danger qr-code-message">※@Localizer["Avoid being unable to restore the key after deletion"]!</p>
</div>
</div>
<div class="input-group my-3">
<input type="text" class="form-control" id="key1Copy" readonly>
<div class="input-group-append">
<button class="btn btn-outline-secondary copy-input" type="button">@Localizer["Copy"]</button>
</div>
</div>
<div class="input-group my-3">
<input type="text" class="form-control" id="key2Copy" readonly>
<div class="input-group-append">
<button class="btn btn-outline-secondary copy-input" type="button">@Localizer["Copy"]</button>
</div>
</div>
<!-- qrcode 圖片下載
<div class="row">
<div class="col-6">
<img id="image1" src="" alt="圖片">
......@@ -356,9 +372,9 @@
<a id="downloadBtn2" class="btn btn-primary" href="#" download>下載Key_part2</a>
</div>
</div>
-->
</div>
<div class="SubmitBlock SubmitBlock_sm text-center">
<div class="SubmitBlock SubmitBlock_sm text-center my-3">
<button type="button" class="btn btn-mainblue-hollow" data-dismiss="modal">@Localizer["Close"]</button>
</div>
</div>
......@@ -447,7 +463,17 @@
console.log('response=' + JSON.stringify( response));
showAlert(response.isSuccess, response.message)
if (response.isSuccess) {
$('#newApp').modal('hide');
let key1 = response.data[0];
let key2 = response.data[1];
console.log(key1);
console.log(key2);
$('#key1Copy').val(key1)
$('#key2Copy').val(key2);
$('#imageModal').modal({ backdrop: 'static', keyboard: false });
/*$('#newApp').modal('hide');
var imageUrl = response.data.toString();
console.log('imageUrl=' + imageUrl);
// 使用 split 方法拆分 URL 字串
......@@ -458,7 +484,7 @@
$('#image2').attr('src', imageUrls[1]);
$('#downloadBtn1').attr('href', imageUrls[0]);
$('#downloadBtn2').attr('href', imageUrls[1]);
$('#imageModal').modal({ backdrop: 'static', keyboard: false });
$('#imageModal').modal({ backdrop: 'static', keyboard: false });*/
//setTimeout(function () {
// location.reload();
......@@ -472,6 +498,13 @@
});
});
//copy 按鈕
$('.copy-input').on('click', function () {
var input = $(this).parent().prev('input'); // 使用 parent() 獲取父層,prev() 獲取前一個元素
input.select();
document.execCommand('copy');
});
$('#import_key_btn').on('click', function (e) {
document.getElementById("recoverKeyForm").classList.toggle("show");
......
......@@ -124,7 +124,7 @@
<p class="modal-body-title">下載備份檔到本機</p>
<p>下載備份檔到本機</p>
<div class="SubmitBlock SubmitBlock_sm">
<button type="button" id="backupConfirm" class="btn btn-mainblue-solid" style=""> @Localizer["Confirm"]</button>
<button type="button" id="backupConfirm" class="btn btn-mainblue-solid" data-dismiss="modal" style=""> @Localizer["Confirm"]</button>
<button type="button" class="btn btn-mainblue-hollow" data-dismiss="modal" style=""> @Localizer["Cancel"]</button>
</div>
</form>
......@@ -247,17 +247,34 @@
$('#backup-modal').on('show.bs.modal', function (e) {
//show.bs.modal = BS內建,觸發時執行
let btn = $(e.relatedTarget);//抓取觸發按鈕的資料
let mId = btn.data('Merchant_id');
let mId = btn.data('merchant_id');
let vId = btn.data('vault_id');
let vName = btn.data('vault_name');
let modal = $(this);//要修改的modal就是現在開啟的這個modal
modal.find('.modal-body-title').text(vId + "_" + vName);
modal.find('#backupConfirm').data('Merchant_id', mId);
modal.find('#backupConfirm').data('merchant_id', mId);
modal.find('#backupConfirm').data('vault_id', vId);
});
$('#backupConfirm').on('click', function () {
console.log("backupConfirm");
let mId = $(this).data('merchant_id');
let vId = $(this).data('vault_id');
$.ajax({
url: '/TokenVault/Backup', // 替換為適當的控制器方法路徑
type: 'GET', // 或 'GET',根據實際需求
data: {
merchant_id: mId,
vault_id: vId
},
success: function (response) {
downloadJsonFile(response.data.json, response.data.fileName);
},
error: function (xhr, status, error) {
// 在發生錯誤時的處理邏輯
console.error(error);
}
});
});
......@@ -269,7 +286,15 @@
window.location.href = '/tokenvault/Permission/' + "?vault_id=" + vaultid + "&merchant_id=" + merchantid;
});
function downloadJsonFile(jsonStr, fileName) {
const blob = new Blob([jsonStr], { type: 'application/json' }); // 建立 Blob 物件
const url = URL.createObjectURL(blob); // 建立 Blob URL
const link = document.createElement('a'); // 建立 <a> 元素
link.href = url;
link.download = fileName; // 設定下載檔案的名稱
link.click();
URL.revokeObjectURL(url); // 釋放 Blob URL
}
})
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment