Merge branch 'master' of github.com:annando/friendica-addons

This commit is contained in:
Michael 2012-05-19 16:55:43 +02:00
commit dbaf0fd251
41 changed files with 856 additions and 216 deletions

Binary file not shown.

View File

@ -1,7 +1,7 @@
<?php
/**
* Name: blackout
* Description: Blackout your ~friendica node during a given period
* Description: Blackout your ~friendica node during a given period, requires PHP >= 5.3
* License: MIT
* Version: 1.0
* Author: Tobias Diekershoff <https://diekershoff.homeunix.net/friendika/~tobias>
@ -62,6 +62,10 @@ function blackout_redirect ($a, $b) {
if (local_user()) {
return true;
}
if (! (version_compare(PHP_VERSION, '5.3.0') >= 0))
return true;
// else...
$mystart = get_config('blackout','begindate');
$myend = get_config('blackout','enddate');

View File

@ -12,13 +12,13 @@ for a in $SUBDIRS; do
if [[ ! -f $TGZ ]]; then
echo "Building: " $TGZ
# git log $a > $a/$a.log
tar zcvf $TGZ $a
tar zcvf $TGZ --exclude=.[a-z]* $a
else
TOUCHED=`find $a -cnewer $TGZ`
if [[ -n $TOUCHED ]]; then
echo "Building: " $TGZ
# git log $a > $a/$a.log
tar zcvf $TGZ $a
tar zcvf $TGZ --exclude=.[a-z]* $a
fi
fi
done

Binary file not shown.

View File

@ -1,7 +1,7 @@
Installing the Friendica/Facebook connector
Detailed instructions how to use this plugin can be found at
https://github.com/friendica/friendica/wiki/How-to:-Friendica%E2%80%99s-Facebook-connector
the [How to: Friendica's Facebook Connector](https://github.com/friendica/friendica/wiki/How-to:-Friendica%E2%80%99s-Facebook-connector) page.
Vidoes and embeds will not be posted if there is no other content. Links
and images will be converted to a format suitable for the Facebook API and
@ -12,5 +12,4 @@ authenticate to your site to establish identity. We will address this
in a future release.
Info: please make sure that you understand all aspects due to Friendica's
default licence which is: MIT License (further info:
https://github.com/friendica/friendica/blob/master/LICENSE)
default licence which is: [MIT License](https://github.com/friendica/friendica/blob/master/LICENSE)

View File

@ -1,7 +1,7 @@
<?php
/**
* Name: Facebook Connector
* Version: 1.2
* Version: 1.3
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
* Tobias Hößl <https://github.com/CatoTH/>
*/
@ -33,6 +33,7 @@ define('FACEBOOK_MAXPOSTLEN', 63206);
define('FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL', 259200); // 3 days
define('FACEBOOK_DEFAULT_POLL_INTERVAL', 60); // given in minutes
define('FACEBOOK_MIN_POLL_INTERVAL', 5);
define('FACEBOOK_RTU_ERR_MAIL_AFTER_MINUTES', 180); // 3 hours
require_once('include/security.php');
@ -331,6 +332,14 @@ function fb_get_friends_sync_parsecontact($uid, $contact) {
$contact_id = $r[0]['id'];
$g = q("select def_gid from user where uid = %d limit 1",
intval($uid)
);
if($g && intval($g[0]['def_gid'])) {
require_once('include/group.php');
group_add_member($uid,'',$contact_id,$g[0]['def_gid']);
}
require_once("Photo.php");
$photos = import_profile_photo($r[0]['photo'],$uid,$contact_id);
@ -429,6 +438,10 @@ function facebook_post(&$a) {
$uid = local_user();
if($uid){
$fb_limited = get_config('facebook','restrict');
$value = ((x($_POST,'post_by_default')) ? intval($_POST['post_by_default']) : 0);
set_pconfig($uid,'facebook','post_by_default', $value);
@ -444,7 +457,13 @@ function facebook_post(&$a) {
set_pconfig($uid,'facebook','blocked_apps',escape_tags(trim($_POST['blocked_apps'])));
$linkvalue = ((x($_POST,'facebook_linking')) ? intval($_POST['facebook_linking']) : 0);
set_pconfig($uid,'facebook','no_linking', (($linkvalue) ? 0 : 1));
if($fb_limited) {
if($linkvalue == 0)
set_pconfig($uid,'facebook','no_linking', 1);
}
else
set_pconfig($uid,'facebook','no_linking', (($linkvalue) ? 0 : 1));
// FB linkage was allowed but has just been turned off - remove all FB contacts and posts
@ -495,6 +514,9 @@ function facebook_content(&$a) {
info( t('Updating contacts') . EOL);
}
$fb_limited = get_config('facebook','restrict');
$o = '';
$fb_installed = false;
@ -516,7 +538,7 @@ function facebook_content(&$a) {
return '';
}
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'
. $a->get_baseurl() . '/addon/facebook/facebook.css' . '" media="all" />' . "\r\n";
$o .= '<h3>' . t('Facebook Connect') . '</h3>';
@ -548,6 +570,15 @@ function facebook_content(&$a) {
$no_linking = get_pconfig(local_user(),'facebook','no_linking');
$checked = (($no_linking) ? '' : ' checked="checked" ');
if($fb_limited) {
if($no_linking) {
$o .= EOL . '<strong>' . t('Facebook friend linking has been disabled on this site. The following settings will have no effect.') . '</strong>' . EOL;
$checked .= " disabled ";
}
else {
$o .= EOL . '<strong>' . t('Facebook friend linking has been disabled on this site. If you disable it, you will be unable to re-enable it.') . '</strong>' . EOL;
}
}
$o .= '<input type="checkbox" name="facebook_linking" value="1"' . $checked . '/>' . ' ' . t('Link all your Facebook friends and conversations on this website') . EOL ;
$o .= '<p>' . t('Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>.');
@ -592,7 +623,7 @@ function facebook_cron($a,$b) {
$poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
if($last) {
$next = $last + $poll_interval;
$next = $last + ($poll_interval * 60);
if($next > time())
return;
}
@ -643,8 +674,15 @@ function facebook_cron($a,$b) {
logger('facebook_cron: Successful', LOGGER_NORMAL);
else {
logger('facebook_cron: Failed', LOGGER_NORMAL);
if(strlen($a->config['admin_email']) && !get_config('facebook', 'realtime_err_mailsent')) {
$first_err = get_config('facebook', 'realtime_first_err');
if (!$first_err) {
$first_err = time();
set_config('facebook', 'realtime_first_err', $first_err);
}
$first_err_ago = (time() - $first_err);
if(strlen($a->config['admin_email']) && !get_config('facebook', 'realtime_err_mailsent') && $first_err_ago > (FACEBOOK_RTU_ERR_MAIL_AFTER_MINUTES * 60)) {
mail($a->config['admin_email'], t('Problems with Facebook Real-Time Updates'),
"Hi!\n\nThere's a problem with the Facebook Real-Time Updates that cannot be solved automatically. Maybe a permission issue?\n\nPlease try to re-activate it on " . $a->config["system"]["url"] . "/admin/plugins/facebook\n\nThis e-mail will only be sent once.",
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
@ -657,6 +695,7 @@ function facebook_cron($a,$b) {
}
} else { // !facebook_check_realtime_active()
del_config('facebook', 'realtime_err_mailsent');
del_config('facebook', 'realtime_first_err');
}
}
@ -693,6 +732,7 @@ function facebook_plugin_admin(&$a, &$o){
$appid = get_config('facebook', 'appid' );
$appsecret = get_config('facebook', 'appsecret' );
$poll_interval = get_config('facebook', 'poll_interval' );
$sync_comments = get_config('facebook', 'sync_comments' );
if (!$poll_interval) $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
$ret1 = q("SELECT `v` FROM `config` WHERE `cat` = 'facebook' AND `k` = 'appid' LIMIT 1");
@ -709,9 +749,10 @@ function facebook_plugin_admin(&$a, &$o){
} else $o .= t('The correctness of the API Key could not be detected. Somthing strange\'s going on.') . '<br>';
}
$o .= '<label for="fb_appid">' . t('App-ID / API-Key') . '</label><input name="appid" type="text" value="' . escape_tags($appid ? $appid : "") . '"><br style="clear: both;">';
$o .= '<label for="fb_appsecret">' . t('Application secret') . '</label><input name="appsecret" type="text" value="' . escape_tags($appsecret ? $appsecret : "") . '"><br style="clear: both;">';
$o .= '<label for="fb_poll_interval">' . sprintf(t('Polling Interval (min. %1$s minutes)'), FACEBOOK_MIN_POLL_INTERVAL) . '</label><input name="poll_interval" type="number" min="' . FACEBOOK_MIN_POLL_INTERVAL . '" value="' . $poll_interval . '"><br style="clear: both;">';
$o .= '<label for="fb_appid">' . t('App-ID / API-Key') . '</label><input id="fb_appid" name="appid" type="text" value="' . escape_tags($appid ? $appid : "") . '"><br style="clear: both;">';
$o .= '<label for="fb_appsecret">' . t('Application secret') . '</label><input id="fb_appsecret" name="appsecret" type="text" value="' . escape_tags($appsecret ? $appsecret : "") . '"><br style="clear: both;">';
$o .= '<label for="fb_poll_interval">' . sprintf(t('Polling Interval in minutes (minimum %1$s minutes)'), FACEBOOK_MIN_POLL_INTERVAL) . '</label><input name="poll_interval" id="fb_poll_interval" type="number" min="' . FACEBOOK_MIN_POLL_INTERVAL . '" value="' . $poll_interval . '"><br style="clear: both;">';
$o .= '<label for="fb_sync_comments">' . t('Synchronize comments (no comments on Facebook are missed, at the cost of increased system load)') . '</label><input name="sync_comments" id="fb_sync_comments" type="checkbox" ' . ($sync_comments ? 'checked' : '') . '><br style="clear: both;">';
$o .= '<input type="submit" name="fb_save_keys" value="' . t('Save') . '">';
if ($working_connection) {
@ -729,9 +770,9 @@ function facebook_plugin_admin(&$a, &$o){
/**
* @param App $a
* @param null|object $o
*/
function facebook_plugin_admin_post(&$a, &$o){
function facebook_plugin_admin_post(&$a){
check_form_security_token_redirectOnErr('/admin/plugins/facebook', 'fbsave');
if (x($_REQUEST,'fb_save_keys')) {
@ -739,6 +780,7 @@ function facebook_plugin_admin_post(&$a, &$o){
set_config('facebook', 'appsecret', $_REQUEST['appsecret']);
$poll_interval = IntVal($_REQUEST['poll_interval']);
if ($poll_interval >= FACEBOOK_MIN_POLL_INTERVAL) set_config('facebook', 'poll_interval', $poll_interval);
set_config('facebook', 'sync_comments', (x($_REQUEST, 'sync_comments') ? 1 : 0));
del_config('facebook', 'app_access_token');
info(t('The new values have been saved.'));
}
@ -1361,6 +1403,219 @@ function fb_get_photo($uid,$link) {
return "";
}
/**
* @param App $a
* @param array $user
* @param array $self
* @param string $fb_id
* @param bool $wall
* @param array $orig_post
* @param object $cmnt
*/
function fb_consume_comment(&$a, &$user, &$self, $fb_id, $wall, &$orig_post, &$cmnt) {
if(! $orig_post)
return;
$top_item = $orig_post['id'];
$uid = IntVal($user[0]['uid']);
$r = q("SELECT * FROM `item` WHERE `uid` = %d AND ( `uri` = '%s' OR `extid` = '%s' ) LIMIT 1",
intval($uid),
dbesc('fb::' . $cmnt->id),
dbesc('fb::' . $cmnt->id)
);
if(count($r))
return;
$cmntdata = array();
$cmntdata['parent'] = $top_item;
$cmntdata['verb'] = ACTIVITY_POST;
$cmntdata['gravity'] = 6;
$cmntdata['uid'] = $uid;
$cmntdata['wall'] = (($wall) ? 1 : 0);
$cmntdata['uri'] = 'fb::' . $cmnt->id;
$cmntdata['parent-uri'] = $orig_post['uri'];
if($cmnt->from->id == $fb_id) {
$cmntdata['contact-id'] = $self[0]['id'];
}
else {
$r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d LIMIT 1",
dbesc($cmnt->from->id),
intval($uid)
);
if(count($r)) {
$cmntdata['contact-id'] = $r[0]['id'];
if($r[0]['blocked'] || $r[0]['readonly'])
return;
}
}
if(! x($cmntdata,'contact-id'))
$cmntdata['contact-id'] = $orig_post['contact-id'];
$cmntdata['app'] = 'facebook';
$cmntdata['created'] = datetime_convert('UTC','UTC',$cmnt->created_time);
$cmntdata['edited'] = datetime_convert('UTC','UTC',$cmnt->created_time);
$cmntdata['verb'] = ACTIVITY_POST;
$cmntdata['author-name'] = $cmnt->from->name;
$cmntdata['author-link'] = 'http://facebook.com/profile.php?id=' . $cmnt->from->id;
$cmntdata['author-avatar'] = 'https://graph.facebook.com/' . $cmnt->from->id . '/picture';
$cmntdata['body'] = $cmnt->message;
$item = item_store($cmntdata);
$myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0",
dbesc($orig_post['uri']),
intval($uid)
);
if(count($myconv)) {
$importer_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
foreach($myconv as $conv) {
// now if we find a match, it means we're in this conversation
if(! link_compare($conv['author-link'],$importer_url))
continue;
require_once('include/enotify.php');
$conv_parent = $conv['parent'];
notification(array(
'type' => NOTIFY_COMMENT,
'notify_flags' => $user[0]['notify-flags'],
'language' => $user[0]['language'],
'to_name' => $user[0]['username'],
'to_email' => $user[0]['email'],
'uid' => $user[0]['uid'],
'item' => $cmntdata,
'link' => $a->get_baseurl() . '/display/' . $user[0]['nickname'] . '/' . $item,
'source_name' => $cmntdata['author-name'],
'source_link' => $cmntdata['author-link'],
'source_photo' => $cmntdata['author-avatar'],
'verb' => ACTIVITY_POST,
'otype' => 'item',
'parent' => $conv_parent,
));
// only send one notification
break;
}
}
}
/**
* @param App $a
* @param array $user
* @param array $self
* @param string $fb_id
* @param bool $wall
* @param array $orig_post
* @param object $likes
*/
function fb_consume_like(&$a, &$user, &$self, $fb_id, $wall, &$orig_post, &$likes) {
$top_item = $orig_post['id'];
$uid = IntVal($user[0]['uid']);
if(! $orig_post)
return;
// If we posted the like locally, it will be found with our url, not the FB url.
$second_url = (($likes->id == $fb_id) ? $self[0]['url'] : 'http://facebook.com/profile.php?id=' . $likes->id);
$r = q("SELECT * FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `verb` = '%s'
AND ( `author-link` = '%s' OR `author-link` = '%s' ) LIMIT 1",
dbesc($orig_post['uri']),
intval($uid),
dbesc(ACTIVITY_LIKE),
dbesc('http://facebook.com/profile.php?id=' . $likes->id),
dbesc($second_url)
);
if(count($r))
return;
$likedata = array();
$likedata['parent'] = $top_item;
$likedata['verb'] = ACTIVITY_LIKE;
$likedata['gravity'] = 3;
$likedata['uid'] = $uid;
$likedata['wall'] = (($wall) ? 1 : 0);
$likedata['uri'] = item_new_uri($a->get_baseurl(), $uid);
$likedata['parent-uri'] = $orig_post['uri'];
if($likes->id == $fb_id)
$likedata['contact-id'] = $self[0]['id'];
else {
$r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
dbesc($likes->id),
intval($uid)
);
if(count($r))
$likedata['contact-id'] = $r[0]['id'];
}
if(! x($likedata,'contact-id'))
$likedata['contact-id'] = $orig_post['contact-id'];
$likedata['app'] = 'facebook';
$likedata['verb'] = ACTIVITY_LIKE;
$likedata['author-name'] = $likes->name;
$likedata['author-link'] = 'http://facebook.com/profile.php?id=' . $likes->id;
$likedata['author-avatar'] = 'https://graph.facebook.com/' . $likes->id . '/picture';
$author = '[url=' . $likedata['author-link'] . ']' . $likedata['author-name'] . '[/url]';
$objauthor = '[url=' . $orig_post['author-link'] . ']' . $orig_post['author-name'] . '[/url]';
$post_type = t('status');
$plink = '[url=' . $orig_post['plink'] . ']' . $post_type . '[/url]';
$likedata['object-type'] = ACTIVITY_OBJ_NOTE;
$likedata['body'] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
$likedata['object'] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' .
'<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . xmlify($orig_post['plink']) . '" />') . '</link><title>' . $orig_post['title'] . '</title><content>' . $orig_post['body'] . '</content></object>';
item_store($likedata);
}
/**
* @param App $a
* @param array $user
* @param object $entry
* @param array $self
* @param string $fb_id
* @param bool $wall
* @param array $orig_post
*/
function fb_consume_status(&$a, &$user, &$entry, &$self, $fb_id, $wall, &$orig_post) {
$uid = IntVal($user[0]['uid']);
$access_token = get_pconfig($uid, 'facebook', 'access_token');
$s = fetch_url('https://graph.facebook.com/' . $entry->id . '?access_token=' . $access_token);
if($s) {
$j = json_decode($s);
if (isset($j->comments) && isset($j->comments->data))
foreach ($j->comments->data as $cmnt)
fb_consume_comment($a, $user, $self, $fb_id, $wall, $orig_post, $cmnt);
if (isset($j->likes) && isset($j->likes->data) && isset($j->likes->count)) {
if (count($j->likes->data) == $j->likes->count) {
foreach ($j->likes->data as $likers) fb_consume_like($a, $user, $self, $fb_id, $wall, $orig_post, $likers);
} else {
$t = fetch_url('https://graph.facebook.com/' . $entry->id . '/likes?access_token=' . $access_token);
if ($t) {
$k = json_decode($t);
if (isset($k->data))
foreach ($k->data as $likers)
fb_consume_like($a, $user, $self, $fb_id, $wall, $orig_post, $likers);
}
}
}
}
}
/**
* @param int $uid
* @param object $j
@ -1370,7 +1625,6 @@ function fb_consume_stream($uid,$j,$wall = false) {
$a = get_app();
$user = q("SELECT * FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
intval($uid)
);
@ -1390,6 +1644,9 @@ function fb_consume_stream($uid,$j,$wall = false) {
$blocked_apps = get_pconfig($uid,'facebook','blocked_apps');
$blocked_apps_arr = explode(',',$blocked_apps);
$sync_comments = get_config('facebook', 'sync_comments');
/** @var string $self_id */
$self_id = get_pconfig($uid,'facebook','self_id');
if(! count($j->data) || (! strlen($self_id)))
return;
@ -1591,169 +1848,53 @@ function fb_consume_stream($uid,$j,$wall = false) {
}
}
/** @var array $orig_post */
$likers_num = (isset($entry->likes) && isset($entry->likes->count) ? IntVal($entry->likes->count) : 0 );
if(isset($entry->likes) && isset($entry->likes->data))
$likers = $entry->likes->data;
else
$likers = null;
$comments_num = (isset($entry->comments) && isset($entry->comments->count) ? IntVal($entry->comments->count) : 0 );
if(isset($entry->comments) && isset($entry->comments->data))
$comments = $entry->comments->data;
else
$comments = null;
if(is_array($likers)) {
foreach($likers as $likes) {
$needs_sync = false;
if(! $orig_post)
continue;
// If we posted the like locally, it will be found with our url, not the FB url.
$second_url = (($likes->id == $self_id) ? $self[0]['url'] : 'http://facebook.com/profile.php?id=' . $likes->id);
$r = q("SELECT * FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `verb` = '%s'
AND ( `author-link` = '%s' OR `author-link` = '%s' ) LIMIT 1",
dbesc($orig_post['uri']),
intval($uid),
dbesc(ACTIVITY_LIKE),
dbesc('http://facebook.com/profile.php?id=' . $likes->id),
dbesc($second_url)
);
if(count($r))
continue;
$likedata = array();
$likedata['parent'] = $top_item;
$likedata['verb'] = ACTIVITY_LIKE;
$likedata['gravity'] = 3;
$likedata['uid'] = $uid;
$likedata['wall'] = (($wall) ? 1 : 0);
$likedata['uri'] = item_new_uri($a->get_baseurl(), $uid);
$likedata['parent-uri'] = $orig_post['uri'];
if($likes->id == $self_id)
$likedata['contact-id'] = $self[0]['id'];
else {
$r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1",
dbesc($likes->id),
intval($uid)
);
if(count($r))
$likedata['contact-id'] = $r[0]['id'];
}
if(! x($likedata,'contact-id'))
$likedata['contact-id'] = $orig_post['contact-id'];
$likedata['app'] = 'facebook';
$likedata['verb'] = ACTIVITY_LIKE;
$likedata['author-name'] = $likes->name;
$likedata['author-link'] = 'http://facebook.com/profile.php?id=' . $likes->id;
$likedata['author-avatar'] = 'https://graph.facebook.com/' . $likes->id . '/picture';
$author = '[url=' . $likedata['author-link'] . ']' . $likedata['author-name'] . '[/url]';
$objauthor = '[url=' . $orig_post['author-link'] . ']' . $orig_post['author-name'] . '[/url]';
$post_type = t('status');
$plink = '[url=' . $orig_post['plink'] . ']' . $post_type . '[/url]';
$likedata['object-type'] = ACTIVITY_OBJ_NOTE;
$likedata['body'] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
$likedata['object'] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' .
'<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . xmlify($orig_post['plink']) . '" />') . '</link><title>' . $orig_post['title'] . '</title><content>' . $orig_post['body'] . '</content></object>';
item_store($likedata);
}
if(is_array($likers)) {
foreach($likers as $likes) fb_consume_like($a, $user, $self, $self_id, $wall, $orig_post, $likes);
if ($sync_comments) {
$r = q("SELECT COUNT(*) likes FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `verb` = '%s' AND `parent-uri` != `uri`",
dbesc($orig_post['uri']),
intval($uid),
dbesc(ACTIVITY_LIKE)
);
if ($r[0]['likes'] < $likers_num) {
logger('fb_consume_stream: missing likes found for ' . $orig_post['uri'] . ' (we have ' . $r[0]['likes'] . ' of ' . $likers_num . '). Synchronizing...', LOGGER_DEBUG);
$needs_sync = true;
}
}
}
if(is_array($comments)) {
foreach($comments as $cmnt) {
if(! $orig_post)
continue;
$r = q("SELECT * FROM `item` WHERE `uid` = %d AND ( `uri` = '%s' OR `extid` = '%s' ) LIMIT 1",
intval($uid),
dbesc('fb::' . $cmnt->id),
dbesc('fb::' . $cmnt->id)
);
if(count($r))
continue;
$cmntdata = array();
$cmntdata['parent'] = $top_item;
$cmntdata['verb'] = ACTIVITY_POST;
$cmntdata['gravity'] = 6;
$cmntdata['uid'] = $uid;
$cmntdata['wall'] = (($wall) ? 1 : 0);
$cmntdata['uri'] = 'fb::' . $cmnt->id;
$cmntdata['parent-uri'] = $orig_post['uri'];
if($cmnt->from->id == $self_id) {
$cmntdata['contact-id'] = $self[0]['id'];
}
else {
$r = q("SELECT * FROM `contact` WHERE `notify` = '%s' AND `uid` = %d LIMIT 1",
dbesc($cmnt->from->id),
intval($uid)
);
if(count($r)) {
$cmntdata['contact-id'] = $r[0]['id'];
if($r[0]['blocked'] || $r[0]['readonly'])
continue;
}
}
if(! x($cmntdata,'contact-id'))
$cmntdata['contact-id'] = $orig_post['contact-id'];
$cmntdata['app'] = 'facebook';
$cmntdata['created'] = datetime_convert('UTC','UTC',$cmnt->created_time);
$cmntdata['edited'] = datetime_convert('UTC','UTC',$cmnt->created_time);
$cmntdata['verb'] = ACTIVITY_POST;
$cmntdata['author-name'] = $cmnt->from->name;
$cmntdata['author-link'] = 'http://facebook.com/profile.php?id=' . $cmnt->from->id;
$cmntdata['author-avatar'] = 'https://graph.facebook.com/' . $cmnt->from->id . '/picture';
$cmntdata['body'] = $cmnt->message;
$item = item_store($cmntdata);
$myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 ",
dbesc($orig_post['uri']),
intval($uid)
);
if(count($myconv)) {
$importer_url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
foreach($myconv as $conv) {
// now if we find a match, it means we're in this conversation
if(! link_compare($conv['author-link'],$importer_url))
continue;
require_once('include/enotify.php');
$conv_parent = $conv['parent'];
notification(array(
'type' => NOTIFY_COMMENT,
'notify_flags' => $user[0]['notify-flags'],
'language' => $user[0]['language'],
'to_name' => $user[0]['username'],
'to_email' => $user[0]['email'],
'uid' => $user[0]['uid'],
'item' => $cmntdata,
'link' => $a->get_baseurl() . '/display/' . $user[0]['nickname'] . '/' . $item,
'source_name' => $cmntdata['author-name'],
'source_link' => $cmntdata['author-link'],
'source_photo' => $cmntdata['author-avatar'],
'verb' => ACTIVITY_POST,
'otype' => 'item',
'parent' => $conv_parent,
));
// only send one notification
break;
}
}
foreach($comments as $cmnt) fb_consume_comment($a, $user, $self, $self_id, $wall, $orig_post, $cmnt);
if ($sync_comments) {
$r = q("SELECT COUNT(*) comments FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `verb` = '%s' AND `parent-uri` != `uri`",
dbesc($orig_post['uri']),
intval($uid),
ACTIVITY_POST
);
if ($r[0]['comments'] < $comments_num) {
logger('fb_consume_stream: missing comments found for ' . $orig_post['uri'] . ' (we have ' . $r[0]['comments'] . ' of ' . $comments_num . '). Synchronizing...', LOGGER_DEBUG);
$needs_sync = true;
}
}
}
if ($needs_sync) fb_consume_status($a, $user, $entry, $self, $self_id, $wall, $orig_post);
}
}

BIN
facebook_restrict.tgz Normal file

Binary file not shown.

View File

@ -0,0 +1,18 @@
<?php
/**
* Name: Facebook Restrict
* Description: Install this addon and Facebook users will not be able to link friends. Existing users that are linking friends will not be affected.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
function facebook_restrict_install() {
set_config('facebook','restrict',1);
}
function facebook_restrict_uninstall() {
set_config('facebook','restrict',0);
}

Binary file not shown.

View File

@ -1,7 +1,7 @@
{{ inc field_input.tpl with $field=$owner }}{{ endinc }}
{{ inc field_input.tpl with $field=$ownerprofile }}{{ endinc }}
{{ inc field_input.tpl with $field=$postal }}{{ endinc }}
{{ inc field_input.tpl with $field=$notes }}{{ endinc }}
{{ inc field_textarea.tpl with $field=$postal }}{{ endinc }}
{{ inc field_textarea.tpl with $field=$notes }}{{ endinc }}
{{ inc field_input.tpl with $field=$email }}{{ endinc }}
{{ inc field_input.tpl with $field=$footer_text }}{{ endinc }}
{{ inc field_textarea.tpl with $field=$footer_text }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>

View File

@ -2,11 +2,13 @@
/**
* Name: Impressum
* Description: Plugin to add contact information to the about page (/friendica)
* Version: 1.1
* Version: 1.2
* Author: Tobias Diekershoff <http://diekershoff.homeunix.net/friendika/profile/tobias>
* License: 3-clause BSD license
*/
require_once('include/bbcode.php');
function impressum_install() {
register_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
register_hook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
@ -24,7 +26,7 @@ function obfuscate_email ($s) {
return $s;
}
function impressum_footer($a, &$b) {
$text = get_config('impressum','footer_text');
$text = bbcode(get_config('impressum','footer_text'), true);
if (! $text == '') {
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/impressum/impressum.css" media="all" />';
$b .= '<div id="impressum_footer">'.$text.'</div>';
@ -34,8 +36,8 @@ function impressum_show($a,&$b) {
$b .= '<h3>'.t('Impressum').'</h3>';
$owner = get_config('impressum', 'owner');
$owner_profile = get_config('impressum','ownerprofile');
$postal = get_config('impressum', 'postal');
$notes = get_config('impressum', 'notes');
$postal = bbcode(get_config('impressum', 'postal'), true);
$notes = bbcode(get_config('impressum', 'notes'), true);
$email = obfuscate_email( get_config('impressum','email') );
if (strlen($owner)) {
if (strlen($owner_profile)) {
@ -66,12 +68,12 @@ function impressum_plugin_admin_post (&$a) {
$notes = ((x($_POST, 'notes')) ? (trim($_POST['notes'])) : '');
$email = ((x($_POST, 'email')) ? notags(trim($_POST['email'])) : '');
$footer_text = ((x($_POST, 'footer_text')) ? (trim($_POST['footer_text'])) : '');
set_config('impressum','owner',$owner);
set_config('impressum','ownerprofile',$ownerprofile);
set_config('impressum','postal',$postal);
set_config('impressum','email',$email);
set_config('impressum','notes',$notes);
set_config('impressum','footer_text',$footer_text);
set_config('impressum','owner',strip_tags($owner));
set_config('impressum','ownerprofile',strip_tags($ownerprofile));
set_config('impressum','postal',strip_tags($postal));
set_config('impressum','email',strip_tags($email));
set_config('impressum','notes',strip_tags($notes));
set_config('impressum','footer_text',strip_tags($footer_text));
info( t('Settings updated.'). EOL );
}
function impressum_plugin_admin (&$a, &$o) {
@ -80,9 +82,9 @@ function impressum_plugin_admin (&$a, &$o) {
'$submit' => t('Submit'),
'$owner' => array('owner', t('Site Owner'), get_config('impressum','owner'), t('The page operators name.')),
'$ownerprofile' => array('ownerprofile', t('Site Owners Profile'), get_config('impressum','ownerprofile'), t('Profile address of the operator.')),
'$postal' => array('postal', t('Postal Address'), get_config('impressum','postal'), t('How to contact the operator via snail mail.')),
'$notes' => array('notes', t('Notes'), get_config('impressum','notes'), t('Additional notes that are displayed beneath the contact information.')),
'$postal' => array('postal', t('Postal Address'), get_config('impressum','postal'), t('How to contact the operator via snail mail. You can use BBCode here.')),
'$notes' => array('notes', t('Notes'), get_config('impressum','notes'), t('Additional notes that are displayed beneath the contact information. You can use BBCode here.')),
'$email' => array('email', t('Email Address'), get_config('impressum','email'), t('How to contact the operator via email. (will be displayed obfuscated)')),
'$footer_text' => array('footer_text', t('Footer note'), get_config('impressum','footer_text'), t('Text for the footer.')),
'$footer_text' => array('footer_text', t('Footer note'), get_config('impressum','footer_text'), t('Text for the footer. You can use BBCode here.')),
));
}

Binary file not shown.

BIN
nsfw.tgz

Binary file not shown.

View File

@ -94,7 +94,8 @@ function nsfw_prepare_body(&$a,&$b) {
$found = false;
if(count($arr)) {
foreach($arr as $word) {
if(! strlen(trim($word))) {
$word = trim($word);
if(! strlen($word)) {
continue;
}
if(strpos($word,'/') === 0) {

BIN
page.tgz

Binary file not shown.

View File

@ -24,7 +24,8 @@ function page_getpage($uid) {
$pagelist = array();
$contacts = q("SELECT `id`, `url`, `name`, `micro`FROM `contact`
WHERE `network`= 'dfrn' AND `forum` = 1 AND `uid` = %d",
WHERE `network`= 'dfrn' AND `forum` = 1 AND `uid` = %d
order by name asc ",
intval($uid)
);
@ -47,14 +48,28 @@ function page_page_end($a,&$b) {
<h3>'.t("Forums").'</h3></div>
<div id="sidebar-page-list"><ul>';
$contacts = page_getpage($a->user['uid']);
$total_shown = 0;
$more = false;
foreach($contacts as $contact) {
$page .= '<li style="list-style-type: none;" class="tool"><img height="20" width="20" src="' . $contact['micro'] .'" alt="' . $contact['url'] . '" /> <a href="'.$a->get_baseurl().'/redir/'.$contact["id"].'" title="' . $contact['url'] . '" class="label" target="external-link">'.
$contact["name"]."</a></li>";
$total_shown ++;
if($total_shown == 6) {
$more = true;
$page .= '</ul><div id="hide-comments-page-widget" class="fakelink" onclick="showHideComments(\'page-widget\');" >' . t('show more')
. '</div><div id="collapsed-comments-page-widget" style="display: none;" ><ul>';
}
}
if($more)
$page .= '</div>';
$page .= "</ul></div></div>";
if (sizeof($contacts) > 0)
$a->page['aside'] = $page . $a->page['aside'];
}
?>

BIN
pages.tgz

Binary file not shown.

Binary file not shown.

View File

@ -5,6 +5,7 @@
* Description: Post to Posterous accounts
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
* Author: Tony Baldwin <https://free-haven.org/u/tony>
*/
function posterous_install() {
@ -59,6 +60,8 @@ function posterous_settings(&$a,&$s) {
$pstr_username = get_pconfig(local_user(), 'posterous', 'posterous_username');
$pstr_password = get_pconfig(local_user(), 'posterous', 'posterous_password');
$pstr_site_id = get_pconfig(local_user(), 'posterous', 'posterous_site_id');
$pstr_api_token = get_pconfig(local_user(), 'posterous', 'posterous_api_token');
/* Add some HTML to the existing form */
@ -80,6 +83,16 @@ function posterous_settings(&$a,&$s) {
$s .= '<input id="posterous-password" type="password" name="posterous_password" value="' . $pstr_password . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="posterous-site_id-wrapper">';
$s .= '<label id="posterous-site_id-label" for="posterous-site_id">' . t('Posterous site ID') . '</label>';
$s .= '<input id="posterous-site_id" type="text" name="posterous_site_id" value="' . $pstr_site_id . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="posterous-api_token-wrapper">';
$s .= '<label id="posterous-api_token-label" for="posterous-api_token">' . t('Posterous API token') . '</label>';
$s .= '<input id="posterous-api_token" type="text" name="posterous_api_token" value="' . $pstr_api_token . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="posterous-bydefault-wrapper">';
$s .= '<label id="posterous-bydefault-label" for="posterous-bydefault">' . t('Post to Posterous by default') . '</label>';
$s .= '<input id="posterous-bydefault" type="checkbox" name="posterous_bydefault" value="1" ' . $def_checked . '/>';
@ -100,6 +113,8 @@ function posterous_settings_post(&$a,&$b) {
set_pconfig(local_user(),'posterous','post_by_default',intval($_POST['posterous_bydefault']));
set_pconfig(local_user(),'posterous','posterous_username',trim($_POST['posterous_username']));
set_pconfig(local_user(),'posterous','posterous_password',trim($_POST['posterous_password']));
set_pconfig(local_user(),'posterous','posterous_site_id',trim($_POST['posterous_site_id']));
set_pconfig(local_user(),'posterous','posterous_api_token',trim($_POST['posterous_api_token']));
}
@ -138,6 +153,9 @@ function posterous_post_local(&$a,&$b) {
function posterous_send(&$a,&$b) {
logger('posterous_send: invoked');
return;
if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
return;
@ -150,12 +168,13 @@ function posterous_send(&$a,&$b) {
$pstr_username = get_pconfig($b['uid'],'posterous','posterous_username');
$pstr_password = get_pconfig($b['uid'],'posterous','posterous_password');
$pstr_blog = 'http://www.posterous.com/api/write';
$pstr_site_id = get_pconfig($b['uid'],'posterous','posterous_site_id');
$pstr_blog = "http://posterous.com/api/2/sites/$pstr_site_id/posts";
$pstr_api_token = get_pconfig($b['uid'],'posterous','posterous_api_token');
if($pstr_username && $pstr_password && $pstr_blog) {
require_once('include/bbcode.php');
require_once('posterous-api.php');
$tag_arr = array();
$tags = '';
$x = preg_match_all('/\#\[(.*?)\](.*?)\[/',$b['tag'],$matches,PREG_SET_ORDER);
@ -170,18 +189,28 @@ function posterous_send(&$a,&$b) {
$params = array(
'title' => (($b['title']) ? $b['title'] : t('Post from Friendica')),
'type' => 'regular',
'autopost' => 1,
'source' => 'Friendica',
'is_private' => false,
'tags' => $tags,
'body' => bbcode($b['body'])
'post[title]' => (($b['title']) ? $b['title'] : t('Post from Friendica')),
'post[source]' => 'Friendica',
'post[tags]' => $tags,
'post[body]' => bbcode($b['body']),
'api_token' => $pstr_api_token,
'site_id' => $pstr_site_id
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $pstr_blog);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $pstr_username . ':' . $pstr_password);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$api = new PosterousAPI($pstr_username,$pstr_password);
$data = curl_exec($ch);
$result = curl_multi_getcontent($ch);
curl_close($ch);
$result = $api->newpost($params);
logger('posterous_send: ' . $result);
}
}

View File

@ -0,0 +1,4 @@
Once activated, this addon acs as a proxy between the user and external image resources.
If external images are to be shown, like avatars or embedded images, the server retrieves the image and the local link is sent to the user.
By using this proxy, the server hosting the original image cannot retrieve personal information of the user like the IP address, User Agent or Cookies.
However, the remote server will be able to track the IP address of the server hosting the friendica installation.

View File

@ -0,0 +1,175 @@
<?php
/**
* Name: Privacy Image Cache
* Version: 0.1
* Author: Tobias Hößl <https://github.com/CatoTH/>
*/
define("PRIVACY_IMAGE_CACHE_DEFAULT_TIME", 86400); // 1 Day
require_once('include/security.php');
function privacy_image_cache_install() {
register_hook('bbcode', 'addon/privacy_image_cache/privacy_image_cache.php', 'privacy_image_cache_bbcode_hook');
register_hook('display_item', 'addon/privacy_image_cache/privacy_image_cache.php', 'privacy_image_cache_display_item_hook');
register_hook('ping_xmlize', 'addon/privacy_image_cache/privacy_image_cache.php', 'privacy_image_cache_ping_xmlize_hook');
register_hook('cron', 'addon/privacy_image_cache/privacy_image_cache.php', 'privacy_image_cache_cron');
}
function privacy_image_cache_uninstall() {
unregister_hook('bbcode', 'addon/privacy_image_cache/privacy_image_cache.php', 'privacy_image_cache_bbcode_hook');
unregister_hook('display_item', 'addon/privacy_image_cache/privacy_image_cache.php', 'privacy_image_cache_display_item_hook');
unregister_hook('ping_xmlize', 'addon/privacy_image_cache/privacy_image_cache.php', 'privacy_image_cache_ping_xmlize_hook');
unregister_hook('cron', 'addon/privacy_image_cache/privacy_image_cache.php', 'privacy_image_cache_cron');
}
function privacy_image_cache_module() {}
function privacy_image_cache_init() {
$urlhash = 'pic:' . sha1($_REQUEST['url']);
$r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $urlhash );
if (count($r)) {
$img_str = $r[0]['data'];
}
else {
require_once("Photo.php");
$img_str = fetch_url($_REQUEST['url'],true);
$img = new Photo($img_str);
if($img->is_valid()) {
$img->store(0, 0, $urlhash, $_REQUEST['url'], '', 100);
$img_str = $img->imageString();
}
}
header("Content-type: image/jpeg");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + (3600*24)) . " GMT");
header("Cache-Control: max-age=" . (3600*24));
echo $img_str;
killme();
}
/**
* @param $url string
* @return boolean
*/
function privacy_image_cache_is_local_image($url) {
if ($url[0] == '/') return true;
$baseurl = get_app()->get_baseurl();
return (substr($url, 0, strlen($baseurl)) == $baseurl);
}
/**
* @param array $matches
* @return string
*/
function privacy_image_cache_img_cb($matches) {
if (privacy_image_cache_is_local_image($matches[2])) return $matches[2];
return $matches[1] . "/privacy_image_cache/?url=" . escape_tags(addslashes($matches[2])) . $matches[3];
}
/**
* @param App $a
* @param string $o
*/
function privacy_image_cache_bbcode_hook(&$a, &$o) {
$o = preg_replace_callback("/(<img [^>]*src *= *[\"'])([^\"']+)([\"'][^>]*>)/siU", "privacy_image_cache_img_cb", $o);
}
/**
* @param App $a
* @param string $o
*/
function privacy_image_cache_display_item_hook(&$a, &$o) {
if (isset($o["output"])) {
if (isset($o["output"]["thumb"]) && !privacy_image_cache_is_local_image($o["output"]["thumb"]))
$o["output"]["thumb"] = "/privacy_image_cache/?url=" . escape_tags(addslashes($o["output"]["thumb"]));
if (isset($o["output"]["author-avatar"]) && !privacy_image_cache_is_local_image($o["output"]["author-avatar"]))
$o["output"]["author-avatar"] = "/privacy_image_cache/?url=" . escape_tags(addslashes($o["output"]["author-avatar"]));
}
}
/**
* @param App $a
* @param string $o
*/
function privacy_image_cache_ping_xmlize_hook(&$a, &$o) {
if ($o["photo"] != "" && !privacy_image_cache_is_local_image($o["photo"]))
$o["photo"] = "/privacy_image_cache/?url=" . escape_tags(addslashes($o["photo"]));
}
/**
* @param App $a
* @param null|object $b
*/
function privacy_image_cache_cron(&$a = null, &$b = null) {
$cachetime = get_config('privacy_image_cache','cache_time');
if (!$cachetime) $cachetime = PRIVACY_IMAGE_CACHE_DEFAULT_TIME;
$last = get_config('pi_cache','last_delete');
$time = time();
if ($time < ($last + 3600)) return;
logger("Purging old Cache of the Privacy Image Cache", LOGGER_DEBUG);
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
set_config('pi_cache', 'last_delete', $time);
}
/**
* @param App $a
* @param null|object $o
*/
function privacy_image_cache_plugin_admin(&$a, &$o){
$o = '<input type="hidden" name="form_security_token" value="' . get_form_security_token("picsave") . '">';
$cachetime = get_config('privacy_image_cache','cache_time');
if (!$cachetime) $cachetime = PRIVACY_IMAGE_CACHE_DEFAULT_TIME;
$cachetime_h = Ceil($cachetime / 3600);
$o .= '<label for="pic_cachetime">' . t('Lifetime of the cache (in hours)') . '</label>
<input id="pic_cachetime" name="cachetime" type="text" value="' . escape_tags($cachetime_h) . '"><br style="clear: both;">';
$o .= '<input type="submit" name="save" value="' . t('Save') . '">';
$o .= '<h4>' . t('Cache Statistics') . '</h4>';
$num = q('SELECT COUNT(*) num, SUM(LENGTH(data)) size FROM `photo` WHERE `uid`=0 AND `contact-id`=0 AND `resource-id` LIKE "pic:%%"');
$o .= '<label for="statictics_num">' . t('Number of items') . '</label><input style="color: gray;" id="statistics_num" disabled value="' . escape_tags($num[0]['num']) . '"><br style="clear: both;">';
$size = Ceil($num[0]['size'] / (1024 * 1024));
$o .= '<label for="statictics_size">' . t('Size of the cache') . '</label><input style="color: gray;" id="statistics_size" disabled value="' . $size . ' MB"><br style="clear: both;">';
$o .= '<input type="submit" name="delete_all" value="' . t('Delete the whole cache') . '">';
}
/**
* @param App $a
* @param null|object $o
*/
function privacy_image_cache_plugin_admin_post(&$a = null, &$o = null){
check_form_security_token_redirectOnErr('/admin/plugins/privacy_image_cache', 'picsave');
if (isset($_REQUEST['save'])) {
$cachetime_h = IntVal($_REQUEST['cachetime']);
if ($cachetime_h < 1) $cachetime_h = 1;
set_config('privacy_image_cache','cache_time', $cachetime_h * 3600);
}
if (isset($_REQUEST['delete_all'])) {
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%"');
}
}

BIN
public_server.tgz Executable file

Binary file not shown.

29
public_server/README.md Normal file
View File

@ -0,0 +1,29 @@
Public Server
=============
Public Server is a Friendica plugin which implements automatic account & post expiration so that a site may be used as a public
test bed with reduced data retention.
This is a modified version of the testdrive plugin, DO NOT ACTIVATE AT THE SAME TIME AS THE TESTDRIVE PLUGIN.
//When an account is created on the site, it is given a hard expiration date of
$a->config['public_server']['expiredays'] = 30;
//Set the default days for posts to expire here
$a->config['public_server']['expireposts'] = 30;
//Remove users who have never logged in after nologin days
$a->config['public_server']['nologin'] = 30;
//Remove users who last logged in over flagusers days ago
$a->config['public_server']['flagusers'] = 146;
//For users who last logged in over flagposts days ago set post expiry days to flagpostsexpire
$a->config['public_server']['flagposts'] = 90;
$a->config['public_server']['flagpostsexpire'] = 146;
Set these in your .htconfig.php file. By default nothing is defined in case the plugin is activated accidentally.
They can be ommitted or set to 0 to disable each option.
The default values are those used by friendica.eu, change these as desired.
The expiration date is updated when the user logs in.
An email warning will be sent out approximately five days before the expiration occurs. Five days later the account is removed completely.

View File

@ -0,0 +1,140 @@
<?php
/**
* Name: public_server
* Description: Friendica plugin/addon with functions suitable for a public server.
* Version: 1.0
* Author: Keith Fernie <http://friendika.me4.it/profile/keith>
*/
function public_server_install() {
register_hook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
register_hook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
register_hook('enotify','addon/public_server/public_server.php', 'public_server_enotify');
register_hook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
}
function public_server_uninstall() {
unregister_hook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
unregister_hook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
unregister_hook('enotify','addon/public_server/public_server.php', 'public_server_enotify');
unregister_hook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
}
function public_server_register_account($a,$b) {
$uid = $b;
$days = get_config('public_server','expiredays');
$days_posts = get_config('public_server','expireposts');
if(! $days)
return;
$r = q("UPDATE user set account_expires_on = '%s', expire = %d where uid = %d limit 1",
dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
intval($days_posts),
intval($uid)
);
};
function public_server_cron($a,$b) {
require_once('include/enotify.php');
$r = q("select * from user where account_expires_on < UTC_TIMESTAMP() + INTERVAL 5 DAY and account_expires_on > '0000-00-00 00:00:00' and
expire_notification_sent = '0000-00-00 00:00:00' ");
if(count($r)) {
foreach($r as $rr) {
notification(array(
'uid' => $rr['uid'],
'type' => NOTIFY_SYSTEM,
'system_type' => 'public_server_expire',
'language' => $rr['language'],
'to_name' => $rr['username'],
'to_email' => $rr['email'],
'source_name' => t('Administrator'),
'source_link' => $a->get_baseurl(),
'source_photo' => $a->get_baseurl() . '/images/person-80.jpg',
));
q("update user set expire_notification_sent = '%s' where uid = %d limit 1",
dbesc(datetime_convert()),
intval($rr['uid'])
);
}
}
$r = q("select * from user where account_expired = 1 and account_expires_on < UTC_TIMESTAMP() - INTERVAL 5 DAY and account_expires_on > '0000-00-00 00:00:00'");
if(count($r)) {
require_once('include/Contact.php');
foreach($r as $rr)
user_remove($rr['uid']);
}
$nologin = get_config('public_server','nologin');
if($nologin) {
$r = q("select uid from user where account_expired = 0 and login_date = '0000-00-00 00:00:00' and register_date < UTC_TIMESTAMP() - INTERVAL %d DAY and account_expires_on = '0000-00-00 00:00:00'",intval($nologin));
if(count($r)) {
foreach($r as $rr)
q("update user set account_expires_on = '%s' where uid = %d limit 1",
dbesc(datetime_convert('UTC','UTC','now +' . '6 days')),
intval($rr['uid'])
);
}
}
$flagusers = get_config('public_server','flagusers');
if($flagusers) {
$r = q("select uid from user where account_expired = 0 and login_date < UTC_TIMESTAMP() - INTERVAL %d DAY and account_expires_on = '0000-00-00 00:00:00' and `page-flags` = 0",intval($flagusers));
if(count($r)) {
foreach($r as $rr)
q("update user set account_expires_on = '%s' where uid = %d limit 1",
dbesc(datetime_convert('UTC','UTC','now +' . '6 days')),
intval($rr['uid'])
);
}
}
$flagposts = get_config('public_server','flagposts');
$flagpostsexpire = get_config('public_server','flagpostsexpire');
if ($flagposts && $flagpostsexpire) {
$r = q("select uid from user where account_expired = 0 and login_date < UTC_TIMESTAMP() - INTERVAL %d DAY and account_expires_on = '0000-00-00 00:00:00' and expire = 0 and 'page-flags' = 0",intval(flagposts));
if(count($r)) {
foreach($r as $rr)
q("update user set expire = %d where uid = %d limit 1",
intval($flagpostsexpire),
intval($rr['uid'])
);
}
}
}
function public_server_enotify(&$a, &$b) {
if (x($b, 'params') && $b['params']['type'] == NOTIFY_SYSTEM
&& x($b['params'], 'system_type') && $b['params']['system_type'] === 'public_server_expire') {
$b['itemlink'] = $a->get_baseurl();
$b['epreamble'] = $b['preamble'] = sprintf( t('Your account on %s will expire in a few days.'), get_config('system','sitename'));
$b['subject'] = t('Your Friendica account is about to expire.');
$b['body'] = sprintf( t("Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"), $b['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]");
}
}
function public_server_login($a,$b) {
$days = get_config('public_server','expiredays');
if(! $days)
return;
$r = q("UPDATE user set account_expires_on = '%s' where uid = %d and account_expires_on > '0000-00-00 00:00:00' limit 1",
dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
local_user()
);
}

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 864 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -214,8 +214,8 @@ function smiley_pack_smilies(&$a,&$b) {
$b['texts'][] = ':basketball';
$b['icons'][] = '<img src="' . $a->get_baseurl() . '/addon/smiley_pack/icons/sport/basketball.gif' . '" alt="' . ':basketball' . '" />';
$b['texts'][] = ':bowling';
$b['icons'][] = '<img src="' . $a->get_baseurl() . '/addon/smiley_pack/icons/sport/bowling.gif' . '" alt="' . ':bowling' . '" />';
$b['texts'][] = '~bowling';
$b['icons'][] = '<img src="' . $a->get_baseurl() . '/addon/smiley_pack/icons/sport/bowling.gif' . '" alt="' . '~bowling' . '" />';
$b['texts'][] = ':cycling';
$b['icons'][] = '<img src="' . $a->get_baseurl() . '/addon/smiley_pack/icons/sport/cycling.gif' . '" alt="' . ':cycling' . '" />';
@ -284,6 +284,9 @@ function smiley_pack_smilies(&$a,&$b) {
$b['texts'][] = ':pillow';
$b['icons'][] = '<img src="' . $a->get_baseurl() . '/addon/smiley_pack/icons/tired/pillow.gif' . '" alt="' . ':pillow' . '" />';
$b['texts'][] = ':yawn';
$b['icons'][] = '<img src="' . $a->get_baseurl() . '/addon/smiley_pack/icons/tired/yawn.gif' . '" alt="' . ':yawn' . '" />';
#Fight/Flame/Violent smileys
$b['texts'][] = ':2guns';

Binary file not shown.

Binary file not shown.

View File

@ -2,7 +2,7 @@
/**
* Name: StatusNet Connector
* Description: Relay public postings to a connected StatusNet account
* Version: 1.0.4
* Version: 1.0.5
* Author: Tobias Diekershoff <http://diekershoff.homeunix.net/friendika/profile/tobias>
*/
@ -342,7 +342,7 @@ function statusnet_settings(&$a,&$s) {
$s .= '<label id="statusnet-default-label" for="statusnet-default">'. t('Send public postings to StatusNet by default') .'</label>';
$s .= '<input id="statusnet-default" type="checkbox" name="statusnet-default" value="1" ' . $defchecked . '/>';
$s .= '<div class="clear"></div>';
$s .= '<label id="statusnet-sendtaglinks-label" for="statusnet-sendtaglinks">'.t('Send #tag links to StatusNet').'</label>';
$s .= '<label id="statusnet-sendtaglinks-label" for="statusnet-sendtaglinks">'.t('Send linked #-tags and @-names to StatusNet').'</label>';
$s .= '<input id="statusnet-sendtaglinks" type="checkbox" name="statusnet-sendtaglinks" value="1" '. $linkschecked . '/>';
$s .= '</div><div class="clear"></div>';
@ -435,9 +435,9 @@ function statusnet_post_hook(&$a,&$b) {
// shorten all the links in a 200000 character long essay.
if (! $b['title']=='') {
$tmp = $b['title'] . ' : '. $b['body'];
$tmp = substr($tmp, 0, 4*$max_char);
// $tmp = substr($tmp, 0, 4*$max_char);
} else {
$tmp = substr($b['body'], 0, 3*$max_char);
$tmp = $b['body']; // substr($b['body'], 0, 3*$max_char);
}
// if [url=bla][img]blub.png[/img][/url] get blub.png
$tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp);
@ -453,7 +453,10 @@ function statusnet_post_hook(&$a,&$b) {
// that is, don't send if the option is not set in the
// connector settings
if ($linksenabled=='0') {
// #-tags
$tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
// @-mentions
$tmp = preg_replace( '/@\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '@$2', $tmp);
}
// preserve links to webpages
$tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp);
@ -489,9 +492,14 @@ function statusnet_post_hook(&$a,&$b) {
$msg = implode(' ', $e);
$msg .= '... ' . $shortlink;
}
// and now tweet it :-)
if(strlen($msg))
$dent->post('statuses/update', array('status' => $msg));
// and now dent it :-)
if(strlen($msg)) {
$result = $dent->post('statuses/update', array('status' => $msg));
logger('statusnet_post send, result: ' . print_r($result, true), LOGGER_DEBUG);
if ($result->error) {
logger('Send to StatusNet failed: "' . $result->error . '"');
}
}
}
}

BIN
testdrive.tgz Normal file → Executable file

Binary file not shown.

View File

@ -14,6 +14,8 @@ function testdrive_install() {
register_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
register_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
register_hook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
}
@ -21,6 +23,7 @@ function testdrive_uninstall() {
unregister_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
unregister_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
unregister_hook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
}

Binary file not shown.

View File

@ -21,10 +21,13 @@ Online version of this document: http://ur1.ca/35mml
___ Requirements ___
To use this plugin you have to register your Friendica instance as an
_client application_ for Twitter with _read and write_ access, we do not intend
to use Twitter for login. The registration can be done at twitter.com/apps
and you need to have a Twitter account to do so.
To use this plugin you have to register an application for your friendica
instance on Twitter with
* read and write access
* don't set a callback URL
* we do not intend to use Twitter for login
The registration can be done at twitter.com/apps and you need a Twitter
account for doing so.
After you registered the application you get an OAuth consumer key / secret
pair that identifies your app, you will need them for configuration.

View File

@ -2,7 +2,7 @@
/**
* Name: Twitter Connector
* Description: Relay public postings to a connected Twitter account
* Version: 1.0.3
* Version: 1.0.4
* Author: Tobias Diekershoff <http://diekershoff.homeunix.net/friendika/profile/tobias>
*/
@ -198,7 +198,7 @@ function twitter_settings(&$a,&$s) {
$s .= '<label id="twitter-default-label" for="twitter-default">'. t('Send public postings to Twitter by default') .'</label>';
$s .= '<input id="twitter-default" type="checkbox" name="twitter-default" value="1" ' . $defchecked . '/>';
$s .= '<div class="clear"></div>';
$s .= '<label id="twitter-sendtaglinks-label" for="twitter-sendtaglinks">'.t('Send #tag links to Twitter').'</label>';
$s .= '<label id="twitter-sendtaglinks-label" for="twitter-sendtaglinks">'.t('Send linked #-tags and @-names to Twitter').'</label>';
$s .= '<input id="twitter-sendtaglinks" type="checkbox" name="twitter-sendtaglinks" value="1" '. $linkschecked . '/>';
$s .= '</div><div class="clear"></div>';
@ -301,9 +301,9 @@ function twitter_post_hook(&$a,&$b) {
// shorten all the links in a 200000 character long essay.
if (! $b['title']=='') {
$tmp = $b['title'] . ' : '. $b['body'];
$tmp = substr($tmp, 0, 4*$max_char);
// $tmp = substr($tmp, 0, 4*$max_char);
} else {
$tmp = substr($b['body'], 0, 3*$max_char);
$tmp = $b['body']; // substr($b['body'], 0, 3*$max_char);
}
// if [url=bla][img]blub.png[/img][/url] get blub.png
$tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp);
@ -319,7 +319,10 @@ function twitter_post_hook(&$a,&$b) {
// that is, don't send if the option is not set in the
// connector settings
if ($linksenabled=='0') {
// #-tags
$tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
// @-mentions
$tmp = preg_replace( '/@\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '@$2', $tmp);
}
$tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp);
$tmp = preg_replace( '/\[bookmark\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/bookmark\]/i', '$2 $1', $tmp);
@ -357,7 +360,10 @@ function twitter_post_hook(&$a,&$b) {
// and now tweet it :-)
if(strlen($msg)) {
$result = $tweet->post('statuses/update', array('status' => $msg));
logger('twitter_post send' , LOGGER_DEBUG);
logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG);
if ($result->error) {
logger('Send to Twitter failed: "' . $result->error . '"');
}
}
}
}

Binary file not shown.

View File

@ -0,0 +1,43 @@
<?php
function friendheader_widget_name() {
return "Shows friends as a bar";
}
function friendheader_widget_help() {
return "";
}
function friendheader_widget_args(){
return Array();
}
function friendheader_widget_size(){
return Array('780px','140px');
}
function friendheader_widget_content(&$a, $conf){
$r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile`
LEFT JOIN `user` ON `profile`.`uid` = `user`.`uid`
WHERE `user`.`uid` = %s AND `profile`.`is-default` = 1 LIMIT 1",
intval($conf['uid'])
);
if(!count($r)) return;
$a->profile = $r[0];
$o = "";
$o .= "<style>
body {font-size: 0.8em; margin: 0px; padding: 0px;}
#contact-block { overflow: hidden; height: auto; }
.contact-block-h4 { float: left; margin: 0px; }
.allcontact-link { float: right; margin: 0px; }
.contact-block-content { clear:both; }
.contact-block-div { display: block !important; float: left!important; width: 50px!important; height: 50px!important; margin: 2px!important;}
</style>";
$o .= _abs_url(contact_block());
$o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."' target=new>". t('Get added to this list!') ."</a>";
return $o;
}

Binary file not shown.

View File

@ -1,11 +1,13 @@
#wppost-enable-label, #wppost-username-label, #wppost-password-label, #wppost-blog-label, #wppost-bydefault-label {
#wppost-enable-label, #wppost-username-label, #wppost-password-label,
#wppost-blog-label, #wppost-bydefault-label, #wppost-backlink-label {
float: left;
width: 200px;
margin-top: 10px;
}
#wppost-checkbox, #wppost-username, #wppost-password, #wppost-blog, #wppost-bydefault {
#wppost-checkbox, #wppost-username, #wppost-password,
#wppost-blog, #wppost-bydefault, #wppost-backlink {
float: left;
margin-top: 10px;
}

View File

@ -60,8 +60,10 @@ function wppost_settings(&$a,&$s) {
$checked = (($enabled) ? ' checked="checked" ' : '');
$def_enabled = get_pconfig(local_user(),'wppost','post_by_default');
$back_enabled = get_pconfig(local_user(),'wppost','backlink');
$def_checked = (($def_enabled) ? ' checked="checked" ' : '');
$back_checked = (($back_enabled) ? ' checked="checked" ' : '');
$wp_username = get_pconfig(local_user(), 'wppost', 'wp_username');
$wp_password = get_pconfig(local_user(), 'wppost', 'wp_password');
@ -95,6 +97,11 @@ function wppost_settings(&$a,&$s) {
$s .= '<div id="wppost-bydefault-wrapper">';
$s .= '<label id="wppost-bydefault-label" for="wppost-bydefault">' . t('Post to WordPress by default') . '</label>';
$s .= '<input id="wppost-bydefault" type="checkbox" name="wp_bydefault" value="1" ' . $def_checked . '/>';
$s .= '<div id="wppost-backlink-wrapper">';
$s .= '<label id="wppost-backlink-label" for="wppost-backlink">' . t('Provide a backlink to the Friendica post') . '</label>';
$s .= '<input id="wppost-backlink" type="checkbox" name="wp_backlink" value="1" ' . $back_checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
@ -113,6 +120,7 @@ function wppost_settings_post(&$a,&$b) {
set_pconfig(local_user(),'wppost','wp_username',trim($_POST['wp_username']));
set_pconfig(local_user(),'wppost','wp_password',trim($_POST['wp_password']));
set_pconfig(local_user(),'wppost','wp_blog',trim($_POST['wp_blog']));
set_pconfig(local_user(),'wppost','backlink',trim($_POST['wp_backlink']));
}
@ -189,8 +197,15 @@ function wppost_send(&$a,&$b) {
$title = '<title>' . (($b['title']) ? $b['title'] : t('Post from Friendica')) . '</title>';
$post = $title . bbcode($b['body']);
$wp_backlink = intval(get_pconfig($b['uid'],'wppost','backlink'));
if($wp_backlink && $b['plink'])
$post .= EOL . EOL . '<a href="' . $b['plink'] . '">'
. t('Read the original post and comment stream on Friendica') . '</a>' . EOL . EOL;
$post = xmlify($post);
$xml = <<< EOT
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<methodCall>