Browse Source

Merge remote branch 'mike/master'

pull/1/head
Olivier Migeot 10 years ago
parent
commit
85f709320b
122 changed files with 11537 additions and 7646 deletions
  1. +53
    -21
      boot.php
  2. +12
    -0
      database.sql
  3. +4
    -1
      include/bbcode.php
  4. +420
    -0
      include/conversation.php
  5. +7
    -9
      include/items.php
  6. +23
    -0
      include/main.js
  7. +6
    -0
      include/nav.php
  8. +1
    -0
      include/notifier.php
  9. +13
    -3
      include/poller.php
  10. +69
    -37
      include/profile_advanced.php
  11. +3042
    -0
      library/markdown.php
  12. +8
    -0
      mod/contacts.php
  13. +5
    -0
      mod/dfrn_confirm.php
  14. +14
    -2
      mod/dfrn_notify.php
  15. +22
    -1
      mod/dfrn_poll.php
  16. +8
    -186
      mod/display.php
  17. +7
    -3
      mod/follow.php
  18. +11
    -4
      mod/group.php
  19. +10
    -0
      mod/install.php
  20. +7
    -0
      mod/lostpass.php
  21. +7
    -337
      mod/network.php
  22. +5
    -9
      mod/notifications.php
  23. +18
    -0
      mod/opensearch.php
  24. +5
    -1
      mod/parse_url.php
  25. +9
    -10
      mod/photos.php
  26. +9
    -202
      mod/profile.php
  27. +5
    -1
      mod/profile_photo.php
  28. +49
    -1
      mod/profiles.php
  29. +5
    -63
      mod/search.php
  30. +43
    -17
      mod/settings.php
  31. +2
    -2
      mod/share.php
  32. +21
    -0
      update.php
  33. +1909
    -1520
      util/messages.po
  34. +131
    -26
      util/strings.php
  35. +2
    -2
      view/comment_item.tpl
  36. +10
    -10
      view/contact_edit.tpl
  37. +0
    -86
      view/de/contact_edit.tpl
  38. +0
    -40
      view/de/install_db.tpl
  39. +3520
    -0
      view/de/messages.po
  40. +0
    -16
      view/de/profile-hide-friends.tpl
  41. +0
    -16
      view/de/profile-in-directory.tpl
  42. +0
    -16
      view/de/profile-in-netdir.tpl
  43. +0
    -226
      view/de/profile_advanced.php
  44. +0
    -9
      view/de/profile_entry_default.tpl
  45. +0
    -8
      view/de/profile_listing_header.tpl
  46. +0
    -18
      view/de/profile_photo.tpl
  47. +0
    -16
      view/de/pwdreset.tpl
  48. +0
    -177
      view/de/settings.tpl
  49. +0
    -9
      view/de/settings_nick_set.tpl
  50. +0
    -9
      view/de/settings_nick_subdir.tpl
  51. +762
    -1123
      view/de/strings.php
  52. +0
    -40
      view/en/install_db.tpl
  53. +0
    -225
      view/en/profile_advanced.php
  54. +0
    -299
      view/en/profile_edit.tpl
  55. +0
    -9
      view/en/profile_entry_default.tpl
  56. +0
    -8
      view/en/profile_listing_header.tpl
  57. +0
    -16
      view/en/pwdreset.tpl
  58. +0
    -1
      view/en/registrations.tpl
  59. +0
    -83
      view/fr/contact_edit.tpl
  60. +0
    -16
      view/fr/profile-hide-friends.tpl
  61. +0
    -16
      view/fr/profile-in-directory.tpl
  62. +0
    -16
      view/fr/profile-in-netdir.tpl
  63. +0
    -299
      view/fr/profile_edit.tpl
  64. +0
    -9
      view/fr/profile_entry_default.tpl
  65. +0
    -8
      view/fr/profile_listing_header.tpl
  66. +0
    -18
      view/fr/profile_photo.tpl
  67. +0
    -18
      view/fr/pwdreset.tpl
  68. +0
    -1
      view/fr/registrations.tpl
  69. +0
    -175
      view/fr/settings.tpl
  70. +0
    -9
      view/fr/settings_nick_set.tpl
  71. +0
    -7
      view/fr/settings_nick_subdir.tpl
  72. +4
    -0
      view/head.tpl
  73. +8
    -8
      view/install_db.tpl
  74. +0
    -80
      view/it/contact_edit.tpl
  75. +0
    -40
      view/it/install_db.tpl
  76. +938
    -173
      view/it/messages.po
  77. +0
    -16
      view/it/profile-hide-friends.tpl
  78. +0
    -16
      view/it/profile-in-directory.tpl
  79. +0
    -16
      view/it/profile-in-netdir.tpl
  80. +0
    -226
      view/it/profile_advanced.php
  81. +0
    -299
      view/it/profile_edit.tpl
  82. +0
    -9
      view/it/profile_entry_default.tpl
  83. +0
    -8
      view/it/profile_listing_header.tpl
  84. +0
    -18
      view/it/profile_photo.tpl
  85. +0
    -16
      view/it/pwdreset.tpl
  86. +0
    -1
      view/it/registrations.tpl
  87. +0
    -175
      view/it/settings.tpl
  88. +0
    -9
      view/it/settings_nick_set.tpl
  89. +0
    -7
      view/it/settings_nick_subdir.tpl
  90. +154
    -0
      view/it/strings.php
  91. +1
    -0
      view/jot-header.tpl
  92. +13
    -0
      view/opensearch.tpl
  93. +3
    -3
      view/profile-hide-friends.tpl
  94. +3
    -3
      view/profile-in-directory.tpl
  95. +3
    -3
      view/profile-in-netdir.tpl
  96. +43
    -43
      view/profile_edit.tpl
  97. +1
    -1
      view/profile_entry_default.tpl
  98. +8
    -0
      view/profile_listing_header.tpl
  99. +4
    -4
      view/profile_photo.tpl
  100. +17
    -0
      view/pwdreset.tpl

+ 53
- 21
boot.php View File

@ -2,9 +2,9 @@
set_time_limit(0);
define ( 'FRIENDIKA_VERSION', '2.1.941' );
define ( 'DFRN_PROTOCOL_VERSION', '2.2' );
define ( 'DB_UPDATE_VERSION', 1047 );
define ( 'FRIENDIKA_VERSION', '2.1.946' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
define ( 'DB_UPDATE_VERSION', 1050 );
define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@ -73,6 +73,18 @@ define ( 'PAGE_SOAPBOX', 1 );
define ( 'PAGE_COMMUNITY', 2 );
define ( 'PAGE_FREELOVE', 3 );
/**
* Network and protocol family types
*/
define ( 'NETWORK_DFRN', 'dfrn'); // Friendika, Mistpark, other DFRN implementations
define ( 'NETWORK_OSTATUS', 'stat'); // status.net, identi.ca, GNU-social, other OStatus implementations
define ( 'NETWORK_FEED', 'feed'); // RSS/Atom feeds with no known "post/notify" protocol
define ( 'NETWORK_DIASPORA', 'dspr'); // Diaspora
define ( 'NETWORK_MAIL', 'mail'); // IMAP/POP
define ( 'NETWORK_FACEBOOK', 'face'); // Facebook API
/**
* Maximum number of "people who like (or don't like) this" that we will list by name
*/
@ -189,6 +201,7 @@ class App {
public $user;
public $cid;
public $contact;
public $page_contact;
public $content;
public $data;
public $error = false;
@ -2032,18 +2045,7 @@ function contact_block() {
if(count($r)) {
$o .= '<h4 class="contact-h4">' . sprintf( tt('%d Contact','%d Contacts', $total),$total) . '</h4><div id="contact-block">';
foreach($r as $rr) {
$redirect_url = $a->get_baseurl() . '/redir/' . $rr['id'];
if(local_user() && ($rr['uid'] == local_user())
&& ($rr['network'] === 'dfrn')) {
$url = $redirect_url;
$sparkle = ' sparkle';
}
else {
$url = $rr['url'];
$sparkle = '';
}
$o .= '<div class="contact-block-div"><a class="contact-block-link' . $sparkle . '" href="' . $url . '" ><img class="contact-block-img' . $sparkle . '" src="' . $rr['micro'] . '" title="' . $rr['name'] . ' [' . $rr['url'] . ']" alt="' . $rr['name'] . '" /></a></div>' . "\r\n";
$o .= micropro($rr,true,'mpfriend');
}
$o .= '</div><div id="contact-block-end"></div>';
$o .= '<div id="viewcontacts"><a id="viewcontacts-link" href="viewcontacts/' . $a->profile['nickname'] . '">' . t('View Contacts') . '</a></div>';
@ -2057,6 +2059,31 @@ function contact_block() {
}}
if(! function_exists('micropro')) {
function micropro($contact, $redirect = false, $class = '') {
if($class)
$class = ' ' . $class;
$url = $contact['url'];
$sparkle = '';
if($redirect) {
$a = get_app();
$redirect_url = $a->get_baseurl() . '/redir/' . $contact['id'];
if(local_user() && ($contact['uid'] == local_user()) && ($contact['network'] === 'dfrn')) {
$url = $redirect_url;
$sparkle = ' sparkle';
}
}
return '<div class="contact-block-div' . $class . '"><a class="contact-block-link' . $class . $sparkle
. '" href="' . $url . '" ><img class="contact-block-img' . $class . $sparkle . '" src="' . $contact['micro']
. '" title="' . $contact['name'] . ' [' . $contact['url'] . ']" alt="' . $contact['name'] . '" /></a></div>' . "\r\n";
}}
if(! function_exists('search')) {
function search($s) {
$a = get_app();
@ -2301,9 +2328,9 @@ function profile_sidebar($profile) {
$pubkey = ((x($profile,'pubkey') == 1) ? '<div class="key" style="display:none;">' . $profile['pubkey'] . '</div>' : '');
$marital = ((x($profile,'marital') == 1) ? '<div class="marital"><span class="marital-label"><span class="heart">&hearts;</span> ' . t('Status:') . ' </span><span class="marital-text">' . $profile['marital'] . '</span></div></div><div class="profile-clear"></div>' : '');
$marital = ((x($profile,'marital') == 1) ? '<div class="marital"><span class="marital-label"><span class="heart">&hearts;</span> ' . t('Status:') . ' </span><span class="marital-text">' . $profile['marital'] . '</span></div><div class="profile-clear"></div>' : '');
$homepage = ((x($profile,'homepage') == 1) ? '<div class="homepage"><span class="homepage-label">' . t('Homepage:') . ' </span><span class="homepage-url">' . linkify($profile['homepage']) . '</span></div></div><div class="profile-clear"></div>' : '');
$homepage = ((x($profile,'homepage') == 1) ? '<div class="homepage"><span class="homepage-label">' . t('Homepage:') . ' </span><span class="homepage-url">' . linkify($profile['homepage']) . '</span></div><div class="profile-clear"></div>' : '');
$tpl = load_view_file('view/profile_vcard.tpl');
@ -2662,14 +2689,19 @@ function extract_item_authors($arr,$uid) {
// pre-quoted, don't put quotes on %s
if(count($urls)) {
$r = q("SELECT `id`,`url` FROM `contact` WHERE `uid` = %d AND `url` IN ( %s ) AND `network` = 'dfrn' AND `self` = 0 AND `blocked` = 0 ",
$r = q("SELECT `id`,`network`,`url` FROM `contact` WHERE `uid` = %d AND `url` IN ( %s ) AND `self` = 0 AND `blocked` = 0 ",
intval($uid),
implode(',',$urls)
);
if(count($r)) {
$ret = array();
foreach($r as $rr)
$ret[$rr['url']] = $rr['id'];
$authors = array();
foreach($r as $rr){
if ($rr['network']=='dfrn')
$ret[$rr['url']] = $rr['id'];
$authors[$r['url']]= $rr;
}
$a->authors = $authors;
return $ret;
}
}
@ -2681,7 +2713,7 @@ function item_photo_menu($item){
$a = get_app();
if (!isset($a->authors)){
$rr = q("SELECT id, network, url FROM contact WHERE uid=%d AND self!=1", intval(local_user()));
$rr = q("SELECT `id`, `network`, `url` FROM `contact` WHERE `uid`=%d AND `self`=0 AND `blocked`=0 ", intval(local_user()));
$authors = array();
foreach($rr as $r) $authors[$r['url']]= $r;
$a->authors = $authors;


+ 12
- 0
database.sql View File

@ -85,6 +85,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`priority` tinyint(3) NOT NULL,
`blocked` tinyint(1) NOT NULL DEFAULT '1',
`readonly` tinyint(1) NOT NULL DEFAULT '0',
`writable` tinyint(1) NOT NULL DEFAULT '0',
`pending` tinyint(1) NOT NULL DEFAULT '1',
`rating` tinyint(1) NOT NULL DEFAULT '0',
`reason` text NOT NULL,
@ -502,3 +503,14 @@ CREATE TABLE IF NOT EXISTS `ffinder` (
`fid` INT UNSIGNED NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `mailacct` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL,
`server` CHAR( 255 ) NOT NULL ,
`user` CHAR( 255 ) NOT NULL ,
`pass` CHAR( 255 ) NOT NULL ,
`reply_to` CHAR( 255 ) NOT NULL ,
`last_check` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE = MYISAM DEFAULT CHARSET=utf8;

+ 4
- 1
include/bbcode.php View File

@ -3,7 +3,7 @@ require_once("include/oembed.php");
// BBcode 2 HTML was written by WAY2WEB.net
// extended to work with Mistpark/Friendika - Mike Macgirvin
function bbcode($Text) {
function bbcode($Text,$preserve_nl = false) {
// Replace any html brackets with HTML Entities to prevent executing HTML or script
// Don't use strip_tags here because it breaks [url] search by replacing & with amp
@ -12,7 +12,10 @@ function bbcode($Text) {
$Text = str_replace(">", "&gt;", $Text);
// Convert new line chars to html <br /> tags
$Text = nl2br($Text);
if($preserve_nl)
$Text = str_replace(array("\n","\r"), array('',''),$Text);
// Set up the parameters for a URL search string
$URLSearchString = "^\[\]";


+ 420
- 0
include/conversation.php View File

@ -0,0 +1,420 @@
<?php
function conversation(&$a, $items, $mode, $update) {
require_once('bbcode.php');
$profile_owner = 0;
$page_writeable = false;
if($mode === 'network') {
$profile_owner = local_user();
$page_writeable = true;
}
if($mode === 'profile') {
$profile_owner = $a->profile['profile_uid'];
$page_writeable = can_write_wall($a,$profile_owner);
}
if($mode === 'display') {
$profile_owner = $a->profile['uid'];
$page_writeable = can_write_wall($a,$profile_owner);
}
if($update)
$return_url = $_SESSION['return_url'];
else
$return_url = $_SESSION['return_url'] = $a->cmd;
// find all the authors involved in remote conversations
// We will use a local profile photo if they are one of our contacts
// otherwise we have to get the photo from the item owner's site
$author_contacts = extract_item_authors($items,local_user());
$cmnt_tpl = load_view_file('view/comment_item.tpl');
$like_tpl = load_view_file('view/like.tpl');
$noshare_tpl = load_view_file('view/like_noshare.tpl');
$tpl = load_view_file('view/wall_item.tpl');
$wallwall = load_view_file('view/wallwall_item.tpl');
$alike = array();
$dlike = array();
if(count($items)) {
if($mode === 'network-new' || $mode === 'search') {
// "New Item View" on network page or search page results
// - just loop through the items and format them minimally for display
$tpl = load_view_file('view/search_item.tpl');
$droptpl = load_view_file('view/wall_fake_drop.tpl');
foreach($items as $item) {
$comment = '';
$owner_url = '';
$owner_photo = '';
$owner_name = '';
$sparkle = '';
if($mode === 'search') {
if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE)))
&& ($item['id'] != $item['parent']))
continue;
$nickname = $item['nickname'];
}
else
$nickname = $a->user['nickname'];
$profile_name = ((strlen($item['author-name'])) ? $item['author-name'] : $item['name']);
$profile_avatar = ((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']);
$profile_link = ((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
$redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ;
if(strlen($item['author-link'])) {
if(link_compare($item['author-link'],$item['url']) && ($item['network'] === 'dfrn') && (! $item['self'])) {
$profile_link = $redirect_url;
$sparkle = ' sparkle';
}
elseif(isset($author_contacts[$item['author-link']])) {
$profile_link = $a->get_baseurl() . '/redir/' . $author_contacts[$item['author-link']];
$sparkle = ' sparkle';
}
}
$location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
$coord = (($item['coord']) ? '<a target="map" title="' . $item['coord'] . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
if($coord) {
if($location)
$location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
else
$location = '<span class="smalltext">' . $coord . '</span>';
}
$drop = '';
$dropping = false;
if((intval($item['contact-id']) && $item['contact-id'] == remote_user()) || ($item['uid'] == local_user()))
$dropping = true;
$drop = replace_macros((($dropping)? $droptpl : $fakedrop), array('$id' => $item['id'], '$delete' => t('Delete')));
$drop = replace_macros($droptpl,array('$id' => $item['id']));
$lock = '<div class="wall-item-lock"></div>';
$o .= replace_macros($tpl,array(
'$id' => $item['item_id'],
'$linktitle' => sprintf( t('View %s\'s profile'), $profile_name),
'$profile_url' => $profile_link,
'$item_photo_menu' => item_photo_menu($item),
'$name' => $profile_name,
'$sparkle' => $sparkle,
'$lock' => $lock,
'$thumb' => $profile_avatar,
'$title' => $item['title'],
'$body' => smilies(bbcode($item['body'])),
'$ago' => relative_date($item['created']),
'$location' => $location,
'$indent' => '',
'$owner_url' => $owner_url,
'$owner_photo' => $owner_photo,
'$owner_name' => $owner_name,
'$drop' => $drop,
'$conv' => '<a href="' . $a->get_baseurl() . '/display/' . $nickname . '/' . $item['id'] . '">' . t('View in context') . '</a>'
));
}
return $o;
}
// Normal View
// Figure out how many comments each parent has
// (Comments all have gravity of 6)
// Store the result in the $comments array
$comments = array();
foreach($items as $item) {
if(intval($item['gravity']) == 6) {
if(! x($comments,$item['parent']))
$comments[$item['parent']] = 1;
else
$comments[$item['parent']] += 1;
}
}
// map all the like/dislike activities for each parent item
// Store these in the $alike and $dlike arrays
foreach($items as $item) {
like_puller($a,$item,$alike,'like');
like_puller($a,$item,$dlike,'dislike');
}
$comments_collapsed = false;
$blowhard = 0;
$blowhard_count = 0;
foreach($items as $item) {
$comment = '';
$template = $tpl;
$commentww = '';
$sparkle = '';
$owner_url = $owner_photo = $owner_name = '';
// We've already parsed out like/dislike for special treatment. We can ignore them now
if(((activity_match($item['verb'],ACTIVITY_LIKE))
|| (activity_match($item['verb'],ACTIVITY_DISLIKE)))
&& ($item['id'] != $item['parent']))
continue;
$toplevelpost = (($item['id'] == $item['parent']) ? true : false);
// Take care of author collapsing and comment collapsing
// If a single author has more than 3 consecutive top-level posts, squash the remaining ones.
// If there are more than two comments, squash all but the last 2.
if($toplevelpost) {
$item_writeable = (($item['writable'] || $item['self']) ? true : false);
if($blowhard == $item['cid'] && (! $item['self']) && ($mode != 'profile')) {
$blowhard_count ++;
if($blowhard_count == 3) {
$o .= '<div class="icollapse-wrapper fakelink" id="icollapse-wrapper-' . $item['parent']
. '" onclick="openClose(' . '\'icollapse-' . $item['parent'] . '\');" >'
. t('See more posts like this') . '</div>' . '<div class="icollapse" id="icollapse-'
. $item['parent'] . '" style="display: none;" >';
}
}
else {
$blowhard = $item['cid'];
if($blowhard_count >= 3)
$o .= '</div>';
$blowhard_count = 0;
}
$comments_seen = 0;
$comments_collapsed = false;
}
else
$comments_seen ++;
$show_comment_box = ((($page_writeable) && ($item_writeable) && ($comments_seen == $comments[$item['parent']])) ? true : false);
if(($comments[$item['parent']] > 2) && ($comments_seen <= ($comments[$item['parent']] - 2)) && ($item['gravity'] == 6)) {
if(! $comments_collapsed) {
$o .= '<div class="ccollapse-wrapper fakelink" id="ccollapse-wrapper-' . $item['parent']
. '" onclick="openClose(' . '\'ccollapse-' . $item['parent'] . '\');" >'
. sprintf( t('See all %d comments'), $comments[$item['parent']]) . '</div>'
. '<div class="ccollapse" id="ccollapse-' . $item['parent'] . '" style="display: none;" >';
$comments_collapsed = true;
}
}
if(($comments[$item['parent']] > 2) && ($comments_seen == ($comments[$item['parent']] - 1))) {
$o .= '</div>';
}
$redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ;
$lock = ((($item['private']) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
|| strlen($item['deny_cid']) || strlen($item['deny_gid']))))
? '<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="' . t('Private Message') . '" onclick="lockview(event,' . $item['id'] . ');" /></div>'
: '<div class="wall-item-lock"></div>');
// Top-level wall post not written by the wall owner (wall-to-wall)
// First figure out who owns it.
$osparkle = '';
if(($toplevelpost) && (! $item['self']) && ($mode !== 'profile')) {
if($item['type'] === 'wall') {
// 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.
// Put this person on the left of the wall-to-wall notice.
$owner_url = $a->page_contact['url'];
$owner_photo = $a->page_contact['thumb'];
$owner_name = $a->page_contact['name'];
$template = $wallwall;
$commentww = 'ww';
}
if(($item['type'] === 'remote') && (strlen($item['owner-link'])) && ($item['owner-link'] != $item['author-link'])) {
// Could be anybody.
$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'] === 'dfrn')) {
$owner_url = $redirect_url;
$osparkle = ' sparkle';
}
}
}
$likebuttons = '';
if($page_writeable) {
if($toplevelpost) {
$likebuttons = replace_macros((($item['private']) ? $noshare_tpl : $like_tpl),array(
'$id' => $item['id'],
'$likethis' => t("I like this \x28toggle\x29"),
'$nolike' => t("I don't like this \x28toggle\x29"),
'$share' => t('Share'),
'$wait' => t('Please wait')
));
}
if(($show_comment_box) || (($show_comment_box == false) && ($item['last-child']))) {
$comment = replace_macros($cmnt_tpl,array(
'$return_path' => '',
'$jsreload' => (($mode === 'display') ? $_SESSION['return_url'] : ''),
'$type' => (($mode === 'profile') ? 'wall-comment' : 'net-comment'),
'$id' => $item['item_id'],
'$parent' => $item['parent'],
'$profile_uid' => $profile_owner,
'$mylink' => $a->contact['url'],
'$mytitle' => t('This is you'),
'$myphoto' => $a->contact['thumb'],
'$comment' => t('Comment'),
'$submit' => t('Submit'),
'$ww' => (($mode === 'network') ? $commentww : '')
));
}
}
$edpost = ((($profile_owner == local_user()) && ($toplevelpost) && (intval($item['wall']) == 1))
? '<a class="editpost" href="' . $a->get_baseurl() . '/editpost/' . $item['id']
. '" title="' . t('Edit') . '"><img src="images/pencil.gif" /></a>'
: '');
$drop = replace_macros(load_view_file('view/wall_item_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
$photo = $item['photo'];
$thumb = $item['thumb'];
// Post was remotely authored.
$diff_author = ((link_compare($item['url'],$item['author-link'])) ? false : true);
$profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
$profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $thumb);
if($mode === 'profile') {
if(local_user() && ($item['contact-uid'] == local_user()) && ($item['network'] === 'dfrn') && (! $item['self'] )) {
$profile_link = $redirect_url;
$sparkle = ' sparkle';
}
else {
$profile_link = $item['url'];
$sparkle = '';
}
}
elseif(strlen($item['author-link'])) {
$profile_link = $item['author-link'];
if(link_compare($item['author-link'],$item['url']) && ($item['network'] === 'dfrn') && (! $item['self'])) {
$profile_link = $redirect_url;
$sparkle = ' sparkle';
}
elseif(isset($author_contacts[$item['author-link']])) {
$profile_link = $a->get_baseurl() . '/redir/' . $author_contacts[$item['author-link']];
$sparkle = ' sparkle';
}
}
else
$profile_link = $item['url'];
$like = ((x($alike,$item['id'])) ? format_like($alike[$item['id']],$alike[$item['id'] . '-l'],'like',$item['id']) : '');
$dislike = ((x($dlike,$item['id'])) ? format_like($dlike[$item['id']],$dlike[$item['id'] . '-l'],'dislike',$item['id']) : '');
$location = (($item['location']) ? '<a target="map" title="' . $item['location']
. '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
$coord = (($item['coord']) ? '<a target="map" title="' . $item['coord']
. '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
if($coord) {
if($location)
$location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
else
$location = '<span class="smalltext">' . $coord . '</span>';
}
$indent = (($toplevelpost) ? '' : ' comment');
if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
$indent .= ' shiny';
// Build the HTML
$tmp_item = replace_macros($template,array(
'$id' => $item['item_id'],
'$linktitle' => sprintf( t('View %s\'s profile'), $profile_name),
'$olinktitle' => sprintf( t('View %s\'s profile'), $owner_name),
'$to' => t('to'),
'$wall' => t('Wall-to-Wall'),
'$vwall' => t('via Wall-To-Wall:'),
'$profile_url' => $profile_link,
'$item_photo_menu' => item_photo_menu($item),
'$name' => $profile_name,
'$thumb' => $profile_avatar,
'$osparkle' => $osparkle,
'$sparkle' => $sparkle,
'$title' => $item['title'],
'$body' => smilies(bbcode($item['body'])),
'$ago' => relative_date($item['created']),
'$lock' => $lock,
'$location' => $location,
'$indent' => $indent,
'$owner_url' => $owner_url,
'$owner_photo' => $owner_photo,
'$owner_name' => $owner_name,
'$plink' => get_plink($item),
'$edpost' => $edpost,
'$drop' => $drop,
'$vote' => $likebuttons,
'$like' => $like,
'$dislike' => $dislike,
'$comment' => $comment
));
$arr = array('item' => $item, 'output' => $tmp_item);
call_hooks('display_item', $arr);
$o .= $arr['output'];
}
}
// if author collapsing is in force but didn't get closed, close it off now.
if($blowhard_count >= 3)
$o .= '</div>';
return $o;
}

+ 7
- 9
include/items.php View File

@ -867,14 +867,14 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
if($dissolve)
$postvars['dissolve'] = '1';
if(($contact['rel']) && ($contact['rel'] != REL_FAN) && (! $contact['blocked']) && (! $contact['readonly'])) {
$postvars['data'] = $atom;
}
elseif($owner['page-flags'] == PAGE_COMMUNITY) {
if((($contact['rel']) && ($contact['rel'] != REL_FAN) && (! $contact['blocked'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
$postvars['data'] = $atom;
$postvars['perm'] = 'rw';
}
else {
$postvars['data'] = str_replace('<dfrn:comment-allow>1','<dfrn:comment-allow>0',$atom);
$postvars['perm'] = 'r';
}
if($rino && $rino_allowed && (! $dissolve)) {
@ -916,7 +916,6 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
if((! $curl_stat) || (! strlen($xml)))
return(-1); // timed out
if(strpos($xml,'<?xml') === false) {
logger('dfrn_deliver: phase 2: no valid XML returned');
logger('dfrn_deliver: phase 2: returned XML: ' . $xml, LOGGER_DATA);
@ -925,8 +924,7 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
$res = parse_xml_string($xml);
return $res->status;
return $res->status;
}
@ -1369,8 +1367,8 @@ function new_follower($importer,$contact,$datarray,$item) {
// create contact record - set to readonly
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `name`, `nick`, `photo`, `network`, `rel`,
`blocked`, `readonly`, `pending` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, 0, 1, 1 ) ",
`blocked`, `readonly`, `pending`, `writable` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, 0, 1, 1, 1 ) ",
intval($importer['uid']),
dbesc(datetime_convert()),
dbesc($url),


+ 23
- 0
include/main.js View File

@ -255,3 +255,26 @@
return false;
}
function bin2hex(s){
// Converts the binary representation of data to hex
//
// version: 812.316
// discuss at: http://phpjs.org/functions/bin2hex
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Onno Marsman
// + bugfixed by: Linuxworld
// * example 1: bin2hex('Kev');
// * returns 1: '4b6576'
// * example 2: bin2hex(String.fromCharCode(0x00));
// * returns 2: '00'
var v,i, f = 0, a = [];
s += '';
f = s.length;
for (i = 0; i<f; i++) {
a[i] = s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");
}
return a.join('');
}

+ 6
- 0
include/nav.php View File

@ -61,6 +61,12 @@ function nav(&$a) {
$a->page['nav'] .= '<a id="nav-register-link" class="nav-commlink" href="register" >'
. t('Register') . "</a>\r\n";
$help_url = get_config('system','help_url');
if(! $help_url)
$help_url = 'http://github.com/friendika/friendika/wiki';
$a->page['nav'] .= '<a id="nav-help-link" class="nav-link" target="friendika-help" href="' . $help_url . '">' . t('Help') . "</a>\r\n";
if(strlen($a->apps)) {
$a->page['nav'] .= '<a id="nav-apps-link" class="nav-link" href="apps">' . t('Apps') . "</a>\r\n";
}


+ 1
- 0
include/notifier.php View File

@ -354,6 +354,7 @@ function notifier_run($argv, $argc){
case 'mail':
case 'dspr':
case 'feed':
case 'face':
default:
break;
}


+ 13
- 3
include/poller.php View File

@ -165,11 +165,15 @@ function poller_run($argv, $argc){
if(intval($contact['duplex']) && $contact['dfrn-id'])
$idtosend = '0:' . $orig_id;
if(intval($contact['duplex']) && $contact['issued-id'])
$idtosend = '1:' . $orig_id;
$idtosend = '1:' . $orig_id;
// they have permission to write to us. We already filtered this in the contact query.
$perm = 'rw';
$url = $contact['poll'] . '?dfrn_id=' . $idtosend
. '&dfrn_version=' . DFRN_PROTOCOL_VERSION
. '&type=data&last_update=' . $last_update ;
. '&type=data&last_update=' . $last_update
. '&perm=' . $perm ;
$xml = fetch_url($url);
@ -250,13 +254,14 @@ function poller_run($argv, $argc){
$final_dfrn_id = substr($final_dfrn_id,2);
if($final_dfrn_id != $orig_id) {
logger('poller: ID did not decode: ' . $contact['id'] . ' orig: ' . $orig_id . ' final: ' . $final_dfrn_id);
// did not decode properly - cannot trust this site
continue;
}
$postvars['dfrn_id'] = $idtosend;
$postvars['dfrn_version'] = DFRN_PROTOCOL_VERSION;
$postvars['perm'] = 'rw';
$xml = post_url($contact['poll'],$postvars);
}
@ -264,6 +269,11 @@ function poller_run($argv, $argc){
// $contact['network'] !== 'dfrn'
if(($contact['notify']) && (! $contact['writable'])) {
q("UPDATE `contact` SET `writable` = 1 WHERE `id` = %d LIMIT 1",
intval($contact['id'])
);
}
$xml = fetch_url($contact['poll']);
}


view/fr/profile_advanced.php → include/profile_advanced.php View File


+ 3042
- 0
library/markdown.php
File diff suppressed because it is too large
View File


+ 8
- 0
mod/contacts.php View File

@ -261,6 +261,14 @@ function contacts_content(&$a) {
$o .= replace_macros($tpl,array(
'$header' => t('Contact Editor'),
'$submit' => t('Submit'),
'$lbl_vis1' => t('Profile Visibility'),
'$lbl_vis2' => sprintf( t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $r[0]['name']),
'$lbl_info1' => t('Contact Information / Notes'),
'$lbl_rep1' => t('Online Reputation'),
'$lbl_rep2' => t('Occasionally your friends may wish to inquire about this person\'s online legitimacy.'),
'$lbl_rep3' => t('You may help them choose whether or not to interact with this person by providing a <em>reputation</em> to guide them.'),
'$lbl_rep4' => t('Please take a moment to elaborate on this selection if you feel it could be helpful to others.'),
'$visit' => t('Visit $name\'s profile'),
'$blockunblock' => t('Block/Unblock contact'),
'$ignorecont' => t('Ignore contact'),


+ 5
- 0
mod/dfrn_confirm.php View File

@ -434,6 +434,11 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
$arr['object'] .= '</link></object>' . "\n";
$arr['last-child'] = 1;
$arr['allow_cid'] = $user[0]['allow_cid'];
$arr['allow_gid'] = $user[0]['allow_gid'];
$arr['deny_cid'] = $user[0]['deny_cid'];
$arr['deny_gid'] = $user[0]['deny_gid'];
$i = item_store($arr);
if($i)
proc_run('php',"include/notifier.php","activity","$i");


+ 14
- 2
mod/dfrn_notify.php View File

@ -10,6 +10,12 @@ function dfrn_notify_post(&$a) {
$data = ((x($_POST,'data')) ? $_POST['data'] : '');
$key = ((x($_POST,'key')) ? $_POST['key'] : '');
$dissolve = ((x($_POST,'dissolve')) ? intval($_POST['dissolve']) : 0);
$perm = ((x($_POST,'perm')) ? notags(trim($_POST['perm'])) : 'r');
$writable = (-1);
if($dfrn_version >= 2.21) {
$writable = (($perm === 'rw') ? 1 : 0);
}
$direction = (-1);
if(strpos($dfrn_id,':') == 1) {
@ -74,6 +80,14 @@ function dfrn_notify_post(&$a) {
$importer = $r[0];
if(($writable != (-1)) && ($writable != $importer['writable'])) {
q("UPDATE `contact` SET `writable` = %d WHERE `id` = %d LIMIT 1",
intval($writable),
intval($importer['id'])
);
$importer['writable'] = $writable;
}
logger('dfrn_notify: received notify from ' . $importer['name'] . ' for ' . $importer['username']);
logger('dfrn_notify: data: ' . $data, LOGGER_DATA);
@ -118,8 +132,6 @@ function dfrn_notify_post(&$a) {
}
if($importer['readonly']) {
// We aren't receiving stuff from this person. But we will quietly ignore them
// rather than a blatant "go away" message.


+ 22
- 1
mod/dfrn_poll.php View File

@ -16,6 +16,7 @@ function dfrn_poll_init(&$a) {
$challenge = ((x($_GET,'challenge')) ? $_GET['challenge'] : '');
$sec = ((x($_GET,'sec')) ? $_GET['sec'] : '');
$dfrn_version = ((x($_GET,'dfrn_version')) ? (float) $_GET['dfrn_version'] : 2.0);
$perm = ((x($_GET,'perm')) ? $_GET['perm'] : 'r');
$direction = (-1);
@ -183,8 +184,9 @@ function dfrn_poll_post(&$a) {
$challenge = ((x($_POST,'challenge')) ? $_POST['challenge'] : '');
$url = ((x($_POST,'url')) ? $_POST['url'] : '');
$sec = ((x($_POST,'sec')) ? $_POST['sec'] : '');
$ptype = ((x($_POST,'type')) ? $_POST['type'] : '');
$ptype = ((x($_POST,'type')) ? $_POST['type'] : '');
$dfrn_version = ((x($_POST,'dfrn_version')) ? (float) $_POST['dfrn_version'] : 2.0);
$perm = ((x($_POST,'perm')) ? $_POST['perm'] : 'r');
if($ptype === 'profile-check') {
@ -295,6 +297,7 @@ function dfrn_poll_post(&$a) {
if(! count($r))
killme();
$contact = $r[0];
$owner_uid = $r[0]['uid'];
$contact_id = $r[0]['id'];
@ -328,6 +331,23 @@ function dfrn_poll_post(&$a) {
// NOTREACHED
}
else {
// Update the writable flag if it changed
logger('dfrn_poll: post request feed: ' . print_r($_POST,true),LOGGER_DATA);
if($dfrn_version >= 2.21) {
if($perm === 'rw')
$writable = 1;
else
$writable = 0;
if($writable != $contact['writable']) {
q("UPDATE `contact` SET `writable` = %d WHERE `id` = %d LIMIT 1",
intval($writable),
intval($contact_id)
);
}
}
header("Content-type: application/atom+xml");
$o = get_feed_for($a,$dfrn_id, $a->argv[1], $last_update, $direction);
echo $o;
@ -344,6 +364,7 @@ function dfrn_poll_content(&$a) {
$destination_url = ((x($_GET,'destination_url')) ? $_GET['destination_url'] : '');
$sec = ((x($_GET,'sec')) ? $_GET['sec'] : '');
$dfrn_version = ((x($_GET,'dfrn_version')) ? (float) $_GET['dfrn_version'] : 2.0);
$perm = ((x($_GET,'perm')) ? $_GET['perm'] : 'r');
$direction = (-1);
if(strpos($dfrn_id,':') == 1) {


+ 8
- 186
mod/display.php View File

@ -22,9 +22,6 @@ function display_content(&$a) {
$groups = array();
$tab = 'posts';
$contact = null;
$remote_contact = false;
@ -48,6 +45,11 @@ function display_content(&$a) {
}
}
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
intval($a->profile['uid'])
);
if(count($r))
$a->page_contact = $r[0];
$sql_extra = "
AND `allow_cid` = ''
@ -88,7 +90,7 @@ function display_content(&$a) {
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
`contact`.`network`, `contact`.`thumb`, `contact`.`self`,
`contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
@ -102,17 +104,6 @@ function display_content(&$a) {
);
$cmnt_tpl = load_view_file('view/comment_item.tpl');
$like_tpl = load_view_file('view/like_noshare.tpl');
$tpl = load_view_file('view/wall_item.tpl');
$wallwall = load_view_file('view/wallwall_item.tpl');
$return_url = $_SESSION['return_url'] = $a->cmd;
$alike = array();
$dlike = array();
if(count($r)) {
if((local_user()) && (local_user() == $a->profile['uid'])) {
@ -122,179 +113,10 @@ function display_content(&$a) {
);
}
foreach($r as $item) {
like_puller($a,$item,$alike,'like');
like_puller($a,$item,$dlike,'dislike');
}
$author_contacts = extract_item_authors($r,$a->profile['uid']);
foreach($r as $item) {
$template = $tpl;
$comment = '';
$owner_url = '';
$owner_photo = '';
$owner_name = '';
$redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ;
if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE)))
&& ($item['id'] != $item['parent']))
continue;
$lock = ((($item['private']) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
|| strlen($item['deny_cid']) || strlen($item['deny_gid']))))
? '<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="' . t('Private Message') . '" onclick="lockview(event,' . $item['id'] . ');" /></div>'
: '<div class="wall-item-lock"></div>');
if(can_write_wall($a,$a->profile['uid'])) {
if($item['id'] == $item['parent']) {
$likebuttons = replace_macros($like_tpl,array(
'$id' => $item['id'],
'$likethis' => t("I like this \x28toggle\x29"),
'$nolike' => t("I don't like this \x28toggle\x29"),
'$share' => t('Share'),
'$wait' => t('Please wait')
));
}
if($item['last-child']) {
$comment = replace_macros($cmnt_tpl,array(
'$return_path' => '',
'$jsreload' => $_SESSION['return_url'],
'$type' => 'wall-comment',
'$id' => $item['item_id'],
'$parent' => $item['parent'],
'$profile_uid' => $a->profile['uid'],
'$mylink' => $contact['url'],
'$mytitle' => t('This is you'),
'$myphoto' => $contact['thumb'],
'$ww' => ''
));
}
}
$profile_url = $item['url'];
$sparkle = '';
// Top-level wall post not written by the wall owner (wall-to-wall)
// First figure out who owns it.
$osparkle = '';
require_once('include/conversation.php');
if(($item['parent'] == $item['item_id']) && (! $item['self'])) {
if($item['type'] === 'wall') {
// I do. Put me on the left of the wall-to-wall notice.
$owner_url = $a->contact['url'];
$owner_photo = $a->contact['thumb'];
$owner_name = $a->contact['name'];
$template = $wallwall;
$commentww = 'ww';
}
if($item['type'] === 'remote' && ($item['owner-link'] != $item['author-link'])) {
// Could be anybody.
$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'] === 'dfrn')) {
$owner_url = $redirect_url;
$osparkle = ' sparkle';
}
$o .= conversation($a,$r,'display', false);
}
}
$diff_author = ((link_compare($item['url'],$item['author-link'])) ? false : true);
$profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
$profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $item['thumb']);
$edpost = '';
if((local_user()) && ($item['uid'] == local_user()) && ($item['id'] == $item['parent']) && (intval($item['wall']) == 1))
$edpost = '<a class="editpost" href="' . $a->get_baseurl() . '/editpost/' . $item['id'] . '" title="' . t('Edit') . '"><img src="images/pencil.gif" /></a>';
// Can we use our special contact URL for this author?
if(strlen($item['author-link'])) {
$profile_link = $item['author-link'];
if(link_compare($item['author-link'],$item['url']) && ($item['network'] === 'dfrn') && (! $item['self'])) {
$profile_link = $redirect_url;
$sparkle = ' sparkle';
}
elseif(isset($author_contacts[$item['author-link']])) {
$profile_link = $a->get_baseurl() . '/redir/' . $author_contacts[$item['author-link']];
$sparkle = ' sparkle';
}
}
if(($item['contact-id'] == remote_user()) || ($item['uid'] == local_user()))
$drop = replace_macros(load_view_file('view/wall_item_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
else
$drop = replace_macros(load_view_file('view/wall_fake_drop.tpl'), array('$id' => $item['id']));
$like = ((isset($alike[$item['id']])) ? format_like($alike[$item['id']],$alike[$item['id'] . '-l'],'like',$item['id']) : '');
$dislike = ((isset($dlike[$item['id']])) ? format_like($dlike[$item['id']],$dlike[$item['id'] . '-l'],'dislike',$item['id']) : '');
$location = (($item['location']) ? '<a target="map" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
$coord = (($item['coord']) ? '<a target="map" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
if($coord) {
if($location)
$location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
else
$location = '<span class="smalltext">' . $coord . '</span>';
}
$indent = (($item['parent'] != $item['item_id']) ? ' comment' : '');
if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
$indent .= ' shiny';
$tmp_item = replace_macros($template,array(
'$id' => $item['item_id'],
'$linktitle' => t('View $name\'s profile'),
'$olinktitle' => t('View $owner_name\'s profile'),
'$to' => t('to'),
'$wall' => t('Wall-to-Wall'),
'$vwall' => t('via Wall-To-Wall:'),
'$item_photo_menu' => item_photo_menu($item),
'$profile_url' => $profile_link,
'$name' => $profile_name,
'$sparkle' => $sparkle,
'$osparkle' => $osparkle,
'$thumb' => $profile_avatar,
'$title' => $item['title'],
'$body' => smilies(bbcode($item['body'])),
'$ago' => relative_date($item['created']),
'$lock' => $lock,
'$location' => $location,
'$indent' => $indent,
'$owner_url' => $owner_url,
'$owner_photo' => $owner_photo,
'$owner_name' => $owner_name,
'$plink' => get_plink($item),
'$edpost' => $edpost,
'$drop' => $drop,
'$vote' => $likebuttons,
'$like' => $like,
'$dislike' => $dislike,
'$comment' => $comment
));
$arr = array('item' => $item, 'output' => $tmp_item);
call_hooks('display_item', $arr);
$o .= $arr['output'];
}
}
else {
$r = q("SELECT `id` FROM `item` WHERE `id` = '%s' OR `uri` = '%s' LIMIT 1",


+ 7
- 3
mod/follow.php View File

@ -195,6 +195,9 @@ function follow_post(&$a) {
if(! x($vcard,'photo'))
$vcard['photo'] = $a->get_baseurl() . '/images/default-profile.jpg' ;
$writeable = ((($network === 'stat') && ($notify)) ? 1 : 0);
// 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
@ -217,8 +220,8 @@ function follow_post(&$a) {
else {
// create contact record
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`,
`blocked`, `readonly`, `pending` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, 0, 0, 0 ) ",
`writable`, `blocked`, `readonly`, `pending` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
intval(local_user()),
dbesc(datetime_convert()),
dbesc($profile),
@ -230,7 +233,8 @@ function follow_post(&$a) {
dbesc($vcard['photo']),
dbesc($network),
intval(REL_FAN),
intval($priority)
intval($priority),
intval($writable)
);
}


+ 11
- 4
mod/group.php View File

@ -128,11 +128,11 @@ function group_content(&$a) {
goaway($a->get_baseurl() . '/contacts');
}
$group = $r[0];
$ret = group_get_members($group['id']);
$members = group_get_members($group['id']);
$preselected = array();
if(count($ret)) {
foreach($ret as $p)
$preselected[] = $p['id'];
if(count($members)) {
foreach($members as $member)
$preselected[] = $member['id'];
}
$drop_tpl = load_view_file('view/group_drop.tpl');
@ -156,6 +156,13 @@ function group_content(&$a) {
));
}
$o .= '<div id="group-members">';
foreach($members as $member) {
$o .= micropro($member,true,'mpgroup');
}
$o .= '</div><div id="group-members-end"></div>';
return $o;
}

+ 10
- 0
mod/install.php View File

@ -118,6 +118,16 @@ function install_content(&$a) {
$tpl = load_view_file('view/install_db.tpl');
$o .= replace_macros($tpl, array(
'$lbl_01' => t('Friendika Social Network'),
'$lbl_02' => t('Installation'),
'$lbl_03' => t('In order to install Friendika we need to know how to contact your database.'),
'$lbl_04' => t('Please contact your hosting provider or site administrator if you have questions about these settings.'),
'$lbl_05' => t('The database you specify below must already exist. If it does not, please create it before continuing.'),
'$lbl_06' => t('Database Server Name'),
'$lbl_07' => t('Database Login Name'),
'$lbl_08' => t('Database Login Password'),
'$lbl_09' => t('Database Name'),
'$lbl_10' => t('Please select a default timezone for your website'),
'$baseurl' => $a->get_baseurl(),
'$tzselect' => ((x($_POST,'timezone')) ? select_timezone($_POST['timezone']) : select_timezone()),
'$submit' => t('Submit'),


+ 7
- 0
mod/lostpass.php View File

@ -71,8 +71,15 @@ function lostpass_content(&$a) {
if($r) {
$tpl = load_view_file('view/pwdreset.tpl');
$o .= replace_macros($tpl,array(
'$lbl1' => t('Password Reset'),
'$lbl2' => t('Your password has been reset as requested.'),
'$lbl3' => t('Your new password is'),
'$lbl4' => t('Save or copy your new password - and then'),
'$lbl5' => '<a href="' . $a->get_baseurl() . '">' . t('click here to login') . '</a>.',
'$lbl6' => t('Your password may be changed from the <em>Settings</em> page after successful login.'),
'$newpass' => $new_password,
'$baseurl' => $a->get_baseurl()
));
notice("Your password has been reset." . EOL);


+ 7
- 337
mod/network.php View File

@ -32,8 +32,6 @@ function network_content(&$a, $update = 0) {
$o = '';
require_once("include/bbcode.php");
$contact_id = $a->cid;
$group = 0;
@ -204,7 +202,7 @@ function network_content(&$a, $update = 0) {
// "New Item View" - show all items unthreaded in reverse created date order
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`,
`contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
FROM `item`, `contact`
@ -248,7 +246,7 @@ function network_content(&$a, $update = 0) {
$parents_str = implode(', ', $parents_arr);
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`,
`contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
`contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
FROM `item`, (SELECT `p`.`id`,`p`.`created` FROM `item` AS `p` WHERE `p`.`parent`=`p`.`id`) as `parentitem`, `contact`
@ -264,345 +262,17 @@ function network_content(&$a, $update = 0) {
}
}
// find all the authors involved in remote conversations
// We will use a local profile photo if they are one of our contacts
// otherwise we have to get the photo from the item owner's site
$author_contacts = extract_item_authors($r,local_user());
$cmnt_tpl = load_view_file('view/comment_item.tpl');
$like_tpl = load_view_file('view/like.tpl');
$noshare_tpl = load_view_file('view/like_noshare.tpl');
$tpl = load_view_file('view/wall_item.tpl');
$wallwall = load_view_file('view/wallwall_item.tpl');
$alike = array();
$dlike = array();
if(count($r)) {
if($nouveau) {
// "New Item View" - just loop through the items and format them minimally for display
$tpl = load_view_file('view/search_item.tpl');
$droptpl = load_view_file('view/wall_fake_drop.tpl');
foreach($r as $item) {
$comment = '';
$owner_url = '';
$owner_photo = '';
$owner_name = '';
$sparkle = '';
$profile_name = ((strlen($item['author-name'])) ? $item['author-name'] : $item['name']);
$profile_avatar = ((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']);
$profile_link = ((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
$redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ;
if(strlen($item['author-link'])) {
if(link_compare($item['author-link'],$item['url']) && ($item['network'] === 'dfrn') && (! $item['self'])) {
$profile_link = $redirect_url;
$sparkle = ' sparkle';
}
elseif(isset($author_contacts[$item['author-link']])) {
$profile_link = $a->get_baseurl() . '/redir/' . $author_contacts[$item['author-link']];
$sparkle = ' sparkle';
}
}
$location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
$coord = (($item['coord']) ? '<a target="map" title="' . $item['coord'] . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
if($coord) {
if($location)
$location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
else
$location = '<span class="smalltext">' . $coord . '</span>';
}
$drop = replace_macros($droptpl,array('$id' => $item['id']));
$lock = '<div class="wall-item-lock"></div>';
$o .= replace_macros($tpl,array(
'$id' => $item['item_id'],
'$linktitle' => t('View $name\'s profile'),
'$profile_url' => $profile_link,
'$item_photo_menu' => item_photo_menu($item),
'$name' => $profile_name,
'$sparkle' => $sparkle,
'$lock' => $lock,
'$thumb' => $profile_avatar,
'$title' => $item['title'],
'$body' => smilies(bbcode($item['body'])),
'$ago' => relative_date($item['created']),
'$location' => $location,
'$indent' => '',
'$owner_url' => $owner_url,
'$owner_photo' => $owner_photo,
'$owner_name' => $owner_name,
'$drop' => $drop,
'$conv' => '<a href="' . $a->get_baseurl() . '/display/' . $a->user['nickname'] . '/' . $item['id'] . '">' . t('View in context') . '</a>'
));
}
$o .= paginate($a);
return $o;
}
// Normal View
// Figure out how many comments each parent has
// (Comments all have gravity of 6)
// Store the result in the $comments array
$comments = array();
foreach($r as $rr) {
if(intval($rr['gravity']) == 6) {
if(! x($comments,$rr['parent']))
$comments[$rr['parent']] = 1;
else
$comments[$rr['parent']] += 1;
}
}
// map all the like/dislike activities for each parent item
// Store these in the $alike and $dlike arrays
foreach($r as $item) {
like_puller($a,$item,$alike,'like');
like_puller($a,$item,$dlike,'dislike');
}
$comments_collapsed = false;
$blowhard = 0;
$blowhard_count = 0;
foreach($r as $item) {
$comment = '';
$template = $tpl;