示例#1
0
    /**
     * 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;
            }
        }
    }
示例#2
0
 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) : '');
 }
示例#3
0
 /**
  * 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);
     }
 }