using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using backstage.Helpers; using backstage.Models.Keys; using System.Net.Http; using System.Security.Claims; using TokenVault_management.Models; using backstage.Models; using Microsoft.Extensions.Localization; using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Hosting; using System.IO; namespace backstage.Controllers { [Authorize] public class KeyController : Controller { private readonly IConfiguration _config; private readonly ICallApi _callApi; private readonly IHttpContextAccessor _httpContextAccessor; private readonly IStringLocalizer<UserController> _localizer; private readonly string _currentLanguage; // 在您的類別中注入 IWebHostEnvironment 服務 private readonly IWebHostEnvironment _webHostEnvironment; /// <summary> /// 讀取組態用 /// </summary> public KeyController(IConfiguration config, ICallApi callApi, IHttpContextAccessor httpContextAccessor, IStringLocalizer<UserController> localizer, IWebHostEnvironment webHostEnvironment) { _config = config; _callApi = callApi; _httpContextAccessor = httpContextAccessor; _localizer = localizer; var requestCultureFeature = _httpContextAccessor.HttpContext.Features.Get<IRequestCultureFeature>(); var currentCulture = requestCultureFeature.RequestCulture.Culture; _currentLanguage = currentCulture.TwoLetterISOLanguageName; _webHostEnvironment = webHostEnvironment; } [Authorize(Policy = "AdminOnly")] public async Task<IActionResult> ListKeys() { var ListKeysResponse = new ListKeysResponse(); #region key/list 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 { ListKeysResponse = JsonConvert.DeserializeObject<ListKeysResponse>(apiResult.Data.ToString()); if (ListKeysResponse.r == 0) { return View(ListKeysResponse.d); } else { TempData["IsSuccess"] = false; TempData["msg"] = ListKeysResponse.m; return View(); } } catch (Exception e) { TempData["IsSuccess"] = false; TempData["msg"] = e.Message + e.InnerException?.Message; return View(); } } TempData["IsSuccess"] = false; TempData["msg"] = apiResult.Message; return View(); #endregion } /// <summary> /// ajax /// </summary> /// <returns></returns> [Authorize(Policy = "AdminOnly")] [HttpPost] public async Task<ResultModel> CreateKey(string key_name, string key1, string key2) { var result = new ResultModel(); string msg; if (string.IsNullOrEmpty(key_name)) { result.IsSuccess = false; switch (_currentLanguage) { case "en": msg = "Key name is empty."; break; case "zh": msg = "鑰匙名稱不得為空"; break; default: msg = "鑰匙名稱不得為空"; break; } result.Message = msg; return result; } // step1 create key var url = _config["IP"] + "/security/key/generate"; var httpMethod = HttpMethod.Post; var parameters = new Dictionary<string, string> { }; if (!string.IsNullOrEmpty(key1) && !string.IsNullOrEmpty(key1)) { parameters = new Dictionary<string, string> { { "QRData","["+key1+","+key2+"]"} }; } var apiResult = await _callApi.CallAPI(url, parameters, httpMethod); if (apiResult.IsSuccess) { try { var Response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString()); if (Response.r == 0) { // 取得 wwwroot 資料夾的絕對路徑 string wwwrootPath = _webHostEnvironment.WebRootPath; // 確認儲存圖檔的目標資料夾存在,如果不存在則建立它 string imagesFolder = Path.Combine(wwwrootPath, "images"); Directory.CreateDirectory(imagesFolder); List<string> downloadPaths = new List<string>(); for (int i = 0; i < Response.img.Length; i++) { string imageUrl = Response.img[i]; string fileName = $"key_part{i + 1}.png"; string imagePath = Path.Combine(imagesFolder, fileName); using (HttpClient client = new HttpClient()) { // 下載圖檔位元組數據 byte[] imageBytes = await client.GetByteArrayAsync(imageUrl); // 將圖檔寫入目標路徑 System.IO.File.WriteAllBytes(imagePath, imageBytes); // 添加下載路徑到集合中 string downloadPath = Path.Combine("/images", fileName); downloadPaths.Add(downloadPath); } } result.Data = downloadPaths; #region step2 combine key url = _config["IP"] + "/security/key/combine"; parameters = new Dictionary<string, string> { { "name", key_name} }; apiResult = await _callApi.CallAPI(url, parameters, httpMethod); if (apiResult.IsSuccess) { try { Response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString()); if (Response.r == 0) { switch (_currentLanguage) { case "en": msg = "Create key success."; break; case "zh": msg = "新增鑰匙成功"; break; default: msg = "新增鑰匙成功"; break; } result.IsSuccess = true; result.Message = msg; return result; } else { result.IsSuccess = false; result.Message = Response.m.ToString(); return result; } } catch (Exception e) { result.IsSuccess = false; result.Message = e.Message + e.InnerException?.Message; return result; } } else { result.IsSuccess = false; result.Message = apiResult.Message; return result; } #endregion } else { result.IsSuccess = false; result.Message = Response.m.ToString(); return result; } } catch (Exception e) { result.IsSuccess = false; result.Message = e.Message + e.InnerException?.Message; return result; } } else { result.IsSuccess = false; result.Message = apiResult.Message; return result; } } /// <summary> /// ajax /// </summary> /// <returns></returns> [Authorize(Policy = "AdminOnly")] [HttpPost] public async Task<ResultModel> DeleteKey(int keyId) { var result = new ResultModel(); string msg; #region key/list var url = _config["IP"] + "/security/key"; var httpMethod = HttpMethod.Delete; var parameters = new Dictionary<string, string> { { "id",keyId.ToString()}, }; var apiResult = await _callApi.CallAPI(url, parameters, httpMethod); if (apiResult.IsSuccess) { try { var Response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString()); if (Response.r == 0) { switch (_currentLanguage) { case "en": msg = "Delete key success."; break; case "zh": msg = "鑰匙刪除成功"; break; default: msg = "鑰匙刪除成功"; break; } result.IsSuccess = true; result.Message = msg; return result; } else { result.IsSuccess = false; result.Message = Response.m.ToString(); return result; } } catch (Exception e) { result.IsSuccess = false; result.Message = e.Message + e.InnerException?.Message; return result; } } result.IsSuccess = false; result.Message = apiResult.Message; return result; #endregion } /// <summary> /// ajax 編輯鑰匙 /// </summary> /// <returns></returns> [Authorize(Policy = "AdminOnly")] [HttpPost] public async Task<ResultModel> EditKey(int keyId, string name, int active) { 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> { { "id",keyId.ToString()}, { "name",name}, { "active",active.ToString()}, }; var apiResult = await _callApi.CallAPI(url, parameters, httpMethod); if (apiResult.IsSuccess) { try { var Response = JsonConvert.DeserializeObject<Response>(apiResult.Data.ToString()); if (Response.r == 0) { switch (_currentLanguage) { case "en": msg = "Edit key success."; break; case "zh": msg = "編輯鑰匙成功"; break; default: msg = "編輯鑰匙成功"; break; } result.IsSuccess = true; result.Message = msg; return result; } else { result.IsSuccess = false; result.Message = Response.m.ToString(); return result; } } catch (Exception e) { result.IsSuccess = false; result.Message = e.Message + e.InnerException?.Message; return result; } } result.IsSuccess = false; result.Message = apiResult.Message; return result; #endregion } } }