summaryrefslogtreecommitdiffstats
path: root/lib/avatar.php
blob: dcaf81f0349a806ca188612ac3916dd6987e7a11 (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
<?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.
 */

/**
 * This class gets and sets users avatars.
 * Avalaible backends are local (saved in users root at avatar.[png|jpg]) and gravatar.
 * However the get function is easy to extend with further backends.
*/

class OC_Avatar {
	/**
	 * @brief gets a link to the users avatar
	 * @param $user string username
	 * @param $size integer size in px of the avatar, defaults to 64
	 * @return mixed link to the avatar, false if avatars are disabled
	*/
	public static function get ($user, $size = 64) {
		$mode = OC_Config::getValue("avatar", "local");
		if ($mode === "none") {
			// avatars are disabled
			return false;
		} elseif ($mode === "gravatar") {
			return \OC_Avatar::getGravatar($user, $size);
		} elseif ($mode === "local") {
			return \OC_Avatar::getLocalAvatar($user, $size);
		}
	}

	/**
	 * @brief returns the active avatar mode
	 * @return string active avatar mode
	*/
	public static function getMode () {
		return OC_Config::getValue("avatar", "local");
	}

	/**
	 * @brief sets the users local 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) {
		$view = new \OC\Files\View('/'.$user);

		if ($data === false) {
			$view->unlink('avatar.jpg');
			$view->unlink('avatar.png');
			return true;
		} else {
			$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') {
				throw new Exception();
			}

			if (!( $img->valid() && ($img->height() === $img->width()) )) {
				throw new Exception();
			}

			$view->unlink('avatar.jpg');
			$view->unlink('avatar.png');
			$view->file_put_contents('avatar.'.$type, $data);
			return true;
		}
	}

	/**
	 * @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 base64encoded, html-ready image
	*/
	public static function getGravatar ($user, $size = 64) {
		$email = OC_Preferences::getValue($user, 'settings', 'email');
		if ($email !== null) {
			$emailhash = md5(strtolower(trim($email)));
			$url = "http://www.gravatar.com/avatar/".$emailhash."?s=".$size;
			return $url;
		} else {
			return \OC_Avatar::wrapIntoImg(\OC_Avatar::getDefaultAvatar($size), 'png');
		}
	}

	/**
	 * @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 base64encoded encoded, html-ready image
	*/
	public static function getLocalAvatar ($user, $size = 64) {
		$view = new \OC\Files\View('/'.$user);

		if ($view->file_exists('avatar.jpg')) {
			$type = 'jpg';
		} elseif ($view->file_exists('avatar.png')) {
			$type = 'png';
		} else {
			return \OC_Avatar::wrapIntoImg(\OC_Avatar::getDefaultAvatar($size), 'png');
		}

		$avatar = new OC_Image($view->file_get_contents('avatar.'.$type));
		$avatar->resize($size);
		return \OC_Avatar::wrapIntoImg((string)$avatar, $type);
	}

	/**
	 * @brief gets the default avatar
	 * @param $size integer size of the avatar in px, defaults to 64
	 * @return string base64 encoded default avatar
	*/
	public static function getDefaultAvatar ($size = 64) {
		$default = new OC_Image(OC::$SERVERROOT."/core/img/defaultavatar.png");
		$default->resize($size);
		return (string)$default;
	}

	/**
	 * @brief wrap a base64encoded image, so it can be used in html
	 * @param $img string base64encoded image
	 * @param $type string imagetype
	 * @return string wrapped image
	*/
	public static function wrapIntoImg($img, $type) {
		return 'data:image/'.$type.';base64,'.$img;
	}
}