]> git.mxchange.org Git - friendica.git/commitdiff
Merge remote-tracking branch 'upstream/develop' into reshare-delivery
authorMichael <heluecht@pirati.ca>
Sun, 8 Dec 2019 08:49:47 +0000 (08:49 +0000)
committerMichael <heluecht@pirati.ca>
Sun, 8 Dec 2019 08:49:47 +0000 (08:49 +0000)
12 files changed:
bin/run_xgettext.sh
doc/smarty3-templates.md
mod/item.php
src/Content/Text/BBCode.php
src/Core/ACL.php
src/Model/Contact.php
src/Model/Item.php
src/Module/TwoFactor/Verify.php
src/Protocol/ActivityPub/Transmitter.php
view/templates/acl_selector.tpl
view/templates/field_input.tpl
view/theme/frio/templates/field_input.tpl

index 5c40df8b5f922e66e78e518122e239a8100a9482..8318a8c93d38e7c74e5b1ab9248587023ceeaced 100755 (executable)
@@ -50,7 +50,7 @@ case "$MODE" in
                # skip addon folder
                FINDOPTS="( -wholename */addon -or -wholename */addons -or -wholename */addons-extra -or -wholename */smarty3 ) -prune -o"
                
-               F9KVERSION=$(sed -n "s/.*'FRIENDICA_VERSION'.*'\([0-9.]*\)'.*/\1/p" ./boot.php);
+               F9KVERSION=$(cat ./VERSION);
                echo "Friendica version $F9KVERSION"
        ;;
 esac
index f174f216423d3f68385e7cc694eca992437a6fa1..1fadcb22148374ce69b12027a88e18e90d29e1ff 100644 (file)
@@ -80,7 +80,7 @@ Field parameter:
 
 ### field_input.tpl
 
-A single line input field for textual input.
+A single line input field for any type of input.
 Field parameter:
 
 0. Name of the field,
@@ -89,7 +89,7 @@ Field parameter:
 3. Help text for the input box,
 4. if set to "required" modern browser will check that this input box is filled when submitting the form,
 5. if set to "autofocus" modern browser will put the cursur into this box once the page is loaded,
-6. if set to "email" or "url" modern browser will check that the filled in value corresponds to an email address or URL.
+6. if set, it will be used for the input type, default is `text` (possible types: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#%3Cinput%3E_types).
 
 ### field_intcheckbox.tpl
 
index 999e7a25c67e58e00bdcf8c2be3bdaf741d62cd2..93da70e40eb5d2cda0df112d52fb7c1bdaf0ca22 100644 (file)
@@ -652,6 +652,9 @@ function item_post(App $a) {
        if ($orig_post) {
                $datarray['edit'] = true;
        } else {
+               // If this was a share, add missing data here
+               $datarray = Item::addShareDataFromOriginal($datarray);
+
                $datarray['edit'] = false;
        }
 
@@ -730,9 +733,6 @@ function item_post(App $a) {
                }
        }
 
-       // If this was a share, add missing data here
-       $datarray = Item::addShareDataFromOriginal($datarray);
-
        $post_id = Item::insert($datarray);
 
        if (!$post_id) {
index 0291c729e855f6ed52d314c3d35ad6550aca2572..29b4f47eb73f246469071a00c3f498efa8594562 100644 (file)
@@ -953,12 +953,11 @@ class BBCode extends BaseObject
        public static function convertShare($text, callable $callback)
        {
                $return = preg_replace_callback(
-                       "/(.*?)\[share(.*?)\](.*?)\[\/share\]/ism",
+                       "/(.*?)\[share(.*?)\](.*)\[\/share\]/ism",
                        function ($match) use ($callback) {
                                $attribute_string = $match[2];
-
                                $attributes = [];
-                               foreach(['author', 'profile', 'avatar', 'link', 'posted'] as $field) {
+                               foreach (['author', 'profile', 'avatar', 'link', 'posted'] as $field) {
                                        preg_match("/$field=(['\"])(.+?)\\1/ism", $attribute_string, $matches);
                                        $attributes[$field] = html_entity_decode($matches[2] ?? '', ENT_QUOTES, 'UTF-8');
                                }
index e6dd1a8f32400879a3c03000914334d281c34de5..83fae423ac920aeb6aa6113fad96dcaf35e7e420 100644 (file)
@@ -258,10 +258,20 @@ class ACL extends BaseObject
         */
        public static function getContactListByUserId(int $user_id)
        {
-               $acl_contacts = Contact::selectToArray(
-                       ['id', 'name', 'addr', 'micro'],
-                       ['uid' => $user_id, 'pending' => false, 'rel' => [Contact::FOLLOWER, Contact::FRIEND]]
+               $fields = ['id', 'name', 'addr', 'micro'];
+               $params = ['order' => ['name']];
+               $acl_contacts = Contact::selectToArray($fields,
+                       ['uid' => $user_id, 'self' => false, 'blocked' => false, 'archive' => false, 'deleted' => false,
+                       'pending' => false, 'rel' => [Contact::FOLLOWER, Contact::FRIEND]], $params
                );
+
+               $acl_forums = Contact::selectToArray($fields,
+                       ['uid' => $user_id, 'self' => false, 'blocked' => false, 'archive' => false, 'deleted' => false,
+                       'pending' => false, 'contact-type' => Contact::TYPE_COMMUNITY], $params
+               );
+
+               $acl_contacts = array_merge($acl_forums, $acl_contacts);
+
                array_walk($acl_contacts, function (&$value) {
                        $value['type'] = 'contact';
                });
@@ -367,7 +377,7 @@ class ACL extends BaseObject
                                }
                        }
 
-                       if ($default_permissions['hidewall']) {
+                       if (!$default_permissions['hidewall']) {
                                if ($mail_enabled) {
                                        $jotnets_fields[] = [
                                                'type' => 'checkbox',
index 765c44064666c208e3d60478a74b903e29b423f5..a30cd39baf093c37fdb0853e0d7195b2aca035ac 100644 (file)
@@ -1458,15 +1458,26 @@ class Contact extends BaseObject
                if (DBA::isResult($contact)) {
                        $contact_id = $contact["id"];
 
-                       // Update the contact every 7 days
-                       if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
+                       // Update the contact every 7 days (Don't update mail or feed contacts)
+                       if (in_array($contact['network'], Protocol::FEDERATED)) {
                                $update_contact = ($contact['updated'] < DateTimeFormat::utc('now -7 days'));
 
                                // We force the update if the avatar is empty
                                if (empty($contact['avatar'])) {
                                        $update_contact = true;
                                }
-                       } else {
+                       } elseif (empty($default) && in_array($contact['network'], [Protocol::MAIL, Protocol::PHANTOM]) && ($uid == 0)) {
+                               // Update public mail accounts via their user's accounts
+                               $fields = ['network', 'addr', 'name', 'nick', 'avatar', 'photo', 'thumb', 'micro'];
+                               $mailcontact = DBA::selectFirst('contact', $fields, ["`addr` = ? AND `network` = ? AND `uid` != 0", $url, Protocol::MAIL]);
+                               if (!DBA::isResult($mailcontact)) {
+                                       $mailcontact = DBA::selectFirst('contact', $fields, ["`nurl` = ? AND `network` = ? AND `uid` != 0", $url, Protocol::MAIL]);
+                               }
+
+                               if (DBA::isResult($mailcontact)) {
+                                       DBA::update('contact', $mailcontact, ['id' => $contact_id]);
+                               }
+
                                $update_contact = false;
                        }
 
@@ -1743,7 +1754,7 @@ class Contact extends BaseObject
                        $sql = "`item`.`uid` = ?";
                }
 
-               $contact_field = ($contact["contact-type"] == self::TYPE_COMMUNITY ? 'owner-id' : 'author-id');
+               $contact_field = ((($contact["contact-type"] == self::TYPE_COMMUNITY) || ($contact['network'] == Protocol::MAIL)) ? 'owner-id' : 'author-id');
 
                if ($thread_mode) {
                        $condition = ["`$contact_field` = ? AND `gravity` = ? AND " . $sql,
index 0f008518b0410b3d70865d1d3ce404d5e56ba82e..1e3b16002a0e63740f7486a36357bed317208ab6 100644 (file)
@@ -3833,7 +3833,7 @@ class Item extends BaseObject
                        $body = $shared_item['body'];
                }
 
-               $item['body'] = preg_replace("/(.*?\[share.*?\]\s?).*?(\s?\[\/share\]\s?)/ism", '$1' . $body . '$2', $item['body']);
+               $item['body'] = preg_replace("/\[share ([^\[\]]*)\].*\[\/share\]/ism", '[share $1]' . $body . '[/share]', $item['body']);
                unset($shared_item['body']);
 
                return array_merge($item, $shared_item);
index f6f040f5a781f1c9271bb3bf2c17674e60713568..27001683e9e41de0bf460019e8f264b25d2b0dc1 100644 (file)
@@ -64,7 +64,7 @@ class Verify extends BaseModule
                        '$errors_label'     => L10n::tt('Error', 'Errors', count(self::$errors)),
                        '$errors'           => self::$errors,
                        '$recovery_message' => L10n::t('Don’t have your phone? <a href="%s">Enter a two-factor recovery code</a>', '2fa/recovery'),
-                       '$verify_code'      => ['verify_code', L10n::t('Please enter a code from your authentication app'), '', '', 'required', 'autofocus placeholder="000000"'],
+                       '$verify_code'      => ['verify_code', L10n::t('Please enter a code from your authentication app'), '', '', 'required', 'autofocus placeholder="000000"', 'number'],
                        '$verify_label'     => L10n::t('Verify code and complete login'),
                ]);
        }
index 0b7784848e5024954a690350c1badc1ee4508d24..b28ee4452e0c47112147a55b98b91bfd426ee536 100644 (file)
@@ -381,16 +381,16 @@ class Transmitter
 
                $terms = Term::tagArrayFromItemId($item['id'], [Term::MENTION, Term::IMPLICIT_MENTION]);
 
-               // Directly mention the original author upon a quoted reshare.
-               // Else just ensure that the original author receives the reshare.
-               $announce = self::getAnnounceArray($item);
-               if (!empty($announce['comment'])) {
-                       $data['to'][] = $announce['actor']['url'];
-               } elseif (!empty($announce)) {
-                       $data['cc'][] = $announce['actor']['url'];
-               }
-
                if (!$item['private']) {
+                       // Directly mention the original author upon a quoted reshare.
+                       // Else just ensure that the original author receives the reshare.
+                       $announce = self::getAnnounceArray($item);
+                       if (!empty($announce['comment'])) {
+                               $data['to'][] = $announce['actor']['url'];
+                       } elseif (!empty($announce)) {
+                               $data['cc'][] = $announce['actor']['url'];
+                       }
+
                        $data = array_merge($data, self::fetchPermissionBlockFromConversation($item));
 
                        $data['to'][] = ActivityPub::PUBLIC_COLLECTION;
index 4da7862bb12adac14e7feb62e2c4fce1b843e580..a5929900b3bece5e24227f0a282d10676f441694 100644 (file)
                // Custom visibility tags inputs
                let acl_groups = new Bloodhound({
                        local: {{$acl_groups|@json_encode nofilter}},
-                       identify: function(obj) { return obj.id; },
+                       identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
                        datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name']),
                        queryTokenizer: Bloodhound.tokenizers.whitespace,
                });
                let acl_contacts = new Bloodhound({
                        local: {{$acl_contacts|@json_encode nofilter}},
-                       identify: function(obj) { return obj.id; },
+                       identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
                        datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
                        queryTokenizer: Bloodhound.tokenizers.whitespace,
                });
                let acl = new Bloodhound({
                        local: {{$acl_list|@json_encode nofilter}},
-                       identify: function(obj) { return obj.id; },
+                       identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
                        datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
                        queryTokenizer: Bloodhound.tokenizers.whitespace,
                });
                                                return 'label label-info';
                                }
                        },
-                       itemValue: 'id',
+                       itemValue: function (item) { return item.type + '-' + item.id.toString(); },
                        itemText: 'name',
                        itemThumb: 'micro',
                        itemTitle: function(item) {
                                                        return 'label label-info';
                                        }
                                },
-                               itemValue: 'id',
+                               itemValue: function (item) { return item.type + '-' + item.id.toString(); },
                                itemText: 'name',
                                itemThumb: 'micro',
                                itemTitle: function(item) {
 
                // Import existing ACL into the tags input fields.
 
-               $group_allow_input.val().split(',').forEach(function (val) {
-                       $acl_allow_input.tagsinput('add', acl_groups.get(val)[0]);
+               $group_allow_input.val().split(',').forEach(function (group_id) {
+                       $acl_allow_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
                });
-               $contact_allow_input.val().split(',').forEach(function (val) {
-                       $acl_allow_input.tagsinput('add', acl_contacts.get(val)[0]);
+               $contact_allow_input.val().split(',').forEach(function (contact_id) {
+                       $acl_allow_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
                });
-               $group_deny_input.val().split(',').forEach(function (val) {
-                       $acl_deny_input.tagsinput('add', acl_groups.get(val)[0]);
+               $group_deny_input.val().split(',').forEach(function (group_id) {
+                       $acl_deny_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
                });
-               $contact_deny_input.val().split(',').forEach(function (val) {
-                       $acl_deny_input.tagsinput('add', acl_contacts.get(val)[0]);
+               $contact_deny_input.val().split(',').forEach(function (contact_id) {
+                       $acl_deny_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
                });
 
                // Anti-duplicate callback + acl fields value generation
index 399cf0c4316ea57384eb57cb11467ef7d1d1f575..956c6259c1a8d90762f406c83f21f4b6dc0342c9 100644 (file)
@@ -1,8 +1,8 @@
        
-       <div class='field input' id='wrapper_{{$field.0}}'>
-               <label for='id_{{$field.0}}'>{{$field.1}}</label>
-               <input{{if $field.6 eq 'email'}} type='email'{{elseif $field.6 eq 'url'}} type='url'{{else}} type="text"{{/if}} name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2 nofilter}}"{{if $field.4 eq 'required'}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5 nofilter}}{{/if}} aria-describedby='{{$field.0}}_tip'>
+       <div class="field input" id="wrapper_{{$field.0}}">
+               <label for="id_{{$field.0}}">{{$field.1}}</label>
+               <input{{if $field.6}} type="{{$field.6}}"{{else}} type="text"{{/if}} name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.2 nofilter}}"{{if $field.4 eq 'required'}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5 nofilter}}{{/if}} aria-describedby="{{$field.0}}_tip">
        {{if $field.3}}
-               <span class='field_help' role='tooltip' id='{{$field.0}}_tip'>{{$field.3 nofilter}}</span>
+               <span class="field_help" role="tooltip" id="{{$field.0}}_tip">{{$field.3 nofilter}}</span>
        {{/if}}
        </div>
index 838eaf6e56ca90d60ca161a8166a568ca53306a1..d5b75119b763be85d456c9d7cae125937aa54f47 100644 (file)
@@ -3,7 +3,7 @@
        {{if !isset($label) || $label != false }}
                <label for="id_{{$field.0}}" id="label_{{$field.0}}">{{$field.1 nofilter}}{{if $field.4}}<span class="required"> {{$field.4}}</span>{{/if}}</label>
        {{/if}}
-               <input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}"{{if $field.6 eq "email"}} type="email"{{elseif $field.6 eq "url"}} type="url"{{else}} type="text"{{/if}} value="{{$field.2 nofilter}}"{{if $field.4 eq "required"}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5 nofilter}}{{/if}} aria-describedby="{{$field.0}}_tip">
+               <input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}"{{if $field.6}} type="{{$field.6}}"{{else}} type="text"{{/if}} value="{{$field.2 nofilter}}"{{if $field.4 eq "required"}} required{{/if}}{{if $field.5 eq "autofocus"}} autofocus{{elseif $field.5}} {{$field.5 nofilter}}{{/if}} aria-describedby="{{$field.0}}_tip">
        {{if $field.3}}
                <span class="help-block" id="{{$field.0}}_tip" role="tooltip">{{$field.3 nofilter}}</span>
        {{/if}}