Page->MasterPage->ClassReference->RequireLogin = false; return true; } /** * Thanks https://stackoverflow.com/a/31107425 * * Generate a random string, using a cryptographically secure * pseudorandom number generator (random_int) * * This function uses type hints now (PHP 7+ only), but it was originally * written for PHP 5 as well. * * For PHP 7, random_int is a PHP core function * For PHP 5.x, depends on https://github.com/paragonie/random_compat * * @param int $length How many characters do we want? * @param string $keyspace A string of all possible characters * to select from * @return string */ private function random_str(int $length = 64, string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ) : string { if ($length < 1) { throw new \RangeException("Length must be a positive integer"); } $pieces = []; $max = \mb_strlen($keyspace, '8bit') - 1; for ($i = 0; $i < $length; ++$i) { $pieces[] = $keyspace[\random_int(0, $max)]; } return \implode('', $pieces); } protected function OnRendering(RenderingEventArgs $re) { parent::OnRendering($re); /** * @var MySQLDatabaseOms */ $oms = mocha_get_oms(); //mocha_init_spot_timer($this); $path = System::GetVirtualPath(); $tenantName = ""; if ($path[0] == "madi") { $tenantName = $path[2]; } else { $tenantName = $path[0]; } $oms->setTenant($oms->getTenantByName($tenantName)); $pageElement = $oms->getInstanceByGlobalIdentifier(KnownInstanceGuids::Element__LoginPage); if ($pageElement === null) { print ("could not find element 'LoginPage'"); die(); } $context = new OmsContext(); $renderer = new HTMLRenderer($context); $renderer->IncludeTopNavigationBar = false; # $contents = $pageElement->getRelatedInstances($oms->getInstanceByGlobalIdentifier(KnownRelationshipGuids::Element__has__Element_Content)); $renderer->ProcessUpdatesFunction = function($sender, $element) { /** * @var MySQLDatabaseOms */ $oms = mocha_get_oms(); $ec_UserName = $oms->getInstanceByGlobalIdentifier(KnownInstanceGuids::ElementContent__UserNameForLoginPage); $ec_Password = $oms->getInstanceByGlobalIdentifier(KnownInstanceGuids::ElementContent__PasswordForLoginPage); // $ct = $oms->getRelatedInstance($element, $oms->getInstanceByGlobalIdentifier(KnownRelationshipGuids::Element__processed_by__Control_Transaction_Method)); // Login Page@ Login Page Edit(CT)*S // uses Build Response Method Binding... // $userName = $sender->getElementContentValue($ec_UserName); // $_POST["ec_56$4"]; $password = $sender->getElementContentValue($ec_Password); // $_POST["ec_56$5"]; $mbUser__get__User_for_User_Name_parm = $oms->getInstanceByGlobalIdentifier(KnownMethodBindingGuids::User__get__User_for_User_Name_parm); if ($mbUser__get__User_for_User_Name_parm === null) { echo("`User@get User for User Name parm`: method not found ('" . KnownMethodBindingGuids::User__get__User_for_User_Name_parm . "')");die(); } $mbUser__get__User_for_User_Name_parm = $mbUser__get__User_for_User_Name_parm->asMethodBinding(); $instUser = $mbUser__get__User_for_User_Name_parm->executeReturningInstanceSet(array( KnownAttributeGuids::UserName => $userName )); if ($instUser !== null) { $passwordSalt = $oms->getAttributeValue($instUser, $oms->getInstanceByGlobalIdentifier(KnownAttributeGuids::PasswordSalt)); $passwordHashExpected = $oms->getAttributeValue($instUser, $oms->getInstanceByGlobalIdentifier(KnownAttributeGuids::PasswordHash)); $passwordHashActual = hash('sha512', $password . $passwordSalt); if ($passwordHashExpected == $passwordHashActual) { $token = $this->random_str(); // create the instance of `System Account Signon` $instLogin = $oms->createInstanceOf($oms->getInstanceByGlobalIdentifier(KnownClassGuids::UserLogin)); if ($instLogin !== null) { // FIXME: these attribute should be defined in the Mocha/ZQ // FIXME: they should be wrapped in a conditional which checks if we are serving in a GDPR compliant region // should we be storing this information then? probably not... $oms->setAttributeValue($instLogin, KnownAttributeGuids::Token, $token); $oms->setAttributeValue($instLogin, KnownAttributeGuids::IPAddress, $_SERVER["REMOTE_ADDR"]); $oms->assignRelationship($instLogin, $oms->getInstanceByGlobalIdentifier(KnownRelationshipGuids::User_Login__has__User), $instUser); } $_SESSION["user_token_" . $oms->getTenant()->ID] = $token; System::RedirectFromLoginPage(); exit(); } else { //$this->Page->GetControlByID("literal1")->EnableRender = true; //System::RedirectToLoginPage(true); } } $ecPasswordMsg = $oms->getInstanceByGlobalIdentifier("684f1e039ecd43d58acadcf5b84c71f8"); $sender->Context->setElementParm($ecPasswordMsg, "visible", true); }; $renderer->IsPostback = $this->Page->IsPostback; $renderer->StyleClasses[] = "mcx-loginpage"; if ($this->Page->IsPostback) { $renderer->processPostback($pageElement); } $renderer->SubmitButtonText = "Log In"; $renderer->renderInitialElement($pageElement); exit(); } } ?>