BaseController.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. using System;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Net.Http;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Xml;
  9. using log4net;
  10. using LotteryWebApp.Common;
  11. using LotteryWebApp.Languages;
  12. using LotteryWebApp.Service;
  13. using Microsoft.AspNetCore.Http;
  14. using Microsoft.AspNetCore.Mvc;
  15. using Microsoft.Extensions.Configuration;
  16. using NcGamesWebView.Extensions;
  17. namespace LotteryWebApp.Controllers
  18. {
  19. public class BaseController : Controller
  20. {
  21. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
  22. public static string[] formats =
  23. {
  24. "M/d/yyyy h:mm:ss tt",
  25. "M/d/yyyy h:mm tt",
  26. "MM/dd/yyyy hh:mm:ss",
  27. "M/d/yyyy h:mm:ss",
  28. "M/d/yyyy hh:mm tt",
  29. "M/d/yyyy hh tt",
  30. "M/d/yyyy h:mm",
  31. "M/d/yyyy h:mm",
  32. "MM/dd/yyyy hh:mm",
  33. "M/dd/yyyy hh:mm",
  34. "MM/d/yyyy HH:mm:ss.ffffff, dd/MM/yyyy hh:mm",
  35. "M/dd/yyyy h:mm:ss tt",
  36. "dd/MM/yyyy HH:mm:ss"
  37. };
  38. public static string RandomString(int size, bool lowerCase)
  39. {
  40. StringBuilder builder = new StringBuilder();
  41. Random random = new Random();
  42. char ch;
  43. for (int i = 0; i < size; i++)
  44. {
  45. ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
  46. builder.Append(ch);
  47. }
  48. if (lowerCase)
  49. return builder.ToString().ToLower();
  50. return builder.ToString();
  51. }
  52. // validate phone number
  53. public static String validateMsisdn(String input)
  54. {
  55. String CountryCode = "509";
  56. if (input == null || input.Length == 0 || !long.TryParse(input, out long temp))
  57. {
  58. return "";
  59. }
  60. else if (
  61. (
  62. input.StartsWith("32")
  63. || input.StartsWith("33")
  64. || input.StartsWith("35")
  65. || input.StartsWith("40")
  66. || input.StartsWith("41")
  67. || input.StartsWith("42")
  68. || input.StartsWith("55")
  69. || input.StartsWith("43")
  70. || input.StartsWith("44")
  71. || input.StartsWith("45")
  72. || input.StartsWith("56")
  73. || input.StartsWith("58")
  74. )
  75. && input.Length == 8
  76. )
  77. {
  78. // 066200017 55797979
  79. input = CountryCode + input;
  80. return input.Trim();
  81. }
  82. else if (input.StartsWith(CountryCode) && input.Length == 11)
  83. {
  84. String removeCountry = input.Substring(3);
  85. if (
  86. removeCountry.StartsWith("32")
  87. || removeCountry.StartsWith("33")
  88. || removeCountry.StartsWith("35")
  89. || removeCountry.StartsWith("40")
  90. || removeCountry.StartsWith("41")
  91. || removeCountry.StartsWith("55")
  92. || removeCountry.StartsWith("42")
  93. || removeCountry.StartsWith("43")
  94. || removeCountry.StartsWith("44")
  95. || removeCountry.StartsWith("45")
  96. || removeCountry.StartsWith("56")
  97. || removeCountry.StartsWith("58")
  98. )
  99. {
  100. removeCountry = CountryCode + removeCountry;
  101. return input.Trim();
  102. }
  103. else
  104. {
  105. return "";
  106. }
  107. }
  108. else
  109. return "";
  110. }
  111. public string ConvertToGameID(string termType, string ticketType)
  112. {
  113. if (termType == Constants.BOULCHANS_CODE)
  114. {
  115. return Constants.BOULCHANS_CODE;
  116. }
  117. else if (
  118. termType == Constants.NEW_YORK_BOLET_CODE
  119. || termType == Constants.NEW_YORK_MAYRAJ_CODE
  120. || termType == Constants.NEW_YORK_LOTTO3_CODE
  121. )
  122. {
  123. switch (ticketType)
  124. {
  125. case Constants.BOLET_CODE:
  126. return Constants.NEW_YORK_BOLET_CODE;
  127. case Constants.MAYRAJ_CODE:
  128. return Constants.NEW_YORK_MAYRAJ_CODE;
  129. default:
  130. return Constants.NEW_YORK_LOTTO3_CODE;
  131. }
  132. }
  133. else
  134. {
  135. switch (ticketType)
  136. {
  137. case Constants.BOLET_CODE:
  138. return Constants.FLORIDA_BOLET_CODE;
  139. case Constants.MAYRAJ_CODE:
  140. return Constants.FLORIDA_MAYRAJ_CODE;
  141. default:
  142. return Constants.FLORIDA_LOTTO3_CODE;
  143. }
  144. }
  145. }
  146. public string ConvertToListGameID(String gameIDCode)
  147. {
  148. switch (gameIDCode)
  149. {
  150. case Constants.NEW_YORK_BOLET_CODE:
  151. return Constants.NEW_YORK_BOLET_CODE + "," + Constants.FLORIDA_BOLET_CODE;
  152. case Constants.NEW_YORK_MAYRAJ_CODE:
  153. return Constants.NEW_YORK_MAYRAJ_CODE + "," + Constants.FLORIDA_MAYRAJ_CODE;
  154. case Constants.BOULCHANS_CODE:
  155. return Constants.BOULCHANS_CODE;
  156. default:
  157. return Constants.NEW_YORK_LOTTO3_CODE + "," + Constants.FLORIDA_LOTTO3_CODE;
  158. }
  159. }
  160. public static string ConvertToWinType(String winType)
  161. {
  162. switch (winType)
  163. {
  164. case Constants.NOT_DRAW_CODE:
  165. return Lang.not_draw;
  166. case Constants.WIN_CODE:
  167. return Lang.win;
  168. default:
  169. return Lang.drawn;
  170. }
  171. }
  172. public static string ConvertGameIdToTerm(string gameId)
  173. {
  174. switch (gameId)
  175. {
  176. case Constants.NEW_YORK_BOLET_CODE:
  177. return Lang.new_york_lottery;
  178. case Constants.NEW_YORK_MAYRAJ_CODE:
  179. return Lang.new_york_lottery;
  180. case Constants.NEW_YORK_LOTTO3_CODE:
  181. return Lang.new_york_lottery;
  182. case Constants.FLORIDA_BOLET_CODE:
  183. return Lang.florida_lottery;
  184. case Constants.FLORIDA_MAYRAJ_CODE:
  185. return Lang.florida_lottery;
  186. case Constants.FLORIDA_LOTTO3_CODE:
  187. return Lang.florida_lottery;
  188. case Constants.BOULCHANS_CODE:
  189. return "BOULCHANS";
  190. default:
  191. return Lang.new_york_lottery;
  192. }
  193. }
  194. public static string ConvertGameIdToName(string gameId)
  195. {
  196. switch (gameId)
  197. {
  198. case Constants.NEW_YORK_BOLET_CODE:
  199. return Lang.bolet;
  200. case Constants.NEW_YORK_MAYRAJ_CODE:
  201. return Lang.maryaj;
  202. case Constants.NEW_YORK_LOTTO3_CODE:
  203. return Lang.lotto3;
  204. case Constants.FLORIDA_BOLET_CODE:
  205. return Lang.bolet;
  206. case Constants.FLORIDA_MAYRAJ_CODE:
  207. return Lang.maryaj;
  208. case Constants.FLORIDA_LOTTO3_CODE:
  209. return Lang.lotto3;
  210. case Constants.BOULCHANS_CODE:
  211. return "BOULCHANS";
  212. default:
  213. return Lang.new_york_lottery;
  214. }
  215. }
  216. public static string GetLangFromCode(string code)
  217. {
  218. switch (code)
  219. {
  220. case "1":
  221. return Lang.login_fail_wrong_pass;
  222. case "0":
  223. return Lang.success;
  224. case "-1":
  225. return Lang.error_happened;
  226. case "-2":
  227. return Lang.system_update;
  228. case "2":
  229. return Lang.term_timeout;
  230. case "3":
  231. return Lang.ticket_invalid;
  232. case "7":
  233. return "User was locked";
  234. case "9":
  235. return Lang.reset_after_1_minute;
  236. case "4":
  237. return Lang.params_invalid;
  238. case "20":
  239. return Lang.wallet_not_existed;
  240. case "21":
  241. return Lang.wallet_not_active;
  242. case "22":
  243. return Lang.younger_to_use;
  244. case "23":
  245. return Lang.account_not_existed;
  246. case "24":
  247. return Lang.internet_error;
  248. case "25":
  249. return Lang.pin_wrong;
  250. case "26":
  251. return Lang.in_blacklist;
  252. case "30":
  253. return Lang.otp_timeout;
  254. case "31":
  255. return Lang.otp_invalid;
  256. case "100":
  257. return Lang.no_permission;
  258. case "32":
  259. return Lang.not_enough_money_to_exchange;
  260. case "33":
  261. return Lang.over_each_exchange;
  262. case "34":
  263. return Lang.over_exchange_per_day;
  264. case "38":
  265. return Lang.promotion_code_invalid;
  266. case "39":
  267. return Lang.promotion_code_used;
  268. case "40":
  269. return Lang.promotion_code_inactive;
  270. case "41":
  271. return Lang.buying_code_not_existed;
  272. default:
  273. return code + " " + Lang.not_defined;
  274. }
  275. }
  276. public static string ConvertWalletTicket(string type)
  277. {
  278. switch (type)
  279. {
  280. case Constants.BASIC_WALLET_TICKET:
  281. return Lang.basic_account;
  282. default:
  283. return Lang.NatCash;
  284. }
  285. }
  286. // dateTime : MM/dd/yyyy
  287. public static long getCountTimeToTimestamp(string time)
  288. {
  289. // convert to Datetime
  290. DateTime endTime = DateTime.ParseExact(
  291. time,
  292. formats,
  293. new CultureInfo("en-US"),
  294. DateTimeStyles.None
  295. );
  296. TimeSpan elapsedTime = endTime - DateTime.Now;
  297. return (long)elapsedTime.TotalSeconds;
  298. }
  299. protected void CreateAuthToken()
  300. {
  301. // create session authen
  302. // Create the random value we will use to secure the session.
  303. string authId = GenerateAuthId();
  304. // Store the value in both our Session and a Cookie.
  305. HttpContext.Session.SetString("AuthorizationCookieId", authId);
  306. string sessionValue = HttpContext.Session.GetString("AuthorizationCookieId");
  307. //CookieOptions option = new CookieOptions
  308. //{
  309. // Expires = DateTime.Now.AddMinutes(1)
  310. //};
  311. //Response.Cookies.Append("Key Name", "Value", option);
  312. CookieOptions options = new CookieOptions()
  313. {
  314. //Path = "/",
  315. //HttpOnly = true,
  316. //Secure = false,
  317. //SameSite = SameSiteMode.None
  318. Expires = DateTime.Now.AddMinutes(60)
  319. };
  320. HttpContext.Response.Cookies.Append("AuthorizationCookie", authId, options);
  321. string cookieValue = HttpContext.Request.Cookies["AuthorizationCookie"];
  322. }
  323. protected bool CheckAuthToken()
  324. {
  325. //return true;
  326. string cookieValue = HttpContext.Request.Cookies["AuthorizationCookie"];
  327. string sessionValue = HttpContext.Session.GetString("AuthorizationCookieId");
  328. if (cookieValue == null || sessionValue == null || cookieValue != sessionValue)
  329. {
  330. // Invalidate the session and log out the current user.
  331. return false;
  332. //return true;
  333. }
  334. //if (sessionValue == null)
  335. //{
  336. // // Invalidate the session and log out the current user.
  337. // return false;
  338. //}
  339. else
  340. {
  341. return true;
  342. }
  343. }
  344. protected bool ClearCache()
  345. {
  346. HttpContext.Session.Clear();
  347. foreach (var cookieKey in HttpContext.Request.Cookies.Keys)
  348. {
  349. HttpContext.Response.Cookies.Delete(cookieKey);
  350. }
  351. return true;
  352. }
  353. private string GenerateAuthId()
  354. {
  355. using (RandomNumberGenerator rng = new RNGCryptoServiceProvider())
  356. {
  357. byte[] tokenData = new byte[32];
  358. rng.GetBytes(tokenData);
  359. return Convert.ToBase64String(tokenData);
  360. }
  361. }
  362. protected String DecryptRSA(IConfiguration _configuration, String data)
  363. {
  364. RSACryptoServiceProvider rsaPrivate = new RSACryptoServiceProvider();
  365. rsaPrivate.FromXmlFile(
  366. Path.Combine(
  367. Directory.GetCurrentDirectory(),
  368. "",
  369. _configuration["rsaPrivateKeyXml"]
  370. )
  371. );
  372. byte[] byteEntry = Convert.FromBase64String(data);
  373. byte[] byteText = rsaPrivate.Decrypt(byteEntry, false);
  374. return Encoding.UTF8.GetString(byteText);
  375. }
  376. protected async Task<string> CheckAutoLogin(ILog log, String uuid)
  377. {
  378. string res = null;
  379. try
  380. {
  381. HttpClient httpClient = new HttpClient();
  382. MultipartFormDataContent form = new MultipartFormDataContent();
  383. form.Add(new StringContent(uuid), "uuid");
  384. HttpResponseMessage response = await httpClient.PostAsync(
  385. Constants.URL_GET_MSISDN,
  386. form
  387. );
  388. response.EnsureSuccessStatusCode();
  389. httpClient.Dispose();
  390. res = response.Content.ReadAsStringAsync().Result;
  391. }
  392. catch (Exception ex)
  393. {
  394. Console.WriteLine(ex.Message);
  395. log.Debug("Exp: " + ex);
  396. }
  397. return res;
  398. }
  399. public static string CreatePrivateURL(
  400. IConfiguration _configuration,
  401. string urlString,
  402. string durationUnits,
  403. string durationNumber,
  404. string startIntervalFromNow,
  405. string pathToPolicyStmnt
  406. )
  407. {
  408. TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);
  409. TimeSpan timeSpanToStart = GetDurationByUnits(durationUnits, startIntervalFromNow);
  410. if (null == timeSpanToStart)
  411. return "Invalid duration units. Valid options: seconds, minutes, hours, or days";
  412. string strPolicy = urlString;
  413. // Read the policy into a byte buffer.
  414. byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);
  415. // Base64 encode URL-safe policy statement.
  416. //string urlSafePolicy = ToUrlSafeBase64String(bufferPolicy);
  417. // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
  418. byte[] bufferPolicyHash;
  419. using (SHA1CryptoServiceProvider cryptoSHA1 = new SHA1CryptoServiceProvider())
  420. {
  421. bufferPolicyHash = cryptoSHA1.ComputeHash(bufferPolicy);
  422. // Initialize the RSACryptoServiceProvider object.
  423. RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
  424. XmlDocument xmlPrivateKey = new XmlDocument();
  425. // Load the PrivateKey.xml file generated by ConvertPEMtoXML.
  426. xmlPrivateKey.Load(_configuration["rsaPrivateKeyXml"]);
  427. // Format the RSACryptoServiceProvider providerRSA and create the signature.
  428. providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
  429. RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(
  430. providerRSA
  431. );
  432. RSAFormatter.SetHashAlgorithm("SHA1");
  433. byte[] signedHash = RSAFormatter.CreateSignature(bufferPolicyHash);
  434. // Convert the signed policy to URL safe base 64 encoding.
  435. string strSignedPolicy = ToUrlSafeBase64String(signedHash);
  436. return urlString + "&signature=" + strSignedPolicy;
  437. }
  438. }
  439. public static string ToUrlSafeBase64String(byte[] bytes)
  440. {
  441. return System.Convert.ToBase64String(bytes);
  442. //.Replace('+', '-')
  443. //.Replace('=', '_')
  444. //.Replace('/', '~');
  445. }
  446. public static string CreatePolicyStatement(
  447. string policyStmnt,
  448. string resourceUrl,
  449. DateTime startTime,
  450. DateTime endTime
  451. )
  452. {
  453. // Create the policy statement.
  454. FileStream streamPolicy = new FileStream(policyStmnt, FileMode.Open, FileAccess.Read);
  455. using (StreamReader reader = new StreamReader(streamPolicy))
  456. {
  457. string strPolicy = reader.ReadToEnd();
  458. TimeSpan startTimeSpanFromNow = (startTime - DateTime.Now);
  459. TimeSpan endTimeSpanFromNow = (endTime - DateTime.Now);
  460. TimeSpan intervalStart =
  461. (DateTime.UtcNow.Add(startTimeSpanFromNow))
  462. - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
  463. TimeSpan intervalEnd =
  464. (DateTime.UtcNow.Add(endTimeSpanFromNow))
  465. - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
  466. int startTimestamp = (int)intervalStart.TotalSeconds; // START_TIME
  467. int endTimestamp = (int)intervalEnd.TotalSeconds; // END_TIME
  468. if (startTimestamp > endTimestamp)
  469. return "Error!";
  470. // Replace variables in the policy statement.
  471. strPolicy = strPolicy.Replace("RESOURCE", resourceUrl);
  472. //strPolicy = strPolicy.Replace("START_TIME", startTimestamp.ToString());
  473. //strPolicy = strPolicy.Replace("END_TIME", endTimestamp.ToString());
  474. //strPolicy = strPolicy.Replace("EXPIRES", endTimestamp.ToString());
  475. return resourceUrl;
  476. }
  477. }
  478. public static TimeSpan GetDuration(string units, string numUnits)
  479. {
  480. TimeSpan timeSpanInterval = new TimeSpan();
  481. switch (units)
  482. {
  483. case "seconds":
  484. timeSpanInterval = new TimeSpan(0, 0, 0, int.Parse(numUnits));
  485. break;
  486. case "minutes":
  487. timeSpanInterval = new TimeSpan(0, 0, int.Parse(numUnits), 0);
  488. break;
  489. case "hours":
  490. timeSpanInterval = new TimeSpan(0, int.Parse(numUnits), 0, 0);
  491. break;
  492. case "days":
  493. timeSpanInterval = new TimeSpan(int.Parse(numUnits), 0, 0, 0);
  494. break;
  495. default:
  496. Console.WriteLine("Invalid time units; use seconds, minutes, hours, or days");
  497. break;
  498. }
  499. return timeSpanInterval;
  500. }
  501. private static TimeSpan GetDurationByUnits(
  502. string durationUnits,
  503. string startIntervalFromNow
  504. )
  505. {
  506. TimeSpan timeSpanInterval = new TimeSpan();
  507. switch (durationUnits)
  508. {
  509. case "seconds":
  510. timeSpanInterval = new TimeSpan(0, 0, int.Parse(startIntervalFromNow));
  511. break;
  512. case "minutes":
  513. timeSpanInterval = new TimeSpan(0, int.Parse(startIntervalFromNow), 0);
  514. break;
  515. case "hours":
  516. timeSpanInterval = new TimeSpan(int.Parse(startIntervalFromNow), 0, 0);
  517. break;
  518. case "days":
  519. timeSpanInterval = new TimeSpan(int.Parse(startIntervalFromNow), 0, 0, 0);
  520. break;
  521. default:
  522. timeSpanInterval = new TimeSpan(0, 0, 0, 0);
  523. break;
  524. }
  525. return timeSpanInterval;
  526. }
  527. public static string ConvertDrawnTimeFromTerm(string type, TermObj termObj)
  528. {
  529. string drawnTime = DateTime
  530. .ParseExact(termObj.randomDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture)
  531. .ToString("HH:mm");
  532. string endTime = DateTime
  533. .ParseExact(termObj.endDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture)
  534. .ToString("HH:mm");
  535. switch (type)
  536. {
  537. case Constants.NEW_YORK_BOLET_CODE:
  538. return drawnTime;
  539. case Constants.NEW_YORK_MAYRAJ_CODE:
  540. return drawnTime;
  541. case Constants.NEW_YORK_LOTTO3_CODE:
  542. return drawnTime;
  543. case Constants.FLORIDA_BOLET_CODE:
  544. return drawnTime;
  545. case Constants.FLORIDA_MAYRAJ_CODE:
  546. return drawnTime;
  547. case Constants.FLORIDA_LOTTO3_CODE:
  548. return drawnTime;
  549. case Constants.BOULCHANS_CODE:
  550. return endTime;
  551. default:
  552. return Lang.new_york_lottery;
  553. }
  554. }
  555. public static string ConvertDrawnTimeFromTicket(string type, Ticket ticket)
  556. {
  557. string drawnTime = DateTime
  558. .ParseExact(
  559. ticket.termRandomDate,
  560. "dd/MM/yyyy HH:mm:ss",
  561. CultureInfo.InvariantCulture
  562. )
  563. .ToString("HH:mm");
  564. string endTime = DateTime
  565. .ParseExact(ticket.termEndDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture)
  566. .ToString("HH:mm");
  567. switch (type)
  568. {
  569. case Constants.NEW_YORK_BOLET_CODE:
  570. return drawnTime;
  571. case Constants.NEW_YORK_MAYRAJ_CODE:
  572. return drawnTime;
  573. case Constants.NEW_YORK_LOTTO3_CODE:
  574. return drawnTime;
  575. case Constants.FLORIDA_BOLET_CODE:
  576. return drawnTime;
  577. case Constants.FLORIDA_MAYRAJ_CODE:
  578. return drawnTime;
  579. case Constants.FLORIDA_LOTTO3_CODE:
  580. return drawnTime;
  581. case Constants.BOULCHANS_CODE:
  582. return endTime;
  583. default:
  584. return Lang.new_york_lottery;
  585. }
  586. }
  587. }
  588. }