From 2a17c20fb8e910aeb814ab999cf9131478dd2b03 Mon Sep 17 00:00:00 2001 From: Mike Macgirvin Date: Sat, 17 Jul 2010 07:03:06 -0700 Subject: [PATCH] remote comments - though still needs a bit more work --- include/notifier.php | 25 ++--------- mod/dfrn_notify.php | 62 ++++++++++++++++++-------- mod/network.php | 52 +++++++++++++--------- mod/profile.php | 102 ++++++++++++++----------------------------- 4 files changed, 113 insertions(+), 128 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index cf1076a..37a1e0d 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -170,7 +170,6 @@ if($argc < 3) '$item_id' => xmlify("urn:X-dfrn:$baseurl:{$owner['uid']}:{$item['hash']}"), '$title' => xmlify($item['title']), '$published' => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , 'Y-m-d\TH:i:s\Z')), - '$updated' => xmlify(datetime_convert('UTC', 'UTC', $item['edited'] . '+00:00' , 'Y-m-d\TH:i:s\Z')), '$content' =>xmlify($item['body']), '$parent_id' => xmlify("urn:X-dfrn:$baseurl:{$owner['uid']}:{$items[0]['hash']}"), @@ -184,18 +183,10 @@ if($argc < 3) } $atom .= "\r\n"; - // create a separate feed with comments disabled and send to those who can't respond. + // create a clone of this feed but with comments disabled to send to those who can't respond. $atom_nowrite = str_replace('1','0',$atom); -print_r($atom); - - -dbg(3); - - - -print_r($recipients); if($followup) $recip_str = $parent['contact-id']; @@ -217,17 +208,13 @@ print_r($recipients); if(! strlen($rr['dfrn-id'])) continue; $url = $rr['notify'] . '?dfrn_id=' . $rr['dfrn-id']; -print_r($url); - $xml = fetch_url($url); -echo $xml; -print_r($xml); + $xml = fetch_url($url); + if(! $xml) continue; $res = simplexml_load_string($xml); -print_r($res); -var_dump($res); if((intval($res->status) != 0) || (! strlen($res->challenge)) || ($res->dfrn_id != $rr['dfrn-id'])) continue; @@ -236,9 +223,6 @@ var_dump($res); $postvars['dfrn_id'] = $rr['dfrn-id']; $challenge = hex2bin($res->challenge); -echo "dfrn-id:" . $res->dfrn_id . "\r\n"; -echo "challenge:" . $res->challenge . "\r\n"; -echo "pubkey:" . $rr['pubkey'] . "\r\n"; openssl_public_decrypt($challenge,$postvars['challenge'],$rr['pubkey']); @@ -247,10 +231,9 @@ echo "pubkey:" . $rr['pubkey'] . "\r\n"; else $postvars['data'] = $atom_nowrite; -print_r($postvars); + $xml = post_url($url,$postvars); -print_r($xml); } killme(); diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index c5c0513..0f5f5eb 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -45,7 +45,7 @@ function get_atom_elements($item) { } -function post_remote($arr) { +function post_remote($a,$arr) { $arr['hash'] = random_string(); $arr['type'] = 'remote'; @@ -55,11 +55,10 @@ function post_remote($arr) { $arr['owner-name'] = notags(trim($arr['owner-name'])); $arr['owner-link'] = notags(trim($arr['owner-link'])); $arr['owner-avatar'] = notags(trim($arr['owner-avatar'])); -// must pass $a -// if(! strlen($arr['remote-avatar'])) -// $arr['remote-avatar'] = $a->get_baseurl() . '/images/default-profile-sm.jpg'; -// if(! strlen($arr['owner-avatar'])) -// $arr['owner-avatar'] = $a->get_baseurl() . '/images/default-profile-sm.jpg'; + if(! strlen($arr['remote-avatar'])) + $arr['remote-avatar'] = $a->get_baseurl() . '/images/default-profile-sm.jpg'; + if(! strlen($arr['owner-avatar'])) + $arr['owner-avatar'] = $a->get_baseurl() . '/images/default-profile-sm.jpg'; $arr['created'] = datetime_convert('UTC','UTC',$arr['created'],'Y-m-d H:i:s'); $arr['edited'] = datetime_convert('UTC','UTC',$arr['edited'],'Y-m-d H:i:s'); $arr['title'] = notags(trim($arr['title'])); @@ -68,9 +67,17 @@ function post_remote($arr) { $arr['visible'] = 1; $arr['deleted'] = 0; - $parent = $arr['parent_urn']; + $local_parent = false; - unset($arr['parent_urn']); + if(isset($arr['parent_hash'])) { + $local_parent = true; + $parent = $arr['parent_hash']; + unset($arr['parent_hash']); + } + else { + $parent = $arr['parent_urn']; + unset($arr['parent_urn']); + } $parent_id = 0; @@ -82,11 +89,18 @@ function post_remote($arr) { . implode("', '", array_values($arr)) . "')" ); - - $r = q("SELECT `id` FROM `item` WHERE `remote-id` = '%s' AND `uid` = %d LIMIT 1", - dbesc($parent), - intval($arr['uid']) - ); + if($local_parent) { + $r = q("SELECT `id` FROM `item` WHERE `hash` = '%s' AND `uid` = %d LIMIT 1", + dbesc($parent), + intval($arr['uid']) + ); + } + else { + $r = q("SELECT `id` FROM `item` WHERE `remote-id` = '%s' AND `uid` = %d LIMIT 1", + dbesc($parent), + intval($arr['uid']) + ); + } if(count($r)) $parent_id = $r[0]['id']; @@ -103,10 +117,11 @@ function post_remote($arr) { intval($current_post) ); + return $current_post; } function dfrn_notify_post(&$a) { -dbg(3); + $dfrn_id = notags(trim($_POST['dfrn_id'])); $challenge = notags(trim($_POST['challenge'])); $data = $_POST['data']; @@ -160,8 +175,21 @@ dbg(3); if($is_reply) { - if($x == ($total_items - 1)) { + if($feed->get_item_quantity() == 1) { // remote reply to our post. Import and then notify everybody else. + $datarray = get_atom_elements($item); + $urn = explode(':',$parent_urn); + $datarray['parent_hash'] = $urn[4]; + $datarray['uid'] = $importer['uid']; + $datarray['contact-id'] = $importer['id']; + $r = post_remote($a,$datarray); + + $url = bin2hex($a->get_baseurl()); + + proc_close(proc_open("php include/notifier.php $url $notify_type $r > notify.log &", array(),$foo)); + + return; + } else { // regular comment that is part of this total conversation. Have we seen it? If not, import it. @@ -186,7 +214,7 @@ dbg(3); $datarray['parent_urn'] = $parent_urn; $datarray['uid'] = $importer['uid']; $datarray['contact-id'] = $importer['id']; - $r = post_remote($datarray); + $r = post_remote($a,$datarray); continue; } } @@ -214,7 +242,7 @@ dbg(3); $datarray['parent_urn'] = $item_id; $datarray['uid'] = $importer['uid']; $datarray['contact-id'] = $importer['id']; - $r = post_remote($datarray); + $r = post_remote($a,$datarray); continue; } diff --git a/mod/network.php b/mod/network.php index 7fb12bd..2685959 100644 --- a/mod/network.php +++ b/mod/network.php @@ -13,13 +13,13 @@ function network_content(&$a) { require_once("include/bbcode.php"); - $contact_id = $a->cid; $tpl = file_get_contents('view/jot-header.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, array('$baseurl' => $a->get_baseurl())); + require_once('view/acl_selectors.php'); $tpl = file_get_contents("view/jot.tpl"); @@ -34,12 +34,6 @@ function network_content(&$a) { )); - // TODO - // Alter registration and settings - // and profile to update contact table when names and photos change. - // work on item_display and can_write_wall - - $sql_extra = ''; @@ -49,12 +43,10 @@ function network_content(&$a) { AND `contact`.`blocked` = 0 $sql_extra ", intval($_SESSION['uid']) - ); if(count($r)) $a->set_pager_total($r[0]['total']); -dbg(2); $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, @@ -68,13 +60,11 @@ dbg(2); intval($_SESSION['uid']), intval($a->pager['start']), intval($a->pager['itemspage']) - ); $cmnt_tpl = file_get_contents('view/comment_item.tpl'); - $tpl = file_get_contents('view/wall_item.tpl'); $wallwall = file_get_contents('view/wallwall_item.tpl'); @@ -85,8 +75,17 @@ dbg(2); $template = $tpl; $commentww = ''; + $profile_url = $item['url']; + $redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ; + + + // Top-level wall post not written by the wall owner (wall-to-wall) + // First figure out who owns it. + 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']; @@ -94,11 +93,16 @@ dbg(2); $commentww = 'ww'; } if($item['type'] == 'remote' && ($item['owner-link'] != $item['remote-link'])) { + // Could be anybody. $owner_url = $item['owner-link']; $owner_photo = $item['owner-avatar']; $owner_name = $item['owner-name']; $template = $wallwall; - $commentww = 'ww'; + $commentww = 'ww'; + // If it is our contact, use a friendly redirect link + if($item['owner-link'] == $item['url']) + $owner_url = $redirect_url; + } } @@ -112,18 +116,29 @@ dbg(2); } - $profile_url = $item['url']; - if(($item['contact-uid'] == $_SESSION['uid']) && (strlen($item['dfrn-id'])) && (! $item['self'] )) - $profile_url = $a->get_baseurl() . '/redir/' . $item['cid'] ; + $profile_url = $redirect_url; $photo = $item['photo']; $thumb = $item['thumb']; + // Post was remotely authored. + $profile_name = ((strlen($item['remote-name'])) ? $item['remote-name'] : $item['name']); - $profile_link = ((strlen($item['remote-link'])) ? $item['remote-link'] : $profile_url); $profile_avatar = ((strlen($item['remote-avatar'])) ? $item['remote-avatar'] : $thumb); + $profile_link = $profile_url; + + // Can we use our special contact URL for this author? + + if(strlen($item['remote-link'])) { + if($item['remote-link'] == $item['url']) + $profile_link = $redirect_url; + else + $profile_link = $item['remote-link']; + } + + // Build the HTML $o .= replace_macros($template,array( '$id' => $item['item_id'], @@ -138,13 +153,8 @@ dbg(2); '$owner_name' => $owner_name, '$comment' => $comment )); - } } - $o .= paginate($a); - return $o; - - } \ No newline at end of file diff --git a/mod/profile.php b/mod/profile.php index f3ec573..7b54340 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -27,7 +27,7 @@ function profile_load(&$a,$uid,$profile = 0) { ); if(($r === false) || (! count($r))) { - $_SESSION['sysmsg'] .= "No profile" . EOL ; + notice("No profile" . EOL ); $a->error = 404; return; } @@ -46,7 +46,7 @@ function profile_init(&$a) { if($a->argc > 1) $which = $a->argv[1]; else { - $_SESSION['sysmsg'] .= "No profile" . EOL ; + notice("No profile" . EOL ); $a->error = 404; return; } @@ -75,7 +75,6 @@ function profile_content(&$a) { require_once("include/bbcode.php"); require_once('include/security.php'); - $a->page['htmlhead'] .= ''; $groups = array(); $tab = 'posts'; @@ -95,19 +94,14 @@ function profile_content(&$a) { $groups = init_groups_visitor($contact_id); } if(local_user()) { - $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1", - $_SESSION['uid'] - ); - if(count($r)) - $contact_id = $r[0]['id']; + $contact_id = $_SESSION['cid']; } if($tab == 'profile') { - require_once('view/profile_advanced.php'); - return $o; } + if(can_write_wall($a,$a->profile['profile_uid'])) { $tpl = file_get_contents('view/jot-header.tpl'); @@ -127,14 +121,9 @@ function profile_content(&$a) { } - // TODO - // Alter registration and settings - // and profile to update contact table when names and photos change. - // work on item_display and can_write_wall + // TODO alter registration and settings and profile to update contact table when names and photos change. - // Add comments. - - // default - anonymous user + // default permissions - anonymous user $sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' "; @@ -166,7 +155,7 @@ function profile_content(&$a) { $r = q("SELECT COUNT(*) AS `total` FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0 - AND `contact`.`blocked` = 0 + AND `item`.`type` != 'remote' AND `contact`.`blocked` = 0 $sql_extra ", intval($a->profile['uid']) @@ -174,7 +163,7 @@ function profile_content(&$a) { if(count($r)) $a->set_pager_total($r[0]['total']); -dbg(2); + $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, @@ -195,40 +184,22 @@ dbg(2); $cmnt_tpl = file_get_contents('view/comment_item.tpl'); $tpl = file_get_contents('view/wall_item.tpl'); - $wallwall = file_get_contents('view/wallwall_item.tpl'); if(count($r)) { foreach($r as $item) { $comment = ''; $template = $tpl; - $commentww = ''; - if(($item['parent'] == $item['item_id']) && (! $item['self'])) { - if($item['type'] == 'wall') { - $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['remote-link'])) { - $owner_url = $item['owner-link']; - $owner_photo = $item['owner-avatar']; - $owner_name = $item['owner-name']; - $template = $wallwall; - $commentww = 'ww'; - } - } - - - + + $redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ; + if(can_write_wall($a,$a->profile['profile_uid'])) { if($item['last-child']) { $comment = replace_macros($cmnt_tpl,array( '$id' => $item['item_id'], '$parent' => $item['parent'], '$profile_uid' => $a->profile['profile_uid'], - '$ww' => $commentww + '$ww' => '' )); } } @@ -236,47 +207,40 @@ dbg(2); $profile_url = $item['url']; + // This is my profile but I'm not the author of this post/comment. If it's somebody that's a fan or mutual friend, + // I can go directly to their profile as an authenticated guest. + if(local_user() && ($item['contact-uid'] == $_SESSION['uid']) && (strlen($item['dfrn-id'])) && (! $item['self'] )) - $profile_url = $a->get_baseurl() . '/redir/' . $item['cid'] ; + $profile_url = $redirect_url; + + // FIXME tryng to solve the mishmash of profile photos. // $photo = (($item['self']) ? $a->profile['photo'] : $item['photo']); // $thumb = (($item['self']) ? $a->profile['thumb'] : $item['thumb']); + + // We received this post via a remote feed. It's either a wall-to-wall or a remote comment. The author is + // known to us and is reflected in the contact-id for this item. We can use the contact url or redirect rather than + // use the link in the feed. This is different than on the network page where we may not know the author. + $profile_name = ((strlen($item['remote-name'])) ? $item['remote-name'] : $item['name']); - $profile_link = ((strlen($item['remote-link'])) ? $item['remote-link'] : $profile_url); $profile_avatar = ((strlen($item['remote-avatar'])) ? $item['remote-avatar'] : $item['thumb']); - - + $profile_link = $profile_url; $o .= replace_macros($template,array( - '$id' => $item['item_id'], - '$profile_url' => $profile_link, - '$name' => $profile_name, - '$thumb' => $profile_avatar, - '$body' => bbcode($item['body']), - '$ago' => relative_date($item['created']), - '$indent' => (($item['parent'] != $item['item_id']) ? 'comment-' : ''), - '$owner_url' => $owner_url, - '$owner_photo' => $owner_photo, - '$owner_name' => $owner_name, - '$comment' => $comment - )); - - - - - - - - - - + '$id' => $item['item_id'], + '$profile_url' => $profile_link, + '$name' => $profile_name, + '$thumb' => $profile_avatar, + '$body' => bbcode($item['body']), + '$ago' => relative_date($item['created']), + '$indent' => (($item['parent'] != $item['item_id']) ? 'comment-' : ''), + '$comment' => $comment + )); } } $o .= paginate($a); return $o; - - } \ No newline at end of file