Merge branch 'master', remote-tracking branch 'remotes/upstream/master'

* remotes/upstream/master:
  zrl's when visiting public photos at the source site
  doco
  cleanup
  turn "follow" into a function
  add hometown to profiles
  bug #439 - remove web port number from notification email "from" address
  webfinger profile linker
  "howlong" added to marital status.
  fewer "bob smith to bob smith via wall-to-wall".
  [quote=somebody] was appearing as an extended spoiler tag.

* master:
This commit is contained in:
Simon L'nu 2012-06-03 04:59:07 -04:00
commit 598a2563e8
22 changed files with 624 additions and 476 deletions

View file

@ -9,9 +9,9 @@ require_once('include/nav.php');
require_once('include/cache.php'); require_once('include/cache.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica'); define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_VERSION', '3.0.1361' ); define ( 'FRIENDICA_VERSION', '3.0.1362' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1145 ); define ( 'DB_UPDATE_VERSION', 1147 );
define ( 'EOL', "<br />\r\n" ); define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );

View file

@ -820,9 +820,11 @@ CREATE TABLE IF NOT EXISTS `profile` (
`region` char(255) NOT NULL, `region` char(255) NOT NULL,
`postal-code` char(32) NOT NULL, `postal-code` char(32) NOT NULL,
`country-name` char(255) NOT NULL, `country-name` char(255) NOT NULL,
`hometown` char(255) NOT NULL,
`gender` char(32) NOT NULL, `gender` char(32) NOT NULL,
`marital` char(255) NOT NULL, `marital` char(255) NOT NULL,
`with` text NOT NULL, `with` text NOT NULL,
`howlong` datetime NOT NULL default '0000-00-00 00:00:00',
`sexual` char(255) NOT NULL, `sexual` char(255) NOT NULL,
`politic` char(255) NOT NULL, `politic` char(255) NOT NULL,
`religion` char(255) NOT NULL, `religion` char(255) NOT NULL,

View file

@ -52,6 +52,8 @@ function bb_unspacefy_and_trim($st) {
function bbcode($Text,$preserve_nl = false) { function bbcode($Text,$preserve_nl = false) {
$a = get_app();
// Hide all [noparse] contained bbtags spacefying them // Hide all [noparse] contained bbtags spacefying them
$Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text); $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text);
@ -114,6 +116,11 @@ function bbcode($Text,$preserve_nl = false) {
$Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" target="external-link">$2</a>', $Text); $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" target="external-link">$2</a>', $Text);
//$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $Text); //$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $Text);
// we may need to restrict this further if it picks up too many strays
// link acct:user@host to a webfinger profile redirector
$Text = preg_replace('/acct:(.*?)@(.*?)([ ,])/', '<a href="' . $a->get_baseurl() . '/acctlink?addr=' . "$1@$2"
. '" target="extlink" >acct:' . "$1@$2$3" . '</a>',$Text);
// Perform MAIL Search // Perform MAIL Search
$Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1">$1</a>', $Text); $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1">$1</a>', $Text);
@ -226,7 +233,7 @@ function bbcode($Text,$preserve_nl = false) {
$endlessloop = 0; $endlessloop = 0;
while ((strpos($Text, "[/quote]")!== false) and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20)) while ((strpos($Text, "[/quote]")!== false) and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20))
$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", $Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
"<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote class=".'"author"'.">$2</blockquote>", "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
$Text); $Text);
// [img=widthxheight]image source[/img] // [img=widthxheight]image source[/img]

View file

@ -173,6 +173,12 @@ function localize_item(&$item){
$item['body'] = str_replace($mtch[0],'@[url=' . zrl($mtch[1]). ']',$item['body']); $item['body'] = str_replace($mtch[0],'@[url=' . zrl($mtch[1]). ']',$item['body']);
} }
} }
if(preg_match_all('/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
logger('matched');
foreach($matches as $mtch) {
$item['body'] = str_replace($mtch[0],'[url=' . zrl($mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3] ,true) . '][img' . $mtch[4] . ']h' . $mtch[5] . '[/img][/url]',$item['body']);
}
}
} }
@ -496,7 +502,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
// On the network page, I am the owner. On the display page it will be the profile owner. // On the network page, I am the owner. On the display page it will be the profile owner.
// This will have been stored in $a->page_contact by our calling page. // This will have been stored in $a->page_contact by our calling page.
// Put this person on the left of the wall-to-wall notice. // Put this person as the wall owner of the wall-to-wall notice.
$owner_url = zrl($a->page_contact['url']); $owner_url = zrl($a->page_contact['url']);
$owner_photo = $a->page_contact['thumb']; $owner_photo = $a->page_contact['thumb'];
@ -504,23 +510,38 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
$template = $wallwall; $template = $wallwall;
$commentww = 'ww'; $commentww = 'ww';
} }
if((! $item['wall']) && (strlen($item['owner-link'])) && (! link_compare($item['owner-link'],$item['author-link']))) {
// Could be anybody. if((! $item['wall']) && $item['owner-link']) {
$owner_url = $item['owner-link']; $owner_linkmatch = (($item['owner-link']) && link_compare($item['owner-link'],$item['author-link']));
$owner_photo = $item['owner-avatar']; $alias_linkmatch = (($item['alias']) && link_compare($item['alias'],$item['author-link']));
$owner_name = $item['owner-name']; $owner_namematch = (($item['owner-name']) && $item['owner-name'] == $item['author-name']);
$template = $wallwall; if((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) {
$commentww = 'ww';
// If it is our contact, use a friendly redirect link // The author url doesn't match the owner (typically the contact)
if((link_compare($item['owner-link'],$item['url'])) // and also doesn't match the contact alias.
&& ($item['network'] === NETWORK_DFRN)) { // The name match is a hack to catch several weird cases where URLs are
$owner_url = $redirect_url; // all over the park. It can be tricked, but this prevents you from
$osparkle = ' sparkle'; // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn
// well that it's the same Bob Smith.
// But it could be somebody else with the same name. It just isn't highly likely.
$owner_url = $item['owner-link'];
$owner_photo = $item['owner-avatar'];
$owner_name = $item['owner-name'];
$template = $wallwall;
$commentww = 'ww';
// If it is our contact, use a friendly redirect link
if((link_compare($item['owner-link'],$item['url']))
&& ($item['network'] === NETWORK_DFRN)) {
$owner_url = $redirect_url;
$osparkle = ' sparkle';
}
else
$owner_url = zrl($owner_url);
} }
else
$owner_url = zrl($owner_url);
} }
} }

View file

@ -244,7 +244,7 @@ function timesel($pre,$h,$m) {
// Limited to range of timestamps // Limited to range of timestamps
if(! function_exists('relative_date')) { if(! function_exists('relative_date')) {
function relative_date($posted_date) { function relative_date($posted_date,$format = null) {
$localtime = datetime_convert('UTC',date_default_timezone_get(),$posted_date); $localtime = datetime_convert('UTC',date_default_timezone_get(),$posted_date);
@ -274,7 +274,9 @@ function relative_date($posted_date) {
if ($d >= 1) { if ($d >= 1) {
$r = round($d); $r = round($d);
// translators - e.g. 22 hours ago, 1 minute ago // translators - e.g. 22 hours ago, 1 minute ago
return sprintf( t('%1$d %2$s ago'),$r, (($r == 1) ? $str[0] : $str[1])); if(! $format)
$format = t('%1$d %2$s ago');
return sprintf( $format,$r, (($r == 1) ? $str[0] : $str[1]));
} }
} }
}} }}

View file

@ -20,6 +20,9 @@ function notification($params) {
$sender_name = $product; $sender_name = $product;
$hostname = $a->get_hostname(); $hostname = $a->get_hostname();
if(strpos($hostname,':'))
$hostname = substr($hostname,0,strpos($hostname,':'));
$sender_email = t('noreply') . '@' . $hostname; $sender_email = t('noreply') . '@' . $hostname;
$additional_mail_header = ""; $additional_mail_header = "";

243
include/follow.php Normal file
View file

@ -0,0 +1,243 @@
<?php
//
// Takes a $uid and a url/handle and adds a new contact
// Currently if the contact is DFRN, interactive needs to be true, to redirect to the
// dfrn_request page.
// Otherwise this can be used to bulk add statusnet contacts, twitter contacts, etc.
// Returns an array
// $return['success'] boolean true if successful
// $return['message'] error text if success is false.
function new_contact($uid,$url,$interactive = false) {
$result = array('success' => false,'message' => '');
$a = get_app();
// remove ajax junk, e.g. Twitter
$url = str_replace('/#!/','/',$url);
if(! allowed_url($url)) {
$result['message'] = t('Disallowed profile URL.');
return $result;
}
if(! $url) {
$result['message'] = t('Connect URL missing.');
return $result;
}
$arr = array('url' => $url, 'contact' => array());
call_hooks('follow', $arr);
if(x($arr['contact'],'name'))
$ret = $arr['contact'];
else
$ret = probe_url($url);
if($ret['network'] === NETWORK_DFRN) {
if($interactive) {
if(strlen($a->path))
$myaddr = bin2hex($a->get_baseurl() . '/profile/' . $a->user['nickname']);
else
$myaddr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname());
goaway($ret['request'] . "&addr=$myaddr");
// NOTREACHED
}
}
else {
if(get_config('system','dfrn_only')) {
$result['message'] = t('This site is not configured to allow communications with other networks.') . EOL;
$result['message'] != t('No compatible communication protocols or feeds were discovered.') . EOL;
return $result;
}
}
// This extra param just confuses things, remove it
if($ret['network'] === NETWORK_DIASPORA)
$ret['url'] = str_replace('?absolute=true','',$ret['url']);
// do we have enough information?
if(! ((x($ret,'name')) && (x($ret,'poll')) && ((x($ret,'url')) || (x($ret,'addr'))))) {
$result['message'] .= t('The profile address specified does not provide adequate information.') . EOL;
if(! x($ret,'poll'))
$result['message'] .= t('No compatible communication protocols or feeds were discovered.') . EOL;
if(! x($ret,'name'))
$result['message'] .= t('An author or name was not found.') . EOL;
if(! x($ret,'url'))
$result['message'] .= t('No browser URL could be matched to this address.') . EOL;
if(strpos($url,'@') !== false) {
$result['message'] .= t('Unable to match @-style Identity Address with a known protocol or email contact.') . EOL;
$result['message'] .= t('Use mailto: in front of address to force email check.') . EOL;
}
return $result;
}
if($ret['network'] === NETWORK_OSTATUS && get_config('system','ostatus_disabled')) {
$result['message'] .= t('The profile address specified belongs to a network which has been disabled on this site.') . EOL;
$ret['notify'] = '';
}
if(! $ret['notify']) {
$result['message'] .= t('Limited profile. This person will be unable to receive direct/personal notifications from you.') . EOL;
}
$writeable = ((($ret['network'] === NETWORK_OSTATUS) && ($ret['notify'])) ? 1 : 0);
$hidden = (($ret['network'] === NETWORK_MAIL) ? 1 : 0);
if($ret['network'] === NETWORK_MAIL) {
$writeable = 1;
}
if($ret['network'] === NETWORK_DIASPORA)
$writeable = 1;
// check if we already have a contact
// the poll url is more reliable than the profile url, as we may have
// indirect links or webfinger links
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` = '%s' LIMIT 1",
intval($uid),
dbesc($ret['poll'])
);
if(count($r)) {
// update contact
if($r[0]['rel'] == CONTACT_IS_FOLLOWER || ($network === NETWORK_DIASPORA && $r[0]['rel'] == CONTACT_IS_SHARING)) {
q("UPDATE `contact` SET `rel` = %d , `readonly` = 0 WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(CONTACT_IS_FRIEND),
intval($r[0]['id']),
intval($uid)
);
}
}
else {
$new_relation = (($ret['network'] === NETWORK_MAIL) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING);
if($ret['network'] === NETWORK_DIASPORA)
$new_relation = CONTACT_IS_FOLLOWER;
// create contact record
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`,
`writable`, `hidden`, `blocked`, `readonly`, `pending` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, 0, 0, 0 ) ",
intval($uid),
dbesc(datetime_convert()),
dbesc($ret['url']),
dbesc(normalise_link($ret['url'])),
dbesc($ret['addr']),
dbesc($ret['alias']),
dbesc($ret['batch']),
dbesc($ret['notify']),
dbesc($ret['poll']),
dbesc($ret['poco']),
dbesc($ret['name']),
dbesc($ret['nick']),
dbesc($ret['photo']),
dbesc($ret['network']),
dbesc($ret['pubkey']),
intval($new_relation),
intval($ret['priority']),
intval($writeable),
intval($hidden)
);
}
$r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
dbesc($ret['url']),
intval($uid)
);
if(! count($r)) {
$result['message'] .= t('Unable to retrieve contact information.') . EOL;
return $result;
}
$contact = $r[0];
$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($ret['photo'],$uid,$contact_id);
$r = q("UPDATE `contact` SET `photo` = '%s',
`thumb` = '%s',
`micro` = '%s',
`name-date` = '%s',
`uri-date` = '%s',
`avatar-date` = '%s'
WHERE `id` = %d LIMIT 1
",
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
intval($contact_id)
);
// pull feed and consume it, which should subscribe to the hub.
proc_run('php',"include/poller.php","$contact_id");
// create a follow slap
$tpl = get_markup_template('follow_slap.tpl');
$slap = replace_macros($tpl, array(
'$name' => $a->user['username'],
'$profile_page' => $a->get_baseurl() . '/profile/' . $a->user['nickname'],
'$photo' => $a->contact['photo'],
'$thumb' => $a->contact['thumb'],
'$published' => datetime_convert('UTC','UTC', 'now', ATOM_TIME),
'$item_id' => 'urn:X-dfrn:' . $a->get_hostname() . ':follow:' . random_string(),
'$title' => '',
'$type' => 'text',
'$content' => t('following'),
'$nick' => $a->user['nickname'],
'$verb' => ACTIVITY_FOLLOW,
'$ostat_follow' => ''
));
$r = q("SELECT `contact`.*, `user`.* FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
WHERE `user`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1",
intval($uid)
);
if(count($r)) {
if(($contact['network'] == NETWORK_OSTATUS) && (strlen($contact['notify']))) {
require_once('include/salmon.php');
slapper($r[0],$contact['notify'],$slap);
}
if($contact['network'] == NETWORK_DIASPORA) {
require_once('include/diaspora.php');
$ret = diaspora_share($a->user,$contact);
logger('mod_follow: diaspora_share returns: ' . $ret);
}
}
$result['success'] = true;
return $result;
}

View file

@ -39,11 +39,16 @@ function advanced_profile(&$a) {
if($a->profile['with']) $profile['marital']['with'] = $a->profile['with']; if($a->profile['with']) $profile['marital']['with'] = $a->profile['with'];
if(strlen($a->profile['howlong']) && $a->profile['howlong'] !== '0000-00-00 00:00:00') {
$profile['howlong'] = relative_date($a->profile['howlong'], t('for %1$d %2$s'));
}
if($a->profile['sexual']) $profile['sexual'] = array( t('Sexual Preference:'), $a->profile['sexual'] ); if($a->profile['sexual']) $profile['sexual'] = array( t('Sexual Preference:'), $a->profile['sexual'] );
if($a->profile['homepage']) $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) ); if($a->profile['homepage']) $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) );
if($a->profile['hometown']) $profile['hometown'] = array( t('Hometown:'), linkify($a->profile['hometown']) );
if($a->profile['pub_keywords']) $profile['pub_keywords'] = array( t('Tags:'), $a->profile['pub_keywords']); if($a->profile['pub_keywords']) $profile['pub_keywords'] = array( t('Tags:'), $a->profile['pub_keywords']);
if($a->profile['politic']) $profile['politic'] = array( t('Political Views:'), $a->profile['politic']); if($a->profile['politic']) $profile['politic'] = array( t('Political Views:'), $a->profile['politic']);

View file

@ -891,6 +891,7 @@ function prepare_body($item,$attach = false) {
} else } else
$s = prepare_text($item['body']); $s = prepare_text($item['body']);
$prep_arr = array('item' => $item, 'html' => $s); $prep_arr = array('item' => $item, 'html' => $s);
call_hooks('prepare_body', $prep_arr); call_hooks('prepare_body', $prep_arr);
$s = $prep_arr['html']; $s = $prep_arr['html'];

16
mod/acctlink.php Normal file
View file

@ -0,0 +1,16 @@
<?php
require_once('include/Scrape.php');
function acctlink_init(&$a) {
if(x($_GET,'addr')) {
$addr = trim($_GET['addr']);
$res = probe_url($addr);
//logger('acctlink: ' . print_r($res,true));
if($res['url']) {
goaway($res['url']);
killme();
}
}
}

View file

@ -63,7 +63,7 @@ function community_content(&$a, $update = 0) {
} }
$r = q("SELECT distinct(`item`.`uri`), `item`.*, `item`.`id` AS `item_id`, $r = q("SELECT distinct(`item`.`uri`), `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`, `contact`.`rel`,
`contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`, `contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`, `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`,
`user`.`nickname`, `user`.`hidewall` `user`.`nickname`, `user`.`hidewall`

View file

@ -1,6 +1,7 @@
<?php <?php
require_once('Scrape.php'); require_once('Scrape.php');
require_once('include/follow.php');
function follow_init(&$a) { function follow_init(&$a) {
@ -11,230 +12,19 @@ function follow_init(&$a) {
} }
$uid = local_user(); $uid = local_user();
$url = $orig_url = notags(trim($_REQUEST['url'])); $url = notags(trim($_REQUEST['url']));
$return_url = $_SESSION['return_url']; $return_url = $_SESSION['return_url'];
// remove ajax junk, e.g. Twitter $result = new_contact($uid,$url,true);
$url = str_replace('/#!/','/',$url); if($result['success'] == false) {
if($result['message'])
if(! allowed_url($url)) { notice($result['message']);
notice( t('Disallowed profile URL.') . EOL);
goaway($return_url);
// NOTREACHED
}
if(! $url) {
notice( t('Connect URL missing.') . EOL);
goaway($return_url);
// NOTREACHED
}
$arr = array('url' => $url, 'contact' => array());
call_hooks('follow', $arr);
if(x($arr['contact'],'name'))
$ret = $arr['contact'];
else
$ret = probe_url($url);
if($ret['network'] === NETWORK_DFRN) {
if(strlen($a->path))
$myaddr = bin2hex($a->get_baseurl() . '/profile/' . $a->user['nickname']);
else
$myaddr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname());
goaway($ret['request'] . "&addr=$myaddr");
// NOTREACHED
}
else {
if(get_config('system','dfrn_only')) {
notice( t('This site is not configured to allow communications with other networks.') . EOL);
notice( t('No compatible communication protocols or feeds were discovered.') . EOL);
goaway($return_url);
}
}
// This extra param just confuses things, remove it
if($ret['network'] === NETWORK_DIASPORA)
$ret['url'] = str_replace('?absolute=true','',$ret['url']);
// do we have enough information?
if(! ((x($ret,'name')) && (x($ret,'poll')) && ((x($ret,'url')) || (x($ret,'addr'))))) {
notice( t('The profile address specified does not provide adequate information.') . EOL);
if(! x($ret,'poll'))
notice( t('No compatible communication protocols or feeds were discovered.') . EOL);
if(! x($ret,'name'))
notice( t('An author or name was not found.') . EOL);
if(! x($ret,'url'))
notice( t('No browser URL could be matched to this address.') . EOL);
if(strpos($url,'@') !== false) {
notice( t('Unable to match @-style Identity Address with a known protocol or email contact.') . EOL);
notice( t('Use mailto: in front of address to force email check.') . EOL);
}
goaway($return_url); goaway($return_url);
} }
if($ret['network'] === NETWORK_OSTATUS && get_config('system','ostatus_disabled')) { info( t('Contact added') . EOL);
notice( t('The profile address specified belongs to a network which has been disabled on this site.') . EOL);
$ret['notify'] = '';
}
if(! $ret['notify']) {
notice( t('Limited profile. This person will be unable to receive direct/personal notifications from you.') . EOL);
}
$writeable = ((($ret['network'] === NETWORK_OSTATUS) && ($ret['notify'])) ? 1 : 0);
$hidden = (($ret['network'] === NETWORK_MAIL) ? 1 : 0);
if($ret['network'] === NETWORK_MAIL) {
$writeable = 1;
}
if($ret['network'] === NETWORK_DIASPORA)
$writeable = 1;
// check if we already have a contact
// the poll url is more reliable than the profile url, as we may have
// indirect links or webfinger links
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` = '%s' LIMIT 1",
intval($uid),
dbesc($ret['poll'])
);
if(count($r)) {
// update contact
if($r[0]['rel'] == CONTACT_IS_FOLLOWER || ($network === NETWORK_DIASPORA && $r[0]['rel'] == CONTACT_IS_SHARING)) {
q("UPDATE `contact` SET `rel` = %d , `readonly` = 0 WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(CONTACT_IS_FRIEND),
intval($r[0]['id']),
intval($uid)
);
}
}
else {
$new_relation = (($ret['network'] === NETWORK_MAIL) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING);
if($ret['network'] === NETWORK_DIASPORA)
$new_relation = CONTACT_IS_FOLLOWER;
// create contact record
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`,
`writable`, `hidden`, `blocked`, `readonly`, `pending` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, 0, 0, 0 ) ",
intval($uid),
dbesc(datetime_convert()),
dbesc($ret['url']),
dbesc(normalise_link($ret['url'])),
dbesc($ret['addr']),
dbesc($ret['alias']),
dbesc($ret['batch']),
dbesc($ret['notify']),
dbesc($ret['poll']),
dbesc($ret['poco']),
dbesc($ret['name']),
dbesc($ret['nick']),
dbesc($ret['photo']),
dbesc($ret['network']),
dbesc($ret['pubkey']),
intval($new_relation),
intval($ret['priority']),
intval($writeable),
intval($hidden)
);
}
$r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
dbesc($ret['url']),
intval($uid)
);
if(! count($r)) {
notice( t('Unable to retrieve contact information.') . EOL);
goaway($return_url);
// NOTREACHED
}
$contact = $r[0];
$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($ret['photo'],$uid,$contact_id);
$r = q("UPDATE `contact` SET `photo` = '%s',
`thumb` = '%s',
`micro` = '%s',
`name-date` = '%s',
`uri-date` = '%s',
`avatar-date` = '%s'
WHERE `id` = %d LIMIT 1
",
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
intval($contact_id)
);
// pull feed and consume it, which should subscribe to the hub.
proc_run('php',"include/poller.php","$contact_id");
// create a follow slap
$tpl = get_markup_template('follow_slap.tpl');
$slap = replace_macros($tpl, array(
'$name' => $a->user['username'],
'$profile_page' => $a->get_baseurl() . '/profile/' . $a->user['nickname'],
'$photo' => $a->contact['photo'],
'$thumb' => $a->contact['thumb'],
'$published' => datetime_convert('UTC','UTC', 'now', ATOM_TIME),
'$item_id' => 'urn:X-dfrn:' . $a->get_hostname() . ':follow:' . random_string(),
'$title' => '',
'$type' => 'text',
'$content' => t('following'),
'$nick' => $a->user['nickname'],
'$verb' => ACTIVITY_FOLLOW,
'$ostat_follow' => ''
));
$r = q("SELECT `contact`.*, `user`.* FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
WHERE `user`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1",
intval($uid)
);
if(count($r)) {
if(($contact['network'] == NETWORK_OSTATUS) && (strlen($contact['notify']))) {
require_once('include/salmon.php');
slapper($r[0],$contact['notify'],$slap);
}
if($contact['network'] == NETWORK_DIASPORA) {
require_once('include/diaspora.php');
$ret = diaspora_share($a->user,$contact);
logger('mod_follow: diaspora_share returns: ' . $ret);
}
}
if(strstr($return_url,'contacts')) if(strstr($return_url,'contacts'))
goaway($a->get_baseurl() . '/contacts/' . $contact_id); goaway($a->get_baseurl() . '/contacts/' . $contact_id);

View file

@ -534,7 +534,7 @@ function network_content(&$a, $update = 0) {
$parents_str = implode(', ', $parents_arr); $parents_str = implode(', ', $parents_arr);
$items = q("SELECT `item`.*, `item`.`id` AS `item_id`, $items = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`, `contact`.`rel`, `contact`.`writable`,
`contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
FROM `item`, `contact` FROM `item`, `contact`

View file

@ -117,7 +117,7 @@ function notes_content(&$a,$update = false) {
$parents_str = implode(', ', $parents_arr); $parents_str = implode(', ', $parents_arr);
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`, $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`network`, `contact`.`rel`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`, `contact`.`network`, `contact`.`rel`,
`contact`.`thumb`, `contact`.`self`, `contact`.`writable`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`

View file

@ -242,7 +242,7 @@ function profile_content(&$a, $update = 0) {
$parents_str = implode(', ', $parents_arr); $parents_str = implode(', ', $parents_arr);
$items = q("SELECT `item`.*, `item`.`id` AS `item_id`, $items = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`network`, `contact`.`rel`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`, `contact`.`network`, `contact`.`rel`,
`contact`.`thumb`, `contact`.`self`, `contact`.`writable`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
FROM `item`, `contact` FROM `item`, `contact`

View file

@ -62,9 +62,15 @@ function profiles_post(&$a) {
$pub_keywords = notags(trim($_POST['pub_keywords'])); $pub_keywords = notags(trim($_POST['pub_keywords']));
$prv_keywords = notags(trim($_POST['prv_keywords'])); $prv_keywords = notags(trim($_POST['prv_keywords']));
$marital = notags(trim($_POST['marital'])); $marital = notags(trim($_POST['marital']));
$howlong = notags(trim($_POST['howlong']));
$with = ((x($_POST,'with')) ? notags(trim($_POST['with'])) : ''); $with = ((x($_POST,'with')) ? notags(trim($_POST['with'])) : '');
if(! strlen($howlong))
$howlong = '0000-00-00 00:00:00';
else
$howlong = datetime_convert(date_default_timezone_get(),'UTC',$howlong);
// linkify the relationship target if applicable // linkify the relationship target if applicable
$withchanged = false; $withchanged = false;
@ -120,6 +126,7 @@ function profiles_post(&$a) {
$sexual = notags(trim($_POST['sexual'])); $sexual = notags(trim($_POST['sexual']));
$homepage = notags(trim($_POST['homepage'])); $homepage = notags(trim($_POST['homepage']));
$hometown = notags(trim($_POST['hometown']));
$politic = notags(trim($_POST['politic'])); $politic = notags(trim($_POST['politic']));
$religion = notags(trim($_POST['religion'])); $religion = notags(trim($_POST['religion']));
@ -207,8 +214,10 @@ function profiles_post(&$a) {
`country-name` = '%s', `country-name` = '%s',
`marital` = '%s', `marital` = '%s',
`with` = '%s', `with` = '%s',
`howlong` = '%s',
`sexual` = '%s', `sexual` = '%s',
`homepage` = '%s', `homepage` = '%s',
`hometown` = '%s',
`politic` = '%s', `politic` = '%s',
`religion` = '%s', `religion` = '%s',
`pub_keywords` = '%s', `pub_keywords` = '%s',
@ -237,8 +246,10 @@ function profiles_post(&$a) {
dbesc($country_name), dbesc($country_name),
dbesc($marital), dbesc($marital),
dbesc($with), dbesc($with),
dbesc($howlong),
dbesc($sexual), dbesc($sexual),
dbesc($homepage), dbesc($homepage),
dbesc($hometown),
dbesc($politic), dbesc($politic),
dbesc($religion), dbesc($religion),
dbesc($pub_keywords), dbesc($pub_keywords),
@ -558,8 +569,10 @@ function profiles_content(&$a) {
'$lbl_marital' => t('<span class="heart">&hearts;</span> Marital Status:'), '$lbl_marital' => t('<span class="heart">&hearts;</span> Marital Status:'),
'$lbl_with' => t("Who: \x28if applicable\x29"), '$lbl_with' => t("Who: \x28if applicable\x29"),
'$lbl_ex1' => t('Examples: cathy123, Cathy Williams, cathy@example.com'), '$lbl_ex1' => t('Examples: cathy123, Cathy Williams, cathy@example.com'),
'$lbl_howlong' => t('Since [date]:'),
'$lbl_sexual' => t('Sexual Preference:'), '$lbl_sexual' => t('Sexual Preference:'),
'$lbl_homepage' => t('Homepage URL:'), '$lbl_homepage' => t('Homepage URL:'),
'$lbl_hometown' => t('Hometown:'),
'$lbl_politic' => t('Political Views:'), '$lbl_politic' => t('Political Views:'),
'$lbl_religion' => t('Religious Views:'), '$lbl_religion' => t('Religious Views:'),
'$lbl_pubkey' => t('Public Keywords:'), '$lbl_pubkey' => t('Public Keywords:'),
@ -595,9 +608,11 @@ function profiles_content(&$a) {
'$gender' => gender_selector($r[0]['gender']), '$gender' => gender_selector($r[0]['gender']),
'$marital' => marital_selector($r[0]['marital']), '$marital' => marital_selector($r[0]['marital']),
'$with' => strip_tags($r[0]['with']), '$with' => strip_tags($r[0]['with']),
'$howlong' => ($r[0]['howlong'] === '0000-00-00 00:00:00' ? '' : datetime_convert('UTC',date_default_timezone_get(),$r[0]['howlong'])),
'$sexual' => sexpref_selector($r[0]['sexual']), '$sexual' => sexpref_selector($r[0]['sexual']),
'$about' => $r[0]['about'], '$about' => $r[0]['about'],
'$homepage' => $r[0]['homepage'], '$homepage' => $r[0]['homepage'],
'$hometown' => $r[0]['hometown'],
'$politic' => $r[0]['politic'], '$politic' => $r[0]['politic'],
'$religion' => $r[0]['religion'], '$religion' => $r[0]['religion'],
'$pub_keywords' => $r[0]['pub_keywords'], '$pub_keywords' => $r[0]['pub_keywords'],

View file

@ -146,7 +146,7 @@ function search_content(&$a) {
} }
$r = q("SELECT distinct(`item`.`uri`), `item`.*, `item`.`id` AS `item_id`, $r = q("SELECT distinct(`item`.`uri`), `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`, `contact`.`rel`,
`contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`, `contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`, `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`,
`user`.`nickname` `user`.`nickname`

View file

@ -1,6 +1,6 @@
<?php <?php
define( 'UPDATE_VERSION' , 1145 ); define( 'UPDATE_VERSION' , 1147 );
/** /**
* *
@ -1259,3 +1259,19 @@ function update_1144() {
return UPDATE_FAILED ; return UPDATE_FAILED ;
return UPDATE_SUCCESS ; return UPDATE_SUCCESS ;
} }
function update_1145() {
$r = q("alter table profile add howlong datetime not null default '0000-00-00 00:00:00' after `with`");
if(! $r)
return UPDATE_FAILED ;
return UPDATE_SUCCESS ;
}
function update_1146() {
$r = q("alter table profile add hometown char(255) not null after `country-name`, add index ( `hometown` ) ");
if(! $r)
return UPDATE_FAILED ;
return UPDATE_SUCCESS ;
}

File diff suppressed because it is too large Load diff

View file

@ -29,7 +29,7 @@
{{ if $profile.marital }} {{ if $profile.marital }}
<dl id="aprofile-marital" class="aprofile"> <dl id="aprofile-marital" class="aprofile">
<dt><span class="heart">&hearts;</span> $profile.marital.0</dt> <dt><span class="heart">&hearts;</span> $profile.marital.0</dt>
<dd>$profile.marital.1 {{ if $profile.marital.with }}($profile.marital.with){{ endif }}</dd> <dd>$profile.marital.1{{ if $profile.marital.with }} ($profile.marital.with){{ endif }}{{ if $profile.howlong }} $profile.howlong{{ endif }}</dd>
</dl> </dl>
{{ endif }} {{ endif }}
@ -54,6 +54,13 @@
</dl> </dl>
{{ endif }} {{ endif }}
{{ if $profile.hometown }}
<dl id="aprofile-hometown" class="aprofile">
<dt>$profile.hometown.0</dt>
<dd>$profile.hometown.1</dd>
</dl>
{{ endif }}
{{ if $profile.politic }} {{ if $profile.politic }}
<dl id="aprofile-politic" class="aprofile"> <dl id="aprofile-politic" class="aprofile">
<dt>$profile.politic.0</dt> <dt>$profile.politic.0</dt>

View file

@ -97,6 +97,12 @@ $hide_friends
</div> </div>
<div id="profile-edit-region-end"></div> <div id="profile-edit-region-end"></div>
<div id="profile-edit-hometown-wrapper" >
<label id="profile-edit-hometown-label" for="profile-edit-hometown" >$lbl_hometown </label>
<input type="text" size="32" name="hometown" id="profile-edit-hometown" value="$hometown" />
</div>
<div id="profile-edit-hometown-end"></div>
<div class="profile-edit-submit-wrapper" > <div class="profile-edit-submit-wrapper" >
<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" /> <input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
</div> </div>
@ -108,6 +114,9 @@ $marital
</div> </div>
<label id="profile-edit-with-label" for="profile-edit-with" > $lbl_with </label> <label id="profile-edit-with-label" for="profile-edit-with" > $lbl_with </label>
<input type="text" size="32" name="with" id="profile-edit-with" title="$lbl_ex1" value="$with" /> <input type="text" size="32" name="with" id="profile-edit-with" title="$lbl_ex1" value="$with" />
<label id="profile-edit-howlong-label" for="profile-edit-howlong" > $lbl_howlong </label>
<input type="text" size="32" name="howlong" id="profile-edit-howlong" title="$lbl_howlong" value="$howlong" />
<div id="profile-edit-marital-end"></div> <div id="profile-edit-marital-end"></div>
<div id="profile-edit-sexual-wrapper" > <div id="profile-edit-sexual-wrapper" >

View file

@ -679,7 +679,8 @@ input#dfrn-url {
#profile-edit-religion-label, #profile-edit-religion-label,
#profile-edit-pubkeywords-label, #profile-edit-pubkeywords-label,
#profile-edit-prvkeywords-label, #profile-edit-prvkeywords-label,
#profile-edit-homepage-label { #profile-edit-homepage-label,
#profile-edit-hometown-label {
float: left; float: left;
width: 175px; width: 175px;
} }
@ -774,7 +775,7 @@ input#dfrn-url {
} }
#profile-edit-homepage { #profile-edit-homepage, #profile-edit-hometown {
float: left; float: left;
margin-bottom: 35px; margin-bottom: 35px;
} }
@ -814,6 +815,7 @@ input#dfrn-url {
#profile-edit-pubkeywords-end, #profile-edit-pubkeywords-end,
#profile-edit-prvkeywords-end, #profile-edit-prvkeywords-end,
#profile-edit-homepage-end, #profile-edit-homepage-end,
#profile-edit-hometown-end,
#profile-in-dir-break, #profile-in-dir-break,
#profile-in-dir-end, #profile-in-dir-end,
#profile-in-netdir-break, #profile-in-netdir-break,