/** * Check the default provider to see if it overrides one of the entry methods and then redirect. * @param string $Type One of the following. * - SignIn * - Register * - SignOut (not complete) */ public function CheckOverride($Type, $Target, $TransientKey = NULL) { if (!$this->Request->Get('override', TRUE)) { return; } $Provider = Gdn_AuthenticationProviderModel::GetDefault(); if (!$Provider) { return; } $this->EventArguments['Target'] = $Target; $this->EventArguments['DefaultProvider'] =& $Provider; $this->EventArguments['TransientKey'] = $TransientKey; $this->FireEvent("Override{$Type}"); $Url = $Provider[$Type . 'Url']; if ($Url) { switch ($Type) { case 'Register': case 'SignIn': // When the other page comes back it needs to go through /sso to force a sso check. $Target = '/sso?target=' . urlencode($Target); break; case 'SignOut': $Cookie = C('Garden.Cookie.Name'); if (strpos($Url, '?') === FALSE) { $Url .= '?vfcookie=' . urlencode($Cookie); } else { $Url .= '&vfcookie=' . urlencode($Cookie); } // Check to sign out here. $SignedOut = !Gdn::Session()->IsValid(); if (!$SignedOut && (Gdn::Session()->ValidateTransientKey($TransientKey) || $this->Form->IsPostBack())) { Gdn::Session()->End(); $SignedOut = TRUE; } // Sign out is a bit of a tricky thing so we configure the way it works. $SignoutType = C('Garden.SSO.Signout'); switch ($SignoutType) { case 'redirect-only': // Just redirect to the url. break; case 'post-only': $this->SetData('Method', 'POST'); break; case 'post': // Post to the url after signing out here. if (!$SignedOut) { return; } $this->SetData('Method', 'POST'); break; case 'none': return; case 'redirect': default: if (!$SignedOut) { return; } break; } break; default: throw new Exception("Unknown entry type {$Type}."); } $Url = str_ireplace('{target}', rawurlencode(Url($Target, TRUE)), $Url); if ($this->DeliveryType() == DELIVERY_TYPE_ALL && strcasecmp($this->Data('Method'), 'POST') != 0) { redirectUrl($Url, 302); } else { $this->SetData('Url', $Url); $Script = <<<EOT <script type="text/javascript"> window.location = "{$Url}"; </script> EOT; $this->Render('Redirect', 'Utility'); die; } } }
function signInUrl($target = '', $force = false) { // Check to see if there is even a sign in button. if (!$force && strcasecmp(C('Garden.Registration.Method'), 'Connect') !== 0) { $defaultProvider = Gdn_AuthenticationProviderModel::GetDefault(); if ($defaultProvider && !val('SignInUrl', $defaultProvider)) { return ''; } } return '/entry/signin' . ($target ? '?Target=' . urlencode($target) : ''); }
/** * Method for plugins that want a friendly /sso method to hook into. * * @param RootController $Sender * @param string $Target The url to redirect to after sso. */ public function RootController_SSO_Create($Sender, $Target = '') { if (!$Target) { $Target = $Sender->Request->Get('redirect'); if (!$Target) { $Target = '/'; } } // TODO: Make sure the target is a safe redirect. // Get the default authentication provider. $DefaultProvider = Gdn_AuthenticationProviderModel::GetDefault(); $Sender->EventArguments['Target'] = $Target; $Sender->EventArguments['DefaultProvider'] = $DefaultProvider; $Handled = FALSE; $Sender->EventArguments['Handled'] =& $Handled; $Sender->FireEvent('SSO'); // If an event handler didn't handle the signin then just redirect to the target. if (!$Handled) { Redirect($Target, 302); } }