@@ -7,11 +7,6 @@ if (!\OC_User::isLoggedIn()) { | |||
\OC_Template::printErrorPage("Permission denied"); | |||
} | |||
$mode = \OC_Avatar::getMode(); | |||
if ($mode === "none") { | |||
exit(); | |||
} | |||
if ($_SERVER['REQUEST_METHOD'] === "GET") { | |||
if (isset($_GET['user'])) { | |||
//SECURITY TODO does this fully eliminate directory traversals? | |||
@@ -33,8 +28,6 @@ if ($_SERVER['REQUEST_METHOD'] === "GET") { | |||
if ($image instanceof \OC_Image) { | |||
$image->show(); | |||
} elseif (is_string($image)) { // Gravatar alike services | |||
header("Location: ".$image); | |||
} else { | |||
$image = \OC_Avatar::getDefaultAvatar($user, $size); | |||
$image->show(); | |||
@@ -60,7 +53,7 @@ if ($_SERVER['REQUEST_METHOD'] === "GET") { | |||
} | |||
try { | |||
\OC_Avatar::setLocalAvatar($user, $avatar); | |||
\OC_Avatar::set($user, $avatar); | |||
OC_JSON::success(); | |||
} catch (\Exception $e) { | |||
OC_JSON::error(array("data" => array ("message" => $e->getMessage()) )); | |||
@@ -69,7 +62,7 @@ if ($_SERVER['REQUEST_METHOD'] === "GET") { | |||
$user = OC_User::getUser(); | |||
try { | |||
\OC_Avatar::setLocalAvatar($user, false); | |||
\OC_Avatar::set($user, false); | |||
OC_JSON::success(); | |||
} catch (\Exception $e) { | |||
OC_JSON::error(array("data" => array ("message" => $e->getMessage()) )); |
@@ -65,12 +65,6 @@ $CONFIG = array( | |||
/* URL to the parent directory of the 3rdparty directory, as seen by the browser */ | |||
"3rdpartyurl" => "", | |||
/* What avatars to use. | |||
* May be "none" for none, "local" for uploaded avatars, or "gravatar" for gravatars. | |||
* Default is "local". | |||
*/ | |||
"avatars" => "local", | |||
/* Default app to load on login */ | |||
"defaultapp" => "files", | |||
@@ -8,52 +8,44 @@ | |||
/** | |||
* This class gets and sets users avatars. | |||
* Available backends are local (saved in users root at avatar.[png|jpg]), gravatar TODO and custom backends. | |||
* However the get function is easy to extend with further backends. | |||
*/ | |||
*/ | |||
class OC_Avatar { | |||
/** | |||
* @brief gets the users avatar | |||
* @param $user string username, if not provided, the default avatar will be returned | |||
* @param $size integer size in px of the avatar, defaults to 64 | |||
* @return mixed \OC_Image containing the avatar, a link to the avatar, false if avatars are disabled | |||
*/ | |||
public static function get ($user = false, $size = 64) { | |||
$mode = self::getMode(); | |||
if ($mode === "none") { | |||
// avatars are disabled | |||
return false; | |||
} else { | |||
if ($user === false) { | |||
return self::getDefaultAvatar($size); | |||
} elseif ($mode === "gravatar") { | |||
return self::getGravatar($user, $size); | |||
} elseif ($mode === "local") { | |||
return self::getLocalAvatar($user, $size); | |||
} elseif ($mode === "custom") { | |||
return self::getCustomAvatar($user, $size); | |||
} | |||
* @brief get the users avatar | |||
* @param $user string which user to get the avatar for | |||
* @param $size integer size in px of the avatar, defaults to 64 | |||
* @return \OC_Image containing the avatar | |||
*/ | |||
public static function get ($user, $size = 64) { | |||
if ($user === false) { | |||
return self::getDefaultAvatar($user, $size); | |||
} | |||
} | |||
/** | |||
* @brief returns the active avatar mode | |||
* @return string active avatar mode | |||
*/ | |||
public static function getMode () { | |||
return \OC_Config::getValue("avatar", "local"); | |||
} | |||
$view = new \OC\Files\View('/'.$user); | |||
if ($view->file_exists('avatar.jpg')) { | |||
$ext = 'jpg'; | |||
} elseif ($view->file_exists('avatar.png')) { | |||
$ext = 'png'; | |||
} else { | |||
return self::getDefaultAvatar($user, $size); | |||
} | |||
$avatar = new OC_Image($view->file_get_contents('avatar.'.$ext)); | |||
$avatar->resize($size); | |||
return $avatar; | |||
} | |||
/** | |||
* @brief sets the users local avatar | |||
* @brief sets the users avatar | |||
* @param $user string user to set the avatar for | |||
* @param $data mixed imagedata or path to set a new avatar, or false to delete the current avatar | |||
* @throws Exception if the provided file is not a jpg or png image | |||
* @throws Exception if the provided image is not valid, or not a square | |||
* @return true on success | |||
*/ | |||
public static function setLocalAvatar ($user, $data) { | |||
public static function set ($user, $data) { | |||
$view = new \OC\Files\View('/'.$user); | |||
if ($data === false) { | |||
@@ -66,7 +58,7 @@ class OC_Avatar { | |||
if ($type === 'peg') { $type = 'jpg'; } | |||
if ($type !== 'jpg' && $type !== 'png') { | |||
$l = \OC_L10N::get('lib'); | |||
throw new \Exception($l->t("Unknown filetype for avatar")); | |||
throw new \Exception($l->t("Unknown filetype")); | |||
} | |||
if (!( $img->valid() && ($img->height() === $img->width()) )) { | |||
@@ -81,54 +73,6 @@ class OC_Avatar { | |||
} | |||
} | |||
/** | |||
* @brief get the users gravatar | |||
* @param $user string which user to get the gravatar for | |||
* @param $size integer size in px of the avatar, defaults to 64 | |||
* @return string link to the gravatar, or \OC_Image with the default avatar | |||
*/ | |||
public static function getGravatar ($user, $size = 64) { | |||
$email = \OC_Preferences::getValue($user, 'settings', 'email'); | |||
if ($email !== null) { | |||
$emailhash = md5(strtolower(trim($email))); | |||
$url = "http://secure.gravatar.com/avatar/".$emailhash."?d=404&s=".$size; | |||
$headers = get_headers($url, 1); | |||
if (strpos($headers[0], "404 Not Found") === false) { | |||
return $url; | |||
} | |||
} | |||
return self::getDefaultAvatar($user, $size); | |||
} | |||
/** | |||
* @brief get the local avatar | |||
* @param $user string which user to get the avatar for | |||
* @param $size integer size in px of the avatar, defaults to 64 | |||
* @return string \OC_Image containing the avatar | |||
*/ | |||
public static function getLocalAvatar ($user, $size = 64) { | |||
$view = new \OC\Files\View('/'.$user); | |||
if ($view->file_exists('avatar.jpg')) { | |||
$ext = 'jpg'; | |||
} elseif ($view->file_exists('avatar.png')) { | |||
$ext = 'png'; | |||
} else { | |||
return self::getDefaultAvatar($user, $size); | |||
} | |||
$avatar = new OC_Image($view->file_get_contents('avatar.'.$ext)); | |||
$avatar->resize($size); | |||
return $avatar; | |||
} | |||
/** | |||
* @todo todo | |||
*/ | |||
public static function getCustomAvatar($user, $size) { | |||
// TODO | |||
} | |||
/** | |||
* @brief gets the default avatar | |||
* @brief $user string which user to get the avatar for | |||
@@ -137,8 +81,10 @@ class OC_Avatar { | |||
* @todo use custom default images, when they arive | |||
*/ | |||
public static function getDefaultAvatar ($user, $size = 64) { | |||
$default = new OC_Image(OC::$SERVERROOT."/core/img/defaultavatar.png"); | |||
// TODO | |||
/*$default = new OC_Image(OC::$SERVERROOT."/core/img/defaultavatar.png"); | |||
$default->resize($size); | |||
return $default; | |||
return $default;*/ | |||
return; | |||
} | |||
} |
@@ -30,7 +30,6 @@ $tmpl->assign('isWebDavWorking', OC_Util::isWebDAVWorking()); | |||
$tmpl->assign('has_fileinfo', OC_Util::fileInfoLoaded()); | |||
$tmpl->assign('backgroundjobs_mode', OC_Appconfig::getValue('core', 'backgroundjobs_mode', 'ajax')); | |||
$tmpl->assign('shareAPIEnabled', OC_Appconfig::getValue('core', 'shareapi_enabled', 'yes')); | |||
$tmpl->assign('avatar', OC_Config::getValue("avatar", "local")); | |||
// Check if connected using HTTPS | |||
if (OC_Request::serverProtocol() === 'https') { |
@@ -1,12 +0,0 @@ | |||
<?php | |||
/** | |||
* Copyright (c) 2013 Christopher Schäpers <christopher@schaepers.it> | |||
* This file is licensed under the Affero General Public License version 3 or | |||
* later. | |||
* See the COPYING-README file. | |||
*/ | |||
OC_Util::checkAdminUser(); | |||
OCP\JSON::callCheck(); | |||
OC_Config::setValue('avatar', $_POST['mode']); |
@@ -14,12 +14,6 @@ $(document).ready(function(){ | |||
} | |||
}); | |||
$('#avatar input').change(function(){ | |||
if ($(this).attr('checked')) { | |||
$.post(OC.filePath('settings', 'ajax', 'setavatarmode.php'), {mode: $(this).val()}); | |||
} | |||
}); | |||
$('#shareAPIEnabled').change(function() { | |||
$('.shareAPI td:not(#enable)').toggle(); | |||
}); |
@@ -15,9 +15,7 @@ OC_Util::addScript( 'settings', 'personal' ); | |||
OC_Util::addStyle( 'settings', 'settings' ); | |||
OC_Util::addScript( '3rdparty', 'chosen/chosen.jquery.min' ); | |||
OC_Util::addStyle( '3rdparty', 'chosen' ); | |||
if (OC_Config::getValue('avatar', 'local') === 'local') { | |||
\OC_Util::addScript('files', 'jquery.fileupload'); | |||
} | |||
\OC_Util::addScript('files', 'jquery.fileupload'); | |||
OC_App::setActiveNavigationEntry( 'personal' ); | |||
$storageInfo=OC_Helper::getStorageInfo(); |
@@ -70,5 +70,3 @@ $this->create('settings_ajax_setsecurity', '/settings/ajax/setsecurity.php') | |||
->actionInclude('settings/ajax/setsecurity.php'); | |||
$this->create('isadmin', '/settings/js/isadmin.js') | |||
->actionInclude('settings/js/isadmin.php'); | |||
$this->create('settings_ajax_setavatarmode', '/settings/ajax/setavatarmode.php') | |||
->actionInclude('settings/ajax/setavatarmode.php'); |
@@ -116,33 +116,6 @@ if (!$_['internetconnectionworking']) { | |||
</p> | |||
</fieldset> | |||
<fieldset class="personalblock" id="avatar"> | |||
<legend><strong><?php p($l->t('Profile images')); ?></strong></legend> | |||
<p> | |||
<input type="radio" name="avatarmode" value="gravatar" id="avatar_gravatar" | |||
<?php if ($_['avatar'] === "gravatar") { p('checked'); } ?> | |||
<?php if (!$_['internetconnectionworking']) { p('disabled'); } ?>> | |||
<label for="avatar_gravatar">Gravatar</label><br> | |||
<em><?php print_unescaped($l->t('Use <a href="http://gravatar.com/">gravatar</a> for profile images')); ?></em><br> | |||
<em><?php p($l->t('This sends data to gravatar and may slow down loading')); ?></em> | |||
<?php if (!$_['internetconnectionworking']): ?> | |||
<br><em><?php p($l->t('Gravatar needs an internet connection!')); ?></em> | |||
<?php endif; ?> | |||
</p> | |||
<p> | |||
<input type="radio" name="avatarmode" value="local" id="avatar_local" | |||
<?php if ($_['avatar'] === "local") { p('checked'); } ?>> | |||
<label for="avatar_local"><?php p($l->t('Local avatars')); ?></label><br> | |||
<em><?php p($l->t('Use local avatars, which each user has to upload themselves')); ?></em> | |||
</p> | |||
<p> | |||
<input type="radio" name="avatarmode" value="none" id="avatar_none" | |||
<?php if ($_['avatar'] === "none") { p('checked'); } ?>> | |||
<label for="avatar_none"><?php p($l->t('No avatars')); ?></label><br> | |||
<em><?php p($l->t('Do not provide avatars')); ?></em> | |||
</p> | |||
</fieldset> | |||
<fieldset class="personalblock" id="shareAPI"> | |||
<legend><strong><?php p($l->t('Sharing'));?></strong></legend> | |||
<table class="shareAPI nostyle"> |
@@ -83,26 +83,17 @@ if($_['passwordChangeSupported']) { | |||
} | |||
?> | |||
<?php if ($_['avatar'] !== "none"): ?> | |||
<form id="avatar" method="post" action="<?php p(\OC_Helper::linkTo('', 'avatar.php')); ?>"> | |||
<fieldset class="personalblock"> | |||
<legend><strong><?php p($l->t('Profile Image')); ?></strong></legend> | |||
<img src="<?php print_unescaped(link_to('', 'avatar.php').'?user='.OC_User::getUser().'&size=128'); ?>"><br> | |||
<?php if ($_['avatar'] === "local"): ?> | |||
<em><?php p($l->t('Your profile image has to be a square and either a PNG or JPG image')); ?></em><br> | |||
<div class="inlineblock button" id="uploadavatarbutton"><?php p($l->t('Upload a new image')); ?></div> | |||
<input type="file" class="hidden" name="files[]" id="uploadavatar"> | |||
<div class="inlineblock button" id="selectavatar"><?php p($l->t('Select a new image from your files')); ?></div> | |||
<div class="inlineblock button" id="removeavatar"><?php p($l->t('Remove my image')); ?></div> | |||
<?php elseif ($_['avatar'] === "gravatar"): ?> | |||
<em><?php p($l->t('Your profile image is provided by gravatar, which is based on your Email.')); ?></em> | |||
<div class?"inlineblock button" id="overridegravatar"><?php p($l->t('Use my local avatar instead')); ?></div> | |||
<?php else: ?> | |||
<em><?php p($l->t('Your profile image is provided by a custom service, ask your administrator, on how to change your image.')); ?></em> | |||
<?php endif; ?> | |||
<em><?php p($l->t('Has to be square and either PNG or JPG')); ?></em><br> | |||
<div class="inlineblock button" id="uploadavatarbutton"><?php p($l->t('Upload new')); ?></div> | |||
<input type="file" class="hidden" name="files[]" id="uploadavatar"> | |||
<div class="inlineblock button" id="selectavatar"><?php p($l->t('Select new from files')); ?></div> | |||
<div class="inlineblock button" id="removeavatar"><?php p($l->t('Remove image')); ?></div> | |||
</fieldset> | |||
</form> | |||
<?php endif; ?> | |||
<form> | |||
<fieldset class="personalblock"> |
@@ -81,9 +81,7 @@ $_['subadmingroups'] = array_flip($items); | |||
<table class="hascontrols" data-groups="<?php p(json_encode($allGroups));?>"> | |||
<thead> | |||
<tr> | |||
<?php if(\OC_Avatar::getMode() !== "none"): ?> | |||
<th id='headerAvatar'></th> | |||
<?php endif; ?> | |||
<th id='headerAvatar'></th> | |||
<th id='headerName'><?php p($l->t('Username'))?></th> | |||
<th id="headerDisplayName"><?php p($l->t( 'Display Name' )); ?></th> | |||
<th id="headerPassword"><?php p($l->t( 'Password' )); ?></th> | |||
@@ -99,9 +97,7 @@ $_['subadmingroups'] = array_flip($items); | |||
<?php foreach($_["users"] as $user): ?> | |||
<tr data-uid="<?php p($user["name"]) ?>" | |||
data-displayName="<?php p($user["displayName"]) ?>"> | |||
<?php if(\OC_Avatar::getMode() !== "none"): ?> | |||
<td class="avatar"><img src="<?php print_unescaped(link_to('', 'avatar.php')); ?>?user=<?php p($user['name']); ?>&size=32"></td> | |||
<?php endif; ?> | |||
<td class="avatar"><img src="<?php print_unescaped(link_to('', 'avatar.php')); ?>?user=<?php p($user['name']); ?>&size=32"></td> | |||
<td class="name"><?php p($user["name"]); ?></td> | |||
<td class="displayName"><span><?php p($user["displayName"]); ?></span> <img class="svg action" | |||
src="<?php p(image_path('core', 'actions/rename.svg'))?>" |
@@ -8,51 +8,23 @@ | |||
class Test_Avatar extends PHPUnit_Framework_TestCase { | |||
public function testModes() { | |||
$this->assertEquals('local', \OC_Avatar::getMode()); | |||
\OC_Config::setValue('avatar', 'local'); | |||
$this->assertEquals('local', \OC_Avatar::getMode()); | |||
\OC_Config::setValue('avatar', 'gravatar'); | |||
$this->assertEquals('gravatar', \OC_Avatar::getMode()); | |||
\OC_Config::setValue('avatar', 'none'); | |||
$this->assertEquals('none', \OC_Avatar::getMode()); | |||
} | |||
public function testDisabledAvatar() { | |||
\OC_Config::setValue('avatar', 'none'); | |||
$this->assertFalse(\OC_Avatar::get(\OC_User::getUser())); | |||
$this->assertFalse(\OC_Avatar::get(\OC_User::getUser(), 32)); | |||
} | |||
public function testLocalAvatar() { | |||
\OC_Config::setValue('avatar', 'local'); | |||
public function testAvatar() { | |||
$expected = \OC_Avatar::getDefaultAvatar()->data(); | |||
$this->assertEquals($expected, \OC_Avatar::get(\OC_User::getUser())->data()); | |||
$expected = new OC_Image(\OC::$SERVERROOT.'/tests/data/testavatar.png'); | |||
\OC_Avatar::setLocalAvatar(\OC_User::getUser(), $expected->data()); | |||
\OC_Avatar::set(\OC_User::getUser(), $expected->data()); | |||
$expected->resize(64); | |||
$this->assertEquals($expected->data(), \OC_Avatar::get(\OC_User::getUser())->data()); | |||
\OC_Avatar::setLocalAvatar(\OC_User::getUser(), false); | |||
\OC_Avatar::set(\OC_User::getUser(), false); | |||
$expected = \OC_Avatar::getDefaultAvatar()->data(); | |||
$this->assertEquals($expected, \OC_Avatar::get(\OC_User::getUser())->data()); | |||
} | |||
public function testGravatar() { | |||
\OC_Preferences::setValue(\OC_User::getUser(), 'settings', 'email', 'someone@example.com'); | |||
\OC_Config::setValue('avatar', 'gravatar'); | |||
$expected = "http://www.gravatar.com/avatar/".md5("someone@example.com")."?s="; | |||
$this->assertEquals($expected."64", \OC_Avatar::get(\OC_User::getUser())); | |||
$this->assertEquals($expected."32", \OC_Avatar::get(\OC_User::getUser(), 32)); | |||
} | |||
public function testDefaultAvatar() { | |||
/*public function testDefaultAvatar() { | |||
$img = new \OC_Image(OC::$SERVERROOT.'/core/img/defaultavatar.png'); | |||
$img->resize(128); | |||
$this->assertEquals($img->data(), \OC_Avatar::getDefaultAvatar(\OC_User::getUser(), 128)->data()); | |||
} | |||
}*/ | |||
} |