diff --git a/bin/run_xgettext.sh b/bin/run_xgettext.sh index 5c40df8b5f..8318a8c93d 100755 --- a/bin/run_xgettext.sh +++ b/bin/run_xgettext.sh @@ -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 diff --git a/doc/smarty3-templates.md b/doc/smarty3-templates.md index f174f21642..1fadcb2214 100644 --- a/doc/smarty3-templates.md +++ b/doc/smarty3-templates.md @@ -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 diff --git a/mod/item.php b/mod/item.php index 999e7a25c6..93da70e40e 100644 --- a/mod/item.php +++ b/mod/item.php @@ -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) { diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index 0291c729e8..29b4f47eb7 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -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'); } diff --git a/src/Core/ACL.php b/src/Core/ACL.php index e6dd1a8f32..83fae423ac 100644 --- a/src/Core/ACL.php +++ b/src/Core/ACL.php @@ -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', diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 765c440646..a30cd39baf 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -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, diff --git a/src/Model/Item.php b/src/Model/Item.php index 0f008518b0..1e3b16002a 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -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); diff --git a/src/Module/TwoFactor/Verify.php b/src/Module/TwoFactor/Verify.php index f6f040f5a7..27001683e9 100644 --- a/src/Module/TwoFactor/Verify.php +++ b/src/Module/TwoFactor/Verify.php @@ -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? Enter a two-factor recovery code', '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'), ]); } diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index 0b7784848e..b28ee4452e 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -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; diff --git a/view/templates/acl_selector.tpl b/view/templates/acl_selector.tpl index 4da7862bb1..a5929900b3 100644 --- a/view/templates/acl_selector.tpl +++ b/view/templates/acl_selector.tpl @@ -130,19 +130,19 @@ // 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, }); @@ -163,7 +163,7 @@ return 'label label-info'; } }, - itemValue: 'id', + itemValue: function (item) { return item.type + '-' + item.id.toString(); }, itemText: 'name', itemThumb: 'micro', itemTitle: function(item) { @@ -191,7 +191,7 @@ return 'label label-info'; } }, - itemValue: 'id', + itemValue: function (item) { return item.type + '-' + item.id.toString(); }, itemText: 'name', itemThumb: 'micro', itemTitle: function(item) { @@ -209,17 +209,17 @@ // 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 diff --git a/view/templates/field_input.tpl b/view/templates/field_input.tpl index 399cf0c431..956c6259c1 100644 --- a/view/templates/field_input.tpl +++ b/view/templates/field_input.tpl @@ -1,8 +1,8 @@ -
- - +
+ + {{if $field.3}} - {{$field.3 nofilter}} + {{$field.3 nofilter}} {{/if}}
diff --git a/view/theme/frio/templates/field_input.tpl b/view/theme/frio/templates/field_input.tpl index 838eaf6e56..d5b75119b7 100644 --- a/view/theme/frio/templates/field_input.tpl +++ b/view/theme/frio/templates/field_input.tpl @@ -3,7 +3,7 @@ {{if !isset($label) || $label != false }} {{/if}} - + {{if $field.3}} {{$field.3 nofilter}} {{/if}}