"
data-displayName="">
+
+ "> |
+
|
$displayName) {
$users[] = array(
"name" => $uid,
+ "avatar" => \OC_Avatar::get($uid, 32),
"displayName" => $displayName,
"groups" => OC_Group::getUserGroups($uid),
'quota' => $quota,
From 2bfe66223563b16a067be273e0d6979b420598ad Mon Sep 17 00:00:00 2001
From: kondou
Date: Tue, 30 Jul 2013 16:09:54 +0200
Subject: [PATCH 011/169] Add unittests & check filetype in setLocalAvatar()
TODO: Fix OC_Image->mimetype(), it always returns "image/png"
---
lib/avatar.php | 10 ++++--
settings/ajax/newavatar.php | 10 +++---
tests/data/testavatar.png | Bin 0 -> 3705 bytes
tests/lib/avatar.php | 61 ++++++++++++++++++++++++++++++++++++
4 files changed, 73 insertions(+), 8 deletions(-)
create mode 100644 tests/data/testavatar.png
create mode 100644 tests/lib/avatar.php
diff --git a/lib/avatar.php b/lib/avatar.php
index b232e9be76..f3db07142c 100644
--- a/lib/avatar.php
+++ b/lib/avatar.php
@@ -43,11 +43,11 @@ class OC_Avatar {
* @brief sets the users local avatar
* @param $user string user to set the avatar for
* @param $img mixed imagedata to set a new avatar, or false to delete the current avatar
- * @param $type string fileextension
+ * @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, $img, $type) {
+ public static function setLocalAvatar ($user, $img) {
$view = new \OC\Files\View('/'.$user);
if ($img === false) {
@@ -56,6 +56,12 @@ class OC_Avatar {
return true;
} else {
$img = new OC_Image($img);
+ // FIXME this always says "image/png"
+ $type = substr($img->mimeType(), -3);
+ if ($type === 'peg') { $type = 'jpg'; }
+ if ($type !== 'jpg' && $type !== 'png') {
+ throw new Exception();
+ }
if (!( $img->valid() && ($img->height() === $img->width()) )) {
throw new Exception();
diff --git a/settings/ajax/newavatar.php b/settings/ajax/newavatar.php
index b52317c967..456cd84e97 100644
--- a/settings/ajax/newavatar.php
+++ b/settings/ajax/newavatar.php
@@ -7,18 +7,16 @@ $user = OC_User::getUser();
if(isset($_POST['path'])) {
$path = $_POST['path'];
if ($path === "false") { // delete avatar
- \OC_Avatar::setLocalAvatar($user, false, false);
+ \OC_Avatar::setLocalAvatar($user, false);
} else { // select an image from own files
$view = new \OC\Files\View('/'.$user.'/files');
$img = $view->file_get_contents($path);
$type = substr($path, -3);
- if ($type === 'peg') { $type = 'jpg'; }
-
- if ($type === 'jpg' or $type === 'png') {
- \OC_Avatar::setLocalAvatar($user, $img, $type);
+ try {
+ \OC_Avatar::setLocalAvatar($user, $img);
OC_JSON::success();
- } else {
+ } catch (Exception $e) {
OC_JSON::error();
}
}
diff --git a/tests/data/testavatar.png b/tests/data/testavatar.png
new file mode 100644
index 0000000000000000000000000000000000000000..24770fb634f028fbff8c0625e987ead5bb0471c9
GIT binary patch
literal 3705
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
Lp|4(t#Yg`S#CoGw
literal 0
HcmV?d00001
diff --git a/tests/lib/avatar.php b/tests/lib/avatar.php
new file mode 100644
index 0000000000..b1d9f46ed0
--- /dev/null
+++ b/tests/lib/avatar.php
@@ -0,0 +1,61 @@
+
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+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');
+ $this->assertEquals(\OC_Avatar::get(\OC_User::getUser()), \OC_Avatar::wrapIntoImg(\OC_Avatar::getDefaultAvatar(), 'png'));
+
+ $expected = new OC_Image(\OC::$SERVERROOT.'/tests/data/testavatar.png');
+ \OC_Avatar::setLocalAvatar(\OC_User::getUser(), $expected->data());
+ $expected->resize(32);
+ $this->assertEquals($expected, \OC_Avatar::get(\OC_User::getUser()));
+
+ \OC_Avatar::setLocalAvatar(\OC_User::getUser(), false);
+ $this->assertEquals(\OC_Avatar::get(\OC_User::getUser()), \OC_Avatar::wrapIntoImg(\OC_Avatar::getDefaultAvatar(), 'png'));
+ }
+
+ 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() {
+ $img = new \OC_Image(OC::$SERVERROOT.'/core/img/defaultavatar.png');
+ $img->resize(128);
+ $this->assertEquals((string)$img, \OC_Avatar::getDefaultAvatar(128));
+ }
+
+ public function testWrapIntoImg() {
+ $expected = "data:image/test;base64,DUMMY==123==";
+ $this->assertEquals($expected, \OC_Avatar::wrapIntoImg("DUMMY==123==", "test"));
+ }
+}
From a58d270684110334aab1b296b69e98def6cc6558 Mon Sep 17 00:00:00 2001
From: kondou
Date: Thu, 1 Aug 2013 17:13:11 +0200
Subject: [PATCH 012/169] Load avatar from path, if one's provided
---
lib/avatar.php | 12 ++++++------
settings/ajax/newavatar.php | 10 +++-------
2 files changed, 9 insertions(+), 13 deletions(-)
diff --git a/lib/avatar.php b/lib/avatar.php
index f3db07142c..dcaf81f034 100644
--- a/lib/avatar.php
+++ b/lib/avatar.php
@@ -42,21 +42,21 @@ class OC_Avatar {
/**
* @brief sets the users local avatar
* @param $user string user to set the avatar for
- * @param $img mixed imagedata to set a new avatar, or false to delete the current avatar
+ * @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, $img) {
+ public static function setLocalAvatar ($user, $data) {
$view = new \OC\Files\View('/'.$user);
- if ($img === false) {
+ if ($data === false) {
$view->unlink('avatar.jpg');
$view->unlink('avatar.png');
return true;
} else {
- $img = new OC_Image($img);
- // FIXME this always says "image/png"
+ $img = new OC_Image($data);
+ // FIXME this always says "image/png", when loading from data
$type = substr($img->mimeType(), -3);
if ($type === 'peg') { $type = 'jpg'; }
if ($type !== 'jpg' && $type !== 'png') {
@@ -69,7 +69,7 @@ class OC_Avatar {
$view->unlink('avatar.jpg');
$view->unlink('avatar.png');
- $view->file_put_contents('avatar.'.$type, $img);
+ $view->file_put_contents('avatar.'.$type, $data);
return true;
}
}
diff --git a/settings/ajax/newavatar.php b/settings/ajax/newavatar.php
index 456cd84e97..4c8ff0c416 100644
--- a/settings/ajax/newavatar.php
+++ b/settings/ajax/newavatar.php
@@ -5,16 +5,12 @@ OC_JSON::callCheck();
$user = OC_User::getUser();
if(isset($_POST['path'])) {
- $path = $_POST['path'];
- if ($path === "false") { // delete avatar
+ if ($_POST['path'] === "false") { // delete avatar
\OC_Avatar::setLocalAvatar($user, false);
} else { // select an image from own files
- $view = new \OC\Files\View('/'.$user.'/files');
- $img = $view->file_get_contents($path);
-
- $type = substr($path, -3);
try {
- \OC_Avatar::setLocalAvatar($user, $img);
+ $path = OC::$SERVERROOT.'/data/'.$user.'/files'.$_POST['path'];
+ \OC_Avatar::setLocalAvatar($user, $path);
OC_JSON::success();
} catch (Exception $e) {
OC_JSON::error();
From 252548c62cf099e5186ffc323e3cf9494fae3768 Mon Sep 17 00:00:00 2001
From: kondou
Date: Fri, 2 Aug 2013 08:03:51 +0200
Subject: [PATCH 013/169] Improve styling & enable avatar-upload at personal
page
---
core/css/styles.css | 5 +++++
core/templates/layout.user.php | 4 +++-
lib/templatelayout.php | 2 +-
settings/ajax/newavatar.php | 15 +++++++++++----
settings/css/settings.css | 3 +++
settings/js/personal.js | 8 ++++++++
settings/personal.php | 3 +++
settings/templates/admin.php | 21 ++++++++-------------
settings/templates/personal.php | 2 +-
tests/lib/avatar.php | 2 +-
10 files changed, 44 insertions(+), 21 deletions(-)
diff --git a/core/css/styles.css b/core/css/styles.css
index 367f3f7ca4..792ccb0832 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -40,6 +40,11 @@ body { background:#fefefe; font:normal .8em/1.6em "Helvetica Neue",Helvetica,Ari
.header-right { float:right; vertical-align:middle; padding:0.5em; }
.header-right > * { vertical-align:middle; }
+header .avatar {
+ float:right;
+ margin-top: 6px;
+ margin-right: 6px;
+}
/* INPUTS */
input[type="text"], input[type="password"], input[type="search"], input[type="number"], input[type="email"], input[type="url"],
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index 038264bd06..0ab6a4dc08 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -45,9 +45,11 @@
getLogoClaim()); ?>
+
+
+
-
diff --git a/lib/templatelayout.php b/lib/templatelayout.php
index f24cd9cfd9..c26dff4176 100644
--- a/lib/templatelayout.php
+++ b/lib/templatelayout.php
@@ -20,7 +20,7 @@ class OC_TemplateLayout extends OC_Template {
// display avatars if they are enabled
if (OC_Config::getValue('avatar') === 'gravatar' || OC_Config::getValue('avatar', 'local') === 'local') {
- $this->assign('avatar', ' ');
+ $this->assign('avatar', ' ');
}
// Update notification
diff --git a/settings/ajax/newavatar.php b/settings/ajax/newavatar.php
index 4c8ff0c416..bede15e499 100644
--- a/settings/ajax/newavatar.php
+++ b/settings/ajax/newavatar.php
@@ -13,12 +13,19 @@ if(isset($_POST['path'])) {
\OC_Avatar::setLocalAvatar($user, $path);
OC_JSON::success();
} catch (Exception $e) {
- OC_JSON::error();
+ OC_JSON::error(array("msg" => $e->getMessage()));
}
}
-} elseif (isset($_POST['image'])) { // upload a new image
- \OC_Avatar::setLocalAvatar($user, $_POST['image']);
- OC_JSON::success();
+} elseif (!empty($_FILES)) { // upload a new image
+ $files = $_FILES['files'];
+ if ($files['error'][0] === 0) {
+ $data = file_get_contents($files['tmp_name'][0]);
+ \OC_Avatar::setLocalAvatar($user, $data);
+ unlink($files['tmp_name'][0]);
+ OC_JSON::success();
+ } else {
+ OC_JSON::error();
+ }
} else {
OC_JSON::error();
}
diff --git a/settings/css/settings.css b/settings/css/settings.css
index d5ffe44848..e6ced0e375 100644
--- a/settings/css/settings.css
+++ b/settings/css/settings.css
@@ -35,6 +35,9 @@ td.name, td.password { padding-left:.8em; }
td.password>img,td.displayName>img, td.remove>a, td.quota>img { visibility:hidden; }
td.password, td.quota, td.displayName { width:12em; cursor:pointer; }
td.password>span, td.quota>span, rd.displayName>span { margin-right: 1.2em; color: #C7C7C7; }
+td.avatar img {
+ margin-top: 6px;
+}
td.remove { width:1em; padding-right:1em; }
tr:hover>td.password>span, tr:hover>td.displayName>span { margin:0; cursor:pointer; }
diff --git a/settings/js/personal.js b/settings/js/personal.js
index fdaca07e98..71b4785bbf 100644
--- a/settings/js/personal.js
+++ b/settings/js/personal.js
@@ -144,6 +144,14 @@ $(document).ready(function(){
updateAvatar();
});
+ var uploadparms = {
+ done: function(e) {
+ updateAvatar();
+ }
+ };
+
+ $('#uploadavatar').fileupload(uploadparms);
+
$('#selectavatar').click(function(){
OC.dialogs.filepicker(t('settings', "Select an avatar"), selectAvatar, false, "image");
});
diff --git a/settings/personal.php b/settings/personal.php
index 4bec21d58c..233b1440eb 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -15,6 +15,9 @@ 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_App::setActiveNavigationEntry( 'personal' );
$storageInfo=OC_Helper::getStorageInfo();
diff --git a/settings/templates/admin.php b/settings/templates/admin.php
index e5b941f2b2..f7d6a576d9 100644
--- a/settings/templates/admin.php
+++ b/settings/templates/admin.php
@@ -121,10 +121,9 @@ if (!$_['internetconnectionworking']) {
diff --git a/settings/templates/personal.php b/settings/templates/personal.php
index 01415a6f9a..e0e91cb7de 100644
--- a/settings/templates/personal.php
+++ b/settings/templates/personal.php
@@ -87,7 +87,7 @@ if($_['passwordChangeSupported']) {
|