123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- <?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();
- }
- }
- ?>
|