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

413 lines
22 KiB

namespace CounsellorBL
{
using CounsellorBL.BLStructure;
using CounsellorBL.Common;
using CounsellorBL.ConstDefinition;
using CounsellorBL.Helper;
using Microsoft.Extensions.Caching.Memory;
using MonumentDefine;
using OT.COM.ArsenalDB;
using OT.COM.SignalerMessage;
using SoldierData.EnterprizeV4;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
public partial class AuthorityService : DBService
{
public override string MainTable => null;
[Auth(false)]
public CResponseMessage HandShake(CRequestMessage i_crmInput)
{
CResponseMessage crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param[BLWording.TOKEN] = Guid.NewGuid().ToString();
return crmRes;
}
[Auth(false)]
public CResponseMessage Login(CRequestMessage i_crmInput)
{
int nExpMinute = Convert.ToInt32(CustomizeDBMgr.SettingData[BLWording.TOKEN_EXP_MINUTE], CultureInfo.CurrentCulture);
string sMsg = null;
CResponseMessage crmRes = null;
do
{
List<Dictionary<string, object>> lDic = getQryParameterList(i_crmInput);
IMemoryCache imc = GetMemoryCache();
if (imc != null)
{
lock (imc)
{
if (imc.TryGetValue(BLWording.TOKENMAP, out ConcurrentDictionary<string, tb_sys_session> dicMap))
{
List<string> lKeys = dicMap.Keys.ToList();
DateTime dtLast = DateTime.Now.AddMinutes(-1 * nExpMinute);
foreach (string sKey in lKeys)
{
tb_sys_session s = dicMap[sKey];
if (s.update_date < dtLast)
{
dicMap.TryRemove(sKey, out _);
}
}
}
}
}
if (lDic != null && lDic.Count == 1)
{
Dictionary<string, object> dicLoginInfo = lDic[0];
bool bIsAD = false;
if (dicLoginInfo.ContainsKey(BLWording.ENTERCODE) && dicLoginInfo.ContainsKey(BLWording.AUTOENTER))
{
string sEnterCode = dicLoginInfo[BLWording.ENTERCODE].ToString();
string sAutoCode = dicLoginInfo[BLWording.AUTOENTER].ToString();
int nLen = sEnterCode.Length;
int nIdex = 0;
if (nLen > 0 && nLen == sAutoCode.Length)
{
for (nIdex = 0; nIdex < nLen; nIdex++)
{
if (sEnterCode[nIdex] != sAutoCode[nLen - nIdex - 1])
{
break;
}
}
}
bIsAD = nIdex == nLen;
}
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeA = lBlocks.GetInst();
qjeA.table = tb_sys_user.TABLENAME;
qjeA.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
new WhereNode(tb_sys_user.CN_ACCOUNT, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_user), dicLoginInfo[tb_sys_user.CN_ACCOUNT]),
new WhereNode(tb_sys_user.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_user), BLWording.STATUS_FLAG_ON)
);
qjeA.displaycols = new List<string>() { tb_sys_user.CN_UID };
lBlocks.Add(qjeA);
QueryJsonElement qjeEmp = lBlocks.GetInst();
qjeEmp.table = tb_hr_employee.TABLENAME;
qjeEmp.jointype = QueryJsonElement.LEFT_JOIN;
qjeEmp.joincols = new Dictionary<string, string>()
{ {tb_hr_employee.CN_UID, tb_sys_user.CN_UID } };
qjeEmp.jointable = qjeA;
lBlocks.Add(qjeEmp);
QueryJsonElement qjeB = lBlocks.GetInst();
qjeB.table = tb_sys_user2entercode.TABLENAME;
qjeB.jointype = QueryJsonElement.LEFT_JOIN;
qjeB.joincols = new Dictionary<string, string>()
{ {tb_sys_user2entercode.CN_USER_UID, tb_sys_user.CN_UID } };
qjeB.jointable = qjeA;
sMsg = EncryptHelper.Encrypt(dicLoginInfo[BLWording.ENTERCODE].ToString(), out string sEnc);
if (sMsg != null)
{
break;
}
if (!bIsAD)
{
qjeB.wherecols = new WhereNode(tb_sys_user2entercode.CN_USER_ENTERCODE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_user2entercode), sEnc);
}
lBlocks.Add(qjeB);
QueryJsonElement qjeC = lBlocks.GetInst();
qjeC.table = tb_sys_user2role.TABLENAME;
qjeC.jointype = QueryJsonElement.LEFT_JOIN;
qjeC.displaycols = new List<string>() { tb_sys_user2role.CN_ROLE_UID, tb_sys_user2role.CN_STATUS_FLAG };
qjeC.joincols = new Dictionary<string, string>()
{ {tb_sys_user2role.CN_USER_UID, tb_sys_user.CN_UID } };
qjeC.jointable = qjeA;
//qjeC.wherecols = new WhereNode(tb_sys_user2role.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_user2role), BLWording.STATUS_FLAG_ON);
lBlocks.Add(qjeC);
// QueryJsonElement qjeD = lBlocks.GetInst();
// qjeD.table = tb_sys_role2org.TABLENAME;
// qjeD.jointype = QueryJsonElement.LEFT_JOIN;
// qjeD.joincols = new Dictionary<string, string>()
//{ {tb_sys_role2org.CN_ROLE_UID, tb_sys_user2role.CN_ROLE_UID } };
// qjeD.jointable = qjeC;
// qjeD.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
// new WhereNode(tb_sys_role2org.CN_ORG_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_role2org), dicLoginInfo[BLWording.ORGANIZATION]),
// new WhereNode(tb_sys_role2org.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_role2org), BLWording.STATUS_FLAG_ON));
// lBlocks.Add(qjeD);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cSelect);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cSelect);
List<tb_sys_user2role> lRes = ai.RunQueryList<tb_sys_user2role>(cSelect, null);
//QueryDataSet lRes = ai.RunQueryDataSet(cSelect, null);
if (!cSelect.IsSuccess)
{
break;
}
if (!lRes.Any())
{
sMsg = BseMessageWording.NO_MATCHED_ACCOUNT;
break;
}
string sRoleName = "NoRole";
if (!string.IsNullOrEmpty(lRes[0].role_uid) && lRes[0].status_flag == BLWording.STATUS_FLAG_ON)
{
tb_sys_role rData = new tb_sys_role();
rData.SetDirty(tb_sys_role.CN_NAME);
tb_sys_role rCond = new tb_sys_role() { uid = lRes[0].role_uid };
Command cSelectRoleName = Command.SetupSelectCmd(rData, rCond);
List<tb_sys_role> lRole = ai.RunQueryList<tb_sys_role>(cSelectRoleName, null);
sRoleName = lRole[0].name;
}
List<Command> lCmds = new List<Command>();
DateTime dtNow = DateTime.Now.AddMinutes(-1 * Convert.ToInt32(CustomizeDBMgr.SettingData[BLWording.TOKEN_EXP_MINUTE], CultureInfo.CurrentCulture));
WhereNode wn = new WhereNode(tb_sys_session.CN_UPDATE_DATE, WhereNode.EColumnOperation.EOT_LT, typeof(tb_sys_session), dtNow);
Command cDelete = Command.SetupDeleteCmd(wn);
lCmds.Add(cDelete);
tb_sys_session s = new tb_sys_session();
s.create_user_uid = s.update_user_uid = lRes[0].uid;
s.create_org_uid = s.update_org_uid = dicLoginInfo[BLWording.ORGANIZATION].ToString();
s.role_name = sRoleName;
s.uid = Guid.NewGuid().ToString();
Command cInsert = Command.SetupInsertCmd(s);
lCmds.Add(cInsert);
ai.RunEditCmds(lCmds);
if (!cInsert.IsSuccess)
{
sMsg = cInsert.LastErrorCode;
break;
}
// Privilidges
List<string> lRoles = new List<string>();
foreach (tb_sys_user2role r in lRes)
{
lRoles.Add(r.role_uid);
}
lBlocks.Clear();
QueryJsonElement qjeAp = lBlocks.GetInst();
qjeAp.table = tb_sys_program2action_grant.TABLENAME;
qjeAp.displaycols = new List<string>() { tb_sys_program2action_grant.CN_PROGRAM2ACTION_UID, tb_sys_program2action_grant.CN_UID, tb_sys_program2action_grant.CN_GRANT_UID };
qjeAp.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
new WhereNode(tb_sys_program2action_grant.CN_GRANT_TYPE, WhereNode.EColumnOperation.EOT_IN, typeof(tb_sys_program2action_grant), BLWording.ROLE_ID),
new WhereNode(tb_sys_program2action_grant.CN_GRANT_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_sys_program2action_grant), lRoles.ToArray()),
new WhereNode(tb_sys_program2action_grant.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program2action_grant), BLWording.STATUS_FLAG_ON)
);
lBlocks.Add(qjeAp);
QueryJsonElement qjeBp = lBlocks.GetInst();
qjeBp.table = tb_sys_program2action.TABLENAME;
qjeBp.aliascols = new Dictionary<string, List<string>>() { { tb_sys_program2action.CN_ACTION_NAME, new List<string>() { "action_name" } } };
qjeBp.jointype = QueryJsonElement.LEFT_JOIN;
qjeBp.jointable = qjeAp;
qjeBp.joincols = new Dictionary<string, string>() {
{ tb_sys_program2action.CN_UID,tb_sys_program2action_grant.CN_PROGRAM2ACTION_UID }};
lBlocks.Add(qjeBp);
QueryJsonElement qjeCp = lBlocks.GetInst();
qjeCp.table = tb_sys_program.TABLENAME;
qjeCp.displaycols = new List<string>() { tb_sys_program.CN_ROUT_PATH, tb_sys_program.CN_MODULE_UID, tb_sys_program.CN_SEQ, tb_sys_program.CN_ICON, tb_sys_program.CN_MENUDISPLAY };
qjeCp.aliascols = new Dictionary<string, List<string>>() { { tb_sys_program.CN_NAME, new List<string>() { "program_name" } }, { tb_sys_program.CN_UID, new List<string>() { "program_id" } } };
qjeCp.jointype = QueryJsonElement.LEFT_JOIN;
qjeCp.joincols = new Dictionary<string, string>()
{ {tb_sys_program.CN_UID, tb_sys_program2action.CN_PROGRAM_UID } };
qjeCp.jointable = qjeBp;
qjeCp.wherecols = new WhereNode(tb_sys_program.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program), BLWording.STATUS_FLAG_ON);
lBlocks.Add(qjeCp);
QueryJsonElement qjeDp = lBlocks.GetInst();
qjeDp.table = tb_sys_role.TABLENAME;
qjeDp.aliascols = new Dictionary<string, List<string>>() { { tb_sys_role.CN_NAME, new List<string>() { "role_name" } } };
qjeDp.jointype = QueryJsonElement.LEFT_JOIN;
qjeDp.joincols = new Dictionary<string, string>()
{ {tb_sys_role.CN_UID, tb_sys_program2action_grant.CN_GRANT_UID } };
qjeDp.jointable = qjeAp;
lBlocks.Add(qjeDp);
qjeAp.ordercols = new List<Tuple<QueryJsonElement, string, string>>() {
Tuple.Create<QueryJsonElement, string, string>(qjeCp, tb_sys_program.CN_SEQ, BLWording.ORDER_ASC),
Tuple.Create<QueryJsonElement, string, string>(qjeBp, tb_sys_program2action.CN_SEQUENCE, BLWording.ORDER_ASC)
};
sMsg = MakeSelectJoinByBlocks(lBlocks, out cSelect);
QueryDataSet qds = ai.RunQueryDataSet(cSelect, null);
lBlocks.Clear();
QueryJsonElement qjeUser = lBlocks.GetInst();
qjeUser.table = tb_sys_program2action_grant.TABLENAME;
qjeUser.displaycols = new List<string>() { tb_sys_program2action_grant.CN_PROGRAM2ACTION_UID, tb_sys_program2action_grant.CN_UID, tb_sys_program2action_grant.CN_GRANT_UID };
qjeUser.wherecols = new WhereNode(WhereNode.ENodeOperation.ENO_AND,
new WhereNode(tb_sys_program2action_grant.CN_GRANT_TYPE, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program2action_grant), BLWording.USER_ID),
new WhereNode(tb_sys_program2action_grant.CN_GRANT_UID, WhereNode.EColumnOperation.EOT_IN, typeof(tb_sys_program2action_grant), lRes.Select(x => x.user_uid).FirstOrDefault()),
new WhereNode(tb_sys_program2action_grant.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program2action_grant), BLWording.STATUS_FLAG_ON)
);
lBlocks.Add(qjeUser);
QueryJsonElement qjeUserA = lBlocks.GetInst();
qjeUserA.table = tb_sys_program2action.TABLENAME;
qjeUserA.aliascols = new Dictionary<string, List<string>>() { { tb_sys_program2action.CN_ACTION_NAME, new List<string>() { "action_name" } } };
qjeUserA.jointype = QueryJsonElement.LEFT_JOIN;
qjeUserA.jointable = qjeUser;
qjeUserA.joincols = new Dictionary<string, string>() {
{ tb_sys_program2action.CN_UID,tb_sys_program2action_grant.CN_PROGRAM2ACTION_UID }};
lBlocks.Add(qjeUserA);
QueryJsonElement qjeUserP = lBlocks.GetInst();
qjeUserP.table = tb_sys_program.TABLENAME;
qjeUserP.displaycols = new List<string>() { tb_sys_program.CN_ROUT_PATH, tb_sys_program.CN_MODULE_UID, tb_sys_program.CN_SEQ, tb_sys_program.CN_ICON, tb_sys_program.CN_MENUDISPLAY };
qjeUserP.aliascols = new Dictionary<string, List<string>>() { { tb_sys_program.CN_NAME, new List<string>() { "program_name" } }, { tb_sys_program.CN_UID, new List<string>() { "program_id" } } };
qjeUserP.jointype = QueryJsonElement.LEFT_JOIN;
qjeUserP.joincols = new Dictionary<string, string>()
{ {tb_sys_program.CN_UID, tb_sys_program2action.CN_PROGRAM_UID } };
qjeUserP.jointable = qjeUserA;
qjeUserP.wherecols = new WhereNode(tb_sys_program.CN_STATUS_FLAG, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_program), "1");
lBlocks.Add(qjeUserP);
qjeUser.ordercols = new List<Tuple<QueryJsonElement, string, string>>() {
Tuple.Create(qjeUserP, tb_sys_program.CN_SEQ, BLWording.ORDER_ASC),
Tuple.Create(qjeUserA, tb_sys_program2action.CN_SEQUENCE, BLWording.ORDER_ASC)
};
cSelect = null;
sMsg = MakeSelectJoinByBlocks(lBlocks, out cSelect);
QueryDataSet qdsUser = ai.RunQueryDataSet(cSelect, null);
var roleData = new QueryResponse(qds).Records;
var userData = new QueryResponse(qdsUser).Records;
var qrsPrivilidge = roleData.Union(userData).ToList();
crmRes = new CSuccessResponseMessage(null, i_crmInput);
crmRes.param[BLWording.TOKEN] = s.uid;
crmRes.param[BLWording.PRIVILEGES] = qrsPrivilidge;
crmRes.param["rolename"] = sRoleName;
}
}
while (false);
if (sMsg != null)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
private class VarificationModel
{
public string ip_address { get; set; }
public string create_user_uid { get; set; }
public string branch_name { get; set; }
}
public CResponseMessage VerifyIPAddress(CRequestMessage i_crmInput)
{
string sMsg = null;
CResponseMessage crmRes = null;
do
{
List<Dictionary<string, object>> lDic = getQryParameterList(i_crmInput);
var receive_branch_uid = ProjectHelper.GetLoginUser(i_crmInput).receive_branch_uid;
if (lDic != null && lDic.Count == 1)
{
if (i_crmInput == null)
{
throw new ArgumentNullException(nameof(i_crmInput));
}
var token = i_crmInput.token;
if (!string.IsNullOrEmpty(token))
{
QueryJsonElementCollection lBlocks = new QueryJsonElementCollection();
QueryJsonElement qjeSession = lBlocks.GetInst();
qjeSession.table = tb_sys_session.TABLENAME;
qjeSession.wherecols = new WhereNode(tb_sys_session.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_sys_session), token);
qjeSession.displaycols = new List<string> { tb_sys_session.CN_CREATE_USER_UID };
// 人員資訊
QueryJsonElement qjeEmployee = lBlocks.GetInst();
qjeEmployee.table = tb_hr_employee.TABLENAME;
qjeEmployee.jointype = QueryJsonElement.JOIN;
qjeEmployee.joincols = new Dictionary<string, string>() { { tb_hr_employee.CN_UID, tb_sys_session.CN_CREATE_USER_UID } };
qjeEmployee.jointable = qjeSession;
// 所屬社團
QueryJsonElement qjeEmp2Branch = lBlocks.GetInst();
qjeEmp2Branch.table = tb_hr_employee2branch.TABLENAME;
qjeEmp2Branch.jointype = QueryJsonElement.JOIN;
qjeEmp2Branch.joincols = new Dictionary<string, string>() { { tb_hr_employee2branch.CN_UID, tb_hr_employee.CN_UID } };
qjeEmp2Branch.jointable = qjeEmployee;
// 社團資訊
QueryJsonElement qjeBranch = lBlocks.GetInst();
qjeBranch.table = tb_grp_branch.TABLENAME;
qjeBranch.jointype = QueryJsonElement.JOIN;
qjeBranch.joincols = new Dictionary<string, string>() { { tb_grp_branch.CN_UID, tb_hr_employee2branch.CN_BRANCH_UID } };
qjeBranch.wherecols = new WhereNode(tb_grp_branch.CN_UID, WhereNode.EColumnOperation.EOT_EQ, typeof(tb_grp_branch), receive_branch_uid);
qjeBranch.jointable = qjeEmp2Branch;
qjeBranch.displaycols = new List<string>() {
tb_grp_branch.CN_BRANCH_NAME,
tb_grp_branch.CN_IP_ADDRESS,
};
lBlocks.Add(qjeSession);
lBlocks.Add(qjeEmployee);
lBlocks.Add(qjeEmp2Branch);
lBlocks.Add(qjeBranch);
sMsg = MakeSelectJoinByBlocks(lBlocks, out Command cRes);
ArsenalInterface ai = ArsenalDBMgr.GetInst(cRes);
var qds = ai.RunQueryList<VarificationModel>(cRes);
List<string> ipList = new List<string>();
foreach (var item in qds)
{
if (!string.IsNullOrEmpty(item.ip_address))
{
ipList.AddRange(item.ip_address.Split(',').ToList());
}
}
var count = ipList.Count(x => x == i_crmInput.clientip);
Logger.Info("IP_Address = " + i_crmInput.clientip);
if (ipList.Count > 0 && count < 1 && i_crmInput.clientip != "::1" && i_crmInput.clientip != "127.0.0.1")
{
sMsg = "IP address invalid";
break;
}
}
crmRes = new CSuccessResponseMessage(null, i_crmInput);
}
}
while (false);
if (sMsg != null)
{
crmRes = new CErrorResponseMessage(sMsg, i_crmInput);
}
return crmRes;
}
}
}