From 0f2c43bd040437b3e40c706d7c3f4ba163e94a71 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 2 Feb 2009 18:53:15 +0000 Subject: Fixed direct messaging: AjaxWebChannel is now using Action's methods. --- classes/Channel.php | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'classes') diff --git a/classes/Channel.php b/classes/Channel.php index 2e3e4e8d4..c03efef48 100644 --- a/classes/Channel.php +++ b/classes/Channel.php @@ -19,7 +19,7 @@ if (!defined('LACONICA')) { exit(1); } -class Channel +class Channel extends Action { function on($user) @@ -129,6 +129,7 @@ class WebChannel extends Channel # XXX: buffer all output and send it at the end # XXX: even better, redirect to appropriate page # depending on what command was run + common_show_header(_('Command results')); common_element('p', null, $text); common_show_footer(); @@ -146,26 +147,26 @@ class AjaxWebChannel extends WebChannel function output($user, $text) { - common_start_html('text/xml;charset=utf-8', true); - common_element_start('head'); - common_element('title', null, _('Command results')); - common_element_end('head'); - common_element_start('body'); - common_element('p', array('id' => 'command_result'), $text); - common_element_end('body'); - common_element_end('html'); + $this->startHTML('text/xml;charset=utf-8', true); + $this->elementStart('head'); + $this->element('title', null, _('Command results')); + $this->elementEnd('head'); + $this->elementStart('body'); + $this->element('p', array('id' => 'command_result'), $text); + $this->elementEnd('body'); + $this->elementEnd('html'); } function error($user, $text) { - common_start_html('text/xml;charset=utf-8', true); - common_element_start('head'); - common_element('title', null, _('Ajax Error')); - common_element_end('head'); - common_element_start('body'); - common_element('p', array('id' => 'error'), $text); - common_element_end('body'); - common_element_end('html'); + $this->startHTML('text/xml;charset=utf-8', true); + $this->elementStart('head'); + $this->element('title', null, _('Ajax error')); + $this->elementEnd('head'); + $this->elementStart('body'); + $this->element('p', array('id' => 'error'), $text); + $this->elementEnd('body'); + $this->elementEnd('html'); } } -- cgit v1.2.3-54-g00ecf From 15b96f78ab9c294e6e20ff2411662793dae1e2d9 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 4 Feb 2009 07:33:10 -0500 Subject: Revert "Fixed direct messaging: AjaxWebChannel is now using Action's methods." This reverts commit 0f2c43bd040437b3e40c706d7c3f4ba163e94a71. Making Channel a subclass of Action for no other reason than to let the AjaxWebChannel do some output is the really, really wrong way to do this. A Channel is not an Action. I'll change AjaxWebChannel so it takes an Action as a constructor paramater and uses that Action for its output. We do this for most Widget subclasses and it makes sense here, too. --- classes/Channel.php | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) (limited to 'classes') diff --git a/classes/Channel.php b/classes/Channel.php index c03efef48..2e3e4e8d4 100644 --- a/classes/Channel.php +++ b/classes/Channel.php @@ -19,7 +19,7 @@ if (!defined('LACONICA')) { exit(1); } -class Channel extends Action +class Channel { function on($user) @@ -129,7 +129,6 @@ class WebChannel extends Channel # XXX: buffer all output and send it at the end # XXX: even better, redirect to appropriate page # depending on what command was run - common_show_header(_('Command results')); common_element('p', null, $text); common_show_footer(); @@ -147,26 +146,26 @@ class AjaxWebChannel extends WebChannel function output($user, $text) { - $this->startHTML('text/xml;charset=utf-8', true); - $this->elementStart('head'); - $this->element('title', null, _('Command results')); - $this->elementEnd('head'); - $this->elementStart('body'); - $this->element('p', array('id' => 'command_result'), $text); - $this->elementEnd('body'); - $this->elementEnd('html'); + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Command results')); + common_element_end('head'); + common_element_start('body'); + common_element('p', array('id' => 'command_result'), $text); + common_element_end('body'); + common_element_end('html'); } function error($user, $text) { - $this->startHTML('text/xml;charset=utf-8', true); - $this->elementStart('head'); - $this->element('title', null, _('Ajax error')); - $this->elementEnd('head'); - $this->elementStart('body'); - $this->element('p', array('id' => 'error'), $text); - $this->elementEnd('body'); - $this->elementEnd('html'); + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Ajax Error')); + common_element_end('head'); + common_element_start('body'); + common_element('p', array('id' => 'error'), $text); + common_element_end('body'); + common_element_end('html'); } } -- cgit v1.2.3-54-g00ecf From 2d063650effb22c90936a4588f44946c69e1d9a1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 4 Feb 2009 07:59:30 -0500 Subject: Make WebChannel and AjaxWebChannel work These command-output channels were using the old common_element_* functions. They now take an $out constructor parameter, and use that for output. The WebChannel has pretty remedial output; it would be nice if it output a real formatted page. --- actions/newnotice.php | 4 +-- classes/Channel.php | 93 +++++++++++++++++++++++++++------------------------ 2 files changed, 52 insertions(+), 45 deletions(-) (limited to 'classes') diff --git a/actions/newnotice.php b/actions/newnotice.php index e3974cd07..61f0f8365 100644 --- a/actions/newnotice.php +++ b/actions/newnotice.php @@ -141,9 +141,9 @@ class NewnoticeAction extends Action if ($cmd) { if ($this->boolean('ajax')) { - $cmd->execute(new AjaxWebChannel()); + $cmd->execute(new AjaxWebChannel($this)); } else { - $cmd->execute(new WebChannel()); + $cmd->execute(new WebChannel($this)); } return; } diff --git a/classes/Channel.php b/classes/Channel.php index 2e3e4e8d4..fdeff21fc 100644 --- a/classes/Channel.php +++ b/classes/Channel.php @@ -21,7 +21,7 @@ if (!defined('LACONICA')) { exit(1); } class Channel { - + function on($user) { return false; @@ -36,12 +36,12 @@ class Channel { return false; } - + function error($user, $text) { return false; } - + function source() { return null; @@ -52,22 +52,22 @@ class XMPPChannel extends Channel { var $conn = null; - + function source() { return 'xmpp'; } - + function __construct($conn) { $this->conn = $conn; } - + function on($user) { return $this->set_notify($user, 1); } - + function off($user) { return $this->set_notify($user, 0); @@ -78,13 +78,13 @@ class XMPPChannel extends Channel $text = '['.common_config('site', 'name') . '] ' . $text; jabber_send_message($user->jabber, $text); } - + function error($user, $text) { $text = '['.common_config('site', 'name') . '] ' . $text; jabber_send_message($user->jabber, $text); } - + function set_notify(&$user, $notify) { $orig = clone($user); @@ -105,20 +105,25 @@ class XMPPChannel extends Channel } } - class WebChannel extends Channel { + var $out = null; + + function __construct($out=null) + { + $this->out = $out; + } function source() { return 'web'; } - + function on($user) { return false; } - + function off($user) { return false; @@ -129,47 +134,49 @@ class WebChannel extends Channel # XXX: buffer all output and send it at the end # XXX: even better, redirect to appropriate page # depending on what command was run - common_show_header(_('Command results')); - common_element('p', null, $text); - common_show_footer(); + $this->out->startHTML(); + $this->out->elementStart('head'); + $this->out->element('title', null, _('Command results')); + $this->out->elementEnd('head'); + $this->out->elementStart('body'); + $this->out->element('p', array('id' => 'command_result'), $text); + $this->out->elementEnd('body'); + $this->out->endHTML(); } - + function error($user, $text) { common_user_error($text); } } - class AjaxWebChannel extends WebChannel { - function output($user, $text) { - common_start_html('text/xml;charset=utf-8', true); - common_element_start('head'); - common_element('title', null, _('Command results')); - common_element_end('head'); - common_element_start('body'); - common_element('p', array('id' => 'command_result'), $text); - common_element_end('body'); - common_element_end('html'); + $this->out->startHTML('text/xml;charset=utf-8'); + $this->out->elementStart('head'); + $this->out->element('title', null, _('Command results')); + $this->out->elementEnd('head'); + $this->out->elementStart('body'); + $this->out->element('p', array('id' => 'command_result'), $text); + $this->out->elementEnd('body'); + $this->out->endHTML(); } function error($user, $text) { - common_start_html('text/xml;charset=utf-8', true); - common_element_start('head'); - common_element('title', null, _('Ajax Error')); - common_element_end('head'); - common_element_start('body'); - common_element('p', array('id' => 'error'), $text); - common_element_end('body'); - common_element_end('html'); + $this->out->startHTML('text/xml;charset=utf-8'); + $this->out->elementStart('head'); + $this->out->element('title', null, _('Ajax Error')); + $this->out->elementEnd('head'); + $this->out->elementStart('body'); + $this->out->element('p', array('id' => 'error'), $text); + $this->out->elementEnd('body'); + $this->out->endHTML(); } } - class MailChannel extends Channel { @@ -179,17 +186,17 @@ class MailChannel extends Channel { return 'mail'; } - + function __construct($addr=null) { $this->addr = $addr; } - + function on($user) { return $this->set_notify($user, 1); } - + function off($user) { return $this->set_notify($user, 0); @@ -200,23 +207,23 @@ class MailChannel extends Channel $headers['From'] = $user->incomingemail; $headers['To'] = $this->addr; - + $headers['Subject'] = _('Command complete'); return mail_send(array($this->addr), $headers, $text); } - + function error($user, $text) { - + $headers['From'] = $user->incomingemail; $headers['To'] = $this->addr; - + $headers['Subject'] = _('Command failed'); return mail_send(array($this->addr), $headers, $text); } - + function set_notify($user, $value) { $orig = clone($user); -- cgit v1.2.3-54-g00ecf From 5c880bc6cc34793c2eb87697e4ca66ca2e6e12f9 Mon Sep 17 00:00:00 2001 From: Sean Murphy Date: Wed, 4 Feb 2009 14:44:12 -0500 Subject: Fix for #1057; group logo transparecy (and pixilation) --- actions/grouplogo.php | 44 ++++++++++++++++++++++++++++++-------------- classes/User_group.php | 29 ++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 21 deletions(-) (limited to 'classes') diff --git a/actions/grouplogo.php b/actions/grouplogo.php index ba9cdfe2a..d8f7a9353 100644 --- a/actions/grouplogo.php +++ b/actions/grouplogo.php @@ -364,7 +364,7 @@ class GrouplogoAction extends Action $this->mode = 'crop'; - $this->showForm(_('Pick a square area of the image to be your avatar'), + $this->showForm(_('Pick a square area of the image to be the logo.'), true); } @@ -377,7 +377,6 @@ class GrouplogoAction extends Action function cropLogo() { $user = common_current_user(); - $profile = $user->getProfile(); $filedata = $_SESSION['FILEDATA']; @@ -387,11 +386,6 @@ class GrouplogoAction extends Action return; } - $x = $this->arg('avatar_crop_x'); - $y = $this->arg('avatar_crop_y'); - $w = ($this->arg('avatar_crop_w')) ? $this->arg('avatar_crop_w') : $filedata['width']; - $h = ($this->arg('avatar_crop_h')) ? $this->arg('avatar_crop_h') : $filedata['height']; - $filepath = common_avatar_path($filedata['filename']); if (!file_exists($filepath)) { @@ -414,17 +408,39 @@ class GrouplogoAction extends Action return; } - $size = ($w > MAX_ORIGINAL) ? MAX_ORIGINAL : $w; + // If image is not being cropped assume pos & dimentions of original + $dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0; + $dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0; + $dest_w = $this->arg('avatar_crop_w') ? $this->arg('avatar_crop_w'):$filedata['width']; + $dest_h = $this->arg('avatar_crop_h') ? $this->arg('avatar_crop_h'):$filedata['height']; + $size = ($dest_w > MAX_ORIGINAL) ? MAX_ORIGINAL : $dest_w; + + common_debug("W = $dest_w, H = $dest_h, X = $dest_x, Y = $dest_y, size = $size"); $image_dest = imagecreatetruecolor($size, $size); + + if ($filedata['type'] == IMAGETYPE_GIF || $filedata['type'] == IMAGETYPE_PNG) { + + $transparent_idx = imagecolortransparent($image_src); + + if ($transparent_idx >= 0) { - $background = imagecolorallocate($image_dest, 0, 0, 0); - ImageColorTransparent($image_dest, $background); - imagealphablending($image_dest, false); + $transparent_color = imagecolorsforindex($image_src, $transparent_idx); + $transparent_idx = imagecolorallocate($image_dest, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']); + imagefill($image_dest, 0, 0, $transparent_idx); + imagecolortransparent($image_dest, $transparent_idx); + + } elseif ($filedata['type'] == IMAGETYPE_PNG) { + + imagealphablending($image_dest, false); + $transparent = imagecolorallocatealpha($image_dest, 0, 0, 0, 127); + imagefill($image_dest, 0, 0, $transparent); + imagesavealpha($image_dest, true); + + } + } - imagecopyresized($image_dest, $image_src, - 0, 0, $x, $y, - $size, $size, $w, $h); + imagecopyresampled($image_dest, $image_src, 0, 0, $dest_x, $dest_y, $size, $size, $dest_w, $dest_h); $filename = common_avatar_filename($this->group->id, image_type_to_extension($filedata['type']), diff --git a/classes/User_group.php b/classes/User_group.php index 522dd8143..092c1bc34 100755 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -132,14 +132,29 @@ class User_group extends Memcached_DataObject } $image_dest = imagecreatetruecolor($size, $size); + + if ($type == IMAGETYPE_GIF || $type == IMAGETYPE_PNG) { + + $transparent_idx = imagecolortransparent($image_src); + + if ($transparent_idx >= 0) { + + $transparent_color = imagecolorsforindex($image_src, $transparent_idx); + $transparent_idx = imagecolorallocate($image_dest, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']); + imagefill($image_dest, 0, 0, $transparent_idx); + imagecolortransparent($image_dest, $transparent_idx); + + } elseif ($type == IMAGETYPE_PNG) { + + imagealphablending($image_dest, false); + $transparent = imagecolorallocatealpha($image_dest, 0, 0, 0, 127); + imagefill($image_dest, 0, 0, $transparent); + imagesavealpha($image_dest, true); + + } + } - $background = imagecolorallocate($image_dest, 0, 0, 0); - ImageColorTransparent($image_dest, $background); - imagealphablending($image_dest, false); - - imagecopyresized($image_dest, $image_src, - 0, 0, 0, 0, - $size, $size, $info[0], $info[1]); + imagecopyresampled($image_dest, $image_src, 0, 0, 0, 0, $size, $size, $info[0], $info[1]); $outname = common_avatar_filename($this->id, image_type_to_extension($type), -- cgit v1.2.3-54-g00ecf From 7e975b17c5a857479826f6d730c1ca85c513f4d1 Mon Sep 17 00:00:00 2001 From: Sean Murphy Date: Wed, 4 Feb 2009 19:32:15 -0500 Subject: Fixed #1134; Consolidated image scaling functions. --- actions/avatarsettings.php | 89 +++++++------------------------- actions/grouplogo.php | 86 +++---------------------------- classes/Avatar.php | 96 ----------------------------------- classes/Profile.php | 67 ++++++++---------------- classes/User_group.php | 92 +++------------------------------ lib/imagefile.php | 124 +++++++++++++++++++++++++++++++++++---------- 6 files changed, 152 insertions(+), 402 deletions(-) (limited to 'classes') diff --git a/actions/avatarsettings.php b/actions/avatarsettings.php index 19f53b882..643c0e567 100644 --- a/actions/avatarsettings.php +++ b/actions/avatarsettings.php @@ -34,6 +34,8 @@ if (!defined('LACONICA')) { require_once INSTALLDIR.'/lib/accountsettingsaction.php'; +define('MAX_ORIGINAL', 480); + /** * Upload an avatar * @@ -286,7 +288,7 @@ class AvatarsettingsAction extends AccountSettingsAction $filepath = common_avatar_path($filename); - move_uploaded_file($imagefile->filename, $filepath); + move_uploaded_file($imagefile->filepath, $filepath); $filedata = array('filename' => $filename, 'filepath' => $filepath, @@ -312,84 +314,29 @@ class AvatarsettingsAction extends AccountSettingsAction function cropAvatar() { - $user = common_current_user(); - - $profile = $user->getProfile(); - - $x = $this->arg('avatar_crop_x'); - $y = $this->arg('avatar_crop_y'); - $w = $this->arg('avatar_crop_w'); - $h = $this->arg('avatar_crop_h'); - $filedata = $_SESSION['FILEDATA']; if (!$filedata) { $this->serverError(_('Lost our file data.')); return; } - - $filepath = common_avatar_path($filedata['filename']); - - if (!file_exists($filepath)) { - $this->serverError(_('Lost our file.')); - return; - } - - switch ($filedata['type']) { - case IMAGETYPE_GIF: - $image_src = imagecreatefromgif($filepath); - break; - case IMAGETYPE_JPEG: - $image_src = imagecreatefromjpeg($filepath); - break; - case IMAGETYPE_PNG: - $image_src = imagecreatefrompng($filepath); - break; - default: - $this->serverError(_('Unknown file type')); - return; - } - - common_debug("W = $w, H = $h, X = $x, Y = $y"); - - $image_dest = imagecreatetruecolor($w, $h); - - $background = imagecolorallocate($image_dest, 0, 0, 0); - ImageColorTransparent($image_dest, $background); - imagealphablending($image_dest, false); - - imagecopyresized($image_dest, $image_src, 0, 0, $x, $y, $w, $h, $w, $h); - - $cur = common_current_user(); - - $filename = common_avatar_filename($cur->id, - image_type_to_extension($filedata['type']), - null, - common_timestamp()); - - $filepath = common_avatar_path($filename); - - switch ($filedata['type']) { - case IMAGETYPE_GIF: - imagegif($image_dest, $filepath); - break; - case IMAGETYPE_JPEG: - imagejpeg($image_dest, $filepath); - break; - case IMAGETYPE_PNG: - imagepng($image_dest, $filepath); - break; - default: - $this->serverError(_('Unknown file type')); - return; - } - + + // If image is not being cropped assume pos & dimentions of original + $dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0; + $dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0; + $dest_w = $this->arg('avatar_crop_w') ? $this->arg('avatar_crop_w'):$filedata['width']; + $dest_h = $this->arg('avatar_crop_h') ? $this->arg('avatar_crop_h'):$filedata['height']; + $size = min($dest_w, $dest_h); + $size = ($size > MAX_ORIGINAL) ? MAX_ORIGINAL:$size; + $user = common_current_user(); + $profile = $user->getProfile(); + + $imagefile = new ImageFile($user->id, $filedata['filepath']); + $filename = $imagefile->resize($size, $dest_x, $dest_y, $dest_w, $dest_h); - $profile = $cur->getProfile(); - - if ($profile->setOriginal($filepath)) { - @unlink(common_avatar_path($filedata['filename'])); + if ($profile->setOriginal($filename)) { + @unlink($filedata['filepath']); unset($_SESSION['FILEDATA']); $this->mode = 'upload'; $this->showForm(_('Avatar updated.'), true); diff --git a/actions/grouplogo.php b/actions/grouplogo.php index d8f7a9353..294005f1b 100644 --- a/actions/grouplogo.php +++ b/actions/grouplogo.php @@ -350,7 +350,7 @@ class GrouplogoAction extends Action $filepath = common_avatar_path($filename); - move_uploaded_file($imagefile->filename, $filepath); + move_uploaded_file($imagefile->filepath, $filepath); $filedata = array('filename' => $filename, 'filepath' => $filepath, @@ -376,96 +376,26 @@ class GrouplogoAction extends Action function cropLogo() { - $user = common_current_user(); - $profile = $user->getProfile(); - $filedata = $_SESSION['FILEDATA']; if (!$filedata) { $this->serverError(_('Lost our file data.')); return; } - - $filepath = common_avatar_path($filedata['filename']); - - if (!file_exists($filepath)) { - $this->serverError(_('Lost our file.')); - return; - } - - switch ($filedata['type']) { - case IMAGETYPE_GIF: - $image_src = imagecreatefromgif($filepath); - break; - case IMAGETYPE_JPEG: - $image_src = imagecreatefromjpeg($filepath); - break; - case IMAGETYPE_PNG: - $image_src = imagecreatefrompng($filepath); - break; - default: - $this->serverError(_('Unknown file type')); - return; - } - + // If image is not being cropped assume pos & dimentions of original $dest_x = $this->arg('avatar_crop_x') ? $this->arg('avatar_crop_x'):0; $dest_y = $this->arg('avatar_crop_y') ? $this->arg('avatar_crop_y'):0; $dest_w = $this->arg('avatar_crop_w') ? $this->arg('avatar_crop_w'):$filedata['width']; $dest_h = $this->arg('avatar_crop_h') ? $this->arg('avatar_crop_h'):$filedata['height']; - $size = ($dest_w > MAX_ORIGINAL) ? MAX_ORIGINAL : $dest_w; + $size = min($dest_w, $dest_h); + $size = ($size > MAX_ORIGINAL) ? MAX_ORIGINAL:$size; - common_debug("W = $dest_w, H = $dest_h, X = $dest_x, Y = $dest_y, size = $size"); - - $image_dest = imagecreatetruecolor($size, $size); - - if ($filedata['type'] == IMAGETYPE_GIF || $filedata['type'] == IMAGETYPE_PNG) { - - $transparent_idx = imagecolortransparent($image_src); - - if ($transparent_idx >= 0) { - - $transparent_color = imagecolorsforindex($image_src, $transparent_idx); - $transparent_idx = imagecolorallocate($image_dest, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']); - imagefill($image_dest, 0, 0, $transparent_idx); - imagecolortransparent($image_dest, $transparent_idx); - - } elseif ($filedata['type'] == IMAGETYPE_PNG) { - - imagealphablending($image_dest, false); - $transparent = imagecolorallocatealpha($image_dest, 0, 0, 0, 127); - imagefill($image_dest, 0, 0, $transparent); - imagesavealpha($image_dest, true); - - } - } - - imagecopyresampled($image_dest, $image_src, 0, 0, $dest_x, $dest_y, $size, $size, $dest_w, $dest_h); - - $filename = common_avatar_filename($this->group->id, - image_type_to_extension($filedata['type']), - null, - 'group-'.common_timestamp()); - - $filepath = common_avatar_path($filename); - - switch ($filedata['type']) { - case IMAGETYPE_GIF: - imagegif($image_dest, $filepath); - break; - case IMAGETYPE_JPEG: - imagejpeg($image_dest, $filepath); - break; - case IMAGETYPE_PNG: - imagepng($image_dest, $filepath); - break; - default: - $this->serverError(_('Unknown file type')); - return; - } + $imagefile = new ImageFile($this->group->id, $filedata['filepath']); + $filename = $imagefile->resize($size, $dest_x, $dest_y, $dest_w, $dest_h); - if ($this->group->setOriginal($filename, $filedata['type'])) { - @unlink(common_avatar_path($filedata['filename'])); + if ($this->group->setOriginal($filename)) { + @unlink($filedata['filepath']); unset($_SESSION['FILEDATA']); $this->mode = 'upload'; $this->showForm(_('Logo updated.'), true); diff --git a/classes/Avatar.php b/classes/Avatar.php index 9ae920647..6a9ea7686 100644 --- a/classes/Avatar.php +++ b/classes/Avatar.php @@ -36,102 +36,6 @@ class Avatar extends Memcached_DataObject @unlink(common_avatar_path($filename)); } } - - # Create and save scaled version of this avatar - # XXX: maybe break into different methods - - function scale($size) - { - - $image_s = imagecreatetruecolor($size, $size); - $image_a = $this->to_image(); - $square = min($this->width, $this->height); - imagecolortransparent($image_s, imagecolorallocate($image_s, 0, 0, 0)); - imagealphablending($image_s, false); - imagesavealpha($image_s, true); - imagecopyresampled($image_s, $image_a, 0, 0, 0, 0, - $size, $size, $square, $square); - - $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png"; - - $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp()); - - if ($this->mediatype == 'image/jpeg') { - imagejpeg($image_s, common_avatar_path($filename)); - } else { - imagepng($image_s, common_avatar_path($filename)); - } - - $scaled = DB_DataObject::factory('avatar'); - $scaled->profile_id = $this->profile_id; - $scaled->width = $size; - $scaled->height = $size; - $scaled->original = false; - $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png'; - $scaled->filename = $filename; - $scaled->url = common_avatar_url($filename); - $scaled->created = DB_DataObject_Cast::dateTime(); # current time - - if ($scaled->insert()) { - return $scaled; - } else { - return null; - } - } - - function scale_and_crop($size, $x, $y, $w, $h) - { - - $image_s = imagecreatetruecolor($size, $size); - $image_a = $this->to_image(); - - # Retain alpha channel info if possible for .pngs - $background = imagecolorallocate($image_s, 0, 0, 0); - ImageColorTransparent($image_s, $background); - imagealphablending($image_s, false); - - imagecopyresized($image_s, $image_a, 0, 0, $x, $y, $size, $size, $w, $h); - - $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png"; - - $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp()); - - if ($this->mediatype == 'image/jpeg') { - imagejpeg($image_s, common_avatar_path($filename)); - } else { - imagepng($image_s, common_avatar_path($filename)); - } - - $cropped = DB_DataObject::factory('avatar'); - $cropped->profile_id = $this->profile_id; - $cropped->width = $size; - $cropped->height = $size; - $cropped->original = false; - $cropped->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png'; - $cropped->filename = $filename; - $cropped->url = common_avatar_url($filename); - $cropped->created = DB_DataObject_Cast::dateTime(); # current time - - if ($cropped->insert()) { - return $cropped; - } else { - return NULL; - } - } - - function to_image() - { - $filepath = common_avatar_path($this->filename); - if ($this->mediatype == 'image/gif') { - return imagecreatefromgif($filepath); - } else if ($this->mediatype == 'image/jpeg') { - return imagecreatefromjpeg($filepath); - } else if ($this->mediatype == 'image/png') { - return imagecreatefrompng($filepath); - } else { - return NULL; - } - } function &pkeyGet($kv) { diff --git a/classes/Profile.php b/classes/Profile.php index ab5a48e57..5be632f87 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -69,28 +69,15 @@ class Profile extends Memcached_DataObject } } - function setOriginal($source) + function setOriginal($filename) { - - $info = @getimagesize($source); - - if (!$info) { - return null; - } - - $filename = common_avatar_filename($this->id, - image_type_to_extension($info[2]), - null, common_timestamp()); - $filepath = common_avatar_path($filename); - - copy($source, $filepath); + $imagefile = new ImageFile($this->id, common_avatar_path($filename)); $avatar = new Avatar(); - $avatar->profile_id = $this->id; - $avatar->width = $info[0]; - $avatar->height = $info[1]; - $avatar->mediatype = image_type_to_mime_type($info[2]); + $avatar->width = $imagefile->width; + $avatar->height = $imagefile->height; + $avatar->mediatype = image_type_to_mime_type($imagefile->type); $avatar->filename = $filename; $avatar->original = true; $avatar->url = common_avatar_url($filename); @@ -98,21 +85,29 @@ class Profile extends Memcached_DataObject # XXX: start a transaction here - if (!$this->delete_avatars()) { - @unlink($filepath); - return null; - } - - if (!$avatar->insert()) { - @unlink($filepath); + if (!$this->delete_avatars() || !$avatar->insert()) { + @unlink(common_avatar_path($filename)); return null; } foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) { # We don't do a scaled one if original is our scaled size if (!($avatar->width == $size && $avatar->height == $size)) { - $s = $avatar->scale($size); - if (!$s) { + + $scaled_filename = $imagefile->resize($size); + + //$scaled = DB_DataObject::factory('avatar'); + $scaled = new Avatar(); + $scaled->profile_id = $this->id; + $scaled->width = $size; + $scaled->height = $size; + $scaled->original = false; + $scaled->mediatype = image_type_to_mime_type($imagefile->type); + $scaled->filename = $scaled_filename; + $scaled->url = common_avatar_url($scaled_filename); + $scaled->created = DB_DataObject_Cast::dateTime(); # current time + + if (!$scaled->insert()) { return null; } } @@ -121,24 +116,6 @@ class Profile extends Memcached_DataObject return $avatar; } - function crop_avatars($x, $y, $w, $h) - { - - $avatar = $this->getOriginalAvatar(); - $this->delete_avatars(false); # don't delete original - - foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) { - # We don't do a scaled one if original is our scaled size - if (!($avatar->width == $size && $avatar->height == $size)) { - $s = $avatar->scale_and_crop($size, $x, $y, $w, $h); - if (!$s) { - return NULL; - } - } - } - return true; - } - function delete_avatars($original=true) { $avatar = new Avatar(); diff --git a/classes/User_group.php b/classes/User_group.php index 092c1bc34..340d7f67a 100755 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -88,96 +88,16 @@ class User_group extends Memcached_DataObject return $members; } - function setOriginal($filename, $type) + function setOriginal($filename) { + $imagefile = new ImageFile($this->id, common_avatar_path($filename)); + $orig = clone($this); $this->original_logo = common_avatar_url($filename); - $this->homepage_logo = common_avatar_url($this->scale($filename, - AVATAR_PROFILE_SIZE, - $type)); - $this->stream_logo = common_avatar_url($this->scale($filename, - AVATAR_STREAM_SIZE, - $type)); - $this->mini_logo = common_avatar_url($this->scale($filename, - AVATAR_MINI_SIZE, - $type)); + $this->homepage_logo = common_avatar_url($imagefile->resize(AVATAR_PROFILE_SIZE)); + $this->stream_logo = common_avatar_url($imagefile->resize(AVATAR_STREAM_SIZE)); + $this->mini_logo = common_avatar_url($imagefile->resize(AVATAR_MINI_SIZE)); common_debug(common_log_objstring($this)); return $this->update($orig); } - - function scale($filename, $size, $type) - { - $filepath = common_avatar_path($filename); - - if (!file_exists($filepath)) { - $this->serverError(_('Lost our file.')); - return; - } - - $info = @getimagesize($filepath); - - switch ($type) { - case IMAGETYPE_GIF: - $image_src = imagecreatefromgif($filepath); - break; - case IMAGETYPE_JPEG: - $image_src = imagecreatefromjpeg($filepath); - break; - case IMAGETYPE_PNG: - $image_src = imagecreatefrompng($filepath); - break; - default: - $this->serverError(_('Unknown file type')); - return; - } - - $image_dest = imagecreatetruecolor($size, $size); - - if ($type == IMAGETYPE_GIF || $type == IMAGETYPE_PNG) { - - $transparent_idx = imagecolortransparent($image_src); - - if ($transparent_idx >= 0) { - - $transparent_color = imagecolorsforindex($image_src, $transparent_idx); - $transparent_idx = imagecolorallocate($image_dest, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']); - imagefill($image_dest, 0, 0, $transparent_idx); - imagecolortransparent($image_dest, $transparent_idx); - - } elseif ($type == IMAGETYPE_PNG) { - - imagealphablending($image_dest, false); - $transparent = imagecolorallocatealpha($image_dest, 0, 0, 0, 127); - imagefill($image_dest, 0, 0, $transparent); - imagesavealpha($image_dest, true); - - } - } - - imagecopyresampled($image_dest, $image_src, 0, 0, 0, 0, $size, $size, $info[0], $info[1]); - - $outname = common_avatar_filename($this->id, - image_type_to_extension($type), - $size, - common_timestamp()); - - $outpath = common_avatar_path($outname); - - switch ($type) { - case IMAGETYPE_GIF: - imagegif($image_dest, $outpath); - break; - case IMAGETYPE_JPEG: - imagejpeg($image_dest, $outpath); - break; - case IMAGETYPE_PNG: - imagepng($image_dest, $outpath); - break; - default: - $this->serverError(_('Unknown file type')); - return; - } - - return $outname; - } } diff --git a/lib/imagefile.php b/lib/imagefile.php index 7f1db892c..5e9913235 100644 --- a/lib/imagefile.php +++ b/lib/imagefile.php @@ -47,18 +47,22 @@ if (!defined('LACONICA')) { class ImageFile { - var $filename = null; - var $barename = null; - var $type = null; - var $height = null; - var $width = null; + var $id; + var $filepath; + var $barename; + var $type; + var $height; + var $width; - function __construct($filename=null, $type=null, $width=null, $height=null) + function __construct($id=null, $filepath=null, $type=null, $width=null, $height=null) { - $this->filename = $filename; - $this->type = $type; - $this->width = $type; - $this->height = $type; + $this->id = $id; + $this->filepath = $filepath; + + $info = @getimagesize($this->filepath); + $this->type = ($info) ? $info[2]:$type; + $this->width = ($info) ? $info[0]:$width; + $this->height = ($info) ? $info[1]:$height; } static function fromUpload($param='upload') @@ -78,32 +82,100 @@ class ImageFile throw new Exception(_('System error uploading file.')); return; } - - $imagefile = new ImageFile($_FILES[$param]['tmp_name']); - $info = @getimagesize($imagefile->filename); - + + $info = @getimagesize($_FILES[$param]['tmp_name']); + if (!$info) { - @unlink($imagefile->filename); + @unlink($_FILES[$param]['tmp_name']); throw new Exception(_('Not an image or corrupt file.')); return; } + + if ($info[2] !== IMAGETYPE_GIF && + $info[2] !== IMAGETYPE_JPEG && + $info[2] !== IMAGETYPE_PNG) { + + @unlink($_FILES[$param]['tmp_name']); + throw new Exception(_('Unsupported image file format.')); + return; + } - $imagefile->width = $info[0]; - $imagefile->height = $info[1]; + return new ImageFile(null, $_FILES[$param]['tmp_name']); + } + + function resize($size, $x = 0, $y = 0, $w = null, $h = null) + { + $w = ($w === null) ? $this->width:$w; + $h = ($h === null) ? $this->height:$h; - switch ($info[2]) { - case IMAGETYPE_GIF: - case IMAGETYPE_JPEG: - case IMAGETYPE_PNG: - $imagefile->type = $info[2]; + if (!file_exists($this->filepath)) { + throw new Exception(_('Lost our file.')); + return; + } + + switch ($this->type) { + case IMAGETYPE_GIF: + $image_src = imagecreatefromgif($this->filepath); break; - default: - @unlink($imagefile->filename); - throw new Exception(_('Unsupported image file format.')); + case IMAGETYPE_JPEG: + $image_src = imagecreatefromjpeg($this->filepath); + break; + case IMAGETYPE_PNG: + $image_src = imagecreatefrompng($this->filepath); + break; + default: + throw new Exception(_('Unknown file type')); + return; + } + + $image_dest = imagecreatetruecolor($size, $size); + + if ($this->type == IMAGETYPE_GIF || $this->type == IMAGETYPE_PNG) { + + $transparent_idx = imagecolortransparent($image_src); + + if ($transparent_idx >= 0) { + + $transparent_color = imagecolorsforindex($image_src, $transparent_idx); + $transparent_idx = imagecolorallocate($image_dest, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']); + imagefill($image_dest, 0, 0, $transparent_idx); + imagecolortransparent($image_dest, $transparent_idx); + + } elseif ($this->type == IMAGETYPE_PNG) { + + imagealphablending($image_dest, false); + $transparent = imagecolorallocatealpha($image_dest, 0, 0, 0, 127); + imagefill($image_dest, 0, 0, $transparent); + imagesavealpha($image_dest, true); + + } + } + + imagecopyresampled($image_dest, $image_src, 0, 0, $x, $y, $size, $size, $w, $h); + + $outname = common_avatar_filename($this->id, + image_type_to_extension($this->type), + $size, + common_timestamp()); + + $outpath = common_avatar_path($outname); + + switch ($this->type) { + case IMAGETYPE_GIF: + imagegif($image_dest, $outpath); + break; + case IMAGETYPE_JPEG: + imagejpeg($image_dest, $outpath); + break; + case IMAGETYPE_PNG: + imagepng($image_dest, $outpath); + break; + default: + throw new Exception(_('Unknown file type')); return; } - return $imagefile; + return $outname; } function unlink() -- cgit v1.2.3-54-g00ecf From 7ad3ff4a2cd494ef8c1cc293e15c0a70b8786fee Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 5 Feb 2009 11:46:17 -0500 Subject: Allow re-authentication with OpenID "Rememberme" logins aren't allowed to make changes to an account (since cookie-stealing is too easy). Users have to re-authenticate. Previously, it was impossible to do so without having a username and password; this change lets you do it with OpenID, too. --- actions/finishopenidlogin.php | 2 +- actions/openidlogin.php | 13 +++++++++++-- classes/User.php | 11 +++++++++++ lib/settingsaction.php | 7 ++++++- 4 files changed, 29 insertions(+), 4 deletions(-) (limited to 'classes') diff --git a/actions/finishopenidlogin.php b/actions/finishopenidlogin.php index 880a9505b..bc9151120 100644 --- a/actions/finishopenidlogin.php +++ b/actions/finishopenidlogin.php @@ -30,7 +30,7 @@ class FinishopenidloginAction extends Action function handle($args) { parent::handle($args); - if (common_logged_in()) { + if (common_is_real_login()) { $this->clientError(_('Already logged in.')); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $token = $this->trimmed('token'); diff --git a/actions/openidlogin.php b/actions/openidlogin.php index 7a267a2bd..1a4372d73 100644 --- a/actions/openidlogin.php +++ b/actions/openidlogin.php @@ -26,7 +26,7 @@ class OpenidloginAction extends Action function handle($args) { parent::handle($args); - if (common_logged_in()) { + if (common_is_real_login()) { $this->clientError(_('Already logged in.')); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $openid_url = $this->trimmed('openid_url'); @@ -59,7 +59,16 @@ class OpenidloginAction extends Action function getInstructions() { - return _('Login with an [OpenID](%%doc.openid%%) account.'); + if (common_logged_in() && !common_is_real_login() && + common_get_returnto()) { + // rememberme logins have to reauthenticate before + // changing any profile settings (cookie-stealing protection) + return _('For security reasons, please re-login with your ' . + '[OpenID](%%doc.openid%%) ' . + 'before changing your settings.'); + } else { + return _('Login with an [OpenID](%%doc.openid%%) account.'); + } } function showPageNotice() diff --git a/classes/User.php b/classes/User.php index b1c061c18..a6a1b11b9 100644 --- a/classes/User.php +++ b/classes/User.php @@ -630,4 +630,15 @@ class User extends Memcached_DataObject return $profile; } + + function hasOpenID() + { + $oid = new User_openid(); + + $oid->user_id = $this->id; + + $cnt = $oid->find(); + + return ($cnt > 0); + } } diff --git a/lib/settingsaction.php b/lib/settingsaction.php index dfe1f114b..53c807c6f 100644 --- a/lib/settingsaction.php +++ b/lib/settingsaction.php @@ -76,7 +76,12 @@ class SettingsAction extends Action // change important settings or see private info, and // _all_ our settings are important common_set_returnto($this->selfUrl()); - common_redirect(common_local_url('login')); + $user = common_current_user(); + if ($user->hasOpenID()) { + common_redirect(common_local_url('openidlogin')); + } else { + common_redirect(common_local_url('login')); + } } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $this->handlePost(); } else { -- cgit v1.2.3-54-g00ecf From 343cd6f20577c44487eae4e90ec10bfd954980e3 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 6 Feb 2009 03:13:08 -0500 Subject: Move common_avatar_* functions to Avatar Moved the common_avatar_* functions to the Avatar class. Typically either as methods on the object or as static methods. Replaced all the uses of the functions in other modules. --- actions/avatarbynickname.php | 4 +-- actions/avatarsettings.php | 8 ++--- actions/grouplogo.php | 8 ++--- actions/noticesearch.php | 2 +- actions/showstream.php | 2 +- actions/tagother.php | 2 +- actions/twittersettings.php | 4 +-- classes/Avatar.php | 50 +++++++++++++++++++++++---- classes/Profile.php | 21 ++++++++---- classes/User_group.php | 10 +++--- lib/imagefile.php | 4 +-- lib/jabber.php | 2 +- lib/mailbox.php | 4 +-- lib/noticelist.php | 4 +-- lib/noticesection.php | 2 +- lib/profilelist.php | 2 +- lib/profileminilist.php | 2 +- lib/profilesection.php | 2 +- lib/rssaction.php | 4 +-- lib/twitterapi.php | 2 +- lib/util.php | 78 ++++++++----------------------------------- scripts/enjitqueuehandler.php | 2 +- 22 files changed, 107 insertions(+), 112 deletions(-) (limited to 'classes') diff --git a/actions/avatarbynickname.php b/actions/avatarbynickname.php index 9bbdecefa..ca58c9653 100644 --- a/actions/avatarbynickname.php +++ b/actions/avatarbynickname.php @@ -90,9 +90,9 @@ class AvatarbynicknameAction extends Action $url = $avatar->url; } else { if ($size == 'original') { - $url = common_default_avatar(AVATAR_PROFILE_SIZE); + $url = Avatar::defaultImage(AVATAR_PROFILE_SIZE); } else { - $url = common_default_avatar($size+0); + $url = Avatar::defaultImage($size+0); } } common_redirect($url, 302); diff --git a/actions/avatarsettings.php b/actions/avatarsettings.php index 3f50ca24c..a0be5d8f8 100644 --- a/actions/avatarsettings.php +++ b/actions/avatarsettings.php @@ -200,7 +200,7 @@ class AvatarsettingsAction extends AccountSettingsAction 'class' => 'avatar_view')); $this->element('h2', null, _("Original")); $this->elementStart('div', array('id'=>'avatar_original_view')); - $this->element('img', array('src' => common_avatar_url($this->filedata['filename']), + $this->element('img', array('src' => Avatar::url($this->filedata['filename']), 'width' => $this->filedata['width'], 'height' => $this->filedata['height'], 'alt' => $user->nickname)); @@ -212,7 +212,7 @@ class AvatarsettingsAction extends AccountSettingsAction 'class' => 'avatar_view')); $this->element('h2', null, _("Preview")); $this->elementStart('div', array('id'=>'avatar_preview_view')); - $this->element('img', array('src' => common_avatar_url($this->filedata['filename']), + $this->element('img', array('src' => Avatar::url($this->filedata['filename']), 'width' => AVATAR_PROFILE_SIZE, 'height' => AVATAR_PROFILE_SIZE, 'alt' => $user->nickname)); @@ -281,12 +281,12 @@ class AvatarsettingsAction extends AccountSettingsAction $cur = common_current_user(); - $filename = common_avatar_filename($cur->id, + $filename = Avatar::filename($cur->id, image_type_to_extension($imagefile->type), null, 'tmp'.common_timestamp()); - $filepath = common_avatar_path($filename); + $filepath = Avatar::path($filename); move_uploaded_file($imagefile->filepath, $filepath); diff --git a/actions/grouplogo.php b/actions/grouplogo.php index 7cf198dc7..650c95255 100644 --- a/actions/grouplogo.php +++ b/actions/grouplogo.php @@ -263,7 +263,7 @@ class GrouplogoAction extends Action 'class' => 'avatar_view')); $this->element('h2', null, _("Original")); $this->elementStart('div', array('id'=>'avatar_original_view')); - $this->element('img', array('src' => common_avatar_url($this->filedata['filename']), + $this->element('img', array('src' => Avatar::url($this->filedata['filename']), 'width' => $this->filedata['width'], 'height' => $this->filedata['height'], 'alt' => $this->group->nickname)); @@ -275,7 +275,7 @@ class GrouplogoAction extends Action 'class' => 'avatar_view')); $this->element('h2', null, _("Preview")); $this->elementStart('div', array('id'=>'avatar_preview_view')); - $this->element('img', array('src' => common_avatar_url($this->filedata['filename']), + $this->element('img', array('src' => Avatar::url($this->filedata['filename']), 'width' => AVATAR_PROFILE_SIZE, 'height' => AVATAR_PROFILE_SIZE, 'alt' => $this->group->nickname)); @@ -343,12 +343,12 @@ class GrouplogoAction extends Action return; } - $filename = common_avatar_filename($this->group->id, + $filename = Avatar::filename($this->group->id, image_type_to_extension($imagefile->type), null, 'group-temp-'.common_timestamp()); - $filepath = common_avatar_path($filename); + $filepath = Avatar::path($filename); move_uploaded_file($imagefile->filepath, $filepath); diff --git a/actions/noticesearch.php b/actions/noticesearch.php index c0c238120..a5f01350c 100644 --- a/actions/noticesearch.php +++ b/actions/noticesearch.php @@ -166,7 +166,7 @@ class NoticesearchAction extends SearchAction $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE); $this->elementStart('a', array('href' => $profile->profileurl, 'class' => 'url')); - $this->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE), + $this->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE), 'class' => 'avatar photo', 'width' => AVATAR_STREAM_SIZE, 'height' => AVATAR_STREAM_SIZE, diff --git a/actions/showstream.php b/actions/showstream.php index 224bbce9f..28bb8453f 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -242,7 +242,7 @@ class ShowstreamAction extends Action $this->elementStart('dl', 'entity_depiction'); $this->element('dt', null, _('Photo')); $this->elementStart('dd'); - $this->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE), + $this->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE), 'class' => 'photo avatar', 'width' => AVATAR_PROFILE_SIZE, 'height' => AVATAR_PROFILE_SIZE, diff --git a/actions/tagother.php b/actions/tagother.php index cbace5b6b..3e8a12fd6 100644 --- a/actions/tagother.php +++ b/actions/tagother.php @@ -80,7 +80,7 @@ class TagotherAction extends Action $this->elementStart('dl', 'entity_depiction'); $this->element('dt', null, _('Photo')); $this->elementStart('dd'); - $this->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE), + $this->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE), 'class' => 'photo avatar', 'width' => AVATAR_PROFILE_SIZE, 'height' => AVATAR_PROFILE_SIZE, diff --git a/actions/twittersettings.php b/actions/twittersettings.php index b3bf67dc3..2d41469bb 100644 --- a/actions/twittersettings.php +++ b/actions/twittersettings.php @@ -250,8 +250,8 @@ class TwittersettingsAction extends ConnectSettingsAction $avatar = $other->getAvatar(AVATAR_MINI_SIZE); $avatar_url = ($avatar) ? - common_avatar_display_url($avatar) : - common_default_avatar(AVATAR_MINI_SIZE); + $avatar->displayUrl() : + Avatar::defaultImage(AVATAR_MINI_SIZE); $this->element('img', array('src' => $avatar_url, 'width' => AVATAR_MINI_SIZE, diff --git a/classes/Avatar.php b/classes/Avatar.php index 6a9ea7686..6248a84d3 100644 --- a/classes/Avatar.php +++ b/classes/Avatar.php @@ -4,18 +4,18 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Avatar extends Memcached_DataObject +class Avatar extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ public $__table = 'avatar'; // table name public $profile_id; // int(4) primary_key not_null - public $original; // tinyint(1) + public $original; // tinyint(1) public $width; // int(4) primary_key not_null public $height; // int(4) primary_key not_null public $mediatype; // varchar(32) not_null - public $filename; // varchar(255) + public $filename; // varchar(255) public $url; // varchar(255) unique_key public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -33,13 +33,51 @@ class Avatar extends Memcached_DataObject { $filename = $this->filename; if (parent::delete()) { - @unlink(common_avatar_path($filename)); + @unlink(Avatar::path($filename)); } } - - function &pkeyGet($kv) + + function &pkeyGet($kv) { return Memcached_DataObject::pkeyGet('Avatar', $kv); } + // where should the avatar go for this user? + + static function filename($id, $extension, $size=null, $extra=null) + { + if ($size) { + return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension; + } else { + return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension; + } + } + + static function path($filename) + { + return INSTALLDIR . '/avatar/' . $filename; + } + + static function url($filename) + { + return common_path('avatar/'.$filename); + } + + function displayUrl() + { + $server = common_config('avatar', 'server'); + if ($server) { + return 'http://'.$server.'/'.$this->filename; + } else { + return $this->url; + } + } + + static function defaultAvatar($size) + { + static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', + AVATAR_STREAM_SIZE => 'stream', + AVATAR_MINI_SIZE => 'mini'); + return theme_path('default-avatar-'.$sizenames[$size].'.png'); + } } diff --git a/classes/Profile.php b/classes/Profile.php index 5be632f87..f3bfe299c 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -71,7 +71,7 @@ class Profile extends Memcached_DataObject function setOriginal($filename) { - $imagefile = new ImageFile($this->id, common_avatar_path($filename)); + $imagefile = new ImageFile($this->id, Avatar::path($filename)); $avatar = new Avatar(); $avatar->profile_id = $this->id; @@ -80,22 +80,22 @@ class Profile extends Memcached_DataObject $avatar->mediatype = image_type_to_mime_type($imagefile->type); $avatar->filename = $filename; $avatar->original = true; - $avatar->url = common_avatar_url($filename); + $avatar->url = Avatar::url($filename); $avatar->created = DB_DataObject_Cast::dateTime(); # current time # XXX: start a transaction here if (!$this->delete_avatars() || !$avatar->insert()) { - @unlink(common_avatar_path($filename)); + @unlink(Avatar::path($filename)); return null; } foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) { # We don't do a scaled one if original is our scaled size if (!($avatar->width == $size && $avatar->height == $size)) { - + $scaled_filename = $imagefile->resize($size); - + //$scaled = DB_DataObject::factory('avatar'); $scaled = new Avatar(); $scaled->profile_id = $this->id; @@ -104,7 +104,7 @@ class Profile extends Memcached_DataObject $scaled->original = false; $scaled->mediatype = image_type_to_mime_type($imagefile->type); $scaled->filename = $scaled_filename; - $scaled->url = common_avatar_url($scaled_filename); + $scaled->url = Avatar::url($scaled_filename); $scaled->created = DB_DataObject_Cast::dateTime(); # current time if (!$scaled->insert()) { @@ -194,4 +194,13 @@ class Profile extends Memcached_DataObject } } + function avatarUrl($size=AVATAR_PROFILE_SIZE) + { + $avatar = $this->getAvatar($size); + if ($avatar) { + return $avatar->displayUrl(); + } else { + return Avatar::defaultImage($size); + } + } } diff --git a/classes/User_group.php b/classes/User_group.php index 340d7f67a..d152f9d56 100755 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -90,13 +90,13 @@ class User_group extends Memcached_DataObject function setOriginal($filename) { - $imagefile = new ImageFile($this->id, common_avatar_path($filename)); + $imagefile = new ImageFile($this->id, Avatar::path($filename)); $orig = clone($this); - $this->original_logo = common_avatar_url($filename); - $this->homepage_logo = common_avatar_url($imagefile->resize(AVATAR_PROFILE_SIZE)); - $this->stream_logo = common_avatar_url($imagefile->resize(AVATAR_STREAM_SIZE)); - $this->mini_logo = common_avatar_url($imagefile->resize(AVATAR_MINI_SIZE)); + $this->original_logo = Avatar::url($filename); + $this->homepage_logo = Avatar::url($imagefile->resize(AVATAR_PROFILE_SIZE)); + $this->stream_logo = Avatar::url($imagefile->resize(AVATAR_STREAM_SIZE)); + $this->mini_logo = Avatar::url($imagefile->resize(AVATAR_MINI_SIZE)); common_debug(common_log_objstring($this)); return $this->update($orig); } diff --git a/lib/imagefile.php b/lib/imagefile.php index fa0581dd0..db344db8f 100644 --- a/lib/imagefile.php +++ b/lib/imagefile.php @@ -153,12 +153,12 @@ class ImageFile imagecopyresampled($image_dest, $image_src, 0, 0, $x, $y, $size, $size, $w, $h); - $outname = common_avatar_filename($this->id, + $outname = Avatar::filename($this->id, image_type_to_extension($this->type), $size, common_timestamp()); - $outpath = common_avatar_path($outname); + $outpath = Avatar::path($outname); switch ($this->type) { case IMAGETYPE_GIF: diff --git a/lib/jabber.php b/lib/jabber.php index f1be57768..f41d984d6 100644 --- a/lib/jabber.php +++ b/lib/jabber.php @@ -178,7 +178,7 @@ function jabber_format_entry($profile, $notice) $entry .= "\n"; $entry .= "\n"; $entry .= "" . $profile->nickname . "\n"; - $entry .= "" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "\n"; + $entry .= "" . $profile->avatarUrl(AVATAR_PROFILE_SIZE) . "\n"; $entry .= "\n"; $entry .= "" . htmlspecialchars($msg) . "\n"; $entry .= "" . htmlspecialchars($msg) . "\n"; diff --git a/lib/mailbox.php b/lib/mailbox.php index e8323dc28..d77234549 100644 --- a/lib/mailbox.php +++ b/lib/mailbox.php @@ -183,8 +183,8 @@ class MailboxAction extends PersonalAction 'class' => 'url')); $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE); $this->element('img', array('src' => ($avatar) ? - common_avatar_display_url($avatar) : - common_default_avatar(AVATAR_STREAM_SIZE), + $avatar->displayUrl() : + Avatar::defaultImage(AVATAR_STREAM_SIZE), 'class' => 'photo avatar', 'width' => AVATAR_STREAM_SIZE, 'height' => AVATAR_STREAM_SIZE, diff --git a/lib/noticelist.php b/lib/noticelist.php index 3ef6691af..9fc0126b3 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -285,8 +285,8 @@ class NoticeListItem extends Widget $avatar = $this->profile->getAvatar($avatar_size); $this->out->element('img', array('src' => ($avatar) ? - common_avatar_display_url($avatar) : - common_default_avatar($avatar_size), + $avatar->displayUrl() : + Avatar::defaultImage($avatar_size), 'class' => 'avatar photo', 'width' => $avatar_size, 'height' => $avatar_size, diff --git a/lib/noticesection.php b/lib/noticesection.php index aa8e03229..97b517529 100644 --- a/lib/noticesection.php +++ b/lib/noticesection.php @@ -82,7 +82,7 @@ class NoticeSection extends Section $profile->nickname, 'href' => $profile->profileurl, 'class' => 'url')); - $this->out->element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_MINI_SIZE)), + $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_MINI_SIZE)), 'width' => AVATAR_MINI_SIZE, 'height' => AVATAR_MINI_SIZE, 'class' => 'avatar photo', diff --git a/lib/profilelist.php b/lib/profilelist.php index 6e14c0b69..4d924b039 100644 --- a/lib/profilelist.php +++ b/lib/profilelist.php @@ -97,7 +97,7 @@ class ProfileList extends Widget $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE); $this->out->elementStart('a', array('href' => $this->profile->profileurl, 'class' => 'url')); - $this->out->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE), + $this->out->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE), 'class' => 'photo avatar', 'width' => AVATAR_STREAM_SIZE, 'height' => AVATAR_STREAM_SIZE, diff --git a/lib/profileminilist.php b/lib/profileminilist.php index 81cd7aed5..0d466bba8 100644 --- a/lib/profileminilist.php +++ b/lib/profileminilist.php @@ -74,7 +74,7 @@ class ProfileMiniList extends ProfileList 'rel' => 'contact member', 'class' => 'url')); $avatar = $this->profile->getAvatar(AVATAR_MINI_SIZE); - $this->out->element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_MINI_SIZE)), + $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_MINI_SIZE)), 'width' => AVATAR_MINI_SIZE, 'height' => AVATAR_MINI_SIZE, 'class' => 'avatar photo', diff --git a/lib/profilesection.php b/lib/profilesection.php index 3642ae164..8ed290e03 100644 --- a/lib/profilesection.php +++ b/lib/profilesection.php @@ -86,7 +86,7 @@ class ProfileSection extends Section 'rel' => 'contact member', 'class' => 'url')); $avatar = $profile->getAvatar(AVATAR_MINI_SIZE); - $this->out->element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_MINI_SIZE)), + $this->out->element('img', array('src' => (($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_MINI_SIZE)), 'width' => AVATAR_MINI_SIZE, 'height' => AVATAR_MINI_SIZE, 'class' => 'avatar photo', diff --git a/lib/rssaction.php b/lib/rssaction.php index 2bd7f1f19..131e8ac65 100644 --- a/lib/rssaction.php +++ b/lib/rssaction.php @@ -199,7 +199,7 @@ class Rss10Action extends Action $this->element('dc:date', null, common_date_w3dtf($notice->created)); $this->element('dc:creator', null, ($profile->fullname) ? $profile->fullname : $profile->nickname); $this->element('sioc:has_creator', array('rdf:resource' => $creator_uri)); - $this->element('laconica:postIcon', array('rdf:resource' => common_profile_avatar_url($profile))); + $this->element('laconica:postIcon', array('rdf:resource' => $profile->avatarUrl())); $this->element('cc:licence', array('rdf:resource' => common_config('license', 'url'))); $this->elementEnd('item'); $this->creators[$creator_uri] = $profile; @@ -216,7 +216,7 @@ class Rss10Action extends Action $this->element('foaf:name', null, $profile->fullname); } $this->element('sioc:id', null, $id); - $avatar = common_profile_avatar_url($profile); + $avatar = $profile->avatarUrl(); $this->element('sioc:avatar', array('rdf:resource' => $avatar)); $this->elementEnd('sioc:User'); } diff --git a/lib/twitterapi.php b/lib/twitterapi.php index da8b8b1e5..a4d183fcd 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -43,7 +43,7 @@ class TwitterapiAction extends Action $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE); - $twitter_user['profile_image_url'] = ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE); + $twitter_user['profile_image_url'] = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE); $twitter_user['protected'] = 'false'; # not supported by Laconica yet $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : null; diff --git a/lib/util.php b/lib/util.php index 5275ad6b6..0655ebf27 100644 --- a/lib/util.php +++ b/lib/util.php @@ -395,15 +395,15 @@ function common_render_text($text) function common_replace_urls_callback($text, $callback) { // Start off with a regex preg_match_all('#(?:(?:(?:https?|ftps?|mms|rtsp|gopher|news|nntp|telnet|wais|file|prospero|webcal|xmpp|irc)://|(?:mailto|aim|tel):)[^.\s]+\.[^\s]+|(?:[^.\s/]+\.)+(?:museum|travel|[a-z]{2,4})(?:[:/][^\s]*)?)#i', $text, $matches); - + // Then clean up what the regex left behind $offset = 0; foreach($matches[0] as $url) { $url = htmlspecialchars_decode($url); - + // Make sure we didn't pick up an email address if (preg_match('#^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$#i', $url)) continue; - + // Remove trailing punctuation $url = rtrim($url, '.?!,;:\'"`'); @@ -422,48 +422,48 @@ function common_replace_urls_callback($text, $callback) { // Remove trailing punctuation again (in case there were some inside parens) $url = rtrim($url, '.?!,;:\'"`'); - + // Make sure we didn't capture part of the next sentence preg_match('#((?:[^.\s/]+\.)+)(museum|travel|[a-z]{2,4})#i', $url, $url_parts); - + // Were the parts capitalized any? $last_part = (mb_strtolower($url_parts[2]) !== $url_parts[2]) ? true:false; $prev_part = (mb_strtolower($url_parts[1]) !== $url_parts[1]) ? true:false; - + // If the first part wasn't cap'd but the last part was, we captured too much if ((!$prev_part && $last_part)) { $url = substr_replace($url, '', mb_strpos($url, '.'.$url_parts[2], 0)); } - + // Capture the new TLD preg_match('#((?:[^.\s/]+\.)+)(museum|travel|[a-z]{2,4})#i', $url, $url_parts); - + $tlds = array('ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao', 'aq', 'ar', 'arpa', 'as', 'asia', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb', 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo', 'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cat', 'cc', 'cd', 'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop', 'cr', 'cu', 'cv', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'edu', 'ee', 'eg', 'er', 'es', 'et', 'eu', 'fi', 'fj', 'fk', 'fm', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi', 'gl', 'gm', 'gn', 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie', 'il', 'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jobs', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls', 'lt', 'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'me', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net', 'nf', 'ng', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa', 'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr', 'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'ro', 'rs', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd', 'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', 'sm', 'sn', 'so', 'sr', 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td', 'tel', 'tf', 'tg', 'th', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'us', 'uy', 'uz', 'va', 'vc', 've', 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'ye', 'yt', 'yu', 'za', 'zm', 'zw'); if (!in_array($url_parts[2], $tlds)) continue; - + // Call user specified func $modified_url = $callback($url); - + // Replace it! $start = mb_strpos($text, $url, $offset); $text = mb_substr($text, 0, $start).$modified_url.mb_substr($text, $start + mb_strlen($url), mb_strlen($text)); $offset = $start + mb_strlen($modified_url); } - + return $text; } function common_linkify($url) { $display = $url; $url = (!preg_match('#^([a-z]+://|(mailto|aim|tel):)#i', $url)) ? 'http://'.$url:$url; - + if ($longurl = common_longurl($url)) { $longurl = htmlentities($longurl, ENT_QUOTES, 'UTF-8'); $title = "title=\"$longurl\""; } else $title = ''; - + return "$display"; } @@ -653,48 +653,6 @@ function common_relative_profile($sender, $nickname, $dt=null) return null; } -// where should the avatar go for this user? - -function common_avatar_filename($id, $extension, $size=null, $extra=null) -{ - global $config; - - if ($size) { - return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension; - } else { - return $id . '-original' . (($extra) ? ('-' . $extra) : '') . $extension; - } -} - -function common_avatar_path($filename) -{ - global $config; - return INSTALLDIR . '/avatar/' . $filename; -} - -function common_avatar_url($filename) -{ - return common_path('avatar/'.$filename); -} - -function common_avatar_display_url($avatar) -{ - $server = common_config('avatar', 'server'); - if ($server) { - return 'http://'.$server.'/'.$avatar->filename; - } else { - return $avatar->url; - } -} - -function common_default_avatar($size) -{ - static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', - AVATAR_STREAM_SIZE => 'stream', - AVATAR_MINI_SIZE => 'mini'); - return theme_path('default-avatar-'.$sizenames[$size].'.png'); -} - function common_local_url($action, $args=null, $fragment=null) { $url = null; @@ -1511,16 +1469,6 @@ function common_markup_to_html($c) return Markdown($c); } -function common_profile_avatar_url($profile, $size=AVATAR_PROFILE_SIZE) -{ - $avatar = $profile->getAvatar($size); - if ($avatar) { - return common_avatar_display_url($avatar); - } else { - return common_default_avatar($size); - } -} - function common_profile_uri($profile) { if (!$profile) { diff --git a/scripts/enjitqueuehandler.php b/scripts/enjitqueuehandler.php index 3a4f8315d..40f60da5d 100755 --- a/scripts/enjitqueuehandler.php +++ b/scripts/enjitqueuehandler.php @@ -74,7 +74,7 @@ class EnjitQueueHandler extends QueueHandler $atom .= "\n"; $atom .= " $profile->nickname)) . "'/>\n"; $atom .= "" . $profile->nickname . "\n"; - $atom .= "" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "\n"; + $atom .= "" . $profile->avatarUrl(AVATAR_PROFILE_SIZE) . "\n"; $atom .= "\n"; $atom .= "" . htmlspecialchars($msg) . "\n"; $atom .= "" . htmlspecialchars($msg) . "\n"; -- cgit v1.2.3-54-g00ecf From 5cdead72cdee1261e506cdc89dd81242bfb9ba84 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 6 Feb 2009 04:03:03 -0500 Subject: Fix name of default avatar --- classes/Avatar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'classes') diff --git a/classes/Avatar.php b/classes/Avatar.php index 6248a84d3..db9d78e47 100644 --- a/classes/Avatar.php +++ b/classes/Avatar.php @@ -73,7 +73,7 @@ class Avatar extends Memcached_DataObject } } - static function defaultAvatar($size) + static function defaultImage($size) { static $sizenames = array(AVATAR_PROFILE_SIZE => 'profile', AVATAR_STREAM_SIZE => 'stream', -- cgit v1.2.3-54-g00ecf