ntminer %!s(int64=5) %!d(string=hai) anos
pai
achega
4a58da039d

+ 2 - 2
src/AppModels/MinerStudio/Vms/MinerClientViewModel.cs

@@ -601,11 +601,11 @@ namespace NTMiner.MinerStudio.Vms {
                 if (string.IsNullOrEmpty(_data.WindowsPassword)) {
                     return string.Empty;
                 }
-                return HashUtil.EncDecInOne(_data.WindowsPassword);
+                return HashUtil.TextDecrypt(Convert.FromBase64String(_data.WindowsPassword), RpcRoot.RpcUser.Password);
             }
             set {
                 if (!string.IsNullOrEmpty(value)) {
-                    value = HashUtil.EncDecInOne(value);
+                    value = Convert.ToBase64String(HashUtil.TextEncrypt(value, RpcRoot.RpcUser.Password));
                 }
                 if (_data.WindowsPassword != value) {
                     var old = _data.WindowsPassword;

+ 17 - 6
src/NTMinerDataSchemas/HashUtil.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Security.Cryptography;
+using System.Text;
 
 namespace NTMiner {
     public static class HashUtil {
@@ -22,15 +23,25 @@ namespace NTMiner {
             return Sha1(System.Text.Encoding.UTF8.GetBytes(text));
         }
 
-        public static string EncDecInOne(string input) {
-            byte[] key = System.Text.Encoding.UTF8.GetBytes(input.Length.ToString());
-            char[] output = new char[input.Length];
+        public static byte[] TextEncrypt(string content, string secretKey) {
+            byte[] data = Encoding.UTF8.GetBytes(content);
+            byte[] key = Encoding.UTF8.GetBytes(secretKey);
 
-            for (int i = 0; i < input.Length; i++) {
-                output[i] = (char)(input[i] ^ key[i % key.Length]);
+            for (int i = 0; i < data.Length; i++) {
+                data[i] ^= key[i % key.Length];
             }
 
-            return new string(output);
+            return data;
+        }
+
+        public static string TextDecrypt(byte[] data, string secretKey) {
+            byte[] key = Encoding.UTF8.GetBytes(secretKey);
+
+            for (int i = 0; i < data.Length; i++) {
+                data[i] ^= key[i % key.Length];
+            }
+
+            return Encoding.UTF8.GetString(data, 0, data.Length);
         }
     }
 }

+ 2 - 1
src/NTMinerlib/Serialization/NTJsonSerializer.cs

@@ -4,7 +4,8 @@ namespace NTMiner.Serialization {
     public class NTJsonSerializer : INTSerializer {
         public static readonly JsonSerializerSettings SerializerSettings = new JsonSerializerSettings() {
             MissingMemberHandling = MissingMemberHandling.Ignore,// 默认值也是Ignore,复述一遍起文档作用
-            NullValueHandling = NullValueHandling.Ignore
+            NullValueHandling = NullValueHandling.Ignore,
+            StringEscapeHandling = StringEscapeHandling.EscapeNonAscii
         };
 
         public NTJsonSerializer() {

+ 10 - 13
src/UnitTests/UnitTest1.cs

@@ -131,6 +131,16 @@ namespace NTMiner {
             Assert.AreEqual("-", s);
         }
 
+        [TestMethod]
+        public void EncDecTest() {
+            for (int i = 0; i < 100; i++) {
+                string input = Guid.NewGuid().ToString();
+                string secText = Convert.ToBase64String(HashUtil.TextEncrypt(input, "this is a test"));
+                Console.WriteLine(secText);
+                Assert.AreEqual(input, HashUtil.TextDecrypt(Convert.FromBase64String(secText), "this is a test"));
+            }
+        }
+
         [TestMethod]
         public void Test11() {
             Assert.AreEqual(2 << 16, 0x20000);
@@ -205,19 +215,6 @@ namespace NTMiner {
             Assert.AreEqual("Captcha", RpcRoot.GetControllerName<ICaptchaController<string>>());
         }
 
-        [TestMethod]
-        public void HashUtilTest() {
-            string[] values = new[]
-            {
-                "ntminer", "测试", "helloworld", "s d-,"
-            };
-            foreach (var value in values) {
-                string v1 = HashUtil.EncDecInOne(value);
-                Console.WriteLine(v1);
-                Assert.AreEqual(value, HashUtil.EncDecInOne(v1));
-            }
-        }
-
         [TestMethod]
         public void ObjectJsonSerializerTest() {
             PoolProfileData data = new PoolProfileData {

+ 22 - 0
src/WebApiServer/Controllers/ClientDataController.cs

@@ -33,6 +33,28 @@ namespace NTMiner.Controllers {
         }
         #endregion
 
+        [HttpPost]
+        public string QueryTest([FromBody]QueryClientsRequest query) {
+            if (query == null) {
+                return "参数错误";
+            }
+            try {
+                UserData user = WebApiRoot.UserSet.GetUser(UserId.CreateLoginNameUserId("admin"));
+                var data = WebApiRoot.ClientDataSet.QueryClients(
+                    user,
+                    query,
+                    out int total,
+                    out List<CoinSnapshotData> latestSnapshots,
+                    out int totalOnlineCount,
+                    out int totalMiningCount) ?? new List<ClientData>();
+                return VirtualRoot.JsonSerializer.Serialize(data);
+            }
+            catch (Exception e) {
+                Logger.ErrorDebugLine(e);
+                return e.Message;
+            }
+        }
+
         #region UpdateClient
         [HttpPost]
         public ResponseBase UpdateClient([FromBody]UpdateClientRequest request) {