Merge branch 'master' of git.gnu.io:gnu/gnu-social
This commit is contained in:
		| @@ -41,13 +41,9 @@ class AllAction extends ProfileAction | |||||||
| { | { | ||||||
|     var $notice; |     var $notice; | ||||||
|  |  | ||||||
|     protected function prepare(array $args=array()) |     protected function profileActionPreparation() | ||||||
|     { |     { | ||||||
|         parent::prepare($args); |         if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) { | ||||||
|  |  | ||||||
|         $user = common_current_user(); |  | ||||||
|  |  | ||||||
|         if (!empty($user) && $user->streamModeOnly()) { |  | ||||||
|             $stream = new InboxNoticeStream($this->target, $this->scoped); |             $stream = new InboxNoticeStream($this->target, $this->scoped); | ||||||
|         } else { |         } else { | ||||||
|             $stream = new ThreadingInboxNoticeStream($this->target, $this->scoped); |             $stream = new ThreadingInboxNoticeStream($this->target, $this->scoped); | ||||||
| @@ -60,8 +56,6 @@ class AllAction extends ProfileAction | |||||||
|             // TRANS: Client error when page not found (404). |             // TRANS: Client error when page not found (404). | ||||||
|             $this->clientError(_('No such page.'), 404); |             $this->clientError(_('No such page.'), 404); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function title() |     function title() | ||||||
|   | |||||||
| @@ -49,14 +49,12 @@ class ShowstreamAction extends ProfileAction | |||||||
| { | { | ||||||
|     var $notice; |     var $notice; | ||||||
|  |  | ||||||
|     protected function prepare(array $args=array()) |     protected function profileActionPreparation() | ||||||
|     { |     { | ||||||
|         parent::prepare($args); |  | ||||||
|  |  | ||||||
|         if (empty($this->tag)) { |         if (empty($this->tag)) { | ||||||
|             $stream = new ProfileNoticeStream($this->profile, $this->scoped); |             $stream = new ProfileNoticeStream($this->target, $this->scoped); | ||||||
|         } else { |         } else { | ||||||
|             $stream = new TaggedProfileNoticeStream($this->profile, $this->tag, $this->scoped); |             $stream = new TaggedProfileNoticeStream($this->target, $this->tag, $this->scoped); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); |         $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); | ||||||
| @@ -67,7 +65,7 @@ class ShowstreamAction extends ProfileAction | |||||||
|  |  | ||||||
|     function title() |     function title() | ||||||
|     { |     { | ||||||
|         $base = $this->profile->getFancyName(); |         $base = $this->target->getFancyName(); | ||||||
|         if (!empty($this->tag)) { |         if (!empty($this->tag)) { | ||||||
|             if ($this->page == 1) { |             if ($this->page == 1) { | ||||||
|                 // TRANS: Page title showing tagged notices in one user's timeline. |                 // TRANS: Page title showing tagged notices in one user's timeline. | ||||||
| @@ -98,7 +96,7 @@ class ShowstreamAction extends ProfileAction | |||||||
|  |  | ||||||
|     function showProfileBlock() |     function showProfileBlock() | ||||||
|     { |     { | ||||||
|         $block = new AccountProfileBlock($this, $this->profile); |         $block = new AccountProfileBlock($this, $this->target); | ||||||
|         $block->show(); |         $block->show(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -112,12 +110,12 @@ class ShowstreamAction extends ProfileAction | |||||||
|         if (!empty($this->tag)) { |         if (!empty($this->tag)) { | ||||||
|             return array(new Feed(Feed::RSS1, |             return array(new Feed(Feed::RSS1, | ||||||
|                                   common_local_url('userrss', |                                   common_local_url('userrss', | ||||||
|                                                    array('nickname' => $this->target->nickname, |                                                    array('nickname' => $this->target->getNickname(), | ||||||
|                                                          'tag' => $this->tag)), |                                                          'tag' => $this->tag)), | ||||||
|                                   // TRANS: Title for link to notice feed. |                                   // TRANS: Title for link to notice feed. | ||||||
|                                   // TRANS: %1$s is a user nickname, %2$s is a hashtag. |                                   // TRANS: %1$s is a user nickname, %2$s is a hashtag. | ||||||
|                                   sprintf(_('Notice feed for %1$s tagged %2$s (RSS 1.0)'), |                                   sprintf(_('Notice feed for %1$s tagged %2$s (RSS 1.0)'), | ||||||
|                                           $this->target->nickname, $this->tag))); |                                           $this->target->getNickname(), $this->tag))); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return array(new Feed(Feed::JSON, |         return array(new Feed(Feed::JSON, | ||||||
| @@ -128,14 +126,14 @@ class ShowstreamAction extends ProfileAction | |||||||
|                               // TRANS: Title for link to notice feed. |                               // TRANS: Title for link to notice feed. | ||||||
|                               // TRANS: %s is a user nickname. |                               // TRANS: %s is a user nickname. | ||||||
|                               sprintf(_('Notice feed for %s (Activity Streams JSON)'), |                               sprintf(_('Notice feed for %s (Activity Streams JSON)'), | ||||||
|                                       $this->target->nickname)), |                                       $this->target->getNickname())), | ||||||
|                      new Feed(Feed::RSS1, |                      new Feed(Feed::RSS1, | ||||||
|                               common_local_url('userrss', |                               common_local_url('userrss', | ||||||
|                                                array('nickname' => $this->target->nickname)), |                                                array('nickname' => $this->target->getNickname())), | ||||||
|                               // TRANS: Title for link to notice feed. |                               // TRANS: Title for link to notice feed. | ||||||
|                               // TRANS: %s is a user nickname. |                               // TRANS: %s is a user nickname. | ||||||
|                               sprintf(_('Notice feed for %s (RSS 1.0)'), |                               sprintf(_('Notice feed for %s (RSS 1.0)'), | ||||||
|                                       $this->target->nickname)), |                                       $this->target->getNickname())), | ||||||
|                      new Feed(Feed::RSS2, |                      new Feed(Feed::RSS2, | ||||||
|                               common_local_url('ApiTimelineUser', |                               common_local_url('ApiTimelineUser', | ||||||
|                                                array( |                                                array( | ||||||
| @@ -144,7 +142,7 @@ class ShowstreamAction extends ProfileAction | |||||||
|                               // TRANS: Title for link to notice feed. |                               // TRANS: Title for link to notice feed. | ||||||
|                               // TRANS: %s is a user nickname. |                               // TRANS: %s is a user nickname. | ||||||
|                               sprintf(_('Notice feed for %s (RSS 2.0)'), |                               sprintf(_('Notice feed for %s (RSS 2.0)'), | ||||||
|                                       $this->target->nickname)), |                                       $this->target->getNickname())), | ||||||
|                      new Feed(Feed::ATOM, |                      new Feed(Feed::ATOM, | ||||||
|                               common_local_url('ApiTimelineUser', |                               common_local_url('ApiTimelineUser', | ||||||
|                                                array( |                                                array( | ||||||
| @@ -153,24 +151,24 @@ class ShowstreamAction extends ProfileAction | |||||||
|                               // TRANS: Title for link to notice feed. |                               // TRANS: Title for link to notice feed. | ||||||
|                               // TRANS: %s is a user nickname. |                               // TRANS: %s is a user nickname. | ||||||
|                               sprintf(_('Notice feed for %s (Atom)'), |                               sprintf(_('Notice feed for %s (Atom)'), | ||||||
|                                       $this->target->nickname)), |                                       $this->target->getNickname())), | ||||||
|                      new Feed(Feed::FOAF, |                      new Feed(Feed::FOAF, | ||||||
|                               common_local_url('foaf', array('nickname' => |                               common_local_url('foaf', array('nickname' => | ||||||
|                                                              $this->target->nickname)), |                                                              $this->target->getNickname())), | ||||||
|                               // TRANS: Title for link to notice feed. FOAF stands for Friend of a Friend. |                               // TRANS: Title for link to notice feed. FOAF stands for Friend of a Friend. | ||||||
|                               // TRANS: More information at http://www.foaf-project.org. %s is a user nickname. |                               // TRANS: More information at http://www.foaf-project.org. %s is a user nickname. | ||||||
|                               sprintf(_('FOAF for %s'), $this->target->nickname))); |                               sprintf(_('FOAF for %s'), $this->target->getNickname()))); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function extraHead() |     function extraHead() | ||||||
|     { |     { | ||||||
|         if ($this->profile->bio) { |         if ($this->target->bio) { | ||||||
|             $this->element('meta', array('name' => 'description', |             $this->element('meta', array('name' => 'description', | ||||||
|                                          'content' => $this->profile->bio)); |                                          'content' => $this->target->getDescription())); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if ($this->user->emailmicroid && $this->user->email && $this->profile->profileurl) { |         if ($this->target->isLocal() && $this->target->getUser()->emailmicroid && $this->target->getUser()->email && $this->target->getUrl()) { | ||||||
|             $id = new Microid('mailto:'.$this->user->email, |             $id = new Microid('mailto:'.$this->target->getUser()->email, | ||||||
|                               $this->selfUrl()); |                               $this->selfUrl()); | ||||||
|             $this->element('meta', array('name' => 'microid', |             $this->element('meta', array('name' => 'microid', | ||||||
|                                          'content' => $id->toString())); |                                          'content' => $id->toString())); | ||||||
| @@ -180,10 +178,10 @@ class ShowstreamAction extends ProfileAction | |||||||
|  |  | ||||||
|         $this->element('link', array('rel' => 'microsummary', |         $this->element('link', array('rel' => 'microsummary', | ||||||
|                                      'href' => common_local_url('microsummary', |                                      'href' => common_local_url('microsummary', | ||||||
|                                                                 array('nickname' => $this->profile->nickname)))); |                                                                 array('nickname' => $this->target->getNickname())))); | ||||||
|  |  | ||||||
|         $rsd = common_local_url('rsd', |         $rsd = common_local_url('rsd', | ||||||
|                                 array('nickname' => $this->profile->nickname)); |                                 array('nickname' => $this->target->getNickname())); | ||||||
|  |  | ||||||
|         // RSD, http://tales.phrasewise.com/rfc/rsd |         // RSD, http://tales.phrasewise.com/rfc/rsd | ||||||
|         $this->element('link', array('rel' => 'EditURI', |         $this->element('link', array('rel' => 'EditURI', | ||||||
| @@ -192,7 +190,7 @@ class ShowstreamAction extends ProfileAction | |||||||
|  |  | ||||||
|         if ($this->page != 1) { |         if ($this->page != 1) { | ||||||
|             $this->element('link', array('rel' => 'canonical', |             $this->element('link', array('rel' => 'canonical', | ||||||
|                                          'href' => $this->profile->profileurl)); |                                          'href' => $this->target->getUrl())); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -273,10 +271,9 @@ class ShowstreamAction extends ProfileAction | |||||||
|     function noticeFormOptions() |     function noticeFormOptions() | ||||||
|     { |     { | ||||||
|         $options = parent::noticeFormOptions(); |         $options = parent::noticeFormOptions(); | ||||||
|         $cur = common_current_user(); |  | ||||||
|  |  | ||||||
|         if (empty($cur) || $cur->id != $this->profile->id) { |         if (!$this->scoped instanceof Profile || $this->scoped->id != $this->target->id) { | ||||||
|             $options['to_profile'] =  $this->profile; |             $options['to_profile'] =  $this->target; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return $options; |         return $options; | ||||||
|   | |||||||
| @@ -19,8 +19,6 @@ | |||||||
|  |  | ||||||
| if (!defined('GNUSOCIAL')) { exit(1); } | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|  |  | ||||||
| require_once INSTALLDIR . '/lib/peopletags.php'; |  | ||||||
|  |  | ||||||
| class TagprofileAction extends FormAction | class TagprofileAction extends FormAction | ||||||
| { | { | ||||||
|     var $error = null; |     var $error = null; | ||||||
|   | |||||||
| @@ -108,7 +108,13 @@ class Conversation extends Managed_DataObject | |||||||
|  |  | ||||||
|     static public function getUrlFromNotice(Notice $notice, $anchor=true) |     static public function getUrlFromNotice(Notice $notice, $anchor=true) | ||||||
|     { |     { | ||||||
|         $conv = self::getKV('id', $notice->conversation); |         $conv = new Conversation(); | ||||||
|  |         $conv->id = $notice->conversation; | ||||||
|  |         $conv->find(true); | ||||||
|  |         if (!$conv instanceof Conversation) { | ||||||
|  |             common_debug('Conversation does not exist for notice ID: '.$notice->id); | ||||||
|  |             throw new NoResultException($conv); | ||||||
|  |         } | ||||||
|         return $conv->getUrl($anchor ? $notice->id : null); |         return $conv->getUrl($anchor ? $notice->id : null); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -569,6 +569,14 @@ class File extends Managed_DataObject | |||||||
|                     $thumbs->delete(); |                     $thumbs->delete(); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             $f2p = new File_to_post(); | ||||||
|  |             $f2p->file_id = $this->id; | ||||||
|  |             if ($f2p->find()) { | ||||||
|  |                 while ($f2p->fetch()) { | ||||||
|  |                     $f2p->delete(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // And finally remove the entry from the database |         // And finally remove the entry from the database | ||||||
|   | |||||||
| @@ -322,6 +322,7 @@ class File_redirection extends Managed_DataObject | |||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
|             case 'mailto': |             case 'mailto': | ||||||
|  |             case 'magnet': | ||||||
|             case 'aim': |             case 'aim': | ||||||
|             case 'jabber': |             case 'jabber': | ||||||
|             case 'xmpp': |             case 'xmpp': | ||||||
|   | |||||||
| @@ -52,6 +52,7 @@ class File_to_post extends Managed_DataObject | |||||||
|                 'file_to_post_post_id_fkey' => array('notice', array('post_id' => 'id')), |                 'file_to_post_post_id_fkey' => array('notice', array('post_id' => 'id')), | ||||||
|             ), |             ), | ||||||
|             'indexes' => array( |             'indexes' => array( | ||||||
|  |                 'file_id_idx' => array('file_id'), | ||||||
|                 'post_id_idx' => array('post_id'), |                 'post_id_idx' => array('post_id'), | ||||||
|             ), |             ), | ||||||
|         ); |         ); | ||||||
| @@ -87,7 +88,7 @@ class File_to_post extends Managed_DataObject | |||||||
|     function delete($useWhere=false) |     function delete($useWhere=false) | ||||||
|     { |     { | ||||||
|         $f = File::getKV('id', $this->file_id); |         $f = File::getKV('id', $this->file_id); | ||||||
|         if (!empty($f)) { |         if ($f instanceof File) { | ||||||
|             $f->blowCache(); |             $f->blowCache(); | ||||||
|         } |         } | ||||||
|         return parent::delete($useWhere); |         return parent::delete($useWhere); | ||||||
|   | |||||||
| @@ -40,16 +40,19 @@ class Local_group extends Managed_DataObject | |||||||
|  |  | ||||||
|     public function getProfile() |     public function getProfile() | ||||||
|     { |     { | ||||||
|         $group = $this->getGroup(); |         return $this->getGroup()->getProfile(); | ||||||
|         if (!$group instanceof User_group) { |  | ||||||
|             return null;    // TODO: Throw exception when other code is ready |  | ||||||
|         } |  | ||||||
|         return $group->getProfile(); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public function getGroup() |     public function getGroup() | ||||||
|     { |     { | ||||||
|         return User_group::getKV('id', $this->group_id); |         $group = new User_group(); | ||||||
|  |         $group->id = $this->group_id; | ||||||
|  |         $group->find(true); | ||||||
|  |         if (!$group instanceof User_group) { | ||||||
|  |             common_log(LOG_ERR, 'User_group does not exist for Local_group: '.$this->group_id); | ||||||
|  |             throw new NoResultException($group); | ||||||
|  |         } | ||||||
|  |         return $group; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function setNickname($nickname) |     function setNickname($nickname) | ||||||
|   | |||||||
| @@ -1380,6 +1380,11 @@ class Profile extends Managed_DataObject | |||||||
|         return $this->nickname; |         return $this->nickname; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public function getFullname() | ||||||
|  |     { | ||||||
|  |         return $this->fullname; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public function getDescription() |     public function getDescription() | ||||||
|     { |     { | ||||||
|         return $this->bio; |         return $this->bio; | ||||||
|   | |||||||
| @@ -45,9 +45,11 @@ | |||||||
| </IfModule> | </IfModule> | ||||||
|  |  | ||||||
| <FilesMatch "\.(ini)"> | <FilesMatch "\.(ini)"> | ||||||
|   # For mod_access_compat in Apache <2.4 |     <IfVersion < 2.3> | ||||||
|   #Order allow,deny |         Order allow,deny | ||||||
|  |         Deny from all | ||||||
|   # Use this instead for Apache >2.4 (mod_authz_host) |     </IfVersion> | ||||||
|   # Require all denied |     <IfVersion >= 2.3> | ||||||
|  |         Require all denied | ||||||
|  |     </IfVersion> | ||||||
| </FilesMatch> | </FilesMatch> | ||||||
|   | |||||||
| @@ -28,13 +28,7 @@ | |||||||
|  * @link      http://status.net/ |  * @link      http://status.net/ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| if (!defined('STATUSNET')) { | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|     // This check helps protect against security problems; |  | ||||||
|     // your code file can't be executed directly from the web. |  | ||||||
|     exit(1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| require_once INSTALLDIR.'/lib/peopletags.php'; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Profile block to show for an account |  * Profile block to show for an account | ||||||
|   | |||||||
| @@ -932,7 +932,7 @@ class HelpCommand extends Command | |||||||
|         // Give plugins a chance to add or override... |         // Give plugins a chance to add or override... | ||||||
|         Event::handle('HelpCommandMessages', array($this, &$commands)); |         Event::handle('HelpCommandMessages', array($this, &$commands)); | ||||||
|  |  | ||||||
|         sort($commands); |         ksort($commands); | ||||||
|         foreach ($commands as $command => $help) { |         foreach ($commands as $command => $help) { | ||||||
|             $out[] = "$command - $help"; |             $out[] = "$command - $help"; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -337,7 +337,6 @@ $default = | |||||||
|               'path' => null, |               'path' => null, | ||||||
|               'sslpath' => null, |               'sslpath' => null, | ||||||
|               ), |               ), | ||||||
|         'pluginlist' => array(), |  | ||||||
|         'admin' => |         'admin' => | ||||||
|         array('panels' => array('site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'license', 'plugins')), |         array('panels' => array('site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'license', 'plugins')), | ||||||
|         'singleuser' => |         'singleuser' => | ||||||
|   | |||||||
| @@ -144,7 +144,7 @@ require_once INSTALLDIR.'/lib/action.php'; | |||||||
| require_once INSTALLDIR.'/lib/mail.php'; | require_once INSTALLDIR.'/lib/mail.php'; | ||||||
|  |  | ||||||
| //set PEAR error handling to use regular PHP exceptions | //set PEAR error handling to use regular PHP exceptions | ||||||
| function PEAR_ErrorToPEAR_Exception($err) | function PEAR_ErrorToPEAR_Exception(PEAR_Error $err) | ||||||
| { | { | ||||||
|     //DB_DataObject throws error when an empty set would be returned |     //DB_DataObject throws error when an empty set would be returned | ||||||
|     //That behavior is weird, and not how the rest of StatusNet works. |     //That behavior is weird, and not how the rest of StatusNet works. | ||||||
|   | |||||||
| @@ -28,11 +28,7 @@ | |||||||
|  * @link      http://status.net/ |  * @link      http://status.net/ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| if (!defined('STATUSNET') && !defined('LACONICA')) { | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|     exit(1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| require_once INSTALLDIR.'/lib/xmloutputter.php'; |  | ||||||
|  |  | ||||||
| // Can include XHTML options but these are too fragile in practice. | // Can include XHTML options but these are too fragile in practice. | ||||||
| define('PAGE_TYPE_PREFS', 'text/html'); | define('PAGE_TYPE_PREFS', 'text/html'); | ||||||
| @@ -58,6 +54,9 @@ define('PAGE_TYPE_PREFS', 'text/html'); | |||||||
|  |  | ||||||
| class HTMLOutputter extends XMLOutputter | class HTMLOutputter extends XMLOutputter | ||||||
| { | { | ||||||
|  |     protected $DTD = array('doctype' => 'html', | ||||||
|  |                            'spec'    => '-//W3C//DTD XHTML 1.0 Strict//EN', | ||||||
|  |                            'uri'     => 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); | ||||||
|     /** |     /** | ||||||
|      * Constructor |      * Constructor | ||||||
|      * |      * | ||||||
| @@ -120,9 +119,8 @@ class HTMLOutputter extends XMLOutputter | |||||||
|             // Required for XML documents |             // Required for XML documents | ||||||
|             $this->startXML(); |             $this->startXML(); | ||||||
|         } |         } | ||||||
|         $this->xw->writeDTD('html', |  | ||||||
|                             '-//W3C//DTD XHTML 1.0 Strict//EN', |         $this->writeDTD(); | ||||||
|                             'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'); |  | ||||||
|  |  | ||||||
|         $language = $this->getLanguage(); |         $language = $this->getLanguage(); | ||||||
|  |  | ||||||
| @@ -138,6 +136,18 @@ class HTMLOutputter extends XMLOutputter | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public function setDTD($doctype, $spec, $uri) | ||||||
|  |     { | ||||||
|  |         $this->DTD = array('doctype' => $doctype, 'spec' => $spec, 'uri' => $uri); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected function writeDTD() | ||||||
|  |     { | ||||||
|  |         $this->xw->writeDTD($this->DTD['doctype'], | ||||||
|  |                             $this->DTD['spec'], | ||||||
|  |                             $this->DTD['uri']); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     function getLanguage() |     function getLanguage() | ||||||
|     { |     { | ||||||
|         // FIXME: correct language for interface |         // FIXME: correct language for interface | ||||||
|   | |||||||
| @@ -35,7 +35,7 @@ class InlineAttachmentList extends AttachmentList | |||||||
| { | { | ||||||
|     function showListStart() |     function showListStart() | ||||||
|     { |     { | ||||||
|         $this->out->element('h3', null, _('Attachments')); |         $this->out->element('h3', 'attachments-title', _('Attachments')); | ||||||
|         parent::showListStart(); |         parent::showListStart(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -424,7 +424,11 @@ abstract class Installer | |||||||
|                 // database |                 // database | ||||||
|                 "\$config['db']['database'] = {$vals['db_database']};\n\n". |                 "\$config['db']['database'] = {$vals['db_database']};\n\n". | ||||||
|                 ($this->db['type'] == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n":''). |                 ($this->db['type'] == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n":''). | ||||||
|                 "\$config['db']['type'] = {$vals['db_type']};\n\n"; |                 "\$config['db']['type'] = {$vals['db_type']};\n\n". | ||||||
|  |  | ||||||
|  |                 "// Uncomment below for better performance. Just remember you must run\n". | ||||||
|  |                 "// php scripts/checkschema.php whenever your enabled plugins change!\n". | ||||||
|  |                 "//\$config['db']['schemacheck'] = 'script';\n\n"; | ||||||
|  |  | ||||||
|         // Normalize line endings for Windows servers |         // Normalize line endings for Windows servers | ||||||
|         $cfg = str_replace("\n", PHP_EOL, $cfg); |         $cfg = str_replace("\n", PHP_EOL, $cfg); | ||||||
|   | |||||||
| @@ -25,11 +25,7 @@ | |||||||
|  * @link      http://status.net/ |  * @link      http://status.net/ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| if (!defined('STATUSNET') && !defined('LACONICA')) { | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|     exit(1); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| require_once INSTALLDIR.'/lib/widget.php'; |  | ||||||
| 
 | 
 | ||||||
| /* | /* | ||||||
|  * Show a bunch of peopletags |  * Show a bunch of peopletags | ||||||
| @@ -178,18 +174,3 @@ class PeopletagsWidget extends Widget | |||||||
|         return !empty($this->user) && $this->tagger->id == $this->user->id; |         return !empty($this->user) && $this->tagger->id == $this->user->id; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| class SelftagsWidget extends PeopletagsWidget |  | ||||||
| { |  | ||||||
|     function url($tag) |  | ||||||
|     { |  | ||||||
|         // link to self tag page
 |  | ||||||
|         return common_local_url('selftag', array('tag' => $tag)); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function label() |  | ||||||
|     { |  | ||||||
|         // TRANS: Label in self tags widget.
 |  | ||||||
|         return _m('LABEL','Tags'); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -28,12 +28,7 @@ | |||||||
|  * @link      http://status.net/ |  * @link      http://status.net/ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| if (!defined('STATUSNET') && !defined('LACONICA')) { | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|     exit(1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| require_once INSTALLDIR.'/lib/profileminilist.php'; |  | ||||||
| require_once INSTALLDIR.'/lib/groupminilist.php'; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Profile action common superclass |  * Profile action common superclass | ||||||
| @@ -46,17 +41,15 @@ require_once INSTALLDIR.'/lib/groupminilist.php'; | |||||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||||
|  * @link     http://status.net/ |  * @link     http://status.net/ | ||||||
|  */ |  */ | ||||||
| class ProfileAction extends ManagedAction | abstract class ProfileAction extends ManagedAction | ||||||
| { | { | ||||||
|     var $page    = null; |     var $page    = null; | ||||||
|     var $tag     = null; |     var $tag     = null; | ||||||
|  |  | ||||||
|     protected $target  = null;    // Profile that we're showing |     protected $target  = null;    // Profile that we're showing | ||||||
|  |  | ||||||
|     protected function prepare(array $args=array()) |     protected function doPreparation() | ||||||
|     { |     { | ||||||
|         parent::prepare($args); |  | ||||||
|  |  | ||||||
|         try { |         try { | ||||||
|             $nickname_arg = $this->arg('nickname'); |             $nickname_arg = $this->arg('nickname'); | ||||||
|             $nickname     = common_canonical_nickname($nickname_arg); |             $nickname     = common_canonical_nickname($nickname_arg); | ||||||
| @@ -73,6 +66,10 @@ class ProfileAction extends ManagedAction | |||||||
|             $this->user = User::getKV('nickname', $nickname); |             $this->user = User::getKV('nickname', $nickname); | ||||||
|  |  | ||||||
|             if (!$this->user) { |             if (!$this->user) { | ||||||
|  |                 $group = Local_group::getKV('nickname', $nickname); | ||||||
|  |                 if ($group instanceof Local_group) { | ||||||
|  |                     common_redirect($group->getProfile()->getUrl()); | ||||||
|  |                 } | ||||||
|                 // TRANS: Client error displayed when calling a profile action without specifying a user. |                 // TRANS: Client error displayed when calling a profile action without specifying a user. | ||||||
|                 $this->clientError(_('No such user.'), 404); |                 $this->clientError(_('No such user.'), 404); | ||||||
|             } |             } | ||||||
| @@ -106,7 +103,13 @@ class ProfileAction extends ManagedAction | |||||||
|         $this->tag = $this->trimmed('tag'); |         $this->tag = $this->trimmed('tag'); | ||||||
|         $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; |         $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; | ||||||
|         common_set_returnto($this->selfUrl()); |         common_set_returnto($this->selfUrl()); | ||||||
|         return true; |  | ||||||
|  |         return $this->profileActionPreparation(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected function profileActionPreparation() | ||||||
|  |     { | ||||||
|  |         // No-op by default. | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function isReadOnly($args) |     function isReadOnly($args) | ||||||
|   | |||||||
| @@ -27,11 +27,7 @@ | |||||||
|  * @link      http://status.net/ |  * @link      http://status.net/ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| if (!defined('STATUSNET') && !defined('LACONICA')) { | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|     exit(1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| require_once INSTALLDIR.'/lib/peopletags.php'; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Widget to show a list of profiles |  * Widget to show a list of profiles | ||||||
| @@ -107,215 +103,3 @@ class ProfileList extends Widget | |||||||
|         return PROFILES_PER_PAGE; |         return PROFILES_PER_PAGE; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| class ProfileListItem extends Widget |  | ||||||
| { |  | ||||||
|     /** Current profile. */ |  | ||||||
|     var $profile = null; |  | ||||||
|     /** Action object using us. */ |  | ||||||
|     var $action = null; |  | ||||||
|  |  | ||||||
|     function __construct($profile, $action) |  | ||||||
|     { |  | ||||||
|         parent::__construct($action); |  | ||||||
|  |  | ||||||
|         $this->profile = $profile; |  | ||||||
|         $this->action  = $action; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function show() |  | ||||||
|     { |  | ||||||
|         if (Event::handle('StartProfileListItem', array($this))) { |  | ||||||
|             $this->startItem(); |  | ||||||
|             if (Event::handle('StartProfileListItemProfile', array($this))) { |  | ||||||
|                 $this->showProfile(); |  | ||||||
|                 Event::handle('EndProfileListItemProfile', array($this)); |  | ||||||
|             } |  | ||||||
|             if (Event::handle('StartProfileListItemActions', array($this))) { |  | ||||||
|                 $this->showActions(); |  | ||||||
|                 Event::handle('EndProfileListItemActions', array($this)); |  | ||||||
|             } |  | ||||||
|             $this->endItem(); |  | ||||||
|             Event::handle('EndProfileListItem', array($this)); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function startItem() |  | ||||||
|     { |  | ||||||
|         $this->out->elementStart('li', array('class' => 'profile', |  | ||||||
|                                              'id' => 'profile-' . $this->profile->id)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function showProfile() |  | ||||||
|     { |  | ||||||
|         $this->startProfile(); |  | ||||||
|         if (Event::handle('StartProfileListItemProfileElements', array($this))) { |  | ||||||
|             if (Event::handle('StartProfileListItemAvatar', array($this))) { |  | ||||||
|                 $aAttrs = $this->linkAttributes(); |  | ||||||
|                 $this->out->elementStart('a', $aAttrs); |  | ||||||
|                 $this->showAvatar($this->profile); |  | ||||||
|                 $this->out->elementEnd('a'); |  | ||||||
|                 Event::handle('EndProfileListItemAvatar', array($this)); |  | ||||||
|             } |  | ||||||
|             if (Event::handle('StartProfileListItemNickname', array($this))) { |  | ||||||
|                 $this->showNickname(); |  | ||||||
|                 Event::handle('EndProfileListItemNickname', array($this)); |  | ||||||
|             } |  | ||||||
|             if (Event::handle('StartProfileListItemFullName', array($this))) { |  | ||||||
|                 $this->showFullName(); |  | ||||||
|                 Event::handle('EndProfileListItemFullName', array($this)); |  | ||||||
|             } |  | ||||||
|             if (Event::handle('StartProfileListItemLocation', array($this))) { |  | ||||||
|                 $this->showLocation(); |  | ||||||
|                 Event::handle('EndProfileListItemLocation', array($this)); |  | ||||||
|             } |  | ||||||
|             if (Event::handle('StartProfileListItemHomepage', array($this))) { |  | ||||||
|                 $this->showHomepage(); |  | ||||||
|                 Event::handle('EndProfileListItemHomepage', array($this)); |  | ||||||
|             } |  | ||||||
|             if (Event::handle('StartProfileListItemBio', array($this))) { |  | ||||||
|                 $this->showBio(); |  | ||||||
|                 Event::handle('EndProfileListItemBio', array($this)); |  | ||||||
|             } |  | ||||||
|             if (Event::handle('StartProfileListItemTags', array($this))) { |  | ||||||
|                 $this->showTags(); |  | ||||||
|                 Event::handle('EndProfileListItemTags', array($this)); |  | ||||||
|             } |  | ||||||
|             Event::handle('EndProfileListItemProfileElements', array($this)); |  | ||||||
|         } |  | ||||||
|         $this->endProfile(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function startProfile() |  | ||||||
|     { |  | ||||||
|         $this->out->elementStart('div', 'entity_profile h-card'); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function showNickname() |  | ||||||
|     { |  | ||||||
|         $this->out->element('a', array('href'=>$this->profile->getUrl(), |  | ||||||
|                                        'class'=>'p-nickname'), |  | ||||||
|                             $this->profile->getNickname()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function showFullName() |  | ||||||
|     { |  | ||||||
|         if (!empty($this->profile->fullname)) { |  | ||||||
|             $this->out->element('span', 'p-name', $this->profile->fullname); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function showLocation() |  | ||||||
|     { |  | ||||||
|         if (!empty($this->profile->location)) { |  | ||||||
|             $this->out->element('span', 'label p-locality', $this->profile->location); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function showHomepage() |  | ||||||
|     { |  | ||||||
|         if (!empty($this->profile->homepage)) { |  | ||||||
|             $this->out->text(' '); |  | ||||||
|             $aAttrs = $this->homepageAttributes(); |  | ||||||
|             $this->out->elementStart('a', $aAttrs); |  | ||||||
|             $this->out->raw($this->highlight($this->profile->homepage)); |  | ||||||
|             $this->out->elementEnd('a'); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function showBio() |  | ||||||
|     { |  | ||||||
|         if (!empty($this->profile->bio)) { |  | ||||||
|             $this->out->elementStart('p', 'note'); |  | ||||||
|             $this->out->raw($this->highlight($this->profile->bio)); |  | ||||||
|             $this->out->elementEnd('p'); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function showTags() |  | ||||||
|     { |  | ||||||
|         $user = common_current_user(); |  | ||||||
|         if (!empty($user)) { |  | ||||||
|             if ($user->id == $this->profile->id) { |  | ||||||
|                 $tags = new SelftagsWidget($this->out, $user, $this->profile); |  | ||||||
|                 $tags->show(); |  | ||||||
|             } else if ($user->getProfile()->canTag($this->profile)) { |  | ||||||
|                 $tags = new PeopletagsWidget($this->out, $user, $this->profile); |  | ||||||
|                 $tags->show(); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function endProfile() |  | ||||||
|     { |  | ||||||
|         $this->out->elementEnd('div'); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function showActions() |  | ||||||
|     { |  | ||||||
|         $this->startActions(); |  | ||||||
|         if (Event::handle('StartProfileListItemActionElements', array($this))) { |  | ||||||
|             $this->showSubscribeButton(); |  | ||||||
|             Event::handle('EndProfileListItemActionElements', array($this)); |  | ||||||
|         } |  | ||||||
|         $this->endActions(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function startActions() |  | ||||||
|     { |  | ||||||
|         $this->out->elementStart('div', 'entity_actions'); |  | ||||||
|         $this->out->elementStart('ul'); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function showSubscribeButton() |  | ||||||
|     { |  | ||||||
|         // Is this a logged-in user, looking at someone else's |  | ||||||
|         // profile? |  | ||||||
|  |  | ||||||
|         $user = common_current_user(); |  | ||||||
|  |  | ||||||
|         if (!empty($user) && $this->profile->id != $user->id) { |  | ||||||
|             $this->out->elementStart('li', 'entity_subscribe'); |  | ||||||
|             if ($user->isSubscribed($this->profile)) { |  | ||||||
|                 $usf = new UnsubscribeForm($this->out, $this->profile); |  | ||||||
|                 $usf->show(); |  | ||||||
|             } else { |  | ||||||
|                 if (Event::handle('StartShowProfileListSubscribeButton', array($this))) { |  | ||||||
|                     $sf = new SubscribeForm($this->out, $this->profile); |  | ||||||
|                     $sf->show(); |  | ||||||
|                     Event::handle('EndShowProfileListSubscribeButton', array($this)); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             $this->out->elementEnd('li'); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function endActions() |  | ||||||
|     { |  | ||||||
|         $this->out->elementEnd('ul'); |  | ||||||
|         $this->out->elementEnd('div'); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function endItem() |  | ||||||
|     { |  | ||||||
|         $this->out->elementEnd('li'); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function highlight($text) |  | ||||||
|     { |  | ||||||
|         return htmlspecialchars($text); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function linkAttributes() |  | ||||||
|     { |  | ||||||
|         return array('href' => $this->profile->profileurl, |  | ||||||
|                      'class' => 'u-url', |  | ||||||
|                      'rel' => 'contact'); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function homepageAttributes() |  | ||||||
|     { |  | ||||||
|         return array('href' => $this->profile->homepage, |  | ||||||
|                      'class' => 'u-url'); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|   | |||||||
							
								
								
									
										242
									
								
								lib/profilelistitem.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								lib/profilelistitem.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,242 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * StatusNet, the distributed open-source microblogging tool | ||||||
|  |  * | ||||||
|  |  * Widget to show a list of profiles | ||||||
|  |  * | ||||||
|  |  * 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  Public | ||||||
|  |  * @package   StatusNet | ||||||
|  |  * @author    Evan Prodromou <evan@status.net> | ||||||
|  |  * @copyright 2008-2009 StatusNet, Inc. | ||||||
|  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||||
|  |  * @link      http://status.net/ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|  |  | ||||||
|  | class ProfileListItem extends Widget | ||||||
|  | { | ||||||
|  |     /** Current profile. */ | ||||||
|  |     var $profile = null; | ||||||
|  |     /** Action object using us. */ | ||||||
|  |     var $action = null; | ||||||
|  |  | ||||||
|  |     function __construct($profile, $action) | ||||||
|  |     { | ||||||
|  |         parent::__construct($action); | ||||||
|  |  | ||||||
|  |         $this->profile = $profile; | ||||||
|  |         $this->action  = $action; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function show() | ||||||
|  |     { | ||||||
|  |         if (Event::handle('StartProfileListItem', array($this))) { | ||||||
|  |             $this->startItem(); | ||||||
|  |             if (Event::handle('StartProfileListItemProfile', array($this))) { | ||||||
|  |                 $this->showProfile(); | ||||||
|  |                 Event::handle('EndProfileListItemProfile', array($this)); | ||||||
|  |             } | ||||||
|  |             if (Event::handle('StartProfileListItemActions', array($this))) { | ||||||
|  |                 $this->showActions(); | ||||||
|  |                 Event::handle('EndProfileListItemActions', array($this)); | ||||||
|  |             } | ||||||
|  |             $this->endItem(); | ||||||
|  |             Event::handle('EndProfileListItem', array($this)); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function startItem() | ||||||
|  |     { | ||||||
|  |         $this->out->elementStart('li', array('class' => 'profile', | ||||||
|  |                                              'id' => 'profile-' . $this->profile->id)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showProfile() | ||||||
|  |     { | ||||||
|  |         $this->startProfile(); | ||||||
|  |         if (Event::handle('StartProfileListItemProfileElements', array($this))) { | ||||||
|  |             if (Event::handle('StartProfileListItemAvatar', array($this))) { | ||||||
|  |                 $aAttrs = $this->linkAttributes(); | ||||||
|  |                 $this->out->elementStart('a', $aAttrs); | ||||||
|  |                 $this->showAvatar($this->profile); | ||||||
|  |                 $this->out->elementEnd('a'); | ||||||
|  |                 Event::handle('EndProfileListItemAvatar', array($this)); | ||||||
|  |             } | ||||||
|  |             if (Event::handle('StartProfileListItemNickname', array($this))) { | ||||||
|  |                 $this->showNickname(); | ||||||
|  |                 Event::handle('EndProfileListItemNickname', array($this)); | ||||||
|  |             } | ||||||
|  |             if (Event::handle('StartProfileListItemFullName', array($this))) { | ||||||
|  |                 $this->showFullName(); | ||||||
|  |                 Event::handle('EndProfileListItemFullName', array($this)); | ||||||
|  |             } | ||||||
|  |             if (Event::handle('StartProfileListItemLocation', array($this))) { | ||||||
|  |                 $this->showLocation(); | ||||||
|  |                 Event::handle('EndProfileListItemLocation', array($this)); | ||||||
|  |             } | ||||||
|  |             if (Event::handle('StartProfileListItemHomepage', array($this))) { | ||||||
|  |                 $this->showHomepage(); | ||||||
|  |                 Event::handle('EndProfileListItemHomepage', array($this)); | ||||||
|  |             } | ||||||
|  |             if (Event::handle('StartProfileListItemBio', array($this))) { | ||||||
|  |                 $this->showBio(); | ||||||
|  |                 Event::handle('EndProfileListItemBio', array($this)); | ||||||
|  |             } | ||||||
|  |             if (Event::handle('StartProfileListItemTags', array($this))) { | ||||||
|  |                 $this->showTags(); | ||||||
|  |                 Event::handle('EndProfileListItemTags', array($this)); | ||||||
|  |             } | ||||||
|  |             Event::handle('EndProfileListItemProfileElements', array($this)); | ||||||
|  |         } | ||||||
|  |         $this->endProfile(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function startProfile() | ||||||
|  |     { | ||||||
|  |         $this->out->elementStart('div', 'entity_profile h-card'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showNickname() | ||||||
|  |     { | ||||||
|  |         $this->out->element('a', array('href'=>$this->profile->getUrl(), | ||||||
|  |                                        'class'=>'p-nickname'), | ||||||
|  |                             $this->profile->getNickname()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showFullName() | ||||||
|  |     { | ||||||
|  |         if (!empty($this->profile->fullname)) { | ||||||
|  |             $this->out->element('span', 'p-name', $this->profile->fullname); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showLocation() | ||||||
|  |     { | ||||||
|  |         if (!empty($this->profile->location)) { | ||||||
|  |             $this->out->element('span', 'label p-locality', $this->profile->location); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showHomepage() | ||||||
|  |     { | ||||||
|  |         if (!empty($this->profile->homepage)) { | ||||||
|  |             $this->out->text(' '); | ||||||
|  |             $aAttrs = $this->homepageAttributes(); | ||||||
|  |             $this->out->elementStart('a', $aAttrs); | ||||||
|  |             $this->out->raw($this->highlight($this->profile->homepage)); | ||||||
|  |             $this->out->elementEnd('a'); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showBio() | ||||||
|  |     { | ||||||
|  |         if (!empty($this->profile->bio)) { | ||||||
|  |             $this->out->elementStart('p', 'note'); | ||||||
|  |             $this->out->raw($this->highlight($this->profile->bio)); | ||||||
|  |             $this->out->elementEnd('p'); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showTags() | ||||||
|  |     { | ||||||
|  |         $user = common_current_user(); | ||||||
|  |         if (!empty($user)) { | ||||||
|  |             if ($user->id == $this->profile->id) { | ||||||
|  |                 $tags = new SelftagsWidget($this->out, $user, $this->profile); | ||||||
|  |                 $tags->show(); | ||||||
|  |             } else if ($user->getProfile()->canTag($this->profile)) { | ||||||
|  |                 $tags = new PeopletagsWidget($this->out, $user, $this->profile); | ||||||
|  |                 $tags->show(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function endProfile() | ||||||
|  |     { | ||||||
|  |         $this->out->elementEnd('div'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showActions() | ||||||
|  |     { | ||||||
|  |         $this->startActions(); | ||||||
|  |         if (Event::handle('StartProfileListItemActionElements', array($this))) { | ||||||
|  |             $this->showSubscribeButton(); | ||||||
|  |             Event::handle('EndProfileListItemActionElements', array($this)); | ||||||
|  |         } | ||||||
|  |         $this->endActions(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function startActions() | ||||||
|  |     { | ||||||
|  |         $this->out->elementStart('div', 'entity_actions'); | ||||||
|  |         $this->out->elementStart('ul'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function showSubscribeButton() | ||||||
|  |     { | ||||||
|  |         // Is this a logged-in user, looking at someone else's | ||||||
|  |         // profile? | ||||||
|  |  | ||||||
|  |         $user = common_current_user(); | ||||||
|  |  | ||||||
|  |         if (!empty($user) && $this->profile->id != $user->id) { | ||||||
|  |             $this->out->elementStart('li', 'entity_subscribe'); | ||||||
|  |             if ($user->isSubscribed($this->profile)) { | ||||||
|  |                 $usf = new UnsubscribeForm($this->out, $this->profile); | ||||||
|  |                 $usf->show(); | ||||||
|  |             } else { | ||||||
|  |                 if (Event::handle('StartShowProfileListSubscribeButton', array($this))) { | ||||||
|  |                     $sf = new SubscribeForm($this->out, $this->profile); | ||||||
|  |                     $sf->show(); | ||||||
|  |                     Event::handle('EndShowProfileListSubscribeButton', array($this)); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             $this->out->elementEnd('li'); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function endActions() | ||||||
|  |     { | ||||||
|  |         $this->out->elementEnd('ul'); | ||||||
|  |         $this->out->elementEnd('div'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function endItem() | ||||||
|  |     { | ||||||
|  |         $this->out->elementEnd('li'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function highlight($text) | ||||||
|  |     { | ||||||
|  |         return htmlspecialchars($text); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function linkAttributes() | ||||||
|  |     { | ||||||
|  |         return array('href' => $this->profile->profileurl, | ||||||
|  |                      'class' => 'u-url', | ||||||
|  |                      'rel' => 'contact'); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function homepageAttributes() | ||||||
|  |     { | ||||||
|  |         return array('href' => $this->profile->homepage, | ||||||
|  |                      'class' => 'u-url'); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -27,11 +27,7 @@ | |||||||
|  * @link      http://status.net/ |  * @link      http://status.net/ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| if (!defined('STATUSNET') && !defined('LACONICA')) { | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|     exit(1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| require_once INSTALLDIR.'/lib/profilelist.php'; |  | ||||||
|  |  | ||||||
| define('PROFILES_PER_MINILIST', 8); | define('PROFILES_PER_MINILIST', 8); | ||||||
|  |  | ||||||
| @@ -69,39 +65,3 @@ class ProfileMiniList extends ProfileList | |||||||
|         return AVATAR_MINI_SIZE; |         return AVATAR_MINI_SIZE; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| class ProfileMiniListItem extends ProfileListItem |  | ||||||
| { |  | ||||||
|     function show() |  | ||||||
|     { |  | ||||||
|         $this->out->elementStart('li', 'h-card'); |  | ||||||
|         if (Event::handle('StartProfileListItemProfileElements', array($this))) { |  | ||||||
|             if (Event::handle('StartProfileListItemAvatar', array($this))) { |  | ||||||
|                 $aAttrs = $this->linkAttributes(); |  | ||||||
|                 $this->out->elementStart('a', $aAttrs); |  | ||||||
|                 $avatarUrl = $this->profile->avatarUrl(AVATAR_MINI_SIZE); |  | ||||||
|                 $this->out->element('img', array('src' => $avatarUrl, |  | ||||||
|                                                  'width' => AVATAR_MINI_SIZE, |  | ||||||
|                                                  'height' => AVATAR_MINI_SIZE, |  | ||||||
|                                                  'class' => 'avatar u-photo', |  | ||||||
|                                                  'alt' =>  $this->profile->getBestName())); |  | ||||||
|                 $this->out->elementEnd('a'); |  | ||||||
|                 Event::handle('EndProfileListItemAvatar', array($this)); |  | ||||||
|             } |  | ||||||
|             $this->out->elementEnd('li'); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // default; overridden for nofollow lists |  | ||||||
|  |  | ||||||
|     function linkAttributes() |  | ||||||
|     { |  | ||||||
|         $aAttrs = parent::linkAttributes(); |  | ||||||
|  |  | ||||||
|         $aAttrs['title'] = $this->profile->getBestName(); |  | ||||||
|         $aAttrs['rel']   = 'contact member'; // @todo: member? always? |  | ||||||
|         $aAttrs['class'] = 'u-url p-name'; |  | ||||||
|  |  | ||||||
|         return $aAttrs; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|   | |||||||
							
								
								
									
										76
									
								
								lib/profileminilistitem.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								lib/profileminilistitem.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * StatusNet, the distributed open-source microblogging tool | ||||||
|  |  * | ||||||
|  |  * Widget to show a list of profiles | ||||||
|  |  * | ||||||
|  |  * 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  Public | ||||||
|  |  * @package   StatusNet | ||||||
|  |  * @author    Evan Prodromou <evan@status.net> | ||||||
|  |  * @copyright 2008-2009 StatusNet, Inc. | ||||||
|  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||||
|  |  * @link      http://status.net/ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Widget to show a list of profiles, good for sidebar | ||||||
|  |  * | ||||||
|  |  * @category Public | ||||||
|  |  * @package  StatusNet | ||||||
|  |  * @author   Evan Prodromou <evan@status.net> | ||||||
|  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||||
|  |  * @link     http://status.net/ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | class ProfileMiniListItem extends ProfileListItem | ||||||
|  | { | ||||||
|  |     function show() | ||||||
|  |     { | ||||||
|  |         $this->out->elementStart('li', 'h-card'); | ||||||
|  |         if (Event::handle('StartProfileListItemProfileElements', array($this))) { | ||||||
|  |             if (Event::handle('StartProfileListItemAvatar', array($this))) { | ||||||
|  |                 $aAttrs = $this->linkAttributes(); | ||||||
|  |                 $this->out->elementStart('a', $aAttrs); | ||||||
|  |                 $avatarUrl = $this->profile->avatarUrl(AVATAR_MINI_SIZE); | ||||||
|  |                 $this->out->element('img', array('src' => $avatarUrl, | ||||||
|  |                                                  'width' => AVATAR_MINI_SIZE, | ||||||
|  |                                                  'height' => AVATAR_MINI_SIZE, | ||||||
|  |                                                  'class' => 'avatar u-photo', | ||||||
|  |                                                  'alt' =>  $this->profile->getBestName())); | ||||||
|  |                 $this->out->elementEnd('a'); | ||||||
|  |                 Event::handle('EndProfileListItemAvatar', array($this)); | ||||||
|  |             } | ||||||
|  |             $this->out->elementEnd('li'); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // default; overridden for nofollow lists | ||||||
|  |  | ||||||
|  |     function linkAttributes() | ||||||
|  |     { | ||||||
|  |         $aAttrs = parent::linkAttributes(); | ||||||
|  |  | ||||||
|  |         $aAttrs['title'] = $this->profile->getBestName(); | ||||||
|  |         $aAttrs['rel']   = 'contact member'; // @todo: member? always? | ||||||
|  |         $aAttrs['class'] = 'u-url p-name'; | ||||||
|  |  | ||||||
|  |         return $aAttrs; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -350,7 +350,7 @@ class Schema | |||||||
|         $res = $this->conn->query("DROP TABLE $name"); |         $res = $this->conn->query("DROP TABLE $name"); | ||||||
|  |  | ||||||
|         if ($_PEAR->isError($res)) { |         if ($_PEAR->isError($res)) { | ||||||
|             throw new Exception($res->getMessage()); |             PEAR_ErrorToPEAR_Exception($res); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
| @@ -389,7 +389,7 @@ class Schema | |||||||
|                                    implode(",", $columnNames).")"); |                                    implode(",", $columnNames).")"); | ||||||
|  |  | ||||||
|         if ($_PEAR->isError($res)) { |         if ($_PEAR->isError($res)) { | ||||||
|             throw new Exception($res->getMessage()); |             PEAR_ErrorToPEAR_Exception($res); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
| @@ -411,7 +411,7 @@ class Schema | |||||||
|         $res = $this->conn->query("ALTER TABLE $table DROP INDEX $name"); |         $res = $this->conn->query("ALTER TABLE $table DROP INDEX $name"); | ||||||
|  |  | ||||||
|         if ($_PEAR->isError($res)) { |         if ($_PEAR->isError($res)) { | ||||||
|             throw new Exception($res->getMessage()); |             PEAR_ErrorToPEAR_Exception($res); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
| @@ -436,7 +436,7 @@ class Schema | |||||||
|         $res = $this->conn->query($sql); |         $res = $this->conn->query($sql); | ||||||
|  |  | ||||||
|         if ($_PEAR->isError($res)) { |         if ($_PEAR->isError($res)) { | ||||||
|             throw new Exception($res->getMessage()); |             PEAR_ErrorToPEAR_Exception($res); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
| @@ -463,7 +463,7 @@ class Schema | |||||||
|         $res = $this->conn->query($sql); |         $res = $this->conn->query($sql); | ||||||
|  |  | ||||||
|         if ($_PEAR->isError($res)) { |         if ($_PEAR->isError($res)) { | ||||||
|             throw new Exception($res->getMessage()); |             PEAR_ErrorToPEAR_Exception($res); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
| @@ -489,7 +489,7 @@ class Schema | |||||||
|         $res = $this->conn->query($sql); |         $res = $this->conn->query($sql); | ||||||
|  |  | ||||||
|         if ($_PEAR->isError($res)) { |         if ($_PEAR->isError($res)) { | ||||||
|             throw new Exception($res->getMessage()); |             PEAR_ErrorToPEAR_Exception($res); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
| @@ -535,7 +535,7 @@ class Schema | |||||||
|             $res = $this->conn->query($sql); |             $res = $this->conn->query($sql); | ||||||
|  |  | ||||||
|             if ($_PEAR->isError($res)) { |             if ($_PEAR->isError($res)) { | ||||||
|                 throw new Exception($res->getMessage()); |                 PEAR_ErrorToPEAR_Exception($res); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         return $ok; |         return $ok; | ||||||
| @@ -1045,7 +1045,7 @@ class Schema | |||||||
|  |  | ||||||
|         $res = $this->conn->query($sql); |         $res = $this->conn->query($sql); | ||||||
|         if ($_PEAR->isError($res)) { |         if ($_PEAR->isError($res)) { | ||||||
|             throw new Exception($res->getMessage()); |             PEAR_ErrorToPEAR_Exception($res); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         $out = array(); |         $out = array(); | ||||||
|   | |||||||
| @@ -98,7 +98,6 @@ class SchemaUpdater | |||||||
|     { |     { | ||||||
|         $checksums = array(); |         $checksums = array(); | ||||||
|  |  | ||||||
|         PEAR::pushErrorHandling(PEAR_ERROR_EXCEPTION); |  | ||||||
|         try { |         try { | ||||||
|             $sv = new Schema_version(); |             $sv = new Schema_version(); | ||||||
|             $sv->find(); |             $sv->find(); | ||||||
| @@ -111,7 +110,6 @@ class SchemaUpdater | |||||||
|             // no dice! |             // no dice! | ||||||
|             common_log(LOG_DEBUG, "Possibly schema_version table doesn't exist yet."); |             common_log(LOG_DEBUG, "Possibly schema_version table doesn't exist yet."); | ||||||
|         } |         } | ||||||
|         PEAR::popErrorHandling(); |  | ||||||
|  |  | ||||||
|         return $checksums; |         return $checksums; | ||||||
|     } |     } | ||||||
| @@ -124,7 +122,6 @@ class SchemaUpdater | |||||||
|      */ |      */ | ||||||
|     protected function saveChecksum($table, $checksum) |     protected function saveChecksum($table, $checksum) | ||||||
|     { |     { | ||||||
|         PEAR::pushErrorHandling(PEAR_ERROR_EXCEPTION); |  | ||||||
|         try { |         try { | ||||||
|             $sv = new Schema_version(); |             $sv = new Schema_version(); | ||||||
|             $sv->table_name = $table; |             $sv->table_name = $table; | ||||||
| @@ -139,7 +136,6 @@ class SchemaUpdater | |||||||
|             // no dice! |             // no dice! | ||||||
|             common_log(LOG_DEBUG, "Possibly schema_version table doesn't exist yet."); |             common_log(LOG_DEBUG, "Possibly schema_version table doesn't exist yet."); | ||||||
|         } |         } | ||||||
|         PEAR::popErrorHandling(); |  | ||||||
|         $this->checksums[$table] = $checksum; |         $this->checksums[$table] = $checksum; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										43
									
								
								lib/selftagswidget.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								lib/selftagswidget.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * StatusNet, the distributed open-source microblogging tool | ||||||
|  |  * | ||||||
|  |  * Tags for a profile | ||||||
|  |  * | ||||||
|  |  * 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  Action | ||||||
|  |  * @package   StatusNet | ||||||
|  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||||
|  |  * @link      http://status.net/ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|  |  | ||||||
|  | class SelftagsWidget extends PeopletagsWidget | ||||||
|  | { | ||||||
|  |     function url($tag) | ||||||
|  |     { | ||||||
|  |         // link to self tag page | ||||||
|  |         return common_local_url('selftag', array('tag' => $tag)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function label() | ||||||
|  |     { | ||||||
|  |         // TRANS: Label in self tags widget. | ||||||
|  |         return _m('LABEL','Tags'); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -896,6 +896,7 @@ function common_replace_urls_callback($text, $callback, $arg = null) { | |||||||
|                     ')'. |                     ')'. | ||||||
|                 ')'. |                 ')'. | ||||||
|             ')'. |             ')'. | ||||||
|  |             '|(?:(?:magnet):)'. // URLs without domain name | ||||||
|             '|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'. //IPv4 |             '|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'. //IPv4 | ||||||
|             '|(?:'. //IPv6 |             '|(?:'. //IPv6 | ||||||
|                 '\[?(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}(?:(?:[0-9A-Fa-f]{1,4})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?::|(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(?::[0-9A-Fa-f]{1,4})))|(?:(?:[0-9A-Fa-f]{1,4}:){5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){4}(?::[0-9A-Fa-f]{1,4}){0,1}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){3}(?::[0-9A-Fa-f]{1,4}){0,2}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){2}(?::[0-9A-Fa-f]{1,4}){0,3}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:)(?::[0-9A-Fa-f]{1,4}){0,4}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?::(?::[0-9A-Fa-f]{1,4}){0,5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))\]?(?<!:)'. |                 '\[?(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}(?:(?:[0-9A-Fa-f]{1,4})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?::|(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(?::[0-9A-Fa-f]{1,4})))|(?:(?:[0-9A-Fa-f]{1,4}:){5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){4}(?::[0-9A-Fa-f]{1,4}){0,1}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){3}(?::[0-9A-Fa-f]{1,4}){0,2}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:){2}(?::[0-9A-Fa-f]{1,4}){0,3}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:[0-9A-Fa-f]{1,4}:)(?::[0-9A-Fa-f]{1,4}){0,4}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?::(?::[0-9A-Fa-f]{1,4}){0,5}(?:(?::(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|(?:(?::[0-9A-Fa-f]{1,4}){1,2})))|(?:(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))\]?(?<!:)'. | ||||||
|   | |||||||
| @@ -27,21 +27,13 @@ | |||||||
|  * @link      http://status.net/ |  * @link      http://status.net/ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| if (!defined('STATUSNET') && !defined('LACONICA')) { | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|     exit(1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| class InfiniteScrollPlugin extends Plugin | class InfiniteScrollPlugin extends Plugin | ||||||
| { | { | ||||||
|  |  | ||||||
|     public $on_next_only = false; |     public $on_next_only = false; | ||||||
|  |  | ||||||
|     function __construct() |     function onEndShowScripts(Action $action) | ||||||
|     { |  | ||||||
|         parent::__construct(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     function onEndShowScripts($action) |  | ||||||
|     { |     { | ||||||
|         $action->inlineScript('var infinite_scroll_on_next_only = ' . ($this->on_next_only?'true':'false') . ';'); |         $action->inlineScript('var infinite_scroll_on_next_only = ' . ($this->on_next_only?'true':'false') . ';'); | ||||||
|         $action->inlineScript('var ajax_loader_url = "' . ($this->path('ajax-loader.gif')) . '";'); |         $action->inlineScript('var ajax_loader_url = "' . ($this->path('ajax-loader.gif')) . '";'); | ||||||
| @@ -49,7 +41,7 @@ class InfiniteScrollPlugin extends Plugin | |||||||
|         $action->script($this->path('infinitescroll.js')); |         $action->script($this->path('infinitescroll.js')); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function onPluginVersion(&$versions) |     function onPluginVersion(array &$versions) | ||||||
|     { |     { | ||||||
|         $versions[] = array('name' => 'InfiniteScroll', |         $versions[] = array('name' => 'InfiniteScroll', | ||||||
|                             'version' => GNUSOCIAL_VERSION, |                             'version' => GNUSOCIAL_VERSION, | ||||||
|   | |||||||
| @@ -27,9 +27,7 @@ | |||||||
|  * @link      http://status.net/ |  * @link      http://status.net/ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| if (!defined('STATUSNET')) { | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|     exit(1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| define('PAGE_TYPE_PREFS_MOBILEPROFILE', | define('PAGE_TYPE_PREFS_MOBILEPROFILE', | ||||||
|        'application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html;q=0.9'); |        'application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html;q=0.9'); | ||||||
| @@ -59,124 +57,120 @@ class MobileProfilePlugin extends WAP20Plugin | |||||||
|         parent::__construct(); |         parent::__construct(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function onStartShowHTML($action) |     public function onStartShowHTML(Action $action) | ||||||
|     { |     { | ||||||
|         // XXX: This should probably graduate to WAP20Plugin |         // TODO: A lot of this should probably graduate to WAP20Plugin | ||||||
|  |  | ||||||
|  |         $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : null; | ||||||
|  |  | ||||||
|  |         $cp = common_accept_to_prefs($httpaccept); | ||||||
|  |         $sp = common_accept_to_prefs(PAGE_TYPE_PREFS_MOBILEPROFILE); | ||||||
|  |  | ||||||
|  |         $type = common_negotiate_type($cp, $sp); | ||||||
|  |  | ||||||
|  |         if (!$type) { | ||||||
|  |             // TRANS: Client exception thrown when requesting a not supported media type. | ||||||
|  |             throw new ClientException(_m('This page is not available in a '. | ||||||
|  |                                         'media type you accept.'), 406); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // If they are on the mobile site, serve them MP |         // If they are on the mobile site, serve them MP | ||||||
|         if ((common_config('site', 'mobileserver').'/'. |         if ((common_config('site', 'mobileserver').'/'.common_config('site', 'path').'/' | ||||||
|              common_config('site', 'path').'/' == |                 == $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])) { | ||||||
|             $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'])) { |  | ||||||
|  |  | ||||||
|             $this->serveMobile = true; |             $this->serveMobile = true; | ||||||
|         } else if (isset($_COOKIE['MobileOverride'])) { |         } elseif (isset($_COOKIE['MobileOverride'])) { | ||||||
|             // Cookie override is controlled by link at bottom. |             // Cookie override is controlled by link at bottom. | ||||||
|             $this->serveMobile = (bool)$_COOKIE['MobileOverride']; |             $this->serveMobile = (bool)$_COOKIE['MobileOverride']; | ||||||
|         } elseif (array_key_exists('HTTP_USER_AGENT', $_SERVER)) { |         } elseif (strstr('application/vnd.wap.xhtml+xml', $type) !== false) { | ||||||
|             // If they like the WAP 2.0 mimetype, serve them MP |             // If they like the WAP 2.0 mimetype, serve them MP | ||||||
|             // @fixme $type is undefined, making this if case useless and spewing errors. |             $this->serveMobile = true; | ||||||
|             // What's the intent? |         } elseif (array_key_exists('HTTP_USER_AGENT', $_SERVER)) { | ||||||
|             //if (strstr('application/vnd.wap.xhtml+xml', $type) !== false) { |             // If they are a mobile device that supports WAP 2.0, | ||||||
|             //    $this->serveMobile = true; |             // serve them MP | ||||||
|             //} else { |  | ||||||
|                 // If they are a mobile device that supports WAP 2.0, |  | ||||||
|                 // serve them MP |  | ||||||
|  |  | ||||||
|                 // XXX: Browser sniffing sucks |             // XXX: Browser sniffing sucks | ||||||
|  |  | ||||||
|                 // I really don't like going through this every page, |             // I really don't like going through this every page, | ||||||
|                 // perhaps use $_SESSION or cookies |             // perhaps use $_SESSION or cookies | ||||||
|  |  | ||||||
|                 // May be better to group the devices in terms of |             // May be better to group the devices in terms of | ||||||
|                 // low,mid,high-end |             // low,mid,high-end | ||||||
|  |  | ||||||
|                 // Or, detect the mobile devices based on their support for |             // Or, detect the mobile devices based on their support for | ||||||
|                 // MP 1.0, 1.1, or 1.2 may be ideal. Possible? |             // MP 1.0, 1.1, or 1.2 may be ideal. Possible? | ||||||
|  |  | ||||||
|                 $this->mobiledevices = array( |             $this->mobiledevices = array( | ||||||
|                     'alcatel', |                 'alcatel', | ||||||
|                     'android', |                 'android', | ||||||
|                     'audiovox', |                 'audiovox', | ||||||
|                     'au-mic,', |                 'au-mic,', | ||||||
|                     'avantgo', |                 'avantgo', | ||||||
|                     'blackberry', |                 'blackberry', | ||||||
|                     'blazer', |                 'blazer', | ||||||
|                     'cldc-', |                 'cldc-', | ||||||
|                     'danger', |                 'danger', | ||||||
|                     'epoc', |                 'epoc', | ||||||
|                     'ericsson', |                 'ericsson', | ||||||
|                     'ericy', |                 'ericy', | ||||||
|                     'iphone', |                 'iphone', | ||||||
|                     'ipaq', |                 'ipaq', | ||||||
|                     'ipod', |                 'ipod', | ||||||
|                     'j2me', |                 'j2me', | ||||||
|                     'lg', |                 'lg', | ||||||
|                     'maemo', |                 'maemo', | ||||||
|                     'midp-', |                 'midp-', | ||||||
|                     'mobile', |                 'mobile', | ||||||
|                     'mot', |                 'mot', | ||||||
|                     'netfront', |                 'netfront', | ||||||
|                     'nitro', |                 'nitro', | ||||||
|                     'nokia', |                 'nokia', | ||||||
|                     'opera mini', |                 'opera mini', | ||||||
|                     'palm', |                 'palm', | ||||||
|                     'palmsource', |                 'palmsource', | ||||||
|                     'panasonic', |                 'panasonic', | ||||||
|                     'philips', |                 'philips', | ||||||
|                     'pocketpc', |                 'pocketpc', | ||||||
|                     'portalmmm', |                 'portalmmm', | ||||||
|                     'rover', |                 'rover', | ||||||
|                     'samsung', |                 'samsung', | ||||||
|                     'sanyo', |                 'sanyo', | ||||||
|                     'series60', |                 'series60', | ||||||
|                     'sharp', |                 'sharp', | ||||||
|                     'sie-', |                 'sie-', | ||||||
|                     'smartphone', |                 'smartphone', | ||||||
|                     'sony', |                 'sony', | ||||||
|                     'symbian', |                 'symbian', | ||||||
|                     'up.browser', |                 'up.browser', | ||||||
|                     'up.link', |                 'up.link', | ||||||
|                     'up.link', |                 'up.link', | ||||||
|                     'vodafone', |                 'vodafone', | ||||||
|                     'wap1', |                 'wap1', | ||||||
|                     'wap2', |                 'wap2', | ||||||
|                     'webos', |                 'webos', | ||||||
|                     'windows ce' |                 'windows ce' | ||||||
|                 ); |             ); | ||||||
|  |  | ||||||
|                 $blacklist = array( |             $blacklist = array( | ||||||
|                     'ipad', // Larger screen handles the full theme fairly well. |                 'ipad', // Larger screen handles the full theme fairly well. | ||||||
|                 ); |             ); | ||||||
|  |  | ||||||
|                 $httpuseragent = strtolower($_SERVER['HTTP_USER_AGENT']); |             $httpuseragent = strtolower($_SERVER['HTTP_USER_AGENT']); | ||||||
|  |  | ||||||
|                 foreach ($blacklist as $md) { |             foreach ($blacklist as $md) { | ||||||
|                     if (strstr($httpuseragent, $md) !== false) { |                 if (strstr($httpuseragent, $md) !== false) { | ||||||
|                         $this->serveMobile = false; |                     $this->serveMobile = false; | ||||||
|                         return true; |                     return true; | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|                 foreach ($this->mobiledevices as $md) { |             foreach ($this->mobiledevices as $md) { | ||||||
|                     if (strstr($httpuseragent, $md) !== false) { |                 if (strstr($httpuseragent, $md) !== false) { | ||||||
|                         $this->setMobileFeatures($httpuseragent); |                     $this->setMobileFeatures($httpuseragent); | ||||||
|  |  | ||||||
|                         $this->serveMobile = true; |                     $this->serveMobile = true; | ||||||
|                         $this->reallyMobile = true; |                     $this->reallyMobile = true; | ||||||
|                         break; |                     break; | ||||||
|                     } |  | ||||||
|                 } |                 } | ||||||
|             //} |  | ||||||
|  |  | ||||||
|             // If they are okay with MP, and the site has a mobile server, |  | ||||||
|             // redirect there |  | ||||||
|             if ($this->serveMobile && |  | ||||||
|                 common_config('site', 'mobileserver') !== false && |  | ||||||
|                 (common_config('site', 'mobileserver') != |  | ||||||
|                     common_config('site', 'server'))) { |  | ||||||
|  |  | ||||||
|                 // FIXME: Redirect to equivalent page on mobile site instead |  | ||||||
|                 common_redirect($this->_common_path(''), 302); |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -184,48 +178,23 @@ class MobileProfilePlugin extends WAP20Plugin | |||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // @fixme $type is undefined, making this if case useless and spewing errors. |         // If they are okay with MP, and the site has a mobile server, | ||||||
|         // What's the intent? |         // redirect there | ||||||
|         //if (!$type) { |         if (common_config('site', 'mobileserver') !== false && | ||||||
|             $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? |                 common_config('site', 'mobileserver') != common_config('site', 'server')) { | ||||||
|               $_SERVER['HTTP_ACCEPT'] : null; |  | ||||||
|  |  | ||||||
|             $cp = common_accept_to_prefs($httpaccept); |             // FIXME: Redirect to equivalent page on mobile site instead | ||||||
|             $sp = common_accept_to_prefs(PAGE_TYPE_PREFS_MOBILEPROFILE); |             common_redirect($this->_common_path(''), 302); | ||||||
|  |         } | ||||||
|             $type = common_negotiate_type($cp, $sp); |  | ||||||
|  |  | ||||||
|             if (!$type) { |  | ||||||
|                 // TRANS: Client exception thrown when requesting a not supported media type. |  | ||||||
|                 throw new ClientException(_m('This page is not available in a '. |  | ||||||
|                                             'media type you accept.'), 406); |  | ||||||
|             } |  | ||||||
|         //} |  | ||||||
|  |  | ||||||
|         header('Content-Type: '.$type); |         header('Content-Type: '.$type); | ||||||
|  |  | ||||||
|         if ($this->reallyMobile) { |         if ($this->reallyMobile) { | ||||||
|  |            $action->setDTD('html', '-//WAPFORUM//DTD XHTML Mobile 1.0//EN', $this->DTD); | ||||||
|            $action->extraHeaders(); |  | ||||||
|            if (preg_match("/.*\/.*xml/", $type)) { |  | ||||||
|                // Required for XML documents |  | ||||||
|                $action->startXML(); |  | ||||||
|            } |  | ||||||
|            $action->xw->writeDTD('html', |  | ||||||
|                            '-//WAPFORUM//DTD XHTML Mobile 1.0//EN', |  | ||||||
|                            $this->DTD); |  | ||||||
|  |  | ||||||
|             $language = $action->getLanguage(); |  | ||||||
|  |  | ||||||
|             $action->elementStart('html', array('xmlns' => 'http://www.w3.org/1999/xhtml', |  | ||||||
|                                             'xml:lang' => $language)); |  | ||||||
|  |  | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         } else { |  | ||||||
|         return true; |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         // continue | ||||||
|  |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function setMobileFeatures($useragent) |     function setMobileFeatures($useragent) | ||||||
| @@ -268,7 +237,7 @@ class MobileProfilePlugin extends WAP20Plugin | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function onStartShowUAStyles($action) { |     public function onStartShowUAStyles(Action $action) { | ||||||
|         if (!$this->serveMobile) { |         if (!$this->serveMobile) { | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
| @@ -276,7 +245,7 @@ class MobileProfilePlugin extends WAP20Plugin | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function onStartShowHeader($action) |     public function onStartShowHeader(Action $action) | ||||||
|     { |     { | ||||||
|         if (!$this->serveMobile) { |         if (!$this->serveMobile) { | ||||||
|             return true; |             return true; | ||||||
| @@ -290,7 +259,7 @@ class MobileProfilePlugin extends WAP20Plugin | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function _showLogo($action) |     protected function _showLogo(Action $action) | ||||||
|     { |     { | ||||||
|         $action->elementStart('address'); |         $action->elementStart('address'); | ||||||
|         if (common_config('singleuser', 'enabled')) { |         if (common_config('singleuser', 'enabled')) { | ||||||
| @@ -316,23 +285,22 @@ class MobileProfilePlugin extends WAP20Plugin | |||||||
|         $action->elementEnd('address'); |         $action->elementEnd('address'); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function onStartShowAside($action) |     public function onStartShowAside(Action $action) | ||||||
|     { |     { | ||||||
|         if ($this->serveMobile) { |         if ($this->serveMobile) { | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function onStartShowLocalNavBlock($action) |     public function onStartShowLocalNavBlock(Action $action) | ||||||
|     { |     { | ||||||
|         if ($this->serveMobile) { |         if ($this->serveMobile) { | ||||||
|             // @todo FIXME: "Show Navigation" / "Hide Navigation" needs i18n |             // @todo FIXME: "Show Navigation" / "Hide Navigation" needs i18n | ||||||
|             $action->element('a', array('href' => '#', 'id' => 'navtoggle'), 'Show Navigation'); |             $action->element('a', array('href' => '#', 'id' => 'navtoggle'), 'Show Navigation'); | ||||||
|         return true; |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     function onEndShowScripts($action) |     public function onEndShowScripts(Action $action) | ||||||
|     { |     { | ||||||
|         // @todo FIXME: "Show Navigation" / "Hide Navigation" needs i18n |         // @todo FIXME: "Show Navigation" / "Hide Navigation" needs i18n | ||||||
|         $action->inlineScript(' |         $action->inlineScript(' | ||||||
| @@ -357,18 +325,12 @@ class MobileProfilePlugin extends WAP20Plugin | |||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         if ($this->serveMobile) { |         if ($this->serveMobile) { | ||||||
|             $action->inlineScript(' |             $action->inlineScript('$(function() { $(".checkbox-wrapper").unbind("click"); });'); | ||||||
|                 $(function() { |  | ||||||
|         	        $(".checkbox-wrapper").unbind("click"); |  | ||||||
|                 });' |  | ||||||
|             ); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     function onEndShowInsideFooter($action) |     public function onEndShowInsideFooter(Action $action) | ||||||
|     { |     { | ||||||
|         if ($this->serveMobile) { |         if ($this->serveMobile) { | ||||||
|             // TRANS: Link to switch site layout from mobile to desktop mode. Appears at very bottom of page. |             // TRANS: Link to switch site layout from mobile to desktop mode. Appears at very bottom of page. | ||||||
|   | |||||||
| @@ -27,14 +27,13 @@ | |||||||
|  * @link      http://status.net/ |  * @link      http://status.net/ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| if (!defined('STATUSNET') && !defined('LACONICA')) { | if (!defined('GNUSOCIAL')) { exit(1); } | ||||||
|     exit(1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| class StrictTransportSecurityPlugin extends Plugin | class StrictTransportSecurityPlugin extends Plugin | ||||||
| { | { | ||||||
|     public $max_age = 15552000; |     public $max_age = 15552000; | ||||||
|     public $includeSubDomains = false; |     public $includeSubDomains = false; | ||||||
|  |     public $preloadToken = false; | ||||||
|  |  | ||||||
|     function __construct() |     function __construct() | ||||||
|     { |     { | ||||||
| @@ -45,7 +44,9 @@ class StrictTransportSecurityPlugin extends Plugin | |||||||
|     { |     { | ||||||
|         $path = common_config('site', 'path'); |         $path = common_config('site', 'path'); | ||||||
|         if(common_config('site', 'ssl') == 'always' && ($path == '/' || ! $path )) { |         if(common_config('site', 'ssl') == 'always' && ($path == '/' || ! $path )) { | ||||||
|             header('Strict-Transport-Security: max-age=' . $this->max_age . + ($this->includeSubDomains?'; includeSubDomains':'')); |             header('Strict-Transport-Security: max-age=' . $this->max_age | ||||||
|  |                     . ($this->includeSubDomains ? '; includeSubDomains' : '') | ||||||
|  |                     . ($this->preloadToken ? '; preload' : '')); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -20,15 +20,16 @@ | |||||||
| 
 | 
 | ||||||
| define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); | define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); | ||||||
| 
 | 
 | ||||||
| $shortoptions = 'i::n::y'; | $shortoptions = 'i::n::u::y'; | ||||||
| $longoptions = array('id=', 'nickname=', 'yes'); | $longoptions = array('id=', 'nickname=', 'uri=', 'yes'); | ||||||
| 
 | 
 | ||||||
| $helptext = <<<END_OF_DELETEUSER_HELP | $helptext = <<<END_OF_DELETEUSER_HELP | ||||||
| deleteuser.php [options] | deleteprofile.php [options] | ||||||
| deletes a user from the database | deletes a profile from the database | ||||||
| 
 | 
 | ||||||
|   -i --id       ID of the user |   -i --id       ID of the profile | ||||||
|   -n --nickname nickname of the user |   -n --nickname nickname of a local user | ||||||
|  |   -u --uri      OStatus profile URI (only remote users, requires OStatus plugin) | ||||||
|   -y --yes      do not wait for confirmation |   -y --yes      do not wait for confirmation | ||||||
| 
 | 
 | ||||||
| END_OF_DELETEUSER_HELP; | END_OF_DELETEUSER_HELP; | ||||||
| @@ -37,25 +38,34 @@ require_once INSTALLDIR.'/scripts/commandline.inc'; | |||||||
| 
 | 
 | ||||||
| if (have_option('i', 'id')) { | if (have_option('i', 'id')) { | ||||||
|     $id = get_option_value('i', 'id'); |     $id = get_option_value('i', 'id'); | ||||||
|     $user = User::getKV('id', $id); |     $profile = Profile::getKV('id', $id); | ||||||
|     if (empty($user)) { |     if (!$profile instanceof Profile) { | ||||||
|         print "Can't find user with ID $id\n"; |         print "Can't find profile with ID $id\n"; | ||||||
|         exit(1); |         exit(1); | ||||||
|     } |     } | ||||||
| } else if (have_option('n', 'nickname')) { | } else if (have_option('n', 'nickname')) { | ||||||
|     $nickname = get_option_value('n', 'nickname'); |     $nickname = get_option_value('n', 'nickname'); | ||||||
|     $user = User::getKV('nickname', $nickname); |     $user = User::getKV('nickname', $nickname); | ||||||
|     if (empty($user)) { |     if (!$user instanceof User) { | ||||||
|         print "Can't find user with nickname '$nickname'\n"; |         print "Can't find user with nickname '$nickname'\n"; | ||||||
|         exit(1); |         exit(1); | ||||||
|     } |     } | ||||||
|  |     $profile = $user->getProfile(); | ||||||
|  | } else if (have_option('u', 'uri')) { | ||||||
|  |     $uri = get_option_value('u', 'uri'); | ||||||
|  |     $oprofile = Ostatus_profile::getKV('uri', $uri); | ||||||
|  |     if (!$oprofile instanceof Ostatus_profile) { | ||||||
|  |         print "Can't find profile with URI '$uri'\n"; | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  |     $profile = $oprofile->localProfile(); | ||||||
| } else { | } else { | ||||||
|     print "You must provide either an ID or a nickname.\n"; |     print "You must provide either an ID, a URI or a nickname.\n"; | ||||||
|     exit(1); |     exit(1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if (!have_option('y', 'yes')) { | if (!have_option('y', 'yes')) { | ||||||
|     print "About to PERMANENTLY delete user '{$user->nickname}' ({$user->id}). Are you sure? [y/N] "; |     print "About to PERMANENTLY delete profile '".$profile->getNickname()."' ({$profile->id}). Are you sure? [y/N] "; | ||||||
|     $response = fgets(STDIN); |     $response = fgets(STDIN); | ||||||
|     if (strtolower(trim($response)) != 'y') { |     if (strtolower(trim($response)) != 'y') { | ||||||
|         print "Aborting.\n"; |         print "Aborting.\n"; | ||||||
| @@ -64,5 +74,5 @@ if (!have_option('y', 'yes')) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| print "Deleting..."; | print "Deleting..."; | ||||||
| $user->delete(); | $profile->delete(); | ||||||
| print "DONE.\n"; | print "DONE.\n"; | ||||||
							
								
								
									
										86
									
								
								scripts/remove_duplicate_file_urls.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										86
									
								
								scripts/remove_duplicate_file_urls.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,86 @@ | |||||||
|  | #!/usr/bin/env php | ||||||
|  | <?php | ||||||
|  | /* | ||||||
|  |  * StatusNet - a distributed open-source microblogging tool | ||||||
|  |  * Copyright (C) 2008, 2009, StatusNet, Inc. | ||||||
|  |  * | ||||||
|  |  * 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/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); | ||||||
|  |  | ||||||
|  | $shortoptions = 'y'; | ||||||
|  | $longoptions = array('yes'); | ||||||
|  |  | ||||||
|  | $helptext = <<<END_OF_HELP | ||||||
|  | remove_duplicate_file_urls.php [options] | ||||||
|  | Remove duplicate URL entries in the file and file_redirection tables because they for some reason were not unique. | ||||||
|  |  | ||||||
|  |   -y --yes      do not wait for confirmation | ||||||
|  |  | ||||||
|  | END_OF_HELP; | ||||||
|  |  | ||||||
|  | require_once INSTALLDIR.'/scripts/commandline.inc'; | ||||||
|  |  | ||||||
|  | if (!have_option('y', 'yes')) { | ||||||
|  |     print "About to remove duplicate URL entries in file and file_redirection tables. Are you sure? [y/N] "; | ||||||
|  |     $response = fgets(STDIN); | ||||||
|  |     if (strtolower(trim($response)) != 'y') { | ||||||
|  |         print "Aborting.\n"; | ||||||
|  |         exit(0); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | $file = new File(); | ||||||
|  | $file->query('SELECT id, url, COUNT(*) AS c FROM file GROUP BY url HAVING c > 1'); | ||||||
|  | print "\nFound {$file->N} URLs with duplicate entries in file table"; | ||||||
|  | while ($file->fetch()) { | ||||||
|  |     // We've got a URL that is duplicated in the file table | ||||||
|  |     $dupfile = new File(); | ||||||
|  |     $dupfile->url = $file->url; | ||||||
|  |     if ($dupfile->find(true)) { | ||||||
|  |         print "\nDeleting duplicate entries in file table for URL: {$file->url} ["; | ||||||
|  |         // Leave one of the URLs in the database by using ->find(true) | ||||||
|  |         // and only deleting starting with this fetch. | ||||||
|  |         while($dupfile->fetch()) { | ||||||
|  |             print "."; | ||||||
|  |             $dupfile->delete(); | ||||||
|  |         } | ||||||
|  |         print "]\n"; | ||||||
|  |     } else { | ||||||
|  |         print "\nWarning! URL suddenly disappeared from database: {$file->url}\n"; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | $file = new File_redirection(); | ||||||
|  | $file->query('SELECT file_id, url, COUNT(*) AS c FROM file_redirection GROUP BY url HAVING c > 1'); | ||||||
|  | print "\nFound {$file->N} URLs with duplicate entries in file_redirection table"; | ||||||
|  | while ($file->fetch()) { | ||||||
|  |     // We've got a URL that is duplicated in the file_redirection table | ||||||
|  |     $dupfile = new File_redirection(); | ||||||
|  |     $dupfile->url = $file->url; | ||||||
|  |     if ($dupfile->find(true)) { | ||||||
|  |         print "\nDeleting duplicate entries in file table for URL: {$file->url} ["; | ||||||
|  |         // Leave one of the URLs in the database by using ->find(true) | ||||||
|  |         // and only deleting starting with this fetch. | ||||||
|  |         while($dupfile->fetch()) { | ||||||
|  |             print "."; | ||||||
|  |             $dupfile->delete(); | ||||||
|  |         } | ||||||
|  |         print "]\n"; | ||||||
|  |     } else { | ||||||
|  |         print "\nWarning! URL suddenly disappeared from database: {$file->url}\n"; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | print "\nDONE.\n"; | ||||||
| @@ -520,7 +520,7 @@ function setFilehashOnLocalFiles() | |||||||
|                 $file->filehash = hash_file(File::FILEHASH_ALG, $file->getPath()); |                 $file->filehash = hash_file(File::FILEHASH_ALG, $file->getPath()); | ||||||
|                 $file->update($orig); |                 $file->update($orig); | ||||||
|             } catch (FileNotFoundException $e) { |             } catch (FileNotFoundException $e) { | ||||||
|                 echo "\n    WARNING: file ID {$file->id} does not exist on path '{$e->path}'. Clean up the file table?"; |                 echo "\n    WARNING: file ID {$file->id} does not exist on path '{$e->path}'. If there is no file system error, run: php scripts/clean_file_table.php"; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user