You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Gateway/Proxy/SiteAppActivity.cs

560 lines
24 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using UMC.Web;
using UMC.Data.Entities;
using UMC.ITME.Entities;
using System.IO;
using UMC.Data;
namespace UMC.ITME.Activities
{
[Apiumc("ITME", "App", Auth = WebAuthType.User)]
public class SiteAppActivity : UMC.Web.WebActivity
{
public override void ProcessActivity(WebRequest request, WebResponse response)
{
var home = WebServlet.MainDomain;
var union = WebServlet.DomainUnion;// ".";
var Key = this.AsyncDialog("Key", g =>
{
var auth = String.Empty;
var type = this.AsyncDialog("Type", gt =>
{
if (request.UserAgent.Contains("DingTalk"))
{
if (request.UserAgent.Contains("Windows NT") || request.UserAgent.Contains("Mac OS X"))
{
return this.DialogValue("Auth");
}
}
return this.DialogValue("ALL");
});
switch (type)
{
case "Auth":
var seesionKey = Utility.MD5(this.Context.Token.Device.Value);
var sesion = UMC.Data.DataFactory.Instance().Session(this.Context.Token.Device.ToString());
if (sesion != null)
{
sesion.SessionKey = seesionKey;
UMC.Data.DataFactory.Instance().Put(sesion);
}
auth = $"/!/{seesionKey}";
break;
}
var sts = new System.Data.DataTable();
sts.Columns.Add("title");
sts.Columns.Add("root");
sts.Columns.Add("url");
sts.Columns.Add("src");
sts.Columns.Add("target");
sts.Columns.Add("badge");
sts.Columns.Add("desktop", typeof(bool));
sts.Columns.Add("group");
var user = this.Context.Token.Identity();
UMC.Data.Session<UMC.Web.WebMeta> session = new Data.Session<WebMeta>($"{user.Id}_Desktop");
var desktop = session.Value ?? new WebMeta();
if (request.IsMaster)
{
sts.Rows.Add("设置", "Settings", "/Setting/",
"/css/images/icon/prefapp.png", "max", "", true);
sts.Rows.Add("应用管理", "Market", "/Apps",
"/css/images/icon/appmgr.png", "max", "", true);
sts.Rows.Add("发布应用", "Market", "/Apps?Create",
"/css/images/icon/add.png", "max", "", true, "应用管理");
}
sts.Rows.Add("堡垒机", "WebSSH", "/WebSSH",
"/css/images/icon/computer.png", "max", "", request.IsMaster || desktop.ContainsKey("WebSSH"));
var keys = new List<String>();
var sites = DataFactory.Instance().Site().Where(r => r.Flag != -1).Where(r => (r.IsModule ?? false) == false)
.OrderBy((arg) =>
{
if (arg.Version?.Length > 2)
{
return arg.Version.Substring(0, 2);
}
return arg.Caption;
}).ToList();
Utility.Each(sites, r => keys.Add($"Desktop/{r.Root}"));
var auths = UMC.Security.AuthManager.IsAuthorization(user, 0, keys.ToArray());
var webr = UMC.Data.WebResource.Instance();
var ds = sites.ToArray();
for (var i = 0; i < ds.Length; i++)
{
var d = ds[i];
if (auths[i].Item1)
{
var strUrl = $"{request.Url.Scheme}://{d.Root}{union}{home}{auth}/UMC.For/{request.Server}";
var title = d.Caption ?? ""; ;
var badge = "";
var target = "_blank";
switch (d.OpenModel ?? 0)
{
case 1:
target = "normal";
break;
case 2:
target = "max";
break;
}
if ((d.OpenModel ?? 0) == 3)
{
strUrl = new Uri(new Uri(SiteConfig.Config(d.Domain)[0]), d.Home ?? "/").AbsoluteUri;
}
else
{
var authCnf = SiteConfig.Config(d.AuthConf);
if (authCnf.Contains("#") && String.IsNullOrEmpty(d.Home) == false)
{
if (d.Home.StartsWith("/Desktop/"))
{
strUrl = d.Home;
}
else
{
strUrl = $"{request.Url.Scheme}://{d.Root}{union}{home}{d.Home}";
}
}
else if (authCnf.Contains("*") || d.AuthType == WebAuthType.All)
{
strUrl = $"{request.Url.Scheme}://{d.Root}{union}{home}{d.Home}";
}
}
var isDesktop = desktop.ContainsKey(d.Root);
if (d.IsDesktop == true)
{
if (String.Equals("hide", desktop[d.Root]))
{
isDesktop = false;
}
else
{
isDesktop = true;
}
}
var IsAuth = false;
switch (d.AuthType ?? Web.WebAuthType.User)
{
case Web.WebAuthType.Admin:
if (user.IsInRole(UMC.Security.Membership.AdminRole))
{
IsAuth = true;
}
else if (UMC.Data.DataFactory.Instance().Roles(user.Id.Value, d.SiteKey.Value).Contains(UMC.Security.Membership.AdminRole))
{
IsAuth = true;
}
break;
default:
IsAuth = true;
break;
}
if (IsAuth)
{
sts.Rows.Add(title.Trim(), d.Root, strUrl, webr.ImageResolve(request.Url, d.Root, "1", 4, $"_t={d.ModifyTime}"), target, badge, isDesktop);
}
}
}
if (String.IsNullOrEmpty(UMC.Data.WebResource.Instance().Provider["appId"]))
{
response.Redirect("System", "License", new Web.UIConfirmDialog("当前版本未注册,请完成登记注册")
{
Title = "应用注册",
DefaultValue = "Register"
}, false);//
}
else
{
var lic = License.GetLicense("UserSession", 1000);
Data.Caches.ICacheSet cacheSet = UMC.Data.HotCache.Cache<UMC.Data.Entities.Session>();
if ((cacheSet.Count > lic.Quantity && lic.Quantity > 0) || (lic.ExpireTime > 0 && lic.ExpireTime < Utility.TimeSpan()))
{
response.Redirect("System", "License", new Web.UIConfirmDialog("会话规模超限,请保持合规.")
{
Title = "版权授权",
DefaultValue = "UserSession"
}, false);
}
}
this.Context.Send("Desktop", new WebMeta().Put("apps", sts), true);
return this.DialogValue("none");
});
var site = DataFactory.Instance().Site(Key);
var Model = this.AsyncDialog("Model", gkey =>
{
if (site == null)
{
return this.DialogValue(Key);
}
if (request.IsMaster)
{
response.Redirect(request.Model, "Site", site.Root);
}
var title = new UITitle("关于应用");
var ui = UMC.Web.UISection.Create(title);// new UITitle("关于应用"));
title.Style.BgColor(0x28c7ca);
title.Style.Color(0xfff);
var Discount = new UIHeader.Portrait(Data.WebResource.Instance().ImageResolve(request.Url, Data.Utility.Guid(site.Root, true).Value, "1", 4) + $"&_t={site.ModifyTime}");
Discount.Value(site.Caption);
Discount.Gradient(0x28c7ca, 0x0eaee3);
var header = new UIHeader();
var style = new UIStyle();
header.AddPortrait(Discount);
header.Put("style", style);
ui.UIHeader = header;
ui.AddCell("版本", site.Version ?? "01");
switch (site.UserModel ?? UserModel.Standard)
{
default:
case UserModel.Standard:
ui.AddCell("账户对接", "标准模式");
break;
case UserModel.Share:
ui.AddCell("账户对接", "共享模式");
break;
case UserModel.Quote:
ui.AddCell("账户对接", "引用模式");
break;
case UserModel.Bridge:
ui.AddCell("账户对接", "桥接模式");
break;
}
var ui3 = ui.NewSection();
ui3.Header.Put("text", "应用管理员");
var user = this.Context.Token.Identity();
var isAdmin = false;
var admins = Data.DataFactory.Instance().Users(site.SiteKey.Value, UMC.Security.Membership.AdminRole);
if (admins.Length > 0)
{
foreach (var v in admins)
{
ui3.AddCell('\uf2c0', v.Alias, "");
if (isAdmin == false)
{
isAdmin = v.Id == user.Id;
}
}
}
else
{
ui3.Add("Desc", new UMC.Web.WebMeta().Put("desc", "未设置应用管理员").Put("icon", "\uEA05"), new UMC.Web.WebMeta().Put("desc", "{icon}\n{desc}"),
new UIStyle().Align(1).Color(0xaaa).Padding(20, 20).BgColor(0xfff).Size(12).Name("icon", new UIStyle().Font("wdk").Size(60)));//.Name
}
if (request.IsCashier || isAdmin)
ui3.NewSection().AddCell('\uf085', "应用配置", String.Empty, new UIClick(request.Model, "Site", site.Root));
ui.SendTo(this.Context);
return this.DialogValue("none");
});
switch (Model)
{
case "Docs":
this.Context.Send("Desktop.Open", new WebMeta("title", "帮助文档", "id", "Docs", "text", "帮助文档")
.Put("src", "/Docs").Put("max", true), true);
break;
case "Settings":
this.AsyncDialog(Model, r =>
{
var sheet = new UISheetDialog()
.Put(new UIClick("System", "License", "UserSession") { Text = "许可证书" })
.Put(new UIClick("System", "Cache") { Text = "高速存储" })
.Put(new UIClick("System", "Config", "account") { Text = "账户配置" });
return sheet;
});
break;
case "Market":
response.Redirect("ITME", "Builder");
break;
case "WebSSH":
response.Redirect("System", "License", "WebSSH");
break;
case "Desktop":
{
if (request.IsMaster)
{
var media_id = this.AsyncDialog("media_id", g =>
{
if (request.IsApp)
{
return Web.UIDialog.Create("File");
}
else
{
var from = new Web.UIFormDialog() { Title = "设置登录背景图" };
from.AddFile("选择图片", "media_id", String.Empty);
return from;
}
});
var bgSrc = String.Empty;
if (media_id.StartsWith("http://") == false && media_id.StartsWith("https://") == false)
{
media_id = Uri.UnescapeDataString(media_id);
var filename = UMC.Data.Reflection.ConfigPath(String.Format("Static\\TEMP\\{0}", media_id.Substring(media_id.IndexOf('/', 2) + 1)));
media_id = $"file://{filename}";
}
var url = new Uri(media_id);
bgSrc = String.Format("/UserResources/BgSrc/{0}", url.LocalPath.Substring(url.LocalPath.LastIndexOf('/')));
UMC.Data.WebResource.Instance().Transfer(url, bgSrc);
var provider = UMC.Data.WebResource.Instance().Provider;
var pc = Reflection.Configuration("assembly") ?? new ProviderConfiguration();
pc.Add(provider);
provider.Attributes["bgsrc"] = bgSrc;
Reflection.Configuration("assembly", pc);
this.Prompt("设置成功");
}
}
break;
case "BgSrc":
{
var media_id = this.AsyncDialog("media_id", "none");
if (media_id.StartsWith("/TEMP/"))
{
string filename = UMC.Data.Reflection.ConfigPath(String.Format("Static{0}", media_id));
if (System.IO.File.Exists(filename))
{
var bgSrc = String.Format("/UserResources/BgSrc{0}", media_id.Substring(5));
using (System.IO.Stream sWriter = File.OpenRead(filename))
{
UMC.Data.Utility.Copy(sWriter, UMC.Data.Reflection.ConfigPath($"Static{bgSrc}"));
sWriter.Close();
}
var user = this.Context.Token.Identity();
UMC.Data.Session<UMC.Web.WebMeta> session = new Data.Session<WebMeta>($"{user.Id}_Desktop");
var value = session.Value ?? new WebMeta();
value.Put("BgSrc", bgSrc);
session.ContentType = "Settings";
session.Commit(value, user.Id.Value, true, request.UserHostAddress);
this.Context.Send("BgSrc", new WebMeta().Put("src", bgSrc), true);
response.Redirect(request.Model, request.Command, new WebMeta().Put("Key", "LoginBgSrc", "BgSrc", bgSrc), true);
}
}
}
break;
case "PlusDesktop":
{
var user = this.Context.Token.Identity();
UMC.Data.Session<UMC.Web.WebMeta> session = new Data.Session<WebMeta>($"{user.Id}_Desktop");
var value = session.Value ?? new WebMeta();
value.Put(Key, true);
session.ContentType = "Settings";
session.Commit(value, user.Id.Value, true, request.UserHostAddress);
response.Redirect(new WebMeta().Put("Desktop", true));
}
break;
case "RemoveDesktop":
{
var user = this.Context.Token.Identity();
UMC.Data.Session<UMC.Web.WebMeta> session = new Data.Session<WebMeta>($"{user.Id}_Desktop");
var value = session.Value ?? new WebMeta();
if (site?.IsDesktop == true)
{
value.Put(Key, "hide");
}
else
{
value.Remove(Key);
}
session.ContentType = "Settings";
session.Commit(value, user.Id.Value, true, request.UserHostAddress);
response.Redirect(new WebMeta().Put("Desktop", true));
}
break;
case "Account":
{
var user = this.Context.Token.Identity();
switch (site.UserModel ?? UserModel.Standard)
{
case UserModel.Check:
default:
case UserModel.Checked:
case UserModel.Standard:
break;
case UserModel.Bridge:
this.Prompt("此应用不支持设置多账户");
break;
}
var scookies = DataFactory.Instance().Cookies(site.Root, user.Id.Value).OrderBy(r => r.IndexValue).ToList();
var login = UMC.Data.Utility.TimeSpan();
var vt = login;
foreach (var sc in scookies)
{
if (String.IsNullOrEmpty(sc.Account))
{
login = sc.IndexValue ?? 0;
break;
}
}
if (login <= 0)
{
this.Prompt("请先设置自己主账户");
}
else
{
if (vt == login)
{
DataFactory.Instance().Put(new Entities.Cookie() { IndexValue = login, user_id = user.Id, Domain = site.Root });
}
this.Context.Send("Desktop.Open", new WebMeta("title", site.Caption, "id", site.Root, "text", "多账户对接")
.Put("src", $"{request.Url.Scheme}://{site.Root}{union}{home}/UMC.Login/New").Put("max", true), true);
}
}
break;
case "Delete":
{
var ls = DataFactory.Instance().Cookies(site.Root, this.Context.Token.UserId.Value)
.Where(r => String.IsNullOrEmpty(r.Account) == false).ToArray();
if (ls.Length == 0)
{
this.Prompt("还未绑定账户,不需要移除");
}
var indexValue = UMC.Data.Utility.IntParse(this.AsyncDialog("IndexValue", k =>
{
if (ls.Length == 1)
{
return new UIConfirmDialog("您确认移除此应用的绑定吗") { DefaultValue = (ls[0].IndexValue ?? 0).ToString() };
}
else
{
var dc = new UISheetDialog() { Title = "请选择移除账户" };
foreach (var c in ls)
{
if (String.IsNullOrEmpty(c.Account) == false && c.IndexValue != 0)
{
dc.Put(c.Account, c.IndexValue.ToString());
}
}
return dc;
}
}), 0);
UMC.Data.DataFactory.Instance().Delete(new Password { Key = SiteConfig.MD5Key(site.Root, this.Context.Token.UserId.Value, indexValue) });
DataFactory.Instance().Delete(new Cookie { user_id = this.Context.Token.UserId.Value, Domain = site.Root, IndexValue = indexValue });
this.Prompt(String.Format("解除账户绑定成功", site.Caption));
}
break;
case "Setting":
if (site != null)
{
if (request.IsMaster == false)
{
var rols = UMC.Data.DataFactory.Instance().Roles(this.Context.Token.UserId.Value, site.SiteKey.Value);
if (rols.Contains(UMC.Security.Membership.AdminRole) == false)
{
this.Prompt("应用管理的需要应用管理员权限");
}
}
this.Context.Send("Desktop.Open", new WebMeta("title", site.Caption + "设置", "id", site.Root, "text", "应用账户")
.Put("src", $"/Setting/{site.SiteKey.Value}").Put("max", true), true);
}
break;
case "Password":
{
var ls = DataFactory.Instance().Cookies(site.Root, this.Context.Token.UserId.Value)
.Where(r => String.IsNullOrEmpty(r.Account) == false).ToArray();
if (ls.Length == 0)
{
this.Prompt("您未对接此应用");
}
var indexValue = UMC.Data.Utility.IntParse(this.AsyncDialog("IndexValue", k =>
{
var dc = new UISheetDialog() { Title = "请选择账户" };
foreach (var c in ls)
{
if (String.IsNullOrEmpty(c.Account) == false)
{
dc.Put(c.Account, c.IndexValue.ToString());
}
}
if (dc.Count < 2)
{
return this.DialogValue(ls[0].IndexValue.ToString());
}
return dc;
}), 0);
var cookie = UMC.Data.DataFactory.Instance().Password(SiteConfig.MD5Key(site.Root, this.Context.Token.UserId.Value, indexValue));
if (String.IsNullOrEmpty(cookie) == false)
{
this.Context.Send("Clipboard", new WebMeta().Put("text", cookie), true);
}
else
{
this.Prompt("您未对接此应用");
}
}
break;
}
}
}
}