gnu-social/vendor/apereo/phpcas/source/CAS/ProxiedService/Imap.php

282 lines
8.0 KiB
PHP

<?php
/**
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership.
*
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* PHP Version 5
*
* @file CAS/ProxiedService/Imap.php
* @category Authentication
* @package PhpCAS
* @author Adam Franco <afranco@middlebury.edu>
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
/**
* Provides access to a proxy-authenticated IMAP stream
*
* @class CAS_ProxiedService_Imap
* @category Authentication
* @package PhpCAS
* @author Adam Franco <afranco@middlebury.edu>
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
* @link https://wiki.jasig.org/display/CASC/phpCAS
*/
class CAS_ProxiedService_Imap
extends CAS_ProxiedService_Abstract
{
/**
* The username to send via imap_open.
*
* @var string $_username;
*/
private $_username;
/**
* Constructor.
*
* @param string $username Username
*
* @return void
*/
public function __construct ($username)
{
if (!is_string($username) || !strlen($username)) {
throw new CAS_InvalidArgumentException('Invalid username.');
}
$this->_username = $username;
}
/**
* The target service url.
* @var string $_url;
*/
private $_url;
/**
* Answer a service identifier (URL) for whom we should fetch a proxy ticket.
*
* @return string
* @throws Exception If no service url is available.
*/
public function getServiceUrl ()
{
if (empty($this->_url)) {
throw new CAS_ProxiedService_Exception(
'No URL set via '.get_class($this).'->getServiceUrl($url).'
);
}
return $this->_url;
}
/*********************************************************
* Configure the Stream
*********************************************************/
/**
* Set the URL of the service to pass to CAS for proxy-ticket retrieval.
*
* @param string $url Url to set
*
* @return void
* @throws CAS_OutOfSequenceException If called after the stream has been opened.
*/
public function setServiceUrl ($url)
{
if ($this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot set the URL, stream already opened.'
);
}
if (!is_string($url) || !strlen($url)) {
throw new CAS_InvalidArgumentException('Invalid url.');
}
$this->_url = $url;
}
/**
* The mailbox to open. See the $mailbox parameter of imap_open().
*
* @var string $_mailbox
*/
private $_mailbox;
/**
* Set the mailbox to open. See the $mailbox parameter of imap_open().
*
* @param string $mailbox Mailbox to set
*
* @return void
* @throws CAS_OutOfSequenceException If called after the stream has been opened.
*/
public function setMailbox ($mailbox)
{
if ($this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot set the mailbox, stream already opened.'
);
}
if (!is_string($mailbox) || !strlen($mailbox)) {
throw new CAS_InvalidArgumentException('Invalid mailbox.');
}
$this->_mailbox = $mailbox;
}
/**
* A bit mask of options to pass to imap_open() as the $options parameter.
*
* @var int $_options
*/
private $_options = null;
/**
* Set the options for opening the stream. See the $options parameter of
* imap_open().
*
* @param int $options Options for the stream
*
* @return void
* @throws CAS_OutOfSequenceException If called after the stream has been opened.
*/
public function setOptions ($options)
{
if ($this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot set options, stream already opened.'
);
}
if (!is_int($options)) {
throw new CAS_InvalidArgumentException('Invalid options.');
}
$this->_options = $options;
}
/*********************************************************
* 2. Open the stream
*********************************************************/
/**
* Open the IMAP stream (similar to imap_open()).
*
* @return resource Returns an IMAP stream on success
* @throws CAS_OutOfSequenceException If called multiple times.
* @throws CAS_ProxyTicketException If there is a proxy-ticket failure.
* The code of the Exception will be one of:
* PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE
* PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE
* PHPCAS_SERVICE_PT_FAILURE
* @throws CAS_ProxiedService_Exception If there is a failure sending the
* request to the target service.
*/
public function open ()
{
if ($this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException('Stream already opened.');
}
if (empty($this->_mailbox)) {
throw new CAS_ProxiedService_Exception(
'You must specify a mailbox via '.get_class($this)
.'->setMailbox($mailbox)'
);
}
phpCAS::traceBegin();
// Get our proxy ticket and append it to our URL.
$this->initializeProxyTicket();
phpCAS::trace('opening IMAP mailbox `'.$this->_mailbox.'\'...');
$this->_stream = @imap_open(
$this->_mailbox, $this->_username, $this->getProxyTicket(),
$this->_options
);
if ($this->_stream) {
phpCAS::trace('ok');
} else {
phpCAS::trace('could not open mailbox');
// @todo add localization integration.
$message = 'IMAP Error: '.$this->_url.' '. var_export(imap_errors(), true);
phpCAS::trace($message);
throw new CAS_ProxiedService_Exception($message);
}
phpCAS::traceEnd();
return $this->_stream;
}
/**
* Answer true if our request has been sent yet.
*
* @return bool
*/
protected function hasBeenOpened ()
{
return !empty($this->_stream);
}
/*********************************************************
* 3. Access the result
*********************************************************/
/**
* The IMAP stream
*
* @var resource $_stream
*/
private $_stream;
/**
* Answer the IMAP stream
*
* @return resource
* @throws CAS_OutOfSequenceException if stream is not opened yet
*/
public function getStream ()
{
if (!$this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot access stream, not opened yet.'
);
}
return $this->_stream;
}
/**
* CAS_Client::serviceMail() needs to return the proxy ticket for some reason,
* so this method provides access to it.
*
* @return string
* @throws CAS_OutOfSequenceException If called before the stream has been
* opened.
*/
public function getImapProxyTicket ()
{
if (!$this->hasBeenOpened()) {
throw new CAS_OutOfSequenceException(
'Cannot access errors, stream not opened yet.'
);
}
return $this->getProxyTicket();
}
}
?>