Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
T
TokenVaultManagement
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
jasonwai
TokenVaultManagement
Commits
f0911965
Commit
f0911965
authored
Jul 05, 2023
by
nickchen
🎨
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: keyController
parent
316ed58b
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
289 additions
and
33 deletions
+289
-33
KeyController.cs
...n Vault Management/backstage/Controllers/KeyController.cs
+144
-17
TokenVaultController .cs
...Management/backstage/Controllers/TokenVaultController .cs
+73
-6
Response.cs
Merchant Token Vault Management/backstage/Models/Response.cs
+2
-1
ListKeys.zh.resx
...Management/backstage/Resources/Views/Key/ListKeys.zh.resx
+3
-0
ListKeys.cshtml
...oken Vault Management/backstage/Views/Key/ListKeys.cshtml
+37
-4
List.cshtml
...n Vault Management/backstage/Views/TokenVault/List.cshtml
+30
-5
No files found.
Merchant Token Vault Management/backstage/Controllers/KeyController.cs
View file @
f0911965
...
...
@@ -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
...
...
Merchant Token Vault Management/backstage/Controllers/TokenVaultController .cs
View file @
f0911965
...
...
@@ -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
-
M
erchant_id
=
""
{
merchantId
}
""
data
-
vault_id
=
""
{
vault
.
vault_id
}
""
>{
permission
}</
button
>
<
button
class
=""
btn
btnPermission
btn
-
sm
fieldsBtn
""
data
-
M
erchant_id
=
""
{
merchantId
}
""
data
-
vault_id
=
""
{
vault
.
vault_id
}
""
>{
Fields
}</
button
>
<
button
class
=""
btn
btnPermission
btn
-
sm
permissionBtn
""
data
-
m
erchant_id
=
""
{
merchantId
}
""
data
-
vault_id
=
""
{
vault
.
vault_id
}
""
>{
permission
}</
button
>
<
button
class
=""
btn
btnPermission
btn
-
sm
fieldsBtn
""
data
-
m
erchant_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-M
erchant_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-m
erchant_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
();
}
}
}
...
...
Merchant Token Vault Management/backstage/Models/Response.cs
View file @
f0911965
...
...
@@ -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
;
}
...
...
Merchant Token Vault Management/backstage/Resources/Views/Key/ListKeys.zh.resx
View file @
f0911965
...
...
@@ -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>
...
...
Merchant Token Vault Management/backstage/Views/Key/ListKeys.cshtml
View file @
f0911965
...
...
@@ -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");
...
...
Merchant Token Vault Management/backstage/Views/TokenVault/List.cshtml
View file @
f0911965
...
...
@@ -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('
M
erchant_id');
let mId = btn.data('
m
erchant_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('
M
erchant_id', mId);
modal.find('#backupConfirm').data('
m
erchant_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
}
})
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment