aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xboot.php2
-rw-r--r--doc/roadmap.bb4
-rw-r--r--doc/to_do_code.bb1
-rwxr-xr-xinclude/items.php65
-rw-r--r--include/zot.php46
-rw-r--r--install/schema_mysql.sql2
-rw-r--r--install/schema_postgres.sql2
-rw-r--r--install/update.php12
-rw-r--r--mod/connedit.php13
-rw-r--r--mod/tagger.php4
-rw-r--r--version.inc2
-rw-r--r--view/css/mod_directory.css2
-rw-r--r--view/theme/redbasic/css/style.css7
-rwxr-xr-xview/tpl/abook_edit.tpl8
-rwxr-xr-xview/tpl/direntry.tpl2
15 files changed, 144 insertions, 28 deletions
diff --git a/boot.php b/boot.php
index d3ca6ffcc..37cf5ba4c 100755
--- a/boot.php
+++ b/boot.php
@@ -49,7 +49,7 @@ define ( 'PLATFORM_NAME', 'hubzilla' );
define ( 'RED_VERSION', trim(file_get_contents('version.inc')) . 'R');
define ( 'ZOT_REVISION', 1 );
-define ( 'DB_UPDATE_VERSION', 1143 );
+define ( 'DB_UPDATE_VERSION', 1144 );
/**
* @brief Constant with a HTML line break.
diff --git a/doc/roadmap.bb b/doc/roadmap.bb
index 641fef4ca..4564f5fea 100644
--- a/doc/roadmap.bb
+++ b/doc/roadmap.bb
@@ -4,7 +4,9 @@ Roadmap for $Projectname V3
Crypto
Convert E2EE to dynamic loading (on demand) using jQuery.getScript() [or other methods] to only load encryption libs when you require them. This should also support multiple encryption libraries (e.g. SJCL, others) triggered from the choice of algorithm and remain pluggable.
-
+
+Diaspora
+ Convert core Diaspora federation code into a plugin. This presents a number of challenges since it touches and special cases a lot of core functionality.
Subscriptions and business models
Build enough into core(/addons) to generate income (or at least try and cover costs) out of the box
diff --git a/doc/to_do_code.bb b/doc/to_do_code.bb
index b3b75473f..bfa249dd5 100644
--- a/doc/to_do_code.bb
+++ b/doc/to_do_code.bb
@@ -4,6 +4,7 @@ We need much more than this, but here are areas where developers can help. Pleas
[li]Documentation - see Red Documentation Project To-Do List[/li]
[li]Include TOS link in registration/verification email[/li]
+[li]forum widget with unread counts (requires the DB schema changes from v3/hubzilla to be viable)[/li]
[li]Create bug tracker module[/li]
[li]translation plugins - moses or apertium[/li]
[li]Infinite scroll improvements (i.e. embedded page links) see http://scrollsample.appspot.com/items
diff --git a/include/items.php b/include/items.php
index cf7e28daa..5f479660e 100755
--- a/include/items.php
+++ b/include/items.php
@@ -3295,8 +3295,7 @@ function check_item_source($uid, $item) {
$text = prepare_text($item['body'],$item['mimetype']);
$text = html2plain($text);
- /** @BUG $items is undefined, should this be $item? */
- $tags = ((count($items['term'])) ? $items['term'] : false);
+ $tags = ((count($item['term'])) ? $item['term'] : false);
$words = explode("\n",$r[0]['src_patt']);
if($words) {
@@ -3306,11 +3305,71 @@ function check_item_source($uid, $item) {
if(($t['type'] == TERM_HASHTAG) && ((substr($t,1) === substr($word,1)) || (substr($word,1) === '*')))
return true;
}
- if(stristr($text,$word) !== false)
+ elseif((strpos($word,'/') === 0) && preg_match($word,$body))
return true;
+ elseif(stristr($text,$word) !== false)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function post_is_importable($item,$abook) {
+
+ if(! $abook)
+ return true;
+ if(! $item)
+ return false;
+
+ if((! $abook['abook_incl']) && (! $abook['abook_excl']))
+ return true;
+
+ require_once('include/html2plain.php');
+ $text = prepare_text($item['body'],$item['mimetype']);
+ $text = html2plain($text);
+
+ $tags = ((count($item['term'])) ? $item['term'] : false);
+
+ // exclude always has priority
+
+ $exclude = (($abook['abook_excl']) ? explode("\n",$abook['abook_excl']) : null);
+
+ if($exclude) {
+ foreach($exclude as $word) {
+ $word = trim($word);
+ if(substr($word,0,1) === '#' && $tags) {
+ foreach($tags as $t)
+ if(($t['type'] == TERM_HASHTAG) && ((substr($t,1) === substr($word,1)) || (substr($word,1) === '*')))
+ return false;
+ }
+ elseif((strpos($word,'/') === 0) && preg_match($word,$body))
+ return false;
+ elseif(stristr($text,$word) !== false)
+ return false;
}
}
+ $include = (($abook['abook_incl']) ? explode("\n",$abook['abook_incl']) : null);
+
+ if($include) {
+ foreach($include as $word) {
+ $word = trim($word);
+ if(substr($word,0,1) === '#' && $tags) {
+ foreach($tags as $t)
+ if(($t['type'] == TERM_HASHTAG) && ((substr($t,1) === substr($word,1)) || (substr($word,1) === '*')))
+ return true;
+ }
+ elseif((strpos($word,'/') === 0) && preg_match($word,$body))
+ return true;
+ elseif(stristr($text,$word) !== false)
+ return true;
+ }
+ }
+ else {
+ return true;
+ }
+
return false;
}
diff --git a/include/zot.php b/include/zot.php
index 568049237..dfaff268e 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -1625,6 +1625,13 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
}
}
+
+ $ab = q("select abook.* from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d
+ and abook_self = 0",
+ intval($channel['channel_id'])
+ );
+ $abook = (($ab) ? $ab[0] : null);
+
if(intval($arr['item_deleted'])) {
// remove_community_tag is a no-op if this isn't a community tag activity
@@ -1665,10 +1672,15 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
elseif($arr['edited'] > $r[0]['edited']) {
$arr['id'] = $r[0]['id'];
$arr['uid'] = $channel['channel_id'];
- update_imported_item($sender,$arr,$channel['channel_id']);
- $result[] = array($d['hash'],'updated',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
- if(! $relay)
- add_source_route($item_id,$sender['hash']);
+ if(($arr['mid'] == $arr['parent_mid']) && (! post_is_importable($arr,$abook))) {
+ $result[] = array($d['hash'],'update ignored',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
+ }
+ else {
+ update_imported_item($sender,$arr,$channel['channel_id']);
+ $result[] = array($d['hash'],'updated',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
+ if(! $relay)
+ add_source_route($item_id,$sender['hash']);
+ }
}
else {
$result[] = array($d['hash'],'update ignored',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
@@ -1688,18 +1700,24 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
if(check_item_source($arr['uid'], $arr))
call_hooks('post_local', $arr);
-
- $item_result = item_store($arr);
+
$item_id = 0;
- if($item_result['success']) {
- $item_id = $item_result['item_id'];
- $parr = array('item_id' => $item_id,'item' => $arr,'sender' => $sender,'channel' => $channel);
- call_hooks('activity_received',$parr);
- // don't add a source route if it's a relay or later recipients will get a route mismatch
- if(! $relay)
- add_source_route($item_id,$sender['hash']);
+
+ if(($arr['mid'] == $arr['parent_mid']) && (! post_is_importable($arr,$abook))) {
+ $result[] = array($d['hash'],'post ignored',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
+ }
+ else {
+ $item_result = item_store($arr);
+ if($item_result['success']) {
+ $item_id = $item_result['item_id'];
+ $parr = array('item_id' => $item_id,'item' => $arr,'sender' => $sender,'channel' => $channel);
+ call_hooks('activity_received',$parr);
+ // don't add a source route if it's a relay or later recipients will get a route mismatch
+ if(! $relay)
+ add_source_route($item_id,$sender['hash']);
+ }
+ $result[] = array($d['hash'],(($item_id) ? 'posted' : 'storage failed:' . $item_result['message']),$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
}
- $result[] = array($d['hash'],(($item_id) ? 'posted' : 'storage failed:' . $item_result['message']),$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
}
if($relay && $item_id) {
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index c68261caf..e30eded29 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -21,6 +21,8 @@ CREATE TABLE IF NOT EXISTS `abook` (
`abook_self` tinyint(4) NOT NULL DEFAULT '0',
`abook_feed` tinyint(4) NOT NULL DEFAULT '0',
`abook_profile` char(64) NOT NULL DEFAULT '',
+ `abook_incl` TEXT NOT NULL DEFAULT '',
+ `abook_excl` TEXT NOT NULL DEFAULT '',
PRIMARY KEY (`abook_id`),
KEY `abook_account` (`abook_account`),
KEY `abook_channel` (`abook_channel`),
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index 7c8d74ae5..b7a699125 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -14,6 +14,8 @@ CREATE TABLE "abook" (
"abook_dob" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"abook_flags" bigint NOT NULL DEFAULT '0',
"abook_profile" char(64) NOT NULL DEFAULT '',
+ "abook_incl" TEXT NOT NULL DEFAULT '',
+ "abook_excl" TEXT NOT NULL DEFAULT '',
PRIMARY KEY ("abook_id")
);
create index "abook_account" on abook ("abook_account");
diff --git a/install/update.php b/install/update.php
index 62c976218..fb49e9a16 100644
--- a/install/update.php
+++ b/install/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1143 );
+define( 'UPDATE_VERSION' , 1144 );
/**
*
@@ -1656,4 +1656,14 @@ function update_r1142() {
return UPDATE_FAILED;
+}
+
+function update_r1143() {
+
+ $r1 = q("ALTER TABLE abook ADD abook_incl TEXT NOT NULL DEFAULT ''");
+ $r2 = q("ALTER TABLE abook ADD abook_excl TEXT NOT NULL DEFAULT '' ");
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
} \ No newline at end of file
diff --git a/mod/connedit.php b/mod/connedit.php
index 88304d2ed..dac393b5c 100644
--- a/mod/connedit.php
+++ b/mod/connedit.php
@@ -101,6 +101,9 @@ function connedit_post(&$a) {
}
}
+ $abook_incl = escape_tags($_POST['abook_incl']);
+ $abook_excl = escape_tags($_POST['abook_excl']);
+
$hidden = intval($_POST['hidden']);
$priority = intval($_POST['poll']);
@@ -189,12 +192,16 @@ function connedit_post(&$a) {
}
}
- $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_pending = %d
+
+ $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_pending = %d,
+ abook_incl = '%s', abook_excl = '%s'
where abook_id = %d AND abook_channel = %d",
dbesc($profile_id),
intval($abook_my_perms),
intval($closeness),
intval(1 - intval($new_friend)),
+ dbesc($abook_incl),
+ dbesc($abook_excl),
intval($contact_id),
intval(local_channel())
);
@@ -661,7 +668,9 @@ function connedit_content(&$a) {
'$lbl_slider' => t('Slide to adjust your degree of friendship'),
'$lbl_rating' => t('Rating (this information is public)'),
'$lbl_rating_txt' => t('Optionally explain your rating (this information is public)'),
- '$rating_txt' => $rating_text,
+ '$incl' => array('abook_incl',t('Only import posts with this text'), $contact['abook_incl'],t('words one per line or #tags or /patterns/, leave blank to import all posts')),
+ '$excl' => array('abook_excl',t('Do not import posts with this text'), $contact['abook_excl'],t('words one per line or #tags or /patterns/, leave blank to import all posts')),
+ '$rating_text' => array('rating_text', t('Optionally explain your rating (this information is public)'),$rating_text,''),
'$rating' => $rating,
'$rating_val' => $rating_val,
'$slide' => $slide,
diff --git a/mod/tagger.php b/mod/tagger.php
index c6365d707..9f9855ed8 100644
--- a/mod/tagger.php
+++ b/mod/tagger.php
@@ -48,7 +48,7 @@ function tagger_content(&$a) {
break;
default:
$targettype = ACTIVITY_OBJ_NOTE;
- $post_type = t('status');
+ $post_type = t('post');
if($item['mid'] != $item['parent_mid'])
$post_type = t('comment');
break;
@@ -131,4 +131,4 @@ function tagger_content(&$a) {
killme();
-} \ No newline at end of file
+}
diff --git a/version.inc b/version.inc
index df3ed0059..b06ac504d 100644
--- a/version.inc
+++ b/version.inc
@@ -1 +1 @@
-2015-06-23.1072
+2015-06-28.1077
diff --git a/view/css/mod_directory.css b/view/css/mod_directory.css
index d3831e589..8e55ac3be 100644
--- a/view/css/mod_directory.css
+++ b/view/css/mod_directory.css
@@ -10,11 +10,13 @@
.contact-photo-wrapper {
display: table-cell;
+ table-layout: fixed;
vertical-align: top;
}
.contact-info {
display: table-cell;
+ table-layout: fixed;
vertical-align: top;
padding-left: 10px;
}
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index ad203867c..540f691c6 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -1326,6 +1326,7 @@ header {
.contactname {
padding-top: 2px;
font-weight: bold;
+ white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: block;
@@ -1408,7 +1409,6 @@ header {
.acl-list-item p {
font-size: $font_size;
margin: 0px;
- overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
@@ -1870,6 +1870,9 @@ nav .dropdown-menu {
.section-subtitle-wrapper h3 {
margin-top: 0px;
margin-bottom: 0px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
.section-subtitle-wrapper {
@@ -2000,6 +2003,7 @@ nav .badge.mail-update:hover {
.dropdown-menu {
font-size: $body_font_size;
border-radius: $radiuspx;
+ max-width: 100%;
}
.dropdown-menu img {
@@ -2277,3 +2281,4 @@ nav .badge.mail-update:hover {
.channels_ckbx, .pending_ckbx, .users_ckbx {
margin-top: -5px !important;
}
+
diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl
index fb02ff8ed..10692856e 100755
--- a/view/tpl/abook_edit.tpl
+++ b/view/tpl/abook_edit.tpl
@@ -50,6 +50,9 @@
{{/if}}
+ {{include file="field_textarea.tpl" field=$incl}}
+ {{include file="field_textarea.tpl" field=$excl}}
+
{{if $rating}}
<h3>{{$lbl_rating}}</h3>
@@ -58,6 +61,8 @@
{{/if}}
+
+
{{/if}}
@@ -75,8 +80,7 @@
{{if $rating}}
{{if $notself}}
-<h3 class="abook-rating-text-desc">{{$lbl_rating_txt}}</h3>
-<textarea name="rating_text" id="rating-text" >{{$rating_txt}}</textarea>
+ {{include file="field_textarea.tpl" field=$rating_text}}
{{/if}}
{{/if}}
diff --git a/view/tpl/direntry.tpl b/view/tpl/direntry.tpl
index 3450ad36d..98ec25e23 100755
--- a/view/tpl/direntry.tpl
+++ b/view/tpl/direntry.tpl
@@ -8,7 +8,9 @@
{{if $entry.ignlink}}
<a class="directory-ignore btn btn-warning btn-xs" href="{{$entry.ignlink}}"> {{$entry.ignore_label}}</a>
{{/if}}
+ {{if $entry.connect}}
<a class="btn btn-success btn-xs" href="{{$entry.connect}}"><i class="icon-plus connect-icon"></i> {{$entry.conn_label}}</a>
+ {{/if}}
</div>
<h3>{{if $entry.public_forum}}<i class="icon-comments-alt" title="{{$entry.forum_label}} @{{$entry.nickname}}+"></i>&nbsp;{{/if}}<a href='{{$entry.profile_link}}' >{{$entry.name}}</a>{{if $entry.online}}&nbsp;<i class="icon-asterisk online-now" title="{{$entry.online}}"></i>{{/if}}</h3>
</div>