1<?php 2// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project 3// 4// All Rights Reserved. See copyright.txt for details and a complete list of authors. 5// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. 6// $Id$ 7 8// This script may only be included - so its better to die if called directly. 9if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) { 10 header('location: index.php'); 11 exit; 12} 13 14class AutoSaveLib 15{ 16 function __construct() 17 { 18 $access = TikiLib::lib('access'); 19 20 $access->check_feature(['feature_ajax', 'ajax_autosave']); 21 } 22 23 /** 24 * Save data into cache file 25 * 26 * @param string $id editor (textarea) id 27 * @param string $data content to save 28 * @param string $referer user:section:object id 29 * @return number bytes that were written to the file, or false on failure 30 */ 31 function auto_save($id, $data, $referer = '') 32 { 33 // auto_save_log($id, $referer, 'auto_save'); 34 $result = file_put_contents($this->auto_save_name($id, $referer), $data); 35 return $result; 36 } 37 38 /** 39 * Delete cache file 40 * 41 * @param string $id editor id 42 * @param string $referer textarea specifier (user:section:item) 43 * @return bool true on success or false on failure 44 */ 45 function remove_save($id, $referer = '') 46 { 47 $referer = $this->ensureReferrer($referer); 48 // auto_save_log($id, $referer, 'remove_save'); 49 $file_name = $this->auto_save_name($id, $referer); 50 if (file_exists($file_name)) { 51 $result = unlink($file_name); 52 } else { 53 $result = false; 54 } 55 return $result; 56 } 57 58 /** 59 * Check if cache file exists 60 * 61 * @param string $id editor (textarea) id 62 * @param string $referer user:section:object id 63 * @return bool 64 */ 65 function has_autosave($id, $referer = '') 66 { 67 return file_exists($this->auto_save_name($id, $this->ensureReferrer($referer))); 68 } 69 70 /** 71 * Get the contents of an autosave cache file 72 * 73 * @param string $id editor (textarea) id 74 * @param string $referer user:section:object id 75 * @return bool|string 76 */ 77 function get_autosave($id, $referer = '') 78 { 79 $file_name = $this->auto_save_name($id, $referer); 80 if (file_exists($file_name)) { 81 return file_get_contents($file_name); 82 } else { 83 return ''; 84 } 85 } 86 87 /** 88 * Make sure all types of object get a referrer 89 * 90 * @param string $referer 91 * @return string 92 */ 93 function ensureReferrer($referer = '') 94 { 95 96 // should be page name, but use URI if not? 97 if (empty($referer)) { 98 global $section, $user, $tikilib; 99 $referer .= empty($user) ? $tikilib->get_ip_address() : $user; 100 $referer .= ':'; 101 if ($section == 'wiki page') { 102 if (isset($_REQUEST['page'])) { 103 $referer .= 'wiki_page:' . rawurlencode($_REQUEST['page']); 104 } 105 } elseif ($section == 'blogs') { 106 if (isset($_REQUEST['postId'])) { 107 $referer .= 'blog:' . $_REQUEST['postId']; 108 } 109 } else { 110 $referer .= rawurlencode($_SERVER['REQUEST_URI']); 111 } 112 } 113 return $referer; 114 } 115 116 /** 117 * Get the name for the cache file 118 * 119 * @param string $id editor (textarea) id 120 * @param string $referer user:section:object id 121 * @param bool $only_md5 122 * @return string 123 */ 124 private function auto_save_name($id, $referer = '', $only_md5 = false) 125 { 126 global $user; 127 $referer = preg_replace('/(\?|\&)noautosave=y/', '', $this->ensureReferrer($referer)); 128 $referer = rawurldecode($referer); // this is needed to ensure consistency whether coming from js or php 129 return ($only_md5 ? '' : 'temp/cache/auto_save-') . md5("$user:$referer:$id"); 130 } 131 132 /** 133 * Dev routine to save a log of autosave events 134 * 135 * @param $id 136 * @param string $referer 137 * @param string $action 138 */ 139 private function auto_save_log($id, $referer = '', $action = '') 140 { 141 global $user; 142 file_put_contents('temp/cache/auto_save-log-' . ($this->auto_save_name($id, $referer, true)), $user . ' : ' . $this->ensureReferrer($referer) . " : $id : $action\n", FILE_APPEND); 143 } 144} 145