protected $conversation = null;
protected $notices = null;
- /**
- * For initializing members of the class.
- *
- * @param array $argarray misc. arguments
- *
- * @return boolean true
- */
- function prepare($argarray)
+ protected function prepare(array $args=array())
{
- parent::prepare($argarray);
+ parent::prepare($args);
$convId = $this->trimmed('id');
Event::handle('EndShowConversation', array($this, $this->conv, $this->scoped));
}
- function isReadOnly()
+ function isReadOnly($args)
{
return true;
}
throw new ServerException('URL already exists in DB');
}
$sql = 'UPDATE %1$s SET urlhash=%2$s, url=%3$s WHERE urlhash=%4$s;';
- $result = $this->query(sprintf($sql, $this->__table,
+ $result = $this->query(sprintf($sql, $this->tableName(),
$this->_quote((string)self::hashurl($url)),
$this->_quote((string)$url),
$this->_quote((string)$this->urlhash)));
if ($result === false) {
common_log_db_error($this, 'UPDATE', __FILE__);
- throw new ServerException("Could not UPDATE {$this->__table}.url");
+ throw new ServerException("Could not UPDATE {$this->tableName()}.url");
}
return $result;
--- /dev/null
+<?php
+if (!defined('GNUSOCIAL')) { exit(1); }
+
+class GS_DataObject extends DB_DataObject
+{
+ public function _autoloadClass($class, $table=false)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::_autoloadClass($class, $table);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ // wraps the _connect call so we don't throw E_STRICT warnings during it
+ public function _connect()
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::_connect();
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ // wraps the _loadConfig call so we don't throw E_STRICT warnings during it
+ // doesn't actually return anything, but we'll follow the same model as the rest of the wrappers
+ public function _loadConfig()
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::_loadConfig();
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ // wraps the count call so we don't throw E_STRICT warnings during it
+ public function count($countWhat = false,$whereAddOnly = false)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::count($countWhat, $whereAddOnly);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ static public function debugLevel($v = null)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::debugLevel($v);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ // delete calls PEAR::isError from DB_DataObject, so let's make that disappear too
+ public function delete($useWhere = false)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::delete($useWhere);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ static public function factory($table = '')
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::factory($table);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ public function get($k = null, $v = null)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::get($k, $v);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ public function fetch()
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::fetch();
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ public function find($n = false)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::find($n);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ public function fetchRow($row = null)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::fetchRow($row);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ // insert calls PEAR::isError from DB_DataObject, so let's make that disappear too
+ public function insert()
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::insert();
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ // DB_DataObject's joinAdd calls DB_DataObject::factory explicitly, so our factory-override doesn't work
+ public function joinAdd($obj = false, $joinType='INNER', $joinAs=false, $joinCol=false)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::joinAdd($obj, $joinType, $joinAs, $joinCol);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ public function links()
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::links();
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ // wraps the update call so we don't throw E_STRICT warnings during it
+ public function update($dataObject = false)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::update($dataObject);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ static public function staticGet($class, $k, $v = null)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::staticGet($class, $k, $v);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+
+ public function staticGetAutoloadTable($table)
+ {
+ // avoid those annoying PEAR::DB strict standards warnings it causes
+ $old = error_reporting();
+ error_reporting(error_reporting() & ~E_STRICT);
+
+ $res = parent::staticGetAutoloadTable($table);
+
+ // reset
+ error_reporting($old);
+ return $res;
+ }
+}
common_log_db_error($this, 'UPDATE', __FILE__);
// rollback as something bad occurred
$this->query('ROLLBACK');
- throw new ServerException("Could not UPDATE non-keys for {$this->__table}");
+ throw new ServerException("Could not UPDATE non-keys for {$this->tableName()}");
}
$orig->decache();
$this->encache();
common_log_db_error($this, 'UPDATE', __FILE__);
// rollback as something bad occurred
$this->query('ROLLBACK');
- throw new ServerException("Could not UPDATE key fields for {$this->__table}");
+ throw new ServerException("Could not UPDATE key fields for {$this->tableName()}");
}
// Update non-keys too, if the previous endeavour worked.
common_log_db_error($this, 'UPDATE', __FILE__);
// rollback as something bad occurred
$this->query('ROLLBACK');
- throw new ServerException("Could not UPDATE non-keys for {$this->__table}");
+ throw new ServerException("Could not UPDATE non-keys for {$this->tableName()}");
}
$orig->decache();
$this->encache();
}
global $_DB_DATAOBJECT;
- if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
+ if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->tableName()."__keys"])) {
$this->databaseStructure();
}
- return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
+ return $_DB_DATAOBJECT['INI'][$this->_database][$this->tableName()."__keys"];
}
function encache()
global $_DB_DATAOBJECT;
if (empty($_DB_DATAOBJECT['CONFIG'])) {
- DB_DataObject::_loadConfig();
+ self::_loadConfig();
}
$options = &$_DB_DATAOBJECT['CONFIG'];
if (!$dsn) {
if (!$this->_database) {
- $this->_database = isset($options["table_{$this->__table}"]) ? $options["table_{$this->__table}"] : null;
+ $this->_database = isset($options["table_{$this->tableName()}"]) ? $options["table_{$this->tableName()}"] : null;
}
if ($this->_database && !empty($options["database_{$this->_database}"])) {
// Force the scope for private groups
foreach ($groups as $group_id) {
- $group = User_group::staticGet('id', $group_id);
- if ($group instanceof User_group) {
+ try {
+ $group = User_group::getByID($group_id);
if ($group->force_scope) {
$scope |= Notice::GROUP_SCOPE;
break;
}
+ } catch (Exception $e) {
+ common_log(LOG_ERR, 'Notice figureOutScope threw exception: '.$e->getMessage());
}
}
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
+if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Extended DB_DataObject to improve a few things:
* - don't leak memory when loading already-used .ini files
* (eg when using the same schema on thousands of databases)
*/
-class Safe_DataObject extends DB_DataObject
+class Safe_DataObject extends GS_DataObject
{
/**
* Destructor to free global memory resources associated with
}
}
-
if (!$this->_database) {
$this->_connect();
}
// database loaded - but this is table is not available..
if (
- empty($_DB_DATAOBJECT['INI'][$this->_database][$this->__table])
+ empty($_DB_DATAOBJECT['INI'][$this->_database][$this->tableName()])
&& !empty($_DB_DATAOBJECT['CONFIG']['proxy'])
) {
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
$x = new DB_DataObject_Generator;
- $x->fillTableSchema($this->_database,$this->__table);
+ $x->fillTableSchema($this->_database,$this->tableName());
}
return true;
}
if (empty($_DB_DATAOBJECT['CONFIG'])) {
- DB_DataObject::_loadConfig();
+ self::_loadConfig();
}
// if you supply this with arguments, then it will take those
// now have we loaded the structure..
- if (!empty($_DB_DATAOBJECT['INI'][$this->_database][$this->__table])) {
+ if (!empty($_DB_DATAOBJECT['INI'][$this->_database][$this->tableName()])) {
return true;
}
// - if not try building it..
require_once 'DB/DataObject/Generator.php';
$x = new DB_DataObject_Generator;
- $x->fillTableSchema($this->_database,$this->__table);
+ $x->fillTableSchema($this->_database,$this->tableName());
// should this fail!!!???
return true;
}
- $this->debug("Cant find database schema: {$this->_database}/{$this->__table} \n".
+ $this->debug("Cant find database schema: {$this->_database}/{$this->tableName()} \n".
"in links file data: " . print_r($_DB_DATAOBJECT['INI'],true),"databaseStructure",5);
// we have to die here!! - it causes chaos if we don't (including looping forever!)
// Low level exception. No need for i18n as discussed with Brion.
$sn = new Status_network();
$sn->_connect();
- $config['db']['table_'. $this->__table] = $sn->_database;
+ $config['db']['table_'. $this->tableName()] = $sn->_database;
$this->_connect();
}
$this->_query['derive_select']
.' FROM ( SELECT'.
$this->_query['data_select'] . " \n" .
- " FROM $tn \n" .
+ " FROM $tn " . $this->_query['useindex'] . " \n" .
$this->_join . " \n" .
$this->_query['condition'] . " \n" .
$this->_query['group_by'] . " \n" .
$sql = 'SELECT ' .
$this->_query['data_select'] . " \n" .
- " FROM $tn \n" .
+ " FROM $tn " . $this->_query['useindex'] . " \n" .
$this->_join . " \n" .
$this->_query['condition'] . " \n" .
$this->_query['group_by'] . " \n" .
$this->_query['having'] .= " AND {$having}";
}
+ /**
+ * Adds a using Index
+ *
+ * $object->useIndex(); //reset the use Index
+ * $object->useIndex("some_index");
+ *
+ * Note do not put unfiltered user input into theis method.
+ * This is mysql specific at present? - might need altering to support other databases.
+ *
+ * @param string|array $index index or indexes to use.
+ * @access public
+ * @return none|PEAR::Error - invalid args only
+ */
+ function useIndex($index = false)
+ {
+ if ($this->_query === false) {
+ $this->raiseError(
+ "You cannot do two queries on the same object (copy it before finding)",
+ DB_DATAOBJECT_ERROR_INVALIDARGS);
+ return false;
+ }
+ if ($index=== false) {
+ $this->_query['useindex'] = '';
+ return;
+ }
+ // check input...= 0 or ' ' == error!
+ if ((is_string($index) && !trim($index)) || (is_array($index) && !count($index)) ) {
+ return $this->raiseError("Having: No Valid Arguments", DB_DATAOBJECT_ERROR_INVALIDARGS);
+ }
+ $index = is_array($index) ? implode(', ', $index) : $index;
+
+ if (!$this->_query['useindex']) {
+ $this->_query['useindex'] = " USE INDEX ({$index}) ";
+ return;
+ }
+ $this->_query['useindex'] = substr($this->_query['useindex'],0, -2) . ", {$index}) ";
+ }
/**
* Sets the Limit
*
continue;
}
-
-
-
- // Ignore variables which aren't set to a value
- if ( (!isset($this->$k) || ($v == 1 && $this->$k == ''))
+
+ // Ignore INTEGERS which aren't set to a value - or empty string..
+ if ( (!isset($this->$k) || ($v == 1 && $this->$k === ''))
&& $ignore_null
) {
continue;
foreach($items as $k => $v) {
- if ((!isset($this->$k) || ($v == 1 && $this->$k == ''))
+ // I think this is ignoring empty vlalues
+ if ((!isset($this->$k) || ($v == 1 && $this->$k === ''))
&& $ignore_null
) {
continue;
'group_by' => '', // the GROUP BY condition
'order_by' => '', // the ORDER BY condition
'having' => '', // the HAVING condition
+ 'useindex' => '', // the USE INDEX condition
'limit_start' => '', // the LIMIT condition
'limit_count' => '', // the LIMIT condition
'data_select' => '*', // the columns to be SELECTed
} else {
$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5] = DB::connect($dsn);
}
-
+
} else {
/* assumption is MDB2 */
require_once 'MDB2.php';
- function factory($table = '')
+ static function factory($table = '')
{
global $_DB_DATAOBJECT;
}
// no configuration available for database
if (!empty($database) && empty($_DB_DATAOBJECT['CONFIG']['database_'.$database])) {
- return DB_DataObject::raiseError(
+ $do = new DB_DataObject();
+ $do->raiseError(
"unable to find database_{$database} in Configuration, It is required for factory with database"
, 0, PEAR_ERROR_DIE );
}
-
+ /*
if ($table === '') {
if (is_a($this,'DB_DataObject') && strlen($this->tableName())) {
$table = $this->tableName();
}
}
+ */
// does this need multi db support??
$cp = isset($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
explode(PATH_SEPARATOR, $_DB_DATAOBJECT['CONFIG']['class_prefix']) : '';
}
if (!$rclass || !class_exists($rclass)) {
- return DB_DataObject::raiseError(
+ $dor = new DB_DataObject();
+ return $dor->raiseError(
"factory could not find class " .
(is_array($class) ? implode(PATH_SEPARATOR, $class) : $class ).
"from $table",
}
}
if (!$found) {
- DB_DataObject::raiseError(
+ $dor = new DB_DataObject();
+ $dor->raiseError(
"autoload:Could not find class " . implode(',', $cls) .
" using class_location value :" . $search .
" using include_path value :" . ini_get('include_path'),
}
}
if (!$ce) {
- DB_DataObject::raiseError(
+ $dor = new DB_DataObject();
+ $dor->raiseError(
"autoload:Could not autoload " . implode(',', $cls) ,
DB_DATAOBJECT_ERROR_INVALIDCONFIG);
return false;
global $_DB_DATAOBJECT;
$keys = $this->keys();
$items = $this->table();
+
if (!$items) {
$this->raiseError(
"setFrom:Could not find table definition for {$this->tableName()}",
* @access public
* @return none
*/
- function debugLevel($v = null)
+ static function debugLevel($v = null)
{
global $_DB_DATAOBJECT;
if (empty($_DB_DATAOBJECT['CONFIG'])) {
$error = $message;
} else {
require_once 'DB/DataObject/Error.php';
- $error = PEAR::raiseError($message, $type, $behaviour,
+ $dor = new PEAR();
+ $error = $dor->raiseError($message, $type, $behaviour,
$opts=null, $userinfo=null, 'DB_DataObject_Error'
);
}
/**
* (deprecated - use ::get / and your own caching method)
*/
- function staticGet($class, $k, $v = null)
+ static function staticGet($class, $k, $v = null)
{
$lclass = strtolower($class);
global $_DB_DATAOBJECT;
$obj = DB_DataObject::factory(substr($class,strlen($_DB_DATAOBJECT['CONFIG']['class_prefix'])));
if (PEAR::isError($obj)) {
- DB_DataObject::raiseError("could not autoload $class", DB_DATAOBJECT_ERROR_NOCLASS);
+ $dor = new DB_DataObject();
+ $dor->raiseError("could not autoload $class", DB_DATAOBJECT_ERROR_NOCLASS);
$r = false;
return $r;
}
$_DB_DATAOBJECT['CACHE'][$lclass] = array();
}
if (!$obj->get($k,$v)) {
- DB_DataObject::raiseError("No Data return from get $k $v", DB_DATAOBJECT_ERROR_NODATA);
+ $dor = new DB_DataObject();
+ $dor->raiseError("No Data return from get $k $v", DB_DATAOBJECT_ERROR_NODATA);
$r = false;
return $r;
} else {
common_debug('Prepare failed for Action.');
}
- }
-
- $this->flush();
- Event::handle('EndActionExecute', array($this));
+ $this->flush();
+ Event::handle('EndActionExecute', array($this));
+ }
}
/**
return false;
}
- function prepare($args)
+ protected function prepare(array $args=array())
{
- parent::prepare($args);
- return true;
- }
-
- /**
- * Handle input, produce output
- *
- * Switches on request method; either shows the form or handles its input.
- *
- * @param array $args $_REQUEST data
- *
- * @return void
- */
- function handle($args)
- {
- parent::handle($args);
self::cleanRequest();
+ return parent::prepare($args);
}
/*
// XXX: Should these error actions even be invokable via URI?
- function handle($args)
+ protected function handle()
{
- parent::handle($args);
+ parent::handle();
$this->code = $this->trimmed('code');
class FullThreadedNoticeList extends ThreadedNoticeList
{
- function newListItem($notice)
+ function newListItem(Notice $notice)
{
return new FullThreadedNoticeListItem($notice, $this->out, $this->userProfile);
}
. ' (' . get_class($this) . ' v' . $this->version() . ')';
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$name = $this->name();
// XXX: Should these error actions even be invokable via URI?
- function handle($args)
+ protected function handle()
{
- parent::handle($args);
+ parent::handle();
$this->code = $this->trimmed('code');
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'AccountManager',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Activity',
'version' => self::VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'ActivitySpam',
'version' => GNUSOCIAL_VERSION,
'verb' => '[a-z]+'));
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Activity Verb',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$url = 'http://status.net/wiki/Plugin:AnonymousFave';
return true;
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'AntiBrute',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'ApiLogger',
'version' => GNUSOCIAL_VERSION,
return true;
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'AuthCrypt',
'version' => GNUSOCIAL_VERSION,
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'AutoSandbox',
'version' => GNUSOCIAL_VERSION,
$m->connect('main/autocomplete/suggest', array('action'=>'autocomplete'));
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Autocomplete',
'version' => GNUSOCIAL_VERSION,
{
const VERSION = '0.0.42';
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array(
'name' => 'Awesomeness',
return null;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => sprintf('BitlyUrl (%s)', $this->shortenerName),
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Blacklist',
'version' => self::VERSION,
'');
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'BlankAd',
'version' => GNUSOCIAL_VERSION,
return BLOGSPAMNETPLUGIN_VERSION;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'BlogspamNet',
'version' => BLOGSPAMNETPLUGIN_VERSION,
*
* @return value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Bookmark',
'version' => self::VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'CacheLog',
'version' => GNUSOCIAL_VERSION,
$casSettings['takeOverLogin']=$this->takeOverLogin;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'CAS Authentication',
'version' => GNUSOCIAL_VERSION,
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Shorten',
'version' => GNUSOCIAL_VERSION,
return '/' . implode('/', $path);
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Comet',
'version' => GNUSOCIAL_VERSION,
return true;
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Cronish',
'version' => GNUSOCIAL_VERSION,
return true;
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Default Layout',
'version' => GNUSOCIAL_VERSION,
--- /dev/null
+<?php
+/*
+ * GNU Social - a federating social network
+ * Copyright (C) 2015, Free Software Foundation, 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/>.
+ */
+
+if (!defined('GNUSOCIAL')) { exit(1); }
+
+/**
+ * Diaspora federation protocol plugin for GNU Social
+ *
+ * Depends on:
+ * - OStatus plugin
+ * - WebFinger plugin
+ *
+ * @package ProtocolDiasporaPlugin
+ * @maintainer Mikael Nordfeldth <mmn@hethane.se>
+ */
+
+class DiasporaPlugin extends Plugin
+{
+ const REL_SEED_LOCATION = 'http://joindiaspora.com/seed_location';
+ const REL_GUID = 'http://joindiaspora.com/guid';
+ const REL_PUBLIC_KEY = 'diaspora-public-key';
+
+ public function onEndAttachPubkeyToUserXRD(Magicsig $magicsig, XML_XRD $xrd, Profile $target)
+ {
+ // So far we've only handled RSA keys, but it can change in the future,
+ // so be prepared. And remember to change the statically assigned type attribute below!
+ assert($magicsig->publicKey instanceof Crypt_RSA);
+ $xrd->links[] = new XML_XRD_Element_Link(self::REL_PUBLIC_KEY,
+ base64_encode($magicsig->exportPublicKey()), 'RSA');
+
+ // Instead of choosing a random string, we calculate our GUID from the public key
+ // by fingerprint through a sha256 hash.
+ $xrd->links[] = new XML_XRD_Element_Link(self::REL_GUID,
+ strtolower($magicsig->toFingerprint()));
+ }
+
+ public function onPluginVersion(array &$versions)
+ {
+ $versions[] = array('name' => 'Diaspora',
+ 'version' => '0.1',
+ 'author' => 'Mikael Nordfeldth',
+ 'homepage' => 'https://gnu.io/social',
+ // TRANS: Plugin description.
+ 'rawdescription' => _m('Follow people across social networks that implement '.
+ 'the <a href="https://diasporafoundation.org/">Diaspora</a> federation protocol.'));
+
+ return true;
+ }
+}
/**
* plugin details
*/
- function onPluginVersion(&$versions){
+ function onPluginVersion(array &$versions){
$url = 'http://status.net/wiki/Plugin:DirectionDetector';
$versions[] = array(
/*
* Version info
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array(
'name' => 'Directory',
return false;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'DiskCache',
'version' => GNUSOCIAL_VERSION,
return null;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'DomainStatusNetwork',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'DomainWhitelist',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Email Authentication',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'EmailRegistration',
'version' => GNUSOCIAL_VERSION,
* @param type $versions
* @return type
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array(
'name' => 'EmailReminder',
*
* @return boolean hook value; true means continue processing, false means stop.
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'EmailSummary',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Event',
'version' => GNUSOCIAL_VERSION,
*/
class ExtendedProfilePlugin extends Plugin
{
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array(
'name' => 'ExtendedProfile',
*
* @param array &$versions plugin version descriptions
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array(
'name' => 'Facebook Bridge',
return true;
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'FeedPoller',
'version' => GNUSOCIAL_VERSION,
$this->firephp->fb($msg, $fp_priority);
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'FirePHP',
'version' => GNUSOCIAL_VERSION,
* @return boolean hook value
*
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'FollowEveryone',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$url = 'http://status.net/wiki/Plugin:ForceGroup';
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'GeoURL',
'version' => GNUSOCIAL_VERSION,
return $document->geoname;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Geonames',
'version' => GNUSOCIAL_VERSION,
$action->inlineScript($js);
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'GoogleAnalytics',
'version' => self::VERSION,
return $url;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Gravatar',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'GroupPrivateMessage',
'version' => GNUSOCIAL_VERSION,
return getimagesize($outpath); // Verify that we wrote an understandable image.
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'ImageMagick',
'version' => GNUSOCIAL_VERSION,
$classes[] = new ImapManager($this);
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'IMAP',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean true
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$url = 'http://status.net/wiki/Plugin:InProcessCache';
$disco->registerMethod('LRDDMethod_LinkHTML');
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'LRDD',
'version' => GNUSOCIAL_VERSION,
return common_nicknamize($nickname);
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'LDAP Authentication',
'version' => GNUSOCIAL_VERSION,
return false;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'LDAP Authorization',
'version' => GNUSOCIAL_VERSION,
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => sprintf('LilUrl (%s)', $this->shortenerName),
'version' => GNUSOCIAL_VERSION,
*/
class LinkPreviewPlugin extends Plugin
{
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'LinkPreview',
'version' => GNUSOCIAL_VERSION,
return LINKBACKPLUGIN_VERSION;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Linkback',
'version' => LINKBACKPLUGIN_VERSION,
public $priority = array(); // override by priority: array(LOG_ERR => true, LOG_DEBUG => false)
public $regex = array(); // override by regex match of message: array('/twitter/i' => false)
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'LogFilter',
'version' => GNUSOCIAL_VERSION,
$action->elementEnd('div');
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Mapstraction',
'version' => self::VERSION,
return $out;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Memcache',
'version' => GNUSOCIAL_VERSION,
return $flag;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Memcached',
'version' => GNUSOCIAL_VERSION,
return implode('-', $path);
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Meteor',
'version' => GNUSOCIAL_VERSION,
return Minify_CSS::minify($code,$options);
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Minify',
'version' => GNUSOCIAL_VERSION,
class WAP20Plugin extends Plugin
{
- function onStartShowHTML($action)
+ function onStartShowHTML(Action $action)
{
}
return $proto.'://'.$serverpart.'/'.$pathpart.$relative;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'MobileProfile',
'version' => GNUSOCIAL_VERSION,
{
static $rights = array(Right::SILENCEUSER, Right::TRAINSPAM, Right::REVIEWSPAM);
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'ModHelper',
'version' => GNUSOCIAL_VERSION,
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'ModLog',
'version' => GNUSOCIAL_VERSION,
*/
class ModPlusPlugin extends Plugin
{
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'ModPlus',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$url = 'http://status.net/wiki/Plugin:NoticeTitle';
--- /dev/null
+StartAttachPubkeyToUserXRD: Runs only for XRD generation where a Magicsig exists for a Profile which is a "person".
+@param Magicsig $magicsig crypto stuff related to the profile we're representing
+@param XRD $xrd the XRD object which holds all data for the profile we're representing
+
+EndAttachPubkeyToUserXRD: Runs only for XRD generation where a Magicsig exists for a Profile which is a "person". And only if StartAttachPubkeyToUserXRD didn't abort.
+@param Magicsig $magicsig crypto stuff related to the profile we're representing
+@param XRD $xrd the XRD object which holds all data for the profile we're representing
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/phpseclib');
-class FeedSubException extends Exception
-{
- function __construct($msg=null)
- {
- $type = get_class($this);
- if ($msg) {
- parent::__construct("$type: $msg");
- } else {
- parent::__construct($type);
- }
- }
-}
-
class OStatusPlugin extends Plugin
{
/**
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'OStatus',
'version' => GNUSOCIAL_VERSION,
$magicsig = Magicsig::generate($target->getUser());
}
- if ($magicsig instanceof Magicsig) {
+ if (!$magicsig instanceof Magicsig) {
+ return false; // value doesn't mean anything, just figured I'd indicate this function didn't do anything
+ }
+ if (Event::handle('StartAttachPubkeyToUserXRD', array($magicsig, $xrd, $target))) {
$xrd->links[] = new XML_XRD_Element_Link(Magicsig::PUBLICKEYREL,
'data:application/magic-public-key,'. $magicsig->toString());
- $xrd->links[] = new XML_XRD_Element_Link(Magicsig::DIASPORA_PUBLICKEYREL,
- base64_encode($magicsig->exportPublicKey()));
+ // The following event handles plugins like Diaspora which add their own version of the Magicsig pubkey
+ Event::handle('EndAttachPubkeyToUserXRD', array($magicsig, $xrd, $target));
}
}
class Magicsig extends Managed_DataObject
{
const PUBLICKEYREL = 'magic-public-key';
- const DIASPORA_PUBLICKEYREL = 'diaspora-public-key';
const DEFAULT_KEYLEN = 1024;
const DEFAULT_SIGALG = 'RSA-SHA256';
* @param boolean $full_pair set to true to include the private key.
* @return string
*/
- public function toString($full_pair=false)
+ public function toString($full_pair=false, $base64url=true)
{
- $mod = Magicsig::base64_url_encode($this->publicKey->modulus->toBytes());
- $exp = Magicsig::base64_url_encode($this->publicKey->exponent->toBytes());
+ $base64_func = $base64url ? 'Magicsig::base64_url_encode' : 'base64_encode';
+ $mod = call_user_func($base64_func, $this->publicKey->modulus->toBytes());
+ $exp = call_user_func($base64_func, $this->publicKey->exponent->toBytes());
+
$private_exp = '';
if ($full_pair && $this->privateKey instanceof Crypt_RSA && $this->privateKey->exponent->toBytes()) {
- $private_exp = '.' . Magicsig::base64_url_encode($this->privateKey->exponent->toBytes());
+ $private_exp = '.' . call_user_func($base64_func, $this->privateKey->exponent->toBytes());
}
return 'RSA.' . $mod . '.' . $exp . $private_exp;
}
+ public function toFingerprint()
+ {
+ // This assumes a specific behaviour from toString, to format as such:
+ // "RSA." + base64(pubkey.modulus_as_bytes) + "." + base64(pubkey.exponent_as_bytes)
+ // We don't want the base64 string to be the "url encoding" version because it is not
+ // as common in programming libraries. And we want it to be base64 encoded since ASCII
+ // representation avoids any problems with NULL etc. in less forgiving languages and also
+ // just easier to debug...
+ return strtolower(hash('sha256', $this->toString(false, false)));
+ }
+
public function exportPublicKey($format=CRYPT_RSA_PUBLIC_FORMAT_PKCS1)
{
$this->publicKey->setPublicKey();
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-if (!defined('STATUSNET')) {
- exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
/**
* @package OStatusPlugin
- * @maintainer Brion Vibber <brion@status.net>
+ * @author Brion Vibber <brion@status.net>
+ * @maintainer Mikael Nordfeldth <mmn@hethane.se>
*/
class Ostatus_profile extends Managed_DataObject
{
throw new Exception(_m('Not a valid webfinger address.'));
}
- $hints = array('webfinger' => $addr);
-
- $dhints = DiscoveryHints::fromXRD($xrd);
-
- $hints = array_merge($hints, $dhints);
+ $hints = array_merge(array('webfinger' => $addr),
+ DiscoveryHints::fromXRD($xrd));
// If there's an Hcard, let's grab its info
if (array_key_exists('hcard', $hints)) {
--- /dev/null
+<?php
+class FeedSubException extends Exception
+{
+ function __construct($msg=null)
+ {
+ $type = get_class($this);
+ if ($msg) {
+ parent::__construct("$type: $msg");
+ } else {
+ parent::__construct($type);
+ }
+ }
+}
common_log(LOG_ERR, "Salmon post to $endpoint_uri failed: " . $e->getMessage());
return false;
}
- if ($response->getStatus() != 200) {
+
+ // Diaspora wants a slightly different formatting on the POST (other Content-type, so body needs "xml=")
+ if ($response->getStatus() === 422) {
+ common_debug(sprintf('Salmon (from profile %d) endpoint %s returned status %s. Diaspora? Will try again! Body: %s',
+ $user->id, $endpoint_uri, $response->getStatus(), $response->getBody()));
+ $headers = array('Content-Type: application/x-www-form-urlencoded');
+ $client->setBody('xml=' . Magicsig::base64_url_encode($envxml));
+ $response = $client->post($endpoint_uri, $headers);
+ }
+
+ // 200 OK is the best response
+ // 202 Accepted is what we get from Diaspora for example
+ if (!in_array($response->getStatus(), array(200, 202))) {
common_log(LOG_ERR, sprintf('Salmon (from profile %d) endpoint %s returned status %s: %s',
$user->id, $endpoint_uri, $response->getStatus(), $response->getBody()));
return false;
parent::prepare($args);
- if (!isset($_SERVER['CONTENT_TYPE']) || $_SERVER['CONTENT_TYPE'] != 'application/magic-envelope+xml') {
- // TRANS: Client error. Do not translate "application/magic-envelope+xml".
- $this->clientError(_m('Salmon requires "application/magic-envelope+xml".'));
+ if (!isset($_SERVER['CONTENT_TYPE'])) {
+ // TRANS: Client error. Do not translate "Content-type"
+ $this->clientError(_m('Salmon requires a Content-type header.'));
+ }
+ $envxml = null;
+ switch ($_SERVER['CONTENT_TYPE']) {
+ case 'application/magic-envelope+xml':
+ $envxml = file_get_contents('php://input');
+ break;
+ case 'application/x-www-form-urlencoded':
+ $envxml = Magicsig::base64_url_decode($this->trimmed('xml'));
+ break;
+ default:
+ // TRANS: Client error. Do not translate the quoted "application/[type]" strings.
+ $this->clientError(_m('Salmon requires "application/magic-envelope+xml". For Diaspora we also accept "application/x-www-form-urlencoded" with an "xml" parameter.', 415));
}
try {
- $envxml = file_get_contents('php://input');
+ if (empty($envxml)) {
+ throw new ClientException('No magic envelope supplied in POST.');
+ }
$magic_env = new MagicEnvelope($envxml); // parse incoming XML as a MagicEnvelope
$entry = $magic_env->getPayload(); // Not cryptographically verified yet!
print "Re-running feed discovery for profile URL $oprofile->uri\n";
// @fixme will bork where the URI isn't the profile URL for now
$discover = new FeedDiscovery();
-$feedurl = $discover->discoverFromURL($oprofile->uri);
+try {
+ $feedurl = $discover->discoverFromURL($oprofile->uri);
+ $salmonuri = $discover->getAtomLink(Salmon::REL_SALMON)
+ ?: $discover->getAtomLink(Salmon::NS_REPLIES); // NS_REPLIES is deprecated
+} catch (FeedSubException $e) {
+ $acct = $oprofile->localProfile()->getAcctUri();
+ print "Could not discover feeds HTML response, trying reconstructed acct URI: " . $acct;
+ $disco = new Discovery();
+ $xrd = $disco->lookup($acct);
+ $hints = DiscoveryHints::fromXRD($xrd);
+
+ if (!array_key_exists('feedurl', $hints)) {
+ throw new FeedSubNoFeedException($acct);
+ }
+ $feedurl = $hints['feedurl'];
+ $salmonuri = array_key_exists('salmon', $hints) ? $hints['salmon'] : null;
+
+ // get the hub data too and put it in the FeedDiscovery object
+ $discover->discoverFromFeedUrl($feedurl);
+}
+
$huburi = $discover->getHubLink();
-$salmonuri = $discover->getAtomLink(Salmon::REL_SALMON)
- ?: $discover->getAtomLink(Salmon::NS_REPLIES);
print " Feed URL: $feedurl\n";
print " Hub URL: $huburi\n";
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'OfflineBackup',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'OpenExternalLinkTarget',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'OpenID',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'OpenX',
'version' => GNUSOCIAL_VERSION,
return true;
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'OpportunisticQM',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Orbited',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'PiwikAnalytics',
'version' => GNUSOCIAL_VERSION,
*
* @return value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Poll',
'version' => self::VERSION,
}
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'PostDebug',
'version' => GNUSOCIAL_VERSION,
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => sprintf('PtitUrl (%s)', $this->shortenerName),
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array(
'name' => 'QnA',
* @return boolean hook value
*/
- function onStartOpenNoticeListItemElement($nli)
+ function onStartOpenNoticeListItemElement(NoticeListItem $nli)
{
$type = $nli->notice->object_type;
*
* @todo FIXME: WARNING WARNING WARNING this closes a 'div' that is implicitly opened in BookmarkPlugin's showNotice implementation
*/
- function onStartShowNoticeItem($nli)
+ function onStartShowNoticeItem(NoticeListItem $nli)
{
if (!$this->isMyNotice($nli->notice)) {
return true;
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'RSSCloud',
'version' => RSSCLOUDPLUGIN_VERSION,
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Recaptcha',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'RegisterThrottle',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] =
array('name' => 'Require Validated Email',
return User::register($registration_data);
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Reverse Username Authentication',
'version' => GNUSOCIAL_VERSION,
{
private $recursionGuard = false;
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'SQLProfile',
'version' => GNUSOCIAL_VERSION,
protected $queryTimes = array();
protected $queries = array();
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'SQLStats',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Sample',
'version' => GNUSOCIAL_VERSION,
*
* @return value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'SearchSub',
'version' => self::VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$url = 'http://status.net/wiki/Plugin:ShareNotice';
return $this->http_get(sprintf($this->serviceUrl,urlencode($url)));
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => sprintf('SimpleUrl (%s)', $this->shortenerName),
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$url = 'http://status.net/wiki/Plugin:Sitemap';
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$url = 'http://status.net/wiki/Plugin:SlicedFavorites';
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$url = 'http://status.net/wiki/Plugin:SphinxSearch';
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'StrictTransportSecurity',
'version' => GNUSOCIAL_VERSION,
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'SubMirror',
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'SubscriptionThrottle',
'version' => GNUSOCIAL_VERSION,
$action->script($this->path('tabfocus.js'));
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'TabFocus',
'version' => GNUSOCIAL_VERSION,
*
* @return value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'TagSub',
'version' => self::VERSION,
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => sprintf('TightUrl (%s)', $this->shortenerName),
'version' => GNUSOCIAL_VERSION,
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array(
'name' => 'TwitterBridge',
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$url = 'http://status.net/wiki/Plugin:UserFlag';
}
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'UserLimit',
'version' => GNUSOCIAL_VERSION,
return false;
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'Video Thumbnails',
'version' => GNUSOCIAL_VERSION,
}
}
- public function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'WebFinger',
'version' => GNUSOCIAL_VERSION,
return true;
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'WikiHashtags',
'version' => self::VERSION,
*/
class WikiHowProfilePlugin extends Plugin
{
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'WikiHow avatar fetcher',
'version' => GNUSOCIAL_VERSION,
}
- function onPluginVersion(&$versions)
+ function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'XMPP',
'version' => GNUSOCIAL_VERSION,
.mark-top {
border-top: 1px solid #ccc;
+ padding-top: 5px;
}
#realtime_actions {
position: relative !important;
right: -4px !important;
+ top: -65px !important;
float: right;
padding-top: 15px;
margin-bottom: -8px !important;
#realtime_actions {
padding-top: 0px !important;
+ top: -25px !important;
}
#realtime_actions button {