aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_sharing/lib/Helper.php
blob: 5ba65ea1317b77edd4f45a23254f5c84f0f13b85 (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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
<?php
/**
 * @copyright Copyright (c) 2016, ownCloud, Inc.
 *
 * @author Bart Visscher <bartv@thisnet.nl>
 * @author Björn Schießle <bjoern@schiessle.org>
 * @author Joas Schilling <coding@schilljs.com>
 * @author Lukas Reschke <lukas@statuscode.ch>
 * @author Morris Jobke <hey@morrisjobke.de>
 * @author Robin Appelman <robin@icewind.nl>
 * @author Roeland Jago Douma <roeland@famdouma.nl>
 * @author Vincent Petry <pvince81@owncloud.com>
 *
 * @license AGPL-3.0
 *
 * This code is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License, version 3,
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 *
 */
namespace OCA\Files_Sharing;

use OC\Files\Filesystem;
use OC\Files\View;
use OCP\Files\NotFoundException;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\User;

class Helper {

	public static function registerHooks() {
		\OCP\Util::connectHook('OC_Filesystem', 'post_rename', '\OCA\Files_Sharing\Updater', 'renameHook');
		\OCP\Util::connectHook('OC_Filesystem', 'post_delete', '\OCA\Files_Sharing\Hooks', 'unshareChildren');
		\OCP\Util::connectHook('OC_Appconfig', 'post_set_value', '\OCA\Files_Sharing\Maintainer', 'configChangeHook');

		\OCP\Util::connectHook('OC_User', 'post_deleteUser', '\OCA\Files_Sharing\Hooks', 'deleteUser');
	}

	/**
	 * Sets up the filesystem and user for public sharing
	 * @param string $token string share token
	 * @param string $relativePath optional path relative to the share
	 * @param string $password optional password
	 * @return array
	 */
	public static function setupFromToken($token, $relativePath = null, $password = null) {
		\OC_User::setIncognitoMode(true);

		$shareManager = \OC::$server->getShareManager();

		try {
			$share = $shareManager->getShareByToken($token);
		} catch (ShareNotFound $e) {
			\OC_Response::setStatus(404);
			\OCP\Util::writeLog('core-preview', 'Passed token parameter is not valid', \OCP\Util::DEBUG);
			exit;
		}

		\OCP\JSON::checkUserExists($share->getShareOwner());
		\OC_Util::tearDownFS();
		\OC_Util::setupFS($share->getShareOwner());


		try {
			$path = Filesystem::getPath($share->getNodeId());
		} catch (NotFoundException $e) {
			\OCP\Util::writeLog('share', 'could not resolve linkItem', \OCP\Util::DEBUG);
			\OC_Response::setStatus(404);
			\OCP\JSON::error(array('success' => false));
			exit();
		}

		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK && $share->getPassword() !== null) {
			if (!self::authenticate($share, $password)) {
				\OC_Response::setStatus(403);
				\OCP\JSON::error(array('success' => false));
				exit();
			}
		}

		$basePath = $path;

		if ($relativePath !== null && Filesystem::isReadable($basePath . $relativePath)) {
			$path .= Filesystem::normalizePath($relativePath);
		}

		return array(
			'share' => $share,
			'basePath' => $basePath,
			'realPath' => $path
		);
	}

	/**
	 * Authenticate link item with the given password
	 * or with the session if no password was given.
	 * @param \OCP\Share\IShare $share
	 * @param string $password optional password
	 *
	 * @return boolean true if authorized, false otherwise
	 */
	public static function authenticate($share, $password = null) {
		$shareManager = \OC::$server->getShareManager();

		if ($password !== null) {
			if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
				if ($shareManager->checkPassword($share, $password)) {
					\OC::$server->getSession()->set('public_link_authenticated', (string)$share->getId());
					return true;
				}
			}
		} else {
			// not authenticated ?
			if (\OC::$server->getSession()->exists('public_link_authenticated')
				&& \OC::$server->getSession()->get('public_link_authenticated') !== (string)$share->getId()) {
				return true;
			}
		}
		return false;
	}

	public static function getSharesFromItem($target) {
		$result = array();
		$owner = Filesystem::getOwner($target);
		Filesystem::initMountPoints($owner);
		$info = Filesystem::getFileInfo($target);
		$ownerView = new View('/'.$owner.'/files');
		if ( $owner != User::getUser() ) {
			$path = $ownerView->getPath($info['fileid']);
		} else {
			$path = $target;
		}


		$ids = array();
		while ($path !== dirname($path)) {
			$info = $ownerView->getFileInfo($path);
			if ($info instanceof \OC\Files\FileInfo) {
				$ids[] = $info['fileid'];
			} else {
				\OCP\Util::writeLog('sharing', 'No fileinfo available for: ' . $path, \OCP\Util::WARN);
			}
			$path = dirname($path);
		}

		if (!empty($ids)) {

			$idList = array_chunk($ids, 99, true);

			foreach ($idList as $subList) {
				$statement = "SELECT `share_with`, `share_type`, `file_target` FROM `*PREFIX*share` WHERE `file_source` IN (" . implode(',', $subList) . ") AND `share_type` IN (0, 1, 2)";
				$query = \OCP\DB::prepare($statement);
				$r = $query->execute();
				$result = array_merge($result, $r->fetchAll());
			}
		}

		return $result;
	}

	/**
	 * get the UID of the owner of the file and the path to the file relative to
	 * owners files folder
	 *
	 * @param $filename
	 * @return array
	 * @throws \OC\User\NoUserException
	 */
	public static function getUidAndFilename($filename) {
		$uid = Filesystem::getOwner($filename);
		$userManager = \OC::$server->getUserManager();
		// if the user with the UID doesn't exists, e.g. because the UID points
		// to a remote user with a federated cloud ID we use the current logged-in
		// user. We need a valid local user to create the share
		if (!$userManager->userExists($uid)) {
			$uid = User::getUser();
		}
		Filesystem::initMountPoints($uid);
		if ( $uid != User::getUser() ) {
			$info = Filesystem::getFileInfo($filename);
			$ownerView = new View('/'.$uid.'/files');
			try {
				$filename = $ownerView->getPath($info['fileid']);
			} catch (NotFoundException $e) {
				$filename = null;
			}
		}
		return [$uid, $filename];
	}

	/**
	 * Format a path to be relative to the /user/files/ directory
	 * @param string $path the absolute path
	 * @return string e.g. turns '/admin/files/test.txt' into 'test.txt'
	 */
	public static function stripUserFilesPath($path) {
		$trimmed = ltrim($path, '/');
		$split = explode('/', $trimmed);

		// it is not a file relative to data/user/files
		if (count($split) < 3 || $split[1] !== 'files') {
			return false;
		}

		$sliced = array_slice($split, 2);
		$relPath = implode('/', $sliced);

		return $relPath;
	}

	/**
	 * check if file name already exists and generate unique target
	 *
	 * @param string $path
	 * @param array $excludeList
	 * @param View $view
	 * @return string $path
	 */
	public static function generateUniqueTarget($path, $excludeList, $view) {
		$pathinfo = pathinfo($path);
		$ext = (isset($pathinfo['extension'])) ? '.'.$pathinfo['extension'] : '';
		$name = $pathinfo['filename'];
		$dir = $pathinfo['dirname'];
		$i = 2;
		while ($view->file_exists($path) || in_array($path, $excludeList)) {
			$path = Filesystem::normalizePath($dir . '/' . $name . ' ('.$i.')' . $ext);
			$i++;
		}

		return $path;
	}

	/**
	 * get default share folder
	 *
	 * @param \OC\Files\View
	 * @return string
	 */
	public static function getShareFolder($view = null) {
		if ($view === null) {
			$view = Filesystem::getView();
		}
		$shareFolder = \OC::$server->getConfig()->getSystemValue('share_folder', '/');
		$shareFolder = Filesystem::normalizePath($shareFolder);

		if (!$view->file_exists($shareFolder)) {
			$dir = '';
			$subdirs = explode('/', $shareFolder);
			foreach ($subdirs as $subdir) {
				$dir = $dir . '/' . $subdir;
				if (!$view->is_dir($dir)) {
					$view->mkdir($dir);
				}
			}
		}

		return $shareFolder;

	}

	/**
	 * set default share folder
	 *
	 * @param string $shareFolder
	 */
	public static function setShareFolder($shareFolder) {
		\OC::$server->getConfig()->setSystemValue('share_folder', $shareFolder);
	}

}
s">"Sending..." msgstr "" #: js/apps.js:45 templates/help.php:7 msgid "User Documentation" msgstr "" #: js/apps.js:54 msgid "Admin Documentation" msgstr "" #: js/apps.js:82 msgid "Update to {appversion}" msgstr "" #: js/apps.js:90 msgid "Uninstall App" msgstr "" #: js/apps.js:96 js/apps.js:158 js/apps.js:191 msgid "Disable" msgstr "Nyahaktif" #: js/apps.js:96 js/apps.js:167 js/apps.js:184 js/apps.js:215 msgid "Enable" msgstr "Aktif" #: js/apps.js:147 msgid "Please wait...." msgstr "" #: js/apps.js:155 js/apps.js:156 js/apps.js:182 msgid "Error while disabling app" msgstr "" #: js/apps.js:181 js/apps.js:210 js/apps.js:211 msgid "Error while enabling app" msgstr "" #: js/apps.js:220 msgid "Updating...." msgstr "" #: js/apps.js:223 msgid "Error while updating app" msgstr "" #: js/apps.js:223 js/apps.js:236 msgid "Error" msgstr "Ralat" #: js/apps.js:224 templates/apps.php:55 msgid "Update" msgstr "Kemaskini" #: js/apps.js:227 msgid "Updated" msgstr "" #: js/apps.js:233 msgid "Uninstalling ...." msgstr "" #: js/apps.js:236 msgid "Error while uninstalling app" msgstr "" #: js/apps.js:237 templates/apps.php:56 msgid "Uninstall" msgstr "" #: js/personal.js:256 msgid "Select a profile picture" msgstr "" #: js/personal.js:287 msgid "Very weak password" msgstr "" #: js/personal.js:288 msgid "Weak password" msgstr "" #: js/personal.js:289 msgid "So-so password" msgstr "" #: js/personal.js:290 msgid "Good password" msgstr "" #: js/personal.js:291 msgid "Strong password" msgstr "" #: js/personal.js:310 msgid "Decrypting files... Please wait, this can take some time." msgstr "" #: js/personal.js:324 msgid "Delete encryption keys permanently." msgstr "" #: js/personal.js:338 msgid "Restore encryption keys." msgstr "" #: js/users/deleteHandler.js:166 msgid "Unable to delete {objName}" msgstr "" #: js/users/groups.js:73 js/users/groups.js:178 msgid "Error creating group" msgstr "" #: js/users/groups.js:177 msgid "A valid group name must be provided" msgstr "" #: js/users/groups.js:205 msgid "deleted {groupName}" msgstr "" #: js/users/groups.js:206 js/users/users.js:265 msgid "undo" msgstr "" #: js/users/users.js:37 templates/admin.php:292 #: templates/users/part.createuser.php:12 templates/users/part.userlist.php:10 #: templates/users/part.userlist.php:41 msgid "Groups" msgstr "Kumpulan" #: js/users/users.js:41 templates/users/part.userlist.php:12 #: templates/users/part.userlist.php:57 msgid "Group Admin" msgstr "" #: js/users/users.js:63 templates/users/part.grouplist.php:46 #: templates/users/part.userlist.php:108 msgid "Delete" msgstr "Padam" #: js/users/users.js:85 templates/users/part.userlist.php:98 msgid "never" msgstr "jangan" #: js/users/users.js:264 msgid "deleted {userName}" msgstr "" #: js/users/users.js:383 msgid "add group" msgstr "" #: js/users/users.js:580 msgid "A valid username must be provided" msgstr "" #: js/users/users.js:581 js/users/users.js:587 js/users/users.js:602 msgid "Error creating user" msgstr "" #: js/users/users.js:586 msgid "A valid password must be provided" msgstr "" #: js/users/users.js:610 msgid "Warning: Home directory for user \"{user}\" already exists" msgstr "" #: personal.php:50 personal.php:51 msgid "__language_name__" msgstr "_nama_bahasa_" #: templates/admin.php:8 msgid "Everything (fatal issues, errors, warnings, info, debug)" msgstr "" #: templates/admin.php:9 msgid "Info, warnings, errors and fatal issues" msgstr "" #: templates/admin.php:10 msgid "Warnings, errors and fatal issues" msgstr "" #: templates/admin.php:11 msgid "Errors and fatal issues" msgstr "" #: templates/admin.php:12 msgid "Fatal issues only" msgstr "" #: templates/admin.php:16 templates/admin.php:23 msgid "None" msgstr "" #: templates/admin.php:17 msgid "Login" msgstr "Log masuk" #: templates/admin.php:18 msgid "Plain" msgstr "" #: templates/admin.php:19 msgid "NT LAN Manager" msgstr "" #: templates/admin.php:24 msgid "SSL" msgstr "" #: templates/admin.php:25 msgid "TLS" msgstr "" #: templates/admin.php:47 templates/admin.php:61 msgid "Security Warning" msgstr "Amaran keselamatan" #: templates/admin.php:50 #, php-format msgid "" "You are accessing %s via HTTP. We strongly suggest you configure your server" " to require using HTTPS instead." msgstr "" #: templates/admin.php:64 msgid "" "Your data directory and your files are probably accessible from the " "internet. The .htaccess file is not working. We strongly suggest that you " "configure your webserver in a way that the data directory is no longer " "accessible or you move the data directory outside the webserver document " "root." msgstr "" #: templates/admin.php:75 templates/admin.php:90 msgid "Setup Warning" msgstr "" #: templates/admin.php:78 msgid "" "Your web server is not yet properly setup to allow files synchronization " "because the WebDAV interface seems to be broken." msgstr "" #: templates/admin.php:79 #, php-format msgid "Please double check the <a href=\"%s\">installation guides</a>." msgstr "" #: templates/admin.php:93 msgid "" "PHP is apparently setup to strip inline doc blocks. This will make several " "core apps inaccessible." msgstr "" #: templates/admin.php:94 msgid "" "This is probably caused by a cache/accelerator such as Zend OPcache or " "eAccelerator." msgstr "" #: templates/admin.php:105 msgid "Database Performance Info" msgstr "" #: templates/admin.php:108 msgid "" "SQLite is used as database. For larger installations we recommend to change " "this. To migrate to another database use the command line tool: 'occ db" ":convert-type'" msgstr "" #: templates/admin.php:119 msgid "Module 'fileinfo' missing" msgstr "" #: templates/admin.php:122 msgid "" "The PHP module 'fileinfo' is missing. We strongly recommend to enable this " "module to get best results with mime-type detection." msgstr "" #: templates/admin.php:133 msgid "Your PHP version is outdated" msgstr "" #: templates/admin.php:136 msgid "" "Your PHP version is outdated. We strongly recommend to update to 5.3.8 or " "newer because older versions are known to be broken. It is possible that " "this installation is not working correctly." msgstr "" #: templates/admin.php:147 msgid "Locale not working" msgstr "" #: templates/admin.php:152 msgid "System locale can not be set to a one which supports UTF-8." msgstr "" #: templates/admin.php:156 msgid "" "This means that there might be problems with certain characters in file " "names." msgstr "" #: templates/admin.php:160 #, php-format msgid "" "We strongly suggest to install the required packages on your system to " "support one of the following locales: %s." msgstr "" #: templates/admin.php:172 msgid "Internet connection not working" msgstr "" #: templates/admin.php:175 msgid "" "This server has no working internet connection. This means that some of the " "features like mounting of external storage, notifications about updates or " "installation of 3rd party apps don´t work. Accessing files from remote and " "sending of notification emails might also not work. We suggest to enable " "internet connection for this server if you want to have all features." msgstr "" #: templates/admin.php:189 msgid "Cron" msgstr "" #: templates/admin.php:196 #, php-format msgid "Last cron was executed at %s." msgstr "" #: templates/admin.php:199 #, php-format msgid "" "Last cron was executed at %s. This is more than an hour ago, something seems" " wrong." msgstr "" #: templates/admin.php:203 msgid "Cron was not executed yet!" msgstr "" #: templates/admin.php:213 msgid "Execute one task with each page loaded" msgstr "" #: templates/admin.php:221 msgid "" "cron.php is registered at a webcron service to call cron.php every 15 " "minutes over http." msgstr "" #: templates/admin.php:229 msgid "Use systems cron service to call the cron.php file every 15 minutes." msgstr "" #: templates/admin.php:234 msgid "Sharing" msgstr "" #: templates/admin.php:238 msgid "Allow apps to use the Share API" msgstr "" #: templates/admin.php:243 msgid "Allow users to share via link" msgstr "" #: templates/admin.php:249 msgid "Enforce password protection" msgstr "" #: templates/admin.php:252 msgid "Allow public uploads" msgstr "" #: templates/admin.php:256 msgid "Set default expiration date" msgstr "" #: templates/admin.php:260 msgid "Expire after " msgstr "" #: templates/admin.php:263 msgid "days" msgstr "" #: templates/admin.php:266 msgid "Enforce expiration date" msgstr "" #: templates/admin.php:271 msgid "Allow resharing" msgstr "" #: templates/admin.php:276 msgid "Restrict users to only share with users in their groups" msgstr "" #: templates/admin.php:281 msgid "Allow users to send mail notification for shared files" msgstr "" #: templates/admin.php:286 msgid "Exclude groups from sharing" msgstr "" #: templates/admin.php:298 msgid "" "These groups will still be able to receive shares, but not to initiate them." msgstr "" #: templates/admin.php:303 msgid "Security" msgstr "" #: templates/admin.php:314 msgid "Enforce HTTPS" msgstr "" #: templates/admin.php:316 #, php-format msgid "Forces the clients to connect to %s via an encrypted connection." msgstr "" #: templates/admin.php:322 #, php-format msgid "" "Please connect to your %s via HTTPS to enable or disable the SSL " "enforcement." msgstr "" #: templates/admin.php:332 msgid "Email Server" msgstr "" #: templates/admin.php:334 msgid "This is used for sending out notifications." msgstr "" #: templates/admin.php:365 msgid "From address" msgstr "" #: templates/admin.php:366 msgid "mail" msgstr "" #: templates/admin.php:387 msgid "Authentication required" msgstr "" #: templates/admin.php:391 msgid "Server address" msgstr "Alamat pelayan" #: templates/admin.php:395 msgid "Port" msgstr "" #: templates/admin.php:400 msgid "Credentials" msgstr "" #: templates/admin.php:401 msgid "SMTP Username" msgstr "" #: templates/admin.php:404 msgid "SMTP Password" msgstr "" #: templates/admin.php:408 msgid "Test email settings" msgstr "" #: templates/admin.php:409 msgid "Send email" msgstr "" #: templates/admin.php:414 msgid "Log" msgstr "Log" #: templates/admin.php:415 msgid "Log level" msgstr "Tahap Log" #: templates/admin.php:447 msgid "More" msgstr "Lanjutan" #: templates/admin.php:448 msgid "Less" msgstr "" #: templates/admin.php:454 templates/personal.php:208 msgid "Version" msgstr "" #: templates/admin.php:458 templates/personal.php:211 msgid "" "Developed by the <a href=\"http://ownCloud.org/contact\" " "target=\"_blank\">ownCloud community</a>, the <a " "href=\"https://github.com/owncloud\" target=\"_blank\">source code</a> is " "licensed under the <a href=\"http://www.gnu.org/licenses/agpl-3.0.html\" " "target=\"_blank\"><abbr title=\"Affero General Public " "License\">AGPL</abbr></a>." msgstr "" #: templates/apps.php:14 msgid "Add your App" msgstr "Tambah apps anda" #: templates/apps.php:31 msgid "More Apps" msgstr "" #: templates/apps.php:38 msgid "Select an App" msgstr "Pilih aplikasi" #: templates/apps.php:43 msgid "Documentation:" msgstr "" #: templates/apps.php:49 msgid "See application page at apps.owncloud.com" msgstr "Lihat halaman applikasi di apps.owncloud.com" #: templates/apps.php:51 msgid "See application website" msgstr "" #: templates/apps.php:53 msgid "<span class=\"licence\"></span>-licensed by <span class=\"author\"></span>" msgstr "" #: templates/apps.php:59 msgid "Enable only for specific groups" msgstr "" #: templates/apps.php:61 msgid "All" msgstr "" #: templates/help.php:13 msgid "Administrator Documentation" msgstr "" #: templates/help.php:20 msgid "Online Documentation" msgstr "" #: templates/help.php:25 msgid "Forum" msgstr "" #: templates/help.php:33 msgid "Bugtracker" msgstr "" #: templates/help.php:40 msgid "Commercial Support" msgstr "" #: templates/personal.php:8 msgid "Get the apps to sync your files" msgstr "" #: templates/personal.php:21 msgid "" "If you want to support the project\n" "\t\t<a href=\"https://owncloud.org/contribute\"\n" "\t\t\ttarget=\"_blank\">join development</a>\n" "\t\tor\n" "\t\t<a href=\"https://owncloud.org/promote\"\n" "\t\t\ttarget=\"_blank\">spread the word</a>!" msgstr "" #: templates/personal.php:31 msgid "Show First Run Wizard again" msgstr "" #: templates/personal.php:39 #, php-format msgid "You have used <strong>%s</strong> of the available <strong>%s</strong>" msgstr "" #: templates/personal.php:50 templates/users/part.createuser.php:8 #: templates/users/part.userlist.php:9 msgid "Password" msgstr "Kata laluan" #: templates/personal.php:51 msgid "Your password was changed" msgstr "" #: templates/personal.php:52 msgid "Unable to change your password" msgstr "Gagal mengubah kata laluan anda " #: templates/personal.php:54 msgid "Current password" msgstr "Kata laluan semasa" #: templates/personal.php:57 msgid "New password" msgstr "Kata laluan baru" #: templates/personal.php:61 msgid "Change password" msgstr "Ubah kata laluan" #: templates/personal.php:73 templates/users/part.userlist.php:8 msgid "Full Name" msgstr "" #: templates/personal.php:88 msgid "Email" msgstr "Email" #: templates/personal.php:90 msgid "Your email address" msgstr "Alamat emel anda" #: templates/personal.php:93 msgid "" "Fill in an email address to enable password recovery and receive " "notifications" msgstr "" #: templates/personal.php:101 msgid "Profile picture" msgstr "Gambar profil" #: templates/personal.php:106 msgid "Upload new" msgstr "" #: templates/personal.php:108 msgid "Select new from Files" msgstr "" #: templates/personal.php:109 msgid "Remove image" msgstr "" #: templates/personal.php:110 msgid "Either png or jpg. Ideally square but you will be able to crop it." msgstr "" #: templates/personal.php:112 msgid "Your avatar is provided by your original account." msgstr "" #: templates/personal.php:116 msgid "Cancel" msgstr "Batal" #: templates/personal.php:117 msgid "Choose as profile image" msgstr "" #: templates/personal.php:123 templates/personal.php:124 msgid "Language" msgstr "Bahasa" #: templates/personal.php:143 msgid "Help translate" msgstr "Bantu terjemah" #: templates/personal.php:162 msgid "The encryption app is no longer enabled, please decrypt all your files" msgstr "" #: templates/personal.php:168 msgid "Log-in password" msgstr "" #: templates/personal.php:173 msgid "Decrypt all Files" msgstr "" #: templates/personal.php:186 msgid "" "Your encryption keys are moved to a backup location. If something went wrong" " you can restore the keys. Only delete them permanently if you are sure that" " all files are decrypted correctly." msgstr "" #: templates/personal.php:190 msgid "Restore Encryption Keys" msgstr "" #: templates/personal.php:194 msgid "Delete Encryption Keys" msgstr "" #: templates/users/part.createuser.php:4 msgid "Login Name" msgstr "Log masuk" #: templates/users/part.createuser.php:20 msgid "Create" msgstr "Buat" #: templates/users/part.createuser.php:26 msgid "Admin Recovery Password" msgstr "" #: templates/users/part.createuser.php:27 #: templates/users/part.createuser.php:28 msgid "" "Enter the recovery password in order to recover the users files during " "password change" msgstr "" #: templates/users/part.createuser.php:32 msgid "Search Users and Groups" msgstr "" #: templates/users/part.grouplist.php:5 msgid "Add Group" msgstr "" #: templates/users/part.grouplist.php:10 msgid "Group" msgstr "" #: templates/users/part.grouplist.php:18 msgid "Everyone" msgstr "" #: templates/users/part.grouplist.php:31 msgid "Admins" msgstr "" #: templates/users/part.setquota.php:7 msgid "Default Quota" msgstr "Kuota Lalai" #: templates/users/part.setquota.php:9 templates/users/part.userlist.php:66 msgid "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" msgstr "" #: templates/users/part.setquota.php:11 templates/users/part.userlist.php:75 msgid "Unlimited" msgstr "" #: templates/users/part.setquota.php:26 templates/users/part.userlist.php:90 msgid "Other" msgstr "Lain" #: templates/users/part.userlist.php:7 msgid "Username" msgstr "Nama pengguna" #: templates/users/part.userlist.php:14 msgid "Quota" msgstr "Kuota" #: templates/users/part.userlist.php:15 msgid "Storage Location" msgstr "" #: templates/users/part.userlist.php:16 msgid "Last Login" msgstr "" #: templates/users/part.userlist.php:30 msgid "change full name" msgstr "" #: templates/users/part.userlist.php:34 msgid "set new password" msgstr "" #: templates/users/part.userlist.php:70 msgid "Default" msgstr ""