using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Threading; using System.Threading.Tasks; using LotteryWebApp.Common; using LotteryWebApp.Extensions; using LotteryWebApp.Languages; using LotteryWebApp.Models; using LotteryWebApp.Service; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace LotteryWebApp.Controllers { [AutoValidateAntiforgeryToken] public class HomeController : BaseController { private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); IConfiguration configuration; private readonly IWebHostEnvironment webHostEnvironment; APIFunctions api = new APIFunctions(); bool flashViewEnabled = false; public HomeController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment) { configuration = _configuration; webHostEnvironment = hostEnvironment; } public String GetParameter(String key) { return configuration.GetSection(key).Value; } public IActionResult FlashView() { return View(); } public JsonResult SetCulture(string lang) { try { Response.Cookies.Append( CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(lang)), new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) } ); HttpContext.Session.SetComplexData("culture", lang); } catch (Exception ex) { log.Error("Exp: " + ex); } return Json(new { }); } public async Task IndexAsync( string termType, String uuid, String mcuid, String phonenumber, String token ) { //return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Home/Update"); //String param = "transactionId=" + "ABC" + "&requestId=" + "DEF" + "&money=" + "100"; //String url = CreatePrivateURL(configuration, param, "seconds", "0", "0", GetParameter("rsaPolicy")); HomeIndex_ViewModel model = new HomeIndex_ViewModel(); try { HttpContext.Session.SetComplexData("navigator", Constants.HOME_NAVIGATOR); CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture; String lang = currentCulture.Name; log.Info("lang: " + lang); String msisdnAuto = null; // check auto login ?uuid=681471d23b83f0a463e2dd5671ea0fc5 // ?uuid=681471d23b83f0a463e2dd5671ea0fc5&mcuid=6c6948a89908d83aec8c05be256970a1&mcapp=mocha if (!CheckAuthToken()) { //String uri = HttpContext.Request.QueryString.ToUriComponent().ToString(); log.Info("UUID: " + uuid); log.Info("token: " + token); //token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ1c2VySW5mb3IiLCJleHAiOjE3MTAzODE0NTksInV1aWQiOiI1MGEwYjNlNzk5ZjllZDU3YTE1ZjZjNjljODVmYTM3NSJ9.EgR-P_KzsHJ1XCdgeu25Gy_-qAHOfM9uv9RTZSvr0AA"; if (token != null) { // nhan dien qua token AutoLoginRequest autoLoginRequest = new AutoLoginRequest(); autoLoginRequest.token = token; AutoLoginResponse autoLoginResponse = await api.AutoLoginApiAsync( configuration, autoLoginRequest ); if (autoLoginResponse.code == Code.SUCCESS_CODE) { string msisdnReal = validateMsisdn( autoLoginResponse.data.msisdn.Substring(1) ); if (msisdnReal == "") { return Redirect( GetParameter(Constants.SUB_DOMAIN) + "/Account/Login" ); } // check local system CheckAccountRequest checkAccountRequest = new CheckAccountRequest { msisdn = msisdnReal, channel = Constants.WEB_CHANNEL, language = lang == "en" ? "0" : "1" }; CheckAccountResponse checkAccountResponse = api.CheckAccountApi( configuration, checkAccountRequest ); if (checkAccountResponse.status == Code.SUCCESS) { string tokenGetReal = checkAccountResponse.token; HttpContext.Session.SetComplexData("msisdn", msisdnReal); // create session // create new auth CreateAuthToken(); HttpContext.Session.SetComplexData("token", tokenGetReal); // load user status UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest { users = msisdnReal, token = tokenGetReal }; Profile profileGet = api.UserLoadProfileApi( configuration, userGetProfileRequest ); HttpContext.Session.SetComplexData("profile", profileGet); // load profile UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdnReal, token = tokenGetReal }; UserStatus userStatusGet = api.GetUserStatusApi( configuration, userStatusRequest ); HttpContext.Session.SetComplexData("userStatus", userStatusGet); } else { return Redirect( GetParameter(Constants.SUB_DOMAIN) + "/Account/Login" ); } } } else if (uuid != null) { // nhan dien thue bao //string uuid = HttpContext.Request.QueryString.ToUriComponent().ToString().Substring(6); //String uuid = data.Substring(data.Length - 5, data.Length); String res = await CheckAutoLogin(log, uuid); log.Info("uuid: " + uuid + " res: " + res); if (res != null) { dynamic json = JsonConvert.DeserializeObject(res); log.Info("res json: " + json); String code = json["code"]; if (code == "200") { String errorCode = json["errorCode"]; if (errorCode == "200") { msisdnAuto = json["data"]["msisdn"]; log.Info("msisdnAuto: " + msisdnAuto); } } } // redirect to OTP screen String msisdnDetect = validateMsisdn(msisdnAuto.Substring(1)); if (msisdnDetect != "") { // get OTP RegisterRequest request = new RegisterRequest(); request.Msisdn = msisdnDetect; RegisterResponse reset = api.UserForgotPasswordApi( configuration, request ); if (reset.status == Code.SUCCESS) { HttpContext.Session.Remove("regInfos"); HttpContext.Session.SetComplexData("msisdn", msisdnDetect); // return to login return Redirect( GetParameter(Constants.SUB_DOMAIN) + "/Account/Login?step=2" ); } } // return to view to get phone number model.termType = termType != null ? termType : Constants.NEW_YORK_BOLET_CODE; //model.uuid = uuid; //model.subDomain = GetParameter(Constants.SUB_DOMAIN); return Redirect( GetParameter(Constants.SUB_DOMAIN) + "/Account/Login?message=" + Lang.reset_after_1_minute ); } else if (phonenumber != null) { String channel = GetParameter(Constants.CHANNEL); if (channel == ApiConstants.WALLET) { //giai ma String msisdnRSA = DecryptRSA(configuration, phonenumber); // login HttpContext.Session.SetComplexData("msisdn", msisdnRSA); // create session // create new auth CreateAuthToken(); // login success --> store session HttpContext.Session.SetComplexData("token", ApiConstants.WALLET_TOKEN); // load profile // load user status UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest { users = msisdnRSA, token = ApiConstants.WALLET_TOKEN }; Profile profileGet = api.UserLoadProfileApi( configuration, userGetProfileRequest ); HttpContext.Session.SetComplexData("profile", profileGet); // load profile UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdnRSA, token = ApiConstants.WALLET_TOKEN }; UserStatus userStatusGet = api.GetUserStatusApi( configuration, userStatusRequest ); HttpContext.Session.SetComplexData("userStatus", userStatusGet); } else { // after auto detect String msisdnGet = phonenumber.Substring(1); String msisdnDetect = validateMsisdn(msisdnGet); if (msisdnDetect != "") { // auto login // reload user info HttpContext.Session.Remove("regInfos"); HttpContext.Session.SetComplexData("msisdn", msisdnDetect); // return to login return Redirect( GetParameter(Constants.SUB_DOMAIN) + "/Account/Login?step=2" ); } return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } } else { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } } Profile profile = HttpContext.Session.GetComplexData("profile"); UserStatus userStatus = HttpContext.Session.GetComplexData( "userStatus" ); // login success --> store session model.termType = termType != null ? termType : Constants.FLORIDA_BOLET_CODE; model.userStatus = userStatus; model.profile = profile; // get time to nearest term model.listTerm = new List(); String msisdn = HttpContext.Session.GetComplexData("msisdn"); String tokenGet = HttpContext.Session.GetComplexData("token"); String fromDate = DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy"); String toDate = DateTime.Now.ToString("dd/MM/yyyy"); // get winner GetTopWinnerRequest getTopWinnerRequest = new GetTopWinnerRequest(); getTopWinnerRequest.type = lang == "en" ? "0" : "1"; getTopWinnerRequest.token = tokenGet; GetTopWininerResponse getTopWininerResponse = api.GetTopWinnerApi( configuration, getTopWinnerRequest ); if (getTopWininerResponse.responseCode == Code.SUCCESS) { model.topWinner = getTopWininerResponse.list; HttpContext.Session.SetComplexData("topWinner", model.topWinner); } ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest { gameId = model.termType, token = tokenGet, type = Constants.TERM_HAS_NOT_RESULT_TYPE, order = Constants.DECS, fromDate = fromDate, toDate = toDate, rowsOnPage = Constants.ROW_ON_PAGE, seqPage = "1", id = Constants.ALL_DATA }; ResultOfTermResponse result = api.GetResultOfTermApi( configuration, resultOfTermRequest ); if (result.responseCode == Code.SESSION_EXPIRED) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } else if (result.responseCode == Code.SUCCESS) { model.listTerm = result.listTerm; } } catch (Exception ex) { log.Error(ex); return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } return View(model); } [ValidateAntiForgeryToken] public IActionResult TermResult(string termType) { if (!CheckAuthToken()) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } TermResultModel model = new TermResultModel(); model.listTerm = new List(); String msisdn = HttpContext.Session.GetComplexData("msisdn"); String token = HttpContext.Session.GetComplexData("token"); String fromDate = DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy"); String toDate = DateTime.Now.ToString("dd/MM/yyyy"); // get result ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest { gameId = termType, token = token, type = Constants.TERM_HAS_RESULT_TYPE, order = Constants.DECS, fromDate = fromDate, toDate = toDate, rowsOnPage = Constants.ROW_ON_PAGE, seqPage = "1", id = Constants.ALL_DATA }; ResultOfTermResponse result = api.GetResultOfTermApi( configuration, resultOfTermRequest ); if (result.responseCode == Code.SESSION_EXPIRED) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } else if (result.responseCode == Code.SUCCESS) { if (result.listTerm != null) model.listTerm = result.listTerm; model.termType = termType; } return PartialView("TermResult", model); } public IActionResult Transfer(string step, string walletType) { if (!CheckAuthToken()) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } HomeTransfer_ViewModel model = new HomeTransfer_ViewModel(); try { String msisdn = HttpContext.Session.GetComplexData("msisdn"); String token = HttpContext.Session.GetComplexData("token"); Profile profile = HttpContext.Session.GetComplexData("profile"); UserStatus userStatus = HttpContext.Session.GetComplexData( "userStatus" ); TransferMoneyRequest transferData = HttpContext.Session.GetComplexData("transferData"); model.step = step != null ? step : Constants.TRANSFER_SHOW; model.walletType = walletType != null ? walletType : Constants.BASIC_WALLET_TRANSFER; model.profile = profile; model.userStatus = userStatus; model.transferData = transferData; if (step == Constants.TRANSFER_RESULT) { // get payment info String paymentCode = HttpContext.Session.GetComplexData("paymentCode"); TransactionInfoRequest transactionInfoRequest = new TransactionInfoRequest { id = paymentCode, msisdn = msisdn, token = token }; TransactionInfoResponse transactionInfoResponse = api.GetTransactionInfoApi( configuration, transactionInfoRequest ); if (transactionInfoResponse.responseCode == Code.SESSION_EXPIRED) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } else if (transactionInfoResponse.responseCode == Code.SUCCESS) { TransferMoneyRequest transferMoneyRequest = HttpContext.Session.GetComplexData( "transferData" ); model.walletType = transferMoneyRequest.channelPayment; if (transactionInfoResponse.list.Count > 0) { model.transaction = transactionInfoResponse.list[0]; } else { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Home/Error"); } } } } catch (Exception ex) { log.Error(ex); } return View(model); } [ValidateAntiForgeryToken] public IActionResult TransactionConfirm_Action( string walletType, string receivernumber, string moneyon ) { try { if (!CheckAuthToken()) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } // send otp to user and show otp partial String msisdn = HttpContext.Session.GetComplexData("msisdn"); String token = HttpContext.Session.GetComplexData("token"); //String receiver = walletType == Constants.NATCASH_WALLET_TRANSFER ? null : msisdn; String receiver = msisdn; //if (walletType == Constants.NATCASH_WALLET_TRANSFER) //{ // receiver = validateMsisdn(receivernumber); // if (receiver == "") // { // return Json(new // { // code = Code.FAILURE, // message = Lang.phone_invalid // }); // } //} // save info to session TransferMoneyRequest transferMoneyRequest = new TransferMoneyRequest(); transferMoneyRequest.money = moneyon; transferMoneyRequest.msisdn = msisdn; transferMoneyRequest.msisdnReceive = receiver; transferMoneyRequest.channelPayment = walletType; HttpContext.Session.SetComplexData("transferData", transferMoneyRequest); return Json(new { code = Code.SUCCESS, }); } catch (Exception ex) { log.Error(ex); } return Json(new { code = Code.FAILURE, message = Lang.error_happened }); } [ValidateAntiForgeryToken] public JsonResult TransactionSendOTP_Action() { try { String msisdn = HttpContext.Session.GetComplexData("msisdn"); String token = HttpContext.Session.GetComplexData("token"); TransferMoneyRequest transferData = HttpContext.Session.GetComplexData("transferData"); String content = Lang.confirm_transfer_1 + " " + transferData.money + Lang.confirm_transfer_2 + " " + transferData.msisdnReceive + Lang.confirm_transfer_3; // send OTP SendOTPRequest sendOTPRequest = new SendOTPRequest(); sendOTPRequest.msisdn = msisdn; sendOTPRequest.token = token; SendOTPResponse sendOTPResponse = api.SendOTPApi(configuration, sendOTPRequest); return Json( new { code = int.Parse(sendOTPResponse.responseCode), message = GetLangFromCode(sendOTPResponse.responseCode), content = content, } ); } catch (Exception ex) { log.Error(ex); } return Json(new { code = Code.FAILURE, message = Lang.error_happened }); } [ValidateAntiForgeryToken] public JsonResult TransactionResentOTP_Action() { try { String msisdn = HttpContext.Session.GetComplexData("msisdn"); String token = HttpContext.Session.GetComplexData("token"); // send OTP SendOTPRequest sendOTPRequest = new SendOTPRequest { msisdn = msisdn, token = token }; SendOTPResponse sendOTPResponse = api.SendOTPApi(configuration, sendOTPRequest); return Json( new { code = int.Parse(sendOTPResponse.responseCode), message = GetLangFromCode(sendOTPResponse.responseCode), } ); } catch (Exception ex) { log.Error(ex); } return Json(new { code = Code.FAILURE, message = Lang.error_happened }); } [ValidateAntiForgeryToken] public JsonResult TransactionConfirmOTP_Action(string otp) { try { String token = HttpContext.Session.GetComplexData("token"); String msisdn = HttpContext.Session.GetComplexData("msisdn"); TransferMoneyRequest transferMoneyRequest = HttpContext.Session.GetComplexData("transferData"); transferMoneyRequest.otp = otp; transferMoneyRequest.token = token; TransferMoneyResponse transferMoneyResponse = api.TransferMoneyApi( configuration, transferMoneyRequest ); if (transferMoneyResponse.responseCode == Code.SUCCESS) { // save payment code //HttpContext.Session.DeleteComplexData("transferData"); HttpContext.Session.SetComplexData( "paymentCode", transferMoneyResponse.paymentCode ); // load user status UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest { users = msisdn, token = token }; Profile profile = api.UserLoadProfileApi(configuration, userGetProfileRequest); HttpContext.Session.SetComplexData("profile", profile); // load profile UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdn, token = token }; UserStatus userStatus = api.GetUserStatusApi(configuration, userStatusRequest); HttpContext.Session.SetComplexData("userStatus", userStatus); } return Json( new { code = int.Parse(transferMoneyResponse.responseCode), message = GetLangFromCode(transferMoneyResponse.responseCode), } ); } catch (Exception ex) { log.Error(ex); } return Json(new { code = Code.FAILURE, message = Lang.error_happened }); } public IActionResult Rules(string termType) { if (!CheckAuthToken()) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } HomeRules_ViewModel model = new HomeRules_ViewModel(); try { model.termType = termType != null ? termType : Constants.FLORIDA_BOLET_CODE; } catch (Exception ex) { log.Error(ex); } return View(model); } public IActionResult Results(string termType, string fromDate, string toDate) { if (!CheckAuthToken()) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } HomeResults_ViewModel model = new HomeResults_ViewModel(); try { model.termType = termType != null ? termType : Constants.NEW_YORK_BOLET_CODE; model.fromDate = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy"); model.toDate = toDate != null ? toDate : DateTime.Now.ToString("dd/MM/yyyy"); } catch (Exception ex) { log.Error(ex); } return View(model); } public IActionResult TermResultHistory(string termType, string fromDate, string toDate) { TermResultHistoryModel model = new TermResultHistoryModel(); if (!CheckAuthToken()) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } try { String msisdn = HttpContext.Session.GetComplexData("msisdn"); String token = HttpContext.Session.GetComplexData("token"); model.fromDate = fromDate != null ? DateTime .ParseExact(fromDate, "yyyy-MM-dd", CultureInfo.InvariantCulture) .ToString("dd/MM/yyyy") : DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy"); model.toDate = toDate != null ? DateTime .ParseExact(toDate, "yyyy-MM-dd", CultureInfo.InvariantCulture) .ToString("dd/MM/yyyy") : DateTime.Now.ToString("dd/MM/yyyy"); // get result ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest(); resultOfTermRequest.gameId = termType; resultOfTermRequest.token = token; resultOfTermRequest.type = Constants.TERM_HAS_RESULT_TYPE; resultOfTermRequest.order = Constants.DECS; resultOfTermRequest.fromDate = model.fromDate; resultOfTermRequest.toDate = model.toDate; resultOfTermRequest.rowsOnPage = Constants.ROW_ON_PAGE; resultOfTermRequest.seqPage = "1"; resultOfTermRequest.id = Constants.ALL_DATA; ResultOfTermResponse result = api.GetResultOfTermApi( configuration, resultOfTermRequest ); if (result.responseCode == Code.SESSION_EXPIRED) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } else if (result.responseCode == Code.SUCCESS) { model.listTerm = result.listTerm != null ? result.listTerm : new List(); model.termType = termType; } } catch (Exception ex) { log.Error(ex); } return PartialView("TermResultHistory", model); } public IActionResult Privacy() { return View(); } public IActionResult Update() { return View(); } public IActionResult FAQ() { if (!CheckAuthToken()) { return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login"); } HomeFAQ_ViewModel model = new HomeFAQ_ViewModel(); return View("FAQ", model); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View( new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier } ); } } }