diff --git a/boot.php b/boot.php index 451a622c0..c4bdb1187 100644 --- a/boot.php +++ b/boot.php @@ -1589,4 +1589,25 @@ if(! function_exists('linkify')) { function linkify($s) { $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%]*)/", ' $1', $s); return($s); +}} + +if(! function_exists('smilies')) { +function smilies($s) { + $a = get_app(); + + return str_replace( + array( ':-)', ';-)', ':-(', ':(', ':-P', ':-"', ':-x', ':-X', ':-D', '8-|', '8-O'), + array( + ':-)', + ';-)', + ':-(', + ':(', + ':-P', + ':-\', + ':-x', + ':-X', + ':-D', + '8-|', + '8-O' + ), $s); }} \ No newline at end of file diff --git a/images/smiley-cool.gif b/images/smiley-cool.gif new file mode 100644 index 000000000..ba90cc36f Binary files /dev/null and b/images/smiley-cool.gif differ diff --git a/images/smiley-cry.gif b/images/smiley-cry.gif new file mode 100644 index 000000000..74d897a4f Binary files /dev/null and b/images/smiley-cry.gif differ diff --git a/images/smiley-embarassed.gif b/images/smiley-embarassed.gif new file mode 100644 index 000000000..963a96b8a Binary files /dev/null and b/images/smiley-embarassed.gif differ diff --git a/images/smiley-foot-in-mouth.gif b/images/smiley-foot-in-mouth.gif new file mode 100644 index 000000000..16f68cc1e Binary files /dev/null and b/images/smiley-foot-in-mouth.gif differ diff --git a/images/smiley-frown.gif b/images/smiley-frown.gif new file mode 100644 index 000000000..716f55e16 Binary files /dev/null and b/images/smiley-frown.gif differ diff --git a/images/smiley-innocent.gif b/images/smiley-innocent.gif new file mode 100644 index 000000000..334d49e0e Binary files /dev/null and b/images/smiley-innocent.gif differ diff --git a/images/smiley-kiss.gif b/images/smiley-kiss.gif new file mode 100644 index 000000000..4efd549ed Binary files /dev/null and b/images/smiley-kiss.gif differ diff --git a/images/smiley-laughing.gif b/images/smiley-laughing.gif new file mode 100644 index 000000000..1606c119e Binary files /dev/null and b/images/smiley-laughing.gif differ diff --git a/images/smiley-money-mouth.gif b/images/smiley-money-mouth.gif new file mode 100644 index 000000000..ca2451e10 Binary files /dev/null and b/images/smiley-money-mouth.gif differ diff --git a/images/smiley-sealed.gif b/images/smiley-sealed.gif new file mode 100644 index 000000000..b33d3cca1 Binary files /dev/null and b/images/smiley-sealed.gif differ diff --git a/images/smiley-smile.gif b/images/smiley-smile.gif new file mode 100644 index 000000000..e6a9e60d5 Binary files /dev/null and b/images/smiley-smile.gif differ diff --git a/images/smiley-surprised.gif b/images/smiley-surprised.gif new file mode 100644 index 000000000..cb99cdd91 Binary files /dev/null and b/images/smiley-surprised.gif differ diff --git a/images/smiley-tongue-out.gif b/images/smiley-tongue-out.gif new file mode 100644 index 000000000..2075dc160 Binary files /dev/null and b/images/smiley-tongue-out.gif differ diff --git a/images/smiley-undecided.gif b/images/smiley-undecided.gif new file mode 100644 index 000000000..bef7e2573 Binary files /dev/null and b/images/smiley-undecided.gif differ diff --git a/images/smiley-wink.gif b/images/smiley-wink.gif new file mode 100644 index 000000000..9faf1aff8 Binary files /dev/null and b/images/smiley-wink.gif differ diff --git a/images/smiley-yell.gif b/images/smiley-yell.gif new file mode 100644 index 000000000..648e6e879 Binary files /dev/null and b/images/smiley-yell.gif differ diff --git a/include/dba.php b/include/dba.php index fd403b560..ae3a4957b 100644 --- a/include/dba.php +++ b/include/dba.php @@ -28,7 +28,6 @@ class dba { } public function q($sql) { - global $debug_text; if(! $this->db ) return false; diff --git a/index.php b/index.php index 4ad5f17e2..f2c43a8b3 100644 --- a/index.php +++ b/index.php @@ -1,28 +1,66 @@ config['system']['language'])) ? $a->config['system']['language'] : 'en'); load_translation_table($lang); +/** + * + * Try to open the database; + * + */ + require_once("dba.php"); $db = new dba($db_host, $db_user, $db_pass, $db_data, $install); unset($db_host, $db_user, $db_pass, $db_data); + +/** + * + * Important stuff we always need to do. + * Initialise authentication and date and time. + * Create the HTML head for the page, even if we may not use it (xml, etc.) + * The order of these may be important so use caution if you think they're all + * intertwingled with no logical order and decide to sort it out. Some of the + * dependencies have changed, but at least at one time in the recent past - the + * order was critical to everything working properly + * + */ + if(! $install) require_once("session.php"); @@ -34,6 +72,17 @@ $a->init_pagehead(); session_start(); +/** + * + * For Mozilla auth manager - still needs sorting, and this might conflict with LRDD header. + * Apache/PHP lumps the Link: headers into one - and other services might not be able to parse it + * this way. There's a PHP flag to link the headers because by default this will over-write any other + * link header. + * + * What we really need to do is output the raw headers ourselves so we can keep them separate. + * + */ + // header('Link: <' . $a->get_baseurl() . '/amcd>; rel="acct-mgmt";'); if((x($_SESSION,'authenticated')) || (x($_POST,'auth-params')) || ($a->module === 'login')) @@ -45,11 +94,34 @@ if(! x($_SESSION,'authenticated')) if(! x($_SESSION,'sysmsg')) $_SESSION['sysmsg'] = ''; +/* + * check_config() is responible for running update scripts. These automatically + * update the DB schema whenever we push a new one out. + */ + + if($install) $a->module = 'install'; else check_config($a); + +/** + * + * We have already parsed the server path into $->argc and $a->argv + * + * $a->argv[0] is our module name. We will load the file mod/{$a->argv[0]}.php + * and use it for handling our URL request. + * The module file contains a few functions that we call in various circumstances + * and in the following order: + * + * "module"_init + * "module"_post (only if there are $_POST variables) + * "module"_afterpost + * "module"_content - the string return of this function contains our page body + * + */ + if(strlen($a->module)) { if(file_exists("mod/{$a->module}.php")) { include("mod/{$a->module}.php"); @@ -66,7 +138,7 @@ if($a->module_loaded) { if(function_exists($a->module . '_init')) { $func = $a->module . '_init'; $func($a); - } + } if(($_SERVER['REQUEST_METHOD'] === 'POST') && (! $a->error) && (function_exists($a->module . '_post')) @@ -93,7 +165,11 @@ if(stristr($_SESSION['sysmsg'], t('Permission denied'))) { header($_SERVER["SERVER_PROTOCOL"] . ' 403 ' . t('Permission denied.')); } -// report anything important happening +/** + * + * Report anything which needs to be communicated in the notification area (before the main body) + * + */ if(x($_SESSION,'sysmsg')) { $a->page['content'] = "
{$_SESSION['sysmsg']}
\r\n" @@ -101,19 +177,30 @@ if(x($_SESSION,'sysmsg')) { unset($_SESSION['sysmsg']); } - -// Feel free to comment out this line on production sites. -$a->page['content'] .= $debug_text; +/** + * + * Add a place for the pause/resume Ajax indicator + * + */ $a->page['content'] .= '
'; -// build page -// Navigation (menu) template +/** + * + * Add the navigation (menu) template + * + */ + if($a->module != 'install') require_once("nav.php"); -// make sure the desired theme exists, though if the default theme doesn't exist we're stuffed. +/** + * + * Build the page - now that we have all the components + * Make sure the desired theme exists, though if the default theme doesn't exist we're stuffed. + * + */ if((x($_SESSION,'theme')) && (! file_exists('view/theme/' . $_SESSION['theme'] . '/style.css'))) unset($_SESSION['theme']); diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 950d589f3..7018bf52b 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -1,14 +1,28 @@ interactive = false; // notice() becomes a no-op since nobody is there to see it @@ -19,10 +33,17 @@ function dfrn_confirm_post(&$a,$handsfree = null) { $node = $a->argv[1]; } - // Main entry point. Our user received a friend request notification (perhaps - // from another site) and clicked 'Approve'. $POST['source_url'] is not set. - // OR we have been called directly from dfrn_request ($handsfree != null) due to - // this being a page type which supports automatic friend acceptance. + /** + * + * Main entry point. Scenario 1. Our user received a friend request notification (perhaps + * from another site) and clicked 'Approve'. + * $POST['source_url'] is not set. If it is, it indicates Scenario 2. + * + * We may also have been called directly from dfrn_request ($handsfree != null) due to + * this being a page type which supports automatic friend acceptance. That is also Scenario 1 + * since we are operating on behalf of our registered user to approve a friendship. + * + */ if(! x($_POST,'source_url')) { @@ -43,35 +64,53 @@ function dfrn_confirm_post(&$a,$handsfree = null) { } - // These come from either the friend request notification form or $handsfree array. + // These data elements may come from either the friend request notification form or $handsfree array. if(is_array($handsfree)) { - $dfrn_id = $handsfree['dfrn_id']; - $intro_id = $handsfree['intro_id']; - $duplex = $handsfree['duplex']; logger('dfrn_confirm: Confirm in handsfree mode'); + $dfrn_id = $handsfree['dfrn_id']; + $intro_id = $handsfree['intro_id']; + $duplex = $handsfree['duplex']; } else { - $dfrn_id = ((x($_POST,'dfrn_id')) ? notags(trim($_POST['dfrn_id'])) : ""); - $intro_id = intval($_POST['intro_id']); - $duplex = intval($_POST['duplex']); - $cid = intval($_POST['contact_id']); + $dfrn_id = ((x($_POST,'dfrn_id')) ? notags(trim($_POST['dfrn_id'])) : ""); + $intro_id = ((x($_POST,'intro_id')) ? intval($_POST['intro_id']) : 0 ); + $duplex = ((x($_POST,'duplex')) ? intval($_POST['duplex']) : 0 ); + $cid = ((x($_POST,'contact_id')) ? intval($_POST['contact_id']) : 0 ); } + /** + * + * Ensure that dfrn_id has precedence when we go to find the contact record. + * We only want to search based on contact id if there is no dfrn_id, + * e.g. for OStatus network followers. + * + */ + + if(strlen($dfrn_id)) + $cid = 0; + logger('dfrn_confirm: Confirming request for dfrn_id (issued) ' . $dfrn_id); + if($cid) + logger('dfrn_confirm: Confirming follower with contact_id: ' . $cid); - // The other person will have been issued an ID when they first requested friendship. - // Locate their record. At this time, their record will have both pending and blocked set to 1. - // There won't be any dfrn_id if this is a network follower, so use the contact_id instead. + /** + * + * The other person will have been issued an ID when they first requested friendship. + * Locate their record. At this time, their record will have both pending and blocked set to 1. + * There won't be any dfrn_id if this is a network follower, so use the contact_id instead. + * + */ $r = q("SELECT * FROM `contact` WHERE ( ( `issued-id` != '' AND `issued-id` = '%s' ) OR ( `id` = %d AND `id` != 0 ) ) AND `uid` = %d LIMIT 1", - dbesc($dfrn_id), - intval($cid), - intval($uid) + dbesc($dfrn_id), + intval($cid), + intval($uid) ); if(! count($r)) { + logger('dfrn_confirm: Contact not found in DB.'); notice( t('Contact not found.') . EOL ); return; } @@ -88,11 +127,15 @@ function dfrn_confirm_post(&$a,$handsfree = null) { if($network === 'dfrn') { - // Generate a key pair for all further communications with this person. - // We have a keypair for every contact, and a site key for unknown people. - // This provides a means to carry on relationships with other people if - // any single key is compromised. It is a robust key. We're much more - // worried about key leakage than anybody cracking it. + /** + * + * Generate a key pair for all further communications with this person. + * We have a keypair for every contact, and a site key for unknown people. + * This provides a means to carry on relationships with other people if + * any single key is compromised. It is a robust key. We're much more + * worried about key leakage than anybody cracking it. + * + */ $res = openssl_pkey_new(array( 'digest_alg' => 'sha1', @@ -100,7 +143,6 @@ function dfrn_confirm_post(&$a,$handsfree = null) { 'encrypt_key' => false ) ); - $private_key = ''; openssl_pkey_export($res, $private_key); @@ -118,16 +160,20 @@ function dfrn_confirm_post(&$a,$handsfree = null) { $params = array(); - // Per the protocol document, we will verify both ends by encrypting the dfrn_id with our - // site private key (person on the other end can decrypt it with our site public key). - // Then encrypt our profile URL with the other person's site public key. They can decrypt - // it with their site private key. If the decryption on the other end fails for either - // item, it indicates tampering or key failure on at least one site and we will not be - // able to provide a secure communication pathway. - - // If other site is willing to accept full encryption, (aes_allow is 1 AND we have php5.3 - // or later) then we encrypt the personal public key we send them using AES-256-CBC and a - // random key which is encrypted with their site public key. + /** + * + * Per the DFRN protocol, we will verify both ends by encrypting the dfrn_id with our + * site private key (person on the other end can decrypt it with our site public key). + * Then encrypt our profile URL with the other person's site public key. They can decrypt + * it with their site private key. If the decryption on the other end fails for either + * item, it indicates tampering or key failure on at least one site and we will not be + * able to provide a secure communication pathway. + * + * If other site is willing to accept full encryption, (aes_allow is 1 AND we have php5.3 + * or later) then we encrypt the personal public key we send them using AES-256-CBC and a + * random key which is encrypted with their site public key. + * + */ $src_aes_key = random_string(); @@ -153,7 +199,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { if($duplex == 1) $params['duplex'] = 1; - logger('dfrn_confirm: Confirm: posted data: ' . print_r($params,true), LOGGER_DATA); + logger('dfrn_confirm: Confirm: posting data to ' . $dfrn_confirm . ': ' . print_r($params,true), LOGGER_DATA); // POST all this stuff to the other site. @@ -233,9 +279,16 @@ function dfrn_confirm_post(&$a,$handsfree = null) { return; } - // We have now established a relationship with the other site. - // Let's make our own personal copy of their profile photo so we don't have - // to always load it from their site. + + /* + * + * We have now established a relationship with the other site. + * Let's make our own personal copy of their profile photo so we don't have + * to always load it from their site. + * + * We will also update the contact record with the nature and scope of the relationship. + * + */ require_once("Photo.php"); @@ -276,12 +329,11 @@ function dfrn_confirm_post(&$a,$handsfree = null) { ); } else { + // $network !== 'dfrn' $notify = ''; $poll = ''; - // $network !== 'dfrn' - $arr = lrdd($contact['url']); if(count($arr)) { foreach($arr as $link) { @@ -332,31 +384,33 @@ function dfrn_confirm_post(&$a,$handsfree = null) { if($handsfree === null) goaway($a->get_baseurl() . '/contacts/' . intval($contact_id)); - return; //NOTREACHED - + else + return; + //NOTREACHED } - - - // End of first scenario. [Local confirmation of remote friend request]. - - - - // Begin scenario two. This is the remote response to the above scenario. - // This will take place on the site that originally initiated the friend request. - // In the section above where the confirming party makes a POST and - // retrieves xml status information, they are communicating with the following code. + /** + * + * + * End of Scenario 1. [Local confirmation of remote friend request]. + * + * Begin Scenario 2. This is the remote response to the above scenario. + * This will take place on the site that originally initiated the friend request. + * In the section above where the confirming party makes a POST and + * retrieves xml status information, they are communicating with the following code. + * + */ if(x($_POST,'source_url')) { // We are processing an external confirmation to an introduction created by our user. - $public_key = $_POST['public_key']; - $dfrn_id = hex2bin($_POST['dfrn_id']); - $source_url = hex2bin($_POST['source_url']); - $aes_key = $_POST['aes_key']; - $duplex = $_POST['duplex']; - $version_id = (float) $_POST['dfrn_version']; + $public_key = ((x($_POST,'public_key')) ? $_POST['public_key'] : ''); + $dfrn_id = ((x($_POST,'dfrn_id')) ? hex2bin($_POST['dfrn_id']) : ''); + $source_url = ((x($_POST,'source_url')) ? hex2bin($_POST['source_url']) : ''); + $aes_key = ((x($_POST,'aes_key')) ? $_POST['aes_key'] : ''); + $duplex = ((x($_POST,'duplex')) ? intval($_POST['duplex']) : 0 ); + $version_id = ((x($_POST,'dfrn_version')) ? (float) $_POST['dfrn_version'] : 2.0); logger('dfrn_confirm: requestee contacted: ' . $node); diff --git a/mod/display.php b/mod/display.php index ec036de62..369161619 100644 --- a/mod/display.php +++ b/mod/display.php @@ -249,7 +249,7 @@ function display_content(&$a) { '$osparkle' => $osparkle, '$thumb' => $profile_avatar, '$title' => $item['title'], - '$body' => bbcode($item['body']), + '$body' => smilies(bbcode($item['body'])), '$ago' => relative_date($item['created']), '$lock' => $lock, '$location' => $location, diff --git a/mod/network.php b/mod/network.php index c52bb74fc..43c55b8e3 100644 --- a/mod/network.php +++ b/mod/network.php @@ -292,7 +292,7 @@ function network_content(&$a, $update = 0) { '$osparkle' => $osparkle, '$sparkle' => $sparkle, '$title' => $item['title'], - '$body' => bbcode($item['body']), + '$body' => smilies(bbcode($item['body'])), '$ago' => relative_date($item['created']), '$lock' => $lock, '$location' => $location, diff --git a/mod/profile.php b/mod/profile.php index d09e0187b..a431f4bdd 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -388,7 +388,7 @@ function profile_content(&$a, $update = 0) { '$thumb' => $profile_avatar, '$sparkle' => $sparkle, '$title' => $item['title'], - '$body' => bbcode($item['body']), + '$body' => smilies(bbcode($item['body'])), '$ago' => relative_date($item['created']), '$lock' => $lock, '$location' => $location,