diff options
author | fabrixxm <fabrix.xm@gmail.com> | 2011-02-01 07:18:23 +0100 |
---|---|---|
committer | fabrixxm <fabrix.xm@gmail.com> | 2011-02-01 07:18:23 +0100 |
commit | 0bec0fc5fb5bfb02a80c6a84581d9daeb9f17813 (patch) | |
tree | 26afc64e0e9f7b1b240798bc457d4aa3c5fe5614 | |
parent | e7d87e4ab3086b7cc10e92bfee769179f80a4d0d (diff) | |
parent | 7dbdf8e6faf082e962772b76511f0fd24b6227cc (diff) | |
download | volse-hubzilla-0bec0fc5fb5bfb02a80c6a84581d9daeb9f17813.tar.gz volse-hubzilla-0bec0fc5fb5bfb02a80c6a84581d9daeb9f17813.tar.bz2 volse-hubzilla-0bec0fc5fb5bfb02a80c6a84581d9daeb9f17813.zip |
Merge branch 'friendika-master'
35 files changed, 374 insertions, 89 deletions
diff --git a/INSTALL.txt b/INSTALL.txt index 70e4f24ef..12dca9c5b 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -29,7 +29,7 @@ php.ini file - Mysql 5.x - ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks -(Windows) +(Windows) [Note: other options are presented in Section 7 of this document] - Installation into a top-level domain or sub-domain (without a directory/path component in the URL) is preferred. Directory paths will @@ -89,3 +89,18 @@ You can generally find the location of PHP by executing "which php". If you have troubles with this section please contact your hosting provider for assistance. Friendika will not work correctly if you cannot perform this step. +Alternative: You may be able to use the 'poormancron' plugin to perform this +step if you are using a recent Friendika release. To do this, edit the file +".htconfig.php" and look for a line describing your plugins. On a fresh +installation, it will look like + +$a->config['system']['addon'] = 'js_upload'; + +This indicates the "js_upload" addon module is enabled. You may add additional +addons/plugins using this same line in the configuration file. Change it to +read + +$a->config['system']['addon'] = 'js_upload,poormancron'; + +and save your changes. + diff --git a/addon/oembed/oembed.php b/addon/oembed/oembed.php index 82183f3cc..4bbd75387 100644 --- a/addon/oembed/oembed.php +++ b/addon/oembed/oembed.php @@ -10,13 +10,11 @@ function oembed_install() { register_hook('jot_tool', 'addon/oembed/oembed.php', 'oembed_hook_jot_tool'); register_hook('page_header', 'addon/oembed/oembed.php', 'oembed_hook_page_header'); - register_hook('bbcode', 'addon/oembed/oembed.php', 'oembed_hook_bbcode'); } function oembed_uninstall() { unregister_hook('jot_tool', 'addon/oembed/oembed.php', 'oembed_hook_jot_tool'); unregister_hook('page_header', 'addon/oembed/oembed.php', 'oembed_hook_page_header'); - unregister_hook('bbcode', 'addon/oembed/oembed.php', 'oembed_hook_bbcode'); } function oembed_hook_page_header($a, &$b){ @@ -53,49 +51,7 @@ function oembed_hook_jot_tool($a, &$b) { '; } -function oembed_replacecb($matches){ - $embedurl=$matches[1]; - $ourl = "http://oohembed.com/oohembed/?url=".urlencode($embedurl); - $txt = fetch_url($ourl); - $j = json_decode($txt); - $ret="<!-- oembed $embedurl -->"; - switch ($j->type) { - case "video": { - if (isset($j->thumbnail_url)) { - $tw = (isset($j->thumbnail_width)) ? $j->thumbnail_width:200; - $th = (isset($j->thumbnail_height)) ? $j->thumbnail_height:180; - $ret = "<a href='#' onclick='this.innerHTML=unescape(\"".urlencode($j->html)."\").replace(/\+/g,\" \"); return false;' >"; - $ret.= "<img width='$tw' height='$th' src='".$j->thumbnail_url."'>"; - $ret.= "</a>"; - } else { - $ret=$j->html; - } - $ret.="<br>"; - }; break; - case "photo": { - $ret = "<img width='".$j->width."' height='".$j->height."' src='".$j->url."'>"; - $ret.="<br>"; - }; break; - case "link": { - //$ret = "<a href='".$embedurl."'>".$j->title."</a>"; - }; break; - case "rich": { - // not so safe.. - $ret = "<blockquote>".$j->html."</blockquote>"; - }; break; - } - - $embedlink = (isset($j->title))?$j->title:$embedurl; - $ret .= "<a href='$embedurl'>$embedlink</a>"; - if (isset($j->author_name)) $ret.=" by ".$j->author_name; - if (isset($j->provider_name)) $ret.=" on ".$j->provider_name; - $ret.="<!-- /oembed $embedurl -->"; - return $ret; -} -function oembed_hook_bbcode($a, &$text){ - $text = preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", oembed_replacecb ,$text); -} ?>
\ No newline at end of file @@ -2,7 +2,7 @@ set_time_limit(0); -define ( 'BUILD_ID', 1033 ); +define ( 'BUILD_ID', 1034 ); define ( 'FRIENDIKA_VERSION', '2.10.0902' ); define ( 'DFRN_PROTOCOL_VERSION', '2.0' ); @@ -10,6 +10,16 @@ define ( 'EOL', "<br />\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); define ( 'DOWN_ARROW', '⇩' ); + +/** + * SSL redirection policies + */ + +define ( 'SSL_POLICY_NONE', 0 ); +define ( 'SSL_POLICY_FULL', 1 ); +define ( 'SSL_POLICY_SELFSIGN', 2 ); + + /** * log levels */ @@ -270,10 +280,17 @@ class App { } function get_baseurl($ssl = false) { - if(strlen($this->baseurl)) - return $this->baseurl; - $this->baseurl = (($ssl) ? 'https' : $this->scheme) . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' ); + $scheme = $this->scheme; + + if(x($this->config,'ssl_policy')) { + if(($ssl) || ($this->config['ssl_policy'] == SSL_POLICY_FULL)) + $scheme = 'https'; + if(($this->config['ssl_policy'] == SSL_POLICY_SELFSIGN) && (local_user() || x($_POST,'auth-params'))) + $scheme = 'https'; + } + + $this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' ); return $this->baseurl; } diff --git a/database.sql b/database.sql index 54950f0fd..817fd0922 100644 --- a/database.sql +++ b/database.sql @@ -471,4 +471,8 @@ CREATE TABLE IF NOT EXISTS `event` ( `deny_gid` MEDIUMTEXT NOT NULL ) ENGINE = MYISAM DEFAULT CHARSET=utf8; - +CREATE TABLE IF NOT EXISTS 'cache' ( + `k` CHAR( 255 ) NOT NULL PRIMARY KEY , + `v` TEXT NOT NULL, + `updated` DATETIME NOT NULL +) ENGINE = MYISAM DEFAULT CHARSET=utf8; diff --git a/htconfig.php b/htconfig.php index 13c065e69..5f5c76cbd 100644 --- a/htconfig.php +++ b/htconfig.php @@ -72,4 +72,7 @@ $a->config['system']['rino_encrypt'] = true; $a->config['system']['addon'] = 'js_upload'; -
\ No newline at end of file +// Disable oembed embedding +// This disable the conversion of [embed]$url[/embed] tag in html +// $a->config['system']['no_oembed'] = true; + diff --git a/include/acl_selectors.php b/include/acl_selectors.php index d0952421e..269dc3e34 100644 --- a/include/acl_selectors.php +++ b/include/acl_selectors.php @@ -17,8 +17,9 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) { $selected = " selected=\"selected\" "; else $selected = ''; + $trimmed = substr($rr['name'],0,12); - $o .= "<option value=\"{$rr['id']}\" $selected >{$rr['name']}</option>\r\n"; + $o .= "<option value=\"{$rr['id']}\" $selected title=\"{$rr['name']}\" >$trimmed</option>\r\n"; } } @@ -30,7 +31,7 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) { -function contact_select($selname, $selclass, $preselected = false, $size = 4, $privmail = false, $celeb = false) { +function contact_select($selname, $selclass, $preselected = false, $size = 4, $privmail = false, $celeb = false, $privatenet = false) { $o = ''; @@ -43,6 +44,10 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p $sql_extra .= sprintf(" AND `rel` = %d ", intval(REL_BUD)); } + if($privmail || $privatenet) { + $sql_extra .= " AND `network` IN ( 'dfrn' ) "; + } + if($privmail) $o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"$size\" >\r\n"; else @@ -61,11 +66,10 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p $selected = " selected=\"selected\" "; else $selected = ''; - if(($privmail) && ($rr['network'] === 'stat')) - $disabled = ' disabled="true" ' ; - else - $disabled = ''; - $o .= "<option value=\"{$rr['id']}\" $selected $disabled title=\"{$rr['url']}\" >{$rr['name']}</option>\r\n"; + + $trimmed = substr($rr['name'],0,22); + + $o .= "<option value=\"{$rr['id']}\" $selected title=\"{$rr['name']}|{$rr['url']}\" >$trimmed</option>\r\n"; } } @@ -110,7 +114,7 @@ function populate_acl($user = null,$celeb = false) { $o .= '</div>'; $o .= '<div id="contact_allow_wrapper">'; $o .= '<label id="acl-allow-contact-label" for="contact_allow" >' . t('Contacts') . '</label>'; - $o .= contact_select('contact_allow','contact_allow',$allow_cid,4,false,$celeb); + $o .= contact_select('contact_allow','contact_allow',$allow_cid,4,false,$celeb,true); $o .= '</div>'; $o .= '</div>' . "\r\n"; $o .= '<div id="acl-allow-end"></div>' . "\r\n"; @@ -125,7 +129,7 @@ function populate_acl($user = null,$celeb = false) { $o .= '</div>'; $o .= '<div id="contact_deny_wrapper" >'; $o .= '<label id="acl-deny-contact-label" for="contact_deny" >' . t('Contacts') . '</label>'; - $o .= contact_select('contact_deny','contact_deny', $deny_cid,4,false, $celeb); + $o .= contact_select('contact_deny','contact_deny', $deny_cid,4,false, $celeb,true); $o .= '</div>'; $o .= '</div>' . "\r\n"; $o .= '<div id="acl-deny-end"></div>' . "\r\n"; diff --git a/include/bbcode.php b/include/bbcode.php index 8382cc804..eb0806dc5 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -1,5 +1,5 @@ <?php - +require_once("include/oembed.php"); // BBcode 2 HTML was written by WAY2WEB.net // extended to work with Mistpark/Friendika - Mike Macgirvin @@ -93,6 +93,9 @@ function bbcode($Text) { $Text = preg_replace("/\[youtube\]http:\/\/www.youtube.com\/watch\?v\=(.+?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); $Text = preg_replace("/\[youtube\](.+?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text); + // oembed tag + $Text = oembed_bbcode2html($Text); + call_hooks('bbcode',$Text); return $Text; diff --git a/include/items.php b/include/items.php index e238280fc..f204745bb 100644 --- a/include/items.php +++ b/include/items.php @@ -1,6 +1,7 @@ <?php require_once('bbcode.php'); +require_once('oembed.php'); function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) { @@ -395,6 +396,8 @@ function get_atom_elements($feed,$item) { $res['body'] = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s', '[youtube]$1[/youtube]', $res['body']); + $res['body'] = oembed_html2bbcode($res['body']); + $config = HTMLPurifier_Config::createDefault(); $config->set('Cache.DefinitionImpl', null); @@ -903,6 +906,10 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0) { $feed->enable_order_by_date(false); $feed->init(); + if($feed->error()) + logger('consume_feed: Error parsing XML: ' . $feed->error()); + + // Check at the feed level for updated contact name and/or photo $name_updated = ''; diff --git a/include/main.js b/include/main.js index fcd1d6fee..63b34bd21 100644 --- a/include/main.js +++ b/include/main.js @@ -44,12 +44,14 @@ $('#pause').html(''); } } - if(event.keyCode == '36' && event.shiftKey == true) { - if(homebase !== undefined) { - event.preventDefault(); - document.location = homebase; - } - } +// this is shift-home on FF, but $ on IE, disabling until I figure out why the diff. +// update: incompatible usage of onKeyDown vs onKeyPress +// if(event.keyCode == '36' && event.shiftKey == true) { +// if(homebase !== undefined) { +// event.preventDefault(); +// document.location = homebase; +// } +// } }); }); diff --git a/include/notifier.php b/include/notifier.php index dd5d55ed0..87095e814 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -255,7 +255,7 @@ function notifier_run($argv, $argc){ $recip_str = implode(', ', $recipients); - $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 ", + $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ", dbesc($recip_str) ); if(! count($r)){ @@ -363,13 +363,61 @@ function notifier_run($argv, $argc){ continue; $params = 'hub.mode=publish&hub.url=' . urlencode($a->get_baseurl() . '/dfrn_poll/' . $owner['nickname'] ); post_url($h,$params); - logger('pubsub: publish: ' . $h . ' returned ' . $a->get_curl_code()); + logger('pubsub: publish: ' . $h . ' ' . $params . ' returned ' . $a->get_curl_code()); if(count($hubs) > 1) sleep(7); // try and avoid multiple hubs responding at precisely the same time } } } + if($notify_hub) { + + /** + * + * If you have less than 150 dfrn friends and it's a public message, + * we'll just go ahead and push them out securely with dfrn/rino. + * If you've got more than that, you'll have to rely on PuSH delivery. + * + */ + + $max_allowed = ((get_config('system','maxpubdeliver') === false) ? 150 : intval(get_config('system','maxdeliver'))); + + + /** + * + * Only get the bare essentials and go back for the full record. + * If you've got a lot of friends and we grab all the details at once it could exhaust memory. + * + */ + + $r = q("SELECT `id`, `name` FROM `contact` + WHERE `network` = 'dfrn' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 + AND `rel` != %d ", + intval($owner['uid']), + intval(REL_FAN) + ); + + if((count($r)) && ($max_allowed < count($r))) { + foreach($r as $rr) { + + /* Don't deliver to folks who have already been delivered to */ + + if(! in_array($rr['id'], $conversants)) { + $n = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", + intval($rr['id']) + ); + if(count($n)) { + + logger('notifier: dfrnpubdelivery: ' . $n[0]['name']); + $deliver_status = dfrn_deliver($owner,$n[0],$atom); + } + } + else + logger('notifier: dfrnpubdelivery: ignoring ' . $rr['name']); + } + } + } + return; } diff --git a/include/oembed.php b/include/oembed.php new file mode 100644 index 000000000..a130357ab --- /dev/null +++ b/include/oembed.php @@ -0,0 +1,97 @@ +<?php +function oembed_replacecb($matches){ + $embedurl=$matches[1]; + + $r = q("SELECT v FROM `cache` WHERE k='%s'", + dbesc($embedurl)); + if(count($r)){ + $txt = $r[0]['v']; + } else { + $ourl = "http://oohembed.com/oohembed/?url=".urlencode($embedurl); + $txt = fetch_url($ourl); + //save in cache + q("INSERT INTO `cache` VALUES ('%s','%s','%s')", + dbesc($embedurl), + dbesc($txt), + dbesc(datetime_convert())); + } + $j = json_decode($txt); + $ret="<span class='oembed'>"; + switch ($j->type) { + case "video": { + if (isset($j->thumbnail_url)) { + $tw = (isset($j->thumbnail_width)) ? $j->thumbnail_width:200; + $th = (isset($j->thumbnail_height)) ? $j->thumbnail_height:180; + $ret = "<a href='".$embedurl."' onclick='this.innerHTML=unescape(\"".urlencode($j->html)."\").replace(/\+/g,\" \"); return false;' >"; + $ret.= "<img width='$tw' height='$th' src='".$j->thumbnail_url."'>"; + $ret.= "</a>"; + } else { + $ret=$j->html; + } + $ret.="<br>"; + }; break; + case "photo": { + $ret = "<img width='".$j->width."' height='".$j->height."' src='".$j->url."'>"; + $ret.="<br>"; + }; break; + case "link": { + //$ret = "<a href='".$embedurl."'>".$j->title."</a>"; + }; break; + case "rich": { + // not so safe.. + $ret = "<blockquote>".$j->html."</blockquote>"; + }; break; + } + + $embedlink = (isset($j->title))?$j->title:$embedurl; + $ret .= "<a href='$embedurl' rel='oembed'>$embedlink</a>"; + if (isset($j->author_name)) $ret.=" by ".$j->author_name; + if (isset($j->provider_name)) $ret.=" on ".$j->provider_name; + $ret.="</span>"; + return $ret; +} + +function oembed_bbcode2html($text){ + $stopoembed = get_config("system","no_oembed"); + if ($stopoembed == true){ + return preg_replace("/\[embed\](.+?)\[\/embed\]/is", "<!-- oembed $1 --><i>". t('Embedding disabled') ." : $1</i><!-- /oembed $1 -->" ,$text); + } + return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", oembed_replacecb ,$text); +} + + +function oe_build_xpath($attr, $value){ + // http://westhoffswelt.de/blog/0036_xpath_to_select_html_by_class.html + return "contains( normalize-space( @$attr ), ' $value ' ) or substring( normalize-space( @$attr ), 1, string-length( '$value' ) + 1 ) = '$value ' or substring( normalize-space( @$attr ), string-length( @$attr ) - string-length( '$value' ) ) = ' $value' or @$attr = '$value'"; +} + +function oe_get_inner_html( $node ) { + $innerHTML= ''; + $children = $node->childNodes; + foreach ($children as $child) { + $innerHTML .= $child->ownerDocument->saveXML( $child ); + } + return $innerHTML; +} + +/** + * Find <span class='oembed'>..<a href='url' rel='oembed'>..</a></span> + * and replace it with [embed]url[/embed] + */ +function oembed_html2bbcode($text) { + $dom = DOMDocument::loadHTML($text); + $xpath = new DOMXPath($dom); + $attr = "oembed"; + + $xattr = oe_build_xpath("class","oembed"); + $entries = $xpath->query("//span[$xattr]"); + + $xattr = oe_build_xpath("rel","oembed"); + foreach($entries as $e) { + $href = $xpath->evaluate("a[$xattr]/@href", $e)->item(0)->nodeValue; + if(!is_null($href)) $e->parentNode->replaceChild(new DOMText("[embed]".$href."[embed]"), $e); + } + return oe_get_inner_html( $dom->getElementsByTagName("body")->item(0) ); +} + +?>
\ No newline at end of file diff --git a/include/poller.php b/include/poller.php index 1003b2f08..2ba285b7b 100644 --- a/include/poller.php +++ b/include/poller.php @@ -30,6 +30,10 @@ function poller_run($argv, $argc){ $php_path = ((x($a->config,'php_path') && strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); //proc_close(proc_open("\"$php_path\" \"include/queue.php\" &", array(), $foo)); proc_run($php_path,"include/queue.php"); + + // clear old cache + q("DELETE FROM `cache` WHERE `updated`<'%s'", + dbesc(datetime_convert('UTC','UTC',"now - 30 days"))); $hub_update = false; @@ -58,6 +62,9 @@ function poller_run($argv, $argc){ foreach($contacts as $contact) { + if($manual_id) + $contact['last-update'] = '0000-00-00 00:00:00'; + if($contact['priority'] || $contact['subhub']) { $hub_update = true; @@ -76,7 +83,7 @@ function poller_run($argv, $argc){ $contact['priority'] = (($interval !== false) ? intval($interval) : 3); $hub_update = false; - if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) + if((datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) || $force) $hub_update = true; } @@ -140,7 +140,7 @@ if(strlen($a->module)) { } else { if((x($_SERVER,'QUERY_STRING')) && ($_SERVER['QUERY_STRING'] === 'q=internal_error.html') && isset($dreamhost_error_hack)) { - logger('index.php: dreamhost_error_hack invoked'); + logger('index.php: dreamhost_error_hack invoked. Original URI =' . $_SERVER['REQUEST_URI']); goaway($a->get_baseurl() . $_SERVER['REQUEST_URI']); } diff --git a/mod/contacts.php b/mod/contacts.php index 177ca9973..4c627c88f 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -121,6 +121,15 @@ function contacts_content(&$a) { return; // NOTREACHED } + if($cmd === 'update') { + + // pull feed and consume it, which should subscribe to the hub. + + $php_path = ((x($a->config,'php_path') && strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); + proc_run($php_path,"include/poller.php","$contact_id"); + goaway($a->get_baseurl() . '/contacts/' . $contact_id); + // NOTREACHED + } if($cmd === 'block') { $blocked = (($orig_record[0]['blocked']) ? 0 : 1); @@ -248,6 +257,7 @@ function contacts_content(&$a) { '$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')), + '$udnow' => t('Update now'), '$profile_select' => contact_profile_assign($r[0]['profile-id'],(($r[0]['network'] !== 'dfrn') ? true : false)), '$contact_id' => $r[0]['id'], '$block_text' => (($r[0]['blocked']) ? t('Unblock this contact') : t('Block this contact') ), diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index 1061cdb89..85e7fc0af 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -26,6 +26,7 @@ function dfrn_poll_init(&$a) { } if(($dfrn_id === '') && (! x($_POST,'dfrn_id')) && ($a->argc > 1)) { + 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); echo $o; diff --git a/mod/follow.php b/mod/follow.php index a90ae3f51..62ba2585c 100644 --- a/mod/follow.php +++ b/mod/follow.php @@ -10,7 +10,9 @@ function follow_post(&$a) { // NOTREACHED } - $url = notags(trim($_POST['url'])); + $url = $orig_url = notags(trim($_POST['url'])); + + $email_conversant = false; if($url) { $links = lrdd($url); @@ -29,6 +31,11 @@ function follow_post(&$a) { } } + 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 diff --git a/mod/item.php b/mod/item.php index 11e79a7ab..7125ae1f4 100644 --- a/mod/item.php +++ b/mod/item.php @@ -71,6 +71,7 @@ function item_post(&$a) { $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 ); @@ -421,12 +422,39 @@ function item_post(&$a) { logger('mod_item: notifier invoked: ' . "\"$php_path\" \"include/notifier.php\" \"$notify_type\" \"$post_id\" &"); - proc_run($php_path, "include/notifier.php", $notify_type, "$post_id"); + proc_run($php_path, "include/notifier.php", $notify_type, "$post_id"); $datarray['id'] = $post_id; call_hooks('post_local_end', $datarray); - + + if(strlen($emailcc) && $profile_uid == local_user()) { + $erecips = explode(',', $emailcc); + if(count($erecips)) { + foreach($erecips as $recip) { + $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 />'; + + $subject = '[Friendika]' . ' ' . $a->user['username'] . ' ' . t('posted an update.'); + $headers = 'From: ' . $a->user['username'] . ' <' . $a->user['email'] . '>' . "\n"; + $headers .= 'MIME-Version: 1.0' . "\n"; + $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n"; + $headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n"; + $link = '<a href="' . $a->get_baseurl() . '/profile/' . $a->user['nickname'] . '"><img src="' . $author['thumb'] . '" alt="' . $a->user['username'] . '" /></a><br /><br />'; + $html = prepare_body($datarray); + $message = '<html><body>' . $link . $html . $disclaimer . '</body></html>'; + @mail($addr, $subject, $message, $headers); + } + } + } + + goaway($a->get_baseurl() . "/" . $_POST['return'] ); return; // NOTREACHED diff --git a/mod/network.php b/mod/network.php index 50d7134c1..80edca1d0 100644 --- a/mod/network.php +++ b/mod/network.php @@ -87,6 +87,8 @@ function network_content(&$a, $update = 0) { '$baseurl' => $a->get_baseurl(), '$defloc' => $a->user['default-location'], '$visitor' => 'block', + '$emailcc' => t('CC: email addresses'), + '$emtitle' => t('Example: bob@example.com, mary@example.com'), '$lockstate' => $lockstate, '$acl' => populate_acl((($group) ? $group_acl : $a->user), $celeb), '$bang' => (($group) ? '!' : ''), diff --git a/mod/profile.php b/mod/profile.php index c84b493c5..91c1ba6d8 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -144,6 +144,8 @@ function profile_content(&$a, $update = 0) { '$return_path' => $a->cmd, '$visitor' => (($is_owner || $commvisitor) ? 'block' : 'none'), '$lockstate' => $lockstate, + '$emailcc' => t('CC: email addresses'), + '$emtitle' => t('Example: bob@example.com, mary@example.com'), '$bang' => '', '$acl' => (($is_owner) ? populate_acl($a->user, $celeb) : ''), '$profile_uid' => $a->profile['profile_uid'], diff --git a/update.php b/update.php index 0bd58d6d4..f7bf9da1e 100644 --- a/update.php +++ b/update.php @@ -320,3 +320,11 @@ function update_1031() { function update_1032() { q("ALTER TABLE `profile` ADD `pdesc` CHAR( 255 ) NOT NULL AFTER `name` "); } + +function update_1033() { + q("CREATE TABLE IF NOT EXISTS `cache` ( + `k` CHAR( 255 ) NOT NULL PRIMARY KEY , + `v` TEXT NOT NULL, + `updated` DATETIME NOT NULL + ) ENGINE = MYISAM DEFAULT CHARSET=utf8;"); +} diff --git a/view/de/contact_edit.tpl b/view/de/contact_edit.tpl index fcd3f2d66..0b32bdd66 100644 --- a/view/de/contact_edit.tpl +++ b/view/de/contact_edit.tpl @@ -3,6 +3,8 @@ <div id="contact-edit-banner-name">$name</div> +<form action="contacts/$contact_id" method="post" > +<input type="hidden" name="contact_id" value="$contact_id"> <div id="contact-edit-wrapper" > @@ -24,13 +26,12 @@ </div> <div id="contact-edit-nav-end"></div> -<form action="contacts/$contact_id" method="post" > -<input type="hidden" name="contact_id" value="$contact_id"> <div id="contact-edit-poll-wrapper"> <div id="contact-edit-last-update-text">$lastupdtext<span id="contact-edit-last-updated">$last_update</span</div> <div id="contact-edit-poll-text">$updpub</div> $poll_interval + <div id="contact-edit-update-now"><a href="contacts/$contact_id/update">$udnow</a></div> </div> </div> <div id="contact-edit-end" ></div> diff --git a/view/de/jot.tpl b/view/de/jot.tpl index f42f37156..d86d8f847 100644 --- a/view/de/jot.tpl +++ b/view/de/jot.tpl @@ -40,8 +40,12 @@ <div id="profile-rotator-wrapper" style="display: $visitor;" > <img id="profile-rotator" src="images/rotator.gif" alt="Bitte warten" title="Bitte warten" style="display: none;" /> </div> - <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Berechtigungseinstellungen" title="Berechtigungseinstellungen" onClick="openClose('profile-jot-acl-wrapper');" />$bang</div> + <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Berechtigungseinstellungen" title="Berechtigungseinstellungen" onClick="openClose('profile-jot-acl-wrapper'); openClose('profile-jot-email-wrapper');" />$bang</div> <div id="profile-jot-perms-end"></div> + <div id="profile-jot-email-wrapper" style="display: none;" > + <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle"> + <div id="profile-jot-email-end"></div> + </div> <div id="profile-jot-acl-wrapper" style="display: none;" >$acl</div> </div> diff --git a/view/en/contact_edit.tpl b/view/en/contact_edit.tpl index ea546b784..9aca60188 100644 --- a/view/en/contact_edit.tpl +++ b/view/en/contact_edit.tpl @@ -3,6 +3,8 @@ <div id="contact-edit-banner-name">$name</div> +<form action="contacts/$contact_id" method="post" > +<input type="hidden" name="contact_id" value="$contact_id"> <div id="contact-edit-wrapper" > @@ -24,13 +26,12 @@ </div> <div id="contact-edit-nav-end"></div> -<form action="contacts/$contact_id" method="post" > -<input type="hidden" name="contact_id" value="$contact_id"> <div id="contact-edit-poll-wrapper"> <div id="contact-edit-last-update-text">$lastupdtext<span id="contact-edit-last-updated">$last_update</span</div> <div id="contact-edit-poll-text">$updpub</div> $poll_interval + <div id="contact-edit-update-now"><a href="contacts/$contact_id/update">$udnow</a></div> </div> </div> <div id="contact-edit-end" ></div> diff --git a/view/en/jot-header.tpl b/view/en/jot-header.tpl index b687f65a6..93eb440a4 100644 --- a/view/en/jot-header.tpl +++ b/view/en/jot-header.tpl @@ -2,17 +2,20 @@ <script language="javascript" type="text/javascript" src="$baseurl/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script> <script language="javascript" type="text/javascript"> +var editor; + tinyMCE.init({ theme : "advanced", mode : "specific_textareas", editor_selector: /(profile-jot-text|prvmail-text)/, - plugins : "bbcode", + plugins : "bbcode,paste", theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect", theme_advanced_buttons2 : "", theme_advanced_buttons3 : "", theme_advanced_toolbar_location : "top", theme_advanced_toolbar_align : "center", theme_advanced_blockformats : "blockquote,code", + paste_text_sticky : true, entity_encoding : "raw", add_unload_trigger : false, remove_linebreaks : false, @@ -43,8 +46,13 @@ tinyMCE.init({ $('#character-counter').addClass('red'); } $('#character-counter').text(text); - }); - } + }); + + ed.onInit.add(function(ed) { + ed.pasteAsPlainText = true; + }); + + } }); </script> diff --git a/view/en/jot.tpl b/view/en/jot.tpl index de88fb84f..d2a1014e7 100644 --- a/view/en/jot.tpl +++ b/view/en/jot.tpl @@ -40,8 +40,12 @@ <div id="profile-rotator-wrapper" style="display: $visitor;" > <img id="profile-rotator" src="images/rotator.gif" alt="Please wait" title="Please wait" style="display: none;" /> </div> - <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Permission Settings" title="Permission Settings" onClick="openClose('profile-jot-acl-wrapper');" />$bang</div> + <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Permission Settings" title="Permission Settings" onClick="openClose('profile-jot-acl-wrapper'); openClose('profile-jot-email-wrapper');" />$bang</div> <div id="profile-jot-perms-end"></div> + <div id="profile-jot-email-wrapper" style="display: none;" > + <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle"> + <div id="profile-jot-email-end"></div> + </div> <div id="profile-jot-acl-wrapper" style="display: none;" >$acl</div> </div> diff --git a/view/fr/contact_edit.tpl b/view/fr/contact_edit.tpl index c7d2d5975..9f36ddcc4 100644 --- a/view/fr/contact_edit.tpl +++ b/view/fr/contact_edit.tpl @@ -3,6 +3,8 @@ <div id="contact-edit-banner-name">$name</div> +<form action="contacts/$contact_id" method="post" > +<input type="hidden" name="contact_id" value="$contact_id"> <div id="contact-edit-wrapper" > @@ -24,14 +26,13 @@ </div> <div id="contact-edit-nav-end"></div> -<form action="contacts/$contact_id" method="post" > -<input type="hidden" name="contact_id" value="$contact_id"> <div id="contact-edit-poll-wrapper"> <div id="contact-edit-last-update-text">$lastupdtext<span id="contact-edit-last-updated">$last_update</span</div> <div id="contact-edit-poll-text">$updpub</div> $poll_interval + <div id="contact-edit-update-now"><a href="contacts/$contact_id/update">$udnow</a></div> </div> </div> <div id="contact-edit-end" ></div> diff --git a/view/fr/jot.tpl b/view/fr/jot.tpl index 9a5c58153..7c49d771d 100644 --- a/view/fr/jot.tpl +++ b/view/fr/jot.tpl @@ -41,8 +41,13 @@ <div id="profile-rotator-wrapper" style="display: $visitor;" > <img id="profile-rotator" src="images/rotator.gif" alt="Please wait" title="Please wait" style="display: none;" /> </div> - <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Permission Settings" title="Permission Settings" onClick="openClose('profile-jot-acl-wrapper');" />$bang</div> + <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Permission Settings" title="Permission Settings" onClick="openClose('profile-jot-acl-wrapper'); openClose('profile-jot-email-wrapper');" />$bang</div> <div id="profile-jot-perms-end"></div> + <div id="profile-jot-email-wrapper" style="display: none;" > + <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle"> + <div id="profile-jot-email-end"></div> + </div> + <div id="profile-jot-acl-wrapper" style="display: none;" >$acl</div> </div> diff --git a/view/it/contact_edit.tpl b/view/it/contact_edit.tpl index d4217ba8c..ac0f13a54 100644 --- a/view/it/contact_edit.tpl +++ b/view/it/contact_edit.tpl @@ -3,6 +3,8 @@ <div id="contact-edit-banner-name">$name</div> +<form action="contacts/$contact_id" method="post" > +<input type="hidden" name="contact_id" value="$contact_id"> <div id="contact-edit-wrapper" > @@ -24,13 +26,12 @@ </div> <div id="contact-edit-nav-end"></div> -<form action="contacts/$contact_id" method="post" > -<input type="hidden" name="contact_id" value="$contact_id"> <div id="contact-edit-poll-wrapper"> <div id="contact-edit-last-update-text">$lastupdtext<span id="contact-edit-last-updated">$last_update</span</div> <div id="contact-edit-poll-text">$updpub</div> $poll_interval + <div id="contact-edit-update-now"><a href="contacts/$contact_id/update">$udnow</a></div> </div> </div> <div id="contact-edit-end" ></div> diff --git a/view/it/jot.tpl b/view/it/jot.tpl index b0c90ddf5..7153c341c 100644 --- a/view/it/jot.tpl +++ b/view/it/jot.tpl @@ -40,8 +40,13 @@ <div id="profile-rotator-wrapper" style="display: $visitor;" > <img id="profile-rotator" src="images/rotator.gif" alt="Attendi" title="Attendi" style="display: none;" /> </div> - <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Impostazione permessi" title="Impostazione permessi" onClick="openClose('profile-jot-acl-wrapper');" />$bang</div> + <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Impostazione permessi" title="Impostazione permessi" onClick="openClose('profile-jot-acl-wrapper'); openClose('profile-jot-email-wrapper');" />$bang</div> <div id="profile-jot-perms-end"></div> + <div id="profile-jot-email-wrapper" style="display: none;" > + <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle"> + <div id="profile-jot-email-end"></div> + </div> + <div id="profile-jot-acl-wrapper" style="display: none;" >$acl</div> </div> diff --git a/view/theme/default/style.css b/view/theme/default/style.css index 3ef63e265..ae45a4244 100644 --- a/view/theme/default/style.css +++ b/view/theme/default/style.css @@ -1333,6 +1333,9 @@ input#dfrn-url { #contact-edit-poll-text { margin-bottom: 10px; } +#contact-edit-update-now { + margin-top: 15px; +} #contact-edit-photo-wrapper { margin-bottom: 20px; diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index 59a5bf88a..d6a1744a6 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -1209,6 +1209,10 @@ input#dfrn-url { margin-bottom: 10px; } +#contact-edit-update-now { + margin-top: 15px; +} + #contact-edit-photo-wrapper { margin-bottom: 20px; } diff --git a/view/theme/purplezero/border.jpg b/view/theme/purplezero/border.jpg Binary files differnew file mode 100644 index 000000000..66c7a6fcc --- /dev/null +++ b/view/theme/purplezero/border.jpg diff --git a/view/theme/purplezero/head.jpg b/view/theme/purplezero/head.jpg Binary files differnew file mode 100644 index 000000000..1acd2ddb8 --- /dev/null +++ b/view/theme/purplezero/head.jpg diff --git a/view/theme/purplezero/shiny.png b/view/theme/purplezero/shiny.png Binary files differnew file mode 100644 index 000000000..d3f71ee1d --- /dev/null +++ b/view/theme/purplezero/shiny.png diff --git a/view/theme/purplezero/style.css b/view/theme/purplezero/style.css new file mode 100644 index 000000000..16c9dc650 --- /dev/null +++ b/view/theme/purplezero/style.css @@ -0,0 +1,27 @@ +@import url('../duepuntozero/style.css'); + +a, a:visited { color: #7433af; text-decoration: none; } +a:hover {text-decoration: underline; } + + +body { background-image: url(head.jpg); } +aside( background-image: url(border.jpg); } +section { background-image: url(border.jpg); } +#profile-tabs-wrapper { background-image: url(head.jpg); } +div.wall-item-content-wrapper.shiny { background-image: url('shiny.png'); } + + +.nav-commlink, .nav-login-link { + background-color: #aed3b2; + +} + +.fakelink, .fakelink:visited { + color: #7433af; +} + +.wall-item-name-link { + color: #7433af; +} + + |