You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

145 lines
4.5 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
// This script may only be included - so its better to die if called directly.
if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) {
header('location: index.php');
exit;
}
class AutoSaveLib
{
public function __construct()
{
$access = TikiLib::lib('access');
$access->check_feature(['feature_ajax', 'ajax_autosave']);
}
/**
* Save data into cache file
*
* @param string $id editor (textarea) id
* @param string $data content to save
* @param string $referer user:section:object id
* @return number bytes that were written to the file, or false on failure
*/
public function auto_save($id, $data, $referer = '')
{
// auto_save_log($id, $referer, 'auto_save');
$result = file_put_contents($this->auto_save_name($id, $referer), $data);
return $result;
}
/**
* Delete cache file
*
* @param string $id editor id
* @param string $referer textarea specifier (user:section:item)
* @return bool true on success or false on failure
*/
public function remove_save($id, $referer = '')
{
$referer = $this->ensureReferrer($referer);
// auto_save_log($id, $referer, 'remove_save');
$file_name = $this->auto_save_name($id, $referer);
if (file_exists($file_name)) {
$result = unlink($file_name);
} else {
$result = false;
}
return $result;
}
/**
* Check if cache file exists
*
* @param string $id editor (textarea) id
* @param string $referer user:section:object id
* @return bool
*/
public function has_autosave($id, $referer = '')
{
return file_exists($this->auto_save_name($id, $this->ensureReferrer($referer)));
}
/**
* Get the contents of an autosave cache file
*
* @param string $id editor (textarea) id
* @param string $referer user:section:object id
* @return bool|string
*/
public function get_autosave($id, $referer = '')
{
$file_name = $this->auto_save_name($id, $referer);
if (file_exists($file_name)) {
return file_get_contents($file_name);
} else {
return '';
}
}
/**
* Make sure all types of object get a referrer
*
* @param string $referer
* @return string
*/
public function ensureReferrer($referer = '')
{
// should be page name, but use URI if not?
if (empty($referer)) {
global $section, $user, $tikilib;
$referer .= empty($user) ? $tikilib->get_ip_address() : $user;
$referer .= ':';
if ($section == 'wiki page') {
if (isset($_REQUEST['page'])) {
$referer .= 'wiki_page:' . rawurlencode($_REQUEST['page']);
}
} elseif ($section == 'blogs') {
if (isset($_REQUEST['postId'])) {
$referer .= 'blog:' . $_REQUEST['postId'];
}
} else {
$referer .= rawurlencode($_SERVER['REQUEST_URI']);
}
}
return $referer;
}
/**
* Get the name for the cache file
*
* @param string $id editor (textarea) id
* @param string $referer user:section:object id
* @param bool $only_md5
* @return string
*/
private function auto_save_name($id, $referer = '', $only_md5 = false)
{
global $user;
$referer = preg_replace('/(\?|\&)noautosave=y/', '', $this->ensureReferrer($referer));
$referer = rawurldecode($referer); // this is needed to ensure consistency whether coming from js or php
return ($only_md5 ? '' : 'temp/cache/auto_save-') . md5("$user:$referer:$id");
}
/**
* Dev routine to save a log of autosave events
*
* @param $id
* @param string $referer
* @param string $action
*/
private function auto_save_log($id, $referer = '', $action = '')
{
global $user;
file_put_contents('temp/cache/auto_save-log-' . ($this->auto_save_name($id, $referer, true)), $user . ' : ' . $this->ensureReferrer($referer) . " : $id : $action\n", FILE_APPEND);
}
}