1*d10b5556SXylle<?php 2*d10b5556SXylle 3*d10b5556SXylle/** 4*d10b5556SXylle * Licensed to Jasig under one or more contributor license 5*d10b5556SXylle * agreements. See the NOTICE file distributed with this work for 6*d10b5556SXylle * additional information regarding copyright ownership. 7*d10b5556SXylle * 8*d10b5556SXylle * Jasig licenses this file to you under the Apache License, 9*d10b5556SXylle * Version 2.0 (the "License"); you may not use this file except in 10*d10b5556SXylle * compliance with the License. You may obtain a copy of the License at: 11*d10b5556SXylle * 12*d10b5556SXylle * http://www.apache.org/licenses/LICENSE-2.0 13*d10b5556SXylle * 14*d10b5556SXylle * Unless required by applicable law or agreed to in writing, software 15*d10b5556SXylle * distributed under the License is distributed on an "AS IS" BASIS, 16*d10b5556SXylle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17*d10b5556SXylle * See the License for the specific language governing permissions and 18*d10b5556SXylle * limitations under the License. 19*d10b5556SXylle * 20*d10b5556SXylle * PHP Version 7 21*d10b5556SXylle * 22*d10b5556SXylle * @file CAS/PGTStorage/AbstractStorage.php 23*d10b5556SXylle * @category Authentication 24*d10b5556SXylle * @package PhpCAS 25*d10b5556SXylle * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> 26*d10b5556SXylle * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 27*d10b5556SXylle * @link https://wiki.jasig.org/display/CASC/phpCAS 28*d10b5556SXylle */ 29*d10b5556SXylle 30*d10b5556SXylle/** 31*d10b5556SXylle * The CAS_PGTStorage_File class is a class for PGT file storage. An instance of 32*d10b5556SXylle * this class is returned by CAS_Client::SetPGTStorageFile(). 33*d10b5556SXylle * 34*d10b5556SXylle * @class CAS_PGTStorage_File 35*d10b5556SXylle * @category Authentication 36*d10b5556SXylle * @package PhpCAS 37*d10b5556SXylle * @author Pascal Aubry <pascal.aubry@univ-rennes1.fr> 38*d10b5556SXylle * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 39*d10b5556SXylle * @link https://wiki.jasig.org/display/CASC/phpCAS 40*d10b5556SXylle * 41*d10b5556SXylle * 42*d10b5556SXylle * @ingroup internalPGTStorageFile 43*d10b5556SXylle */ 44*d10b5556SXylle 45*d10b5556SXylleclass CAS_PGTStorage_File extends CAS_PGTStorage_AbstractStorage 46*d10b5556SXylle{ 47*d10b5556SXylle /** 48*d10b5556SXylle * @addtogroup internalPGTStorageFile 49*d10b5556SXylle * @{ 50*d10b5556SXylle */ 51*d10b5556SXylle 52*d10b5556SXylle /** 53*d10b5556SXylle * a string telling where PGT's should be stored on the filesystem. Written by 54*d10b5556SXylle * PGTStorageFile::PGTStorageFile(), read by getPath(). 55*d10b5556SXylle * 56*d10b5556SXylle * @private 57*d10b5556SXylle */ 58*d10b5556SXylle var $_path; 59*d10b5556SXylle 60*d10b5556SXylle /** 61*d10b5556SXylle * This method returns the name of the directory where PGT's should be stored 62*d10b5556SXylle * on the filesystem. 63*d10b5556SXylle * 64*d10b5556SXylle * @return string the name of a directory (with leading and trailing '/') 65*d10b5556SXylle * 66*d10b5556SXylle * @private 67*d10b5556SXylle */ 68*d10b5556SXylle function getPath() 69*d10b5556SXylle { 70*d10b5556SXylle return $this->_path; 71*d10b5556SXylle } 72*d10b5556SXylle 73*d10b5556SXylle // ######################################################################## 74*d10b5556SXylle // DEBUGGING 75*d10b5556SXylle // ######################################################################## 76*d10b5556SXylle 77*d10b5556SXylle /** 78*d10b5556SXylle * This method returns an informational string giving the type of storage 79*d10b5556SXylle * used by the object (used for debugging purposes). 80*d10b5556SXylle * 81*d10b5556SXylle * @return string an informational string. 82*d10b5556SXylle * @public 83*d10b5556SXylle */ 84*d10b5556SXylle function getStorageType() 85*d10b5556SXylle { 86*d10b5556SXylle return "file"; 87*d10b5556SXylle } 88*d10b5556SXylle 89*d10b5556SXylle /** 90*d10b5556SXylle * This method returns an informational string giving informations on the 91*d10b5556SXylle * parameters of the storage.(used for debugging purposes). 92*d10b5556SXylle * 93*d10b5556SXylle * @return string an informational string. 94*d10b5556SXylle * @public 95*d10b5556SXylle */ 96*d10b5556SXylle function getStorageInfo() 97*d10b5556SXylle { 98*d10b5556SXylle return 'path=`'.$this->getPath().'\''; 99*d10b5556SXylle } 100*d10b5556SXylle 101*d10b5556SXylle // ######################################################################## 102*d10b5556SXylle // CONSTRUCTOR 103*d10b5556SXylle // ######################################################################## 104*d10b5556SXylle 105*d10b5556SXylle /** 106*d10b5556SXylle * The class constructor, called by CAS_Client::SetPGTStorageFile(). 107*d10b5556SXylle * 108*d10b5556SXylle * @param CAS_Client $cas_parent the CAS_Client instance that creates the object. 109*d10b5556SXylle * @param string $path the path where the PGT's should be stored 110*d10b5556SXylle * 111*d10b5556SXylle * @return void 112*d10b5556SXylle * 113*d10b5556SXylle * @public 114*d10b5556SXylle */ 115*d10b5556SXylle function __construct($cas_parent,$path) 116*d10b5556SXylle { 117*d10b5556SXylle phpCAS::traceBegin(); 118*d10b5556SXylle // call the ancestor's constructor 119*d10b5556SXylle parent::__construct($cas_parent); 120*d10b5556SXylle 121*d10b5556SXylle if (empty($path)) { 122*d10b5556SXylle $path = CAS_PGT_STORAGE_FILE_DEFAULT_PATH; 123*d10b5556SXylle } 124*d10b5556SXylle // check that the path is an absolute path 125*d10b5556SXylle if (getenv("OS")=="Windows_NT" || strtoupper(substr(PHP_OS,0,3)) == 'WIN') { 126*d10b5556SXylle 127*d10b5556SXylle if (!preg_match('`^[a-zA-Z]:`', $path)) { 128*d10b5556SXylle phpCAS::error('an absolute path is needed for PGT storage to file'); 129*d10b5556SXylle } 130*d10b5556SXylle 131*d10b5556SXylle } else { 132*d10b5556SXylle 133*d10b5556SXylle if ( $path[0] != '/' ) { 134*d10b5556SXylle phpCAS::error('an absolute path is needed for PGT storage to file'); 135*d10b5556SXylle } 136*d10b5556SXylle 137*d10b5556SXylle // store the path (with a leading and trailing '/') 138*d10b5556SXylle $path = preg_replace('|[/]*$|', '/', $path); 139*d10b5556SXylle $path = preg_replace('|^[/]*|', '/', $path); 140*d10b5556SXylle } 141*d10b5556SXylle 142*d10b5556SXylle $this->_path = $path; 143*d10b5556SXylle phpCAS::traceEnd(); 144*d10b5556SXylle } 145*d10b5556SXylle 146*d10b5556SXylle // ######################################################################## 147*d10b5556SXylle // INITIALIZATION 148*d10b5556SXylle // ######################################################################## 149*d10b5556SXylle 150*d10b5556SXylle /** 151*d10b5556SXylle * This method is used to initialize the storage. Halts on error. 152*d10b5556SXylle * 153*d10b5556SXylle * @return void 154*d10b5556SXylle * @public 155*d10b5556SXylle */ 156*d10b5556SXylle function init() 157*d10b5556SXylle { 158*d10b5556SXylle phpCAS::traceBegin(); 159*d10b5556SXylle // if the storage has already been initialized, return immediatly 160*d10b5556SXylle if ($this->isInitialized()) { 161*d10b5556SXylle return; 162*d10b5556SXylle } 163*d10b5556SXylle // call the ancestor's method (mark as initialized) 164*d10b5556SXylle parent::init(); 165*d10b5556SXylle phpCAS::traceEnd(); 166*d10b5556SXylle } 167*d10b5556SXylle 168*d10b5556SXylle // ######################################################################## 169*d10b5556SXylle // PGT I/O 170*d10b5556SXylle // ######################################################################## 171*d10b5556SXylle 172*d10b5556SXylle /** 173*d10b5556SXylle * This method returns the filename corresponding to a PGT Iou. 174*d10b5556SXylle * 175*d10b5556SXylle * @param string $pgt_iou the PGT iou. 176*d10b5556SXylle * 177*d10b5556SXylle * @return string a filename 178*d10b5556SXylle * @private 179*d10b5556SXylle */ 180*d10b5556SXylle function getPGTIouFilename($pgt_iou) 181*d10b5556SXylle { 182*d10b5556SXylle phpCAS::traceBegin(); 183*d10b5556SXylle $filename = $this->getPath()."phpcas-".hash("sha256", $pgt_iou); 184*d10b5556SXylle// $filename = $this->getPath().$pgt_iou.'.plain'; 185*d10b5556SXylle phpCAS::trace("Sha256 filename:" . $filename); 186*d10b5556SXylle phpCAS::traceEnd(); 187*d10b5556SXylle return $filename; 188*d10b5556SXylle } 189*d10b5556SXylle 190*d10b5556SXylle /** 191*d10b5556SXylle * This method stores a PGT and its corresponding PGT Iou into a file. Echoes a 192*d10b5556SXylle * warning on error. 193*d10b5556SXylle * 194*d10b5556SXylle * @param string $pgt the PGT 195*d10b5556SXylle * @param string $pgt_iou the PGT iou 196*d10b5556SXylle * 197*d10b5556SXylle * @return void 198*d10b5556SXylle * 199*d10b5556SXylle * @public 200*d10b5556SXylle */ 201*d10b5556SXylle function write($pgt,$pgt_iou) 202*d10b5556SXylle { 203*d10b5556SXylle phpCAS::traceBegin(); 204*d10b5556SXylle $fname = $this->getPGTIouFilename($pgt_iou); 205*d10b5556SXylle if (!file_exists($fname)) { 206*d10b5556SXylle touch($fname); 207*d10b5556SXylle // Chmod will fail on windows 208*d10b5556SXylle @chmod($fname, 0600); 209*d10b5556SXylle if ($f=fopen($fname, "w")) { 210*d10b5556SXylle if (fputs($f, $pgt) === false) { 211*d10b5556SXylle phpCAS::error('could not write PGT to `'.$fname.'\''); 212*d10b5556SXylle } 213*d10b5556SXylle phpCAS::trace('Successful write of PGT to `'.$fname.'\''); 214*d10b5556SXylle fclose($f); 215*d10b5556SXylle } else { 216*d10b5556SXylle phpCAS::error('could not open `'.$fname.'\''); 217*d10b5556SXylle } 218*d10b5556SXylle } else { 219*d10b5556SXylle phpCAS::error('File exists: `'.$fname.'\''); 220*d10b5556SXylle } 221*d10b5556SXylle phpCAS::traceEnd(); 222*d10b5556SXylle } 223*d10b5556SXylle 224*d10b5556SXylle /** 225*d10b5556SXylle * This method reads a PGT corresponding to a PGT Iou and deletes the 226*d10b5556SXylle * corresponding file. 227*d10b5556SXylle * 228*d10b5556SXylle * @param string $pgt_iou the PGT iou 229*d10b5556SXylle * 230*d10b5556SXylle * @return string|false the corresponding PGT, or FALSE on error 231*d10b5556SXylle * 232*d10b5556SXylle * @public 233*d10b5556SXylle */ 234*d10b5556SXylle function read($pgt_iou) 235*d10b5556SXylle { 236*d10b5556SXylle phpCAS::traceBegin(); 237*d10b5556SXylle $pgt = false; 238*d10b5556SXylle $fname = $this->getPGTIouFilename($pgt_iou); 239*d10b5556SXylle if (file_exists($fname)) { 240*d10b5556SXylle if (!($f=fopen($fname, "r"))) { 241*d10b5556SXylle phpCAS::error('could not open `'.$fname.'\''); 242*d10b5556SXylle } else { 243*d10b5556SXylle if (($pgt=fgets($f)) === false) { 244*d10b5556SXylle phpCAS::error('could not read PGT from `'.$fname.'\''); 245*d10b5556SXylle } 246*d10b5556SXylle phpCAS::trace('Successful read of PGT to `'.$fname.'\''); 247*d10b5556SXylle fclose($f); 248*d10b5556SXylle } 249*d10b5556SXylle // delete the PGT file 250*d10b5556SXylle @unlink($fname); 251*d10b5556SXylle } else { 252*d10b5556SXylle phpCAS::error('No such file `'.$fname.'\''); 253*d10b5556SXylle } 254*d10b5556SXylle phpCAS::traceEnd($pgt); 255*d10b5556SXylle return $pgt; 256*d10b5556SXylle } 257*d10b5556SXylle 258*d10b5556SXylle /** @} */ 259*d10b5556SXylle 260*d10b5556SXylle} 261*d10b5556SXylle?> 262