using System.Reflection.Metadata; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Collections; using System.Reflection; using UMC.Web; using UMC.Data.Entities; using UMC.Web.UI; using UMC.ITME.Entities; using UMC.Net; using UMC.Data; namespace UMC.ITME.Activities { /// /// 邮箱账户 /// [UMC.Web.Apiumc("Proxy", "Setup", Auth = WebAuthType.Admin)] class SiteSetupActivity : WebActivity { public override void ProcessActivity(WebRequest request, WebResponse response) { var ConfKey = this.AsyncDialog("ConfKey", r => { return new Web.UISheetDialog() { Title = "新发布类型" } .Put("Web应用", "Proxy").Put("文件应用", "File"); }); if (ConfKey.StartsWith("https://") || ConfKey.StartsWith("http://")) { var url = new Uri(ConfKey); request.Arguments.Put("Domain", new Uri(url, "/").AbsoluteUri); ConfKey = url.LocalPath.Trim('/'); if (String.IsNullOrEmpty(ConfKey)) { ConfKey = "Proxy"; } else if (ConfKey == "UMC") { var str = new Uri(url, "/UMC.Conf").WebRequest().Put(new WebMeta().Put("domain", $"{Web.WebResource.Instance().WebDomain()}")).ReadAsString(); var data = JSON.Deserialize(str); if (data?.ContainsKey("appConf") == true) { var appConf = data["appConf"] as Hashtable; if (appConf.ContainsKey("IconSrc")) { this.Context.Request.Arguments.Put("IconSrc", data["IconSrc"]); } if (appConf.ContainsKey("Open")) { this.Context.Request.Arguments.Put("Open", data["Open"]); } if (appConf.ContainsKey("Menu")) { this.Context.Request.Arguments.Put("Menu", JSON.Serialize(data["Menu"])); } if (appConf.ContainsKey("Home")) { this.Context.Request.Arguments.Put("Home", data["Home"]); } if (appConf.ContainsKey("Mobile")) { this.Context.Request.Arguments.Put("Mobile", data["Mobile"]); } if (appConf.ContainsKey("Caption")) { this.Context.Request.Arguments.Put("Caption", data["Caption"]); } } } } var appId = WebResource.Instance().Provider["appId"]; var secret = UMC.Data.WebResource.Instance().Provider["appSecret"]; var config = this.AsyncDialog("Settings", g => { var from = new Web.UIFormDialog() { Title = "发布新应用" }; var sDomain = this.AsyncDialog("Domain", "none"); var Caption = this.Context.Request.Arguments["Caption"]; this.Context.Request.Arguments.Remove("Caption"); switch (ConfKey) { case "UMC": case "Proxy": case "Bridge": if (String.Equals(sDomain, "none")) { from.AddText("应用网址", "Domain", String.Empty); this.Context.Request.Arguments.Remove("Domain"); } else { from.AddTextValue().Put("应用网址", sDomain); } from.AddText("发布标识", "Root", String.Empty).PlaceHolder("[a-z0-9]全小写字符").Put("tip", "");// $"将以[标识]为前缀合成域名来访问"); from.AddText("发布名称", "Caption", Caption); break; case "File": this.Context.Request.Arguments.Remove("Domain"); from.Title = "发布文件应用"; from.AddOption("所在目录", "Domain", String.Empty, String.Empty).Command("System", "Dir", new WebMeta().Put("type", "Dir")); from.AddText("发布标识", "Root", String.Empty).PlaceHolder("[a-z0-9]全小写字符").Put("tip", "");//$"将以[标识]为前缀合成域名来访问"); from.AddText("发布名称", "Caption", Caption); from.AddCheckBox("", "AuthConf", "none").Put("支持目录浏览", "*", true); break; case "Developer": if (String.IsNullOrEmpty(secret)) { this.Context.Response.Redirect("System", "License", new UIConfirmDialog("当前版本未登记注册") { DefaultValue = "Select" }); } from.Title = "开发者发布"; from.Add(UICell.Create("QRCode", new WebMeta().Put("value", $"https://api.apiumc.com/UMC/Platform/EditCert/{appId}"))); from.AddConfirm("请开发者用ITME App扫一扫,生成开发者证书,再点击下一步", "Settings", "YES"); from.Submit("下一步", $"{request.Model}.{request.Command}"); return from; default: if (String.IsNullOrEmpty(secret)) { this.Context.Response.Redirect("System", "License", new UIConfirmDialog("当前版本未登记注册") { DefaultValue = "Select" }); } var webr2 = new Uri(APIProxy.Uri, "Transfer").WebRequest(); UMC.ITME.Utility.Sign(webr2, secret); var data = JSON.Deserialize(webr2.Post(new WebMeta().Put("type", "Market", "ProductCode", ConfKey)).ReadAsString()); if (data == null) { this.Prompt("网络异常"); } if (data.ContainsKey("success")) { from.Title = "发布市场应用"; if (data.ContainsKey("Domain")) { sDomain = data["Domain"] as string; this.Context.Request.Arguments.Put("Domain", sDomain); from.AddTextValue().Put("服务网址", sDomain); } else if (String.Equals(sDomain, "none")) { from.AddText("应用网址", "Domain", String.Empty); this.Context.Request.Arguments.Remove("Domain"); } else { from.AddTextValue().Put("应用网址", sDomain); } if (data.ContainsKey("IconSrc")) { this.Context.Request.Arguments.Put("IconSrc", data["IconSrc"]); } from.AddText("发布标识", "Root", String.Empty).PlaceHolder("[a-z0-9]全小写字符").Put("tip", "");//$"将以[标识]为前缀合成域名来访问"); from.AddText("发布名称", "Caption", data["Caption"] as string); from.AddRadio("服务条款", "Price", new ListItemCollection().Put(String.Format("{0}", data["Price"]), "1")); from.Submit("确认发布", "Site.Config"); from.Add(UICell.UI('\uf085', "开发者", data["Seller"] as string)); from.Add(UICell.UI('\ue94d', "服务电话", data["Tel"] as string, UIClick.Tel(data["Tel"] as string))); return from; } else { this.Prompt((data["msg"] as string) ?? "参数不正确"); } break; } from.Submit("确认发布", "Site.Config"); return from; }); if (ConfKey == "Developer") { var content = new Uri($"https://wdk.oss-accelerate.aliyuncs.com/TEMP/EditCert/{appId}.lic").WebRequest().Get().ReadAsString(); if (String.IsNullOrEmpty(content)) { this.Prompt("获取证书失败"); } var s = content.IndexOf(":"); if (s == -1) { this.Prompt("获取证书失败"); } var Seller = content.Substring(0, s); if (License.GetLicense(Seller).ExpireTime > 0 || License.Put(Seller, content.Substring(s + 1))) { this.Context.Send(false); response.Redirect(request.Model, request.Command, Seller); this.Prompt("证书导入成功"); } else { this.Prompt("获取导入失败,请确认证书是否一致"); } } var site = new Site { Root = config["Root"].ToLower() }; if (System.Text.RegularExpressions.Regex.IsMatch(site.Root, "^[a-z0-9]+$") == false) { this.Prompt("应用标识只支持【a-z0-9】字符"); } site.Caption = config["Caption"]; try { var Domain = config["Domain"]; if (String.IsNullOrEmpty(Domain)) { this.Prompt("请输入正确的网址"); } switch (Domain.Substring(0, Domain.IndexOf("://"))) { case "http": case "https": if (Domain.Contains("*.")) { var l = Domain.IndexOf('/', 8); if (l == -1) { site.Domain = Domain + "/"; } else { site.Domain = Domain.Substring(0, l + 1); } } else { site.Domain = new Uri(new Uri(Domain), "/").AbsoluteUri; } break; case "file": site.Domain = Domain.TrimEnd('/'); if (config["AuthConf"].Contains("*")) { site.Domain += "/"; } break; case "unix": site.Domain = Domain; break; default: this.Prompt("网址格式不支持"); break; } } catch { this.Prompt("网址格式不支持"); } if (config.ContainsKey("Home")) { site.Home = config["Home"]; } if (config.ContainsKey("Mobile")) { site.MobileHome = config["Mobile"]; } if (config.ContainsKey("Open")) { switch (config["Open"].ToLower()) { default: case "new": site.OpenModel = 0; break; case "win": site.OpenModel = 1; break; case "mac": site.OpenModel = 2; break; case "link": site.OpenModel = 3; break; } } if (config.ContainsKey("Menu")) { var lis = new List(); var meus = JSON.Deserialize(config["Open"]); var tid = Utility.TimeSpan(); if (meus is IDictionary) { var l = new Menu(); Reflection.SetProperty(l, meus as IDictionary); if (l.Id.HasValue) { l.Id = tid + 1; } l.Site = 0; lis.Add(l); } else if (meus is Array) { var ms = meus as Array; foreach (var o in ms) { if (o is IDictionary) { var l = new Menu(); Reflection.SetProperty(l, o as IDictionary); if (l.Id.HasValue) { l.Id = tid + 1; } l.Site = 0; lis.Add(l); } } } Data.DataFactory.Instance().Put(lis.ToArray()); } site.SiteKey = UMC.Data.Utility.IntParse(UMC.Data.Utility.Guid(site.Root, true).Value); site.IsDesktop = true; var oldSite = DataFactory.Instance().Site(site.Root); if (oldSite != null) { if (oldSite.Flag < 0) { this.AsyncDialog("Confirm", g => new Web.UIConfirmDialog("此标识存在于移除的应用中,是否恢复此应用来从新设置") { Title = "应用提示" }); DataFactory.Instance().Put(new Site { Root = site.Root, Flag = 0 }); this.Context.Send("Site.Config", false); this.Context.Response.Redirect(this.Context.Request.Model, this.Context.Request.Command, site.Root); } else { switch (ConfKey) { case "UMC": case "Bridge": case "File": case "Proxy": this.Prompt("此应用标识已注册"); break; default: this.AsyncDialog("Confirm", g => new Web.UIConfirmDialog($"确认在{oldSite.Caption}安装此应用配置,将有覆盖现有配置") { Title = "应用提示" }); break; } } } switch (ConfKey) { case "Proxy": site.AuthConf = "*"; site.AuthType = WebAuthType.All; break; case "File": site.AuthType = WebAuthType.All; break; case "UMC": site.AuthConf = "#"; site.UserModel = UserModel.Bridge; site.AuthType = WebAuthType.Guest; break; case "Bridge": site.AuthConf = ""; site.UserModel = UserModel.Bridge; site.AuthType = WebAuthType.Guest; break; default: var json = UMC.ITME.Utility.Sign(new Uri(APIProxy.Uri, "Transfer").WebRequest(), secret).Post(new WebMeta().Put("type", "Market", "ConfKey", ConfKey, "Root", site.Root)).ReadAsString(); var data = JSON.Deserialize(json); if (data.ContainsKey("success")) { if (data.ContainsKey("Domain")) { site.Domain = data["Domain"] as String; } site.MarketKey = data["MarketKey"] as string; if (data.ContainsKey("appConf")) { var appConf = data["appConf"] as Hashtable; appConf.Remove("Root"); appConf.Remove("Domain"); appConf.Remove("Caption"); UMC.Data.Reflection.SetProperty(site, appConf); var appendJSConf = appConf["appendJsConf"] as Hashtable; if (appendJSConf != null) { var em = appendJSConf.GetEnumerator(); var jsConf = new System.Text.StringBuilder(); while (em.MoveNext()) { jsConf.Append(em.Key); jsConf.AppendLine(); Config pconfig = new Config(); var md5Key = SiteActivity.MD5(em.Key as string); pconfig.ConfKey = String.Format("SITE_JS_CONFIG_{0}{1}", site.Root, md5Key).ToUpper(); pconfig.ConfValue = em.Value as string; UMC.Data.DataFactory.Instance().Put(pconfig); } site.AppendJSConf = jsConf.ToString(); } var configImage = appConf["confImage"] as Hashtable; if (configImage != null) { var em = configImage.GetEnumerator(); var jsConf = new System.Text.StringBuilder(); while (em.MoveNext()) { jsConf.Append(em.Key); jsConf.AppendLine(); Config pconfig = new Config(); var md5Key = SiteActivity.MD5(em.Key as string); pconfig.ConfKey = String.Format("SITE_IMAGE_CONFIG_{0}{1}", site.Root, md5Key).ToUpper(); pconfig.ConfValue = JSON.Serialize(em.Value); UMC.Data.DataFactory.Instance().Put(pconfig); } site.ImagesConf = jsConf.ToString(); } if (appConf.ContainsKey("loginHtml")) { Config pconfig = new Config { ConfKey = $"SITE_MIME_{site.Root}_LOGIN_HTML".ToUpper(), ConfValue = appConf["loginHtml"] as string }; UMC.Data.DataFactory.Instance().Put(pconfig); } if (appConf.ContainsKey("login")) { CopyMime(appConf["login"] as Hashtable, $"SITE_MIME_{site.Root}_LOGIN".ToUpper()); } if (appConf.ContainsKey("check")) { CopyMime(appConf["check"] as Hashtable, $"SITE_MIME_{site.Root}_CHECK".ToUpper()); } if (appConf.ContainsKey("update")) { CopyMime(appConf["update"] as Hashtable, $"SITE_MIME_{site.Root}_UPDATE".ToUpper()); } } site.Flag = 2; if (data.ContainsKey("sign")) { License.Put(site.MarketKey, data["sign"] as string); } } else { this.Prompt("提示", data["msg"] as string ?? "导入配置错误"); } break; } if (config.ContainsKey("IconSrc")) { UMC.Data.WebResource.Instance().Transfer(new Uri(config["IconSrc"] as string), $"images/{site.Root}/1/0.png"); } else { String webrkey = String.Format("images/{0}/{1}/{2}.png", site.Root, 1, 0); using (System.IO.Stream stream = typeof(WebServlet).Assembly//UMC.Proxy .GetManifestResourceStream("UMC.ITME.Resources.app.png")) { UMC.Data.WebResource.Instance().Transfer(stream, webrkey); } } Save(site); } void Save(Site site) { site.AppSecret = Utility.Guid(Guid.NewGuid()); DataFactory.Instance().Put(site); this.Prompt("发布应用成功", false); this.Context.Send("Site.Config", false); if (site.UserModel == UserModel.Bridge && String.Equals(site.AuthConf, "#")) { new Uri(new Uri(site.Domain), "/UMC.Conf").WebRequest().Put(new WebMeta().Put("authSecret", site.AppSecret).Put("domain", $"{Web.WebResource.Instance().WebDomain()}"), r => { });// this.Context.Response.Redirect(this.Context.Request.Model, "UMC", site.Root); } else { this.Context.Response.Redirect(this.Context.Request.Model, "Site", site.Root); } } void CopyMime(Hashtable config, String key) { var array = config["Feilds"] as Hashtable; var fConfig = new Hashtable(); if (array != null) { var em = array.GetEnumerator(); while (em.MoveNext()) { var fConf = em.Value as Hashtable; fConfig[em.Key] = fConf["Caption"]; fConf.Remove("Caption"); if (fConf.Count > 0) { var fconfig2 = new Config(); fconfig2.ConfKey = $"{key}_{em.Key}".ToUpper(); fconfig2.ConfValue = JSON.Serialize(fConf); UMC.Data.DataFactory.Instance().Put(fconfig2); } } config["Feilds"] = fConfig; } var fconfig = new Config(); fconfig.ConfKey = key.ToUpper(); fconfig.ConfValue = JSON.Serialize(config); UMC.Data.DataFactory.Instance().Put(fconfig); } } }