Merge branch '0.9.x' into 1.0.x
This commit is contained in:
@@ -49,32 +49,26 @@ class BlacklistPlugin extends Plugin
|
||||
public $urls = array();
|
||||
public $canAdmin = true;
|
||||
|
||||
private $_nicknamePatterns = array();
|
||||
private $_urlPatterns = array();
|
||||
|
||||
/**
|
||||
* Initialize the plugin
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function initialize()
|
||||
function _getNicknamePatterns()
|
||||
{
|
||||
$confNicknames = $this->_configArray('blacklist', 'nicknames');
|
||||
|
||||
$dbNicknames = Nickname_blacklist::getPatterns();
|
||||
|
||||
$this->_nicknamePatterns = array_merge($this->nicknames,
|
||||
$confNicknames,
|
||||
$dbNicknames);
|
||||
return array_merge($this->nicknames,
|
||||
$confNicknames,
|
||||
$dbNicknames);
|
||||
}
|
||||
|
||||
function _getUrlPatterns()
|
||||
{
|
||||
$confURLs = $this->_configArray('blacklist', 'urls');
|
||||
|
||||
$dbURLs = Homepage_blacklist::getPatterns();
|
||||
|
||||
$this->_urlPatterns = array_merge($this->urls,
|
||||
$confURLs,
|
||||
$dbURLs);
|
||||
return array_merge($this->urls,
|
||||
$confURLs,
|
||||
$dbURLs);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -265,8 +259,9 @@ class BlacklistPlugin extends Plugin
|
||||
|
||||
private function _checkUrl($url)
|
||||
{
|
||||
foreach ($this->_urlPatterns as $pattern) {
|
||||
common_debug("Checking $url against $pattern");
|
||||
$patterns = $this->_getUrlPatterns();
|
||||
|
||||
foreach ($patterns as $pattern) {
|
||||
if (preg_match("/$pattern/", $url)) {
|
||||
return false;
|
||||
}
|
||||
@@ -287,8 +282,9 @@ class BlacklistPlugin extends Plugin
|
||||
|
||||
private function _checkNickname($nickname)
|
||||
{
|
||||
foreach ($this->_nicknamePatterns as $pattern) {
|
||||
common_debug("Checking $nickname against $pattern");
|
||||
$patterns = $this->_getNicknamePatterns();
|
||||
|
||||
foreach ($patterns as $pattern) {
|
||||
if (preg_match("/$pattern/", $nickname)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -102,7 +102,8 @@ class OStatusPlugin extends Plugin
|
||||
*/
|
||||
function onStartEnqueueNotice($notice, &$transports)
|
||||
{
|
||||
$transports[] = 'ostatus';
|
||||
// put our transport first, in case there's any conflict (like OMB)
|
||||
array_unshift($transports, 'ostatus');
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -129,11 +129,11 @@ class Magicsig extends Memcached_DataObject
|
||||
|
||||
public function toString($full_pair = true)
|
||||
{
|
||||
$mod = base64_url_encode($this->publicKey->modulus->toBytes());
|
||||
$exp = base64_url_encode($this->publicKey->exponent->toBytes());
|
||||
$mod = Magicsig::base64_url_encode($this->publicKey->modulus->toBytes());
|
||||
$exp = Magicsig::base64_url_encode($this->publicKey->exponent->toBytes());
|
||||
$private_exp = '';
|
||||
if ($full_pair && $this->privateKey->exponent->toBytes()) {
|
||||
$private_exp = '.' . base64_url_encode($this->privateKey->exponent->toBytes());
|
||||
$private_exp = '.' . Magicsig::base64_url_encode($this->privateKey->exponent->toBytes());
|
||||
}
|
||||
|
||||
return 'RSA.' . $mod . '.' . $exp . $private_exp;
|
||||
@@ -174,9 +174,9 @@ class Magicsig extends Memcached_DataObject
|
||||
$rsa = new Crypt_RSA();
|
||||
$rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1;
|
||||
$rsa->setHash('sha256');
|
||||
$rsa->modulus = new Math_BigInteger(base64_url_decode($mod), 256);
|
||||
$rsa->modulus = new Math_BigInteger(Magicsig::base64_url_decode($mod), 256);
|
||||
$rsa->k = strlen($rsa->modulus->toBytes());
|
||||
$rsa->exponent = new Math_BigInteger(base64_url_decode($exp), 256);
|
||||
$rsa->exponent = new Math_BigInteger(Magicsig::base64_url_decode($exp), 256);
|
||||
|
||||
if ($type == 'private') {
|
||||
$this->privateKey = $rsa;
|
||||
@@ -203,23 +203,25 @@ class Magicsig extends Memcached_DataObject
|
||||
public function sign($bytes)
|
||||
{
|
||||
$sig = $this->privateKey->sign($bytes);
|
||||
return base64_url_encode($sig);
|
||||
return Magicsig::base64_url_encode($sig);
|
||||
}
|
||||
|
||||
public function verify($signed_bytes, $signature)
|
||||
{
|
||||
$signature = base64_url_decode($signature);
|
||||
$signature = Magicsig::base64_url_decode($signature);
|
||||
return $this->publicKey->verify($signed_bytes, $signature);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static function base64_url_encode($input)
|
||||
{
|
||||
return strtr(base64_encode($input), '+/', '-_');
|
||||
}
|
||||
|
||||
public static function base64_url_decode($input)
|
||||
{
|
||||
return base64_decode(strtr($input, '-_', '+/'));
|
||||
}
|
||||
}
|
||||
|
||||
function base64_url_encode($input)
|
||||
{
|
||||
return strtr(base64_encode($input), '+/', '-_');
|
||||
}
|
||||
|
||||
function base64_url_decode($input)
|
||||
{
|
||||
return base64_decode(strtr($input, '-_', '+/'));
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ class MagicEnvelope
|
||||
public function signMessage($text, $mimetype, $keypair)
|
||||
{
|
||||
$signature_alg = Magicsig::fromString($keypair);
|
||||
$armored_text = base64_url_encode($text);
|
||||
$armored_text = Magicsig::base64_url_encode($text);
|
||||
|
||||
return array(
|
||||
'data' => $armored_text,
|
||||
@@ -121,7 +121,7 @@ class MagicEnvelope
|
||||
public function unfold($env)
|
||||
{
|
||||
$dom = new DOMDocument();
|
||||
$dom->loadXML(base64_url_decode($env['data']));
|
||||
$dom->loadXML(Magicsig::base64_url_decode($env['data']));
|
||||
|
||||
if ($dom->documentElement->tagName != 'entry') {
|
||||
return false;
|
||||
@@ -178,7 +178,7 @@ class MagicEnvelope
|
||||
return false;
|
||||
}
|
||||
|
||||
$text = base64_url_decode($env['data']);
|
||||
$text = Magicsig::base64_url_decode($env['data']);
|
||||
$signer_uri = $this->getAuthor($text);
|
||||
|
||||
try {
|
||||
|
||||
@@ -130,7 +130,7 @@ RealtimeUpdate = {
|
||||
user = data['user'];
|
||||
html = data['html'].replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/&/g,'&');
|
||||
source = data['source'].replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/&/g,'&');
|
||||
console.log(data);
|
||||
|
||||
ni = "<li class=\"hentry notice\" id=\"notice-"+unique+"\">"+
|
||||
"<div class=\"entry-title\">"+
|
||||
"<span class=\"vcard author\">"+
|
||||
|
||||
@@ -44,10 +44,17 @@ require_once INSTALLDIR . '/plugins/TwitterBridge/twitterbasicauthclient.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php';
|
||||
|
||||
/**
|
||||
* Fetcher for statuses from Twitter
|
||||
* Fetch statuses from Twitter
|
||||
*
|
||||
* Fetches statuses from Twitter and inserts them as notices in local
|
||||
* system.
|
||||
* Fetches statuses from Twitter and inserts them as notices
|
||||
*
|
||||
* NOTE: an Avatar path MUST be set in config.php for this
|
||||
* script to work, e.g.:
|
||||
* $config['avatar']['path'] = $config['site']['path'] . '/avatar/';
|
||||
*
|
||||
* @todo @fixme @gar Fix the above. For some reason $_path is always empty when
|
||||
* this script is run, so the default avatar path is always set wrong in
|
||||
* default.php. Therefore it must be set explicitly in config.php. --Z
|
||||
*
|
||||
* @category Twitter
|
||||
* @package StatusNet
|
||||
@@ -57,9 +64,6 @@ require_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php';
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
// NOTE: an Avatar path MUST be set in config.php for this
|
||||
// script to work: e.g.: $config['avatar']['path'] = '/statusnet/avatar';
|
||||
|
||||
class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
{
|
||||
/**
|
||||
@@ -195,6 +199,8 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
return;
|
||||
}
|
||||
|
||||
common_debug(LOG_INFO, $this->name() . ' - Retrieved ' . sizeof($timeline) . ' statuses from Twitter.');
|
||||
|
||||
// Reverse to preserve order
|
||||
|
||||
foreach (array_reverse($timeline) as $status) {
|
||||
@@ -209,13 +215,7 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
continue;
|
||||
}
|
||||
|
||||
$notice = null;
|
||||
|
||||
$notice = $this->saveStatus($status, $flink);
|
||||
|
||||
if (!empty($notice)) {
|
||||
common_broadcast_notice($notice);
|
||||
}
|
||||
$this->saveStatus($status, $flink);
|
||||
}
|
||||
|
||||
// Okay, record the time we synced with Twitter for posterity
|
||||
@@ -226,50 +226,77 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
|
||||
function saveStatus($status, $flink)
|
||||
{
|
||||
$id = $this->ensureProfile($status->user);
|
||||
|
||||
$profile = Profile::staticGet($id);
|
||||
$profile = $this->ensureProfile($status->user);
|
||||
|
||||
if (empty($profile)) {
|
||||
common_log(LOG_ERR, $this->name() .
|
||||
' - Problem saving notice. No associated Profile.');
|
||||
return null;
|
||||
return;
|
||||
}
|
||||
|
||||
// XXX: change of screen name?
|
||||
|
||||
$uri = 'http://twitter.com/' . $status->user->screen_name .
|
||||
'/status/' . $status->id;
|
||||
$statusUri = 'http://twitter.com/'
|
||||
. $status->user->screen_name
|
||||
. '/status/'
|
||||
. $status->id;
|
||||
|
||||
// check to see if we've already imported the status
|
||||
|
||||
$notice = Notice::staticGet('uri', $uri);
|
||||
$dupe = $this->checkDupe($profile, $statusUri);
|
||||
|
||||
if (empty($notice)) {
|
||||
if (!empty($dupe)) {
|
||||
common_log(
|
||||
LOG_INFO,
|
||||
$this->name() .
|
||||
" - Ignoring duplicate import: $statusUri"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// XXX: transaction here?
|
||||
$notice = new Notice();
|
||||
|
||||
$notice = new Notice();
|
||||
$notice->profile_id = $profile->id;
|
||||
$notice->uri = $statusUri;
|
||||
$notice->url = $statusUri;
|
||||
$notice->created = strftime(
|
||||
'%Y-%m-%d %H:%M:%S',
|
||||
strtotime($status->created_at)
|
||||
);
|
||||
|
||||
$notice->profile_id = $id;
|
||||
$notice->uri = $uri;
|
||||
$notice->created = strftime('%Y-%m-%d %H:%M:%S',
|
||||
strtotime($status->created_at));
|
||||
$notice->content = common_shorten_links($status->text); // XXX
|
||||
$notice->rendered = common_render_content($notice->content, $notice);
|
||||
$notice->source = 'twitter';
|
||||
$notice->reply_to = null; // XXX: lookup reply
|
||||
$notice->is_local = Notice::GATEWAY;
|
||||
$notice->source = 'twitter';
|
||||
$notice->reply_to = null;
|
||||
$notice->is_local = Notice::GATEWAY;
|
||||
|
||||
if (Event::handle('StartNoticeSave', array(&$notice))) {
|
||||
$notice->insert();
|
||||
Event::handle('EndNoticeSave', array($notice));
|
||||
$notice->content = common_shorten_links($status->text);
|
||||
$notice->rendered = common_render_content(
|
||||
$notice->content,
|
||||
$notice
|
||||
);
|
||||
|
||||
if (Event::handle('StartNoticeSave', array(&$notice))) {
|
||||
|
||||
$id = $notice->insert();
|
||||
|
||||
if (!$id) {
|
||||
common_log_db_error($notice, 'INSERT', __FILE__);
|
||||
common_log(LOG_ERR, $this->name() .
|
||||
' - Problem saving notice.');
|
||||
}
|
||||
|
||||
Event::handle('EndNoticeSave', array($notice));
|
||||
}
|
||||
|
||||
$orig = clone($notice);
|
||||
$conv = Conversation::create();
|
||||
|
||||
$notice->conversation = $conv->id;
|
||||
|
||||
if (!$notice->update($orig)) {
|
||||
common_log_db_error($notice, 'UPDATE', __FILE__);
|
||||
common_log(LOG_ERR, $this->name() .
|
||||
' - Problem saving notice.');
|
||||
}
|
||||
|
||||
Inbox::insertNotice($flink->user_id, $notice->id);
|
||||
|
||||
$notice->blowOnInsert();
|
||||
|
||||
return $notice;
|
||||
@@ -279,9 +306,10 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
* Look up a Profile by profileurl field. Profile::staticGet() was
|
||||
* not working consistently.
|
||||
*
|
||||
* @param string $url the profile url
|
||||
* @param string $nickname local nickname of the Twitter user
|
||||
* @param string $profileurl the profile url
|
||||
*
|
||||
* @return mixed the first profile with that url, or null
|
||||
* @return mixed value the first Profile with that url, or null
|
||||
*/
|
||||
|
||||
function getProfileByUrl($nickname, $profileurl)
|
||||
@@ -299,6 +327,30 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check to see if this Twitter status has already been imported
|
||||
*
|
||||
* @param Profile $profile Twitter user's local profile
|
||||
* @param string $statusUri URI of the status on Twitter
|
||||
*
|
||||
* @return mixed value a matching Notice or null
|
||||
*/
|
||||
|
||||
function checkDupe($profile, $statusUri)
|
||||
{
|
||||
$notice = new Notice();
|
||||
$notice->uri = $statusUri;
|
||||
$notice->profile_id = $profile->id;
|
||||
$notice->limit(1);
|
||||
|
||||
if ($notice->find()) {
|
||||
$notice->fetch();
|
||||
return $notice;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function ensureProfile($user)
|
||||
{
|
||||
// check to see if there's already a profile for this user
|
||||
@@ -313,7 +365,7 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
// Check to see if the user's Avatar has changed
|
||||
|
||||
$this->checkAvatar($user, $profile);
|
||||
return $profile->id;
|
||||
return $profile;
|
||||
|
||||
} else {
|
||||
|
||||
@@ -372,7 +424,7 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
|
||||
$this->saveAvatars($user, $id);
|
||||
|
||||
return $id;
|
||||
return $profile;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -403,7 +455,6 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
|
||||
$this->updateAvatars($twitter_user, $profile);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function updateAvatars($twitter_user, $profile) {
|
||||
@@ -428,17 +479,13 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
||||
}
|
||||
|
||||
function missingAvatarFile($profile) {
|
||||
|
||||
foreach (array(24, 48, 73) as $size) {
|
||||
|
||||
$filename = $profile->getAvatar($size)->filename;
|
||||
$avatarpath = Avatar::path($filename);
|
||||
|
||||
if (file_exists($avatarpath) == FALSE) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user