AuthController.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. <?php
  2. namespace App\Controllers;
  3. use App\Models\{
  4. User,
  5. LoginIp,
  6. InviteCode,
  7. EmailVerify
  8. };
  9. use App\Utils\{
  10. GA,
  11. Hash,
  12. Check,
  13. Tools,
  14. Radius,
  15. Geetest,
  16. TelegramSessionManager
  17. };
  18. use App\Services\{
  19. Auth,
  20. Mail,
  21. Config
  22. };
  23. use voku\helper\AntiXSS;
  24. use Exception;
  25. /**
  26. * AuthController
  27. */
  28. class AuthController extends BaseController
  29. {
  30. public function login()
  31. {
  32. $GtSdk = null;
  33. $recaptcha_sitekey = null;
  34. if ($_ENV['enable_login_captcha'] === true) {
  35. switch ($_ENV['captcha_provider']) {
  36. case 'recaptcha':
  37. $recaptcha_sitekey = $_ENV['recaptcha_sitekey'];
  38. break;
  39. case 'geetest':
  40. $uid = time() . random_int(1, 10000);
  41. $GtSdk = Geetest::get($uid);
  42. break;
  43. }
  44. }
  45. if ($_ENV['enable_telegram'] === true) {
  46. $login_text = TelegramSessionManager::add_login_session();
  47. $login = explode('|', $login_text);
  48. $login_token = $login[0];
  49. $login_number = $login[1];
  50. } else {
  51. $login_token = '';
  52. $login_number = '';
  53. }
  54. return $this->view()
  55. ->assign('geetest_html', $GtSdk)
  56. ->assign('login_token', $login_token)
  57. ->assign('login_number', $login_number)
  58. ->assign('telegram_bot', $_ENV['telegram_bot'])
  59. ->assign('base_url', $_ENV['baseUrl'])
  60. ->assign('recaptcha_sitekey', $recaptcha_sitekey)
  61. ->display('auth/login.tpl');
  62. }
  63. public function getCaptcha($request, $response, $args)
  64. {
  65. $GtSdk = null;
  66. $recaptcha_sitekey = null;
  67. if ($_ENV['captcha_provider'] != '') {
  68. switch ($_ENV['captcha_provider']) {
  69. case 'recaptcha':
  70. $recaptcha_sitekey = $_ENV['recaptcha_sitekey'];
  71. $res['recaptchaKey'] = $recaptcha_sitekey;
  72. break;
  73. case 'geetest':
  74. $uid = time() . random_int(1, 10000);
  75. $GtSdk = Geetest::get($uid);
  76. $res['GtSdk'] = $GtSdk;
  77. break;
  78. }
  79. }
  80. $res['respon'] = 1;
  81. return $response->getBody()->write(json_encode($res));
  82. }
  83. public function loginHandle($request, $response, $args)
  84. {
  85. // $data = $request->post('sdf');
  86. $email = $request->getParam('email');
  87. $email = trim($email);
  88. $email = strtolower($email);
  89. $passwd = $request->getParam('passwd');
  90. $code = $request->getParam('code');
  91. $rememberMe = $request->getParam('remember_me');
  92. if ($_ENV['enable_login_captcha'] === true) {
  93. switch ($_ENV['captcha_provider']) {
  94. case 'recaptcha':
  95. $recaptcha = $request->getParam('recaptcha');
  96. if ($recaptcha == '') {
  97. $ret = false;
  98. } else {
  99. $json = file_get_contents('https://recaptcha.net/recaptcha/api/siteverify?secret=' . $_ENV['recaptcha_secret'] . '&response=' . $recaptcha);
  100. $ret = json_decode($json)->success;
  101. }
  102. break;
  103. case 'geetest':
  104. $ret = Geetest::verify($request->getParam('geetest_challenge'), $request->getParam('geetest_validate'), $request->getParam('geetest_seccode'));
  105. break;
  106. }
  107. if (!$ret) {
  108. $res['ret'] = 0;
  109. $res['msg'] = '系统无法接受您的验证结果,请刷新页面后重试。';
  110. return $response->getBody()->write(json_encode($res));
  111. }
  112. }
  113. // Handle Login
  114. $user = User::where('email', '=', $email)->first();
  115. if ($user == null) {
  116. $rs['ret'] = 0;
  117. $rs['msg'] = '邮箱不存在';
  118. return $response->getBody()->write(json_encode($rs));
  119. }
  120. if (!Hash::checkPassword($user->pass, $passwd)) {
  121. $rs['ret'] = 0;
  122. $rs['msg'] = '邮箱或者密码错误';
  123. $loginIP = new LoginIp();
  124. $loginIP->ip = $_SERVER['REMOTE_ADDR'];
  125. $loginIP->userid = $user->id;
  126. $loginIP->datetime = time();
  127. $loginIP->type = 1;
  128. $loginIP->save();
  129. return $response->getBody()->write(json_encode($rs));
  130. }
  131. $time = 3600 * 24;
  132. if ($rememberMe) {
  133. $time = 3600 * 24 * ($_ENV['rememberMeDuration'] ?: 7);
  134. }
  135. if ($user->ga_enable == 1) {
  136. $ga = new GA();
  137. $rcode = $ga->verifyCode($user->ga_token, $code);
  138. if (!$rcode) {
  139. $res['ret'] = 0;
  140. $res['msg'] = '两步验证码错误,如果您是丢失了生成器或者错误地设置了这个选项,您可以尝试重置密码,即可取消这个选项。';
  141. return $response->getBody()->write(json_encode($res));
  142. }
  143. }
  144. Auth::login($user->id, $time);
  145. $rs['ret'] = 1;
  146. $rs['msg'] = '登录成功';
  147. $loginIP = new LoginIp();
  148. $loginIP->ip = $_SERVER['REMOTE_ADDR'];
  149. $loginIP->userid = $user->id;
  150. $loginIP->datetime = time();
  151. $loginIP->type = 0;
  152. $loginIP->save();
  153. return $response->getBody()->write(json_encode($rs));
  154. }
  155. public function qrcode_loginHandle($request, $response, $args)
  156. {
  157. // $data = $request->post('sdf');
  158. $token = $request->getParam('token');
  159. $number = $request->getParam('number');
  160. $ret = TelegramSessionManager::step2_verify_login_session($token, $number);
  161. if (!$ret) {
  162. $res['ret'] = 0;
  163. $res['msg'] = '此令牌无法被使用。';
  164. return $response->getBody()->write(json_encode($res));
  165. }
  166. // Handle Login
  167. $user = User::where('id', '=', $ret)->first();
  168. // @todo
  169. $time = 3600 * 24;
  170. Auth::login($user->id, $time);
  171. $rs['ret'] = 1;
  172. $rs['msg'] = '登录成功';
  173. $this->logUserIp($user->id, $_SERVER['REMOTE_ADDR']);
  174. return $response->getBody()->write(json_encode($rs));
  175. }
  176. private function logUserIp($id, $ip)
  177. {
  178. $loginip = new LoginIp();
  179. $loginip->ip = $ip;
  180. $loginip->userid = $id;
  181. $loginip->datetime = time();
  182. $loginip->type = 0;
  183. $loginip->save();
  184. }
  185. public function register($request, $response, $next)
  186. {
  187. $ary = $request->getQueryParams();
  188. $code = '';
  189. if (isset($ary['code'])) {
  190. $antiXss = new AntiXSS();
  191. $code = $antiXss->xss_clean($ary['code']);
  192. }
  193. $GtSdk = null;
  194. $recaptcha_sitekey = null;
  195. if ($_ENV['enable_reg_captcha'] === true) {
  196. switch ($_ENV['captcha_provider']) {
  197. case 'recaptcha':
  198. $recaptcha_sitekey = $_ENV['recaptcha_sitekey'];
  199. break;
  200. case 'geetest':
  201. $uid = time() . random_int(1, 10000);
  202. $GtSdk = Geetest::get($uid);
  203. break;
  204. }
  205. }
  206. if ($_ENV['enable_telegram'] === true) {
  207. $login_text = TelegramSessionManager::add_login_session();
  208. $login = explode('|', $login_text);
  209. $login_token = $login[0];
  210. $login_number = $login[1];
  211. } else {
  212. $login_token = '';
  213. $login_number = '';
  214. }
  215. return $this->view()
  216. ->assign('geetest_html', $GtSdk)
  217. ->assign('enable_email_verify', Config::getconfig('Register.bool.Enable_email_verify'))
  218. ->assign('code', $code)
  219. ->assign('recaptcha_sitekey', $recaptcha_sitekey)
  220. ->assign('telegram_bot', $_ENV['telegram_bot'])
  221. ->assign('base_url', $_ENV['baseUrl'])
  222. ->assign('login_token', $login_token)
  223. ->assign('login_number', $login_number)
  224. ->display('auth/register.tpl');
  225. }
  226. public function sendVerify($request, $response, $next)
  227. {
  228. if (Config::getconfig('Register.bool.Enable_email_verify')) {
  229. $email = $request->getParam('email');
  230. $email = trim($email);
  231. if ($email == '') {
  232. $res['ret'] = 0;
  233. $res['msg'] = '未填写邮箱';
  234. return $response->getBody()->write(json_encode($res));
  235. }
  236. // check email format
  237. if (!Check::isEmailLegal($email)) {
  238. $res['ret'] = 0;
  239. $res['msg'] = '邮箱无效';
  240. return $response->getBody()->write(json_encode($res));
  241. }
  242. $user = User::where('email', '=', $email)->first();
  243. if ($user != null) {
  244. $res['ret'] = 0;
  245. $res['msg'] = '此邮箱已经注册';
  246. return $response->getBody()->write(json_encode($res));
  247. }
  248. $ipcount = EmailVerify::where('ip', '=', $_SERVER['REMOTE_ADDR'])->where('expire_in', '>', time())->count();
  249. if ($ipcount >= (int) Config::getconfig('Register.string.Email_verify_iplimit')) {
  250. $res['ret'] = 0;
  251. $res['msg'] = '此IP请求次数过多';
  252. return $response->getBody()->write(json_encode($res));
  253. }
  254. $mailcount = EmailVerify::where('email', '=', $email)->where('expire_in', '>', time())->count();
  255. if ($mailcount >= 3) {
  256. $res['ret'] = 0;
  257. $res['msg'] = '此邮箱请求次数过多';
  258. return $response->getBody()->write(json_encode($res));
  259. }
  260. $code = Tools::genRandomNum(6);
  261. $ev = new EmailVerify();
  262. $ev->expire_in = time() + (int) Config::getconfig('Register.string.Email_verify_ttl');
  263. $ev->ip = $_SERVER['REMOTE_ADDR'];
  264. $ev->email = $email;
  265. $ev->code = $code;
  266. $ev->save();
  267. $subject = $_ENV['appName'] . '- 验证邮件';
  268. try {
  269. Mail::send($email, $subject, 'auth/verify.tpl', [
  270. 'code' => $code, 'expire' => date('Y-m-d H:i:s', time() + (int) Config::getconfig('Register.string.Email_verify_ttl'))
  271. ], [
  272. //BASE_PATH.'/public/assets/email/styles.css'
  273. ]);
  274. } catch (Exception $e) {
  275. $res['ret'] = 1;
  276. $res['msg'] = '邮件发送失败,请联系网站管理员。';
  277. return $response->getBody()->write(json_encode($res));
  278. }
  279. $res['ret'] = 1;
  280. $res['msg'] = '验证码发送成功,请查收邮件。';
  281. return $response->getBody()->write(json_encode($res));
  282. }
  283. $res['ret'] = 0;
  284. return $response->getBody()->write(json_encode($res));
  285. }
  286. public function register_helper($name, $email, $passwd, $code, $imtype, $imvalue, $telegram_id)
  287. {
  288. if (Config::getconfig('Register.string.Mode') === 'close') {
  289. $res['ret'] = 0;
  290. $res['msg'] = '未开放注册。';
  291. return $res;
  292. }
  293. //dumplin:1、邀请人等级为0则邀请码不可用;2、邀请人invite_num为可邀请次数,填负数则为无限
  294. $c = InviteCode::where('code', $code)->first();
  295. if ($c == null) {
  296. if (Config::getconfig('Register.string.Mode') === 'invite') {
  297. $res['ret'] = 0;
  298. $res['msg'] = '邀请码无效';
  299. return $res;
  300. }
  301. } elseif ($c->user_id != 0) {
  302. $gift_user = User::where('id', '=', $c->user_id)->first();
  303. if ($gift_user == null) {
  304. $res['ret'] = 0;
  305. $res['msg'] = '邀请人不存在';
  306. return $res;
  307. }
  308. if ($gift_user->class == 0) {
  309. $res['ret'] = 0;
  310. $res['msg'] = '邀请人不是VIP';
  311. return $res;
  312. }
  313. if ($gift_user->invite_num == 0) {
  314. $res['ret'] = 0;
  315. $res['msg'] = '邀请人可用邀请次数为0';
  316. return $res;
  317. }
  318. }
  319. // do reg user
  320. $user = new User();
  321. $antiXss = new AntiXSS();
  322. $user->user_name = $antiXss->xss_clean($name);
  323. $user->email = $email;
  324. $user->pass = Hash::passwordHash($passwd);
  325. $user->passwd = Tools::genRandomChar(6);
  326. $user->port = Tools::getAvPort();
  327. $user->t = 0;
  328. $user->u = 0;
  329. $user->d = 0;
  330. $user->method = Config::getconfig('Register.string.defaultMethod');
  331. $user->protocol = Config::getconfig('Register.string.defaultProtocol');
  332. $user->protocol_param = Config::getconfig('Register.string.defaultProtocol_param');
  333. $user->obfs = Config::getconfig('Register.string.defaultObfs');
  334. $user->obfs_param = Config::getconfig('Register.string.defaultObfs_param');
  335. $user->forbidden_ip = $_ENV['reg_forbidden_ip'];
  336. $user->forbidden_port = $_ENV['reg_forbidden_port'];
  337. $user->im_type = $imtype;
  338. $user->im_value = $antiXss->xss_clean($imvalue);
  339. $user->transfer_enable = Tools::toGB((int) Config::getconfig('Register.string.defaultTraffic'));
  340. $user->invite_num = (int) Config::getconfig('Register.string.defaultInviteNum');
  341. $user->auto_reset_day = $_ENV['reg_auto_reset_day'];
  342. $user->auto_reset_bandwidth = $_ENV['reg_auto_reset_bandwidth'];
  343. $user->money = 0;
  344. $user->sendDailyMail = Config::getconfig('Register.bool.send_dailyEmail');
  345. //dumplin:填写邀请人,写入邀请奖励
  346. $user->ref_by = 0;
  347. if ($c != null && $c->user_id != 0) {
  348. $user->ref_by = $c->user_id;
  349. $user->money = (int) Config::getconfig('Register.string.defaultInvite_get_money');
  350. $gift_user->transfer_enable += $_ENV['invite_gift'] * 1024 * 1024 * 1024;
  351. --$gift_user->invite_num;
  352. $gift_user->save();
  353. }
  354. if ($telegram_id) {
  355. $user->telegram_id = $telegram_id;
  356. }
  357. $user->class_expire = date('Y-m-d H:i:s', time() + (int) Config::getconfig('Register.string.defaultClass_expire') * 3600);
  358. $user->class = (int) Config::getconfig('Register.string.defaultClass');
  359. $user->node_connector = (int) Config::getconfig('Register.string.defaultConn');
  360. $user->node_speedlimit = (int) Config::getconfig('Register.string.defaultSpeedlimit');
  361. $user->expire_in = date('Y-m-d H:i:s', time() + (int) Config::getconfig('Register.string.defaultExpire_in') * 86400);
  362. $user->reg_date = date('Y-m-d H:i:s');
  363. $user->reg_ip = $_SERVER['REMOTE_ADDR'];
  364. $user->plan = 'A';
  365. $user->theme = $_ENV['theme'];
  366. $groups = explode(',', $_ENV['random_group']);
  367. $user->node_group = $groups[array_rand($groups)];
  368. $ga = new GA();
  369. $secret = $ga->createSecret();
  370. $user->ga_token = $secret;
  371. $user->ga_enable = 0;
  372. if ($user->save()) {
  373. Auth::login($user->id, 3600);
  374. $this->logUserIp($user->id, $_SERVER['REMOTE_ADDR']);
  375. $res['ret'] = 1;
  376. $res['msg'] = '注册成功!正在进入登录界面';
  377. Radius::Add($user, $user->passwd);
  378. return $res;
  379. }
  380. $res['ret'] = 0;
  381. $res['msg'] = '未知错误';
  382. return $res;
  383. }
  384. public function registerHandle($request, $response)
  385. {
  386. if (Config::getconfig('Register.string.Mode') === 'close') {
  387. $res['ret'] = 0;
  388. $res['msg'] = '未开放注册。';
  389. return $response->getBody()->write(json_encode($res));
  390. }
  391. $name = $request->getParam('name');
  392. $email = $request->getParam('email');
  393. $email = trim($email);
  394. $email = strtolower($email);
  395. $passwd = $request->getParam('passwd');
  396. $repasswd = $request->getParam('repasswd');
  397. $code = $request->getParam('code');
  398. $code = trim($code);
  399. $imtype = $request->getParam('imtype');
  400. $emailcode = $request->getParam('emailcode');
  401. $emailcode = trim($emailcode);
  402. // 前端传入参数为wechat, 后续作为 im_value使用,变量改名为 im_value
  403. $imvalue = $request->getParam('wechat');
  404. $imvalue = trim($imvalue);
  405. if ($_ENV['enable_reg_captcha'] === true) {
  406. switch ($_ENV['captcha_provider']) {
  407. case 'recaptcha':
  408. $recaptcha = $request->getParam('recaptcha');
  409. if ($recaptcha == '') {
  410. $ret = false;
  411. } else {
  412. $json = file_get_contents('https://recaptcha.net/recaptcha/api/siteverify?secret=' . $_ENV['recaptcha_secret'] . '&response=' . $recaptcha);
  413. $ret = json_decode($json)->success;
  414. }
  415. break;
  416. case 'geetest':
  417. $ret = Geetest::verify($request->getParam('geetest_challenge'), $request->getParam('geetest_validate'), $request->getParam('geetest_seccode'));
  418. break;
  419. }
  420. if (!$ret) {
  421. $res['ret'] = 0;
  422. $res['msg'] = '系统无法接受您的验证结果,请刷新页面后重试。';
  423. return $response->getBody()->write(json_encode($res));
  424. }
  425. }
  426. // check email format
  427. if (!Check::isEmailLegal($email)) {
  428. $res['ret'] = 0;
  429. $res['msg'] = '邮箱无效';
  430. return $response->getBody()->write(json_encode($res));
  431. }
  432. // check email
  433. $user = User::where('email', $email)->first();
  434. if ($user != null) {
  435. $res['ret'] = 0;
  436. $res['msg'] = '邮箱已经被注册了';
  437. return $response->getBody()->write(json_encode($res));
  438. }
  439. if (Config::getconfig('Register.bool.Enable_email_verify')) {
  440. $mailcount = EmailVerify::where('email', '=', $email)->where('code', '=', $emailcode)->where('expire_in', '>', time())->first();
  441. if ($mailcount == null) {
  442. $res['ret'] = 0;
  443. $res['msg'] = '您的邮箱验证码不正确';
  444. return $response->getBody()->write(json_encode($res));
  445. }
  446. }
  447. // check pwd length
  448. if (strlen($passwd) < 8) {
  449. $res['ret'] = 0;
  450. $res['msg'] = '密码请大于8位';
  451. return $response->getBody()->write(json_encode($res));
  452. }
  453. // check pwd re
  454. if ($passwd != $repasswd) {
  455. $res['ret'] = 0;
  456. $res['msg'] = '两次密码输入不符';
  457. return $response->getBody()->write(json_encode($res));
  458. }
  459. if ($imtype == '' || $imvalue == '') {
  460. $res['ret'] = 0;
  461. $res['msg'] = '请填上你的联络方式';
  462. return $response->getBody()->write(json_encode($res));
  463. }
  464. $user = User::where('im_value', $imvalue)->where('im_type', $imtype)->first();
  465. if ($user != null) {
  466. $res['ret'] = 0;
  467. $res['msg'] = '此联络方式已注册';
  468. return $response->getBody()->write(json_encode($res));
  469. }
  470. if (Config::getconfig('Register.bool.Enable_email_verify')) {
  471. EmailVerify::where('email', '=', $email)->delete();
  472. }
  473. $res = $this->register_helper($name, $email, $passwd, $code, $imtype, $imvalue, 0);
  474. return $response->getBody()->write(json_encode($res));
  475. }
  476. public function logout($request, $response, $next)
  477. {
  478. Auth::logout();
  479. return $response->withStatus(302)->withHeader('Location', '/auth/login');
  480. }
  481. public function qrcode_check($request, $response, $args)
  482. {
  483. $token = $request->getParam('token');
  484. $number = $request->getParam('number');
  485. $user = Auth::getUser();
  486. if ($user->isLogin) {
  487. $res['ret'] = 0;
  488. return $response->getBody()->write(json_encode($res));
  489. }
  490. if ($_ENV['enable_telegram'] === true) {
  491. $ret = TelegramSessionManager::check_login_session($token, $number);
  492. $res['ret'] = $ret;
  493. return $response->getBody()->write(json_encode($res));
  494. }
  495. $res['ret'] = 0;
  496. return $response->getBody()->write(json_encode($res));
  497. }
  498. public function telegram_oauth($request, $response, $args)
  499. {
  500. if ($_ENV['enable_telegram'] === true) {
  501. $auth_data = $request->getQueryParams();
  502. if ($this->telegram_oauth_check($auth_data) === true) { // Looks good, proceed.
  503. $telegram_id = $auth_data['id'];
  504. $user = User::query()->where('telegram_id', $telegram_id)->firstOrFail(); // Welcome Back :)
  505. if ($user == null) {
  506. return $this->view()->assign('title', '您需要先进行邮箱注册后绑定Telegram才能使用授权登录')->assign('message', '很抱歉带来的不便,请重新试试')->assign('redirect', '/auth/login')->display('telegram_error.tpl');
  507. }
  508. Auth::login($user->id, 3600);
  509. $this->logUserIp($user->id, $_SERVER['REMOTE_ADDR']);
  510. // 登陆成功!
  511. return $this->view()->assign('title', '登录成功')->assign('message', '正在前往仪表盘')->assign('redirect', '/user')->display('telegram_success.tpl');
  512. }
  513. // 验证失败
  514. return $this->view()->assign('title', '登陆超时或非法构造信息')->assign('message', '很抱歉带来的不便,请重新试试')->assign('redirect', '/auth/login')->display('telegram_error.tpl');
  515. }
  516. return $response->withRedirect('/404');
  517. }
  518. private function telegram_oauth_check($auth_data)
  519. {
  520. $check_hash = $auth_data['hash'];
  521. $bot_token = $_ENV['telegram_token'];
  522. unset($auth_data['hash']);
  523. $data_check_arr = [];
  524. foreach ($auth_data as $key => $value) {
  525. $data_check_arr[] = $key . '=' . $value;
  526. }
  527. sort($data_check_arr);
  528. $data_check_string = implode("\n", $data_check_arr);
  529. $secret_key = hash('sha256', $bot_token, true);
  530. $hash = hash_hmac('sha256', $data_check_string, $secret_key);
  531. if (strcmp($hash, $check_hash) !== 0) {
  532. return false; // Bad Data :(
  533. }
  534. if ((time() - $auth_data['auth_date']) > 300) { // Expire @ 5mins
  535. return false;
  536. }
  537. return true; // Good to Go
  538. }
  539. }