2017-05-15 23:41:17 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de>
|
|
|
|
*
|
|
|
|
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
2017-11-06 14:56:42 +00:00
|
|
|
* @author Morris Jobke <hey@morrisjobke.de>
|
2017-05-15 23:41:17 +00:00
|
|
|
*
|
|
|
|
* @license GNU AGPL version 3 or any later version
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License as
|
|
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
|
|
* License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace OC\Settings\Personal;
|
|
|
|
|
2017-05-16 00:46:42 +00:00
|
|
|
use OC\Accounts\AccountManager;
|
2017-06-16 13:00:15 +00:00
|
|
|
use OCA\FederatedFileSharing\AppInfo\Application;
|
|
|
|
use OCP\App\IAppManager;
|
2017-05-15 23:41:17 +00:00
|
|
|
use OCP\AppFramework\Http\TemplateResponse;
|
2017-05-17 10:06:51 +00:00
|
|
|
use OCP\Files\FileInfo;
|
2017-05-16 00:46:42 +00:00
|
|
|
use OCP\IConfig;
|
2017-05-17 09:51:22 +00:00
|
|
|
use OCP\IGroup;
|
2017-05-16 00:46:42 +00:00
|
|
|
use OCP\IGroupManager;
|
2017-05-17 10:06:51 +00:00
|
|
|
use OCP\IL10N;
|
2017-05-16 00:46:42 +00:00
|
|
|
use OCP\IUser;
|
|
|
|
use OCP\IUserManager;
|
|
|
|
use OCP\L10N\IFactory;
|
2017-05-15 23:41:17 +00:00
|
|
|
use OCP\Settings\ISettings;
|
|
|
|
|
|
|
|
class PersonalInfo implements ISettings {
|
2017-05-16 00:46:42 +00:00
|
|
|
/** @var IConfig */
|
|
|
|
private $config;
|
|
|
|
/** @var IUserManager */
|
|
|
|
private $userManager;
|
|
|
|
/** @var AccountManager */
|
|
|
|
private $accountManager;
|
|
|
|
/** @var IGroupManager */
|
|
|
|
private $groupManager;
|
2017-06-16 13:00:15 +00:00
|
|
|
/** @var IAppManager */
|
|
|
|
private $appManager;
|
2017-05-16 00:46:42 +00:00
|
|
|
/** @var IFactory */
|
|
|
|
private $l10nFactory;
|
|
|
|
|
|
|
|
const COMMON_LANGUAGE_CODES = [
|
|
|
|
'en', 'es', 'fr', 'de', 'de_DE', 'ja', 'ar', 'ru', 'nl', 'it',
|
|
|
|
'pt_BR', 'pt_PT', 'da', 'fi_FI', 'nb_NO', 'sv', 'tr', 'zh_CN', 'ko'
|
|
|
|
];
|
2017-05-17 12:22:44 +00:00
|
|
|
|
2017-05-17 10:06:51 +00:00
|
|
|
/** @var IL10N */
|
|
|
|
private $l;
|
2017-05-16 00:46:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param IConfig $config
|
|
|
|
* @param IUserManager $userManager
|
|
|
|
* @param IGroupManager $groupManager
|
|
|
|
* @param AccountManager $accountManager
|
|
|
|
* @param IFactory $l10nFactory
|
2017-05-17 10:06:51 +00:00
|
|
|
* @param IL10N $l
|
2017-05-16 00:46:42 +00:00
|
|
|
*/
|
|
|
|
public function __construct(
|
|
|
|
IConfig $config,
|
|
|
|
IUserManager $userManager,
|
|
|
|
IGroupManager $groupManager,
|
|
|
|
AccountManager $accountManager,
|
2017-06-16 13:00:15 +00:00
|
|
|
IAppManager $appManager,
|
2017-05-16 00:46:42 +00:00
|
|
|
IFactory $l10nFactory,
|
2017-05-17 10:06:51 +00:00
|
|
|
IL10N $l
|
2017-05-16 00:46:42 +00:00
|
|
|
) {
|
|
|
|
$this->config = $config;
|
|
|
|
$this->userManager = $userManager;
|
|
|
|
$this->accountManager = $accountManager;
|
|
|
|
$this->groupManager = $groupManager;
|
2017-06-16 13:00:15 +00:00
|
|
|
$this->appManager = $appManager;
|
2017-05-16 00:46:42 +00:00
|
|
|
$this->l10nFactory = $l10nFactory;
|
2017-05-17 10:06:51 +00:00
|
|
|
$this->l = $l;
|
2017-05-16 00:46:42 +00:00
|
|
|
}
|
2017-05-15 23:41:17 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @return TemplateResponse returns the instance with all parameters set, ready to be rendered
|
|
|
|
* @since 9.1
|
|
|
|
*/
|
|
|
|
public function getForm() {
|
2017-06-16 13:00:15 +00:00
|
|
|
$federatedFileSharingEnabled = $this->appManager->isEnabledForUser('federatedfilesharing');
|
|
|
|
$lookupServerUploadEnabled = false;
|
|
|
|
if($federatedFileSharingEnabled) {
|
|
|
|
$federatedFileSharing = new Application();
|
|
|
|
$shareProvider = $federatedFileSharing->getFederatedShareProvider();
|
|
|
|
$lookupServerUploadEnabled = $shareProvider->isLookupServerUploadEnabled();
|
|
|
|
}
|
2017-05-16 00:46:42 +00:00
|
|
|
|
|
|
|
$uid = \OC_User::getUser();
|
|
|
|
$user = $this->userManager->get($uid);
|
|
|
|
$userData = $this->accountManager->getUser($user);
|
|
|
|
|
2017-05-17 10:06:51 +00:00
|
|
|
$storageInfo = \OC_Helper::getStorageInfo('/');
|
|
|
|
if ($storageInfo['quota'] === FileInfo::SPACE_UNLIMITED) {
|
|
|
|
$totalSpace = $this->l->t('Unlimited');
|
|
|
|
} else {
|
|
|
|
$totalSpace = \OC_Helper::humanFileSize($storageInfo['total']);
|
|
|
|
}
|
|
|
|
|
2017-06-23 11:15:08 +00:00
|
|
|
$languageParameters = $this->getLanguages($user);
|
2017-06-16 13:00:15 +00:00
|
|
|
$messageParameters = $this->getMessageParameters($userData);
|
2017-05-16 00:46:42 +00:00
|
|
|
|
|
|
|
$parameters = [
|
2017-05-17 10:06:51 +00:00
|
|
|
'total_space' => $totalSpace,
|
|
|
|
'usage' => \OC_Helper::humanFileSize($storageInfo['used']),
|
2017-09-28 15:58:49 +00:00
|
|
|
'usage_relative' => round($storageInfo['relative']),
|
2017-05-17 10:06:51 +00:00
|
|
|
'quota' => $storageInfo['quota'],
|
2017-07-24 10:11:22 +00:00
|
|
|
'avatarChangeSupported' => $user->canChangeAvatar(),
|
2017-05-16 00:46:42 +00:00
|
|
|
'lookupServerUploadEnabled' => $lookupServerUploadEnabled,
|
2017-06-16 13:00:15 +00:00
|
|
|
'avatarScope' => $userData[AccountManager::PROPERTY_AVATAR]['scope'],
|
2017-07-24 10:11:22 +00:00
|
|
|
'displayNameChangeSupported' => $user->canChangeDisplayName(),
|
2017-05-16 00:46:42 +00:00
|
|
|
'displayName' => $userData[AccountManager::PROPERTY_DISPLAYNAME]['value'],
|
2017-06-16 13:00:15 +00:00
|
|
|
'displayNameScope' => $userData[AccountManager::PROPERTY_DISPLAYNAME]['scope'],
|
2017-05-16 00:46:42 +00:00
|
|
|
'email' => $userData[AccountManager::PROPERTY_EMAIL]['value'],
|
|
|
|
'emailScope' => $userData[AccountManager::PROPERTY_EMAIL]['scope'],
|
|
|
|
'emailVerification' => $userData[AccountManager::PROPERTY_EMAIL]['verified'],
|
|
|
|
'phone' => $userData[AccountManager::PROPERTY_PHONE]['value'],
|
|
|
|
'phoneScope' => $userData[AccountManager::PROPERTY_PHONE]['scope'],
|
2017-06-16 13:00:15 +00:00
|
|
|
'address' => $userData[AccountManager::PROPERTY_ADDRESS]['value'],
|
|
|
|
'addressScope' => $userData[AccountManager::PROPERTY_ADDRESS]['scope'],
|
2017-05-16 00:46:42 +00:00
|
|
|
'website' => $userData[AccountManager::PROPERTY_WEBSITE]['value'],
|
|
|
|
'websiteScope' => $userData[AccountManager::PROPERTY_WEBSITE]['scope'],
|
|
|
|
'websiteVerification' => $userData[AccountManager::PROPERTY_WEBSITE]['verified'],
|
|
|
|
'twitter' => $userData[AccountManager::PROPERTY_TWITTER]['value'],
|
|
|
|
'twitterScope' => $userData[AccountManager::PROPERTY_TWITTER]['scope'],
|
|
|
|
'twitterVerification' => $userData[AccountManager::PROPERTY_TWITTER]['verified'],
|
2017-05-17 09:51:22 +00:00
|
|
|
'groups' => $this->getGroups($user),
|
2017-07-24 10:11:22 +00:00
|
|
|
'passwordChangeSupported' => $user->canChangePassword(),
|
2017-06-23 11:15:08 +00:00
|
|
|
] + $messageParameters + $languageParameters;
|
2017-05-16 00:46:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
return new TemplateResponse('settings', 'settings/personal/personal.info', $parameters, '');
|
2017-05-15 23:41:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string the section ID, e.g. 'sharing'
|
|
|
|
* @since 9.1
|
|
|
|
*/
|
|
|
|
public function getSection() {
|
|
|
|
return 'personal-info';
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return int whether the form should be rather on the top or bottom of
|
|
|
|
* the admin section. The forms are arranged in ascending order of the
|
|
|
|
* priority values. It is required to return a value between 0 and 100.
|
|
|
|
*
|
|
|
|
* E.g.: 70
|
|
|
|
* @since 9.1
|
|
|
|
*/
|
|
|
|
public function getPriority() {
|
|
|
|
return 10;
|
|
|
|
}
|
2017-05-16 00:46:42 +00:00
|
|
|
|
2017-05-17 09:51:22 +00:00
|
|
|
/**
|
|
|
|
* returns a sorted list of the user's group GIDs
|
|
|
|
*
|
|
|
|
* @param IUser $user
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
private function getGroups(IUser $user) {
|
|
|
|
$groups = array_map(
|
|
|
|
function(IGroup $group) {
|
|
|
|
return $group->getGID();
|
|
|
|
},
|
|
|
|
$this->groupManager->getUserGroups($user)
|
|
|
|
);
|
|
|
|
sort($groups);
|
|
|
|
|
|
|
|
return $groups;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* returns the user language, common language and other languages in an
|
|
|
|
* associative array
|
|
|
|
*
|
|
|
|
* @param IUser $user
|
|
|
|
* @return array
|
|
|
|
*/
|
2017-05-16 00:46:42 +00:00
|
|
|
private function getLanguages(IUser $user) {
|
2017-06-23 11:15:08 +00:00
|
|
|
$forceLanguage = $this->config->getSystemValue('force_language', false);
|
|
|
|
if($forceLanguage !== false) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
2017-05-16 00:46:42 +00:00
|
|
|
$uid = $user->getUID();
|
|
|
|
|
|
|
|
$userLang = $this->config->getUserValue($uid, 'core', 'lang', $this->l10nFactory->findLanguage());
|
|
|
|
$languageCodes = $this->l10nFactory->findAvailableLanguages();
|
2017-06-23 11:15:08 +00:00
|
|
|
|
|
|
|
$commonLanguages = [];
|
|
|
|
$languages = [];
|
|
|
|
|
2017-05-16 00:46:42 +00:00
|
|
|
foreach($languageCodes as $lang) {
|
|
|
|
$l = \OC::$server->getL10N('settings', $lang);
|
|
|
|
// TRANSLATORS this is the language name for the language switcher in the personal settings and should be the localized version
|
|
|
|
$potentialName = (string) $l->t('__language_name__');
|
|
|
|
if($l->getLanguageCode() === $lang && substr($potentialName, 0, 1) !== '_') {//first check if the language name is in the translation file
|
|
|
|
$ln = array('code' => $lang, 'name' => $potentialName);
|
|
|
|
} elseif ($lang === 'en') {
|
|
|
|
$ln = ['code' => $lang, 'name' => 'English (US)'];
|
|
|
|
}else{//fallback to language code
|
|
|
|
$ln=array('code'=>$lang, 'name'=>$lang);
|
|
|
|
}
|
|
|
|
|
|
|
|
// put appropriate languages into appropriate arrays, to print them sorted
|
|
|
|
// used language -> common languages -> divider -> other languages
|
|
|
|
if ($lang === $userLang) {
|
|
|
|
$userLang = $ln;
|
|
|
|
} elseif (in_array($lang, self::COMMON_LANGUAGE_CODES)) {
|
|
|
|
$commonLanguages[array_search($lang, self::COMMON_LANGUAGE_CODES)]=$ln;
|
|
|
|
} else {
|
|
|
|
$languages[]=$ln;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// if user language is not available but set somehow: show the actual code as name
|
|
|
|
if (!is_array($userLang)) {
|
|
|
|
$userLang = [
|
|
|
|
'code' => $userLang,
|
|
|
|
'name' => $userLang,
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
ksort($commonLanguages);
|
|
|
|
|
|
|
|
// sort now by displayed language not the iso-code
|
|
|
|
usort( $languages, function ($a, $b) {
|
|
|
|
if ($a['code'] === $a['name'] && $b['code'] !== $b['name']) {
|
|
|
|
// If a doesn't have a name, but b does, list b before a
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if ($a['code'] !== $a['name'] && $b['code'] === $b['name']) {
|
|
|
|
// If a does have a name, but b doesn't, list a before b
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
// Otherwise compare the names
|
|
|
|
return strcmp($a['name'], $b['name']);
|
|
|
|
});
|
|
|
|
|
2017-06-23 11:15:08 +00:00
|
|
|
return [
|
|
|
|
'activelanguage' => $userLang,
|
|
|
|
'commonlanguages' => $commonLanguages,
|
|
|
|
'languages' => $languages
|
|
|
|
];
|
2017-05-16 00:46:42 +00:00
|
|
|
}
|
2017-05-17 09:51:22 +00:00
|
|
|
|
2017-06-16 13:00:15 +00:00
|
|
|
/**
|
|
|
|
* @param array $userData
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
private function getMessageParameters(array $userData) {
|
|
|
|
$needVerifyMessage = [AccountManager::PROPERTY_EMAIL, AccountManager::PROPERTY_WEBSITE, AccountManager::PROPERTY_TWITTER];
|
|
|
|
$messageParameters = [];
|
|
|
|
foreach ($needVerifyMessage as $property) {
|
|
|
|
switch ($userData[$property]['verified']) {
|
|
|
|
case AccountManager::VERIFIED:
|
|
|
|
$message = $this->l->t('Verifying');
|
|
|
|
break;
|
|
|
|
case AccountManager::VERIFICATION_IN_PROGRESS:
|
|
|
|
$message = $this->l->t('Verifying …');
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
$message = $this->l->t('Verify');
|
|
|
|
}
|
|
|
|
$messageParameters[$property . 'Message'] = $message;
|
|
|
|
}
|
|
|
|
return $messageParameters;
|
|
|
|
}
|
|
|
|
|
2017-05-15 23:41:17 +00:00
|
|
|
}
|