diff options
-rw-r--r-- | boot.php | 21 | ||||
-rw-r--r-- | images/smiley-cool.gif | bin | 0 -> 354 bytes | |||
-rw-r--r-- | images/smiley-cry.gif | bin | 0 -> 329 bytes | |||
-rw-r--r-- | images/smiley-embarassed.gif | bin | 0 -> 331 bytes | |||
-rw-r--r-- | images/smiley-foot-in-mouth.gif | bin | 0 -> 344 bytes | |||
-rw-r--r-- | images/smiley-frown.gif | bin | 0 -> 340 bytes | |||
-rw-r--r-- | images/smiley-innocent.gif | bin | 0 -> 336 bytes | |||
-rw-r--r-- | images/smiley-kiss.gif | bin | 0 -> 338 bytes | |||
-rw-r--r-- | images/smiley-laughing.gif | bin | 0 -> 344 bytes | |||
-rw-r--r-- | images/smiley-money-mouth.gif | bin | 0 -> 321 bytes | |||
-rw-r--r-- | images/smiley-sealed.gif | bin | 0 -> 325 bytes | |||
-rw-r--r-- | images/smiley-smile.gif | bin | 0 -> 345 bytes | |||
-rw-r--r-- | images/smiley-surprised.gif | bin | 0 -> 342 bytes | |||
-rw-r--r-- | images/smiley-tongue-out.gif | bin | 0 -> 328 bytes | |||
-rw-r--r-- | images/smiley-undecided.gif | bin | 0 -> 337 bytes | |||
-rw-r--r-- | images/smiley-wink.gif | bin | 0 -> 351 bytes | |||
-rw-r--r-- | images/smiley-yell.gif | bin | 0 -> 336 bytes | |||
-rw-r--r-- | include/dba.php | 1 | ||||
-rw-r--r-- | index.php | 115 | ||||
-rw-r--r-- | mod/dfrn_confirm.php | 178 | ||||
-rw-r--r-- | mod/display.php | 2 | ||||
-rw-r--r-- | mod/network.php | 2 | ||||
-rw-r--r-- | mod/profile.php | 2 |
23 files changed, 241 insertions, 80 deletions
@@ -1589,4 +1589,25 @@ if(! function_exists('linkify')) { function linkify($s) { $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%]*)/", ' <a href="$1" >$1</a>', $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( + '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":-)" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-wink.gif" alt=";-)" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":-(" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":(" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":-P" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-\"" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-x" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-X" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-laughing.gif" alt=":-D" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-|" />', + '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-O" />' + ), $s); }}
\ No newline at end of file diff --git a/images/smiley-cool.gif b/images/smiley-cool.gif Binary files differnew file mode 100644 index 000000000..ba90cc36f --- /dev/null +++ b/images/smiley-cool.gif diff --git a/images/smiley-cry.gif b/images/smiley-cry.gif Binary files differnew file mode 100644 index 000000000..74d897a4f --- /dev/null +++ b/images/smiley-cry.gif diff --git a/images/smiley-embarassed.gif b/images/smiley-embarassed.gif Binary files differnew file mode 100644 index 000000000..963a96b8a --- /dev/null +++ b/images/smiley-embarassed.gif diff --git a/images/smiley-foot-in-mouth.gif b/images/smiley-foot-in-mouth.gif Binary files differnew file mode 100644 index 000000000..16f68cc1e --- /dev/null +++ b/images/smiley-foot-in-mouth.gif diff --git a/images/smiley-frown.gif b/images/smiley-frown.gif Binary files differnew file mode 100644 index 000000000..716f55e16 --- /dev/null +++ b/images/smiley-frown.gif diff --git a/images/smiley-innocent.gif b/images/smiley-innocent.gif Binary files differnew file mode 100644 index 000000000..334d49e0e --- /dev/null +++ b/images/smiley-innocent.gif diff --git a/images/smiley-kiss.gif b/images/smiley-kiss.gif Binary files differnew file mode 100644 index 000000000..4efd549ed --- /dev/null +++ b/images/smiley-kiss.gif diff --git a/images/smiley-laughing.gif b/images/smiley-laughing.gif Binary files differnew file mode 100644 index 000000000..1606c119e --- /dev/null +++ b/images/smiley-laughing.gif diff --git a/images/smiley-money-mouth.gif b/images/smiley-money-mouth.gif Binary files differnew file mode 100644 index 000000000..ca2451e10 --- /dev/null +++ b/images/smiley-money-mouth.gif diff --git a/images/smiley-sealed.gif b/images/smiley-sealed.gif Binary files differnew file mode 100644 index 000000000..b33d3cca1 --- /dev/null +++ b/images/smiley-sealed.gif diff --git a/images/smiley-smile.gif b/images/smiley-smile.gif Binary files differnew file mode 100644 index 000000000..e6a9e60d5 --- /dev/null +++ b/images/smiley-smile.gif diff --git a/images/smiley-surprised.gif b/images/smiley-surprised.gif Binary files differnew file mode 100644 index 000000000..cb99cdd91 --- /dev/null +++ b/images/smiley-surprised.gif diff --git a/images/smiley-tongue-out.gif b/images/smiley-tongue-out.gif Binary files differnew file mode 100644 index 000000000..2075dc160 --- /dev/null +++ b/images/smiley-tongue-out.gif diff --git a/images/smiley-undecided.gif b/images/smiley-undecided.gif Binary files differnew file mode 100644 index 000000000..bef7e2573 --- /dev/null +++ b/images/smiley-undecided.gif diff --git a/images/smiley-wink.gif b/images/smiley-wink.gif Binary files differnew file mode 100644 index 000000000..9faf1aff8 --- /dev/null +++ b/images/smiley-wink.gif diff --git a/images/smiley-yell.gif b/images/smiley-yell.gif Binary files differnew file mode 100644 index 000000000..648e6e879 --- /dev/null +++ b/images/smiley-yell.gif 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; @@ -1,28 +1,66 @@ <?php -require_once("boot.php"); +/** + * + * Friendika + * + */ -$a = new App; +/** + * + * bootstrap the application + * + */ + +require_once('boot.php'); -$debug_text = ''; // Debugging functions should never be used on production systems. +$a = new App; -// Setup the language and database. +/** + * + * Load the configuration file which contains our DB credentials. + * Ignore errors. If the file doesn't exist, we are running in installation mode. + * + */ $install = ((file_exists('.htconfig.php')) ? false : true); @include(".htconfig.php"); -// get language setting directly from system variables, bypassing get_config() -// as database may not yet be configured. +/** + * + * Get the language setting directly from system variables, bypassing get_config() + * as database may not yet be configured. + * + */ $lang = ((isset($a->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'] = "<div id=\"sysmsg\" class=\"error-message\">{$_SESSION['sysmsg']}</div>\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'] .= '<div id="pause"></div>'; -// 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 @@ <?php -// There are two possible entry points. - +/* + * Module: dfrn_confirm + * Purpose: Friendship acceptance for DFRN contacts + * + * There are two possible entry points and three scenarios. + * + * 1. A form was submitted by our user approving a friendship that originated elsewhere. + * This may also be called from dfrn_request to automatically approve a friendship. + * + * 2. We may be the target or other side of the conversation to scenario 1, and will + * interact with that process on our own user's behalf. + * + */ function dfrn_confirm_post(&$a,$handsfree = null) { if(is_array($handsfree)) { - // called directly from dfrn_request due to automatic friend acceptance - // any $_POST parameters we may require are supplied in the $handsfree array + /** + * We were called directly from dfrn_request due to automatic friend acceptance. + * Any $_POST parameters we may require are supplied in the $handsfree array. + * + */ $node = $handsfree['node']; $a->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, |