summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Millette <millette@plantard.controlezvous.ca>2009-01-23 01:01:01 +0000
committerRobin Millette <millette@plantard.controlezvous.ca>2009-01-23 01:01:01 +0000
commit8a65c5175c3b734d4c53d6a3c3af51c5a645dff2 (patch)
tree6e85645d2e51d517f88413c119ddc4eed26f633b
parent4a4efc3b0a453a0e345f4ec5bd8e970130589ae6 (diff)
parent1132e66f84c188f8267165d99d95d04047b6b23b (diff)
Merge branch 'master' of /var/www/trunk
-rw-r--r--actions/finishopenidlogin.php123
-rw-r--r--actions/foaf.php90
-rw-r--r--actions/invite.php107
-rw-r--r--actions/openidlogin.php48
-rw-r--r--actions/public.php2
-rw-r--r--actions/recoverpassword.php133
-rw-r--r--actions/remotesubscribe.php121
-rw-r--r--actions/showgroup.php6
-rw-r--r--actions/subscribers.php6
-rw-r--r--actions/subscriptions.php6
-rw-r--r--actions/sup.php34
-rw-r--r--actions/tagother.php122
-rw-r--r--actions/userauthorization.php151
-rw-r--r--actions/xrds.php14
-rw-r--r--classes/Memcached_DataObject.php5
-rw-r--r--classes/User.php54
-rw-r--r--js/util.js2
-rw-r--r--lib/featureduserssection.php89
-rw-r--r--lib/galleryaction.php7
-rw-r--r--lib/groupsection.php14
-rw-r--r--lib/grouptagcloudsection.php87
-rw-r--r--lib/noticesection.php38
-rw-r--r--lib/profilelist.php4
-rw-r--r--lib/profilesection.php11
-rw-r--r--lib/tagcloudsection.php11
-rw-r--r--lib/topposterssection.php30
-rw-r--r--theme/base/css/display.css62
-rw-r--r--theme/identica/css/display.css14
28 files changed, 865 insertions, 526 deletions
diff --git a/actions/finishopenidlogin.php b/actions/finishopenidlogin.php
index bc33ac330..880a9505b 100644
--- a/actions/finishopenidlogin.php
+++ b/actions/finishopenidlogin.php
@@ -23,6 +23,9 @@ require_once(INSTALLDIR.'/lib/openid.php');
class FinishopenidloginAction extends Action
{
+ var $error = null;
+ var $username = null;
+ var $message = null;
function handle($args)
{
@@ -32,32 +35,32 @@ class FinishopenidloginAction extends Action
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
- $this->show_form(_('There was a problem with your session token. Try again, please.'));
+ $this->showForm(_('There was a problem with your session token. Try again, please.'));
return;
}
if ($this->arg('create')) {
if (!$this->boolean('license')) {
- $this->show_form(_('You can\'t register if you don\'t agree to the license.'),
- $this->trimmed('newname'));
+ $this->showForm(_('You can\'t register if you don\'t agree to the license.'),
+ $this->trimmed('newname'));
return;
}
- $this->create_new_user();
+ $this->createNewUser();
} else if ($this->arg('connect')) {
- $this->connect_user();
+ $this->connectUser();
} else {
common_debug(print_r($this->args, true), __FILE__);
- $this->show_form(_('Something weird happened.'),
- $this->trimmed('newname'));
+ $this->showForm(_('Something weird happened.'),
+ $this->trimmed('newname'));
}
} else {
- $this->try_login();
+ $this->tryLogin();
}
}
- function show_top($error=null)
+ function showPageNotice()
{
- if ($error) {
- $this->element('div', array('class' => 'error'), $error);
+ if ($this->error) {
+ $this->element('div', array('class' => 'error'), $this->error);
} else {
global $config;
$this->element('div', 'instructions',
@@ -65,21 +68,36 @@ class FinishopenidloginAction extends Action
}
}
- function show_form($error=null, $username=null)
+ function title()
{
- common_show_header(_('OpenID Account Setup'), null, $error,
- array($this, 'show_top'));
+ return _('OpenID Account Setup');
+ }
+
+ function showForm($error=null, $username=null)
+ {
+ $this->error = $error;
+ $this->username = $username;
+
+ $this->showPage();
+ }
+
+ function showContent()
+ {
+ if ($this->message_text) {
+ $this->element('p', null, $this->message);
+ return;
+ }
$this->elementStart('form', array('method' => 'post',
- 'id' => 'account_connect',
- 'action' => common_local_url('finishopenidlogin')));
+ 'id' => 'account_connect',
+ 'action' => common_local_url('finishopenidlogin')));
$this->hidden('token', common_session_token());
$this->element('h2', null,
_('Create new account'));
$this->element('p', null,
_('Create a new user with this nickname.'));
$this->input('newname', _('New nickname'),
- ($username) ? $username : '',
+ ($this->username) ? $this->username : '',
_('1-64 lowercase letters or numbers, no punctuation or spaces'));
$this->elementStart('p');
$this->element('input', array('type' => 'checkbox',
@@ -87,7 +105,7 @@ class FinishopenidloginAction extends Action
'name' => 'license',
'value' => 'true'));
$this->text(_('My text and files are available under '));
- $this->element('a', array(href => common_config('license', 'url')),
+ $this->element('a', array('href' => common_config('license', 'url')),
common_config('license', 'title'));
$this->text(_(' except this private data: password, email address, IM address, phone number.'));
$this->elementEnd('p');
@@ -100,12 +118,10 @@ class FinishopenidloginAction extends Action
$this->password('password', _('Password'));
$this->submit('connect', _('Connect'));
$this->elementEnd('form');
- common_show_footer();
}
- function try_login()
+ function tryLogin()
{
-
$consumer = oid_consumer();
$response = $consumer->complete(common_local_url('finishopenidlogin'));
@@ -143,22 +159,21 @@ class FinishopenidloginAction extends Action
common_rememberme($user);
}
unset($_SESSION['openid_rememberme']);
- $this->go_home($user->nickname);
+ $this->goHome($user->nickname);
} else {
- $this->save_values($display, $canonical, $sreg);
- $this->show_form(null, $this->best_new_nickname($display, $sreg));
+ $this->saveValues($display, $canonical, $sreg);
+ $this->showForm(null, $this->bestNewNickname($display, $sreg));
}
}
}
function message($msg)
{
- common_show_header(_('OpenID Login'));
- $this->element('p', null, $msg);
- common_show_footer();
+ $this->message_text = $msg;
+ $this->showPage();
}
- function save_values($display, $canonical, $sreg)
+ function saveValues($display, $canonical, $sreg)
{
common_ensure_session();
$_SESSION['openid_display'] = $display;
@@ -166,16 +181,15 @@ class FinishopenidloginAction extends Action
$_SESSION['openid_sreg'] = $sreg;
}
- function get_saved_values()
+ function getSavedValues()
{
return array($_SESSION['openid_display'],
$_SESSION['openid_canonical'],
$_SESSION['openid_sreg']);
}
- function create_new_user()
+ function createNewUser()
{
-
# FIXME: save invite code before redirect, and check here
if (common_config('site', 'closed') || common_config('site', 'inviteonly')) {
@@ -188,21 +202,21 @@ class FinishopenidloginAction extends Action
if (!Validate::string($nickname, array('min_length' => 1,
'max_length' => 64,
'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
- $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+ $this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.'));
return;
}
if (!User::allowed_nickname($nickname)) {
- $this->show_form(_('Nickname not allowed.'));
+ $this->showForm(_('Nickname not allowed.'));
return;
}
if (User::staticGet('nickname', $nickname)) {
- $this->show_form(_('Nickname already in use. Try another one.'));
+ $this->showForm(_('Nickname already in use. Try another one.'));
return;
}
- list($display, $canonical, $sreg) = $this->get_saved_values();
+ list($display, $canonical, $sreg) = $this->getSavedValues();
if (!$display || !$canonical) {
$this->serverError(_('Stored OpenID not found.'));
@@ -256,14 +270,13 @@ class FinishopenidloginAction extends Action
common_redirect(common_local_url('showstream', array('nickname' => $user->nickname)));
}
- function connect_user()
+ function connectUser()
{
-
$nickname = $this->trimmed('nickname');
$password = $this->trimmed('password');
if (!common_check_user($nickname, $password)) {
- $this->show_form(_('Invalid username or password.'));
+ $this->showForm(_('Invalid username or password.'));
return;
}
@@ -271,7 +284,7 @@ class FinishopenidloginAction extends Action
$user = User::staticGet('nickname', $nickname);
- list($display, $canonical, $sreg) = $this->get_saved_values();
+ list($display, $canonical, $sreg) = $this->getSavedValues();
if (!$display || !$canonical) {
$this->serverError(_('Stored OpenID not found.'));
@@ -293,10 +306,10 @@ class FinishopenidloginAction extends Action
common_rememberme($user);
}
unset($_SESSION['openid_rememberme']);
- $this->go_home($user->nickname);
+ $this->goHome($user->nickname);
}
- function go_home($nickname)
+ function goHome($nickname)
{
$url = common_get_returnto();
if ($url) {
@@ -310,14 +323,14 @@ class FinishopenidloginAction extends Action
common_redirect($url);
}
- function best_new_nickname($display, $sreg)
+ function bestNewNickname($display, $sreg)
{
# Try the passed-in nickname
if ($sreg['nickname']) {
$nickname = $this->nicknamize($sreg['nickname']);
- if ($this->is_new_nickname($nickname)) {
+ if ($this->isNewNickname($nickname)) {
return $nickname;
}
}
@@ -326,16 +339,16 @@ class FinishopenidloginAction extends Action
if ($sreg['fullname']) {
$fullname = $this->nicknamize($sreg['fullname']);
- if ($this->is_new_nickname($fullname)) {
+ if ($this->isNewNickname($fullname)) {
return $fullname;
}
}
# Try the URL
- $from_url = $this->openid_to_nickname($display);
+ $from_url = $this->openidToNickname($display);
- if ($from_url && $this->is_new_nickname($from_url)) {
+ if ($from_url && $this->isNewNickname($from_url)) {
return $from_url;
}
@@ -344,14 +357,14 @@ class FinishopenidloginAction extends Action
return null;
}
- function is_new_nickname($str)
+ function isNewNickname($str)
{
if (!Validate::string($str, array('min_length' => 1,
'max_length' => 64,
'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
return false;
}
- if (!User::allowed_nickname($str)) {
+ if (!User::allowed_nickname($str)) {
return false;
}
if (User::staticGet('nickname', $str)) {
@@ -360,12 +373,12 @@ class FinishopenidloginAction extends Action
return true;
}
- function openid_to_nickname($openid)
+ function openidToNickname($openid)
{
if (Auth_Yadis_identifierScheme($openid) == 'XRI') {
- return $this->xri_to_nickname($openid);
+ return $this->xriToNickname($openid);
} else {
- return $this->url_to_nickname($openid);
+ return $this->urlToNickname($openid);
}
}
@@ -374,7 +387,7 @@ class FinishopenidloginAction extends Action
# 2. One element in path, like http://profile.typekey.com/EvanProdromou/
# or http://getopenid.com/evanprodromou
- function url_to_nickname($openid)
+ function urlToNickname($openid)
{
static $bad = array('query', 'user', 'password', 'port', 'fragment');
@@ -421,9 +434,9 @@ class FinishopenidloginAction extends Action
return null;
}
- function xri_to_nickname($xri)
+ function xriToNickname($xri)
{
- $base = $this->xri_base($xri);
+ $base = $this->xriBase($xri);
if (!$base) {
return null;
@@ -435,7 +448,7 @@ class FinishopenidloginAction extends Action
}
}
- function xri_base($xri)
+ function xriBase($xri)
{
if (substr($xri, 0, 6) == 'xri://') {
return substr($xri, 6);
diff --git a/actions/foaf.php b/actions/foaf.php
index 9fa321d4a..3a99835b4 100644
--- a/actions/foaf.php
+++ b/actions/foaf.php
@@ -25,35 +25,40 @@ define('BOTH', 0);
class FoafAction extends Action
{
-
function isReadOnly()
{
return true;
}
- function handle($args)
+ function prepare($args)
{
- parent::handle($args);
+ parent::prepare($args);
+ $this->nickname = $this->trimmed('nickname');
- $nickname = $this->trimmed('nickname');
+ $this->user = User::staticGet('nickname', $this->nickname);
- $user = User::staticGet('nickname', $nickname);
-
- if (!$user) {
+ if (!$this->user) {
$this->clientError(_('No such user.'), 404);
- return;
+ return false;
}
- $profile = $user->getProfile();
+ $this->profile = $this->user->getProfile();
- if (!$profile) {
+ if (!$this->profile) {
$this->serverError(_('User has no profile.'), 500);
- return;
+ return false;
}
+ return true;
+ }
+
+ function handle($args)
+ {
+ parent::handle($args);
+
header('Content-Type: application/rdf+xml');
- common_start_xml();
+ $this->startXML();
$this->elementStart('rdf:RDF', array('xmlns:rdf' =>
'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
'xmlns:rdfs' =>
@@ -62,42 +67,42 @@ class FoafAction extends Action
'http://www.w3.org/2003/01/geo/wgs84_pos#',
'xmlns' => 'http://xmlns.com/foaf/0.1/'));
- # This is the document about the user
+ // This is the document about the user
- $this->show_ppd('', $user->uri);
+ $this->showPpd('', $this->user->uri);
- # XXX: might not be a person
+ // XXX: might not be a person
$this->elementStart('Person', array('rdf:about' =>
- $user->uri));
- $this->element('mbox_sha1sum', null, sha1('mailto:' . $user->email));
- if ($profile->fullname) {
- $this->element('name', null, $profile->fullname);
+ $this->user->uri));
+ $this->element('mbox_sha1sum', null, sha1('mailto:' . $this->user->email));
+ if ($this->profile->fullname) {
+ $this->element('name', null, $this->profile->fullname);
}
- if ($profile->homepage) {
- $this->element('homepage', array('rdf:resource' => $profile->homepage));
+ if ($this->profile->homepage) {
+ $this->element('homepage', array('rdf:resource' => $this->profile->homepage));
}
- if ($profile->bio) {
- $this->element('rdfs:comment', null, $profile->bio);
+ if ($this->profile->bio) {
+ $this->element('rdfs:comment', null, $this->profile->bio);
}
- # XXX: more structured location data
- if ($profile->location) {
+ // XXX: more structured location data
+ if ($this->profile->location) {
$this->elementStart('based_near');
$this->elementStart('geo:SpatialThing');
- $this->element('name', null, $profile->location);
+ $this->element('name', null, $this->profile->location);
$this->elementEnd('geo:SpatialThing');
$this->elementEnd('based_near');
}
- $this->show_microblogging_account($profile, common_root_url());
+ $this->showMicrobloggingAccount($this->profile, common_root_url());
- $avatar = $profile->getOriginalAvatar();
+ $avatar = $this->profile->getOriginalAvatar();
if ($avatar) {
$this->elementStart('img');
$this->elementStart('Image', array('rdf:about' => $avatar->url));
foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
- $scaled = $profile->getAvatar($size);
- if (!$scaled->original) { # sometimes the original has one of our scaled sizes
+ $scaled = $this->profile->getAvatar($size);
+ if (!$scaled->original) { // sometimes the original has one of our scaled sizes
$this->elementStart('thumbnail');
$this->element('Image', array('rdf:about' => $scaled->url));
$this->elementEnd('thumbnail');
@@ -107,14 +112,14 @@ class FoafAction extends Action
$this->elementEnd('img');
}
- # Get people user is subscribed to
+ // Get people user is subscribed to
$person = array();
$sub = new Subscription();
- $sub->subscriber = $profile->id;
+ $sub->subscriber = $this->profile->id;
$sub->whereAdd('subscriber != subscribed');
-
+
if ($sub->find()) {
while ($sub->fetch()) {
if ($sub->token) {
@@ -131,10 +136,10 @@ class FoafAction extends Action
}
}
- # Get people who subscribe to user
+ // Get people who subscribe to user
$sub = new Subscription();
- $sub->subscribed = $profile->id;
+ $sub->subscribed = $this->profile->id;
$sub->whereAdd('subscriber != subscribed');
if ($sub->find()) {
@@ -163,26 +168,27 @@ class FoafAction extends Action
if ($p[1] instanceof User) {
$foaf_url = common_local_url('foaf', array('nickname' => $p[1]->nickname));
}
- $profile = Profile::staticGet($p[1]->id);
+ $this->profile = Profile::staticGet($p[1]->id);
$this->elementStart('Person', array('rdf:about' => $uri));
if ($p[0] == LISTENER || $p[0] == BOTH) {
- $this->element('knows', array('rdf:resource' => $user->uri));
+ $this->element('knows', array('rdf:resource' => $this->user->uri));
}
- $this->show_microblogging_account($profile, ($p[1] instanceof User) ?
+ $this->showMicrobloggingAccount($this->profile, ($p[1] instanceof User) ?
common_root_url() : null);
if ($foaf_url) {
$this->element('rdfs:seeAlso', array('rdf:resource' => $foaf_url));
}
$this->elementEnd('Person');
if ($foaf_url) {
- $this->show_ppd($foaf_url, $uri);
+ $this->showPpd($foaf_url, $uri);
}
}
$this->elementEnd('rdf:RDF');
+ $this->endXML();
}
- function show_ppd($foaf_url, $person_uri)
+ function showPpd($foaf_url, $person_uri)
{
$this->elementStart('PersonalProfileDocument', array('rdf:about' => $foaf_url));
$this->element('maker', array('rdf:resource' => $person_uri));
@@ -190,9 +196,9 @@ class FoafAction extends Action
$this->elementEnd('PersonalProfileDocument');
}
- function show_microblogging_account($profile, $service=null)
+ function showMicrobloggingAccount($profile, $service=null)
{
- # Their account
+ // Their account
$this->elementStart('holdsAccount');
$this->elementStart('OnlineAccount');
if ($service) {
diff --git a/actions/invite.php b/actions/invite.php
index 95d96bcde..f4ad2f7c5 100644
--- a/actions/invite.php
+++ b/actions/invite.php
@@ -21,6 +21,11 @@ if (!defined('LACONICA')) { exit(1); }
class InviteAction extends Action
{
+ var $mode = null;
+ var $error = null;
+ var $already = null;
+ var $subbed = null;
+ var $sent = null;
function isReadOnly()
{
@@ -35,19 +40,18 @@ class InviteAction extends Action
common_config('site', 'name')));
return;
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
- $this->send_invitations();
+ $this->sendInvitations();
} else {
- $this->show_form();
+ $this->showForm();
}
}
- function send_invitations()
+ function sendInvitations()
{
-
# CSRF protection
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
- $this->show_form(_('There was a problem with your session token. Try again, please.'));
+ $this->showForm(_('There was a problem with your session token. Try again, please.'));
return;
}
@@ -63,78 +67,105 @@ class InviteAction extends Action
foreach ($addresses as $email) {
$email = trim($email);
if (!Validate::email($email, true)) {
- $this->show_form(sprintf(_('Invalid email address: %s'), $email));
+ $this->showForm(sprintf(_('Invalid email address: %s'), $email));
return;
}
}
- $already = array();
- $subbed = array();
+ $this->already = array();
+ $this->subbed = array();
foreach ($addresses as $email) {
$email = common_canonical_email($email);
$other = User::staticGet('email', $email);
if ($other) {
if ($user->isSubscribed($other)) {
- $already[] = $other;
+ $this->already[] = $other;
} else {
subs_subscribe_to($user, $other);
- $subbed[] = $other;
+ $this->subbed[] = $other;
}
} else {
- $sent[] = $email;
- $this->send_invitation($email, $user, $personal);
+ $this->sent[] = $email;
+ $this->sendInvitation($email, $user, $personal);
}
}
- common_show_header(_('Invitation(s) sent'));
- if ($already) {
+ $this->mode = 'sent';
+
+ $this->showPage();
+ }
+
+ function title()
+ {
+ if ($this->mode == 'sent') {
+ return _('Invitation(s) sent');
+ } else {
+ return _('Invite new users');
+ }
+ }
+
+ function showContent()
+ {
+ if ($this->mode == 'sent') {
+ $this->showInvitationSuccess();
+ } else {
+ $this->showInviteForm();
+ }
+ }
+
+ function showInvitationSuccess()
+ {
+ if ($this->already) {
$this->element('p', null, _('You are already subscribed to these users:'));
$this->elementStart('ul');
- foreach ($already as $other) {
+ foreach ($this->already as $other) {
$this->element('li', null, sprintf(_('%s (%s)'), $other->nickname, $other->email));
}
$this->elementEnd('ul');
}
- if ($subbed) {
+ if ($this->subbed) {
$this->element('p', null, _('These people are already users and you were automatically subscribed to them:'));
$this->elementStart('ul');
- foreach ($subbed as $other) {
+ foreach ($this->subbed as $other) {
$this->element('li', null, sprintf(_('%s (%s)'), $other->nickname, $other->email));
}
$this->elementEnd('ul');
}
- if ($sent) {
+ if ($this->sent) {
$this->element('p', null, _('Invitation(s) sent to the following people:'));
$this->elementStart('ul');
- foreach ($sent as $other) {
+ foreach ($this->sent as $other) {
$this->element('li', null, $other);
}
$this->elementEnd('ul');
$this->element('p', null, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
}
- common_show_footer();
}
- function show_top($error=null)
+ function showPageNotice()
{
- if ($error) {
- $this->element('p', 'error', $error);
- } else {
- $this->elementStart('div', 'instructions');
- $this->element('p', null,
- _('Use this form to invite your friends and colleagues to use this service.'));
- $this->elementEnd('div');
+ if ($this->mode != 'sent') {
+ if ($this->error) {
+ $this->element('p', 'error', $this->error);
+ } else {
+ $this->elementStart('div', 'instructions');
+ $this->element('p', null,
+ _('Use this form to invite your friends and colleagues to use this service.'));
+ $this->elementEnd('div');
+ }
}
}
- function show_form($error=null)
+ function showForm($error=null)
{
+ $this->mode = 'form';
+ $this->error = $error;
+ $this->showPage();
+ }
- global $config;
-
- common_show_header(_('Invite new users'), null, $error, array($this, 'show_top'));
-
+ function showInviteForm()
+ {
$this->elementStart('form', array('method' => 'post',
'id' => 'invite',
'action' => common_local_url('invite')));
@@ -151,13 +182,10 @@ class InviteAction extends Action
$this->submit('send', _('Send'));
$this->elementEnd('form');
-
- common_show_footer();
}
- function send_invitation($email, $user, $personal)
+ function sendInvitation($email, $user, $personal)
{
-
$profile = $user->getProfile();
$bestname = $profile->getBestName();
@@ -203,4 +231,9 @@ class InviteAction extends Action
mail_send($recipients, $headers, $body);
}
+ function showLocalNav()
+ {
+ $nav = new SubGroupNav($this, common_current_user());
+ $nav->show();
+ }
}
diff --git a/actions/openidlogin.php b/actions/openidlogin.php
index d1989e0de..ec5361c8b 100644
--- a/actions/openidlogin.php
+++ b/actions/openidlogin.php
@@ -23,7 +23,6 @@ require_once(INSTALLDIR.'/lib/openid.php');
class OpenidloginAction extends Action
{
-
function handle($args)
{
parent::handle($args);
@@ -35,40 +34,40 @@ class OpenidloginAction extends Action
# CSRF protection
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
- $this->show_form(_('There was a problem with your session token. Try again, please.'), $openid_url);
+ $this->showForm(_('There was a problem with your session token. Try again, please.'), $openid_url);
return;
}
$rememberme = $this->boolean('rememberme');
-
+
common_ensure_session();
-
+
$_SESSION['openid_rememberme'] = $rememberme;
-
+
$result = oid_authenticate($openid_url,
'finishopenidlogin');
-
+
if (is_string($result)) { # error message
unset($_SESSION['openid_rememberme']);
- $this->show_form($result, $openid_url);
+ $this->showForm($result, $openid_url);
}
} else {
$openid_url = oid_get_last();
- $this->show_form(null, $openid_url);
+ $this->showForm(null, $openid_url);
}
}
- function get_instructions()
+ function getInstructions()
{
return _('Login with an [OpenID](%%doc.openid%%) account.');
}
- function show_top($error=null)
+ function showPageNotice()
{
- if ($error) {
- $this->element('div', array('class' => 'error'), $error);
+ if ($this->error) {
+ $this->element('div', array('class' => 'error'), $this->error);
} else {
- $instr = $this->get_instructions();
+ $instr = $this->getInstructions();
$output = common_markup_to_html($instr);
$this->elementStart('div', 'instructions');
$this->raw($output);
@@ -76,22 +75,37 @@ class OpenidloginAction extends Action
}
}
- function show_form($error=null, $openid_url)
+ function title()
{
- common_show_header(_('OpenID Login'), null, $error, array($this, 'show_top'));
+ return _('OpenID Login');
+ }
+
+ function showForm($error=null, $openid_url)
+ {
+ $this->error = $error;
+ $this->openid_url = $openid_url;
+ $this->showPage();
+ }
+
+ function showContent() {
$formaction = common_local_url('openidlogin');
$this->elementStart('form', array('method' => 'post',
'id' => 'openidlogin',
'action' => $formaction));
$this->hidden('token', common_session_token());
$this->input('openid_url', _('OpenID URL'),
- $openid_url,
+ $this->openid_url,
_('Your OpenID URL'));
$this->checkbox('rememberme', _('Remember me'), false,
_('Automatically login in the future; ' .
'not for shared computers!'));
$this->submit('submit', _('Login'));
$this->elementEnd('form');
- common_show_footer();
+ }
+
+ function showLocalNav()
+ {
+ $nav = new LoginGroupNav($this);
+ $nav->show();
}
}
diff --git a/actions/public.php b/actions/public.php
index b51a95f24..c2e90c3b5 100644
--- a/actions/public.php
+++ b/actions/public.php
@@ -206,5 +206,7 @@ class PublicAction extends Action
$pop->show();
$gbp = new GroupsByPostsSection($this);
$gbp->show();
+ $feat = new FeaturedUsersSection($this);
+ $feat->show();
}
}
diff --git a/actions/recoverpassword.php b/actions/recoverpassword.php
index 3d839e751..eeb6b2516 100644
--- a/actions/recoverpassword.php
+++ b/actions/recoverpassword.php
@@ -25,6 +25,9 @@ define(MAX_RECOVERY_TIME, 24 * 60 * 60);
class RecoverpasswordAction extends Action
{
+ var $mode = null;
+ var $msg = null;
+ var $success = null;
function handle($args)
{
@@ -34,22 +37,22 @@ class RecoverpasswordAction extends Action
return;
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if ($this->arg('recover')) {
- $this->recover_password();
+ $this->recoverPassword();
} else if ($this->arg('reset')) {
- $this->reset_password();
+ $this->resetPassword();
} else {
$this->clientError(_('Unexpected form submission.'));
}
} else {
if ($this->trimmed('code')) {
- $this->check_code();
+ $this->checkCode();
} else {
- $this->show_form();
+ $this->showForm();
}
}
}
- function check_code()
+ function checkCode()
{
$code = $this->trimmed('code');
@@ -88,7 +91,7 @@ class RecoverpasswordAction extends Action
# Note: it's still deleted; let's avoid a second attempt!
if ((time() - $touched) > MAX_RECOVERY_TIME) {
- common_log(LOG_WARNING,
+ common_log(LOG_WARNING,
'Attempted redemption on recovery code ' .
'that is ' . $touched . ' seconds old. ');
$this->clientError(_('This confirmation code is too old. ' .
@@ -112,17 +115,17 @@ class RecoverpasswordAction extends Action
# Success!
- $this->set_temp_user($user);
- $this->show_password_form();
+ $this->setTempUser($user);
+ $this->showPasswordForm();
}
- function set_temp_user(&$user)
+ function setTempUser(&$user)
{
common_ensure_session();
$_SESSION['tempuser'] = $user->id;
}
- function get_temp_user()
+ function getTempUser()
{
common_ensure_session();
$user_id = $_SESSION['tempuser'];
@@ -132,44 +135,51 @@ class RecoverpasswordAction extends Action
return $user;
}
- function clear_temp_user()
+ function clearTempUser()
{
common_ensure_session();
unset($_SESSION['tempuser']);
}
- function show_top($msg=null)
+ function showPageNotice()
{
- if ($msg) {
- $this->element('div', 'error', $msg);
+ if ($this->msg) {
+ $this->element('div', ($this->success) ? 'success' : 'error', $this->msg);
} else {
$this->elementStart('div', 'instructions');
- $this->element('p', null,
- _('If you\'ve forgotten or lost your' .
- ' password, you can get a new one sent to' .
- ' the email address you have stored ' .
- ' in your account.'));
+ if ($this->mode == 'recover') {
+ $this->element('p', null,
+ _('If you\'ve forgotten or lost your' .
+ ' password, you can get a new one sent to' .
+ ' the email address you have stored ' .
+ ' in your account.'));
+ } else if ($this->mode == 'reset') {
+ $this->element('p', null,
+ _('You\'ve been identified. Enter a ' .
+ ' new password below. '));
+ }
$this->elementEnd('div');
}
}
- function show_password_top($msg=null)
+ function showForm($msg=null)
{
- if ($msg) {
- $this->element('div', 'error', $msg);
- } else {
- $this->element('div', 'instructions',
- _('You\'ve been identified. Enter a ' .
- ' new password below. '));
- }
+ $this->msg = $msg;
+ $this->mode = 'recover';
+ $this->showPage();
}
- function show_form($msg=null)
+ function showContent()
{
+ if ($this->mode == 'recover') {
+ $this->showRecoverForm();
+ } else if ($this->mode == 'reset') {
+ $this->showResetForm();
+ }
+ }
- common_show_header(_('Recover password'), null,
- $msg, array($this, 'show_top'));
-
+ function showRecoverForm()
+ {
$this->elementStart('form', array('method' => 'post',
'id' => 'recoverpassword',
'action' => common_local_url('recoverpassword')));
@@ -179,15 +189,29 @@ class RecoverpasswordAction extends Action
'or your registered email address.'));
$this->submit('recover', _('Recover'));
$this->elementEnd('form');
- common_show_footer();
}
- function show_password_form($msg=null)
+ function title()
{
+ switch ($this->mode) {
+ case 'reset': return _('Reset password');
+ case 'recover': return _('Recover password');
+ case 'sent': return _('Password recovery requested');
+ case 'saved': return _('Password saved.');
+ default:
+ return _('Unknown action');
+ }
+ }
- common_show_header(_('Reset password'), null,
- $msg, array($this, 'show_password_top'));
+ function showPasswordForm($msg=null)
+ {
+ $this->msg = $msg;
+ $this->mode = 'reset';
+ $this->showPage();
+ }
+ function showResetForm()
+ {
$this->elementStart('form', array('method' => 'post',
'id' => 'recoverpassword',
'action' => common_local_url('recoverpassword')));
@@ -198,14 +222,13 @@ class RecoverpasswordAction extends Action
_('Same as password above'));
$this->submit('reset', _('Reset'));
$this->elementEnd('form');
- common_show_footer();
}
- function recover_password()
+ function recoverPassword()
{
$nore = $this->trimmed('nicknameoremail');
if (!$nore) {
- $this->show_form(_('Enter a nickname or email address.'));
+ $this->showForm(_('Enter a nickname or email address.'));
return;
}
@@ -225,7 +248,7 @@ class RecoverpasswordAction extends Action
}
if (!$user) {
- $this->show_form(_('No user with that email address or username.'));
+ $this->showForm(_('No user with that email address or username.'));
return;
}
@@ -277,25 +300,24 @@ class RecoverpasswordAction extends Action
mail_to_user($user, _('Password recovery requested'), $body, $confirm->address);
- common_show_header(_('Password recovery requested'));
- $this->element('p', null,
- _('Instructions for recovering your password ' .
+ $this->mode = 'sent';
+ $this->msg = _('Instructions for recovering your password ' .
'have been sent to the email address registered to your ' .
- 'account.'));
- common_show_footer();
+ 'account.');
+ $this->success = true;
+ $this->showPage();
}
- function reset_password()
+ function resetPassword()
{
-
# CSRF protection
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
- $this->show_form(_('There was a problem with your session token. Try again, please.'));
+ $this->showForm(_('There was a problem with your session token. Try again, please.'));
return;
}
- $user = $this->get_temp_user();
+ $user = $this->getTempUser();
if (!$user) {
$this->clientError(_('Unexpected password reset.'));
@@ -306,11 +328,11 @@ class RecoverpasswordAction extends Action
$confirm = $this->trimmed('confirm');
if (!$newpassword || strlen($newpassword) < 6) {
- $this->show_password_form(_('Password must be 6 chars or more.'));
+ $this->showPasswordForm(_('Password must be 6 chars or more.'));
return;
}
if ($newpassword != $confirm) {
- $this->show_password_form(_('Password and confirmation do not match.'));
+ $this->showPasswordForm(_('Password and confirmation do not match.'));
return;
}
@@ -326,7 +348,7 @@ class RecoverpasswordAction extends Action
return;
}
- $this->clear_temp_user();
+ $this->clearTempUser();
if (!common_set_user($user->nickname)) {
$this->serverError(_('Error setting user.'));
@@ -335,9 +357,10 @@ class RecoverpasswordAction extends Action
common_real_login(true);
- common_show_header(_('Password saved.'));
- $this->element('p', null, _('New password successfully saved. ' .
- 'You are now logged in.'));
- common_show_footer();
+ $this->mode = 'saved';
+ $this->msg = _('New password successfully saved. ' .
+ 'You are now logged in.');
+ $this->success = true;
+ $this->showPage();
}
}
diff --git a/actions/remotesubscribe.php b/actions/remotesubscribe.php
index 32e9bf3d3..3c8346fbe 100644
--- a/actions/remotesubscribe.php
+++ b/actions/remotesubscribe.php
@@ -23,100 +23,112 @@ require_once(INSTALLDIR.'/lib/omb.php');
class RemotesubscribeAction extends Action
{
+ var $nickname;
+ var $profile_url;
+ var $err;
- function handle($args)
+ function prepare($args)
{
-
- parent::handle($args);
+ parent::prepare($args);
if (common_logged_in()) {
$this->clientError(_('You can use the local subscription!'));
- return;
+ return false;
}
- if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+ $this->nickname = $this->trimmed('nickname');
+ $this->profile_url = $this->trimmed('profile_url');
+
+ return true;
+ }
+
+ function handle($args)
+ {
+ parent::handle($args);
+ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
# CSRF protection
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
- $this->show_form(_('There was a problem with your session token. Try again, please.'));
+ $this->showForm(_('There was a problem with your session token. '.
+ 'Try again, please.'));
return;
}
-
- $this->remote_subscription();
+ $this->remoteSubscription();
} else {
- $this->show_form();
+ $this->showForm();
}
}
- function get_instructions()
+ function showForm($err=null)
{
- return _('To subscribe, you can [login](%%action.login%%),' .
- ' or [register](%%action.register%%) a new ' .
- ' account. If you already have an account ' .
- ' on a [compatible microblogging site](%%doc.openmublog%%), ' .
- ' enter your profile URL below.');
+ $this->err = $err;
+ $this->showPage();
}
- function show_top($err=null)
+ function showPageNotice()
{
- if ($err) {
- $this->element('div', 'error', $err);
+ if ($this->err) {
+ $this->element('div', 'error', $this->err);
} else {
- $instructions = $this->get_instructions();
- $output = common_markup_to_html($instructions);
+ $inst = _('To subscribe, you can [login](%%action.login%%),' .
+ ' or [register](%%action.register%%) a new ' .
+ ' account. If you already have an account ' .
+ ' on a [compatible microblogging site](%%doc.openmublog%%), ' .
+ ' enter your profile URL below.');
+ $output = common_markup_to_html($inst);
$this->elementStart('div', 'instructions');
$this->raw($output);
- $this->elementEnd('p');
+ $this->elementEnd('div');
}
}
- function show_form($err=null)
+ function title()
+ {
+ return _('Remote subscribe');
+ }
+
+ function showContent()
{
- $nickname = $this->trimmed('nickname');
- $profile = $this->trimmed('profile_url');
- common_show_header(_('Remote subscribe'), null, $err,
- array($this, 'show_top'));
# id = remotesubscribe conflicts with the
# button on profile page
$this->elementStart('form', array('id' => 'remsub', 'method' => 'post',
'action' => common_local_url('remotesubscribe')));
$this->hidden('token', common_session_token());
- $this->input('nickname', _('User nickname'), $nickname,
+ $this->input('nickname', _('User nickname'), $this->nickname,
_('Nickname of the user you want to follow'));
- $this->input('profile_url', _('Profile URL'), $profile,
+ $this->input('profile_url', _('Profile URL'), $this->profile_url,
_('URL of your profile on another compatible microblogging service'));
$this->submit('submit', _('Subscribe'));
$this->elementEnd('form');
- common_show_footer();
}
- function remote_subscription()
+ function remoteSubscription()
{
- $user = $this->get_user();
+ $user = $this->getUser();
if (!$user) {
- $this->show_form(_('No such user.'));
+ $this->showForm(_('No such user.'));
return;
}
- $profile = $this->trimmed('profile_url');
+ $this->profile_url = $this->trimmed('profile_url');
- if (!$profile) {
- $this->show_form(_('No such user.'));
+ if (!$this->profile_url) {
+ $this->showForm(_('No such user.'));
return;
}
- if (!Validate::uri($profile, array('allowed_schemes' => array('http', 'https')))) {
- $this->show_form(_('Invalid profile URL (bad format)'));
+ if (!Validate::uri($this->profile_url, array('allowed_schemes' => array('http', 'https')))) {
+ $this->showForm(_('Invalid profile URL (bad format)'));
return;
}
$fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
- $yadis = Auth_Yadis_Yadis::discover($profile, $fetcher);
+ $yadis = Auth_Yadis_Yadis::discover($this->profile_url, $fetcher);
if (!$yadis || $yadis->failed) {
- $this->show_form(_('Not a valid profile URL (no YADIS document).'));
+ $this->showForm(_('Not a valid profile URL (no YADIS document).'));
return;
}
@@ -125,52 +137,50 @@ class RemotesubscribeAction extends Action
$xrds =& Auth_Yadis_XRDS::parseXRDS(trim($yadis->response_text));
if (!$xrds) {
- $this->show_form(_('Not a valid profile URL (no XRDS defined).'));
+ $this->showForm(_('Not a valid profile URL (no XRDS defined).'));
return;
}
$omb = $this->getOmb($xrds);
if (!$omb) {
- $this->show_form(_('Not a valid profile URL (incorrect services).'));
+ $this->showForm(_('Not a valid profile URL (incorrect services).'));
return;
}
if (omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]) ==
common_local_url('requesttoken'))
{
- $this->show_form(_('That\'s a local profile! Login to subscribe.'));
+ $this->showForm(_('That\'s a local profile! Login to subscribe.'));
return;
}
if (User::staticGet('uri', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]))) {
- $this->show_form(_('That\'s a local profile! Login to subscribe.'));
+ $this->showForm(_('That\'s a local profile! Login to subscribe.'));
return;
}
- list($token, $secret) = $this->request_token($omb);
+ list($token, $secret) = $this->requestToken($omb);
if (!$token || !$secret) {
- $this->show_form(_('Couldn\'t get a request token.'));
+ $this->showForm(_('Couldn\'t get a request token.'));
return;
}
- $this->request_authorization($user, $omb, $token, $secret);
+ $this->requestAuthorization($user, $omb, $token, $secret);
}
- function get_user()
+ function getUser()
{
$user = null;
- $nickname = $this->trimmed('nickname');
- if ($nickname) {
- $user = User::staticGet('nickname', $nickname);
+ if ($this->nickname) {
+ $user = User::staticGet('nickname', $this->nickname);
}
return $user;
}
function getOmb($xrds)
{
-
static $omb_endpoints = array(OMB_ENDPOINT_UPDATEPROFILE, OMB_ENDPOINT_POSTNOTICE);
static $oauth_endpoints = array(OAUTH_ENDPOINT_REQUEST, OAUTH_ENDPOINT_AUTHORIZE,
OAUTH_ENDPOINT_ACCESS);
@@ -265,7 +275,7 @@ class RemotesubscribeAction extends Action
return true;
}
- function request_token($omb)
+ function requestToken($omb)
{
$con = omb_oauth_consumer();
@@ -310,7 +320,7 @@ class RemotesubscribeAction extends Action
return array($return['oauth_token'], $return['oauth_token_secret']);
}
- function request_authorization($user, $omb, $token, $secret)
+ function requestAuthorization($user, $omb, $token, $secret)
{
global $config; # for license URL
@@ -391,9 +401,4 @@ class RemotesubscribeAction extends Action
common_redirect($req->to_url());
return;
}
-
- function make_nonce()
- {
- return common_good_rand(16);
- }
}
diff --git a/actions/showgroup.php b/actions/showgroup.php
index 534043c24..8d8fbe6be 100644
--- a/actions/showgroup.php
+++ b/actions/showgroup.php
@@ -333,6 +333,8 @@ class ShowgroupAction extends Action
function showSections()
{
$this->showMembers();
+ $cloud = new GroupTagCloudSection($this, $this->group);
+ $cloud->show();
}
/**
@@ -349,7 +351,7 @@ class ShowgroupAction extends Action
return;
}
- $this->elementStart('div', array('id' => 'entity_subscriptions',
+ $this->elementStart('div', array('id' => 'entity_members',
'class' => 'section'));
$this->element('h2', null, _('Members'));
@@ -367,5 +369,7 @@ class ShowgroupAction extends Action
array('nickname' => $this->group->nickname))),
_('All members'));
}
+
+ $this->elementEnd('div');
}
}
diff --git a/actions/subscribers.php b/actions/subscribers.php
index 408829b54..be9df2b12 100644
--- a/actions/subscribers.php
+++ b/actions/subscribers.php
@@ -75,7 +75,11 @@ class SubscribersAction extends GalleryAction
$offset = ($this->page-1) * PROFILES_PER_PAGE;
$limit = PROFILES_PER_PAGE + 1;
- $subscribers = $this->user->getSubscribers($offset, $limit);
+ if ($this->tag) {
+ $subscribers = $this->user->getTaggedSubscribers($this->tag, $offset, $limit);
+ } else {
+ $subscribers = $this->user->getSubscribers($offset, $limit);
+ }
if ($subscribers) {
$subscribers_list = new SubscribersList($subscribers, $this->user, $this);
diff --git a/actions/subscriptions.php b/actions/subscriptions.php
index bcc557891..d7ba0d624 100644
--- a/actions/subscriptions.php
+++ b/actions/subscriptions.php
@@ -84,7 +84,11 @@ class SubscriptionsAction extends GalleryAction
$offset = ($this->page-1) * PROFILES_PER_PAGE;
$limit = PROFILES_PER_PAGE + 1;
- $subscriptions = $this->user->getSubscriptions($offset, $limit);
+ if ($this->tag) {
+ $subscriptions = $this->user->getTaggedSubscriptions($this->tag, $offset, $limit);
+ } else {
+ $subscriptions = $this->user->getSubscriptions($offset, $limit);
+ }
if ($subscriptions) {
$subscriptions_list = new SubscriptionsList($subscriptions, $this->user, $this);
diff --git a/actions/sup.php b/actions/sup.php
index 38e2e2e59..f4b1cda23 100644
--- a/actions/sup.php
+++ b/actions/sup.php
@@ -21,44 +21,42 @@ if (!defined('LACONICA')) { exit(1); }
class SupAction extends Action
{
-
function handle($args)
{
-
parent::handle($args);
-
+
$seconds = $this->trimmed('seconds');
-
+
if (!$seconds) {
$seconds = 15;
}
- $updates = $this->get_updates($seconds);
-
+ $updates = $this->getUpdates($seconds);
+
header('Content-Type: application/json; charset=utf-8');
-
+
print json_encode(array('updated_time' => date('c'),
'since_time' => date('c', time() - $seconds),
- 'available_periods' => $this->available_periods(),
+ 'available_periods' => $this->availablePeriods(),
'period' => $seconds,
'updates' => $updates));
}
-
- function available_periods()
+
+ function availablePeriods()
{
static $periods = array(86400, 43200, 21600, 7200,
3600, 1800, 600, 300, 120,
- 60, 30, 15);
+ 60, 30, 15);
$available = array();
foreach ($periods as $period) {
$available[$period] = common_local_url('sup',
array('seconds' => $period));
}
-
+
return $available;
}
-
- function get_updates($seconds)
+
+ function getUpdates($seconds)
{
$notice = new Notice();
@@ -69,16 +67,16 @@ class SupAction extends Action
'FROM notice ' .
'WHERE created > (now() - ' . $seconds . ') ' .
'GROUP BY profile_id');
-
+
$updates = array();
-
+
while ($notice->fetch()) {
$updates[] = array($notice->profile_id, $notice->max_id);
}
-
+
return $updates;
}
-
+
function isReadOnly()
{
return true;
diff --git a/actions/tagother.php b/actions/tagother.php
index e60eb8b58..5daf612fb 100644
--- a/actions/tagother.php
+++ b/actions/tagother.php
@@ -23,71 +23,85 @@ require_once(INSTALLDIR.'/lib/settingsaction.php');
class TagotherAction extends Action
{
+ var $profile = null;
+ var $error = null;
- function handle($args)
+ function prepare($args)
{
-
- parent::handle($args);
-
+ parent::prepare($args);
if (!common_logged_in()) {
$this->clientError(_('Not logged in'), 403);
- return;
+ return false;
+ }
+
+ $id = $this->trimmed('id');
+ if (!$id) {
+ $this->clientError(_('No id argument.'));
+ return false;
}
+ $this->profile = Profile::staticGet('id', $id);
+
+ if (!$this->profile) {
+ $this->clientError(_('No profile with that ID.'));
+ return false;
+ }
+
+ return true;
+ }
+
+ function handle($args)
+ {
+ parent::handle($args);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
- $this->save_tags();
+ $this->saveTags();
} else {
- $id = $this->trimmed('id');
- if (!$id) {
- $this->clientError(_('No id argument.'));
- return;
- }
- $profile = Profile::staticGet('id', $id);
- if (!$profile) {
- $this->clientError(_('No profile with that ID.'));
- return;
- }
- $this->show_form($profile);
+ $this->showForm($profile);
}
}
- function show_form($profile, $error=null)
+ function title()
{
+ return sprintf(_('Tag %s'), $this->profile->nickname);
+ }
- $user = common_current_user();
-
- common_show_header(_('Tag a person'),
- null, array($profile, $error), array($this, 'show_top'));
+ function showForm($error=null)
+ {
+ $this->error = $error;
+ $this->showPage();
+ }
- $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+ function showContent()
+ {
+ $avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
$this->element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
'class' => 'avatar stream',
'width' => AVATAR_PROFILE_SIZE,
'height' => AVATAR_PROFILE_SIZE,
'alt' =>
- ($profile->fullname) ? $profile->fullname :
- $profile->nickname));
+ ($this->profile->fullname) ? $this->profile->fullname :
+ $this->profile->nickname));
- $this->element('a', array('href' => $profile->profileurl,
+ $this->element('a', array('href' => $this->profile->profileurl,
'class' => 'external profile nickname'),
- $profile->nickname);
+ $this->profile->nickname);
- if ($profile->fullname) {
+ if ($this->profile->fullname) {
$this->elementStart('div', 'fullname');
- if ($profile->homepage) {
- $this->element('a', array('href' => $profile->homepage),
- $profile->fullname);
+ if ($this->profile->homepage) {
+ $this->element('a', array('href' => $this->profile->homepage),
+ $this->profile->fullname);
} else {
- $this->text($profile->fullname);
+ $this->text($this->profile->fullname);
}
$this->elementEnd('div');
}
- if ($profile->location) {
- $this->element('div', 'location', $profile->location);
+ if ($this->profile->location) {
+ $this->element('div', 'location', $this->profile->location);
}
- if ($profile->bio) {
- $this->element('div', 'bio', $profile->bio);
+ if ($this->profile->bio) {
+ $this->element('div', 'bio', $this->profile->bio);
}
$this->elementStart('form', array('method' => 'post',
@@ -95,33 +109,24 @@ class TagotherAction extends Action
'name' => 'tagother',
'action' => $this->selfUrl()));
$this->hidden('token', common_session_token());
- $this->hidden('id', $profile->id);
+ $this->hidden('id', $this->profile->id);
$this->input('tags', _('Tags'),
- ($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $profile->id)),
+ ($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $this->profile->id)),
_('Tags for this user (letters, numbers, -, ., and _), comma- or space- separated'));
$this->submit('save', _('Save'));
$this->elementEnd('form');
- common_show_footer();
-
}
- function save_tags()
+ function saveTags()
{
-
$id = $this->trimmed('id');
$tagstring = $this->trimmed('tags');
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
- $this->show_form(_('There was a problem with your session token. Try again, please.'));
- return;
- }
-
- $profile = Profile::staticGet('id', $id);
-
- if (!$profile) {
- $this->clientError(_('No such profile.'));
+ $this->showForm(_('There was a problem with your session token.'.
+ ' Try again, please.'));
return;
}
@@ -132,7 +137,7 @@ class TagotherAction extends Action
foreach ($tags as $tag) {
if (!common_valid_profile_tag($tag)) {
- $this->show_form($profile, sprintf(_('Invalid tag: "%s"'), $tag));
+ $this->showForm(sprintf(_('Invalid tag: "%s"'), $tag));
return;
}
}
@@ -143,22 +148,22 @@ class TagotherAction extends Action
$user = common_current_user();
if (!Subscription::pkeyGet(array('subscriber' => $user->id,
- 'subscribed' => $profile->id)) &&
- !Subscription::pkeyGet(array('subscriber' => $profile->id,
+ 'subscribed' => $this->profile->id)) &&
+ !Subscription::pkeyGet(array('subscriber' => $this->profile->id,
'subscribed' => $user->id)))
{
$this->clientError(_('You can only tag people you are subscribed to or who are subscribed to you.'));
return;
}
- $result = Profile_tag::setTags($user->id, $profile->id, $tags);
+ $result = Profile_tag::setTags($user->id, $this->profile->id, $tags);
if (!$result) {
$this->clientError(_('Could not save tags.'));
return;
}
- $action = $user->isSubscribed($profile) ? 'subscriptions' : 'subscribers';
+ $action = $user->isSubscribed($this->profile) ? 'subscriptions' : 'subscribers';
if ($this->boolean('ajax')) {
common_start_html('text/xml');
@@ -182,11 +187,10 @@ class TagotherAction extends Action
}
}
- function show_top($arr = null)
+ function showPageNotice()
{
- list($profile, $error) = $arr;
- if ($error) {
- $this->element('p', 'error', $error);
+ if ($this->error) {
+ $this->element('p', 'error', $this->error);
} else {
$this->elementStart('div', 'instructions');
$this->element('p', null,
diff --git a/actions/userauthorization.php b/actions/userauthorization.php
index 838458932..ed62f640c 100644
--- a/actions/userauthorization.php
+++ b/actions/userauthorization.php
@@ -24,6 +24,8 @@ define('TIMESTAMP_THRESHOLD', 300);
class UserauthorizationAction extends Action
{
+ var $error;
+ var $req;
function handle($args)
{
@@ -33,37 +35,33 @@ class UserauthorizationAction extends Action
# CSRF protection
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
- $req = $this->get_stored_request();
- $this->show_form(_('There was a problem with your session token. Try again, please.'), $req);
+ $req = $this->getStoredRequest();
+ $this->showForm($req, _('There was a problem with your session token. '.
+ 'Try again, please.'));
return;
}
# We've shown the form, now post user's choice
- $this->send_authorization();
+ $this->sendAuthorization();
} else {
if (!common_logged_in()) {
# Go log in, and then come back
- common_debug('saving URL for returnto', __FILE__);
common_set_returnto($_SERVER['REQUEST_URI']);
- common_debug('redirecting to login', __FILE__);
common_redirect(common_local_url('login'));
return;
}
try {
# this must be a new request
- common_debug('getting new request', __FILE__);
- $req = $this->get_new_request();
+ $req = $this->getNewRequest();
if (!$req) {
$this->clientError(_('No request found!'));
}
- common_debug('validating request', __FILE__);
# XXX: only validate new requests, since nonce is one-time use
- $this->validate_request($req);
- common_debug('showing form', __FILE__);
- $this->store_request($req);
- $this->show_form($req);
+ $this->validateRequest($req);
+ $this->storeRequest($req);
+ $this->showForm($req);
} catch (OAuthException $e) {
- $this->clear_request();
+ $this->clearRequest();
$this->clientError($e->getMessage());
return;
}
@@ -71,8 +69,29 @@ class UserauthorizationAction extends Action
}
}
- function show_form($req)
+ function showForm($req, $error=null)
{
+ $this->req = $req;
+ $this->error = $error;
+ $this->showPage();
+ }
+
+ function title()
+ {
+ return _('Authorize subscription');
+ }
+
+ function showPageNotice()
+ {
+ $this->element('p', null, _('Please check these details to make sure '.
+ 'that you want to subscribe to this user\'s notices. '.
+ 'If you didn\'t just ask to subscribe to someone\'s notices, '.
+ 'click "Cancel".'));
+ }
+
+ function showContent()
+ {
+ $req = $this->req;
$nickname = $req->get_parameter('omb_listenee_nickname');
$profile = $req->get_parameter('omb_listenee_profile');
@@ -83,11 +102,6 @@ class UserauthorizationAction extends Action
$location = $req->get_parameter('omb_listenee_location');
$avatar = $req->get_parameter('omb_listenee_avatar');
- common_show_header(_('Authorize subscription'));
- $this->element('p', null, _('Please check these details to make sure '.
- 'that you want to subscribe to this user\'s notices. '.
- 'If you didn\'t just ask to subscribe to someone\'s notices, '.
- 'click "Cancel".'));
$this->elementStart('div', 'profile');
if ($avatar) {
$this->element('img', array('src' => $avatar,
@@ -122,19 +136,18 @@ class UserauthorizationAction extends Action
$this->elementEnd('div');
$this->elementEnd('div');
$this->elementStart('form', array('method' => 'post',
- 'id' => 'userauthorization',
- 'name' => 'userauthorization',
- 'action' => common_local_url('userauthorization')));
+ 'id' => 'userauthorization',
+ 'name' => 'userauthorization',
+ 'action' => common_local_url('userauthorization')));
$this->hidden('token', common_session_token());
$this->submit('accept', _('Accept'));
$this->submit('reject', _('Reject'));
$this->elementEnd('form');
- common_show_footer();
}
- function send_authorization()
+ function sendAuthorization()
{
- $req = $this->get_stored_request();
+ $req = $this->getStoredRequest();
if (!$req) {
$this->clientError(_('No authorization request!'));
@@ -144,14 +157,14 @@ class UserauthorizationAction extends Action
$callback = $req->get_parameter('oauth_callback');
if ($this->arg('accept')) {
- if (!$this->authorize_token($req)) {
+ if (!$this->authorizeToken($req)) {
$this->clientError(_('Error authorizing token'));
}
- if (!$this->save_remote_profile($req)) {
+ if (!$this->saveRemoteProfile($req)) {
$this->clientError(_('Error saving remote profile'));
}
if (!$callback) {
- $this->show_accept_message($req->get_parameter('oauth_token'));
+ $this->showAcceptMessage($req->get_parameter('oauth_token'));
} else {
$params = array();
$params['oauth_token'] = $req->get_parameter('oauth_token');
@@ -193,7 +206,7 @@ class UserauthorizationAction extends Action
}
} else {
if (!$callback) {
- $this->show_reject_message();
+ $this->showRejectMessage();
} else {
# XXX: not 100% sure how to signal failure... just redirect without token?
common_redirect($callback, 303);
@@ -201,24 +214,19 @@ class UserauthorizationAction extends Action
}
}
- function authorize_token(&$req)
+ function authorizeToken(&$req)
{
$consumer_key = $req->get_parameter('oauth_consumer_key');
$token_field = $req->get_parameter('oauth_token');
- common_debug('consumer key = "'.$consumer_key.'"', __FILE__);
- common_debug('token field = "'.$token_field.'"', __FILE__);
$rt = new Token();
$rt->consumer_key = $consumer_key;
$rt->tok = $token_field;
$rt->type = 0;
$rt->state = 0;
- common_debug('request token to look up: "'.print_r($rt,true).'"');
if ($rt->find(true)) {
- common_debug('found request token to authorize', __FILE__);
$orig_rt = clone($rt);
$rt->state = 1; # Authorized but not used
if ($rt->update($orig_rt)) {
- common_debug('updated request token so it is authorized', __FILE__);
return true;
}
}
@@ -227,7 +235,7 @@ class UserauthorizationAction extends Action
# XXX: refactor with similar code in finishremotesubscribe.php
- function save_remote_profile(&$req)
+ function saveRemoteProfile(&$req)
{
# FIXME: we should really do this when the consumer comes
# back for an access token. If they never do, we've got stuff in a
@@ -295,15 +303,15 @@ class UserauthorizationAction extends Action
}
if ($avatar_url) {
- if (!$this->add_avatar($profile, $avatar_url)) {
+ if (!$this->addAvatar($profile, $avatar_url)) {
return false;
}
}
$user = common_current_user();
$datastore = omb_oauth_datastore();
- $consumer = $this->get_consumer($datastore, $req);
- $token = $this->get_token($datastore, $req, $consumer);
+ $consumer = $this->getConsumer($datastore, $req);
+ $token = $this->getToken($datastore, $req, $consumer);
$sub = new Subscription();
$sub->subscriber = $user->id;
@@ -318,54 +326,54 @@ class UserauthorizationAction extends Action
return true;
}
- function add_avatar($profile, $url)
+ function addAvatar($profile, $url)
{
$temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
copy($url, $temp_filename);
return $profile->setOriginal($temp_filename);
}
- function show_accept_message($tok)
+ function showAcceptMessage($tok)
{
common_show_header(_('Subscription authorized'));
$this->element('p', null,
_('The subscription has been authorized, but no '.
- 'callback URL was passed. Check with the site\'s instructions for '.
- 'details on how to authorize the subscription. Your subscription token is:'));
+ 'callback URL was passed. Check with the site\'s instructions for '.
+ 'details on how to authorize the subscription. Your subscription token is:'));
$this->element('blockquote', 'token', $tok);
common_show_footer();
}
- function show_reject_message($tok)
+ function showRejectMessage($tok)
{
common_show_header(_('Subscription rejected'));
$this->element('p', null,
_('The subscription has been rejected, but no '.
- 'callback URL was passed. Check with the site\'s instructions for '.
- 'details on how to fully reject the subscription.'));
+ 'callback URL was passed. Check with the site\'s instructions for '.
+ 'details on how to fully reject the subscription.'));
common_show_footer();
}
- function store_request($req)
+ function storeRequest($req)
{
common_ensure_session();
$_SESSION['userauthorizationrequest'] = $req;
}
- function clear_request()
+ function clearRequest()
{
common_ensure_session();
unset($_SESSION['userauthorizationrequest']);
}
- function get_stored_request()
+ function getStoredRequest()
{
common_ensure_session();
$req = $_SESSION['userauthorizationrequest'];
return $req;
}
- function get_new_request()
+ function getNewRequest()
{
common_remove_magic_from_request();
$req = OAuthRequest::from_request();
@@ -374,31 +382,22 @@ class UserauthorizationAction extends Action
# Throws an OAuthException if anything goes wrong
- function validate_request(&$req)
+ function validateRequest(&$req)
{
# OAuth stuff -- have to copy from OAuth.php since they're
# all private methods, and there's no user-authentication method
- common_debug('checking version', __FILE__);
- $this->check_version($req);
- common_debug('getting datastore', __FILE__);
+ $this->checkVersion($req);
$datastore = omb_oauth_datastore();
- common_debug('getting consumer', __FILE__);
- $consumer = $this->get_consumer($datastore, $req);
- common_debug('getting token', __FILE__);
- $token = $this->get_token($datastore, $req, $consumer);
- common_debug('checking timestamp', __FILE__);
- $this->check_timestamp($req);
- common_debug('checking nonce', __FILE__);
- $this->check_nonce($datastore, $req, $consumer, $token);
- common_debug('checking signature', __FILE__);
- $this->check_signature($req, $consumer, $token);
- common_debug('validating omb stuff', __FILE__);
- $this->validate_omb($req);
- common_debug('done validating', __FILE__);
+ $consumer = $this->getConsumer($datastore, $req);
+ $token = $this->getToken($datastore, $req, $consumer);
+ $this->checkTimestamp($req);
+ $this->checkNonce($datastore, $req, $consumer, $token);
+ $this->checkSignature($req, $consumer, $token);
+ $this->validateOmb($req);
return true;
}
- function validate_omb(&$req)
+ function validateOmb(&$req)
{
foreach (array('omb_version', 'omb_listener', 'omb_listenee',
'omb_listenee_profile', 'omb_listenee_nickname',
@@ -513,7 +512,7 @@ class UserauthorizationAction extends Action
# Snagged from OAuthServer
- function check_version(&$req)
+ function checkVersion(&$req)
{
$version = $req->get_parameter("oauth_version");
if (!$version) {
@@ -527,7 +526,7 @@ class UserauthorizationAction extends Action
# Snagged from OAuthServer
- function get_consumer($datastore, $req)
+ function getConsumer($datastore, $req)
{
$consumer_key = @$req->get_parameter("oauth_consumer_key");
if (!$consumer_key) {
@@ -543,7 +542,7 @@ class UserauthorizationAction extends Action
# Mostly cadged from OAuthServer
- function get_token($datastore, &$req, $consumer)
+ function getToken($datastore, &$req, $consumer)
{/*{{{*/
$token_field = @$req->get_parameter('oauth_token');
$token = $datastore->lookup_token($consumer, 'request', $token_field);
@@ -553,7 +552,7 @@ class UserauthorizationAction extends Action
return $token;
}
- function check_timestamp(&$req)
+ function checkTimestamp(&$req)
{
$timestamp = @$req->get_parameter('oauth_timestamp');
$now = time();
@@ -563,7 +562,7 @@ class UserauthorizationAction extends Action
}
# NOTE: don't call twice on the same request; will fail!
- function check_nonce(&$datastore, &$req, $consumer, $token)
+ function checkNonce(&$datastore, &$req, $consumer, $token)
{
$timestamp = @$req->get_parameter('oauth_timestamp');
$nonce = @$req->get_parameter('oauth_nonce');
@@ -574,9 +573,9 @@ class UserauthorizationAction extends Action
return true;
}
- function check_signature(&$req, $consumer, $token)
+ function checkSignature(&$req, $consumer, $token)
{
- $signature_method = $this->get_signature_method($req);
+ $signature_method = $this->getSignatureMethod($req);
$signature = $req->get_parameter('oauth_signature');
$valid_sig = $signature_method->check_signature($req,
$consumer,
@@ -587,7 +586,7 @@ class UserauthorizationAction extends Action
}
}
- function get_signature_method(&$req)
+ function getSignatureMethod(&$req)
{
$signature_method = @$req->get_parameter("oauth_signature_method");
if (!$signature_method) {
diff --git a/actions/xrds.php b/actions/xrds.php
index 629de3a86..075831803 100644
--- a/actions/xrds.php
+++ b/actions/xrds.php
@@ -49,17 +49,17 @@ class XrdsAction extends Action
{
/**
* Is read only?
- *
+ *
* @return boolean true
*/
function isReadOnly()
- {
+ {
return true;
}
/**
* Class handler.
- *
+ *
* @param array $args query arguments
*
* @return void
@@ -78,7 +78,7 @@ class XrdsAction extends Action
/**
* Show XRDS for a user.
- *
+ *
* @param class $user XRDS for this user.
*
* @return void
@@ -86,7 +86,7 @@ class XrdsAction extends Action
function showXrds($user)
{
header('Content-Type: application/xrds+xml');
- common_start_xml();
+ $this->startXML();
$this->elementStart('XRDS', array('xmlns' => 'xri://$xrds'));
$this->elementStart('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
@@ -133,12 +133,12 @@ class XrdsAction extends Action
'#omb');
$this->elementEnd('XRD');
$this->elementEnd('XRDS');
- common_end_xml();
+ $this->endXML();
}
/**
* Show service.
- *
+ *
* @param string $type XRDS type
* @param string $uri URI
* @param array $params type parameters, null by default
diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php
index 97e1ed736..5f71f716b 100644
--- a/classes/Memcached_DataObject.php
+++ b/classes/Memcached_DataObject.php
@@ -218,10 +218,7 @@ class Memcached_DataObject extends DB_DataObject
}
$inst = new $cls();
- $result = $inst->query($qry);
- if (!$result) {
- return $inst;
- }
+ $inst->query($qry);
$cached = array();
while ($inst->fetch()) {
$cached[] = clone($inst);
diff --git a/classes/User.php b/classes/User.php
index 5dadd6b44..5f4fb9b6f 100644
--- a/classes/User.php
+++ b/classes/User.php
@@ -575,4 +575,58 @@ class User extends Memcached_DataObject
return $profile;
}
+
+ function getTaggedSubscribers($tag, $offset=0, $limit=null)
+ {
+ $qry =
+ 'SELECT profile.* ' .
+ 'FROM profile JOIN subscription ' .
+ 'ON profile.id = subscription.subscriber ' .
+ 'JOIN profile_tag ON (profile_tag.tagged = subscription.subscriber ' .
+ 'AND profile_tag.tagger = subscription.subscribed) ' .
+ 'WHERE subscription.subscribed = %d ' .
+ 'AND profile_tag.tag = "%s" ' .
+ 'AND subscription.subscribed != subscription.subscriber ' .
+ 'ORDER BY subscription.created DESC ';
+
+ if ($offset) {
+ if (common_config('db','type') == 'pgsql') {
+ $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+ } else {
+ $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ }
+ }
+
+ $profile = new Profile();
+
+ $cnt = $profile->query(sprintf($qry, $this->id, $tag));
+
+ return $profile;
+ }
+
+ function getTaggedSubscriptions($tag, $offset=0, $limit=null)
+ {
+ $qry =
+ 'SELECT profile.* ' .
+ 'FROM profile JOIN subscription ' .
+ 'ON profile.id = subscription.subscribed ' .
+ 'JOIN profile_tag on (profile_tag.tagged = subscription.subscribed ' .
+ 'AND profile_tag.tagger = subscription.subscriber) ' .
+ 'WHERE subscription.subscriber = %d ' .
+ 'AND profile_tag.tag = "%s" ' .
+ 'AND subscription.subscribed != subscription.subscriber ' .
+ 'ORDER BY subscription.created DESC ';
+
+ if (common_config('db','type') == 'pgsql') {
+ $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+ } else {
+ $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ }
+
+ $profile = new Profile();
+
+ $profile->query(sprintf($qry, $this->id, $tag));
+
+ return $profile;
+ }
}
diff --git a/js/util.js b/js/util.js
index 579b4952a..de486cf74 100644
--- a/js/util.js
+++ b/js/util.js
@@ -184,7 +184,7 @@ $(document).ready(function(){
$("#form_notice").ajaxForm(PostNotice);
$("#form_notice").each(addAjaxHidden);
- $(".notice").hover(
+ $("#content .notice").hover(
function () {
$(this).addClass('hover');
},
diff --git a/lib/featureduserssection.php b/lib/featureduserssection.php
new file mode 100644
index 000000000..2935d8363
--- /dev/null
+++ b/lib/featureduserssection.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Section for featured users
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Widget
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @copyright 2009 Control Yourself, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+ exit(1);
+}
+
+/**
+ * Section for featured users
+ *
+ * @category Widget
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ */
+
+class FeaturedUsersSection extends ProfileSection
+{
+ function getProfiles()
+ {
+ $featured_nicks = common_config('nickname', 'featured');
+
+ if (!$featured_nicks) {
+ return null;
+ }
+
+ $quoted = array();
+
+ foreach ($featured_nicks as $nick) {
+ $quoted[] = "'$nick'";
+ }
+
+ $qry = 'SELECT profile.* ' .
+ 'FROM profile JOIN user on profile.id = user.id ' .
+ 'WHERE user.nickname in (' . implode(',', $quoted) . ') ' .
+ 'ORDER BY profile.created DESC ';
+
+ $limit = PROFILES_PER_SECTION + 1;
+ $offset = 0;
+
+ if (common_config('db','type') == 'pgsql') {
+ $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+ } else {
+ $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ }
+
+ $profile = Memcached_DataObject::cachedQuery('Profile',
+ $qry,
+ 6 * 3600);
+ return $profile;
+ }
+
+ function title()
+ {
+ return _('Featured users');
+ }
+
+ function divId()
+ {
+ return 'featured_users';
+ }
+}
diff --git a/lib/galleryaction.php b/lib/galleryaction.php
index a277762a6..25a5e3fd5 100644
--- a/lib/galleryaction.php
+++ b/lib/galleryaction.php
@@ -32,6 +32,7 @@ class GalleryAction extends Action
var $profile = null;
var $user = null;
var $page = null;
+ var $tag = null;
function prepare($args)
{
@@ -69,6 +70,8 @@ class GalleryAction extends Action
$this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+ $this->tag = $this->trimmed('tag');
+
return true;
}
@@ -84,7 +87,7 @@ class GalleryAction extends Action
# Post from the tag dropdown; redirect to a GET
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
- common_redirect($this->self_url(), 307);
+ common_redirect($this->selfUrl(), 307);
return;
}
@@ -124,7 +127,7 @@ class GalleryAction extends Action
array('href' =>
common_local_url($this->trimmed('action'),
array('nickname' =>
- $profile->nickname))),
+ $this->user->nickname))),
_('All'));
$this->elementEnd('li');
$this->elementStart('li', array('id'=>'filter_tags_item'));
diff --git a/lib/groupsection.php b/lib/groupsection.php
index bf26ab48c..c19299493 100644
--- a/lib/groupsection.php
+++ b/lib/groupsection.php
@@ -58,13 +58,13 @@ class GroupSection extends Section
$cnt = 0;
- $this->out->elementStart('ul', 'entities group xoxo');
+ $this->out->elementStart('table');
while ($profiles->fetch() && ++$cnt <= GROUPS_PER_SECTION) {
$this->showGroup($profiles);
}
- $this->out->elementEnd('ul');
+ $this->out->elementEnd('table');
return ($cnt > GROUPS_PER_SECTION);
}
@@ -76,7 +76,9 @@ class GroupSection extends Section
function showGroup($group)
{
- $this->out->elementStart('li', 'vcard');
+ $this->out->elementStart('tr');
+ $this->out->elementStart('td');
+ $this->out->elementStart('span', 'vcard');
$this->out->elementStart('a', array('title' => ($group->fullname) ?
$group->fullname :
$group->nickname,
@@ -95,9 +97,11 @@ class GroupSection extends Section
$group->nickname));
$this->out->element('span', 'fn org nickname', $group->nickname);
$this->out->elementEnd('a');
+ $this->out->elementEnd('span');
+ $this->out->elementEnd('td');
if ($group->value) {
- $this->out->element('span', 'value', $group->value);
+ $this->out->element('td', 'value', $group->value);
}
- $this->out->elementEnd('li');
+ $this->out->elementEnd('tr');
}
}
diff --git a/lib/grouptagcloudsection.php b/lib/grouptagcloudsection.php
new file mode 100644
index 000000000..f05be85cb
--- /dev/null
+++ b/lib/grouptagcloudsection.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Personal tag cloud section
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Widget
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @copyright 2009 Control Yourself, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ */
+
+if (!defined('LACONICA')) {
+ exit(1);
+}
+
+/**
+ * Personal tag cloud section
+ *
+ * @category Widget
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ */
+
+class GroupTagCloudSection extends TagCloudSection
+{
+ var $group = null;
+
+ function __construct($out=null, $group=null)
+ {
+ parent::__construct($out);
+ $this->group = $group;
+ }
+
+ function title()
+ {
+ return sprintf(_('Tags in %s group\'s notices'), $this->group->nickname);
+ }
+
+ function getTags()
+ {
+ $qry = 'SELECT notice_tag.tag, '.
+ 'sum(exp(-(now() - notice_tag.created)/%s)) as weight ' .
+ 'FROM notice_tag JOIN notice ' .
+ 'ON notice_tag.notice_id = notice.id ' .
+ 'JOIN group_inbox on group_inbox.notice_id = notice.id ' .
+ 'WHERE group_inbox.group_id = %d ' .
+ 'GROUP BY notice_tag.tag ' .
+ 'ORDER BY weight DESC ';
+
+ $limit = TAGS_PER_SECTION;
+ $offset = 0;
+
+ if (common_config('db','type') == 'pgsql') {
+ $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+ } else {
+ $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+ }
+
+ $tag = Memcached_DataObject::cachedQuery('Notice_tag',
+ sprintf($qry,
+ common_config('tag', 'dropoff'),
+ $this->group->id),
+ 3600);
+ return $tag;
+ }
+
+}
diff --git a/lib/noticesection.php b/lib/noticesection.php
index 9d1079070..7dfa0472d 100644
--- a/lib/noticesection.php
+++ b/lib/noticesection.php
@@ -54,13 +54,13 @@ class NoticeSection extends Section
$cnt = 0;
- $this->out->elementStart('table', 'notices');
+ $this->out->elementStart('ul', 'notices');
while ($notices->fetch() && ++$cnt <= NOTICES_PER_SECTION) {
$this->showNotice($notices);
}
- $this->out->elementEnd('table');
+ $this->out->elementEnd('ul');
return ($cnt > NOTICES_PER_SECTION);
}
@@ -73,9 +73,15 @@ class NoticeSection extends Section
function showNotice($notice)
{
$profile = $notice->getProfile();
- $this->out->elementStart('tr');
- $this->out->elementStart('td');
+ $this->out->elementStart('li', 'hentry notice');
+ $this->out->elementStart('div', 'entry-title');
$avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
+ $this->out->elementStart('span', 'vcard author');
+ $this->out->elementStart('a', array('title' => ($profile->fullname) ?
+ $profile->fullname :
+ $profile->nickname,
+ 'href' => $profile->noticeurl,
+ 'class' => 'url'));
$this->out->element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_MINI_SIZE)),
'width' => AVATAR_MINI_SIZE,
'height' => AVATAR_MINI_SIZE,
@@ -83,25 +89,19 @@ class NoticeSection extends Section
'alt' => ($profile->fullname) ?
$profile->fullname :
$profile->nickname));
- $this->out->elementEnd('a');
- $this->out->elementEnd('td');
- $this->out->elementStart('td');
- $this->out->elementStart('a', array('title' => ($profile->fullname) ?
- $profile->fullname :
- $profile->nickname,
- 'href' => $profile->noticeurl,
- 'rel' => 'contact member',
- 'class' => 'url'));
$this->out->element('span', 'fn nickname', $profile->nickname);
- $this->out->elementEnd('td');
- $this->out->elementStart('td');
+ $this->out->elementEnd('a');
+ $this->out->elementEnd('span');
+
+ $this->out->elementStart('p', 'entry-content');
$this->out->raw($notice->rendered);
- $this->out->elementEnd('td');
+ $this->out->elementEnd('p');
if ($notice->value) {
- $this->out->elementStart('td');
+ $this->out->elementStart('p');
$this->out->text($notice->value);
- $this->out->elementEnd('td');
+ $this->out->elementEnd('p');
}
- $this->out->elementEnd('tr');
+ $this->out->elementEnd('div');
+ $this->out->elementEnd('li');
}
}
diff --git a/lib/profilelist.php b/lib/profilelist.php
index a510c518c..499d74f7b 100644
--- a/lib/profilelist.php
+++ b/lib/profilelist.php
@@ -169,9 +169,9 @@ class ProfileList extends Widget
$this->out->elementStart('ul', 'tags xoxo');
foreach ($tags as $tag) {
$this->out->elementStart('li');
- $this->element('span', 'mark_hash', '#');
+ $this->out->element('span', 'mark_hash', '#');
$this->out->element('a', array('rel' => 'tag',
- 'href' => common_local_url($this->action,
+ 'href' => common_local_url($this->action->trimmed('action'),
array('nickname' => $this->owner->nickname,
'tag' => $tag))),
$tag);
diff --git a/lib/profilesection.php b/lib/profilesection.php
index 91a3dfa34..3642ae164 100644
--- a/lib/profilesection.php
+++ b/lib/profilesection.php
@@ -76,7 +76,9 @@ class ProfileSection extends Section
function showProfile($profile)
{
- $this->out->elementStart('li', 'vcard');
+ $this->out->elementStart('tr');
+ $this->out->elementStart('td');
+ $this->out->elementStart('span', 'vcard');
$this->out->elementStart('a', array('title' => ($profile->fullname) ?
$profile->fullname :
$profile->nickname,
@@ -92,10 +94,13 @@ class ProfileSection extends Section
$profile->fullname :
$profile->nickname));
$this->out->element('span', 'fn nickname', $profile->nickname);
+ $this->out->elementEnd('span');
$this->out->elementEnd('a');
+ $this->out->elementEnd('td');
if ($profile->value) {
- $this->out->element('span', 'value', $profile->value);
+ $this->out->element('td', 'value', $profile->value);
}
- $this->out->elementEnd('li');
+
+ $this->out->elementEnd('tr');
}
}
diff --git a/lib/tagcloudsection.php b/lib/tagcloudsection.php
index 121dfc499..178dd88ca 100644
--- a/lib/tagcloudsection.php
+++ b/lib/tagcloudsection.php
@@ -53,6 +53,7 @@ class TagCloudSection extends Section
$tags = $this->getTags();
if (!$tags) {
+ $this->out->element('p', null, _('None'));
return false;
}
@@ -66,6 +67,11 @@ class TagCloudSection extends Section
$sum += $tags->weight;
}
+ if ($cnt == 0) {
+ $this->out->element('p', null, _('(None)'));
+ return false;
+ }
+
ksort($tw);
$this->out->elementStart('ul', 'tags xoxo tag-cloud');
@@ -110,4 +116,9 @@ class TagCloudSection extends Section
{
return common_local_url('tag', array('tag' => $tag));
}
+
+ function divId()
+ {
+ return 'tagcloud';
+ }
}
diff --git a/lib/topposterssection.php b/lib/topposterssection.php
index 4701ca83f..4bd59ac79 100644
--- a/lib/topposterssection.php
+++ b/lib/topposterssection.php
@@ -69,36 +69,6 @@ class TopPostersSection extends ProfileSection
return $profile;
}
- function showProfile($profile)
- {
- $this->out->elementStart('tr');
- $this->out->elementStart('td');
- $this->out->elementStart('span', 'vcard');
- $this->out->elementStart('a', array('title' => ($profile->fullname) ?
- $profile->fullname :
- $profile->nickname,
- 'href' => $profile->profileurl,
- '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)),
- 'width' => AVATAR_MINI_SIZE,
- 'height' => AVATAR_MINI_SIZE,
- 'class' => 'avatar photo',
- 'alt' => ($profile->fullname) ?
- $profile->fullname :
- $profile->nickname));
- $this->out->element('span', 'fn nickname', $profile->nickname);
- $this->out->elementEnd('span');
- $this->out->elementEnd('a');
- $this->out->elementEnd('td');
- if ($profile->value) {
- $this->out->element('td', 'value', $profile->value);
- }
-
- $this->out->elementEnd('tr');
- }
-
function title()
{
return _('Top posters');
diff --git a/theme/base/css/display.css b/theme/base/css/display.css
index c55b3fd23..54a5b8833 100644
--- a/theme/base/css/display.css
+++ b/theme/base/css/display.css
@@ -393,7 +393,7 @@ border-radius:7px;
-webkit-border-radius:7px;
width:377px;
width:370px;
-height:86px;
+height:67px;
line-height:1.5;
padding:7px 7px 16px 7px;
}
@@ -418,7 +418,7 @@ margin-left:4px;
#form_notice .form_note {
position:absolute;
-top:118px;
+top:99px;
right:98px;
z-index:9;
}
@@ -709,14 +709,15 @@ margin-right:11px;
.notice,
.profile {
position:relative;
-padding-top:18px;
-padding-bottom:18px;
+padding-top:11px;
+padding-bottom:11px;
clear:both;
float:left;
width:644px;
width:96.699%;
width:100%;
-border-top:1px dashed #D1D9E4;
+border-top-width:1px;
+border-top-style:dashed;
/*-moz-border-radius:7px;*/
}
.notices li {
@@ -799,7 +800,7 @@ display:inline;
#laconicat .notice p.entry-content {
/*margin-left:199px;*/
}
-.notice p.entry-content a:visited {
+#content .notice p.entry-content a:visited {
border-radius:4px;
-moz-border-radius:4px;
-webkit-border-radius:4px;
@@ -811,35 +812,27 @@ border-radius:4px;
}
.notice div.entry-content {
-/*border:1px solid blue;*/
clear:left;
float:left;
-/*width:48%;*/
font-size:0.95em;
+margin-left:59px;
+width:70%;
}
-.notice div.entry-content a,
-.notice .notice-options a,
-.notice .notice-options input {
-
+#showstream .notice div.entry-content {
+margin-left:0;
}
+
.notice .notice-options a,
.notice .notice-options input {
float:left;
font-size:1.025em;
}
-#laconicat .notice div.entry-content {
-/*margin-left:0;*/
-}
-
.notice div.entry-content dl,
.notice div.entry-content dt,
.notice div.entry-content dd {
display:inline;
}
-.notice div.entry-content .timestamp {
-margin-left:59px;
-}
.notice div.entry-content .timestamp dt,
.notice div.entry-content .response dt {
@@ -851,14 +844,6 @@ display:inline-block;
.notice div.entry-content .device dt {
text-transform:lowercase;
}
-.notice div.entry-content a {
-
-}
-.notice div.entry-content a:hover {
-}
-
-
-
@@ -1061,7 +1046,6 @@ background-color:#fff;
text-align:left;
text-transform:uppercase;
}
-
#top_posters thead {
display:none;
}
@@ -1071,15 +1055,31 @@ width:199px;
#top_poster_number-of-notices {
width:123px;
}
-#top_posters tbody td {
+
+.section tbody td {
padding-right:11px;
-padding-bottom:4px;
+padding-bottom:11px;
}
-#top_posters img {
+.section .vcard .photo {
margin-right:7px;
margin-bottom:0;
}
+.section .notice {
+padding-top:11px;
+padding-bottom:11px;
+
+}
+
+.section .notice:first-child {
+padding-top:0;
+border-top:0;
+}
+
+
+
+
+
/* tagcloud */
.tag-cloud {
list-style-type:none;
diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css
index c16dc9fd7..dd623b217 100644
--- a/theme/identica/css/display.css
+++ b/theme/identica/css/display.css
@@ -49,7 +49,17 @@ div.notice-options input,
color:#002E6E;
}
-.notice p.entry-content a:visited {
+.notice,
+.profile {
+border-top-color:#D1D9E4;
+}
+.section .notice,
+.section .profile {
+border-top-color:#97BFD1;
+}
+
+
+#content .notice p.entry-content a:visited {
background-color:#fcfcfc;
}
.notice p.entry-content .vcard a {
@@ -216,7 +226,7 @@ background:transparent url(../images/icons/twotone/green/trash.gif) no-repeat 0
.notices div.entry-content,
.notices div.notice-options {
-opacity:0.3;
+opacity:0.4;
}
.notices li.hover div.entry-content,
.notices li.hover div.notice-options {