diff options
author | Chris Case <kahotep@bunda.dreamhost.com> | 2011-05-21 21:40:16 -0700 |
---|---|---|
committer | Chris Case <kahotep@bunda.dreamhost.com> | 2011-05-21 21:40:16 -0700 |
commit | 4cff911939b263993eb41682ca558c975e2db01f (patch) | |
tree | 78f58e08d04413827744689d0f5df7660bee6caa /mod | |
parent | 2cf696d0b5d647e1741d2f94ee379aa19b25ae1b (diff) | |
parent | f3f063c0dd7fd8b706987b856d79c7b58924acbb (diff) | |
download | volse-hubzilla-4cff911939b263993eb41682ca558c975e2db01f.tar.gz volse-hubzilla-4cff911939b263993eb41682ca558c975e2db01f.tar.bz2 volse-hubzilla-4cff911939b263993eb41682ca558c975e2db01f.zip |
merged multipart email changes
Diffstat (limited to 'mod')
53 files changed, 2205 insertions, 1405 deletions
diff --git a/mod/api.php b/mod/api.php new file mode 100644 index 000000000..fa5e43de9 --- /dev/null +++ b/mod/api.php @@ -0,0 +1,11 @@ +<?php + +require_once('include/api.php'); + +function api_content(&$a) { + echo api_call($a); + killme(); +} + + + diff --git a/mod/apps.php b/mod/apps.php index 1d08d2e7f..58752de32 100644 --- a/mod/apps.php +++ b/mod/apps.php @@ -5,10 +5,11 @@ function apps_content(&$a) { $o .= '<h3>' . t('Applications') . '</h3>'; + $o .= '<div class="app-title"><a href="notes">' . t('Private Notes') . '</a></div>'; + if($a->apps) $o .= $a->apps; - return $o; }
\ No newline at end of file diff --git a/mod/contacts.php b/mod/contacts.php index c2d28dc1f..0ad0d217f 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -9,15 +9,20 @@ function contacts_init(&$a) { $a->page['aside'] .= group_side(); if($a->config['register_policy'] != REGISTER_CLOSED) - $a->page['aside'] .= '<div class="side-invite-link-wrapper" id="side-invite-link-wrapper" ><a href="invite" class="side-invite-link" id="side-invite-link">' . t("Invite Friends") . '</a></div>'; + $a->page['aside'] .= '<div class="side-link" id="side-invite-link" ><a href="invite" >' . t("Invite Friends") . '</a></div>'; - $tpl = load_view_file('view/follow.tpl'); + if(strlen(get_config('system','directory_submit_url'))) + $a->page['aside'] .= '<div class="side-link" id="side-match-link"><a href="match" >' . t('Find People With Shared Interests') . '</a></div>'; + + $tpl = get_markup_template('follow.tpl'); $a->page['aside'] .= replace_macros($tpl,array( '$label' => t('Connect/Follow'), '$hint' => t('Example: bob@example.com, http://example.com/barbara'), '$follow' => t('Follow') )); + + } function contacts_post(&$a) { @@ -137,7 +142,8 @@ function contacts_content(&$a) { intval(local_user()) ); if($r) { - notice( t('Contact has been ') . (($blocked) ? t('blocked') : t('unblocked')) . EOL ); + //notice( t('Contact has been ') . (($blocked) ? t('blocked') : t('unblocked')) . EOL ); + notice( (($blocked) ? t('Contact has been blocked') : t('Contact has been unblocked')) . EOL ); } goaway($a->get_baseurl() . '/contacts/' . $contact_id); return; // NOTREACHED @@ -151,7 +157,7 @@ function contacts_content(&$a) { intval(local_user()) ); if($r) { - notice( t('Contact has been ') . (($readonly) ? t('ignored') : t('unignored')) . EOL ); + notice( (($readonly) ? t('Contact has been ignored') : t('Contact has been unignored')) . EOL ); } goaway($a->get_baseurl() . '/contacts/' . $contact_id); return; // NOTREACHED @@ -162,7 +168,7 @@ function contacts_content(&$a) { // create an unfollow slap if($orig_record[0]['network'] === 'stat') { - $tpl = load_view_file('view/follow_slap.tpl'); + $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'], @@ -174,8 +180,8 @@ function contacts_content(&$a) { '$type' => 'text', '$content' => t('stopped following'), '$nick' => $a->user['nickname'], - '$verb' => ACTIVITY_UNFOLLOW, - '$ostat_follow' => '<as:verb>http://ostatus.org/schema/1.0/unfollow</as:verb>' . "\r\n" + '$verb' => 'http://ostatus.org/schema/1.0/unfollow', // ACTIVITY_UNFOLLOW, + '$ostat_follow' => '' // '<as:verb>http://ostatus.org/schema/1.0/unfollow</as:verb>' . "\r\n" )); if((x($orig_record[0],'notify')) && (strlen($orig_record[0]['notify']))) { @@ -209,12 +215,12 @@ function contacts_content(&$a) { return; } - $tpl = load_view_file('view/contact_head.tpl'); + $tpl = get_markup_template('contact_head.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, array('$baseurl' => $a->get_baseurl())); require_once('include/contact_selectors.php'); - $tpl = load_view_file("view/contact_edit.tpl"); + $tpl = get_markup_template("contact_edit.tpl"); switch($r[0]['rel']) { case REL_BUD: @@ -243,6 +249,9 @@ function contacts_content(&$a) { $sparkle = ''; } + $insecure = '<div id="profile-edit-insecure"><p><img src="images/unlock_icon.gif" alt="' . t('Privacy Unavailable') . '" /> ' + . t('Private communications are not available for this contact.') . '</p></div>'; + $last_update = (($r[0]['last-update'] == '0000-00-00 00:00:00') ? t('Never') : datetime_convert('UTC',date_default_timezone_get(),$r[0]['last-update'],'D, j M Y, g:i A')); @@ -252,9 +261,20 @@ 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'), + '$altcrepair' => t('Repair contact URL settings'), + '$lblcrepair' => t("Repair contact URL settings \x28WARNING: Advanced\x29"), + '$lblrecent' => t('View conversations'), '$delete' => t('Delete contact'), '$poll_interval' => contact_poll_interval($r[0]['priority']), '$lastupdtext' => t('Last updated: '), @@ -265,7 +285,7 @@ function contacts_content(&$a) { '$contact_id' => $r[0]['id'], '$block_text' => (($r[0]['blocked']) ? t('Unblock this contact') : t('Block this contact') ), '$ignore_text' => (($r[0]['readonly']) ? t('Unignore this contact') : t('Ignore this contact') ), - '$insecure' => (($r[0]['network'] === 'stat') ? load_view_file('view/insecure_net.tpl') : ''), + '$insecure' => (($r[0]['network'] !== NETWORK_DFRN && $r[0]['network'] !== NETWORK_MAIL && $r[0]['network'] !== NETWORK_FACEBOOK) ? $insecure : ''), '$info' => $r[0]['info'], '$blocked' => (($r[0]['blocked']) ? '<div id="block-message">' . t('Currently blocked') . '</div>' : ''), '$ignored' => (($r[0]['readonly']) ? '<div id="ignore-message">' . t('Currently ignored') . '</div>' : ''), @@ -297,7 +317,7 @@ function contacts_content(&$a) { $search = ((x($_GET,'search')) ? notags(trim($_GET['search'])) : ''); - $tpl = load_view_file("view/contacts-top.tpl"); + $tpl = get_markup_template("contacts-top.tpl"); $o .= replace_macros($tpl,array( '$header' => t('Contacts'), '$hide_url' => ((strlen($sql_extra)) ? 'contacts/all' : 'contacts' ), @@ -331,7 +351,7 @@ function contacts_content(&$a) { if(count($r)) { - $tpl = load_view_file("view/contact_template.tpl"); + $tpl = get_markup_template("contact_template.tpl"); foreach($r as $rr) { if($rr['self']) @@ -364,13 +384,14 @@ function contacts_content(&$a) { $o .= replace_macros($tpl, array( - '$img_hover' => t('Visit ') . $rr['name'] . t('\'s profile'), + '$img_hover' => t('Visit $username\'s profile'), '$edit_hover' => t('Edit contact'), '$id' => $rr['id'], '$alt_text' => $alt_text, '$dir_icon' => $dir_icon, '$thumb' => $rr['thumb'], '$name' => substr($rr['name'],0,20), + '$username' => $rr['name'], '$sparkle' => $sparkle, '$url' => $url )); diff --git a/mod/crepair.php b/mod/crepair.php new file mode 100644 index 000000000..01b88d37a --- /dev/null +++ b/mod/crepair.php @@ -0,0 +1,105 @@ +<?php + +function crepair_post(&$a) { + if(! local_user()) + return; + + $cid = (($a->argc > 1) ? intval($a->argv[1]) : 0); + + if($cid) { + $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($cid), + intval(local_user()) + ); + } + + if(! count($r)) + return; + + $contact = $r[0]; + + $nick = ((x($_POST,'nick')) ? $_POST['nick'] : null); + $url = ((x($_POST,'url')) ? $_POST['url'] : null); + $request = ((x($_POST,'request')) ? $_POST['request'] : null); + $confirm = ((x($_POST,'confirm')) ? $_POST['confirm'] : null); + $notify = ((x($_POST,'notify')) ? $_POST['notify'] : null); + $poll = ((x($_POST,'poll')) ? $_POST['poll'] : null); + + + $r = q("UPDATE `contact` SET `nick` = '%s', `url` = '%s', `request` = '%s', `confirm` = '%s', `notify` = '%s', `poll` = '%s' + WHERE `id` = %d AND `uid` = %d LIMIT 1", + dbesc($nick), + dbesc($url), + dbesc($request), + dbesc($confirm), + dbesc($notify), + dbesc($poll), + intval($contact['id']), + local_user() + ); + + if($r) + notice( t('Contact settings applied.') . EOL); + else + notice( t('Contact update failed.') . EOL); + + return; +} + + + +function crepair_content(&$a) { + + if(! local_user()) { + notice( t('Permission denied.') . EOL); + return; + } + + $cid = (($a->argc > 1) ? intval($a->argv[1]) : 0); + + if($cid) { + $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($cid), + intval(local_user()) + ); + } + + if(! count($r)) { + notice( t('Contact not found.') . EOL); + return; + } + + $contact = $r[0]; + + $msg1 = t('Repair Contact Settings'); + + $msg2 = t('<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working.'); + $msg3 = t('Please use your browser \'Back\' button <strong>now</strong> if you are uncertain what to do on this page.'); + + $o .= '<h2>' . $msg1 . '</h2>'; + + $o .= '<div class="error-message">' . $msg2 . EOL . EOL. $msg3 . '</div>'; + + $tpl = get_markup_template('crepair.tpl'); + $o .= replace_macros($tpl, array( + '$label_name' => t('Name'), + '$label_nick' => t('Account Nickname'), + '$label_url' => t('Account URL'), + '$label_request' => t('Friend Request URL'), + '$label_confirm' => t('Friend Confirm URL'), + '$label_notify' => t('Notification Endpoint URL'), + '$label_poll' => t('Poll/Feed URL'), + '$contact_name' => $contact['name'], + '$contact_nick' => $contact['nick'], + '$contact_id' => $contact['id'], + '$contact_url' => $contact['url'], + '$request' => $contact['request'], + '$confirm' => $contact['confirm'], + '$notify' => $contact['notify'], + '$poll' => $contact['poll'], + '$lbl_submit' => t('Submit') + )); + + return $o; + +}
\ No newline at end of file diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 1b42c13b8..4e2a70e04 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -240,7 +240,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { notice( t('Unexpected response from remote site: ') . EOL . $leading_junk . EOL ); } - $xml = simplexml_load_string($res); + $xml = parse_xml_string($res); $status = (int) $xml->status; $message = unxmlify($xml->message); // human readable text of what may have gone wrong. switch($status) { @@ -423,9 +423,11 @@ function dfrn_confirm_post(&$a,$handsfree = null) { $arr['author-avatar'] = $arr['owner-avatar'] = $self[0]['thumb']; $arr['verb'] = ACTIVITY_FRIEND; $arr['object-type'] = ACTIVITY_OBJ_PERSON; - $arr['body'] = '[url=' . $self[0]['url'] . ']' . $self[0]['name'] . '[/url] ' . t('is now friends with') - . ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]' . "\n\n\n" - . ' [url=' . $contact['url'] . ']' . '[img]' . $contact['thumb'] . '[/img][/url]'; + + $A = '[url=' . $self[0]['url'] . ']' . $self[0]['name'] . '[/url]'; + $B = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]'; + $BPhoto = '[url=' . $contact['url'] . ']' . '[img]' . $contact['thumb'] . '[/img][/url]'; + $arr['body'] = sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$Bphoto; $arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $contact['name'] . '</title>' . '<id>' . $contact['url'] . '/' . $contact['name'] . '</id>'; @@ -434,6 +436,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"); @@ -491,7 +498,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { dbesc($node)); if(! count($r)) { - $message = t('No user record found for ') . '\'' . $node . '\''; + $message = sprintf(t('No user record found for \'%s\' '), $node); xml_status(3,$message); // failure // NOTREACHED } @@ -632,8 +639,8 @@ function dfrn_confirm_post(&$a,$handsfree = null) { if((count($r)) && ($r[0]['notify-flags'] & NOTIFY_CONFIRM)) { $tpl = (($new_relation == REL_BUD) - ? load_view_file('view/friend_complete_eml.tpl') - : load_view_file('view/intro_complete_eml.tpl')); + ? get_intltext_template('friend_complete_eml.tpl') + : get_intltext_template('intro_complete_eml.tpl')); $email_tpl = replace_macros($tpl, array( '$sitename' => $a->config['sitename'], @@ -645,8 +652,12 @@ function dfrn_confirm_post(&$a,$handsfree = null) { '$uid' => $newuid ) ); - $res = mail($r[0]['email'], t("Connection accepted at ") . $a->config['sitename'], - $email_tpl, 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] ); + $res = mail($r[0]['email'], sprintf( t("Connection accepted at %s") , $a->config['sitename']), + $email_tpl, + 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n" + . 'Content-type: text/plain; charset=UTF-8' . "\n" + . 'Content-transfer-encoding: 8bit' ); + if(!$res) { // pointless throwing an error here and confusing the person at the other end of the wire. } diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index 3ceb4b3fc..6709ed275 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -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. @@ -198,7 +210,7 @@ function dfrn_notify_post(&$a) { = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"), "<br />\n",$msg['body'])))); // load the template for private message notifications - $tpl = load_view_file('view/mail_received_html_body_eml.tpl'); + $tpl = get_intltext_template('mail_received_html_body_eml.tpl'); $email_html_body_tpl = replace_macros($tpl,array( '$siteName' => $a->config['sitename'], // name of this site '$siteurl' => $a->get_baseurl(), // descriptive url of this site @@ -213,7 +225,7 @@ function dfrn_notify_post(&$a) { )); // load the template for private message notifications - $tpl = load_view_file('view/mail_received_text_body_eml.tpl'); + $tpl = get_intltext_template('mail_received_text_body_eml.tpl'); $email_text_body_tpl = replace_macros($tpl,array( '$siteName' => $a->config['sitename'], // name of this site '$siteurl' => $a->get_baseurl(), // descriptive url of this site @@ -262,10 +274,13 @@ function dfrn_notify_post(&$a) { $when = datetime_convert('UTC','UTC','now','Y-m-d H:i:s'); } if($deleted) { - $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", + + $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `contact-id` = %d LIMIT 1", dbesc($uri), - intval($importer['importer_uid']) + intval($importer['importer_uid']), + intval($importer['id']) ); + if(count($r)) { $item = $r[0]; @@ -374,21 +389,7 @@ function dfrn_notify_post(&$a) { if((! $is_like) && ($importer['notify-flags'] & NOTIFY_COMMENT) && (! $importer['self'])) { require_once('bbcode.php'); $from = stripslashes($datarray['author-name']); - /* - $tpl = load_view_file('view/cmnt_received_eml.tpl'); - $email_tpl = replace_macros($tpl, array( - '$sitename' => $a->config['sitename'], - '$siteurl' => $a->get_baseurl(), - '$username' => $importer['username'], - '$email' => $importer['email'], - '$display' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id, - '$from' => $from, - '$body' => html_entity_decode(strip_tags(bbcode(stripslashes($datarray['body']))), ENT_QUOTES, 'UTF-8') - )); - - $res = mail($importer['email'], $from . t(' commented on an item at ') . $a->config['sitename'], - $email_tpl, "From: " . t('Administrator') . '@' . $a->get_hostname() ); - */ + // name of the automated email sender $msg['notificationfromname'] = stripslashes($datarray['author-name']);; // noreply address to send from @@ -405,7 +406,7 @@ function dfrn_notify_post(&$a) { = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"), "<br />\n",$datarray['body'])))); // load the template for private message notifications - $tpl = load_view_file('view/cmnt_received_html_body_eml.tpl'); + $tpl = get_intltext_template('cmnt_received_html_body_eml.tpl'); $email_html_body_tpl = replace_macros($tpl,array( '$sitename' => $a->config['sitename'], // name of this site '$siteurl' => $a->get_baseurl(), // descriptive url of this site @@ -418,7 +419,7 @@ function dfrn_notify_post(&$a) { )); // load the template for private message notifications - $tpl = load_view_file('view/cmnt_received_text_body_eml.tpl'); + $tpl = get_intltext_template('cmnt_received_text_body_eml.tpl'); $email_text_body_tpl = replace_macros($tpl,array( '$sitename' => $a->config['sitename'], // name of this site '$siteurl' => $a->get_baseurl(), // descriptive url of this site @@ -515,24 +516,6 @@ function dfrn_notify_post(&$a) { continue; require_once('bbcode.php'); $from = stripslashes($datarray['author-name']); - /* - $tpl = load_view_file('view/cmnt_received_eml.tpl'); - $email_tpl = replace_macros($tpl, array( - '$sitename' => $a->config['sitename'], - '$siteurl' => $a->get_baseurl(), - '$username' => $importer['username'], - '$email' => $importer['email'], - '$from' => $from, - '$display' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $r, - '$body' => html_entity_decode(strip_tags(bbcode(stripslashes($datarray['body']))), ENT_QUOTES, 'UTF-8') - )); - - $res = mail($importer['email'], $from . t(" commented on an item at ") - . $a->config['sitename'], - $email_tpl,t("From: Administrator@") . $a->get_hostname() ); - */ - - // name of the automated email sender $msg['notificationfromname'] = stripslashes($datarray['author-name']);; @@ -550,7 +533,7 @@ function dfrn_notify_post(&$a) { = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"), "<br />\n",$datarray['body'])))); // load the template for private message notifications - $tpl = load_view_file('view/cmnt_received_html_body_eml.tpl'); + $tpl = get_intltext_template('cmnt_received_html_body_eml.tpl'); $email_html_body_tpl = replace_macros($tpl,array( '$sitename' => $a->config['sitename'], // name of this site '$siteurl' => $a->get_baseurl(), // descriptive url of this site @@ -562,7 +545,7 @@ function dfrn_notify_post(&$a) { )); // load the template for private message notifications - $tpl = load_view_file('view/cmnt_received_text_body_eml.tpl'); + $tpl = get_intltext_template('cmnt_received_text_body_eml.tpl'); $email_text_body_tpl = replace_macros($tpl,array( '$sitename' => $a->config['sitename'], // name of this site '$siteurl' => $a->get_baseurl(), // descriptive url of this site diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index 334e10307..718aa165c 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -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); @@ -26,6 +27,10 @@ function dfrn_poll_init(&$a) { } if(($dfrn_id === '') && (! x($_POST,'dfrn_id')) && ($a->argc > 1)) { + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + killme(); + } + logger('dfrn_poll: public feed request from ' . $_SERVER['REMOTE_ADDR'] ); header("Content-type: application/atom+xml"); $o = get_feed_for($a, '', $a->argv[1],$last_update); @@ -69,13 +74,14 @@ function dfrn_poll_init(&$a) { if(strlen($s)) { - $xml = simplexml_load_string($s); + $xml = parse_xml_string($s); if((int) $xml->status == 1) { $_SESSION['authenticated'] = 1; $_SESSION['visitor_id'] = $r[0]['id']; $_SESSION['visitor_home'] = $r[0]['url']; - notice( $r[0]['username'] . t(' welcomes ') . $r[0]['name'] . EOL); + $_SESSION['visitor_visiting'] = $r[0]['uid']; + notice( sprintf(t('%s welcomes %s'), $r[0]['username'] , $r[0]['name']) . EOL); // Visitors get 1 day session. $session_id = session_id(); $expire = time() + 86400; @@ -92,7 +98,7 @@ function dfrn_poll_init(&$a) { } - if($type === 'profile-check') { + if($type === 'profile-check' && $dfrn_version < 2.2 ) { if((strlen($challenge)) && (strlen($sec))) { @@ -182,7 +188,69 @@ function dfrn_poll_post(&$a) { $dfrn_id = ((x($_POST,'dfrn_id')) ? $_POST['dfrn_id'] : ''); $challenge = ((x($_POST,'challenge')) ? $_POST['challenge'] : ''); $url = ((x($_POST,'url')) ? $_POST['url'] : ''); + $sec = ((x($_POST,'sec')) ? $_POST['sec'] : ''); + $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') { + + if((strlen($challenge)) && (strlen($sec))) { + + logger('dfrn_poll: POST: profile-check'); + + q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time())); + $r = q("SELECT * FROM `profile_check` WHERE `sec` = '%s' ORDER BY `expire` DESC LIMIT 1", + dbesc($sec) + ); + if(! count($r)) { + xml_status(3, 'No ticket'); + // NOTREACHED + } + $orig_id = $r[0]['dfrn_id']; + if(strpos($orig_id, ':')) + $orig_id = substr($orig_id,2); + + $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", + intval($r[0]['cid']) + ); + if(! count($c)) { + xml_status(3, 'No profile'); + } + $contact = $c[0]; + + $sent_dfrn_id = hex2bin($dfrn_id); + $challenge = hex2bin($challenge); + + $final_dfrn_id = ''; + + if(($contact['duplex']) && strlen($contact['prvkey'])) { + openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']); + openssl_private_decrypt($challenge,$decoded_challenge,$contact['prvkey']); + } + else { + openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']); + openssl_public_decrypt($challenge,$decoded_challenge,$contact['pubkey']); + } + + $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.')); + + if(strpos($final_dfrn_id,':') == 1) + $final_dfrn_id = substr($final_dfrn_id,2); + + if($final_dfrn_id != $orig_id) { + logger('profile_check: ' . $final_dfrn_id . ' != ' . $orig_id, LOGGER_DEBUG); + // did not decode properly - cannot trust this site + xml_status(3, 'Bad decryption'); + } + + header("Content-type: text/xml"); + echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?><dfrn_poll><status>0</status><challenge>$decoded_challenge</challenge><sec>$sec</sec></dfrn_poll>"; + killme(); + // NOTREACHED + } + + } $direction = (-1); if(strpos($dfrn_id,':') == 1) { @@ -234,6 +302,7 @@ function dfrn_poll_post(&$a) { if(! count($r)) killme(); + $contact = $r[0]; $owner_uid = $r[0]['uid']; $contact_id = $r[0]['id']; @@ -267,6 +336,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; @@ -283,6 +369,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) { @@ -363,21 +450,51 @@ function dfrn_poll_content(&$a) { } if(($type === 'profile') && (strlen($sec))) { + // URL reply - $s = fetch_url($r[0]['poll'] - . '?dfrn_id=' . $encrypted_id - . '&type=profile-check' - . '&dfrn_version=' . DFRN_PROTOCOL_VERSION - . '&challenge=' . $challenge - . '&sec=' . $sec - ); + if($dfrn_version < 2.2) { + $s = fetch_url($r[0]['poll'] + . '?dfrn_id=' . $encrypted_id + . '&type=profile-check' + . '&dfrn_version=' . DFRN_PROTOCOL_VERSION + . '&challenge=' . $challenge + . '&sec=' . $sec + ); + } + else { + $s = post_url($r[0]['poll'], array( + 'dfrn_id' => $encrypted_id, + 'type' => 'profile-check', + 'dfrn_version' => DFRN_PROTOCOL_VERSION, + 'challenge' => $challenge, + 'sec' => $sec + )); + } + + $profile = $r[0]['nickname']; + + switch($destination_url) { + case 'profile': + $dest = $a->get_baseurl() . '/profile/' . $profile . '?tab=profile'; + break; + case 'photos': + $dest = $a->get_baseurl() . '/photos/' . $profile; + break; + case 'status': + case '': + $dest = $a->get_baseurl() . '/profile/' . $profile; + break; + default: + $dest = $destination_url; + break; + } logger("dfrn_poll: sec profile: " . $s, LOGGER_DATA); if(strlen($s) && strstr($s,'<?xml')) { - $xml = simplexml_load_string($s); + $xml = parse_xml_string($s); logger('dfrn_poll: profile: parsed xml: ' . print_r($xml,true), LOGGER_DATA); @@ -389,7 +506,8 @@ function dfrn_poll_content(&$a) { $_SESSION['authenticated'] = 1; $_SESSION['visitor_id'] = $r[0]['id']; $_SESSION['visitor_home'] = $r[0]['url']; - notice( $r[0]['username'] . t(' welcomes ') . $r[0]['name'] . EOL); + $_SESSION['visitor_visiting'] = $r[0]['uid']; + notice( sprintf(t('%s welcomes %s'), $r[0]['username'] , $r[0]['name']) . EOL); // Visitors get 1 day session. $session_id = session_id(); $expire = time() + 86400; @@ -398,10 +516,10 @@ function dfrn_poll_content(&$a) { dbesc($session_id) ); } - $profile = $r[0]['nickname']; - goaway((strlen($destination_url)) ? $destination_url : $a->get_baseurl() . '/profile/' . $profile); + + goaway($dest); } - goaway($a->get_baseurl()); + goaway($dest); // NOTREACHED } diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php index 24c466bba..8b44d22ba 100644 --- a/mod/dfrn_request.php +++ b/mod/dfrn_request.php @@ -12,6 +12,10 @@ if(! function_exists('dfrn_request_init')) { function dfrn_request_init(&$a) { + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + return; + } + if($a->argc > 1) $which = $a->argv[1]; @@ -123,9 +127,9 @@ function dfrn_request_post(&$a) { notice( t('Warning: profile location has no profile photo.') . EOL ); $invalid = validate_dfrn($parms); if($invalid) { - notice( $invalid . t(' required parameter') - . (($invalid == 1) ? t(" was ") : t("s were ") ) - . t("not found at the given location.") . EOL ) ; + notice( sprintf( tt("%d required parameter was not found at the given location", + "%d required parameters were not found at the given location", + $invalid), $invalid) . EOL ); return; } } @@ -238,7 +242,7 @@ function dfrn_request_post(&$a) { intval($uid) ); if(count($r) > $maxreq) { - notice( $a->profile['name'] . t(' has received too many connection requests today.') . EOL); + notice( sprintf( t('%s has received too many connection requests today.'), $a->profile['name']) . EOL); notice( t('Spam protection measures have been invoked.') . EOL); notice( t('Friends are advised to please try again in 24 hours.') . EOL); return; @@ -306,7 +310,7 @@ function dfrn_request_post(&$a) { return; } elseif($ret[0]['rel'] == REL_BUD) { - notice( t('Apparently you are already friends with .') . $a->profile['name'] . EOL); + notice( sprintf( t('Apparently you are already friends with %s.'), $a->profile['name']) . EOL); return; } else { @@ -354,9 +358,9 @@ function dfrn_request_post(&$a) { notice( t('Warning: profile location has no profile photo.') . EOL ); $invalid = validate_dfrn($parms); if($invalid) { - notice( $invalid . t(' required parameter') - . (($invalid == 1) ? t(" was ") : t("s were ") ) - . t("not found at the given location.") . EOL ) ; + notice( sprintf( tt("%d required parameter was not found at the given location", + "%d required parameters were not found at the given location", + $invalid), $invalid) . EOL ); return; } @@ -495,12 +499,14 @@ function dfrn_request_content(&$a) { $dfrn_url = notags(trim(hex2bin($_GET['dfrn_url']))); $aes_allow = (((x($_GET,'aes_allow')) && ($_GET['aes_allow'] == 1)) ? 1 : 0); $confirm_key = (x($_GET,'confirm_key') ? $_GET['confirm_key'] : ""); - $o .= load_view_file("view/dfrn_req_confirm.tpl"); - $o = replace_macros($o,array( + $tpl = get_markup_template("dfrn_req_confirm.tpl"); + $o = replace_macros($tpl,array( '$dfrn_url' => $dfrn_url, '$aes_allow' => (($aes_allow) ? '<input type="hidden" name="aes_allow" value="1" />' : "" ), '$confirm_key' => $confirm_key, - '$username' => $a->user['username'], + '$welcome' => sprintf( t('Welcome home %s.'), $a->user['username']), + '$please' => sprintf( t('Please confirm your introduction/connection request to %s.'), $dfrn_url), + '$submit' => t('Confirm'), '$uid' => $_SESSION['uid'], '$nickname' => $a->user['nickname'], 'dfrn_rawurl' => $_GET['dfrn_url'] @@ -531,7 +537,7 @@ function dfrn_request_content(&$a) { if($r[0]['page-flags'] != PAGE_NORMAL) $auto_confirm = true; if(($r[0]['notify-flags'] & NOTIFY_INTRO) && (! $auto_confirm)) { - $email_tpl = load_view_file('view/request_notify_eml.tpl'); + $email_tpl = get_intltext_template('request_notify_eml.tpl'); $email = replace_macros($email_tpl, array( '$requestor' => ((strlen(stripslashes($r[0]['name']))) ? stripslashes($r[0]['name']) : t('[Name Withheld]')), '$url' => stripslashes($r[0]['url']), @@ -540,9 +546,12 @@ function dfrn_request_content(&$a) { '$sitename' => $a->config['sitename'] )); $res = mail($r[0]['email'], - t("Introduction received at ") . $a->config['sitename'], + t("Introduction received at ") . $a->config['sitename'], $email, - 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] ); + 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n" + . 'Content-type: text/plain; charset=UTF-8' . "\n" + . 'Content-transfer-encoding: 8bit' ); + // This is a redundant notification - no point throwing errors if it fails. } if($auto_confirm) { @@ -578,6 +587,12 @@ function dfrn_request_content(&$a) { * Normal web request. Display our user's introduction form. */ + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + notice( t('Public access denied.') . EOL); + return; + } + + /** * Try to auto-fill the profile address */ @@ -607,23 +622,24 @@ function dfrn_request_content(&$a) { */ if($a->profile['page-flags'] == PAGE_NORMAL) - $tpl = load_view_file('view/dfrn_request.tpl'); + $tpl = get_markup_template('dfrn_request.tpl'); else - $tpl = load_view_file('view/auto_request.tpl'); + $tpl = get_markup_template('auto_request.tpl'); $o .= replace_macros($tpl,array( '$header' => t('Friend/Connection Request'), + '$desc' => t('Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca'), '$pls_answer' => t('Please answer the following:'), '$does_know' => t('Does $name know you?'), '$yes' => t('Yes'), '$no' => t('No'), '$add_note' => t('Add a personal note:'), - '$page_desc' => t('Please enter your profile address from one of the following supported social networks:'), + '$page_desc' => t("Please enter your 'Identity Address' from one of the following supported social networks:"), '$friendika' => t('Friendika'), '$statusnet' => t('StatusNet/Federated Social Web'), '$private_net' => t("Private \x28secure\x29 network"), '$public_net' => t("Public \x28insecure\x29 network"), - '$your_address' => t('Your profile address:'), + '$your_address' => t('Your Identity Address:'), '$submit' => t('Submit Request'), '$cancel' => t('Cancel'), '$nickname' => $a->argv[1], diff --git a/mod/directory.php b/mod/directory.php index 0504ac321..dfe8ec0d9 100644 --- a/mod/directory.php +++ b/mod/directory.php @@ -13,6 +13,14 @@ function directory_post(&$a) { function directory_content(&$a) { + + $everything = (($a->argc > 1 && $a->argv[1] === 'all' && is_site_admin()) ? true : false); + + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + notice( t('Public access denied.') . EOL); + return; + } + $o = ''; $o .= '<script> $(document).ready(function() { $(\'#nav-directory-link\').addClass(\'nav-selected\'); });</script>'; if(x($_SESSION,'theme')) @@ -23,7 +31,7 @@ function directory_content(&$a) { else $search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : ''); - $tpl = load_view_file('view/directory_header.tpl'); + $tpl = get_markup_template('directory_header.tpl'); $globaldir = ''; $gdirpath = dirname(get_config('system','directory_submit_url')); @@ -32,32 +40,47 @@ function directory_content(&$a) { . $gdirpath . '">' . t('Global Directory') . '</a></div></li></ul>'; } + $admin = ''; + if(is_site_admin()) { + if($everything) + $admin = '<ul><li><div id="directory-admin-link"><a href="' . $a->get_baseurl() . '/directory' . '">' . t('Normal site view') . '</a></div></li></ul>'; + else + $admin = '<ul><li><div id="directory-admin-link"><a href="' . $a->get_baseurl() . '/directory/all' . '">' . t('View all site entries') . '</a></div></li></ul>'; + } + $o .= replace_macros($tpl, array( '$search' => $search, '$globaldir' => $globaldir, - '$finding' => (strlen($search) ? '<h4>' . t('Finding: ') . "'" . $search . "'" . '</h4>' : "") + '$admin' => $admin, + '$finding' => (strlen($search) ? '<h4>' . t('Finding: ') . "'" . $search . "'" . '</h4>' : ""), + '$sitedir' => t('Site Directory'), + '$submit' => t('Find') )); if($search) $search = dbesc($search); - $sql_extra = ((strlen($search)) ? " AND MATCH (`profile`.`name`, `user`.`nickname`, `pdesc`, `locality`,`region`,`country-name`,`gender`,`marital`,`sexual`,`about`,`romance`,`work`,`education`,`keywords` ) AGAINST ('$search' IN BOOLEAN MODE) " : ""); + $sql_extra = ((strlen($search)) ? " AND MATCH (`profile`.`name`, `user`.`nickname`, `pdesc`, `locality`,`region`,`country-name`,`gender`,`marital`,`sexual`,`about`,`romance`,`work`,`education`,`pub_keywords`,`prv_keywords` ) AGAINST ('$search' IN BOOLEAN MODE) " : ""); - $publish = ((get_config('system','publish_all')) ? '' : " AND `publish` = 1 " ); + $publish = ((get_config('system','publish_all') || $everything) ? '' : " AND `publish` = 1 " ); $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra "); if(count($r)) $a->set_pager_total($r[0]['total']); + if($everything) + $order = " ORDER BY `register_date` DESC "; + else + $order = " ORDER BY `name` ASC "; - $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra ORDER BY `name` ASC LIMIT %d , %d ", + $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ", intval($a->pager['start']), intval($a->pager['itemspage']) ); if(count($r)) { - $tpl = load_view_file('view/directory_item.tpl'); + $tpl = get_markup_template('directory_item.tpl'); if(in_array('small', $a->argv)) $photo = 'thumb'; @@ -86,10 +109,10 @@ function directory_content(&$a) { } if(strlen($rr['dob'])) { if(($years = age($rr['dob'],$rr['timezone'],'')) != 0) - $details .= "<br />Age: $years" ; + $details .= '<br />' . t('Age: ') . $years ; } if(strlen($rr['gender'])) - $details .= '<br />Gender: ' . $rr['gender']; + $details .= '<br />' . t('Gender: ') . $rr['gender']; $entry = replace_macros($tpl,array( '$id' => $rr['id'], @@ -115,7 +138,7 @@ function directory_content(&$a) { } else - notice("No entries (some entries may be hidden)."); + notice( t("No entries \x28some entries may be hidden\x29.") . EOL); return $o; }
\ No newline at end of file diff --git a/mod/display.php b/mod/display.php index 096ea16c9..fdb93e480 100644 --- a/mod/display.php +++ b/mod/display.php @@ -3,6 +3,16 @@ function display_content(&$a) { + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + notice( t('Public access denied.') . EOL); + return; + } + + require_once("include/bbcode.php"); + require_once('include/security.php'); + require_once('include/conversation.php'); + + $o = '<div id="live-display"></div>' . "\r\n"; $nick = (($a->argc > 1) ? $a->argv[1] : ''); @@ -16,15 +26,10 @@ function display_content(&$a) { return; } - require_once("include/bbcode.php"); - require_once('include/security.php'); $groups = array(); - $tab = 'posts'; - - $contact = null; $remote_contact = false; @@ -48,6 +53,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 +98,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 +112,6 @@ function display_content(&$a) { ); - - $cmnt_tpl = load_view_file('view/comment_item.tpl'); - $like_tpl = load_view_file('view/like.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,173 +121,9 @@ 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"), - '$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 = ''; - - 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'; - } - - - } - } - - $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']); - // Can we use our special contact URL for this author? + $o .= conversation($a,$r,'display', false); - 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:'), - '$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), - '$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", diff --git a/mod/editpost.php b/mod/editpost.php new file mode 100644 index 000000000..d211074c9 --- /dev/null +++ b/mod/editpost.php @@ -0,0 +1,120 @@ +<?php + +require_once('acl_selectors.php'); + +function editpost_content(&$a) { + + $o = ''; + + if(! local_user()) { + notice( t('Permission denied.') . EOL); + return; + } + + $post_id = (($a->argc > 1) ? intval($a->argv[1]) : 0); + + if(! $post_id) { + notice( t('Item not found') . EOL); + return; + } + + $itm = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($post_id), + intval(local_user()) + ); + + if(! count($itm)) { + notice( t('Item not found') . EOL); + return; + } + + + $o .= '<h2>' . t('Edit post') . '</h2>'; + + $tpl = get_markup_template('jot-header.tpl'); + + $a->page['htmlhead'] .= replace_macros($tpl, array( + '$baseurl' => $a->get_baseurl(), + '$ispublic' => ' ', // t('Visible to <strong>everybody</strong>'), + '$geotag' => $geotag, + '$nickname' => $a->user['nickname'] + )); + + + $tpl = get_markup_template("jot.tpl"); + + if(($group) || (is_array($a->user) && ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid']))))) + $lockstate = 'lock'; + else + $lockstate = 'unlock'; + + $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false); + + $jotplugins = ''; + $jotnets = ''; + + $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1); + + $mail_enabled = false; + $pubmail_enabled = false; + + if(! $mail_disabled) { + $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1", + intval(local_user()) + ); + if(count($r)) { + $mail_enabled = true; + if(intval($r[0]['pubmail'])) + $pubmail_enabled = true; + } + } + + if($mail_enabled) { + $selected = (($pubmail_enabled) ? ' checked="checked" ' : ''); + $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . 'value="1" /> ' + . t("Post to Email") . '</div>'; + } + + + + call_hooks('jot_tool', $jotplugins); + call_hooks('jot_networks', $jotnets); + + $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins)); + + $o .= replace_macros($tpl,array( + '$return_path' => $_SESSION['return_url'], + '$action' => 'item', + '$share' => t('Edit'), + '$upload' => t('Upload photo'), + '$weblink' => t('Insert web link'), + '$youtube' => t('Insert YouTube video'), + '$video' => t('Insert Vorbis [.ogg] video'), + '$audio' => t('Insert Vorbis [.ogg] audio'), + '$setloc' => t('Set your location'), + '$noloc' => t('Clear browser location'), + '$wait' => t('Please wait'), + '$permset' => t('Permission settings'), + '$ptyp' => $itm[0]['type'], + '$content' => $itm[0]['body'], + '$post_id' => $post_id, + '$baseurl' => $a->get_baseurl(), + '$defloc' => $a->user['default-location'], + '$visitor' => 'none', + '$pvisit' => 'none', + '$emailcc' => t('CC: email addresses'), + '$public' => t('Public post'), + '$jotnets' => $jotnets, + '$emtitle' => t('Example: bob@example.com, mary@example.com'), + '$lockstate' => $lockstate, + '$acl' => '', // populate_acl((($group) ? $group_acl : $a->user), $celeb), + '$bang' => (($group) ? '!' : ''), + '$profile_uid' => $_SESSION['uid'] + )); + + + return $o; + +} + + diff --git a/mod/follow.php b/mod/follow.php index 689ae8232..6786e9039 100644 --- a/mod/follow.php +++ b/mod/follow.php @@ -11,178 +11,56 @@ function follow_post(&$a) { } $url = $orig_url = notags(trim($_POST['url'])); - - $email_conversant = false; - - if($url) { - $links = @lrdd($url); - if(count($links)) { - foreach($links as $link) { - if($link['@attributes']['rel'] === NAMESPACE_DFRN) - $dfrn = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === 'salmon') - $notify = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === NAMESPACE_FEED) - $poll = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === 'http://microformats.org/profile/hcard') - $hcard = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page') - $profile = unamp($link['@attributes']['href']); - - } - - // Status.Net can have more than one profile URL. We need to match the profile URL - // to a contact on incoming messages to prevent spam, and we won't know which one - // to match. So in case of two, one of them is stored as an alias. Only store URL's - // and not webfinger user@host aliases. If they've got more than two non-email style - // aliases, let's hope we're lucky and get one that matches the feed author-uri because - // otherwise we're screwed. - - foreach($links as $link) { - if($link['@attributes']['rel'] === 'alias') { - if(strpos($link['@attributes']['href'],'@') === false) { - if(isset($profile)) { - if($link['@attributes']['href'] !== $profile) - $alias = unamp($link['@attributes']['href']); - } - else - $profile = unamp($link['@attributes']['href']); - } - } - } - } - else { - if((strpos($orig_url,'@')) && validate_email($orig_url)) { - $email_conversant = true; - } - } - } - - // If we find a DFRN site, send our subscriber to the other person's - // dfrn_request page and all the other details will get sorted. - - if(strlen($dfrn)) { - $ret = scrape_dfrn($dfrn); - if(is_array($ret) && x($ret,'dfrn-request')) { - if(strlen($a->path)) - $myaddr = bin2hex($a->get_baseurl() . '/profile/' . $a->user['nickname']); - else - $myaddr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname()); - - goaway($ret['dfrn-request'] . "&addr=$myaddr"); - - // NOTREACHED - } - } - - $network = 'stat'; - $priority = 0; - if($hcard) { - $vcard = scrape_vcard($hcard); + // remove ajax junk - // Google doesn't use absolute url in profile photos + $url = str_replace('/#!/','/',$url); - if((x($vcard,'photo')) && substr($vcard['photo'],0,1) == '/') { - $h = @parse_url($hcard); - if($h) - $vcard['photo'] = $h['scheme'] . '://' . $h['host'] . $vcard['photo']; - } + if(! allowed_url($url)) { + notice( t('Disallowed profile URL.') . EOL); + goaway($_SESSION['return_url']); + // NOTREACHED } - if(! $profile) - $profile = $url; - - - if(! x($vcard,'fn')) - if(x($vcard,'nick')) - $vcard['fn'] = $vcard['nick']; - - if((! isset($vcard)) && (! $poll)) { - - $ret = scrape_feed($url); - - if(count($ret) && ($ret['feed_atom'] || $ret['feed_rss'])) { - $poll = ((x($ret,'feed_atom')) ? unamp($ret['feed_atom']) : unamp($ret['feed_rss'])); - $vcard = array(); - require_once('simplepie/simplepie.inc'); - $feed = new SimplePie(); - $xml = fetch_url($poll); - - $feed->set_raw_data($xml); - - $feed->init(); - - $vcard['photo'] = $feed->get_image_url(); - $author = $feed->get_author(); - if($author) { - $vcard['fn'] = unxmlify(trim($author->get_name())); - if(! $vcard['fn']) - $vcard['fn'] = trim(unxmlify($author->get_email())); - if(strpos($vcard['fn'],'@') !== false) - $vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@')); - $vcard['nick'] = strtolower(notags(unxmlify($vcard['fn']))); - if(strpos($vcard['nick'],' ')) - $vcard['nick'] = trim(substr($vcard['nick'],0,strpos($vcard['nick'],' '))); - $email = unxmlify($author->get_email()); - } - else { - $item = $feed->get_item(0); - if($item) { - $author = $item->get_author(); - if($author) { - $vcard['fn'] = trim(unxmlify($author->get_name())); - if(! $vcard['fn']) - $vcard['fn'] = trim(unxmlify($author->get_email())); - if(strpos($vcard['fn'],'@') !== false) - $vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@')); - $vcard['nick'] = strtolower(unxmlify($vcard['fn'])); - if(strpos($vcard['nick'],' ')) - $vcard['nick'] = trim(substr($vcard['nick'],0,strpos($vcard['nick'],' '))); - $email = unxmlify($author->get_email()); - } - if(! $vcard['photo']) { - $rawmedia = $item->get_item_tags('http://search.yahoo.com/mrss/','thumbnail'); - if($rawmedia && $rawmedia[0]['attribs']['']['url']) - $vcard['photo'] = unxmlify($rawmedia[0]['attribs']['']['url']); - } - } - } - if((! $vcard['photo']) && strlen($email)) - $vcard['photo'] = gravatar_img($email); - - $network = 'feed'; - $priority = 2; - } - } - logger('follow: poll=' . $poll . ' notify=' . $notify . ' profile=' . $profile . ' vcard=' . print_r($vcard,true)); + $ret = probe_url($url); + - $vcard['fn'] = notags($vcard['fn']); - $vcard['nick'] = notags($vcard['nick']); + 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 + } // do we have enough information? - if(! ((x($vcard['fn'])) && ($poll) && ($profile))) { + 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); goaway($_SESSION['return_url']); } - if(! $notify) { + if(! $ret['notify']) { notice( t('Limited profile. This person will be unable to receive direct/personal notifications from you.') . EOL); } - if(! x($vcard,'photo')) - $vcard['photo'] = $a->get_baseurl() . '/images/default-profile.jpg' ; - + $writeable = ((($ret['network'] === NETWORK_OSTATUS) && ($ret['notify'])) ? 1 : 0); + if($ret['network'] === NETWORK_MAIL) { + $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(local_user()), - dbesc($poll) + dbesc($ret['poll']) ); if(count($r)) { @@ -197,26 +75,28 @@ 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 ) ", + $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`, + `writable`, `blocked`, `readonly`, `pending` ) + VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ", intval(local_user()), dbesc(datetime_convert()), - dbesc($profile), - dbesc($alias), - dbesc($notify), - dbesc($poll), - dbesc($vcard['fn']), - dbesc($vcard['nick']), - dbesc($vcard['photo']), - dbesc($network), - intval(REL_FAN), - intval($priority) + dbesc($ret['url']), + dbesc($ret['addr']), + dbesc($ret['alias']), + dbesc($ret['notify']), + dbesc($ret['poll']), + dbesc($ret['name']), + dbesc($ret['nick']), + dbesc($ret['photo']), + dbesc($ret['network']), + intval(($ret['network'] === NETWORK_MAIL) ? REL_BUD : REL_FAN), + intval($ret['priority']), + intval($writeable) ); } $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1", - dbesc($profile), + dbesc($ret['url']), intval(local_user()) ); @@ -231,7 +111,7 @@ function follow_post(&$a) { require_once("Photo.php"); - $photos = import_profile_photo($vcard['photo'],local_user(),$contact_id); + $photos = import_profile_photo($ret['photo'],local_user(),$contact_id); $r = q("UPDATE `contact` SET `photo` = '%s', `thumb` = '%s', @@ -257,7 +137,7 @@ function follow_post(&$a) { // create a follow slap - $tpl = load_view_file('view/follow_slap.tpl'); + $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'], diff --git a/mod/friendika.php b/mod/friendika.php new file mode 100644 index 000000000..c7d8b5b81 --- /dev/null +++ b/mod/friendika.php @@ -0,0 +1,68 @@ +<?php + +function friendika_init(&$a) { + if ($a->argv[1]=="json"){ + $register_policy = Array('REGISTER_CLOSED', 'REGISTER_APPROVE', 'REGISTER_OPEN'); + + if (isset($a->config['admin_email']) && $a->config['admin_email']!=''){ + $r = q("SELECT username, nickname FROM user WHERE email='%s'", $a->config['admin_email']); + $admin = array( + 'name' => $r[0]['username'], + 'profile'=> $a->get_baseurl().'/profile/'.$r[0]['nickname'], + ); + } else { + $admin = false; + } + + $data = Array( + 'version' => FRIENDIKA_VERSION, + 'url' => $a->get_baseurl(), + 'plugins' => $a->plugins, + 'register_policy' => $register_policy[$a->config['register_policy']], + 'admin' => $admin, + 'site_name' => $a->config['sitename'], + + ); + + echo str_replace('\\/','/',json_encode($data)); + killme(); + } +} + + + +function friendika_content(&$a) { + + $o = ''; + $o .= '<h3>Friendika</h3>'; + + + $o .= '<p></p><p>'; + + $o .= 'View <a href="LICENSE">License</a>' . '<br /><br />'; + $o .= t('This is Friendika version') . ' ' . FRIENDIKA_VERSION . ' '; + $o .= t('running at web location') . ' ' . $a->get_baseurl() . '</p><p>'; + + $o .= t('Shared content within the Friendika network is provided under the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 license</a>') . '</p><p>'; + + $o .= t('Please visit <a href="http://project.friendika.com">Project.Friendika.com</a> to learn more about the Friendika project.') . '</p><p>'; + + $o .= t('Bug reports and issues: please visit') . ' ' . '<a href="http://bugs.friendika.com">Bugs.Friendika.com</a></p><p>'; + $o .= t('Suggestions, praise, donations, etc. - please email "Info" at Friendika - dot com') . '</p>'; + + $o .= '<p></p>'; + + if(count($a->plugins)) { + $o .= '<p>' . t('Installed plugins/addons/apps') . '</p>'; + $o .= '<ul>'; + foreach($a->plugins as $p) + if(strlen($p)) + $o .= '<li>' . $p . '</li>'; + $o .= '</ul>'; + } + else + $o .= '<p>' . t('No installed plugins/addons/apps'); + + return $o; + +} diff --git a/mod/group.php b/mod/group.php index fcdc6a758..3da633edf 100644 --- a/mod/group.php +++ b/mod/group.php @@ -55,28 +55,7 @@ function group_post(&$a) { if($r) notice( t('Group name changed.') . EOL ); } - $members = $_POST['group_members_select']; - if(is_array($members)) - array_walk($members,'validate_members'); - $r = q("DELETE FROM `group_member` WHERE `gid` = %d AND `uid` = %d", - intval($a->argv[1]), - intval(local_user()) - ); - $result = true; - if(is_array($members) && count($members)) { - foreach($members as $member) { - $r = q("INSERT INTO `group_member` ( `uid`, `gid`, `contact-id`) - VALUES ( %d, %d, %d )", - intval(local_user()), - intval($group['id']), - intval($member) - ); - if(! $r) - $result = false; - } - } - if($result) - notice( t('Membership list updated.') . EOL); + $a->page['aside'] = group_side(); } return; @@ -90,8 +69,12 @@ function group_content(&$a) { } if(($a->argc == 2) && ($a->argv[1] === 'new')) { - $tpl = load_view_file('view/group_new.tpl'); - $o .= replace_macros($tpl,array()); + $tpl = get_markup_template('group_new.tpl'); + $o .= replace_macros($tpl,array( + '$desc' => t('Create a group of contacts/friends.'), + '$name' => t('Group Name: '), + '$submit' => t('Submit') + )); return $o; } @@ -109,13 +92,22 @@ function group_content(&$a) { notice( t('Unable to remove group.') . EOL); } goaway($a->get_baseurl() . '/group'); - return; // NOTREACHED + // NOTREACHED + } + + if(($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) { + $r = q("SELECT `id` FROM `contact` WHERE `id` = %d AND `uid` = %d and `self` = 0 and `blocked` = 0 AND `pending` = 0 LIMIT 1", + intval($a->argv[2]), + intval(local_user()) + ); + if(count($r)) + $change = intval($a->argv[2]); } + if(($a->argc > 1) && (intval($a->argv[1]))) { - if(($a->argc == 2) && (intval($a->argv[1]))) { require_once('include/acl_selectors.php'); - $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1", + $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1", intval($a->argv[1]), intval(local_user()) ); @@ -124,14 +116,31 @@ 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']; + } + + if($change) { + if(in_array($change,$preselected)) { + group_rmv_member(local_user(),$group['name'],$change); + } + else { + group_add_member(local_user(),$group['name'],$change); + } + + $members = group_get_members($group['id']); + $preselected = array(); + if(count($members)) { + foreach($members as $member) + $preselected[] = $member['id']; + } } - $drop_tpl = load_view_file('view/group_drop.tpl'); + + $drop_tpl = get_markup_template('group_drop.tpl'); $drop_txt = replace_macros($drop_tpl, array( '$id' => $group['id'], '$delete' => t('Delete') @@ -139,15 +148,63 @@ function group_content(&$a) { $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false); - $tpl = load_view_file('view/group_edit.tpl'); + $tpl = get_markup_template('group_edit.tpl'); $o .= replace_macros($tpl, array( '$gid' => $group['id'], '$name' => $group['name'], '$drop' => $drop_txt, - '$selector' => contact_select('group_members_select','group_members_select',$preselected,25,false,$celeb) + '$desc' => t('Click on a contact to add or remove.'), + '$title' => t('Group Editor'), + '$gname' => t('Group Name: '), + '$submit' => t('Submit') )); } + + if(! isset($group)) + return; + + $o .= '<div id="group-update-wrapper">'; + if($change) + $o = ''; + + $o .= '<div id="group-members">'; + $o .= '<h3>' . t('Members') . '</h3>'; + foreach($members as $member) { + if($member['url']) { + $member['click'] = 'groupChangeMember(' . $group['id'] . ',' . $member['id'] . '); return true;'; + $o .= micropro($member,true,'mpgroup'); + } + else + group_rmv_member(local_user(),$group['name'],$member['id']); + } + + $o .= '</div><div id="group-members-end"></div>'; + $o .= '<hr id="group-separator" />'; + $o .= '<div id="group-all-contacts">'; + + $o .= '<h3>' . t('All Contacts') . '</h3>'; + $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `blocked` = 0 and `pending` = 0 and `self` = 0 ORDER BY `name` ASC", + intval(local_user()) + ); + + if(count($r)) { + foreach($r as $member) { + if(! in_array($member['id'],$preselected)) { + $member['click'] = 'groupChangeMember(' . $group['id'] . ',' . $member['id'] . '); return true;'; + $o .= micropro($member,true,'mpall'); + } + } + } + + $o .= '</div><div id="group-all-contacts-end"></div>'; + + if($change) { + echo $o; + killme(); + } + $o .= '</div>'; return $o; -}
\ No newline at end of file +} + diff --git a/mod/help.php b/mod/help.php new file mode 100644 index 000000000..561f5381f --- /dev/null +++ b/mod/help.php @@ -0,0 +1,37 @@ +<?php + +if(! function_exists('load_doc_file')) { +function load_doc_file($s) { + global $lang; + if(! isset($lang)) + $lang = 'en'; + $b = basename($s); + $d = dirname($s); + if(file_exists("$d/$lang/$b")) + return file_get_contents("$d/$lang/$b"); + return file_get_contents($s); +}} + + + +function help_content(&$a) { + + global $lang; + + require_once('library/markdown.php'); + + $text = ''; + + if($a->argc > 1) { + $text = load_doc_file('doc/' . $a->argv[1] . '.md'); + $a->page['title'] = t('Help:') . ' ' . str_replace('-',' ',notags($a->argv[1])); + } + if(! $text) { + $text = load_doc_file('doc/Home.md'); + $a->page['title'] = t('Help'); + } + + + return Markdown($text); + +}
\ No newline at end of file diff --git a/mod/home.php b/mod/home.php index 20d38cfca..225bd294d 100644 --- a/mod/home.php +++ b/mod/home.php @@ -20,7 +20,7 @@ function home_content(&$a) { if(x($_SESSION,'theme')) unset($_SESSION['theme']); - $o .= '<h1>' . ((x($a->config,'sitename')) ? t("Welcome to ").$a->config['sitename'] : "" ) . '</h1>'; + $o .= '<h1>' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '</h1>'; if(file_exists('home.html')) $o .= file_get_contents('home.html'); diff --git a/mod/install.php b/mod/install.php index dc91f848e..b5f056df7 100644 --- a/mod/install.php +++ b/mod/install.php @@ -14,17 +14,20 @@ function install_post(&$a) { $phpath = notags(trim($_POST['phpath'])); require_once("dba.php"); - + unset($db); $db = new dba($dbhost, $dbuser, $dbpass, $dbdata, true); if(mysqli_connect_errno()) { + unset($db); $db = new dba($dbhost, $dbuser, $dbpass, '', true); if(! mysqli_connect_errno()) { $r = q("CREATE DATABASE '%s'", dbesc($dbdata) ); - if($r) + if($r) { + unset($db); $db = new dba($dbhost, $dbuser, $dbpass, $dbdata, true); + } } if(mysqli_connect_errno()) { notice( t('Could not create/connect to database.') . EOL); @@ -34,7 +37,7 @@ function install_post(&$a) { notice( t('Connected to database.') . EOL); - $tpl = load_view_file('view/htconfig.tpl'); + $tpl = get_intltext_template('htconfig.tpl'); $txt = replace_macros($tpl,array( '$dbhost' => $dbhost, '$dbuser' => $dbuser, @@ -50,36 +53,47 @@ function install_post(&$a) { } $errors = load_database($db); - if(! $errors) { - // Our sessions normally are stored in the database. But as we have only managed - // to get it bootstrapped milliseconds ago, we have to apply a bit of trickery so - // that you'll see the following important notice (which is stored in the session). - - session_write_close(); - - require_once('session.php'); - session_start(); - session_regenerate_id(); - $_SESSION['sysmsg'] = ''; + if($errors) + $a->data['db_failed'] = true; + else + $a->data['db_installed'] = true; - notice( t('Database import succeeded.') . EOL - . t('IMPORTANT: You will need to [manually] setup a scheduled task for the poller.') . EOL - . t('Please see the file "INSTALL.txt".') . EOL ); - goaway($a->get_baseurl() . '/register' ); - } - else { - $db = null; // start fresh - notice( t('Database import failed.') . EOL - . t('You may need to import the file "database.sql" manually using phpmyadmin or mysql.') . EOL - . t('Please see the file "INSTALL.txt".') . EOL ); - } + return; } function install_content(&$a) { + global $db; $o = ''; + + if(x($a->data,'db_installed')) { + $o .= '<h2>' . t('Proceed with Installation') . '</h2>'; + $o .= '<p style="font-size: 130%;">'; + $o .= t('Your Friendika site database has been installed.') . EOL; + $o .= t('IMPORTANT: You will need to [manually] setup a scheduled task for the poller.') . EOL ; + $o .= t('Please see the file "INSTALL.txt".') . EOL ; + $o .= '<br />'; + $o .= '<a href="' . $a->get_baseurl() . '/register' . '">' . t('Proceed to registration') . '</a>' ; + $o .= '</p>'; + return $o; + } + + if(x($a->data,'db_failed')) { + $o .= t('Database import failed.') . EOL; + $o .= t('You may need to import the file "database.sql" manually using phpmyadmin or mysql.') . EOL; + $o .= t('Please see the file "INSTALL.txt".') . EOL ; + return $o; + } + + if($db && $db->connected) { + $r = q("SELECT COUNT(*) as `total` FROM `user`"); + if($r && count($r) && $r[0]['total']) { + notice( t('Permission denied.') . EOL); + return ''; + } + } notice( t('Welcome to Friendika.') . EOL); @@ -102,8 +116,18 @@ function install_content(&$a) { require_once('datetime.php'); - $tpl = load_view_file('view/install_db.tpl'); + $tpl = get_markup_template('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'), diff --git a/mod/invite.php b/mod/invite.php index f67432746..b34bb7d74 100644 --- a/mod/invite.php +++ b/mod/invite.php @@ -25,21 +25,25 @@ function invite_post(&$a) { $recip = trim($recip); if(! valid_email($recip)) { - notice( $recip . t(' : ') . t('Not a valid email address.') . EOL); + notice( sprintf( t('%s : Not a valid email address.'), $recip) . EOL); continue; } - $res = mail($recip, t('Please join my network on ') . $a->config['sitename'], - $message, "From: " . $a->user['email']); + $res = mail($recip, sprintf(t('Please join my network on %s'), $a->config['sitename']), + $message, + "From: " . $a->user['email'] . "\n" + . 'Content-type: text/plain; charset=UTF-8' . "\n" + . 'Content-transfer-encoding: 8bit' ); + if($res) { $total ++; } else { - notice( $recip . t(' : ') . t('Message delivery failed.') . EOL); + notice( sprintf( t('%s : Message delivery failed.'), $recip) . EOL); } } - notice( $total . t(' messages sent.') . EOL); + notice( sprintf( tt("%d message sent.", "%d messages sent.", $total) , $total) . EOL); return; } @@ -51,13 +55,13 @@ function invite_content(&$a) { return; } - $tpl = load_view_file('view/invite.tpl'); + $tpl = get_markup_template('invite.tpl'); $o = replace_macros($tpl, array( '$invite' => t('Send invitations'), '$addr_text' => t('Enter email addresses, one per line:'), '$msg_text' => t('Your message:'), - '$default_message' => t('Please join my social network on ') . $a->config['sitename'] . "\r\n" . "\r\n" + '$default_message' => sprintf(t('Please join my social network on %s'), $a->config['sitename']) . "\r\n" . "\r\n" . t('To accept this invitation, please visit:') . "\r\n" . "\r\n" . $a->get_baseurl() . "\r\n" . "\r\n" . t('Once you have registered, please connect with me via my profile page at:') . "\r\n" . "\r\n" . $a->get_baseurl() . '/profile/' . $a->user['nickname'] , diff --git a/mod/item.php b/mod/item.php index ad3298592..0b5e32e88 100644 --- a/mod/item.php +++ b/mod/item.php @@ -51,7 +51,7 @@ function item_post(&$a) { } $profile_uid = ((x($_POST,'profile_uid')) ? intval($_POST['profile_uid']) : 0); - + $post_id = ((x($_POST['post_id'])) ? intval($_POST['post_id']) : 0); if(! can_write_wall($a,$profile_uid)) { notice( t('Permission denied.') . EOL) ; @@ -60,6 +60,21 @@ function item_post(&$a) { killme(); } + + // is this an edited post? + + $orig_post = null; + + if($post_id) { + $i = q("SELECT * FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1", + intval($profile_uid), + intval($post_id) + ); + if(! count($i)) + killme(); + $orig_post = $i[0]; + } + $user = null; $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", @@ -68,37 +83,53 @@ function item_post(&$a) { if(count($r)) $user = $r[0]; - - $str_group_allow = perms2str($_POST['group_allow']); - $str_contact_allow = perms2str($_POST['contact_allow']); - $str_group_deny = perms2str($_POST['group_deny']); - $str_contact_deny = perms2str($_POST['contact_deny']); - - $private = ((strlen($str_group_allow) || strlen($str_contact_allow) || strlen($str_group_deny) || strlen($str_contact_deny)) ? 1 : 0); - - if(($parent_item) && - (($parent_item['private']) - || strlen($parent_item['allow_cid']) - || strlen($parent_item['allow_gid']) - || strlen($parent_item['deny_cid']) - || strlen($parent_item['deny_gid']) - ) - ) { - $private = 1; + if($orig_post) { + $str_group_allow = $orig_post['allow_gid']; + $str_contact_allow = $orig_post['allow_cid']; + $str_group_deny = $orig_post['deny_gid']; + $str_contact_deny = $orig_post['deny_cid']; + $title = $orig_post['title']; + $location = $orig_post['location']; + $coord = $orig_post['coord']; + $verb = $orig_post['verb']; + $emailcc = $orig_post['emailcc']; + + $body = escape_tags(trim($_POST['body'])); + $private = $orig_post['private']; + $pubmail_enable = $orig_post['pubmail']; } + else { + $str_group_allow = perms2str($_POST['group_allow']); + $str_contact_allow = perms2str($_POST['contact_allow']); + $str_group_deny = perms2str($_POST['group_deny']); + $str_contact_deny = perms2str($_POST['contact_deny']); + $title = notags(trim($_POST['title'])); + $location = notags(trim($_POST['location'])); + $coord = notags(trim($_POST['coord'])); + $verb = notags(trim($_POST['verb'])); + $emailcc = notags(trim($_POST['emailcc'])); + + $body = escape_tags(trim($_POST['body'])); + $private = ((strlen($str_group_allow) || strlen($str_contact_allow) || strlen($str_group_deny) || strlen($str_contact_deny)) ? 1 : 0); + + if(($parent_item) && + (($parent_item['private']) + || strlen($parent_item['allow_cid']) + || strlen($parent_item['allow_gid']) + || strlen($parent_item['deny_cid']) + || strlen($parent_item['deny_gid']) + )) { + $private = 1; + } + + $pubmail_enable = ((x($_POST,'pubmail_enable') && intval($_POST['pubmail_enable']) && (! $private)) ? 1 : 0); - $title = notags(trim($_POST['title'])); - $body = escape_tags(trim($_POST['body'])); - $location = notags(trim($_POST['location'])); - $coord = notags(trim($_POST['coord'])); - $verb = notags(trim($_POST['verb'])); - $emailcc = notags(trim($_POST['emailcc'])); - - if(! strlen($body)) { - notice( t('Empty post discarded.') . EOL ); - if(x($_POST,'return')) - goaway($a->get_baseurl() . "/" . $_POST['return'] ); - killme(); + if(! strlen($body)) { + notice( t('Empty post discarded.') . EOL ); + if(x($_POST,'return')) + goaway($a->get_baseurl() . "/" . $_POST['return'] ); + killme(); + } } // get contact info for poster @@ -151,7 +182,6 @@ function item_post(&$a) { } } - /** * * When a photo was uploaded into the message using the (profile wall) ajax @@ -212,6 +242,8 @@ function item_post(&$a) { if(count($tags)) { foreach($tags as $tag) { if(strpos($tag,'#') === 0) { + if(strpos($tag,'[url=')) + continue; $basetag = str_replace('_',' ',substr($tag,1)); $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body); if(strlen($str_tags)) @@ -220,6 +252,8 @@ function item_post(&$a) { continue; } if(strpos($tag,'@') === 0) { + if(strpos($tag,'[url=')) + continue; $stat = false; $name = substr($tag,1); if((strpos($name,'@')) || (strpos($name,'http://'))) { @@ -283,15 +317,13 @@ function item_post(&$a) { $str_tags .= ','; $str_tags .= '@[url=' . $alias . ']' . $newname . '[/url]'; } - } } } } - - $wall = 0; + if($post_type === 'wall' || $post_type === 'wall-comment') $wall = 1; @@ -332,6 +364,7 @@ function item_post(&$a) { $datarray['deny_cid'] = $str_contact_deny; $datarray['deny_gid'] = $str_group_deny; $datarray['private'] = $private; + $datarray['pubmail'] = $pubmail_enable; /** * These fields are for the convenience of plugins... @@ -342,13 +375,35 @@ function item_post(&$a) { $datarray['parent'] = $parent; $datarray['self'] = $self; + if($orig_post) + $datarray['edit'] = true; call_hooks('post_local',$datarray); + + if($orig_post) { + $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1", + dbesc($body), + dbesc(datetime_convert()), + intval($post_id), + intval($profile_uid) + ); + + proc_run('php', "include/notifier.php", 'edit_post', "$post_id"); + if((x($_POST,'return')) && strlen($_POST['return'])) { + logger('return: ' . $_POST['return']); + goaway($a->get_baseurl() . "/" . $_POST['return'] ); + } + killme(); + } + else + $post_id = 0; + + $r = q("INSERT INTO `item` (`uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`, `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `changed`, `uri`, `title`, `body`, `location`, `coord`, - `tag`, `inform`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private` ) - VALUES( %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d )", + `tag`, `inform`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail` ) + VALUES( %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d )", intval($datarray['uid']), dbesc($datarray['type']), intval($datarray['wall']), @@ -375,7 +430,8 @@ function item_post(&$a) { dbesc($datarray['allow_gid']), dbesc($datarray['deny_cid']), dbesc($datarray['deny_gid']), - intval($datarray['private']) + intval($datarray['private']), + intval($datarray['pubmail']) ); $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1", @@ -408,21 +464,7 @@ function item_post(&$a) { if(($user['notify-flags'] & NOTIFY_COMMENT) && ($contact_record != $author)) { require_once('bbcode.php'); $from = $author['name']; - /* - $tpl = load_view_file('view/cmnt_received_eml.tpl'); - $email_tpl = replace_macros($tpl, array( - '$sitename' => $a->config['sitename'], - '$siteurl' => $a->get_baseurl(), - '$username' => $user['username'], - '$email' => $user['email'], - '$from' => $from, - '$display' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id, - '$body' => strip_tags(bbcode($datarray['body'])) - )); - $res = mail($user['email'], $from . t(" commented on your item at ") . $a->config['sitename'], - $email_tpl,t("From: Administrator@") . $a->get_hostname() ); - */ // name of the automated email sender $msg['notificationfromname'] = stripslashes($datarray['author-name']);; // noreply address to send from @@ -439,7 +481,7 @@ function item_post(&$a) { = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"), "<br />\n",$datarray['body'])))); // load the template for private message notifications - $tpl = load_view_file('view/cmnt_received_html_body_eml.tpl'); + $tpl = get_intltext_template('cmnt_received_html_body_eml.tpl'); $email_html_body_tpl = replace_macros($tpl,array( '$sitename' => $a->config['sitename'], // name of this site '$siteurl' => $a->get_baseurl(), // descriptive url of this site @@ -452,7 +494,7 @@ function item_post(&$a) { )); // load the template for private message notifications - $tpl = load_view_file('view/cmnt_received_text_body_eml.tpl'); + $tpl = get_intltext_template('cmnt_received_text_body_eml.tpl'); $email_text_body_tpl = replace_macros($tpl,array( '$sitename' => $a->config['sitename'], // name of this site '$siteurl' => $a->get_baseurl(), // descriptive url of this site @@ -485,22 +527,6 @@ function item_post(&$a) { if(($user['notify-flags'] & NOTIFY_WALL) && ($contact_record != $author)) { require_once('bbcode.php'); $from = $author['name']; - /* - $tpl = load_view_file('view/wall_received_eml.tpl'); - $email_tpl = replace_macros($tpl, array( - '$sitename' => $a->config['sitename'], - '$siteurl' => $a->get_baseurl(), - '$username' => $user['username'], - '$email' => $user['email'], - '$from' => $from, - '$display' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id, - '$body' => strip_tags(bbcode($datarray['body'])) - )); - - $res = mail($user['email'], $from . t(" posted on your profile wall at ") . $a->config['sitename'], - $email_tpl,t("From: Administrator@") . $a->get_hostname() ); - */ - // name of the automated email sender $msg['notificationfromname'] = $from; @@ -583,7 +609,8 @@ function item_post(&$a) { proc_run('php', "include/notifier.php", $notify_type, "$post_id"); - $datarray['id'] = $post_id; + $datarray['id'] = $post_id; + $datarray['plink'] = $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id; call_hooks('post_local_end', $datarray); @@ -594,13 +621,12 @@ function item_post(&$a) { $addr = trim($recip); if(! strlen($addr)) continue; - $disclaimer = '<hr />' . t('This message was sent to you by ') . $a->user['username'] - . t(', a member of the Friendika social network.') . '<br />'; - $disclaimer .= t('You may visit them online at') . ' ' - . $a->get_baseurl() . '/profile/' . $a->user['nickname'] . '<br />'; - $disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . '<br />'; + $disclaimer = '<hr />' . sprintf( t('This message was sent to you by %s, a member of the Friendika social network.'),$a->user['username']) + . '<br />'; + $disclaimer .= sprintf( t('You may visit them online at %s'), $a->get_baseurl() . '/profile/' . $a->user['nickname']) . EOL; + $disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . EOL; - $subject = '[Friendika]' . ' ' . $a->user['username'] . ' ' . t('posted an update.'); + $subject = '[Friendika]' . ' ' . sprintf( t('%s posted an update.'),$a->user['username']); $headers = 'From: ' . $a->user['username'] . ' <' . $a->user['email'] . '>' . "\n"; $headers .= 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n"; @@ -640,7 +666,7 @@ function item_content(&$a) { require_once('include/security.php'); - $uid = $_SESSION['uid']; + $uid = local_user(); if(($a->argc == 3) && ($a->argv[1] === 'drop') && intval($a->argv[2])) { @@ -716,7 +742,8 @@ function item_content(&$a) { // send the notification upstream/downstream as the case may be proc_run('php',"include/notifier.php","drop","$drop_id"); - +// We seem to lose the return url occasionally. Have not been able to reliably duplicate +// logger('drop_return_url: ' . $_SESSION['return_url']); goaway($a->get_baseurl() . '/' . $_SESSION['return_url']); //NOTREACHED } @@ -726,4 +753,4 @@ function item_content(&$a) { //NOTREACHED } } -}
\ No newline at end of file +} diff --git a/mod/like.php b/mod/like.php index 3a8ca4b7d..966fe500b 100644 --- a/mod/like.php +++ b/mod/like.php @@ -124,9 +124,9 @@ function like_content(&$a) { </object> EOT; if($verb === 'like') - $bodyverb = t('likes'); + $bodyverb = t('%1$s likes %2$s\'s %3$s'); if($verb === 'dislike') - $bodyverb = t('doesn\'t like'); + $bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s'); if(! isset($bodyverb)) return; @@ -147,9 +147,11 @@ EOT; $arr['author-name'] = $contact['name']; $arr['author-link'] = $contact['url']; $arr['author-avatar'] = $contact['thumb']; - $arr['body'] = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]' . ' ' . $bodyverb . ' ' - . '[url=' . $item['author-link'] . ']' . $item['author-name'] . t('\'s') . '[/url]' . ' ' - . '[url=' . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . ']' . $post_type . '[/url]' ; + + $ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]'; + $alink = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]'; + $plink = '[url=' . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . ']' . $post_type . '[/url]'; + $arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink ); $arr['verb'] = $activity; $arr['object-type'] = $objtype; @@ -171,6 +173,10 @@ EOT; ); } + $arr['id'] = $post_id; + + call_hooks('post_local_end', $arr); + proc_run('php',"include/notifier.php","like","$post_id"); return; // NOTREACHED diff --git a/mod/lostpass.php b/mod/lostpass.php index 30bdc059c..530619bc4 100644 --- a/mod/lostpass.php +++ b/mod/lostpass.php @@ -24,9 +24,9 @@ function lostpass_post(&$a) { intval($uid) ); if($r) - notice("Password reset request issued. Check your email."); + notice( t('Password reset request issued. Check your email.') . EOL); - $email_tpl = load_view_file("view/lostpass_eml.tpl"); + $email_tpl = get_intltext_template("lostpass_eml.tpl"); $email_tpl = replace_macros($email_tpl, array( '$sitename' => $a->config['sitename'], '$siteurl' => $a->get_baseurl(), @@ -35,8 +35,12 @@ function lostpass_post(&$a) { '$reset_link' => $a->get_baseurl() . '/lostpass?verify=' . $new_password )); - $res = mail($email, t('Password reset requested at ') . $a->config['sitename'], - $email_tpl, 'From: ' . t('Administrator') . '@' . $_SERVER[SERVER_NAME]); + $res = mail($email, sprintf( t('Password reset requested at %s'),$a->config['sitename']), + $email_tpl, + 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n" + . 'Content-type: text/plain; charset=UTF-8' . "\n" + . 'Content-transfer-encoding: 8bit' ); + goaway($a->get_baseurl()); } @@ -53,7 +57,7 @@ function lostpass_content(&$a) { dbesc($hash) ); if(! count($r)) { - notice("Request could not be verified. (You may have previously submitted it.) Password reset failed." . EOL); + notice( t("Request could not be verified. \x28You may have previously submitted it.\x29 Password reset failed.") . EOL); goaway($a->get_baseurl()); return; } @@ -69,16 +73,23 @@ function lostpass_content(&$a) { intval($uid) ); if($r) { - $tpl = load_view_file('view/pwdreset.tpl'); + $tpl = get_markup_template('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); - $email_tpl = load_view_file("view/passchanged_eml.tpl"); + $email_tpl = get_intltext_template("passchanged_eml.tpl"); $email_tpl = replace_macros($email_tpl, array( '$sitename' => $a->config['sitename'], '$siteurl' => $a->get_baseurl(), @@ -87,16 +98,24 @@ function lostpass_content(&$a) { '$new_password' => $new_password, '$uid' => $newuid )); - $res = mail($email,"Your password has changed at {$a->config['sitename']}",$email_tpl,"From: Administrator@{$_SERVER[SERVER_NAME]}"); + $res = mail($email,"Your password has changed at {$a->config['sitename']}",$email_tpl, + 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n" + . 'Content-type: text/plain; charset=UTF-8' . "\n" + . 'Content-transfer-encoding: 8bit' ); return $o; } } else { - $tpl = load_view_file('view/lostpass.tpl'); - - $o .= $tpl; + $tpl = get_markup_template('lostpass.tpl'); + + $o .= replace_macros($tpl,array( + '$title' => t('Forgot your Password?'), + '$desc' => t('Enter your email address and submit to have your password reset. Then check your email for further instructions.'), + '$name' => t('Nickname or Email: '), + '$submit' => t('Reset') + )); return $o; } diff --git a/mod/manage.php b/mod/manage.php index 9981a0446..26f7315c3 100644 --- a/mod/manage.php +++ b/mod/manage.php @@ -34,7 +34,7 @@ function manage_post(&$a) { $_SESSION['page_flags'] = $r[0]['page-flags']; $_SESSION['my_url'] = $a->get_baseurl() . '/profile/' . $r[0]['nickname']; - notice( t("Welcome back ") . $r[0]['username'] . EOL); + notice( sprintf( t("Welcome back %s") , $r[0]['username']) . EOL); $a->user = $r[0]; if(strlen($a->user['timezone'])) { diff --git a/mod/match.php b/mod/match.php new file mode 100644 index 000000000..092595a09 --- /dev/null +++ b/mod/match.php @@ -0,0 +1,57 @@ +<?php + + +function match_content(&$a) { + + $o = ''; + if(! local_user()) + return; + + $o .= '<h2>' . t('Profile Match') . '</h2>'; + + $r = q("SELECT `pub_keywords`, `prv_keywords` FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1", + intval(local_user()) + ); + if(! count($r)) + return; + if(! $r[0]['pub_keywords'] && (! $r[0]['prv_keywords'])) { + notice('No keywords to match. Please add keywords to your default profile.'); + return; + + } + + $params = array(); + $tags = trim($r[0]['pub_keywords'] . ' ' . $r[0]['prv_keywords']); + if($tags) { + $params['s'] = $tags; + if($a->pager['page'] != 1) + $params['p'] = $a->pager['page']; + + $x = post_url('http://dir.friendika.com/msearch', $params); + + $j = json_decode($x); + + if($j->total) { + $a->set_pager_total($j->total); + $a->set_pager_itemspage($j->items_page); + } + + if(count($j->results)) { + foreach($j->results as $jj) { + $o .= '<div class="profile-match-wrapper"><div class="profile-match-photo">'; + $o .= '<a href="' . $jj->url . '">' . '<img src="' . $jj->photo . '" alt="' . $jj->name . '" title="' . $jj->name . '[' . $jj->url . ']' . '" /></a></div>'; + $o .= '<div class="profile-match-break"></div>'; + $o .= '<div class="profile-match-name"><a href="' . $jj->url . '" title="' . $jj->name . '[' . $jj->url .']' . '">' . $jj->name . '</a></div>'; + $o .= '<div class="profile-match-end"></div></div>'; + } + $o .= '<div id="profile-match-wrapper-end"></div>'; + } + else { + notice( t('No matches') . EOL); + } + + } + + $o .= paginate($a); + return $o; +}
\ No newline at end of file diff --git a/mod/message.php b/mod/message.php index 4821a45d2..c9ff3bb8e 100644 --- a/mod/message.php +++ b/mod/message.php @@ -120,7 +120,7 @@ function message_content(&$a) { $myprofile = $a->get_baseurl() . '/profile/' . $a->user['nickname']; - $tpl = load_view_file('view/mail_head.tpl'); + $tpl = get_markup_template('mail_head.tpl'); $header = replace_macros($tpl, array( '$messages' => t('Messages'), '$inbox' => t('Inbox'), @@ -164,15 +164,18 @@ function message_content(&$a) { if(($a->argc > 1) && ($a->argv[1] === 'new')) { - $tpl = load_view_file('view/msg-header.tpl'); + $tpl = get_markup_template('msg-header.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, array( '$baseurl' => $a->get_baseurl(), - '$nickname' => $a->user['nickname'] + '$nickname' => $a->user['nickname'], + '$linkurl' => t('Please enter a link URL:') )); - $select = contact_select('messageto','message-to-select', false, 4, true); - $tpl = load_view_file('view/prv_message.tpl'); + $preselect = (isset($a->argv[2])?array($a->argv[2]):false); + + $select = contact_select('messageto','message-to-select', $preselect, 4, true); + $tpl = get_markup_template('prv_message.tpl'); $o .= replace_macros($tpl,array( '$header' => t('Send Private Message'), '$to' => t('To:'), @@ -222,7 +225,7 @@ function message_content(&$a) { return $o; } - $tpl = load_view_file('view/mail_list.tpl'); + $tpl = get_markup_template('mail_list.tpl'); foreach($r as $rr) { $o .= replace_macros($tpl, array( '$id' => $rr['id'], @@ -234,7 +237,7 @@ function message_content(&$a) { '$delete' => t('Delete conversation'), '$body' => $rr['body'], '$to_name' => $rr['name'], - '$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['mailcreated'],'D, d M Y - g:i A') + '$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['mailcreated'], t('D, d M Y - g:i A')) )); } $o .= paginate($a); @@ -272,7 +275,7 @@ function message_content(&$a) { require_once("include/bbcode.php"); - $tpl = load_view_file('view/msg-header.tpl'); + $tpl = get_markup_template('msg-header.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, array( '$nickname' => $a->user['nickname'], @@ -280,7 +283,7 @@ function message_content(&$a) { )); - $tpl = load_view_file('view/mail_conv.tpl'); + $tpl = get_markup_template('mail_conv.tpl'); foreach($messages as $message) { if($message['from-url'] == $myprofile) { $from_url = $myprofile; @@ -306,7 +309,7 @@ function message_content(&$a) { } $select = $message['name'] . '<input type="hidden" name="messageto" value="' . $contact_id . '" />'; $parent = '<input type="hidden" name="replyto" value="' . $message['parent-uri'] . '" />'; - $tpl = load_view_file('view/prv_message.tpl'); + $tpl = get_markup_template('prv_message.tpl'); $o .= replace_macros($tpl,array( '$header' => t('Send Reply'), '$to' => t('To:'), diff --git a/mod/network.php b/mod/network.php index 32c7216d4..16739b434 100644 --- a/mod/network.php +++ b/mod/network.php @@ -15,25 +15,25 @@ function network_init(&$a) { $a->page['aside'] .= '<div id="network-new-link">'; if(($a->argc > 1 && $a->argv[1] === 'new') || ($a->argc > 2 && $a->argv[2] === 'new')) - $a->page['aside'] .= '<a href="' . $a->get_baseurl() . '/' . str_replace('/new', '', $a->cmd) . '">' . t('Normal View') . '</a>'; + $a->page['aside'] .= '<a href="' . $a->get_baseurl() . '/' . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '">' . t('Normal View') . '</a>'; else - $a->page['aside'] .= '<a href="' . $a->get_baseurl() . '/' . $a->cmd . '/new' . '">' . t('New Item View') . '</a>'; + $a->page['aside'] .= '<a href="' . $a->get_baseurl() . '/' . $a->cmd . '/new' . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '">' . t('New Item View') . '</a>'; $a->page['aside'] .= '</div>'; - $a->page['aside'] .= group_side('network','network'); + $a->page['aside'] .= group_side('network','network',true); } function network_content(&$a, $update = 0) { + require_once('include/conversation.php'); + if(! local_user()) return login(false); $o = ''; - require_once("include/bbcode.php"); - $contact_id = $a->cid; $group = 0; @@ -41,6 +41,8 @@ function network_content(&$a, $update = 0) { $nouveau = false; require_once('include/acl_selectors.php'); + $cid = ((x($_GET['cid'])) ? intval($_GET['cid']) : 0); + if(($a->argc > 2) && $a->argv[2] === 'new') $nouveau = true; @@ -49,67 +51,41 @@ function network_content(&$a, $update = 0) { $nouveau = true; else { $group = intval($a->argv[1]); - $group_acl = array('allow_gid' => '<' . $group . '>'); + $def_acl = array('allow_gid' => '<' . $group . '>'); } } + if($cid) + $def_acl = array('allow_cid' => '<' . intval($cid) . '>'); + if(! $update) { + if(group) { + if(($t = group_public_members($group)) && (! get_pconfig(local_user(),'system','nowarn_insecure'))) { + $plural_form = sprintf( tt('%d member', '%d members', $t), $t); + notice( sprintf( t('Warning: This group contains %s from an insecure network.'), $plural_form ) . EOL); + notice( t('Private messages to this group are at risk of public disclosure.') . EOL); + } + } + $o .= '<script> $(document).ready(function() { $(\'#nav-network-link\').addClass(\'nav-selected\'); });</script>'; $_SESSION['return_url'] = $a->cmd; - $geotag = (($a->user['allow_location']) ? load_view_file('view/jot_geotag.tpl') : ''); - - $tpl = load_view_file('view/jot-header.tpl'); - - $a->page['htmlhead'] .= replace_macros($tpl, array( - '$baseurl' => $a->get_baseurl(), - '$geotag' => $geotag, - '$nickname' => $a->user['nickname'] - )); - - - $tpl = load_view_file("view/jot.tpl"); - - if(($group) || (is_array($a->user) && ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid']))))) - $lockstate = 'lock'; - else - $lockstate = 'unlock'; - $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false); - $jotplugins = ''; - $jotnets = ''; - call_hooks('jot_tool', $jotplugins); - call_hooks('jot_networks', $jotnets); - - $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins)); - - $o .= replace_macros($tpl,array( - '$return_path' => $a->cmd, - '$action' => 'item', - '$share' => t('Share'), - '$upload' => t('Upload photo'), - '$weblink' => t('Insert web link'), - '$youtube' => t('Insert YouTube video'), - '$setloc' => t('Set your location'), - '$noloc' => t('Clear browser location'), - '$wait' => t('Please wait'), - '$permset' => t('Permission settings'), - '$content' => '', - '$post_id' => '', - '$baseurl' => $a->get_baseurl(), - '$defloc' => $a->user['default-location'], - '$visitor' => 'block', - '$emailcc' => t('CC: email addresses'), - '$jotnets' => $jotnets, - '$emtitle' => t('Example: bob@example.com, mary@example.com'), - '$lockstate' => $lockstate, - '$acl' => populate_acl((($group) ? $group_acl : $a->user), $celeb), - '$bang' => (($group) ? '!' : ''), - '$profile_uid' => $_SESSION['uid'] - )); + $x = array( + 'is_owner' => true, + 'allow_location' => $a->user['allow_location'], + 'default_location' => $a->user['default_location'], + 'nickname' => $a->user['nickname'], + 'lockstate' => ((($group) || (is_array($a->user) && ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid']))))) ? 'lock' : 'unlock'), + 'acl' => populate_acl((($group || $cid) ? $def_acl : $a->user), $celeb), + 'bang' => (($group || $cid) ? '!' : ''), + 'visitor' => 'block', + 'profile_uid' => local_user() + ); + $o .= status_editor($a,$x); // The special div is needed for liveUpdate to kick in for this page. // We only launch liveUpdate if you are on the front page, you aren't @@ -119,18 +95,21 @@ function network_content(&$a, $update = 0) { $o .= '<div id="live-network"></div>' . "\r\n"; $o .= "<script> var profile_uid = " . $_SESSION['uid'] . "; var netargs = '" . substr($a->cmd,8) + . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n"; } - // We aren't going to try and figure out at the item, group, and page level - // which items you've seen and which you haven't. You're looking at some - // subset of items, so just mark everything seen. + // We aren't going to try and figure out at the item, group, and page + // level which items you've seen and which you haven't. If you're looking + // at the top level network page just mark everything seen. - $r = q("UPDATE `item` SET `unseen` = 0 - WHERE `unseen` = 1 AND `uid` = %d", - intval($_SESSION['uid']) - ); + if((! $group) && (! $cid)) { + $r = q("UPDATE `item` SET `unseen` = 0 + WHERE `unseen` = 1 AND `uid` = %d", + intval($_SESSION['uid']) + ); + } // We don't have to deal with ACL's on this page. You're looking at everything // that belongs to you, hence you can see all of it. We will filter by group if @@ -148,7 +127,7 @@ function network_content(&$a, $update = 0) { killme(); notice( t('No such group') . EOL ); goaway($a->get_baseurl() . '/network'); - return; // NOTREACHED + // NOTREACHED } $contacts = expand_groups(array($group)); @@ -160,28 +139,56 @@ function network_content(&$a, $update = 0) { notice( t('Group is empty')); } - $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` AND `contact-id` IN ( $contact_str )) "; + $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` AND ( `contact-id` IN ( $contact_str ) OR `allow_gid` REGEXP '<" . intval($group) . ">' )) "; $o = '<h2>' . t('Group: ') . $r[0]['name'] . '</h2>' . $o; } + elseif($cid) { + + $r = q("SELECT `id`,`name`,`network`,`writable` FROM `contact` WHERE `id` = %d + AND `blocked` = 0 AND `pending` = 0 LIMIT 1", + intval($cid) + ); + if(count($r)) { + $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` AND `contact-id` IN ( " . intval($cid) . " )) "; + $o = '<h2>' . t('Contact: ') . $r[0]['name'] . '</h2>' . $o; + if($r[0]['network'] !== NETWORK_MAIL && $r[0]['network'] !== NETWORK_DFRN && $r[0]['network'] !== NETWORK_FACEBOOK && $r[0]['writable'] && (! get_pconfig(local_user(),'system','nowarn_insecure'))) { + notice( t('Private messages to this person are at risk of public disclosure.') . EOL); + } + + } + else { + notice( t('Invalid contact.') . EOL); + goaway($a->get_baseurl() . '/network'); + // NOTREACHED + } + } - if((! $group) && (! $update)) + if((! $group) && (! $cid) && (! $update)) $o .= get_birthdays(); + $sql_extra2 = (($nouveau) ? '' : " AND `item`.`parent` = `item`.`id` "); $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 `contact`.`pending` = 0 + $sql_extra2 $sql_extra ", intval($_SESSION['uid']) ); - if(count($r)) + if(count($r)) { $a->set_pager_total($r[0]['total']); + $a->set_pager_itemspage(40); + } + if($nouveau) { + + // "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` @@ -194,282 +201,65 @@ function network_content(&$a, $update = 0) { intval($a->pager['start']), intval($a->pager['itemspage']) ); + } else { - $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, - `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, - `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` + + // Normal conversation view + // First fetch a known number of parent items + + $r = q("SELECT `item`.`id` AS `item_id`, `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 - AND `contact`.`id` = `item`.`contact-id` AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND `item`.`parent` = `parentitem`.`id` + AND `item`.`parent` = `item`.`id` $sql_extra - ORDER BY `parentitem`.`created` DESC, `item`.`gravity` ASC, `item`.`created` ASC LIMIT %d ,%d ", + ORDER BY `item`.`created` DESC LIMIT %d ,%d ", intval(local_user()), intval($a->pager['start']), intval($a->pager['itemspage']) ); - } - - $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'); - $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) { - - $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, - '$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; - - } - - - - foreach($r as $item) { - like_puller($a,$item,$alike,'like'); - like_puller($a,$item,$dlike,'dislike'); + // Then fetch all the children of the parents that are on this page + + $parents_arr = array(); + $parents_str = ''; + + if(count($r)) { + foreach($r as $rr) + $parents_arr[] = $rr['item_id']; + $parents_str = implode(', ', $parents_arr); + + $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, + `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` + WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0 + AND `contact`.`id` = `item`.`contact-id` + AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + AND `item`.`parent` = `parentitem`.`id` AND `item`.`parent` IN ( %s ) + $sql_extra + ORDER BY `parentitem`.`created` DESC, `item`.`gravity` ASC, `item`.`created` ASC ", + intval(local_user()), + dbesc($parents_str) + ); } + } - foreach($r as $item) { - - $comment = ''; - $template = $tpl; - $commentww = ''; - $sparkle = ''; - $owner_url = $owner_photo = $owner_name = ''; - - if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE))) && ($item['id'] != $item['parent'])) - continue; - - $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(($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') && (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'; - } - } - } - - if($update) - $return_url = $_SESSION['return_url']; - else - $return_url = $_SESSION['return_url'] = $a->cmd; - - $likebuttons = ''; - 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"), - '$wait' => t('Please wait') - )); - } - - if($item['last-child']) { - $comment = replace_macros($cmnt_tpl,array( - '$return_path' => '', - '$jsreload' => '', // $_SESSION['return_url'], - '$type' => 'net-comment', - '$id' => $item['item_id'], - '$parent' => $item['parent'], - '$profile_uid' => $_SESSION['uid'], - '$mylink' => $a->contact['url'], - '$mytitle' => t('This is you'), - '$myphoto' => $a->contact['thumb'], - '$ww' => $commentww - )); - } - - $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(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>'; - } + // Set this so that the conversation function can find out contact info for our wall-wall items + $a->page_contact = $a->contact; - $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'; - - - // Build the HTML - - $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:'), - '$profile_url' => $profile_link, - '$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), - '$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']; + $mode = (($nouveau) ? 'network-new' : 'network'); - } - } + $o .= conversation($a,$r,$mode,$update); if(! $update) { + $o .= paginate($a); $o .= '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>'; } return $o; -}
\ No newline at end of file +} diff --git a/mod/notes.php b/mod/notes.php new file mode 100644 index 000000000..7a826bf61 --- /dev/null +++ b/mod/notes.php @@ -0,0 +1,129 @@ +<?php + +function notes_init(&$a) { + + if(! local_user()) + return; + + $profile = 0; + + $which = $a->user['nickname']; + +// profile_load($a,$which,$profile); + +} + + +function notes_content(&$a) { + + if(! local_user()) { + notice( t('Permission denied.') . EOL); + return; + } + + require_once("include/bbcode.php"); + require_once('include/security.php'); + require_once('include/conversation.php'); + require_once('include/acl_selectors.php'); + $groups = array(); + + + $o = ''; + + $remote_contact = false; + + $contact_id = $_SESSION['cid']; + $contact = $a->contact; + + $is_owner = true; + + + $o .= '<h3>' . t('Private Notes') . '</h3>'; + + $commpage = false; + $commvisitor = false; + + $celeb = false; + + + + $x = array( + 'is_owner' => $is_owner, + 'allow_location' => (($a->user['allow_location']) ? true : false), + 'default_location' => $a->user['default-location'], + 'nickname' => $a->user['nickname'], + 'lockstate' => 'lock', + 'acl' => '', + 'bang' => '', + 'visitor' => 'block', + 'profile_uid' => local_user(), + 'button' => t('Save') + + ); + + $o .= status_editor($a,$x,$a->contact['id']); + + + // Construct permissions + + // default permissions - anonymous user + + $sql_extra = " AND `allow_cid` = '<" . $a->contact['id'] . ">' "; + + $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 `contact`.`pending` = 0 + AND `item`.`id` = `item`.`parent` AND `item`.`wall` = 0 + $sql_extra ", + intval(local_user()) + + ); + + if(count($r)) { + $a->set_pager_total($r[0]['total']); + $a->set_pager_itemspage(40); + } + + $r = q("SELECT `item`.`id` AS `item_id`, `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 + AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + AND `item`.`id` = `item`.`parent` AND `item`.`wall` = 0 + $sql_extra + ORDER BY `item`.`created` DESC LIMIT %d ,%d ", + intval(local_user()), + intval($a->pager['start']), + intval($a->pager['itemspage']) + + ); + + $parents_arr = array(); + $parents_str = ''; + + if(count($r)) { + foreach($r as $rr) + $parents_arr[] = $rr['item_id']; + $parents_str = implode(', ', $parents_arr); + + $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, + `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`network`, `contact`.`rel`, + `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 + AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + AND `item`.`parent` IN ( %s ) + $sql_extra + ORDER BY `parent` DESC, `gravity` ASC, `item`.`id` ASC ", + intval(local_user()), + dbesc($parents_str) + ); + } + + $o .= conversation($a,$r,'notes',$update); + + + $o .= paginate($a); + return $o; +} diff --git a/mod/notifications.php b/mod/notifications.php index 93ca82bb0..b860f6018 100644 --- a/mod/notifications.php +++ b/mod/notifications.php @@ -65,12 +65,11 @@ function notifications_content(&$a) { else $sql_extra = " AND `ignore` = 0 "; - - $tpl = load_view_file('view/intros-top.tpl'); - $o .= replace_macros($tpl,array( - '$hide_url' => ((strlen($sql_extra)) ? 'notifications/all' : 'notifications' ), - '$hide_text' => ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) - )); + $o .= '<h1>' . t('Pending Friend/Connect Notifications') . '</h1>' . "\r\n"; + + $o .= '<div id="notification-show-hide-wrapper" >'; + $o .= '<a href="' . ((strlen($sql_extra)) ? 'notifications/all' : 'notifications' ) . '" id="notifications-show-hide-link" >' + . ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) . '</a></div>' . "\r\n"; $r = q("SELECT COUNT(*) AS `total` FROM `intro` @@ -90,13 +89,13 @@ function notifications_content(&$a) { if(($r !== false) && (count($r))) { - $tpl = load_view_file("view/intros.tpl"); + $tpl = get_markup_template("intros.tpl"); foreach($r as $rr) { $friend_selected = (($rr['network'] !== 'stat') ? ' checked="checked" ' : ' disabled '); $fan_selected = (($rr['network'] === 'stat') ? ' checked="checked" disabled ' : ''); - $dfrn_tpl = load_view_file('view/netfriend.tpl'); + $dfrn_tpl = get_markup_template('netfriend.tpl'); $knowyou = ''; $dfrn_text = ''; @@ -141,24 +140,20 @@ function notifications_content(&$a) { if ($a->config['register_policy'] == REGISTER_APPROVE && $a->config['admin_email'] === $a->user['email']){ - $o .= load_view_file('view/registrations-top.tpl'); + $o .= '<h1>' . t('User registrations waiting for confirm') . '</h1>' . "\r\n"; $r = q("SELECT `register`.*, `contact`.`name`, `user`.`email` FROM `register` LEFT JOIN `contact` ON `register`.`uid` = `contact`.`uid` LEFT JOIN `user` ON `register`.`uid` = `user`.`uid`;"); if(($r !== false) && (count($r))) { - $tpl = load_view_file("view/registrations.tpl"); + $o .= '<ul>'; foreach($r as $rr) { - $o .= "<ul>"; - $o .= replace_macros($tpl, array( - '$fullname' => $rr['name'], - '$email' => $rr['email'], - '$approvelink' => "regmod/allow/".$rr['hash'], - '$denylink' => "regmod/deny/".$rr['hash'], - )); - $o .= "</ul>"; + $o .= '<li>' . sprintf('%s (%s) : ', $rr['name'],$rr['email']) + . '<a href="regmod/allow/' . $rr['hash'] .'">' . t('Approve') + . '</a> - <a href="regmod/deny/' . $rr['hash'] . '">' . t('Deny') . '</a></li>' . "\r\n"; } + $o .= "</ul>"; } else notice( t('No registrations.') . EOL); diff --git a/mod/oexchange.php b/mod/oexchange.php new file mode 100644 index 000000000..d5af4813b --- /dev/null +++ b/mod/oexchange.php @@ -0,0 +1,53 @@ +<?php + + +function oexchange_init(&$a) { + + if(($a->argc > 1) && ($a->argv[1] === 'xrd')) { + $tpl = get_markup_template('oexchange_xrd.tpl'); + + $o = replace_macros($tpl, array('$base' => $a->get_baseurl())); + echo $o; + killme(); + } + + + + +} + +function oexchange_content(&$a) { + + if(! local_user()) { + $o = login(false); + return $o; + } + + if(($a->argc > 1) && $a->argv[1] === 'done') { + notice( t('Post successful.') . EOL); + return; + } + + $url = (((x($_GET,'url')) && strlen($_GET['url'])) ? notags(trim($_GET['url'])) : ''); + + $s = fetch_url($a->get_baseurl() . '/parse_url&url=' . $url); + + if(! strlen($s)) + return; + + require_once('include/html2bbcode.php'); + + $post = array(); + + $post['profile_uid'] = local_user(); + $post['return'] = '/oexchange/done' ; + $post['body'] = html2bbcode($s); + $post['type'] = 'wall'; + + $_POST = $post; + require_once('mod/item.php'); + item_post($a); + +} + + diff --git a/mod/openid.php b/mod/openid.php index 6ccd28e5b..c3c6c11e9 100644 --- a/mod/openid.php +++ b/mod/openid.php @@ -70,9 +70,18 @@ function openid_content(&$a) { $_SESSION['page_flags'] = $r[0]['page-flags']; $_SESSION['my_url'] = $a->get_baseurl() . '/profile/' . $r[0]['nickname']; - notice( t("Welcome back ") . $r[0]['username'] . EOL); $a->user = $r[0]; + if($a->user['login_date'] === '0000-00-00 00:00:00') { + $_SESSION['return_url'] = 'profile_photo/new'; + $a->module = 'profile_photo'; + notice( t("Welcome ") . $a->user['username'] . EOL); + notice( t('Please upload a profile photo.') . EOL); + } + else + notice( t("Welcome back ") . $a->user['username'] . EOL); + + if(strlen($a->user['timezone'])) { date_default_timezone_set($a->user['timezone']); $a->timezone = $a->user['timezone']; diff --git a/mod/opensearch.php b/mod/opensearch.php new file mode 100644 index 000000000..ff748d1c5 --- /dev/null +++ b/mod/opensearch.php @@ -0,0 +1,18 @@ +<?php + function opensearch_content(&$a) { + + $tpl = get_markup_template('opensearch.tpl'); + + header("Content-type: application/opensearchdescription+xml"); + + $o = replace_macros($tpl, array( + '$baseurl' => $a->get_baseurl(), + '$nodename' => $a->get_hostname(), + )); + + echo $o; + + killme(); + + } +?>
\ No newline at end of file diff --git a/mod/parse_url.php b/mod/parse_url.php index b3b42b6cb..30371e9f6 100644 --- a/mod/parse_url.php +++ b/mod/parse_url.php @@ -5,11 +5,15 @@ require_once('library/HTML5/Parser.php'); function parse_url_content(&$a) { - $url = trim($_GET['url']); + logger('parse_url: ' . $_GET['url']); + + $url = trim(hex2bin($_GET['url'])); + + logger('parse_url: ' . $url); $text = null; - $template = "<a href=\"%s\" >%s</a>%s"; + $template = "<a href=\"%s\" >%s</a>\n%s"; $arr = array('url' => $url, 'text' => ''); @@ -57,6 +61,8 @@ function parse_url_content(&$a) { $items = $div->getElementsByTagName('p'); if($items) { foreach($items as $item) { + if($item->getElementsByTagName('script')) + continue; $text = $item->textContent; $text = strip_tags($text); if(strlen($text) < 100) @@ -73,6 +79,8 @@ function parse_url_content(&$a) { $items = $dom->getElementsByTagName('p'); if($items) { foreach($items as $item) { + if($item->getElementsByTagName('script')) + continue; $text = $item->textContent; $text = strip_tags($text); if(strlen($text) < 100) diff --git a/mod/photo.php b/mod/photo.php index 2f8d180fd..3bea7e72d 100644 --- a/mod/photo.php +++ b/mod/photo.php @@ -19,6 +19,11 @@ function photo_init(&$a) { $default = 'images/default-profile.jpg'; if(isset($type)) { + + /** + * Profile photos + */ + switch($type) { case 'profile': @@ -50,6 +55,10 @@ function photo_init(&$a) { } else { + /** + * Other photos + */ + $resolution = 0; $photo = str_replace('.jpg','',$photo); @@ -114,7 +123,7 @@ function photo_init(&$a) { // but who should otherwise be able to view it. Show a default image to let // them know permissions was denied. It may be possible to view the image // through an authenticated profile visit. - // There won't be many complete unauthorised people seeing this because + // There won't be many completely unauthorised people seeing this because // they won't have the photo link, so there's a reasonable chance that the person // might be able to obtain permission to view it. diff --git a/mod/photos.php b/mod/photos.php index 929d1c971..89fef2ee8 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -6,6 +6,10 @@ require_once('include/bbcode.php'); function photos_init(&$a) { + + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + return; + } $o = ''; if($a->argc > 1) { @@ -310,6 +314,7 @@ foreach($_FILES AS $key => $val) { $arr['deny_gid'] = $p[0]['deny_gid']; $arr['last-child'] = 1; $arr['visible'] = $visibility; + $arr['body'] = '[url=' . $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $p[0]['resource-id'] . ']' . '[img]' . $a->get_baseurl() . '/photo/' . $p[0]['resource-id'] . '-' . $p[0]['scale'] . '.jpg' . '[/img]' . '[/url]'; @@ -557,6 +562,8 @@ foreach($_FILES AS $key => $val) { if(($maximagesize) && ($filesize > $maximagesize)) { notice( t('Image exceeds size limit of ') . $maximagesize . EOL); @unlink($src); + $foo = 0; + call_hooks('photo_post_end',$foo); return; } @@ -569,6 +576,8 @@ foreach($_FILES AS $key => $val) { logger('mod/photos.php: photos_post(): unable to process image' , 'LOGGER_DEBUG'); notice( t('Unable to process image.') . EOL ); @unlink($src); + $foo = 0; + call_hooks('photo_post_end',$foo); killme(); } @@ -634,6 +643,17 @@ foreach($_FILES AS $key => $val) { $item_id = item_store($arr); + if($item_id) { + q("UPDATE `item` SET `plink` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1", + dbesc($a->get_baseurl() . '/display/' . $owner_record['nickname'] . '/' . $item_id), + intval($page_owner_uid), + intval($item_id) + ); + } + + if($visible) + proc_run('php', "include/notifier.php", 'wall-new', $item_id); + call_hooks('photo_post_end',intval($item_id)); // addon uploaders should call "killme()" [e.g. exit] within the photo_post_end hook @@ -656,6 +676,16 @@ function photos_content(&$a) { // photos/name/image/xxxxx/edit + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + notice( t('Public access denied.') . EOL); + return; + } + + + require_once('include/bbcode.php'); + require_once('include/security.php'); + require_once('include/conversation.php'); + if(! x($a->data,'user')) { notice( t('No photos selected') . EOL ); return; @@ -802,7 +832,7 @@ function photos_content(&$a) { - $tpl = load_view_file('view/photos_upload.tpl'); + $tpl = get_markup_template('photos_upload.tpl'); $o .= replace_macros($tpl,array( '$pagename' => t('Upload Photos'), '$sessid' => session_id(), @@ -848,7 +878,7 @@ function photos_content(&$a) { if($cmd === 'edit') { if(($album != t('Profile Photos')) && ($album != t('Contact Photos'))) { if($can_post) { - $edit_tpl = load_view_file('view/album_edit.tpl'); + $edit_tpl = get_markup_template('album_edit.tpl'); $o .= replace_macros($edit_tpl,array( '$nametext' => t('New album name: '), '$nickname' => $a->data['user']['nickname'], @@ -869,7 +899,7 @@ function photos_content(&$a) { } } } - $tpl = load_view_file('view/photo_album.tpl'); + $tpl = get_markup_template('photo_album.tpl'); if(count($r)) foreach($r as $rr) { $o .= replace_macros($tpl,array( @@ -892,10 +922,9 @@ function photos_content(&$a) { if($datatype === 'image') { - require_once('security.php'); - require_once('bbcode.php'); - $o = '<div id="live-display"></div>' . "\r\n"; + + $o = ''; // fetch image, item containing image, then comments $ph = q("SELECT * FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' @@ -948,34 +977,36 @@ function photos_content(&$a) { } } - - $o .= '<h3>' . '<a href="' . $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($ph[0]['album']) . '">' . $ph[0]['album'] . '</a></h3>'; + $album_link = $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($ph[0]['album']); + $tools = Null; + $lock = Null; if($can_post && ($ph[0]['uid'] == $owner_uid)) { - $o .= '<div id="photo-edit-link-wrap" ><a id="photo-edit-link" href="' . $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $datum . '/edit' . '">' . t('Edit photo') . '</a>'; - - $o .= ' - <a id="photo-toprofile-link" href="' . $a->get_baseurl() . '/profile_photo/use/'.$ph[0]['resource-id'].'">'.t('Use as profile photo').'</a>'; + $tools = array( + 'edit' => array($a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $datum . '/edit', t('Edit photo')), + 'profile'=>array($a->get_baseurl() . '/profile_photo/use/'.$ph[0]['resource-id'], t('Use as profile photo')), + ); + // lock - $o .= ( ( ($ph[0]['uid'] == local_user()) && (strlen($ph[0]['allow_cid']) || strlen($ph[0]['allow_gid']) + $lock = ( ( ($ph[0]['uid'] == local_user()) && (strlen($ph[0]['allow_cid']) || strlen($ph[0]['allow_gid']) || strlen($ph[0]['deny_cid']) || strlen($ph[0]['deny_gid'])) ) - ? ' - <img src="images/lock_icon.gif" class="lockview" alt="' . t('Private Message') . '" onclick="lockview(event,\'photo/' . $ph[0]['id'] . '\');" />' - : ''); + ? t('Private Message') + : Null); - $o .= '</div>'; + } if($prevlink) - $o .= '<div id="photo-prev-link"><a href="' . $prevlink .'">' . t('<< Prev') . '</a></div>' ; + $prevlink = array($prevlink, t('<< Prev')) ; - $o .= '<div id="photo-photo"><a href="' . $a->get_baseurl() . '/photo/' - . $hires['resource-id'] . '-' . $hires['scale'] . '.jpg" title="' - . t('View Full Size') . '" ><img src="' . $a->get_baseurl() . '/photo/' - . $lores['resource-id'] . '-' . $lores['scale'] . '.jpg' . '" /></a></div>'; + $photo = array( + 'href' => $a->get_baseurl() . '/photo/' . $hires['resource-id'] . '-' . $hires['scale'] . '.jpg', + 'title'=> t('View Full Size'), + 'src' => $a->get_baseurl() . '/photo/' . $lores['resource-id'] . '-' . $lores['scale'] . '.jpg' + ); if($nextlink) - $o .= '<div id="photo-next-link"><a href="' . $nextlink .'">' . t('Next >>') . '</a></div>'; - - $o .= '<div id="photo-photo-end"></div>'; + $nextlink = array($nextlink, t('Next >>')); // Do we have an item for this photo? @@ -1027,28 +1058,27 @@ function photos_content(&$a) { } } - $o .= '<div id="photo-caption" >' . $ph[0]['desc'] . '</div>'; - + $tags=Null; if(count($linked_items) && strlen($link_item['tag'])) { $arr = explode(',',$link_item['tag']); - // parse tags and add links - $o .= '<div id="in-this-photo-text">' . t('Tags: ') . '</div>'; - $o .= '<div id="in-this-photo">'; + // parse tags and add links $tag_str = ''; foreach($arr as $t) { if(strlen($tag_str)) $tag_str .= ', '; $tag_str .= bbcode($t); } - $o .= $tag_str . '</div>'; + $tags = array(t('Tags: '), $tag_str); if($cmd === 'edit') - $o .= '<div id="tag-remove"><a href="' . $a->get_baseurl() . '/tagrm/' . $link_item['id'] . '">' . t('[Remove any tag]') . '</a></div>'; + $tags[] = $a->get_baseurl() . '/tagrm/' . $link_item['id']; + $tags[] = t('[Remove any tag]'); } + $edit = Null; if(($cmd === 'edit') && ($can_post)) { - $edit_tpl = load_view_file('view/photo_edit.tpl'); - $o .= replace_macros($edit_tpl, array( + $edit_tpl = get_markup_template('photo_edit.tpl'); + $edit = replace_macros($edit_tpl, array( '$id' => $ph[0]['id'], '$album' => $ph[0]['album'], '$newalbum' => t('New album name'), @@ -1069,31 +1099,29 @@ function photos_content(&$a) { if(count($linked_items)) { - $cmnt_tpl = load_view_file('view/comment_item.tpl'); - $tpl = load_view_file('view/photo_item.tpl'); + $cmnt_tpl = get_markup_template('comment_item.tpl'); + $tpl = get_markup_template('photo_item.tpl'); $return_url = $a->cmd; - $like_tpl = load_view_file('view/like.tpl'); + $like_tpl = get_markup_template('like_noshare.tpl'); $likebuttons = ''; if($can_post || can_write_wall($a,$owner_uid)) { $likebuttons = replace_macros($like_tpl,array( - '$id' => $item['id'], + '$id' => $link_item['id'], '$likethis' => t("I like this \x28toggle\x29"), '$nolike' => t("I don't like this \x28toggle\x29"), - '$wait' => t('Please wait') + '$share' => t('Share'), + '$wait' => t('Please wait') )); } + $comments = ''; if(! count($r)) { - $o .= '<div id="photo-like-div">'; - $o .= $likebuttons; - $o .= '</div>'; - if($can_post || can_write_wall($a,$owner_uid)) { if($link_item['last-child']) { - $o .= replace_macros($cmnt_tpl,array( + $comments .= replace_macros($cmnt_tpl,array( '$return_path' => '', '$jsreload' => $return_url, '$type' => 'wall-comment', @@ -1103,6 +1131,8 @@ function photos_content(&$a) { '$mylink' => $contact['url'], '$mytitle' => t('This is you'), '$myphoto' => $contact['thumb'], + '$comment' => t('Comment'), + '$submit' => t('Submit'), '$ww' => '' )); } @@ -1111,6 +1141,9 @@ function photos_content(&$a) { $alike = array(); $dlike = array(); + + $like = ''; + $dislike = ''; // display comments if(count($r)) { @@ -1123,17 +1156,11 @@ function photos_content(&$a) { $like = ((isset($alike[$link_item['id']])) ? format_like($alike[$link_item['id']],$alike[$link_item['id'] . '-l'],'like',$link_item['id']) : ''); $dislike = ((isset($dlike[$link_item['id']])) ? format_like($dlike[$link_item['id']],$dlike[$link_item['id'] . '-l'],'dislike',$link_item['id']) : ''); - $o .= '<div id="photo-like-div">'; - $o .= $likebuttons; - $o .= $like; - $o .= $dislike; - $o .= '</div>'; - if($can_post || can_write_wall($a,$owner_uid)) { if($link_item['last-child']) { - $o .= replace_macros($cmnt_tpl,array( + $comments .= replace_macros($cmnt_tpl,array( '$return_path' => '', '$jsreload' => $return_url, '$type' => 'wall-comment', @@ -1143,6 +1170,8 @@ function photos_content(&$a) { '$mylink' => $contact['url'], '$mytitle' => t('This is you'), '$myphoto' => $contact['thumb'], + '$comment' => t('Comment'), + '$submit' => t('Submit'), '$ww' => '' )); } @@ -1162,7 +1191,7 @@ function photos_content(&$a) { if($can_post || can_write_wall($a,$owner_uid)) { if($item['last-child']) { - $comment = replace_macros($cmnt_tpl,array( + $comments .= replace_macros($cmnt_tpl,array( '$return_path' => '', '$jsreload' => $return_url, '$type' => 'wall-comment', @@ -1172,6 +1201,8 @@ function photos_content(&$a) { '$mylink' => $contact['url'], '$mytitle' => t('This is you'), '$myphoto' => $contact['thumb'], + '$comment' => t('Comment'), + '$submit' => t('Submit'), '$ww' => '' )); } @@ -1198,10 +1229,10 @@ function photos_content(&$a) { $drop = ''; 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'))); + $drop = replace_macros(get_markup_template('wall_item_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete'))); - $o .= replace_macros($template,array( + $comments .= replace_macros($template,array( '$id' => $item['item_id'], '$profile_url' => $profile_link, '$name' => $profile_name, @@ -1217,8 +1248,28 @@ function photos_content(&$a) { } } - $o .= paginate($a); + $paginate = paginate($a); } + + $photo_tpl = get_markup_template('photo_view.tpl'); + $o .= replace_macros($photo_tpl, array( + '$id' => $ph[0]['id'], + '$album' => array($album_link,$ph[0]['album']), + '$tools' => $tools, + '$lock' => $lock, + '$photo' => $photo, + '$prevlink' => $prevlink, + '$nextlink' => $nextlink, + '$desc' => $ph[0]['desc'], + '$tags' => $tags, + '$edit' => $edit, + '$likebuttons' => $likebuttons, + '$like' => $like, + '$dislike' => $dislike, + '$comments' => $comments, + '$paginate' => $paginate, + )); + return $o; } @@ -1251,21 +1302,18 @@ function photos_content(&$a) { . $a->data['user']['nickname'] . '/upload' . '">' . t('Upload New Photos') . '</a></div>'; } - $tpl = load_view_file('view/photo_top.tpl'); + $tpl = get_markup_template('photo_top.tpl'); if(count($r)) { foreach($r as $rr) { $o .= replace_macros($tpl,array( - '$id' => $rr['id'], - '$photolink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] - . '/image/' . $rr['resource-id'], + '$id' => $rr['id'], + '$photolink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'], '$phototitle' => t('View Photo'), - '$imgsrc' => $a->get_baseurl() . '/photo/' - . $rr['resource-id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.jpg', - '$albumlink' => $a->get_baseurl() . '/photos/' - . $a->data['user']['nickname'] . '/album/' . bin2hex($rr['album']), - '$albumname' => $rr['album'], - '$albumalt' => t('View Album'), - '$imgalt' => $rr['filename'] + '$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.jpg', + '$albumlink' => $a->get_baseurl() . '/photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($rr['album']), + '$albumname' => $rr['album'], + '$albumalt' => t('View Album'), + '$imgalt' => $rr['filename'] )); } diff --git a/mod/ping.php b/mod/ping.php index cb067f3fe..b736ea995 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -14,7 +14,7 @@ function ping_init(&$a) { $network = $r[0]['total']; $r = q("SELECT COUNT(*) AS `total` FROM `item` - WHERE `unseen` = 1 AND `visible` = 1 AND `deleted` = 0 AND `uid` = %d AND `type` != 'remote' ", + WHERE `unseen` = 1 AND `visible` = 1 AND `deleted` = 0 AND `uid` = %d AND `wall` = 1 ", intval(local_user()) ); $home = $r[0]['total']; diff --git a/mod/profile.php b/mod/profile.php index 5615573b9..634aec460 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -2,6 +2,9 @@ function profile_init(&$a) { + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) + return; + if($a->argc > 1) $which = $a->argv[1]; else { @@ -28,6 +31,11 @@ function profile_init(&$a) { $a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n"; } + $keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : ''); + $keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords); + if(strlen($keywords)) + $a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ; + $a->page['htmlhead'] .= '<meta name="dfrn-global-visibility" content="' . (($a->profile['net-publish']) ? 'true' : 'false') . '" />' . "\r\n" ; $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ; $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : '')); @@ -43,9 +51,16 @@ function profile_init(&$a) { function profile_content(&$a, $update = 0) { + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + return login(); + } + + + require_once("include/bbcode.php"); require_once('include/security.php'); - + require_once('include/conversation.php'); + require_once('include/acl_selectors.php'); $groups = array(); $tab = 'posts'; @@ -89,25 +104,21 @@ function profile_content(&$a, $update = 0) { if(x($_GET,'tab')) $tab = notags(trim($_GET['tab'])); - $tpl = load_view_file('view/profile_tabs.tpl'); + $tpl = get_markup_template('profile_tabs.tpl'); $o .= replace_macros($tpl,array( '$url' => $a->get_baseurl() . '/' . $a->cmd, - '$phototab' => $a->get_baseurl() . '/photos/' . $a->profile['nickname'] + '$phototab' => $a->get_baseurl() . '/photos/' . $a->profile['nickname'], + '$status' => t('Status'), + '$profile' => t('Profile'), + '$photos' => t('Photos') )); if($tab === 'profile') { - $profile_lang = get_config('system','language'); - if(! $profile_lang) - $profile_lang = 'en'; - if(file_exists("view/$profile_lang/profile_advanced.php")) - require_once("view/$profile_lang/profile_advanced.php"); - else - require_once('view/profile_advanced.php'); - + require_once('include/profile_advanced.php'); + $o .= advanced_profile($a); call_hooks('profile_advanced',$o); - return $o; } @@ -118,57 +129,19 @@ function profile_content(&$a, $update = 0) { if(can_write_wall($a,$a->profile['profile_uid'])) { - $geotag = ((($is_owner || $commvisitor) && $a->profile['allow_location']) ? load_view_file('view/jot_geotag.tpl') : ''); - - $tpl = load_view_file('view/jot-header.tpl'); - - $a->page['htmlhead'] .= replace_macros($tpl, array( - '$baseurl' => $a->get_baseurl(), - '$geotag' => $geotag, - '$nickname' => $a->profile['nickname'] - )); - - require_once('include/acl_selectors.php'); - - $tpl = load_view_file('view/jot.tpl'); - - if(is_array($a->user) && ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid'])))) - $lockstate = 'lock'; - else - $lockstate = 'unlock'; - - $jotplugins = ''; - $jotnets = ''; - call_hooks('jot_tool', $jotplugins); - - call_hooks('jot_networks', $jotnets); - - $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins)); - - $o .= replace_macros($tpl,array( - '$baseurl' => $a->get_baseurl(), - '$action' => 'item', - '$share' => t('Share'), - '$upload' => t('Upload photo'), - '$weblink' => t('Insert web link'), - '$youtube' => t('Insert YouTube video'), - '$setloc' => t('Set your location'), - '$noloc' => t('Clear browser location'), - '$wait' => t('Please wait'), - '$permset' => t('Permission settings'), - '$content' => '', - '$post_id' => '', - '$defloc' => (($is_owner) ? $a->user['default-location'] : ''), - '$return_path' => $a->cmd, - '$visitor' => (($is_owner || $commvisitor) ? 'block' : 'none'), - '$lockstate' => $lockstate, - '$emailcc' => t('CC: email addresses'), - '$jotnets' => $jotnets, - '$emtitle' => t('Example: bob@example.com, mary@example.com'), - '$bang' => '', - '$acl' => (($is_owner) ? populate_acl($a->user, $celeb) : ''), - '$profile_uid' => $a->profile['profile_uid'] - )); + $x = array( + 'is_owner' => $is_owner, + 'allow_location' => ((($is_owner || $commvisitor) && $a->profile['allow_location']) ? true : false), + 'default_location' => (($is_owner) ? $a->user['default-location'] : ''), + 'nickname' => $a->profile['nickname'], + 'lockstate' => (((is_array($a->user) && ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid']))))) ? 'lock' : 'unlock'), + 'acl' => (($is_owner) ? populate_acl($a->user, $celeb) : ''), + 'bang' => '', + 'visitor' => (($is_owner || $commvisitor) ? 'block' : 'none'), + 'profile_uid' => $a->profile['profile_uid'] + ); + + $o .= status_editor($a,$x); } // This is ugly, but we can't pass the profile_uid through the session to the ajax updater, @@ -195,7 +168,7 @@ function profile_content(&$a, $update = 0) { // Oh - while we're here... reset the Unseen messages $r = q("UPDATE `item` SET `unseen` = 0 - WHERE `type` != 'remote' AND `unseen` = 1 AND `uid` = %d", + WHERE `wall` = 1 AND `unseen` = 1 AND `uid` = %d", intval($_SESSION['uid']) ); @@ -228,191 +201,66 @@ function profile_content(&$a, $update = 0) { 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 `contact`.`pending` = 0 - AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` AND `wall` = 1 ) + AND `item`.`id` = `item`.`parent` AND `item`.`wall` = 1 $sql_extra ", intval($a->profile['profile_uid']) ); - if(count($r)) + if(count($r)) { $a->set_pager_total($r[0]['total']); + $a->set_pager_itemspage(40); + } - $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, - `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`network`, `contact`.`rel`, - `contact`.`thumb`, `contact`.`self`, - `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` + $r = q("SELECT `item`.`id` AS `item_id`, `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 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` AND `wall` = 1 ) + AND `item`.`id` = `item`.`parent` AND `item`.`wall` = 1 $sql_extra - ORDER BY `parent` DESC, `gravity` ASC, `id` ASC LIMIT %d ,%d ", + ORDER BY `item`.`created` DESC LIMIT %d ,%d ", intval($a->profile['profile_uid']), intval($a->pager['start']), intval($a->pager['itemspage']) ); + $parents_arr = array(); + $parents_str = ''; + + if(count($r)) { + foreach($r as $rr) + $parents_arr[] = $rr['item_id']; + $parents_str = implode(', ', $parents_arr); + + $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, + `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`network`, `contact`.`rel`, + `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 + AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + AND `item`.`parent` IN ( %s ) + $sql_extra + ORDER BY `parent` DESC, `gravity` ASC, `item`.`id` ASC ", + intval($a->profile['profile_uid']), + dbesc($parents_str) + ); + } if($is_owner && ! $update) $o .= get_birthdays(); - $cmnt_tpl = load_view_file('view/comment_item.tpl'); - - $like_tpl = load_view_file('view/like.tpl'); - - $tpl = load_view_file('view/wall_item.tpl'); - - $droptpl = load_view_file('view/wall_item_drop.tpl'); - $fakedrop = load_view_file('view/wall_fake_drop.tpl'); - if($update) - $return_url = $_SESSION['return_url']; - else - $return_url = $_SESSION['return_url'] = $a->cmd; - $alike = array(); - $dlike = array(); - - if($r !== false && count($r)) { - - foreach($r as $item) { - like_puller($a,$item,$alike,'like'); - like_puller($a,$item,$dlike,'dislike'); - } + $o .= conversation($a,$r,'profile',$update); - foreach($r as $item) { - - $sparkle = ''; - $comment = ''; - $likebuttons = ''; - - $template = $tpl; - - $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['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"), - '$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['profile_uid'], - '$mylink' => $contact['url'], - '$mytitle' => t('This is you'), - '$myphoto' => $contact['thumb'], - '$ww' => '' - )); - } - } - - - $profile_url = $item['url']; - - // This is my profile page 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']) - && ($item['network'] === 'dfrn') && (! $item['self'] )) { - $profile_url = $redirect_url; - $sparkle = ' sparkle'; - } - else - $sparkle = ''; - - // We would prefer to use our own avatar link for this item because the one in the author-avatar might reference a - // remote site (which could be down). We will use author-avatar if we haven't got something stored locally. - // We use this same logic block in mod/network.php to determine it this is a third party post and we don't have any - // local contact info at all. In this module you should never encounter a third-party author, but we still will do - // the right thing if you ever do. - - $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']); - - $profile_link = $profile_url; - - $drop = ''; - $dropping = false; - - if(($item['contact-id'] == remote_user()) || ($item['uid'] == local_user())) - $dropping = true; - - $drop = replace_macros((($dropping)? $droptpl : $fakedrop), array('$id' => $item['id'], '$delete' => t('Delete'))); - - - $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" 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 = (($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'), - '$profile_url' => $profile_link, - '$name' => $profile_name, - '$thumb' => $profile_avatar, - '$sparkle' => $sparkle, - '$title' => $item['title'], - '$body' => smilies(bbcode($item['body'])), - '$ago' => relative_date($item['created']), - '$lock' => $lock, - '$location' => $location, - '$indent' => $indent, - '$plink' => get_plink($item), - '$drop' => $drop, - '$like' => $like, - '$vote' => $likebuttons, - '$dislike' => $dislike, - '$comment' => $comment - )); - - $arr = array('item' => $item, 'output' => $tmp_item); - call_hooks('display_item', $arr); - - $o .= $arr['output']; - - } - } - if($update) { - return $o; - } + if(! $update) { - $o .= paginate($a); - $o .= '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>'; - + $o .= paginate($a); + $o .= '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>'; + } return $o; } diff --git a/mod/profile_photo.php b/mod/profile_photo.php index 0f84a85c9..b1fd0fc6e 100644 --- a/mod/profile_photo.php +++ b/mod/profile_photo.php @@ -58,21 +58,21 @@ function profile_photo_post(&$a) { $r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 4, 1); if($r === false) - notice ( t('Image size reduction [175] failed.') . EOL ); + notice ( sprintf(t('Image size reduction [%s] failed.'),"175") . EOL ); $im->scaleImage(80); $r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 5, 1); if($r === false) - notice( t('Image size reduction [80] failed.') . EOL ); + notice( sprintf(t('Image size reduction [%s] failed.'),"80") . EOL ); $im->scaleImage(48); $r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 6, 1); if($r === false) - notice( t('Image size reduction [48] failed.') . EOL ); + notice( sprintf(t('Image size reduction [%s] failed.'),"48") . EOL ); // Unset the profile photo flag from any other photos I own @@ -87,7 +87,7 @@ function profile_photo_post(&$a) { ); // Update global directory in background - $url = $_SESSION['my_url']; + $url = $a->get_baseurl() . '/profile/' . $a->user['nickname']; if($url && strlen(get_config('system','directory_submit_url'))) proc_run('php',"include/directory.php","$url"); } @@ -106,7 +106,7 @@ function profile_photo_post(&$a) { $maximagesize = get_config('system','maximagesize'); if(($maximagesize) && ($filesize > $maximagesize)) { - notice( t('Image exceeds size limit of ') . $maximagesize . EOL); + notice( sprintf(t('Image exceeds size limit of %d'), $maximagesize) . EOL); @unlink($src); return; } @@ -134,6 +134,11 @@ function profile_photo_content(&$a) { return; } + $newuser = false; + + if($a->argc == 2 && $a->argv[1] === 'new') + $newuser = true; + if( $a->argv[1]=='use'){ if ($a->argc<3){ notice( t('Permission denied.') . EOL ); @@ -181,10 +186,14 @@ function profile_photo_content(&$a) { if(! x($a->config,'imagecrop')) { - $tpl = load_view_file('view/profile_photo.tpl'); + $tpl = get_markup_template('profile_photo.tpl'); $o .= replace_macros($tpl,array( - '$user' => $a->user['nickname'] + '$user' => $a->user['nickname'], + '$lbl_upfile' => t('Upload File:'), + '$title' => t('Upload Profile Photo'), + '$submit' => t('Upload'), + '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . $a->get_baseurl() . '">' . t('skip this step') . '</a>' : '<a href="'. $a->get_baseurl() . '/photos/' . $a->user['nickname'] . '">' . t('select a photo from your photo albums') . '</a>') )); return $o; @@ -192,13 +201,15 @@ function profile_photo_content(&$a) { else { $filename = $a->config['imagecrop'] . '-' . $a->config['imagecrop_resolution'] . '.jpg'; $resolution = $a->config['imagecrop_resolution']; - $tpl = load_view_file("view/cropbody.tpl"); + $tpl = get_markup_template("cropbody.tpl"); $o .= replace_macros($tpl,array( '$filename' => $filename, '$resource' => $a->config['imagecrop'] . '-' . $a->config['imagecrop_resolution'], - '$image_url' => $a->get_baseurl() . '/photo/' . $filename - )); - + '$image_url' => $a->get_baseurl() . '/photo/' . $filename, + '$title' => t('Crop Image'), + '$desc' => t('Please adjust the image cropping for optimum viewing.'), + '$done' => t('Done Editing') + )); return $o; } @@ -234,14 +245,14 @@ function profile_photo_crop_ui_head(&$a, $ph){ $r = $ph->store(local_user(), 0 , $hash, $filename, t('Profile Photos'), 1 ); if($r === false) - notice( t('Image size reduction [640] failed.') . EOL ); + notice( sprintf(t('Image size reduction [%s] failed.'),"640") . EOL ); else $smallest = 1; } $a->config['imagecrop'] = $hash; $a->config['imagecrop_resolution'] = $smallest; - $a->page['htmlhead'] .= load_view_file("view/crophead.tpl"); + $a->page['htmlhead'] .= get_markup_template("crophead.tpl"); return; }} diff --git a/mod/profiles.php b/mod/profiles.php index 409999a3e..984420aa2 100644 --- a/mod/profiles.php +++ b/mod/profiles.php @@ -55,7 +55,8 @@ function profiles_post(&$a) { $region = notags(trim($_POST['region'])); $postal_code = notags(trim($_POST['postal_code'])); $country_name = notags(trim($_POST['country_name'])); - $keywords = notags(trim($_POST['keywords'])); + $pub_keywords = notags(trim($_POST['pub_keywords'])); + $prv_keywords = notags(trim($_POST['prv_keywords'])); $marital = notags(trim($_POST['marital'])); if($marital != $orig[0]['marital']) $maritalchanged = true; @@ -147,7 +148,8 @@ function profiles_post(&$a) { `homepage` = '%s', `politic` = '%s', `religion` = '%s', - `keywords` = '%s', + `pub_keywords` = '%s', + `prv_keywords` = '%s', `about` = '%s', `interest` = '%s', `contact` = '%s', @@ -176,7 +178,8 @@ function profiles_post(&$a) { dbesc($homepage), dbesc($politic), dbesc($religion), - dbesc($keywords), + dbesc($pub_keywords), + dbesc($prv_keywords), dbesc($about), dbesc($interest), dbesc($contact), @@ -344,10 +347,13 @@ function profiles_content(&$a) { require_once('include/profile_selectors.php'); - $tpl = load_view_file('view/profed_head.tpl'); + $tpl = get_markup_template('profed_head.tpl'); - $opt_tpl = load_view_file("view/profile-hide-friends.tpl"); + $opt_tpl = get_markup_template("profile-hide-friends.tpl"); $hide_friends = replace_macros($opt_tpl,array( + '$desc' => t('Hide my contact/friend list from viewers of this profile?'), + '$yes_str' => t('Yes'), + '$no_str' => t('No'), '$yes_selected' => (($r[0]['hide-friends']) ? " checked=\"checked\" " : ""), '$no_selected' => (($r[0]['hide-friends'] == 0) ? " checked=\"checked\" " : "") )); @@ -358,8 +364,46 @@ function profiles_content(&$a) { $is_default = (($r[0]['is-default']) ? 1 : 0); - $tpl = load_view_file("view/profile_edit.tpl"); + $tpl = get_markup_template("profile_edit.tpl"); $o .= replace_macros($tpl,array( + '$banner' => t('Edit Profile Details'), + '$submit' => t('Submit'), + '$viewprof' => t('View this profile'), + '$cr_prof' => t('Create a new profile using these settings'), + '$cl_prof' => t('Clone this profile'), + '$del_prof' => t('Delete this profile'), + '$lbl_profname' => t('Profile Name:'), + '$lbl_fullname' => t('Your Full Name:'), + '$lbl_title' => t('Title/Description:'), + '$lbl_gender' => t('Your Gender:'), + '$lbl_bd' => t("Birthday \x28y/m/d\x29:"), + '$lbl_address' => t('Street Address:'), + '$lbl_city' => t('Locality/City:'), + '$lbl_zip' => t('Postal/Zip Code:'), + '$lbl_country' => t('Country:'), + '$lbl_region' => t('Region/State:'), + '$lbl_marital' => t('<span class="heart">♥</span> Marital Status:'), + '$lbl_with' => t("Who: \x28if applicable\x29"), + '$lbl_ex1' => t('Examples: cathy123, Cathy Williams, cathy@example.com'), + '$lbl_sexual' => t('Sexual Preference:'), + '$lbl_homepage' => t('Homepage URL:'), + '$lbl_politic' => t('Political Views:'), + '$lbl_religion' => t('Religious Views:'), + '$lbl_pubkey' => t('Public Keywords:'), + '$lbl_prvkey' => t('Private Keywords:'), + '$lbl_ex2' => t('Example: fishing photography software'), + '$lbl_pubdsc' => t("\x28Used for suggesting potential friends, can be seen by others\x29"), + '$lbl_prvdsc' => t("\x28Used for searching profiles, never shown to others\x29"), + '$lbl_about' => t('Tell us about yourself...'), + '$lbl_hobbies' => t('Hobbies/Interests'), + '$lbl_social' => t('Contact information and Social Networks'), + '$lbl_music' => t('Musical interests'), + '$lbl_book' => t('Books, literature'), + '$lbl_tv' => t('Television'), + '$lbl_film' => t('Film/dance/culture/entertainment'), + '$lbl_love' => t('Love/romance'), + '$lbl_work' => t('Work/employment'), + '$lbl_school' => t('School/education'), '$disabled' => (($is_default) ? 'onclick="return false;" style="color: #BBBBFF;"' : ''), '$baseurl' => $a->get_baseurl(), '$profile_id' => $r[0]['id'], @@ -383,7 +427,8 @@ function profiles_content(&$a) { '$homepage' => $r[0]['homepage'], '$politic' => $r[0]['politic'], '$religion' => $r[0]['religion'], - '$keywords' => $r[0]['keywords'], + '$pub_keywords' => $r[0]['pub_keywords'], + '$prv_keywords' => $r[0]['prv_keywords'], '$music' => $r[0]['music'], '$book' => $r[0]['book'], '$tv' => $r[0]['tv'], @@ -406,17 +451,24 @@ function profiles_content(&$a) { local_user()); if(count($r)) { - $o .= load_view_file('view/profile_listing_header.tpl'); - $tpl_default = load_view_file('view/profile_entry_default.tpl'); - $tpl = load_view_file('view/profile_entry.tpl'); + $tpl_header = get_markup_template('profile_listing_header.tpl'); + $o .= replace_macros($tpl_header,array( + '$header' => t('Profiles'), + '$chg_photo' => t('Change profile photo'), + '$cr_new' => t('Create New Profile') + )); + + + $tpl = get_markup_template('profile_entry.tpl'); foreach($r as $rr) { - $template = (($rr['is-default']) ? $tpl_default : $tpl); - $o .= replace_macros($template, array( + $o .= replace_macros($tpl, array( '$photo' => $rr['thumb'], '$id' => $rr['id'], '$alt' => t('Profile Image'), - '$profile_name' => $rr['profile-name'] + '$profile_name' => $rr['profile-name'], + '$visible' => (($rr['is-default']) ? '<strong>' . t('Visible to everybody') . '</strong>' + : '<a href="' . $a->get_baseurl() . '/profperm/' . $rr['id'] . '" />' . t('Edit visibility') . '</a>') )); } } diff --git a/mod/profperm.php b/mod/profperm.php new file mode 100644 index 000000000..e70992a2b --- /dev/null +++ b/mod/profperm.php @@ -0,0 +1,141 @@ +<?php + +function profperm_init(&$a) { + + if(! local_user()) + return; + + $which = $a->user['nickname']; + $profile = $a->argv[1]; + + profile_load($a,$which,$profile); + +} + + +function profperm_content(&$a) { + + if(! local_user()) { + notice( t('Permission denied') . EOL); + return; + } + + + if($a->argc < 2) { + notice( t('Invalid profile identifier.') . EOL ); + return; + } + + if(($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) { + $r = q("SELECT `id` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `self` = 0 + AND `network` = 'dfrn' AND `id` = %d AND `uid` = %d LIMIT 1", + intval($a->argv[2]), + intval(local_user()) + ); + if(count($r)) + $change = intval($a->argv[2]); + } + + + if(($a->argc > 1) && (intval($a->argv[1]))) { + $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is-default` = 0 LIMIT 1", + intval($a->argv[1]), + intval(local_user()) + ); + if(! count($r)) { + notice( t('Invalid profile identifier.') . EOL ); + return; + } + $profile = $r[0]; + + $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `profile-id` = %d", + intval(local_user()), + intval($a->argv[1]) + ); + + $ingroup = array(); + if(count($r)) + foreach($r as $member) + $ingroup[] = $member['id']; + + $members = $r; + + if($change) { + if(in_array($change,$ingroup)) { + q("UPDATE `contact` SET `profile-id` = 0 WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($change), + intval(local_user()) + ); + } + else { + q("UPDATE `contact` SET `profile-id` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($a->argv[1]), + intval($change), + intval(local_user()) + ); + + } + + $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `profile-id` = %d", + intval(local_user()), + intval($a->argv[1]) + ); + + $members = $r; + + $ingroup = array(); + if(count($r)) + foreach($r as $member) + $ingroup[] = $member['id']; + } + + $o .= '<h2>' . t('Profile Visibility Editor') . '</h2>'; + + $o .= '<h3>' . t('Profile') . ' \'' . $profile['profile-name'] . '\'</h3>'; + + $o .= '<div id="prof-edit-desc">' . t('Click on a contact to add or remove.') . '</div>'; + + } + + $o .= '<div id="prof-update-wrapper">'; + if($change) + $o = ''; + + $o .= '<div id="prof-members">'; + $o .= '<h3>' . t('Visible To') . '</h3>'; + foreach($members as $member) { + if($member['url']) { + $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['id'] . '); return true;'; + $o .= micropro($member,true,'mpprof'); + } + } + $o .= '</div><div id="prof-members-end"></div>'; + $o .= '<hr id="prof-separator" />'; + $o .= '<div id="prof-all-contacts">'; + + $o .= '<h3>' . t("All Contacts \x28with secure profile access\x29") . '</h3>'; + $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `blocked` = 0 and `pending` = 0 and `self` = 0 + AND `network` = 'dfrn' ORDER BY `name` ASC", + intval(local_user()) + ); + + if(count($r)) { + foreach($r as $member) { + if(! in_array($member['id'],$ingroup)) { + $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['id'] . '); return true;'; + $o .= micropro($member,true,'mpprof'); + } + } + } + + $o .= '</div><div id="prof-all-contacts-end"></div>'; + + if($change) { + echo $o; + killme(); + } + $o .= '</div>'; + return $o; + +} + diff --git a/mod/redir.php b/mod/redir.php index ac21aa17e..8d0c8f4b3 100644 --- a/mod/redir.php +++ b/mod/redir.php @@ -5,6 +5,7 @@ function redir_init(&$a) { if((! local_user()) || (! ($a->argc == 2)) || (! intval($a->argv[1]))) goaway($a->get_baseurl()); $cid = $a->argv[1]; + $url = ((x($_GET,'url')) ? $_GET['url'] : ''); $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($cid), @@ -37,8 +38,8 @@ function redir_init(&$a) { ); logger('mod_redir: ' . $r[0]['name'] . ' ' . $sec, LOGGER_DEBUG); - + $dest = (($url) ? '&destination_url=' . $url : ''); goaway ($r[0]['poll'] . '?dfrn_id=' . $dfrn_id - . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec); + . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest ); } diff --git a/mod/register.php b/mod/register.php index fdf488b1a..c9521f9be 100644 --- a/mod/register.php +++ b/mod/register.php @@ -70,9 +70,9 @@ function register_post(&$a) { $err = ''; - if(strlen($username) > 48) + if(mb_strlen($username) > 48) $err .= t('Please use a shorter name.') . EOL; - if(strlen($username) < 3) + if(mb_strlen($username) < 3) $err .= t('Name too short.') . EOL; // I don't really like having this rule, but it cuts down @@ -85,8 +85,11 @@ function register_post(&$a) { // So now we are just looking for a space in the full name. $loose_reg = get_config('system','no_regfullname'); - if((! $loose_reg) && (! strpos($username,' '))) - $err .= t("That doesn\'t appear to be your full \x28First Last\x29 name.") . EOL; + if(! $loose_reg) { + $username = mb_convert_case($username,MB_CASE_TITLE,'UTF-8'); + if(! strpos($username,' ')) + $err .= t("That doesn't appear to be your full \x28First Last\x29 name.") . EOL; + } if(! allowed_email($email)) $err .= t('Your email domain is not among those allowed on this site.') . EOL; @@ -199,6 +202,24 @@ function register_post(&$a) { return; } + /** + * if somebody clicked submit twice very quickly, they could end up with two accounts + * due to race condition. Remove this one. + */ + + $r = q("SELECT `uid` FROM `user` + WHERE `nickname` = '%s' ", + dbesc($nickname) + ); + if((count($r) > 1) && $newuid) { + $err .= t('Nickname is already registered. Please choose another.') . EOL; + q("DELETE FROM `user` WHERE `uid` = %d LIMIT 1", + intval($newuid) + ); + notice ($err); + return; + } + if(x($newuid) !== false) { $r = q("INSERT INTO `profile` ( `uid`, `profile-name`, `is-default`, `name`, `photo`, `thumb`, `publish`, `net-publish` ) VALUES ( %d, '%s', %d, '%s', '%s', '%s', %d, %d ) ", @@ -298,7 +319,7 @@ function register_post(&$a) { if( $a->config['register_policy'] == REGISTER_OPEN ) { - $email_tpl = load_view_file("view/register_open_eml.tpl"); + $email_tpl = get_intltext_template("register_open_eml.tpl"); $email_tpl = replace_macros($email_tpl, array( '$sitename' => $a->config['sitename'], '$siteurl' => $a->get_baseurl(), @@ -307,8 +328,11 @@ function register_post(&$a) { '$password' => $new_password, '$uid' => $newuid )); - $res = mail($email, t('Registration details for ') . $a->config['sitename'], - $email_tpl, 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME']); + $res = mail($email, sprintf(t('Registration details for %s'), $a->config['sitename']), + $email_tpl, + 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n" + . 'Content-type: text/plain; charset=UTF-8' . "\n" + . 'Content-transfer-encoding: 8bit' ); if($res) { @@ -333,7 +357,7 @@ function register_post(&$a) { dbesc($new_password) ); - $email_tpl = load_view_file("view/register_verify_eml.tpl"); + $email_tpl = get_intltext_template("register_verify_eml.tpl"); $email_tpl = replace_macros($email_tpl, array( '$sitename' => $a->config['sitename'], '$siteurl' => $a->get_baseurl(), @@ -344,9 +368,11 @@ function register_post(&$a) { '$hash' => $hash )); - $res = mail($a->config['admin_email'], t('Registration request at ') . $a->config['sitename'], - $email_tpl,'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME']); - + $res = mail($a->config['admin_email'], sprintf(t('Registration request at %s'), $a->config['sitename']), + $email_tpl, + 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n" + . 'Content-type: text/plain; charset=UTF-8' . "\n" + . 'Content-transfer-encoding: 8bit' ); if($res) { notice( t('Your registration is pending approval by the site owner.') . EOL ) ; goaway($a->get_baseurl()); @@ -409,7 +435,7 @@ function register_content(&$a) { $profile_publish_reg = '<input type="hidden" name="profile_publish_reg" value="1" />'; } else { - $publish_tpl = load_view_file("view/profile_publish.tpl"); + $publish_tpl = get_markup_template("profile_publish.tpl"); $profile_publish = replace_macros($publish_tpl,array( '$instance' => 'reg', '$pubdesc' => t('Include your profile in member directory?'), @@ -424,7 +450,7 @@ function register_content(&$a) { $license = t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.'); - $o = load_view_file("view/register.tpl"); + $o = get_markup_template("register.tpl"); $o = replace_macros($o, array( '$oidhtml' => $oidhtml, '$realpeople' => $realpeople, diff --git a/mod/regmod.php b/mod/regmod.php index 00cfa06e2..fe29cb185 100644 --- a/mod/regmod.php +++ b/mod/regmod.php @@ -51,7 +51,7 @@ function regmod_content(&$a) { $r = q("DELETE FROM `register` WHERE `hash` = '%s' LIMIT 1", dbesc($register[0]['hash']) ); - notice( t('Registration revoked for ') . $user[0]['username'] . EOL); + notice( sprintf(t('Registration revoked for %s'), $user[0]['username']) . EOL); return; } @@ -79,7 +79,7 @@ function regmod_content(&$a) { proc_run('php',"include/directory.php","$url"); } - $email_tpl = load_view_file("view/register_open_eml.tpl"); + $email_tpl = get_intltext_template("register_open_eml.tpl"); $email_tpl = replace_macros($email_tpl, array( '$sitename' => $a->config['sitename'], '$siteurl' => $a->get_baseurl(), @@ -89,8 +89,11 @@ function regmod_content(&$a) { '$uid' => $user[0]['uid'] )); - $res = mail($user[0]['email'], t('Registration details for '). $a->config['sitename'], - $email_tpl,'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] ); + $res = mail($user[0]['email'], sprintf(t('Registration details for %s'), $a->config['sitename']), + $email_tpl, + 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n" + . 'Content-type: text/plain; charset=UTF-8' . "\n" + . 'Content-transfer-encoding: 8bit' ); if($res) { notice( t('Account approved.') . EOL ); diff --git a/mod/removeme.php b/mod/removeme.php index 62b9a6d13..6a56963b6 100644 --- a/mod/removeme.php +++ b/mod/removeme.php @@ -35,7 +35,7 @@ function removeme_content(&$a) { $_SESSION['remove_account_verify'] = $hash; - $tpl = load_view_file('view/removeme.tpl'); + $tpl = get_markup_template('removeme.tpl'); $o .= replace_macros($tpl, array( '$basedir' => $a->get_baseurl(), '$hash' => $hash, diff --git a/mod/rsd_xml.php b/mod/rsd_xml.php new file mode 100644 index 000000000..5bf4663fd --- /dev/null +++ b/mod/rsd_xml.php @@ -0,0 +1,24 @@ +<?php + + + +function rsd_xml_content(&$a) { + header ("Content-Type: text/xml"); + echo '<?xml version="1.0" encoding="UTF-8"?> + <rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd"> + <service> + <engineName>Friendika</engineName> + <engineLink>http://friendika.com/</engineLink> + <apis> + <api name="Twitter" preferred="true" apiLink="'.$a->get_baseurl().'/api/" blogID=""> + <settings> + <docs>http://status.net/wiki/TwitterCompatibleAPI</docs> + <setting name="OAuth">false</setting> + </settings> + </api> + </apis> + </service> + </rsd> + '; +die(); +}
\ No newline at end of file diff --git a/mod/salmon.php b/mod/salmon.php index 885ba470c..c2f76aa0a 100644 --- a/mod/salmon.php +++ b/mod/salmon.php @@ -89,7 +89,7 @@ function salmon_post(&$a) { // Create a fake feed wrapper so simplepie doesn't choke - $tpl = load_view_file('view/fake_feed.tpl'); + $tpl = get_markup_template('fake_feed.tpl'); $base = substr($data,strpos($data,'<entry')); diff --git a/mod/search.php b/mod/search.php index db7279fb5..33032e183 100644 --- a/mod/search.php +++ b/mod/search.php @@ -9,6 +9,15 @@ function search_post(&$a) { function search_content(&$a) { + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + notice( t('Public access denied.') . EOL); + return; + } + + require_once("include/bbcode.php"); + require_once('include/security.php'); + require_once('include/conversation.php'); + if(x($_SESSION,'theme')) unset($_SESSION['theme']); @@ -26,8 +35,6 @@ function search_content(&$a) { if(! $search) return $o; - require_once("include/bbcode.php"); - require_once('include/security.php'); $sql_extra = " AND `item`.`allow_cid` = '' @@ -36,12 +43,20 @@ function search_content(&$a) { AND `item`.`deny_gid` = '' "; + $s_bool = "AND MATCH (`item`.`body`) AGAINST ( '%s' IN BOOLEAN MODE )"; + $s_regx = "AND `item`.`body` REGEXP '%s' "; + + if(mb_strlen($search) >= 3) + $search_alg = $s_bool; + else + $search_alg = $s_regx; + $r = q("SELECT COUNT(*) AS `total` FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 AND ( `wall` = 1 OR `contact`.`uid` = %d ) AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND MATCH (`item`.`body`) AGAINST ( '%s' IN BOOLEAN MODE ) + $search_alg $sql_extra ", intval(local_user()), dbesc($search) @@ -57,7 +72,7 @@ function search_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`, `user`.`nickname` FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` @@ -65,74 +80,16 @@ function search_content(&$a) { WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 AND ( `wall` = 1 OR `contact`.`uid` = %d ) AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND MATCH (`item`.`body`) AGAINST ( '%s' IN BOOLEAN MODE ) + $search_alg $sql_extra ORDER BY `parent` DESC ", intval(local_user()), dbesc($search) ); - $tpl = load_view_file('view/search_item.tpl'); - $droptpl = load_view_file('view/wall_fake_drop.tpl'); - - $return_url = $_SESSION['return_url'] = $a->cmd; - - if(count($r)) { - - foreach($r as $item) { - - $total = 0; - $comment = ''; - $owner_url = ''; - $owner_photo = ''; - $owner_name = ''; - $sparkle = ''; - - if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE))) - && ($item['id'] != $item['parent'])) - continue; - - $total ++; - - $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']); - - - $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>'; - } - - $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, - '$name' => $profile_name, - '$sparkle' => $sparkle, - '$lock' => $lock, - '$thumb' => $profile_avatar, - '$title' => $item['title'], - '$body' => 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/' . $item['nickname'] . '/' . $item['id'] . '">' . t('View in context') . '</a>' - )); - - } - } + + + $o .= conversation($a,$r,'search',false); $o .= paginate($a); diff --git a/mod/settings.php b/mod/settings.php index ebe07612e..cba6958b3 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -5,6 +5,7 @@ function settings_init(&$a) { if(local_user()) { profile_load($a,$a->user['nickname']); } + } @@ -63,12 +64,54 @@ function settings_post(&$a) { $defloc = ((x($_POST,'defloc')) ? notags(trim($_POST['defloc'])) : ''); $openid = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url'])) : ''); $maxreq = ((x($_POST,'maxreq')) ? intval($_POST['maxreq']) : 0); + $expire = ((x($_POST,'expire')) ? intval($_POST['expire']) : 0); $allow_location = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0); $publish = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0); $net_publish = (((x($_POST,'profile_in_netdirectory')) && (intval($_POST['profile_in_netdirectory']) == 1)) ? 1: 0); $old_visibility = (((x($_POST,'visibility')) && (intval($_POST['visibility']) == 1)) ? 1 : 0); $page_flags = (((x($_POST,'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0); + $blockwall = (((x($_POST,'blockwall')) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted! + + $mail_server = ((x($_POST,'mail_server')) ? $_POST['mail_server'] : ''); + $mail_port = ((x($_POST,'mail_port')) ? $_POST['mail_port'] : ''); + $mail_ssl = ((x($_POST,'mail_ssl')) ? strtolower(trim($_POST['mail_ssl'])) : ''); + $mail_user = ((x($_POST,'mail_user')) ? $_POST['mail_user'] : ''); + $mail_pass = ((x($_POST,'mail_pass')) ? trim($_POST['mail_pass']) : ''); + $mail_replyto = ((x($_POST,'mail_replyto')) ? $_POST['mail_replyto'] : ''); + $mail_pubmail = ((x($_POST,'mail_pubmail')) ? $_POST['mail_pubmail'] : ''); + + + $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1); + + if(! $mail_disabled) { + $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1", + intval(local_user()) + ); + if(! count($r)) { + q("INSERT INTO `mailacct` (`uid`) VALUES (%d)", + intval(local_user()) + ); + } + if(strlen($mail_pass)) { + $pass = ''; + openssl_public_encrypt($mail_pass,$pass,$a->user['pubkey']); + q("UPDATE `mailacct` SET `pass` = '%s' WHERE `uid` = %d LIMIT 1", + dbesc(bin2hex($pass)), + intval(local_user()) + ); + } + $r = q("UPDATE `mailacct` SET `server` = '%s', `port` = %d, `ssltype` = '%s', `user` = '%s', + `mailbox` = 'INBOX', `reply_to` = '%s', `pubmail` = %d WHERE `uid` = %d LIMIT 1", + dbesc($mail_server), + intval($mail_port), + dbesc($mail_ssl), + dbesc($mail_user), + dbesc($mail_replyto), + intval($mail_pubmail), + intval(local_user()) + ); + } $notify = 0; @@ -139,7 +182,7 @@ function settings_post(&$a) { $openidserver = ''; } - $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', `openid` = '%s', `timezone` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', `allow_location` = %d, `theme` = '%s', `maxreq` = %d, `openidserver` = '%s' WHERE `uid` = %d LIMIT 1", + $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', `openid` = '%s', `timezone` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', `allow_location` = %d, `theme` = '%s', `maxreq` = %d, `expire` = %d, `openidserver` = '%s', `blockwall` = %d WHERE `uid` = %d LIMIT 1", dbesc($username), dbesc($email), dbesc($openid), @@ -154,7 +197,9 @@ function settings_post(&$a) { intval($allow_location), dbesc($theme), intval($maxreq), + intval($expire), dbesc($openidserver), + intval($blockwall), intval(local_user()) ); if($r) @@ -238,11 +283,34 @@ function settings_content(&$a) { $defloc = $a->user['default-location']; $openid = $a->user['openid']; $maxreq = $a->user['maxreq']; + $expire = ((intval($a->user['expire'])) ? $a->user['expire'] : ''); + $blockwall = $a->user['blockwall']; if(! strlen($a->user['timezone'])) $timezone = date_default_timezone_get(); - $pageset_tpl = load_view_file('view/pagetypes.tpl'); + + $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1); + + if(! $mail_disabled) { + $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1", + local_user() + ); + } + else { + $r = null; + $imap_disabled = (($mail_disabled) ? ' disabled="disabled" ' : ''); + } + + $mail_server = ((count($r)) ? $r[0]['server'] : ''); + $mail_port = ((count($r) && intval($r[0]['port'])) ? intval($r[0]['port']) : ''); + $mail_ssl = ((count($r)) ? $r[0]['ssltype'] : ''); + $mail_user = ((count($r)) ? $r[0]['user'] : ''); + $mail_replyto = ((count($r)) ? $r[0]['reply_to'] : ''); + $mail_pubmail = ((count($r)) ? $r[0]['pubmail'] : 0); + + + $pageset_tpl = get_markup_template('pagetypes.tpl'); $pagetype = replace_macros($pageset_tpl,array( '$normal' => (($a->user['page-flags'] == PAGE_NORMAL) ? " checked=\"checked\" " : ""), '$soapbox' => (($a->user['page-flags'] == PAGE_SOAPBOX) ? " checked=\"checked\" " : ""), @@ -251,7 +319,15 @@ function settings_content(&$a) { '$page_normal' => PAGE_NORMAL, '$page_soapbox' => PAGE_SOAPBOX, '$page_community' => PAGE_COMMUNITY, - '$page_freelove' => PAGE_FREELOVE + '$page_freelove' => PAGE_FREELOVE, + '$n_l' => t('Normal Account'), + '$n_d' => t('This account is a normal personal profile'), + '$s_l' => t('Soapbox Account'), + '$s_d' => t('Automatically approve all connection/friend requests as read-only fans'), + '$c_l' => t('Community/Celebrity Account'), + '$c_d' => t('Automatically approve all connection/friend requests as read-write fans'), + '$f_l' => t('Automatic Friend Account'), + '$f_d' => t('Automatically approve all connection/friend requests as friends') )); $noid = get_config('system','no_openid'); @@ -268,17 +344,23 @@ function settings_content(&$a) { $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />'; } else { - $opt_tpl = load_view_file("view/profile-in-directory.tpl"); + $opt_tpl = get_markup_template("profile-in-directory.tpl"); $profile_in_dir = replace_macros($opt_tpl,array( + '$desc' => t('Publish your default profile in site directory?'), + '$yes_str' => t('Yes'), + '$no_str' => t('No'), '$yes_selected' => (($profile['publish']) ? " checked=\"checked\" " : ""), '$no_selected' => (($profile['publish'] == 0) ? " checked=\"checked\" " : "") )); } if(strlen(get_config('system','directory_submit_url'))) { - $opt_tpl = load_view_file("view/profile-in-netdir.tpl"); + $opt_tpl = get_markup_template("profile-in-netdir.tpl"); $profile_in_net_dir = replace_macros($opt_tpl,array( + '$desc' => t('Publish your default profile in global social directory?'), + '$yes_str' => t('Yes'), + '$no_str' => t('No'), '$yes_selected' => (($profile['net-publish']) ? " checked=\"checked\" " : ""), '$no_selected' => (($profile['net-publish'] == 0) ? " checked=\"checked\" " : "") )); @@ -294,18 +376,7 @@ function settings_content(&$a) { if($invisible) notice( t('Profile is <strong>not published</strong>.') . EOL ); - $nickname_block = load_view_file("view/settings_nick_set.tpl"); - $nickname_subdir = ''; - if(strlen($a->get_path())) { - $subdir_tpl = load_view_file('view/settings_nick_subdir.tpl'); - $nickname_subdir = replace_macros($subdir_tpl, array( - '$baseurl' => $a->get_baseurl(), - '$nickname' => $nickname, - '$hostname' => $a->get_hostname() - )); - } - $theme_selector = '<select name="theme" id="theme-select" >'; $files = glob('view/theme/*'); @@ -321,28 +392,64 @@ function settings_content(&$a) { $theme_selector .= '<option val="' . basename($file) . '"' . $selected . '>' . basename($file) . '</option>'; } } + $theme_selector .= '</select>'; + $subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . $a->get_baseurl() . '/profile/' . $nickname : ''); + + $tpl_addr = get_markup_template("settings_nick_set.tpl"); - $nickname_block = replace_macros($nickname_block,array( + $prof_addr = replace_macros($tpl_addr,array( + '$desc' => t('Your Identity Address is'), '$nickname' => $nickname, - '$uid' => local_user(), - '$subdir' => $nickname_subdir, - '$basepath' => $a->get_hostname(), - '$baseurl' => $a->get_baseurl())); + '$subdir' => $subdir, + '$basepath' => $a->get_hostname() + )); - $stpl = load_view_file('view/settings.tpl'); + $stpl = get_markup_template('settings.tpl'); $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false); + $uexport = '<div id="uexport-link"><a href="uexport" >' . t('Export Personal Data') . '</a></div>'; + + $o .= replace_macros($stpl,array( + '$ptitle' => t('Account Settings'), + '$lbl_plug' => t('Plugin Settings'), + '$lbl_basic' => t('Basic Settings'), + '$lbl_fn' => t('Full Name:'), + '$lbl_email' => t('Email Address:'), + '$lbl_tz' => t('Your Timezone:'), + '$lbl_loc1' => t('Default Post Location:'), + '$lbl_loc2' => t('Use Browser Location:'), + '$lbl_theme' => t('Display Theme:'), + '$submit' => t('Submit'), + '$lbl_prv' => t('Security and Privacy Settings'), + '$lbl_maxreq' => t('Maximum Friend Requests/Day:'), + '$lbl_maxrdesc' => t("\x28to prevent spam abuse\x29"), + '$lbl_rempost' => t('Allow friends to post to your profile page:'), + '$lbl_exp1' => t("Automatically expire \x28delete\x29 posts older than"), + '$lbl_exp2' => t('days'), + '$lbl_not1' => t('Notification Settings'), + '$lbl_not2' => t('Send a notification email when:'), + '$lbl_not3' => t('You receive an introduction'), + '$lbl_not4' => t('Your introductions are confirmed'), + '$lbl_not5' => t('Someone writes on your profile wall'), + '$lbl_not6' => t('Someone writes a followup comment'), + '$lbl_not7' => t('You receive a private message'), + '$lbl_pass1' => t('Password Settings'), + '$lbl_pass2' => t('Leave password fields blank unless changing'), + '$lbl_pass3' => t('New Password:'), + '$lbl_pass4' => t('Confirm:'), + '$lbl_advn' => t('Advanced Page Settings'), '$baseurl' => $a->get_baseurl(), '$oidhtml' => $oidhtml, + '$uexport' => $uexport, '$uid' => local_user(), '$username' => $username, '$openid' => $openid, '$email' => $email, - '$nickname_block' => $nickname_block, + '$nickname_block' => $prof_addr, '$timezone' => $timezone, '$zoneselect' => select_timezone($timezone), '$defloc' => $defloc, @@ -350,6 +457,7 @@ function settings_content(&$a) { '$profile_in_dir' => $profile_in_dir, '$profile_in_net_dir' => $profile_in_net_dir, '$permissions' => t('Default Post Permissions'), + '$permdesc' => t("\x28click to open/close\x29"), '$visibility' => $profile['net-publish'], '$aclselect' => populate_acl($a->user,$celeb), '$sel_notify1' => (($notify & NOTIFY_INTRO) ? ' checked="checked" ' : ''), @@ -358,8 +466,27 @@ function settings_content(&$a) { '$sel_notify4' => (($notify & NOTIFY_COMMENT) ? ' checked="checked" ' : ''), '$sel_notify5' => (($notify & NOTIFY_MAIL) ? ' checked="checked" ' : ''), '$maxreq' => $maxreq, + '$expire' => $expire, + '$blockw_checked' => (($blockwall) ? '' : ' checked="checked" ' ), '$theme' => $theme_selector, - '$pagetype' => $pagetype + '$pagetype' => $pagetype, + '$lbl_imap0' => t('Email/Mailbox Setup'), + '$imap_desc' => t("If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox."), + '$lbl_imap1' => t('IMAP server name:'), + '$imap_server' => $mail_server, + '$lbl_imap2' => t('IMAP port:'), + '$imap_port' => $mail_port, + '$lbl_imap3' => t("Security \x28TLS or SSL\x29:"), + '$imap_ssl' => $mail_ssl, + '$lbl_imap4' => t('Email login name:'), + '$imap_user' => $mail_user, + '$lbl_imap5' => t('Email password:'), + '$lbl_imap6' => t("Reply-to address \x28Optional\x29:"), + '$imap_replyto' => $mail_replyto, + '$lbl_imap7' => t('Send public posts to all email contacts:'), + '$pubmail_checked' => (($mail_pubmail) ? ' checked="checked" ' : ''), + '$mail_disabled' => (($mail_disabled) ? '<div class="error-message">' . t('Email access is disabled on this site.') . '</div>' : ''), + '$imap_disabled' => $imap_disabled )); call_hooks('settings_form',$o); diff --git a/mod/share.php b/mod/share.php new file mode 100644 index 000000000..f355a842a --- /dev/null +++ b/mod/share.php @@ -0,0 +1,23 @@ +<?php + +require_once('bbcode.php'); + +function share_init(&$a) { + + $post_id = (($a->argc > 1) ? intval($a->argv[1]) : 0); + if((! $post_id) || (! local_user())) + killme(); + + $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", + intval($post_id) + ); + if(! count($r) || $r[0]['private']) + killme(); + + $o = ''; + + $o .= '♲ <a href="' . $r[0]['author-link'] . '">' . $r[0]['author-name'] . '</a><br />'; + $o .= bbcode($r[0]['body'], true); + echo $o . '<br />'; + killme(); +} diff --git a/mod/uexport.php b/mod/uexport.php new file mode 100644 index 000000000..96f062c41 --- /dev/null +++ b/mod/uexport.php @@ -0,0 +1,72 @@ +<?php + +function uexport_init(&$a) { + + if(! local_user()) + killme(); + + $user = array(); + $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", + local_user() + ); + if(count($r)) { + foreach($r as $rr) + foreach($rr as $k => $v) + $user[$k] = $v; + + } + $contact = array(); + $r = q("SELECT * FROM `contact` WHERE `uid` = %d ", + intval(local_user()) + ); + if(count($r)) { + foreach($r as $rr) + foreach($rr as $k => $v) + $contact[][$k] = $v; + + } + + $profile = array(); + $r = q("SELECT * FROM `profile` WHERE `uid` = %d ", + intval(local_user()) + ); + if(count($r)) { + foreach($r as $rr) + foreach($rr as $k => $v) + $profile[][$k] = $v; + } + + $output = array('user' => $user, 'contact' => $contact, 'profile' => $profile ); + + header("Content-type: application/json"); + echo str_replace('\\/','/',json_encode($output)); + + $r = q("SELECT count(*) as `total` FROM `item` WHERE `uid` = %d ", + intval(local_user()) + ); + if(count($r)) + $total = $r[0]['total']; + + // chunk the output to avoid exhausting memory + + for($x = 0; $x < $total; $x += 500) { + $item = array(); + $r = q("SELECT * FROM `item` WHERE `uid` = %d LIMIT %d, %d", + intval(local_user()), + intval($x), + intval(500) + ); + if(count($r)) { + foreach($r as $rr) + foreach($rr as $k => $v) + $item[][$k] = $v; + } + + $output = array('item' => $item); + echo str_replace('\\/','/',json_encode($output)); + } + + + killme(); + +}
\ No newline at end of file diff --git a/mod/update_network.php b/mod/update_network.php index cf9f11f58..36de0722a 100644 --- a/mod/update_network.php +++ b/mod/update_network.php @@ -19,6 +19,17 @@ function update_network_content(&$a) { $replace = "<img\${1} dst=\"\${2}\""; $text = preg_replace($pattern, $replace, $text); + $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />'; + $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i"; + $text = preg_replace($pattern, $replace, $text); + $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i"; + $text = preg_replace($pattern, $replace, $text); + $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i"; + $text = preg_replace($pattern, $replace, $text); + $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i"; + $text = preg_replace($pattern, $replace, $text); + + echo str_replace("\t",' ',$text); echo (($_GET['msie'] == 1) ? '</div>' : '</section>'); echo "</body></html>\r\n"; diff --git a/mod/update_profile.php b/mod/update_profile.php index 13c519d1c..c4884b30f 100644 --- a/mod/update_profile.php +++ b/mod/update_profile.php @@ -38,6 +38,16 @@ function update_profile_content(&$a) { $replace = "<img\${1} dst=\"\${2}\""; $text = preg_replace($pattern, $replace, $text); + $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />'; + $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i"; + $text = preg_replace($pattern, $replace, $text); + $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i"; + $text = preg_replace($pattern, $replace, $text); + $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i"; + $text = preg_replace($pattern, $replace, $text); + $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i"; + $text = preg_replace($pattern, $replace, $text); + /** * reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well */ diff --git a/mod/viewcontacts.php b/mod/viewcontacts.php index 90ff85b9d..732607b18 100644 --- a/mod/viewcontacts.php +++ b/mod/viewcontacts.php @@ -2,13 +2,21 @@ function viewcontacts_init(&$a) { - profile_load($a,$a->argv[1]); + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + return; + } + profile_load($a,$a->argv[1]); } function viewcontacts_content(&$a) { + if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { + notice( t('Public access denied.') . EOL); + return; + } + if(((! count($a->profile)) || ($a->profile['hide-friends']))) { notice( t('Permission denied.') . EOL); return; @@ -33,7 +41,7 @@ function viewcontacts_content(&$a) { return $o; } - $tpl = load_view_file("view/viewcontact_template.tpl"); + $tpl = get_markup_template("viewcontact_template.tpl"); foreach($r as $rr) { if($rr['self']) @@ -41,9 +49,10 @@ function viewcontacts_content(&$a) { $o .= replace_macros($tpl, array( '$id' => $rr['id'], - '$alt_text' => t('Visit ') . $rr['name'] . t('\'s profile'), + '$alt_text' => t('Visit $username\'s profile'), '$thumb' => $rr['thumb'], '$name' => substr($rr['name'],0,20), + '$username' => $rr['name'], '$url' => $rr['url'] )); } diff --git a/mod/wall_upload.php b/mod/wall_upload.php index b5725311d..f7638b730 100644 --- a/mod/wall_upload.php +++ b/mod/wall_upload.php @@ -53,7 +53,7 @@ function wall_upload_post(&$a) { $maximagesize = get_config('system','maximagesize'); if(($maximagesize) && ($filesize > $maximagesize)) { - notice( t('Image exceeds size limit of ') . $maximagesize . EOL); + notice( sprintf(t('Image exceeds size limit of %d'), $maximagesize) . EOL); @unlink($src); return; } diff --git a/mod/xrd.php b/mod/xrd.php index a0ecbaea8..8ac6ff7cf 100644 --- a/mod/xrd.php +++ b/mod/xrd.php @@ -27,7 +27,7 @@ function xrd_content(&$a) { header("Content-type: text/xml"); - $tpl = load_view_file('view/xrd_person.tpl'); + $tpl = file_get_contents('view/xrd_person.tpl'); $o = replace_macros($tpl, array( '$accturi' => $uri, |