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