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