using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using NP.Model; using System.Security.Claims; using System.Collections; namespace NP.BO.Controllers { //[AllowAnonymous] public class AccountController : NP.Base.BaseController { public ActionResult GetEnc(String d) { ViewBag.enc = NP.Base.Lib.KISA_SHA256.SHA256Hash(d); return View(); } //[AllowAnonymous] public ActionResult Index(VMUser vm, bool istimeout = false) { ViewBag.IsTimeOut = istimeout; if (Request.IsAjaxRequest()) { return JsonError(Base.ENUM.JSONCode.Error, "403:" + Request.Url.AbsolutePath, "0112"); } else { vm.SavedId = CookieGet("SavedId", ""); } return View(vm); } public JsonResult PassGet(String pw) { return Json(NP.Base.Lib.KISA_SHA256.SHA256Hash(pw), JsonRequestBehavior.AllowGet); } [HttpPost] public ActionResult Index(VMUser vm, string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; if (!string.IsNullOrEmpty(vm.SavedId)) { CookieSet("savedid", vm.User.userid); } else { CookieClear("savedid"); } SUserInfo.LoginIP = GetUserIP(); var ht = InitHash(); Int64? AdminNo = null; ht.Add("userno", AdminNo); ht.Add("loginsite", 0); ht.Add("loginstatus", 3); Int16 LoginStatus = 3; if (vm.User != null && !string.IsNullOrEmpty(vm.User.userid) && !string.IsNullOrEmpty(vm.User.userpass) && !vm.User.userid.Trim().Equals("") && !vm.User.userpass.Trim().Equals("")) { var p = new Hashtable { { "userid", vm.User.userid }, { "password", NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass) }, { "uip", SUserInfo.LoginIP } }; var u = Dao.Get("users.adminlogin", p).FirstOrDefault(); if (u != null) { LoginStatus = 1; ht["userno"] = u.userno; //vm.IntranetIPs = Dao.Get("users.intranetip", new Hashtable() { {"IsActive", 1 } }); //0: 정상(로그인성공), 1: 정상(외부아이피), 2: 비밀번호오류, 3: 아이디오류, 4: 외부아이피차단, 5: 퇴사자, 6: 사용안함, 7: 크래킹공격 if (u.status != 1) { LoginStatus = 6; } //else if (u.RetireDate != null) { LoginStatus = 5; } else if (!"192.168.0.87,192.168.0.56,127.0.0.1,59.150.105.198".Contains(SUserInfo.LoginIP) && !u.userpass.Equals(NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim()))) { LoginStatus = 2; } else { //var isIntranet = false; var myips = SUserInfo.LoginIP.Split('.').Select(s => Convert.ToInt32(s)); //foreach(var ip in vm.IntranetIPs) //{ // if (Convert.ToInt32(ip.SIP.Split('.')[0]) <= myips.First() && Convert.ToInt32(ip.EIP.Split('.')[0]) >= myips.First() && // Convert.ToInt32(ip.SIP.Split('.')[1]) <= myips.Skip(1).Take(1).First() && Convert.ToInt32(ip.EIP.Split('.')[1]) >= myips.Skip(1).Take(1).First() && // Convert.ToInt32(ip.SIP.Split('.')[2]) <= myips.Skip(2).Take(1).First() && Convert.ToInt32(ip.EIP.Split('.')[2]) >= myips.Skip(2).Take(1).First() && // Convert.ToInt32(ip.SIP.Split('.')[3]) <= myips.Skip(3).Take(1).First() && Convert.ToInt32(ip.EIP.Split('.')[3]) >= myips.Skip(3).Take(1).First()) // { // isIntranet = true; // break; // } //} //if (isIntranet) { LoginStatus = 0; } //else if (u.Security == 1 && !"127.0.0.1,59.150.105.198".Contains(SUserInfo.LoginIP)) { LoginStatus = 4; } LoginStatus = 0; } ht["loginstatus"] = LoginStatus; Dao.Insert("users.loginlog", ht); if(LoginStatus < 2) { Random r = new Random(); var loginkey = r.Next(10000000, 99999999); Dao.Save("users.loginkey", new Hashtable() { { "userno", u.userno }, { "loginkey", loginkey } }); SUserInfo.LoginKey = loginkey; SUserInfo.UserNo = u.userno; SUserInfo.UserName = u.username; SUserInfo.UserType = u.usertype; SUserInfo.ASNo = u.asno??0; SUserInfo.UserInfo = u.usertype + "." + u.userno; base.AuthCookie(false); //if ("/".Equals(returnUrl ?? "/")) //{ if (SUserInfo.UserType == 11) { return RedirectToLocal("/croom/grades"); } else if (vm.IsSiteAdmin) { return RedirectToLocal("/user/users"); } return RedirectToLocal("/"); //} //else //{ // return RedirectToLocal(returnUrl); //} } } else { Dao.Insert("users.loginlog", ht); } } else { ht["LoginLog"] = vm.User.userid; ht["LoginStatus"] = 7; Dao.Insert("users.loginlog", ht); } vm.LoginFailedId = LoginStatus; vm.IsLoginFailed = true; return View(vm); } //[Authorize] public ActionResult Logout() { //HttpContext.Session.Clear(); //System.Web.Security.FormsAuthentication.SignOut(); //return RedirectToAction(nameof(AccountController.Index), "Account"); //HttpContext.Session.Clear(); //System.Web.Security.FormsAuthentication.SignOut(); //Response.Cookies[SUI].Expires = DateTime.Now.AddDays(-1); CookieClear(null, true); return Redirect("/Account/Index"); } private ActionResult RedirectToLocal(string returnUrl) { if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction(nameof(HomeController.Index), "Home"); } } [AllowAnonymous] public JsonResult NoPermit(int _code = 9999, String _msg = "권한이 없습니다.") { return Json(new JsonRtn() { code = _code, msg = _msg }, JsonRequestBehavior.AllowGet); } [AllowAnonymous] public JsonResult NoAuth(int _code = 9999, String _msg = "인증이 없습니다.") { return Json(new JsonRtn() { code = _code, msg = _msg }, JsonRequestBehavior.AllowGet); } [AllowAnonymous] public ActionResult Error(NP.Model.JsonRtn vm = null, int _code = 0) { vm = vm ?? new JsonRtn() { }; vm.msg = vm.msg ?? "503"; Exception exception = Server.GetLastError(); Response.Clear(); ViewBag.ErrorMsg = ""; HttpException httpException = (HttpException)exception; if (httpException != null) { NP.Base.Logger.Error("ApplicationError" + vm.msg, exception); } Server.ClearError(); if (Request.IsAjaxRequest()) { if (_code == 9991) { return JsonError(Base.ENUM.JSONCode.TimeOut, vm.msg + ":" + Request.Url.AbsolutePath + (exception ?? new Exception()).Message, "/Account/Index"); } return JsonError(Base.ENUM.JSONCode.Error, vm.msg + ":" + Request.Url.AbsolutePath + (exception ?? new Exception()).Message, exception); } return View("Error"); } [AllowAnonymous] public ActionResult Error403(NP.Model.JsonRtn vm) { vm.msg = "403"; return Error(vm); } [AllowAnonymous] public ActionResult Error404(NP.Model.JsonRtn vm) { vm.msg = "404" + (Request.IsLocal ? Request.Url.Query : ""); return Error(vm); } [AllowAnonymous] public ActionResult Error500(NP.Model.JsonRtn vm) { vm.msg = "500"; return Error(vm); } public ActionResult Status335(String sss) { //if ("ynpartners123".Equals(sss)) //{ // var users = Dao.Get("users.get335", new Hashtable() { }); // var em = Dao.Get("mm.mailtp.get", 2).FirstOrDefault(); // if (em != null) // { // foreach (var u in users) // { // SendEmail(999, u.email, "", "영남건설기술교육원", "[영남건설기술교육원] 휴면계정알림", em.MHtml.Replace("^회원명^", u.username).Replace("../img/", GetConfig("fronturl") + "/img/").Replace("^아이디^", u.email).Replace("^fronturl^", GetConfig("fronturl")), "", ""); // } // } //} return null; } public ActionResult AdminEE(int un, int eek, int at, int an) { if (SUserInfo.IsAdmin || SUserInfo.IsSiteAdmin) { Random r = new Random(); var loginkey = r.Next(10000000, 99999999); var u = Dao.Get("users.eecall", new Hashtable() { { "userno", un }, { "eek", eek },{ "loginkey", loginkey} }).FirstOrDefault(); if (u != null && u.usertype == 11) { var cusertype = SUserInfo.UserType; var cuserno = SUserInfo.UserNo; CookieClear(null, true); SUserInfo.UserNo = u.userno; SUserInfo.UserName = u.username; SUserInfo.UserType = u.usertype; SUserInfo.ASNo = u.asno ?? 0; SUserInfo.UserInfo = cusertype + "." + cuserno; SUserInfo.LoginIP = GetUserIP(); SUserInfo.LoginKey = loginkey; base.AuthCookie(false); return RedirectToAction("Index", "Home"); } } return RedirectToAction("Index"); } public ActionResult MenuReset(string ddd) { if ("rhksflwkfhrmdls999".Equals(ddd)) { ResetMenuBase(); } return RedirectToAction("Index"); } /// /// 윈도우스케쥴러가 1시간에 한 번씩 호출 /// /// /// public ActionResult Encourage(String sss, int test = 0) { if (test == 1) { SetError("encouragetest: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } else { var m = new Memo() { Users = new List() { } }; if ("nptech1234".Equals(sss)) { //시간불규칙 대비해야 함 var lects = Dao.Get("lect.encourages", new Hashtable() { { "dtime", DateTime.Now.Minute > 30 ? (DateTime.Now.Hour + 1) : DateTime.Now.Hour }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }); //1~7. 온라인/혼합 출석 80% 미만, 진행평가, 최종평가, 과제, 토론, 강의평가 미참여 { foreach (var u in lects.Where(w => w.scdno < 8 && w.istalk == 1)) { m.Users.Add(new MemoUser() { userno = u.userno, smstype = "A", isok = string.IsNullOrEmpty(u.mobile) ? -1 : 1, mobile = (u.mobile ?? "").Replace("-", ""), mcontents = string.Format("영남건설기술교육원입니다.\n\n[{0}]님이 수강중인 [{1}] 강좌의 교육 종료일이 {2}일 남았습니다. 종료되기전에 서둘러 " + (u.scdno < 3 ? "학습을 진행" : u.scdno == 3 ? "진행평가에" : u.scdno == 4 ? "최종평가에" : u.scdno == 5 ? "과제을 제출" : u.scdno == 6 ? "토론에 참여" : u.scdno == 7 ? "강의평가에 참여" : "-") + "해주세요.\n\n☞사이트 : https://edu.kfcf.or.kr", u.username, u.cname, u.dday) }); } if (m.Users.Where(w => w.isok == 1).Count() > 0) { Talk(m.Users.Where(w => w.isok == 1).ToList(), "encourage1"); m.Users.Clear(); } var masteremail = GetConfig("masteremail"); var senderemail = masteremail.Split(';')[0]; foreach (var u in lects.Where(w => w.scdno < 3 && w.isemail == 1)) { if (IsEmail(u.email)) { SendEmail(masteremail.Split(';')[1], GetInt(masteremail.Split(';')[2]), masteremail.Split(';')[3], masteremail.Split(';')[4], 999, u.email, senderemail, "[영남건설기술교육원]", "[영남건설기술교육원] 진행평가 참여 알림", string.Format("영남건설기술교육원입니다.

[{0}]님이 수강중인 [{1}] 강좌의 교육 종료일이 {2}일 남았습니다. 종료되기전에 서둘러 " + (u.scdno < 3 ? "학습을 진행" : u.scdno == 3 ? "진행평가에" : u.scdno == 4 ? "최종평가에" : u.scdno == 5 ? "과제을 제출" : u.scdno == 6 ? "토론에 참여" : u.scdno == 7 ? "강의평가에 참여" : "-") + " 진행해주세요.

☞사이트 : https://edu.kfcf.or.kr", u.username, u.cname, u.dday)); } } } //8. 오프라인 출석 { foreach (var u in lects.Where(w => w.scdno == 8 && w.istalk == 1)) { m.Users.Add(new MemoUser() { userno = u.userno, smstype = "A", isok = string.IsNullOrEmpty(u.mobile) ? -1 : 1, mobile = (u.mobile ?? "").Replace("-", ""), mcontents = string.Format("영남건설기술교육원입니다.\n\n{0}님이 신청중인 [{1}] 강좌의 교육이 [{2}]에 {3}에서 시작됩니다.\n\n☞사이트 : https://edu.kfcf.or.kr", u.username, u.cname, u.stime.ToString("yyyy-MM-dd"),u.place) }); } if (m.Users.Where(w => w.isok == 1).Count() > 0) { Talk(m.Users.Where(w => w.isok == 1).ToList(), "encourage7"); m.Users.Clear(); } var masteremail = GetConfig("masteremail"); var senderemail = masteremail.Split(';')[0]; foreach (var u in lects.Where(w => w.scdno == 8 && w.isemail == 1)) { if (IsEmail(u.email)) { SendEmail(masteremail.Split(';')[1], GetInt(masteremail.Split(';')[2]), masteremail.Split(';')[3], masteremail.Split(';')[4], 999, u.email, senderemail, "[영남건설기술교육원]", "[영남건설기술교육원] 진행평가 참여 알림", string.Format("영남건설기술교육원입니다.

{0}님이 신청중인 [{1}] 강좌의 교육이 [{2}]에 {3}에서 시작됩니다.

☞사이트 : https://edu.kfcf.or.kr", u.username, u.cname, u.stime.ToString("yyyy-MM-dd"),u.place)); } } } //9. 자격검정 시험 { foreach (var u in lects.Where(w => w.scdno == 9 && w.istalk == 1)) { m.Users.Add(new MemoUser() { userno = u.userno, smstype = "A", isok = string.IsNullOrEmpty(u.mobile) ? -1 : 1, mobile = (u.mobile ?? "").Replace("-", ""), mcontents = string.Format("영남건설기술교육원입니다.\n\n{0}님이 신청중인 [{1}] 자격검정이 [{2}]에 {3}에서 이뤄질 예정입니다.\n\n☞사이트: https://edu.kfcf.or.kr", u.username, u.cname, u.stime.ToString("yyyy-MM-dd HH:mm"),u.place) }); } if (m.Users.Where(w => w.isok == 1).Count() > 0) { Talk(m.Users.Where(w => w.isok == 1).ToList(), "encourage8"); m.Users.Clear(); } var masteremail = GetConfig("masteremail"); var senderemail = masteremail.Split(';')[0]; foreach (var u in lects.Where(w => w.scdno == 9 && w.isemail == 1)) { if (IsEmail(u.email)) { SendEmail(masteremail.Split(';')[1], GetInt(masteremail.Split(';')[2]), masteremail.Split(';')[3], masteremail.Split(';')[4], 999, u.email, senderemail, "[영남건설기술교육원]", "[영남건설기술교육원] 진행평가 참여 알림", string.Format("영남건설기술교육원입니다.

{0}님이 수강중인 [{1}] 자격검정이 [{2}]에 {3}에서 이뤄질 예정입니다.

☞사이트: https://edu.kfcf.or.kr", u.username, u.cname, u.stime.ToString("yyyy-MM-dd HH:mm"),u.place)); } } } } } return null; } public String KFCFLOGINAUTH(String userid) { if (string.IsNullOrEmpty(userid)) { return "0"; } Random r = new Random(); int key = r.Next(10000000, 99999999); if (Dao.Save("users.remotelogin.set", new Hashtable() { { "userid", userid.Trim() }, {"siteip", GetUserIP() }, { "remotekey", key} }) > 0) { return key.ToString(); } return "0"; } } }