aboutsummaryrefslogtreecommitdiffstats
path: root/demos/selectmenu/custom_render.html
Commit message (Collapse)AuthorAgeFilesLines
* Update custom_render.html (#2242)mark van tilburg2024-04-251-3/+3
| | | | | This fixes mixed content errors on the selectmenu demo page at jqueryui.com. Closes gh-2242
* Selectmenu: Added missing semicolonAnne-Gaelle Colom2016-03-301-1/+1
| | | | Closes gh-1689
* Selectmenu: Update demos to use AMDAlexander Schmitz2015-07-211-9/+2
| | | | Ref #10119
* Selectmenu: Support `width: false` and default to 14emScott González2015-03-051-3/+0
| | | | | | | | | | `width: null` still matches the width of the original element. `width: false` prevents an inline style from being set for the width. This makes it easy to set the width via a stylesheet and allows the use of any unit for setting the width, such as the new default of `14em`. Fixes #11198 Closes gh-1467
* Selectmenu: Re-add wrappers to menu itemsTJ VanToll2014-10-251-4/+5
|
* Build: Reorganize external directoryScott González2014-06-241-1/+1
| | | | | | | Put each external library into its own directory. Move jquery.js to external. Ref gh-1266
* Selectemnu: Demo cleanupScott González2014-04-081-47/+42
|
* All: Rename jquery.js to exclude version in filenameJörn Zaefferer2014-03-051-1/+1
|
* All: Quote CSS url() valuesScott González2014-01-241-6/+6
| | | | Closes gh-1172
* All: Rename all files, removing the "jquery.ui." prefix;Rafael Xavier de Souza2014-01-241-6/+6
| | | | | | | - By executing https://gist.github.com/jzaefferer/893fcf70b7eebc1dc271; Fixes #9464 Closes gh-1029
* Selectmenu: remove link element and adjust styles in custom renderer demoFelix Nagel2013-11-261-14/+6
|
* Demos: Add meta-viewport element for better 'mobile' testingJörn Zaefferer2013-11-251-0/+1
|
* Selectmenu: Updating jQuery to 1.10.2.Felix Nagel2013-07-091-1/+1
|
* Selectmenu; improve HTML building in custom render demoFelix Nagel2013-04-301-11/+8
|
* Selectmenu: add renderItemData method similar to autocompleteFelix Nagel2013-04-291-1/+1
|
* Selectmenu: clean up custom render demoFelix Nagel2013-04-291-34/+68
|
* Selectmenu: improve custom render demoFelix Nagel2013-03-091-5/+5
|
* Selectmenu: simplify custom render demo initsFelix Nagel2013-03-091-6/+3
|
* Selectmenu: Updating jQuery to 1.9.1.Felix Nagel2013-02-091-1/+1
|
* Selectmenu: Updating to jQuery 1.9.0Felix Nagel2013-01-181-1/+1
|
* Selectmenu: make dropdown style default and remove option dropdownFelix Nagel2012-12-201-6/+2
|
* Selectmenu: improved custom render demo CGLFelix Nagel2012-12-191-12/+19
|
* Selectmenu: fix jQuery UI framework icon demoFelix Nagel2012-12-031-1/+1
|
* Selectmenu: Upgrade jQuery to 1.8.3Felix Nagel2012-11-231-1/+1
|
* Selectmenu: lint fixesFelix Nagel2012-11-131-3/+3
|
* Selectmenu: CSS fix for gravatar demoFelix Nagel2012-11-131-1/+2
|
* Selectmenu: fix doctype declarationFelix Nagel2012-11-121-1/+1
|
* Selectmenu: follow-up to "Fix data naming"Felix Nagel2012-10-251-1/+1
|
* Selectmenu: Upgrade jQuery to 1.8.2.Felix Nagel2012-10-031-1/+1
|
* Selectmenu: Upgrade jQuery to 1.8.0.Felix Nagel2012-08-301-1/+1
|
* Selectmenu: Upgrade jQuery to 1.7.2.Felix Nagel2012-05-141-1/+1
|
* Selectmenu: added empty.html visual test, small improvements in html filesFelix Nagel2012-02-261-3/+2
|
* Selectmenu: removed Button widget dependencyFelix Nagel2012-02-231-1/+0
|
* Selectmenu: Introduce menuWidget method, to get access to the menu element. ↵Jörn Zaefferer2012-02-211-3/+3
| | | | Fix various tests and simplify demos accordingly. Add comment about optgroup-click-handling.
* Upgrade jQuery to 1.7.1.Jörn Zaefferer2011-11-241-17/+17
|
* Selectmenu: fixed jQuery versionFelix Nagel2011-11-211-1/+1
|
* Selectmenu: added custom_render.html demo, removed widgetBaseClassFelix Nagel2011-10-091-0/+120
backport/48031/stable30 Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Cache/File.php
blob: 10152d0966b4b05666f558b97225225f0e1a6a58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
<?php

/**
 * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
 * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
 * SPDX-License-Identifier: AGPL-3.0-only
 */
namespace OC\Cache;

use OC\Files\Filesystem;
use OC\Files\View;
use OCP\ICache;
use OCP\Security\ISecureRandom;
use Psr\Log\LoggerInterface;

class File implements ICache {
	/** @var View */
	protected $storage;

	/**
	 * Returns the cache storage for the logged in user
	 *
	 * @return \OC\Files\View cache storage
	 * @throws \OC\ForbiddenException
	 * @throws \OC\User\NoUserException
	 */
	protected function getStorage() {
		if ($this->storage !== null) {
			return $this->storage;
		}
		if (\OC::$server->getUserSession()->isLoggedIn()) {
			$rootView = new View();
			$user = \OC::$server->getUserSession()->getUser();
			Filesystem::initMountPoints($user->getUID());
			if (!$rootView->file_exists('/' . $user->getUID() . '/cache')) {
				$rootView->mkdir('/' . $user->getUID() . '/cache');
			}
			$this->storage = new View('/' . $user->getUID() . '/cache');
			return $this->storage;
		} else {
			\OCP\Server::get(LoggerInterface::class)->error('Can\'t get cache storage, user not logged in', ['app' => 'core']);
			throw new \OC\ForbiddenException('Can\t get cache storage, user not logged in');
		}
	}

	/**
	 * @param string $key
	 * @return mixed|null
	 * @throws \OC\ForbiddenException
	 */
	public function get($key) {
		$result = null;
		if ($this->hasKey($key)) {
			$storage = $this->getStorage();
			$result = $storage->file_get_contents($key);
		}
		return $result;
	}

	/**
	 * Returns the size of the stored/cached data
	 *
	 * @param string $key
	 * @return int
	 */
	public function size($key) {
		$result = 0;
		if ($this->hasKey($key)) {
			$storage = $this->getStorage();
			$result = $storage->filesize($key);
		}
		return $result;
	}

	/**
	 * @param string $key
	 * @param mixed $value
	 * @param int $ttl
	 * @return bool|mixed
	 * @throws \OC\ForbiddenException
	 */
	public function set($key, $value, $ttl = 0) {
		$storage = $this->getStorage();
		$result = false;
		// unique id to avoid chunk collision, just in case
		$uniqueId = \OC::$server->get(ISecureRandom::class)->generate(
			16,
			ISecureRandom::CHAR_ALPHANUMERIC
		);

		// use part file to prevent hasKey() to find the key
		// while it is being written
		$keyPart = $key . '.' . $uniqueId . '.part';
		if ($storage and $storage->file_put_contents($keyPart, $value)) {
			if ($ttl === 0) {
				$ttl = 86400; // 60*60*24
			}
			$result = $storage->touch($keyPart, time() + $ttl);
			$result &= $storage->rename($keyPart, $key);
		}
		return $result;
	}

	/**
	 * @param string $key
	 * @return bool
	 * @throws \OC\ForbiddenException
	 */
	public function hasKey($key) {
		$storage = $this->getStorage();
		if ($storage && $storage->is_file($key) && $storage->isReadable($key)) {
			return true;
		}
		return false;
	}

	/**
	 * @param string $key
	 * @return bool|mixed
	 * @throws \OC\ForbiddenException
	 */
	public function remove($key) {
		$storage = $this->getStorage();
		if (!$storage) {
			return false;
		}
		return $storage->unlink($key);
	}

	/**
	 * @param string $prefix
	 * @return bool
	 * @throws \OC\ForbiddenException
	 */
	public function clear($prefix = '') {
		$storage = $this->getStorage();
		if ($storage and $storage->is_dir('/')) {
			$dh = $storage->opendir('/');
			if (is_resource($dh)) {
				while (($file = readdir($dh)) !== false) {
					if ($file != '.' and $file != '..' and ($prefix === '' || str_starts_with($file, $prefix))) {
						$storage->unlink('/' . $file);
					}
				}
			}
		}
		return true;
	}

	/**
	 * Runs GC
	 * @throws \OC\ForbiddenException
	 */
	public function gc() {
		$storage = $this->getStorage();
		if ($storage) {
			// extra hour safety, in case of stray part chunks that take longer to write,
			// because touch() is only called after the chunk was finished
			$now = time() - 3600;
			$dh = $storage->opendir('/');
			if (!is_resource($dh)) {
				return null;
			}
			while (($file = readdir($dh)) !== false) {
				if ($file != '.' and $file != '..') {
					try {
						$mtime = $storage->filemtime('/' . $file);
						if ($mtime < $now) {
							$storage->unlink('/' . $file);
						}
					} catch (\OCP\Lock\LockedException $e) {
						// ignore locked chunks
						\OCP\Server::get(LoggerInterface::class)->debug('Could not cleanup locked chunk "' . $file . '"', ['app' => 'core']);
					} catch (\OCP\Files\ForbiddenException $e) {
						\OCP\Server::get(LoggerInterface::class)->debug('Could not cleanup forbidden chunk "' . $file . '"', ['app' => 'core']);
					} catch (\OCP\Files\LockNotAcquiredException $e) {
						\OCP\Server::get(LoggerInterface::class)->debug('Could not cleanup locked chunk "' . $file . '"', ['app' => 'core']);
					}
				}
			}
		}
	}

	public static function isAvailable(): bool {
		return true;
	}
}