using FLY.OBJComponents.Client; using FLY.OBJComponents.IService; using FLY.Thick.Base.Common; using FLY.Thick.Base.IService; using FObjBase; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FLY.Thick.Base.UI { public class PasswordAuthorize:INotifyPropertyChanged { const string JSONDIST_KEY = "password"; /// /// 服务器 /// IJsonDistService jsonDist; /// /// 数据库 /// [PropertyChanged.DoNotCheckEquality] public PasswordJsonDb Db { get; private set; } = new PasswordJsonDb(); PasswordJsonDb DbDefault; /// /// 修改时间,这个是服务器保存数据的时间。一切以服务器为准 /// public DateTime Time { get; set; } public PasswordAuthorize(IJsonDistService jsonDist) { this.jsonDist = jsonDist; Load(); if (jsonDist is FObjServiceClient) { var objServiceClient = jsonDist as FObjServiceClient; if (objServiceClient.IsConnected) { //连接成功 fetch_db(); } objServiceClient.PropertyChanged += ObjServiceClient_PropertyChanged; } else { //运行在服务器,之间获取数据 fetch_db(); } jsonDist.ValueChanged += JsonDist_ValueChanged; } private void ObjServiceClient_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(FObjServiceClient.IsConnected)) { var objServiceClient = sender as FObjServiceClient; if (objServiceClient.IsConnected) { //连接成功 fetch_db(); } } } private void JsonDist_ValueChanged(object sender, EventArgs _e) { var e = _e as JsonDistValueChangedEventArgs; if (e.key == JSONDIST_KEY) { fetch_db(); } } void check_db() { if (DbDefault == null) return; if (DbDefault.UiLvs.Count == 0) return; if (Db == null) Db = new PasswordJsonDb(); // 界面权限 foreach (var uiLv in DbDefault.UiLvs) { if (!Db.UiLvs.Any(u => u.UiName == uiLv.UiName)) { Db.UiLvs.Add(new UiLvCell() { UiName = uiLv.UiName, Level = uiLv.Level, Description = uiLv.Description }); } } //密码 if (Db.Pws.Count() == 0) { foreach (var pw in DbDefault.Pws) { Db.Pws.Add(new PasswordCell() { Password = pw.Password, Level=pw.Level, Description = pw.Description }); } } } /// /// 从服务器获取数据 /// void fetch_db() { //连接成功 this.jsonDist.GetValue(JSONDIST_KEY, (asyncContext, retData) => { if (retData == null) { //没有数据 //什么都不做 } else { var distCell = (DistCell)retData; var p = (distCell.Value).ToObject(); if (p == null || p.Pws==null || p.Pws.Count()==0)//异常 { //什么都不做 } else { //只要时间与服务器的不一样,全部覆盖!! if (Time != distCell.Time) { Time = distCell.Time; Db = p; check_db(); Save(); } } } }, this); } /// /// 推送数据到服务器 /// void push_db(PasswordJsonDb db) { this.jsonDist.SetValue(JSONDIST_KEY, JObject.FromObject(db)); } /// /// 输入密码,确认密码权限是否满足要求, level越大,要求权限越大 /// /// 密码 /// 要求级别 /// 输入密码的级别 /// public AUTHORIZE_RESULT Authorize(string pw, int level, out int pw_lv) { return Authorize(pw, level, out pw_lv, out string pw_description); } /// /// 输入密码,确认密码权限是否满足要求, level越大,要求权限越大 /// /// 密码 /// 要求级别 /// 输入密码的级别 /// public AUTHORIZE_RESULT Authorize(string pw, int level, out int pw_lv, out string pw_description) { pw_lv = 0; pw_description = null; if (level <= 0) return AUTHORIZE_RESULT.OK; var v = from p in Db.Pws where p.Password == pw select p; if (v.Count() > 0) { var pwCell = v.First(); pw_lv = pwCell.Level; pw_description = pwCell.Description; if (v.First().Level >= level) return AUTHORIZE_RESULT.OK; else return AUTHORIZE_RESULT.ERR_LEVEL; } return AUTHORIZE_RESULT.ERR_PW; } /// /// 输入密码,确认密码权限是否满足要求, level越大,要求权限越大 /// /// /// 界面名称 /// public AUTHORIZE_RESULT Authorize(string pw, string uiName, out int pw_lv) { return Authorize(pw, GetLv(uiName),out pw_lv); } /// /// 获取授权级别, 0级不需要密码就能通过 /// /// /// public int GetLv(string uiName) { Base.Common.UiLvCell uiLvCell; uiLvCell = Db.UiLvs.Find(c => c.UiName == uiName); if (uiLvCell == null) { uiLvCell = new Base.Common.UiLvCell() { UiName = uiName }; //没有,添加 Db.UiLvs.Add(uiLvCell); } return uiLvCell.Level; } string file_path = "password.json"; string file_default_path = "default/password.default.json"; public event PropertyChangedEventHandler PropertyChanged; public void Apply(PasswordJsonDb db) { //设置jsonDist,不需要设置到本地。 //jsonDist内的参数被修改后,会推送数据出来。到时再获取。 push_db(db); } void Save() { //把密码都转为 byte 的数组。 再保存 PasswordJsonDb db = null; { string json = Newtonsoft.Json.JsonConvert.SerializeObject(Db); db = Newtonsoft.Json.JsonConvert.DeserializeObject(json); }; PasswordEncrypt(db); PasswordJsonDb2 p = new PasswordJsonDb2 { Time = Time, Db = db }; { string json = Newtonsoft.Json.JsonConvert.SerializeObject(p, Newtonsoft.Json.Formatting.Indented); try { File.WriteAllText(file_path, json); } catch { } } } /// /// 密码加密 /// void PasswordEncrypt(PasswordJsonDb db) { foreach (var pw in db.Pws) { string password = pw.Password; if (!string.IsNullOrEmpty(password)) { byte[] bs = System.Text.Encoding.ASCII.GetBytes(password); pw.Password = Newtonsoft.Json.JsonConvert.SerializeObject(bs); } } } /// /// 密码解密 /// void PasswordDecrypt(PasswordJsonDb db) { foreach (var pw in db.Pws) { string password = pw.Password; if (!string.IsNullOrEmpty(password)) { try { byte[] bs = Newtonsoft.Json.JsonConvert.DeserializeObject(password); password = System.Text.Encoding.ASCII.GetString(bs); pw.Password = password; } catch { } } } } void LoadDefault() { if (!File.Exists(file_default_path)) return; string json = File.ReadAllText(file_default_path); try { var db = Newtonsoft.Json.JsonConvert.DeserializeObject(json); //翻译密码 PasswordDecrypt(db); DbDefault = db; } catch { } } void Load() { LoadDefault(); if (!File.Exists(file_path)) { check_db(); return; } string json = File.ReadAllText(file_path); try { var db = Newtonsoft.Json.JsonConvert.DeserializeObject(json); //翻译密码 PasswordDecrypt(db.Db); Db = db.Db; Time = db.Time; check_db(); } catch { } } } /// /// 授权输入返回结果 /// public enum AUTHORIZE_RESULT { /// /// 成功 /// OK, /// /// 不够级别 /// ERR_LEVEL, /// /// 密码出错 /// ERR_PW } public class PasswordJsonDb2 { /// /// 与服务器同步参数 /// public PasswordJsonDb Db; /// /// 修改时间 /// public DateTime Time; } public class PasswordJsonDb { /// /// 界面授权列表 /// public List UiLvs { get; } = new List(); /// /// 密码列表 /// public List Pws { get; } = new List(); } }