Compare commits

...

1540 Commits
4.0.3 ... 5.0

Author SHA1 Message Date
Mario
bafbf04164 Merge branch '5.0RC' 2020-11-05 08:46:42 +00:00
Mario
fdefa101d8 version 5.0 2020-11-05 08:42:49 +00:00
Mario
7e40eeb52a Merge branch 'dev' into 5.0RC 2020-11-05 08:41:01 +00:00
Mario
e98804693d update changelog 2020-11-05 08:37:34 +00:00
Mario
953c294778 wrong variable name 2020-11-05 08:32:21 +00:00
Mario
20d2811cd5 Merge branch 'dev' into 5.0RC 2020-11-04 15:16:52 +00:00
Mario
207df132e6 make sure we attach the public key 2020-11-04 13:36:52 +00:00
Mario
40e0fe1d25 css issue 2020-11-04 11:06:30 +00:00
Mario
fe3f42ce10 call sse_setNotificationsStatus() after fading out buttons 2020-11-03 07:29:37 +00:00
Mario
b4ca5c133c Merge branch 'dev' into 5.0RC 2020-11-01 12:38:18 +00:00
Mario
8f1a579597 update changelog 2020-11-01 12:37:49 +00:00
Mario
aa69b43e0e fix vsprintf() warning 2020-11-01 12:33:45 +00:00
Mario
cadd6fdfff fix vsprintf() error 2020-11-01 12:24:55 +00:00
Mario
85b97014c9 version 5.0RC8 2020-10-31 20:33:48 +00:00
Mario
50ca95735d fix merge conflict 2020-10-31 20:32:39 +00:00
Mario
b55c7f794b Merge branch 'dev' into 5.0RC 2020-10-31 20:30:36 +00:00
Mario
205279f7f8 more changelog 2020-10-31 20:28:16 +00:00
Mario
934721a98d remove unmaintained and deprecated schemas 2020-10-31 20:27:23 +00:00
Mario
d02a8d733e update changelog 2020-10-31 20:24:21 +00:00
Mario
d59b81f11d if restarting a previously interrupted upload just return where we ended - fix issue #1485 2020-10-31 19:57:14 +00:00
Mario
b11d2c376b Merge branch 'dev' into 'dev'
Don't try to fetch profile photo for unknown channel

See merge request hubzilla/core!1880
2020-10-31 13:53:13 +01:00
Mario
6d83b5b68d Merge branch 'cherry-pick-16d450fc' into 'dev'
HTML parsing lib change to standard PHP in scrape_feed() and scrape_vcard()

See merge request hubzilla/core!1882
2020-10-31 09:19:30 +01:00
root
0ad7c8f69e HTML parsing lib change to standard PHP in scrape_feed() and scrape_vcard()
(cherry picked from commit 16d450fc6980bb70f13e574d1b20406dd313110e)
2020-10-31 09:15:37 +01:00
Mario Vavti
e24c769f8e fix issue #1484 2020-10-27 20:27:49 +01:00
Max Kostikov
7cf9b85a97 Don't try to fetch profile photo for unknown channel 2020-10-25 11:43:35 +01:00
Mario
dd3d65cb1c Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-10-25 10:32:07 +00:00
Mario
5e19632f2d update changelog 2020-10-25 10:32:02 +00:00
Mario
cc543d1ad2 remove redundant includesà 2020-10-25 10:30:12 +00:00
Mario
35299ed7c3 Merge branch 'dev' into 'dev'
Add results caching on public tag and profile categories fetching

See merge request hubzilla/core!1875
2020-10-25 11:28:41 +01:00
Max Kostikov
7008cf3269 Add results caching on public tag and profile categories fetching 2020-10-25 11:28:40 +01:00
Mario
6979ea44f4 more directory fixes 2020-10-25 08:26:25 +00:00
Mario
81775eebe2 directory fixes 2020-10-25 07:59:49 +00:00
Mario
e70802c6ad strings update 2020-10-25 07:47:07 +00:00
Mario
7112bcd134 bt_syslog() instead of syslog flag for btlogger 2020-10-25 07:27:07 +00:00
Mario
d3d5ddfb43 enable btlogging to syslog
(cherry picked from commit 5580fc1954)
2020-10-24 23:29:11 +02:00
Mario
5580fc1954 enable btlogging to syslog 2020-10-24 21:26:46 +00:00
Mario
d0e85f05af Merge branch 'dev' into 5.0RC 2020-10-23 12:18:53 +00:00
Mario
c136741db6 more remove logging 2020-10-23 12:18:04 +00:00
Mario
5724be1f8e Merge branch 'dev' into 5.0RC 2020-10-23 11:47:23 +00:00
Mario
29e89d1152 Ãremove loggingà 2020-10-23 11:46:43 +00:00
Mario
95dfde99c6 Merge branch 'dev' into 5.0RC 2020-10-23 09:29:22 +00:00
Mario
59fd3861a7 wrong extension 2020-10-23 09:28:49 +00:00
Mario
69d627a58b Merge branch 'dev' into 5.0RC 2020-10-23 06:52:18 +00:00
Mario
2772c33563 load eager in items - lazy breaks collapsing of long items with images 2020-10-22 19:22:52 +00:00
Mario
78f655f877 more lazy, less eager 2020-10-22 19:11:03 +00:00
Mario
75a73be60c lazy/eager loading and minor css fixes 2020-10-22 18:54:21 +00:00
Mario
690874fc6e fix minor regression 2020-10-22 12:12:53 +00:00
Mario
96de38a1f0 adapt notifications and mark item seen handling to play well with client side page caching 2020-10-22 11:33:25 +00:00
Mario
cef0c2ebb2 highlight events for today in notifications and remove some redundant css 2020-10-19 08:44:44 +00:00
Mario
5e0f5460f2 provide info about dead sites in delivery report and set site_dead when marking a hubloc down. 2020-10-19 07:25:30 +00:00
Mario
ff8c9cfd14 load more notifications if visible notifications count becomes < 15 2020-10-18 09:47:46 +00:00
Mario
b5b033fe22 reduce result set for notificationsà 2020-10-16 14:12:30 +00:00
Mario
5dc2f43d1d mark private forums in acl selector 2020-10-16 11:54:14 +00:00
Mario
f0acb9f01e get_forum_channels(): fix an issue where we would not look for private forums in case we did not have any channels where tag_deliver is set 2020-10-16 11:43:21 +00:00
Mario
b6ca9b6020 make acl selector work correctly if we provide a cid in mod network 2020-10-16 10:32:07 +00:00
Mario
9c6446edbe fix image src issue in template 2020-10-16 10:29:24 +00:00
Mario
d84f0030be on refresh, always set all perms 2020-10-16 10:21:58 +00:00
Mario
61f554e0d7 remove new lines and tabs from xchan_name 2020-10-15 10:54:59 +00:00
Mario
3b252d98b8 add forums to acl selector where appropriate 2020-10-15 10:51:58 +00:00
Mario
f5315ed6a2 use logger for logging 2020-10-14 14:25:22 +00:00
Mario
c1f36802a1 version 5.0RC6 2020-10-14 12:36:10 +00:00
Mario
ba0f24bf70 Merge branch 'dev' into 5.0RC 2020-10-14 12:33:38 +00:00
Mario
522b92128f use logger for logging 2020-10-14 12:32:18 +00:00
Mario
ea77043aaf more logging 2020-10-14 08:53:12 +00:00
Mario
91dd877c2d Merge branch 'dev' into 5.0RC 2020-10-14 08:17:35 +00:00
Mario
e2e160b8e8 In find_best_identity() only look for zot and zot6 network types. Otherwise we could end up rewriting activitypub contacts to their diaspora equivalent which would be counterproductive here. Dismiss deleted hublocs. Same applies for find_best_zot_identity(). Also add logging. 2020-10-14 07:33:30 +00:00
Mario
89c74868aa Merge branch 'dev' into 5.0RC 2020-10-13 09:20:16 +00:00
Mario
45a5a04189 do not overwrite $x variable 2020-10-13 09:03:13 +00:00
Mario
1f41b1837f version 5.0RC5 2020-10-13 08:33:22 +00:00
Mario
c01e1b6c33 Merge branch 'dev' into 5.0RC 2020-10-13 08:31:57 +00:00
Mario
08e7c7b249 use a more neutral default cover image provided by bggenerator.com 2020-10-13 08:16:14 +00:00
Mario
b103993ad1 this is not required here 2020-10-13 08:14:14 +00:00
Mario
e12f375624 return if author or owner is missing and add more logging 2020-10-13 07:25:33 +00:00
Mario
8cd67a5d4a fix more php warnings and remove temporary logging 2020-10-12 21:37:44 +00:00
Mario
31e030af69 missing parenthesis 2020-10-12 21:01:36 +00:00
Mario
375986437a fix php warnings 2020-10-12 20:58:30 +00:00
Mario
5f93157d5a improve find_best_identity() and fix wrong variable 2020-10-12 20:28:48 +00:00
Mario
8d3c201830 if we receive an item with a zot xchan as author or owner rewrite them to the zot6 xchan if we have their zot6 xchan in abook 2020-10-12 20:22:07 +00:00
Mario
612ef90523 version 5.0RC4 2020-10-12 06:50:29 +00:00
Mario
e64856e957 Merge branch 'dev' into 5.0RC 2020-10-12 06:47:41 +00:00
Mario
8595835aa0 revert linebreak removing 2020-10-11 19:48:35 +00:00
Mario
4d2507263d find best identity 2020-10-11 19:35:48 +00:00
Mario
4a671fe634 replace linebreaks with spaces 2020-10-11 10:50:03 +00:00
Mario
ed845d93bc 5.0RC testing: fix issue with event responses 2020-10-10 19:06:35 +00:00
Mario
595f3d99b4 quickfix localize_item() - requires more work 2020-10-10 08:00:25 +00:00
Mario
1e2d5b0c77 only call zid_init() if session is not yet authenticated 2020-10-09 12:44:14 +00:00
Mario
1215618589 add zot6 to the authenticatable options and fix array key in reshare header 2020-10-09 12:16:55 +00:00
Mario
67533ee478 add rss network authors to the not fetchable list 2020-10-09 12:03:33 +00:00
Mario
3acd5dcc07 remove source entries for removed contacts 2020-10-09 07:38:11 +00:00
Mario
c387902a44 5.0RC testing: correctly set permissions for rss feeds 2020-10-09 07:19:23 +00:00
Mario
ad51be7dd9 reduce result set for query in zid_init() and use Libzot::zot_record_preferred() in mod rmagic 2020-10-08 18:18:44 +00:00
Mario
3514f805ea more bdi tags 2020-10-07 15:38:04 +00:00
Mario
2690159f09 5.0RC testing: use the zot6 xchan if available 2020-10-07 08:02:04 +00:00
Mario
902151918c 5.0RC testing: do not attempt zot6 delivery of anonymous comments - the author is not a valid actor 2020-10-06 10:03:57 +00:00
Mario
5dd1ea21af 5.0RC testing: dismiss activities where an author could not be found 2020-10-06 10:01:20 +00:00
Mario
b37c8bf928 code optimisation 2020-10-06 08:25:53 +00:00
hubzilla
923ae14c47 Merge pull request 'Update Spanish' (#1) from mjfriaza/hubzilla:dev into dev
Reviewed-on: https://codeberg.org/hubzilla/hubzilla/pulls/1
2020-10-05 15:14:54 +02:00
Mario
7ec6550734 version 5.0RC3 2020-10-05 12:03:14 +00:00
Mario
e622802c24 Merge branch 'dev' into 5.0RC 2020-10-05 12:01:46 +00:00
Mario
244c8edfca Ãrework undo/delete to use inline objects 2020-10-05 11:47:22 +00:00
Mario
245c0c22cd Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-10-02 15:12:53 +00:00
Mario
93b90ab23a more work on delete/undo 2020-10-02 15:12:42 +00:00
Mario
765f9ffcf0 Revert "more work on delete/undo"
This reverts commit bdfdd515d8
2020-10-02 17:12:26 +02:00
Mario Vavti
bdfdd515d8 more work on delete/undo 2020-10-02 17:08:49 +02:00
Mario
72c6d3e7ba item/activity fetching 2020-10-02 12:09:23 +00:00
Mario
869ce64f87 Merge branch 'dev' into 5.0RC 2020-10-01 12:01:52 +00:00
Mario
86117c8859 more delete fixes 2020-10-01 11:51:20 +00:00
Mario
96c4c72ee3 minor issue 2020-10-01 11:16:03 +00:00
Mario
4b0d32eb14 Merge branch 'deletefixes' into 'dev'
deleting like/dislike/accept/reject/etc. activities should be Undo rather than Delete per the spec

See merge request hubzilla/core!1879
2020-10-01 12:35:35 +02:00
nobody
1d705b9805 deleting like/dislike/accept/reject/etc. activities should be Undo rather than Delete per the spec 2020-09-30 23:38:05 -07:00
Mario
8605aee533 use object url 2020-10-01 06:34:27 +00:00
Mario
e4de9ef903 Merge branch 'deletefixes' into 'dev'
delete fixes

See merge request hubzilla/core!1878
2020-10-01 08:26:03 +02:00
nobody
e529635952 delete fixes 2020-09-30 17:05:36 -07:00
Mario
21b71401d3 version 5.0RC2 2020-09-30 10:30:17 +00:00
Mario
80bdcbb3e6 Merge branch 'dev' into 5.0RC 2020-09-30 10:28:54 +00:00
Mario
b878b69028 5.0RC testing: fix issue in relation with deletes 2020-09-30 10:10:49 +00:00
nobody
48440e368c bug: undoing a like on a comment can remove the comment
(cherry picked from commit b999456bf16a5d457a16fab1299289cfb54bfed4)
2020-09-30 08:16:59 +02:00
Mario
a7bf07b864 5.0RC testing: fix uuid for likes/dislikes 2020-09-28 20:31:26 +00:00
Mario
a80e59812b RC5.0 testing: fix purge and some cleanup 2020-09-28 12:36:22 +00:00
Mario Vavti
3f784a974a deprecate \Zotlabs\Zot\Finger where apropriate 2020-09-26 15:05:16 +02:00
mjfriaza
5ce3565109 Update Spanish 2020-09-26 13:55:57 +02:00
Mario Vavti
b25054e891 if we do not have App::$poi here we would already have returned. No need to check here. 2020-09-25 13:47:40 +02:00
Mario Vavti
2c316c788e port mod chanview 2020-09-25 13:41:21 +02:00
Mario Vavti
2fe2cc5e65 5.0RC testing: channel is not set and not required here 2020-09-25 12:44:44 +02:00
Mario
5d6a7922c1 port mod gprobe
(cherry picked from commit d23e830955)
2020-09-23 16:35:03 +02:00
Mario
d23e830955 port mod gprobe 2020-09-23 14:28:04 +00:00
Mario
762de94900 5.0RC testing: comment out global remove
(cherry picked from commit 5edec37d57)
2020-09-23 14:16:33 +02:00
Mario
d938c79385 5.0RC testing: do not use intval() on hubloc_id_url
(cherry picked from commit 42ef6208c1)
2020-09-23 14:16:17 +02:00
Mario
987a369fec 5.0RC testing: update hublocs by hubloc_id_url of we mark it deleted or change primary to catch both zot and zot6 hublocs. only set the zot6 hubloc as primary.
(cherry picked from commit 6f508b81d6)
2020-09-23 14:15:47 +02:00
Mario
586e2ef2df 5.0RC testing: fix mod locs
(cherry picked from commit 81e2f73c98)
2020-09-23 14:15:31 +02:00
Mario
5edec37d57 5.0RC testing: comment out global remove 2020-09-23 12:14:16 +00:00
Mario
42ef6208c1 5.0RC testing: do not use intval() on hubloc_id_url 2020-09-23 11:50:30 +00:00
Mario
6f508b81d6 5.0RC testing: update hublocs by hubloc_id_url of we mark it deleted or change primary to catch both zot and zot6 hublocs. only set the zot6 hubloc as primary. 2020-09-23 11:44:10 +00:00
Mario
81e2f73c98 5.0RC testing: fix mod locs 2020-09-23 09:48:14 +00:00
Mario
be43d3e0fd 5.0RC testing: on channel removal mark both zot6 and zot xchans and hublocs deleted
(cherry picked from commit 60fd27eca4)
2020-09-23 11:19:17 +02:00
Mario
60fd27eca4 5.0RC testing: on channel removal mark both zot6 and zot xchans and hublocs deleted 2020-09-23 09:18:02 +00:00
Mario
ca4a3c3cc0 fix notifications html not reset on markRead()
(cherry picked from commit dfad87f674)
2020-09-23 09:44:37 +02:00
Mario
dfad87f674 fix notifications html not reset on markRead() 2020-09-23 07:43:35 +00:00
Mario
743e575701 changelog and use dbq() where apropriate in z6trans_connections()
(cherry picked from commit be627c3f3a)
2020-09-22 10:27:52 +02:00
Mario
be627c3f3a changelog and use dbq() where apropriate in z6trans_connections() 2020-09-22 08:23:28 +00:00
Mario
80fdf53cc3 5.0RC testing: Diagnostics app should point to mod zot_probe 2020-09-21 12:09:31 +00:00
Mario
759f297aae 5.0RC testing: provide hubloc_id_url for new created zot hublocs
(cherry picked from commit 1a41c44c2f)
2020-09-21 11:27:23 +02:00
Mario
1a41c44c2f 5.0RC testing: provide hubloc_id_url for new created zot hublocs 2020-09-21 09:14:39 +00:00
nobody
88b014e9a7 use channel index
(cherry picked from commit 846d30239d97091d1e6b56e923c1965471f6bbff)

(cherry picked from commit f422362747)
2020-09-21 10:37:57 +02:00
nobody
bd0b8d768e apply channel name changes to all associated xchans
(cherry picked from commit f2ac1e4b7d2aa4854ed08ded49b2ed2dd10fab59)

(cherry picked from commit 34217f5f90)
2020-09-21 10:37:41 +02:00
nobody
f422362747 use channel index
(cherry picked from commit 846d30239d97091d1e6b56e923c1965471f6bbff)
2020-09-21 10:35:56 +02:00
nobody
34217f5f90 apply channel name changes to all associated xchans
(cherry picked from commit f2ac1e4b7d2aa4854ed08ded49b2ed2dd10fab59)
2020-09-21 10:35:14 +02:00
Mario
56e503149d allow to show unchecked box if the value is 0 or false
(cherry picked from commit 04af502e3a)
2020-09-21 10:09:03 +02:00
Mario
04af502e3a allow to show unchecked box if the value is 0 or false 2020-09-21 08:06:57 +00:00
Mario
f2c1fd2a48 ÃRC1 2020-09-20 15:10:31 +00:00
Mario Vavti
a86fd554a3 adapt mod z6trans to point to util/z6convert.php in case anyone stumbles over outdated doco.
(cherry picked from commit c38fc0b906)
2020-09-20 17:04:34 +02:00
Mario Vavti
ef0a8bcde0 add z6convert.php
(cherry picked from commit 2758d3c3eb)
2020-09-20 17:01:22 +02:00
Mario Vavti
c38fc0b906 adapt mod z6trans to point to util/z6convert.php in case anyone stumbles over outdated doco. 2020-09-20 16:49:36 +02:00
Mario Vavti
2758d3c3eb add z6convert.php 2020-09-20 16:38:48 +02:00
Mario
521a5074c9 5.0RC testing: their_perms should be reset before they are recreated. Otherwise withdrawn permissions will not take effect locally.
(cherry picked from commit 9c8d732081)
2020-09-19 22:34:32 +02:00
Max Kostikov
430c48e828 Update Russian hmessages.po
(cherry picked from commit ba0410dd24)
2020-09-19 22:34:07 +02:00
Max Kostikov
2e747bec6f Update Russian hstrings.php
(cherry picked from commit da44cef9a3)
2020-09-19 22:33:46 +02:00
Max Kostikov
d945789e1b Boost DB conversion speed to Z6
(cherry picked from commit a9377d6a3f)
2020-09-19 22:33:05 +02:00
Max Kostikov
de306cd7b8 Missprint
(cherry picked from commit b223b71d0d)
2020-09-19 22:31:38 +02:00
Mario
aedde6600e Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-09-19 19:19:29 +00:00
Mario
9c8d732081 5.0RC testing: their_perms should be reset before they are recreated. Otherwise withdrawn permissions will not take effect locally. 2020-09-19 19:19:03 +00:00
Max Kostikov
5d1e10522f Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1874
2020-09-18 19:56:28 +02:00
Max Kostikov
ba0410dd24 Update Russian hmessages.po 2020-09-18 19:48:03 +02:00
Max Kostikov
da44cef9a3 Update Russian hstrings.php 2020-09-18 19:47:27 +02:00
Mario
e9227b0ffe Merge branch 'dev' into 'dev'
Boost DB conversion speed to Z6

See merge request hubzilla/core!1872
2020-09-18 13:43:02 +02:00
Max Kostikov
9299aff2af Boost DB conversion speed to Z6 2020-09-18 13:43:01 +02:00
Max Kostikov
a9377d6a3f Boost DB conversion speed to Z6 2020-09-17 23:25:55 +02:00
Max Kostikov
b223b71d0d Missprint 2020-09-17 19:49:30 +02:00
Max Kostikov
02cf85fa34 Merge branch 'dev' into 'dev'
Dev sync

See merge request kostikov/core!1
2020-09-17 19:47:44 +02:00
Mario
76a6e0b6fc bump dev version 2020-09-17 11:15:56 +00:00
Mario
2a2f032f17 update strings 2020-09-17 11:09:01 +00:00
Mario
e7ddd1a481 version 5.0RC 2020-09-17 10:57:24 +00:00
Mario
813ab2c5ed regenerate autoload file 2020-09-17 10:23:20 +00:00
Mario
4acdf9e817 deprecate $a variable for *_plugin_admin() and *_plugin_admin_post() 2020-09-16 09:16:27 +00:00
Mario
465da3a942 respect advanced profile setting in sexual preference selector - issue #1477 2020-09-14 07:41:20 +00:00
Mario
fb601cc280 Merge branch 'dev' into 'dev'
Support remote host cache directives on profile photo fetching

See merge request hubzilla/core!1871
2020-09-13 11:56:03 +02:00
Max Kostikov
25b9776bf6 Support remote host cache directives on profile photo fetching 2020-09-13 11:56:02 +02:00
Max Kostikov
5271232aa5 Fix variable name 2020-09-12 12:20:09 +02:00
Mario
7fa70108c4 whitespace 2020-09-11 12:19:24 +00:00
Mario
ff09b2131e disable community tags until we agree on how to implemnt this in zot6/activitypub 2020-09-11 12:11:09 +00:00
Max Kostikov
df758f40ef Avoid photo profile fetching more than once every 1 min 2020-09-09 11:11:52 +02:00
Max Kostikov
1d8dd949dc Update photo_driver.php 2020-09-08 22:50:59 +02:00
Max Kostikov
9dd333a2f4 Support remote host cache directives on profile photo fetching 2020-09-08 14:20:12 +02:00
Mario
d53b3b242d fix get_plink() for zot6 2020-09-04 18:56:21 +00:00
Mario
8e0e4b7b92 Merge branch 'dev' into 'dev'
Update of the .homeinstall folder

See merge request hubzilla/core!1869
2020-09-04 20:07:49 +02:00
Papa Dragon
adee24af6f Update of the home install setup script
- "hubzilla" replaced by "zotserver" in file names and file content when relevant
- Nginx can now be installed as the web server (Apache still chosen by default in the config file)
- Setup script now allows installation of multiple hub/instances on the same server
- Daily cron jobs script was updated an splitted : one global script launches shared commands
(SSL cert renewal + global backup on external device) and every instance has its own script for
git pull (individual scripts are launched by the global one)
2020-08-30 12:18:51 +02:00
Mario Vavti
1b161b0ee4 move z6trans_connections() to cron from cron daily 2020-08-26 21:13:32 +02:00
Mario Vavti
5aaa8f44a2 remove hublocs without a hubloc_hash and also remove hublocs where hubloc_id_url could not be fixed 2020-08-26 20:15:21 +02:00
Mario Vavti
1fbc6fa431 add check against null 2020-08-25 06:48:22 +02:00
Mario Vavti
6177ec9134 prefix table names 2020-08-24 20:31:59 +02:00
Mario Vavti
bd4867ef39 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-08-24 13:44:43 +02:00
Mario Vavti
0189d06375 provide some sort of feedback 2020-08-24 13:44:30 +02:00
Mario
aafdeb9000 Revert "more prefer zot6"
This reverts commit e9a264cb43
2020-08-24 11:26:52 +02:00
Mario Vavti
e9a264cb43 more prefer zot6 2020-08-24 11:18:47 +02:00
Mario Vavti
b996d82c5f prefer zot6 and also check for hubloc_deleted 2020-08-24 09:45:26 +02:00
Mario Vavti
c53794a8a2 an attempt to fix update 1238 for older hubs with broken xchan entries 2020-08-23 19:17:23 +02:00
Mario Vavti
170b2e4465 only show poke link if poke app is installed 2020-08-22 22:44:00 +02:00
Mario Vavti
4e0fc81e5d move cryptojs to addon 2020-08-22 22:14:29 +02:00
Mario
3b865d432f Revert "composer update pear/text_languagedetect"
This reverts commit 646dce7765
2020-08-22 21:32:06 +02:00
Mario Vavti
646dce7765 composer update pear/text_languagedetect 2020-08-22 20:01:59 +02:00
Mario Vavti
88a68f96da composer update html-to-markdown 2020-08-22 19:56:28 +02:00
Mario Vavti
32bdf42913 composer update htmlpurifier 2020-08-22 19:50:15 +02:00
Mario Vavti
53a010d1d4 bootstrap files 2020-08-22 19:41:57 +02:00
Mario Vavti
a9e19cb89e composer update bootstrap 2020-08-22 19:40:57 +02:00
Mario Vavti
4878611987 composer update jquery-file-upload 2020-08-22 19:36:43 +02:00
Mario Vavti
2c777acb25 composer update sabre libs 2020-08-22 19:31:29 +02:00
Mario Vavti
49df57df45 use the default setting and also add the mode to the cipher. aes-128 is to be preferred over aes-256 according to bruce schneier https://www.schneier.com/blog/archives/2009/07/another_new_aes.html#c386957 2020-08-21 10:55:55 +02:00
Mario Vavti
374c30999a whitespace 2020-08-20 22:51:19 +02:00
Mario Vavti
2ab480188a Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-08-20 22:47:53 +02:00
Mario Vavti
c4c47f7777 first cut on implementing additional encryption with the SJCL library. aes only and no backward compatibility. 2020-08-20 22:47:33 +02:00
Mario
c36b2ca915 be more clear in comment 2020-08-20 08:53:58 +00:00
Mario
e55a1a6aa8 fix item deletion 2020-08-20 08:43:13 +00:00
Mario
21e5b05b14 Merge branch 'dev' into 'dev'
issue with DAV - moveInto and variable scope

See merge request hubzilla/core!1868
2020-08-17 20:40:41 +02:00
nobody
ea845aeacd issue with DAV - moveInto and variable scope 2020-08-16 16:29:00 -07:00
nobody
ee3b077f26 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-08-16 16:28:17 -07:00
Mario Vavti
393cee6619 $id is expected to be an array with a calendarId and an instanceId for caldav 2020-08-15 13:17:04 +02:00
Mario
d9196bb82a Merge branch 'dev' into 'dev'
update profile|cover photo activities converted to z6

See merge request hubzilla/core!1865
2020-08-05 19:13:44 +02:00
Zot
5ecbbfc7df update profile|cover photo activities converted to z6 2020-08-05 19:13:44 +02:00
nobody
9244ee8094 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-08-04 16:26:44 -07:00
nobody
0b7ca61958 update profile|cover photo activities converted to z6 2020-08-04 16:25:33 -07:00
Mario
c56b140387 Ãthis should not be required anymore 2020-08-03 19:51:03 +00:00
Mario
3e7d3a20af css fix 2020-07-31 09:37:59 +00:00
Mario
2d2cab0aba event display zot/zot6 compatibility 2020-07-31 08:41:18 +00:00
Mario
364346b07c syntax 2020-07-30 19:22:02 +00:00
Mario
be15a395d8 use cursor-pointer for the lock 2020-07-30 12:32:00 +00:00
Mario
845f7e9382 add new lock icon as svg 2020-07-30 09:59:25 +00:00
Mario
976d6baf6a use the compact view in html2plain() 2020-07-30 08:48:02 +00:00
Mario
f9271bb0bd Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-07-30 08:22:01 +00:00
Mario
06f03eb13a respect notifications settings 2020-07-30 08:21:43 +00:00
Mario
1a1c0ca72c Merge branch 'dev' into 'dev'
Add minimum form displaying time before login

See merge request hubzilla/core!1863
2020-07-30 09:26:30 +02:00
Mario
73f2db09ae Merge branch 'dev' into 'dev'
foreach warning and a minor update to util/zotsh

See merge request hubzilla/core!1864
2020-07-30 09:19:32 +02:00
Mario
be533679dd raise cache lifetime - this should probably be configurable 2020-07-30 06:56:25 +00:00
Mario
e31903cbc9 add some context to the notifications 2020-07-29 19:53:00 +00:00
Mario
33d417955d version 2020-07-26 07:47:52 +00:00
Mario
9f0f794a0a whitespace 2020-07-26 07:46:22 +00:00
Mario
33e4d7c0d8 fix hubloc_id_url for activitypub with broken xchan_url 2020-07-26 07:45:20 +00:00
Mario
ad30834123 version 2020-07-26 07:31:05 +00:00
Mario
fba64e9451 improve profile detection and reduce feed result set 2020-07-26 07:16:06 +00:00
Mario
9b5e270379 tool to fix missing hubloc_id_url entries 2020-07-24 20:46:55 +00:00
Mario
ea5131db88 construct hubloc_id_url for imported legacy zot hublocs 2020-07-24 20:44:55 +00:00
zotlabs
7ae86d29d2 add api_verify to api_zot 2020-07-22 16:23:38 -07:00
zotlabs
13ff9a897d foreach warning 2020-07-22 16:20:36 -07:00
Max Kostikov
4db38ec64a Add minimum form displaying time before login 2020-07-21 23:59:26 +02:00
Mario
29c5a65e8f reset bParam_page in case of failure 2020-07-21 19:25:37 +00:00
Mario
dd2ffae8bf Revert "zot6 testing"
This reverts commit 4f95b44ff2.
2020-07-21 19:08:03 +00:00
Mario
ca969cd0ed those are not lÃikely to be parents 2020-07-21 17:54:14 +00:00
Mario
4f95b44ff2 zot6 testing 2020-07-21 17:29:40 +00:00
Mario
cb7aec0da5 slightly raise cache lifetime 2020-07-21 09:10:31 +00:00
Mario
62eebc86f6 no need to iterate the object twice 2020-07-21 09:09:41 +00:00
Max Kostikov
5ea7196e78 Merge branch 'dev' into 'dev'
Dev sync

See merge request kostikov/core!1
2020-07-19 14:58:19 +02:00
Mario
fcc47e69e4 do not cache single thread pages 2020-07-16 11:59:35 +00:00
Mario
d2f1c37431 more itemspage work 2020-07-16 10:49:08 +00:00
Mario
817fe8d485 version 2020-07-16 10:14:09 +00:00
Mario
1dbd85322d an attempt to improve lazy loading 2020-07-16 10:13:26 +00:00
Mario
fe90096ace bump zot revision to 6.0 std version to 4.7.9 2020-07-14 12:51:31 +00:00
Mario
ad60309187 minor adjustion 2020-07-14 12:48:21 +00:00
Mario
634a515ec1 reduce result sets and work around a regression in justifiedGallery 2020-07-14 12:43:34 +00:00
Mario
01abb82c37 prefer zot6 sys channel 2020-07-14 09:36:10 +00:00
Mario
1c88a8d4a0 Merge branch 'dev' into 'dev'
z6 work

See merge request hubzilla/core!1862
2020-07-14 09:24:11 +02:00
Mario
ce77f82966 more zot6 2020-07-13 20:52:15 +00:00
Mario
573af9e366 fix embeded shares 2020-07-13 18:59:23 +00:00
Mario
774cc852d4 fix php warning 2020-07-13 09:18:11 +00:00
zotlabs
c0735a5ca2 z6trans: don't swap xprof xchans on directory servers because it will fail with duplicate primary key in many cases and the migration will fail on each channel. What this means is that directory servers may take time to pick up zot6 entries if they haven't received them prior to the upgrade. I don't see an easier solution unless we check for existence of the zot6 xchan_hash in the xprof table before converting it. 2020-07-12 19:16:37 -07:00
zotlabs
fa752b0ac1 zot6 group updates to support edit and delete of top-level group posts. This is supported remotely by editing or removing the post that started it all. A W2W post can only be deleted at this time. 2020-07-12 19:06:24 -07:00
Mario
3f69fc70f1 sbom add jquery 2020-07-05 07:55:21 +00:00
Mario
137f56f994 only redirect to known sites 2020-06-19 08:18:43 +00:00
Mario
e2cbcf7039 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-06-18 19:40:18 +00:00
Mario
64f8df0a0d looks like fullcalendar now requires a date object instead of a string 2020-06-18 19:40:00 +00:00
Mario
274d556ec1 add a title 2020-06-18 10:46:45 +02:00
Mario
f28c3b441e start a software bill of materials - this is work in progress 2020-06-18 08:39:06 +00:00
Mario
4eaa893e0b Merge branch 'dev' into 'dev'
zap group support

See merge request hubzilla/core!1859
2020-06-17 09:12:15 +02:00
Zot
36e969fd79 zap group compatibility - rewrites DMs and wall-to-wall posts to group pages as new posts authored by the group with an embedded reshare. This currently has known delivery issues due to zot/zot6 xchan confusion which are already slated for resolution in hz5. Specifically "sender is not owner/author" and missing abconfig permissions on the zot6 identity for a channel we're connected with over traditional zot. 2020-06-17 09:12:15 +02:00
Mario
d8f16960c8 Merge branch 'dev_homeinstall_reminder' into 'dev'
Dev homeinstall reminder

See merge request hubzilla/core!1860
2020-06-17 09:08:20 +02:00
OJ Random
101a7648ee Dev homeinstall reminder 2020-06-17 09:08:20 +02:00
Mario
70a104f24f upÃdate copperjs to version 1.5.7 2020-06-16 07:32:55 +00:00
Mario
0f27db6271 uodate justified-gallery to version 3.8.1 2020-06-15 09:35:39 +00:00
Mario
56ec55110a update fullcalendar to version 4.4.2 2020-06-15 08:19:13 +00:00
Mario
570497071d Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-06-15 07:04:40 +00:00
Mario
49dee6312f new file 2020-06-15 07:02:18 +00:00
Mario
63a6b4a162 composer update commerceguys/intl 2020-06-15 07:01:35 +00:00
Mario Vavti
ec4dea0920 zot6 does not appear to use zfinger 2020-06-14 18:47:18 +02:00
Mario Vavti
7270da6a28 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-06-14 15:39:00 +02:00
Mario Vavti
8cd66145bd fix discovery 2020-06-14 15:38:44 +02:00
Mario
92ee27349c check for zot6 first 2020-06-14 13:35:17 +00:00
Mario
a88233a045 composer update jquery-file-upload 2020-06-13 12:01:27 +00:00
Mario
0259130cf3 update jquery to version 3.5.1 2020-06-13 11:18:57 +00:00
Mario
d0a1f0b8f9 revert additional top border 2020-06-13 11:18:26 +00:00
Mario
97dd350c61 css fixes due to bootstrap update 2020-06-13 11:13:47 +00:00
Mario
dc3b09c8f3 composer update bootstrap 2020-06-13 10:00:50 +00:00
Mario
c8c4513af9 Merge branch 'dev' into 'dev'
allow apps to be both pinned and starred independently

See merge request hubzilla/core!1858
2020-06-11 12:13:44 +02:00
Zot
3201a4bec5 allow apps to be both pinned and starred independently 2020-06-11 12:13:43 +02:00
Mario
9da8e30c37 Merge branch 'fix-invite-code-deletion' into 'dev'
Fix invite code deletion

See merge request hubzilla/core!1857
2020-06-01 14:46:47 +02:00
Keenan Pepper
6bfac1a907 Fix bug allowing invite codes to be reused unlimited times
The invite codes aren't deleted from the DB because of a malformed query.
2020-05-27 13:52:38 -07:00
Mario
d0c7c99d5e use strip_tags() on rss titles 2020-05-18 11:06:46 +00:00
Mario
934bcf5336 comment out code which is only required for loggingà 2020-05-18 08:46:30 +00:00
Mario
5b88873530 re-enable time logging 2020-05-18 07:33:32 +00:00
Mario
b161b02c51 bump version 2020-05-18 07:29:41 +00:00
Mario
ddc544e00a add images load status to spinnner if preload images is enabled 2020-05-18 07:28:25 +00:00
Mario
97d5ffe056 wrong path 2020-05-16 08:44:24 +00:00
Mario Vavti
13319985fd uuid for likes 2020-05-15 19:28:03 +02:00
Mario
e3aaa39f9e Revert "uuid for likes"
This reverts commit b6efb02ed2.
2020-05-15 15:26:05 +00:00
Mario
b6efb02ed2 uuid for likes 2020-05-15 15:08:57 +00:00
Mario
c358d8326e whitespace 2020-05-15 13:16:07 +00:00
Mario
f40fedcad6 rewriting the author for legacy compatibility only if author is from this site and add comment. 2020-05-15 12:40:06 +00:00
Mario
b4973ede44 rewriting the owner for legacy compatibility should be sufficient 2020-05-15 12:11:35 +00:00
Mario
81338e8086 use zot_record_preferred() when fetching keys 2020-05-15 10:10:07 +00:00
Mario
4270e17bc4 implement notifications for direct messages 2020-05-14 09:27:39 +00:00
Mario
1329662edc use dbq() in update 1238 2020-05-12 09:13:59 +00:00
Mario
249427365b bump version 2020-05-12 09:08:56 +00:00
Mario
326644104c really fix update for postgres 2020-05-12 08:56:05 +00:00
Mario
1520a26e0f fix update for postgres 2020-05-12 08:34:35 +00:00
Mario
6ffdc1b642 update file 2020-05-12 08:29:54 +00:00
Mario
22d8523e76 DB update 1238 to fix hubloc_id_url for existing hublocs and set hubloc_id_url in Activity::actor_store() 2020-05-12 08:23:41 +00:00
Mario
2d3740b912 Legacy Hubzilla compatibility: when we relay a comment from hubzilla < 4.0, we send it to ourself again but this time with a valid uri as mid. To catch this as duplicate, we need to check for the basename aswell. 2020-05-11 20:22:25 +00:00
Mario
c8ab5db768 Merge branch 'dev' into 'dev'
Dev

See merge request hubzilla/core!1856
2020-05-11 19:54:22 +02:00
zotlabs
c656478230 issue with quoted hashtags/mentions 2020-05-10 16:13:01 -07:00
Mario
3d02758fee deal with diaspora uuid 2020-05-10 10:55:57 +00:00
Mario
f473b5abfb as_vid_sort -> vid_sort 2020-05-10 07:53:21 +00:00
Mario
22d68ddf08 it looks like this was required at some point but is not required anymore for our autocomplete to work as expected. fixes #1463 2020-05-08 12:21:06 +00:00
Mario
2cba88f1eb new files 2020-05-07 21:49:08 +00:00
Mario
f132436af3 composer updates 2 2020-05-07 21:48:26 +00:00
Mario
fae70bf0a7 Revert "composer updates"
This reverts commit dbfe748d27
2020-05-07 23:35:02 +02:00
Mario
ffd2faf8a0 Revert "add new files"
This reverts commit c76ff4249e
2020-05-07 23:34:41 +02:00
Mario
64a8913385 tests: more declare return type 2020-05-07 21:00:49 +00:00
Mario
266dcd44bb tests: declare return type 2020-05-07 20:49:52 +00:00
Mario
8851921d6d bump php version to 7.3 for gitlab-ci 2020-05-07 20:36:45 +00:00
Mario
c76ff4249e add new files 2020-05-07 15:23:30 +00:00
Mario
dbfe748d27 composer updates 2020-05-07 15:22:25 +00:00
Mario
4ee809bed6 fix tests 2020-05-07 08:31:31 +00:00
Mario
4ebf6cda5d remove more traces of the premium channel app 2020-05-07 08:06:38 +00:00
Mario
a04b6d178b deprecate premium channel app 2020-05-07 07:55:05 +00:00
Mario
c8b45c3449 channelx caching 2020-05-07 06:57:33 +00:00
Mario
1bb74a5a01 css 2020-05-06 19:59:21 +00:00
Mario
ef94072cee Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-05-06 19:56:47 +00:00
Mario
ff3ff2478d allow to set different values for left and right aside width in $theme.php 2020-05-06 19:56:37 +00:00
Mario
2757822cd8 Merge branch 'dev' into 'dev'
Issue generating photo thumbnails when uploaded via davfs

See merge request hubzilla/core!1855
2020-05-06 11:00:30 +02:00
Zot
2cb0cade7b Revert "issue generating photo thumbnails when uploaded via davfs"
This reverts commit 7a0d9a4494.
2020-05-06 11:00:29 +02:00
zotlabs
191e01e3ec re-apply after removing from cherry-picked git hash from wrong branch 2020-05-05 20:01:09 -07:00
zotlabs
8c65e9cb4a Revert "issue generating photo thumbnails when uploaded via davfs"
This reverts commit 7a0d9a4494.
2020-05-05 19:59:22 -07:00
zotlabs
79968ea07a Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-05-05 19:42:00 -07:00
zotlabs
7a0d9a4494 issue generating photo thumbnails when uploaded via davfs 2020-05-05 19:39:09 -07:00
Mario
06d1cf83d2 deal with polls and votes in enotify 2020-05-05 14:51:00 +00:00
Mario
de058901c2 catch the owner_xchan for activity_share items in notifications filter 2020-05-05 07:40:24 +00:00
Mario
a40b882d72 typo 2020-05-04 09:26:06 +00:00
Mario
46242aeaae display complete perminfo only to owner 2020-05-04 09:24:22 +00:00
Mario
ad040a0b11 set CURLOPT_ENCODING in z_post_url() 2020-05-04 07:44:19 +00:00
Mario
4eaba326ce version 4.7.6 2020-05-03 12:33:42 +00:00
Mario
fd48f9d173 improve functionality of combined notification filters 2020-05-03 12:31:10 +00:00
Mario
104c45f6e6 Merge branch 'dev' into 'dev'
Display delayed posts on author's channel page

See merge request hubzilla/core!1854
2020-05-02 17:28:49 +02:00
Max Kostikov
f4a71db42d Display delayed posts on author's channel page 2020-05-02 17:28:49 +02:00
Mario
1ac2b93fd8 Merge branch 'iss1457' into 'dev'
stress the importance of  PHP mail()

See merge request hubzilla/core!1852
2020-05-02 17:27:40 +02:00
Mario
03c1419ad0 missing lib include 2020-05-02 11:48:11 +00:00
Mario
18938280f5 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-05-01 10:24:13 +00:00
Mario
01334d761a set CURLOPT_ENCODING to empty string so that compressed content will be uncompressed 2020-05-01 10:24:00 +00:00
Max Kostikov
446204f7d8 Merge branch 'dev' into 'dev'
Force browser photo revalidation

See merge request hubzilla/core!1853
2020-04-29 14:44:42 +02:00
Max Kostikov
328900cf3b Force browser photo revalidation 2020-04-29 14:38:11 +02:00
Mario
837dbb7a14 Ãfix photo items 2020-04-29 11:10:54 +00:00
Mario
c9794439bc adjust code comments and whitespace 2020-04-29 08:24:00 +00:00
Mario
079c13e633 more work on attach_store_item() 2020-04-29 08:21:33 +00:00
OJ Random
7b8c85cf3f stress the importance of PHP mail() 2020-04-27 09:59:17 +02:00
Mario
c229f058b4 fix mod filestorage and fetch the info from attach if only the hash is provided in attach_store_item() 2020-04-25 09:15:20 +00:00
Mario
e2b10f52e0 more work on deprecating ACTIVITY_OBJ_FILE and adapt mod sharedwithme 2020-04-24 14:25:49 +00:00
Mario
2b8afd5580 fix file notifications 2020-04-23 19:38:19 +00:00
Mario
7e89d816d7 more work on deprecating ACTIVITY_OBJ_FILE 2020-04-23 19:14:43 +00:00
Mario
77c87bcccf default item_wall to 0 2020-04-23 18:21:38 +00:00
Mario
b7a655917e some work on deprecating ACTIVITY_OBJ_FILE 2020-04-23 18:19:25 +00:00
Mario
d8bfa5dd96 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-04-22 18:15:38 +00:00
Mario
88eb19165b the parent id is required later in the process 2020-04-22 18:15:02 +00:00
Mario
2828b8cf5c Merge branch 'dev_homeinstall' into 'dev'
fixes for real installation for debian 10

See merge request hubzilla/core!1851
2020-04-22 14:18:50 +02:00
Mario
b1b9dbe55f more prefer zot6 over zot 2020-04-22 07:44:51 +00:00
Mario
579adb4897 fix onepoll 2020-04-21 09:42:40 +00:00
OJ Random
a9d52cd296 fixes for real intallation for debian 10 2020-04-20 17:56:52 +02:00
Mario
c71422e909 add the spec folder 2020-04-20 15:53:43 +00:00
Mario
03506bd6cf use $mid as plink to prevent to long plinks 2020-04-20 11:58:08 +00:00
Mario
244936b0fd some work on improving federation of item_private and make sure we deal with an array in array_path_exists() 2020-04-20 09:34:00 +00:00
Mario
f430a24fa3 missing lib import 2020-04-19 14:24:52 +00:00
Mario
ecb1c78173 make sure $post_tags is defined somewhere outsite a clause to prevent PHP warnings 2020-04-19 14:17:00 +00:00
Mario
42631b5943 revert 2020-04-18 14:22:40 +00:00
Mario
109f9eed61 just fetch the info we need 2020-04-18 14:09:08 +00:00
Mario
c7fdc53795 more do not include hublocs with no hubloc_id_url 2020-04-18 13:59:30 +00:00
Mario
602ca91700 remove debug code 2020-04-18 13:17:37 +00:00
Mario
4cfc0b1a64 de-duplicate $post_tags 2020-04-18 12:19:34 +00:00
Mario
3d5fdd086b only return hublocs with hubloc_id_url set 2020-04-18 11:30:19 +00:00
Mario
223c4c7b9a implement addressing and fix conversation fetching 2020-04-18 09:23:48 +00:00
Mario
f7e925beaa Revert "keychange and request packets via zot6"
This reverts commit 9d0f71bfcb
2020-04-16 12:33:02 +02:00
Mario
e588ea8a8b fix notification filtering 2020-04-15 15:39:33 +00:00
Mario
91cad21d33 fetch the item for asld in Lib/Share. This probably fixes addons issue #146 2020-04-15 11:56:56 +00:00
Mario
d6b9c8b93d Ãfix php warning 2020-04-15 08:43:28 +00:00
Mario
a7273668d8 Merge branch 'dev' into 'dev'
Remove unnecessary [summary] tag processing

See merge request hubzilla/core!1850
2020-04-15 10:22:54 +02:00
Max Kostikov
b1f74f4ef4 Remove unnecessary [summary] tag processing 2020-04-15 10:22:54 +02:00
Mario
c640d1c599 Merge branch 'dev' into 'dev'
event issue when using strict sql mode

See merge request hubzilla/core!1849
2020-04-15 10:22:31 +02:00
Mario
9d0f71bfcb keychange and request packets via zot6 2020-04-15 08:21:07 +00:00
Max Kostikov
bbca6be0f9 Update Item.php 2020-04-12 23:08:11 +02:00
Max Kostikov
31e1e9cbfb Remove unnecessary [summary] tag processing 2020-04-12 21:41:32 +02:00
Mario
6de823b532 discover_feed() does not exist yet 2020-04-12 08:59:42 +00:00
Mario
69878ed628 handle some basic friendica attachment bbcodes 2020-04-12 07:54:22 +00:00
Mario
27ae9c9d34 just comment out is_edit_activity() call and add comments on why it is commented out 2020-04-12 07:35:17 +00:00
Mario
52e698cae6 function is_edit_activity() is obsolete 2020-04-12 07:05:01 +00:00
zotlabs
6a0ac591d1 event issue when using strict sql mode 2020-04-10 14:27:20 -07:00
Mario
328685d2fb move from build_sync_packet() to Libsync::build_sync_packet() 2020-04-09 09:38:36 +00:00
Mario
806c738923 remove voting from UI in favour of polls 2020-04-08 18:41:54 +00:00
Mario
9c2d48bcd4 update 1236: we have seen situations in the wild where a zot6 xchan was present while its hubloc was missing. fix those separately if required so that we cover both situations. 2020-04-08 12:20:44 +00:00
Max Kostikov
d8802e4fc8 Merge branch 'dev' into 'dev'
Fix process id disclouse

See merge request hubzilla/core!1848
2020-04-08 11:40:32 +02:00
Max Kostikov
2c8a243ece Merge branch 'dev' into 'dev'
# Conflicts:
#   Zotlabs/Daemon/Expire.php
2020-04-08 11:34:29 +02:00
Max Kostikov
3372fb0761 Fix process id disclouse 2020-04-08 11:31:17 +02:00
Mario
af7a31cd14 owa: look for zot6 first 2020-04-06 12:12:44 +00:00
Mario
cb2996a40c another import fix and do not allow importing channels < version 4.7.4 for zot6 compatibility reasons 2020-04-05 15:00:08 +00:00
Mario
ea237a97a1 more mod import fixes 2020-04-05 11:37:42 +00:00
Mario
530b1d038f fix mod import 2020-04-05 11:19:12 +00:00
Mario
a31981966e fix warning if iconfig value is an array 2020-04-05 09:29:23 +00:00
Mario
84183d9f7e show event timezone only if adjust ist set and the offset of the event timezone is different from the channel default timezone offset 2020-04-05 09:11:12 +00:00
Mario
805f8bf983 show event timezone if it differs from the channel default timezone 2020-04-05 07:59:41 +00:00
Mario
67c9b5d049 fix unseen forum posts count 2020-04-05 06:47:12 +00:00
Mario
44b935f875 another attempt to get events right 2020-04-04 15:41:58 +00:00
Mario
cade25a112 Revert "more timezone changes"
This reverts commit cec2e92fe3
2020-04-03 22:01:44 +02:00
Mario
a4831b0f7c Revert "use timezone info for timezone display only- the actual time is in utc already."
This reverts commit 625438ff64
2020-04-03 22:01:24 +02:00
Mario
ec9418b262 Revert "set timezone iconfig a little earlier in the process so that it will be included in the object"
This reverts commit 6cfaa5cba3
2020-04-03 22:01:02 +02:00
Mario
cec2e92fe3 more timezone changes 2020-04-03 19:50:50 +00:00
Mario
625438ff64 use timezone info for timezone display only- the actual time is in utc already. 2020-04-03 19:22:31 +00:00
Mario
6cfaa5cba3 set timezone iconfig a little earlier in the process so that it will be included in the object 2020-04-03 18:34:15 +00:00
Mario
31fea1014e Merge branch 'dev' into 'dev'
fix app links in DB when doing a site rename

See merge request hubzilla/core!1846
2020-04-03 10:51:34 +02:00
Mario
898fea1e0e Merge branch 'dev' into 'dev'
Avoid multiple run of expiry procedure on large sites

See merge request hubzilla/core!1847
2020-04-03 10:49:57 +02:00
Max Kostikov
4b3979df04 Avoid multiple run of expiry procedure on large sites 2020-04-03 10:49:57 +02:00
Mario
ac52bebb88 ATOM_TIME format is not compatible with the DB 2020-04-02 12:33:57 +00:00
Mario
c568f7b8d1 bump version 2020-04-01 18:22:33 +00:00
Mario
d925ec6759 fix outgoing mails to zot connections 2020-04-01 18:13:00 +00:00
Max Kostikov
c136c142b8 Use config instead pconfig 2020-04-01 12:59:12 +02:00
Mario
38be2386dd cheat with guid_sig to reflect transition to zot6 and re-enable transition of connections 2020-04-01 09:26:27 +00:00
Mario
643b2f9205 do not enable transition of connections yet 2020-04-01 08:03:19 +00:00
Mario
ffe429be65 transition connections to zot6 if their site has been updated 2020-04-01 07:44:07 +00:00
Max Kostikov
4a56b77f64 Use pconfig 2020-03-31 21:00:21 +02:00
Max Kostikov
9773ab7aab Use POSIX kill 0 to check expire process status 2020-03-31 20:45:15 +02:00
Max Kostikov
6c02fa40f1 Check if POSIX PHP module is available on PID check 2020-03-31 20:15:09 +02:00
Max Kostikov
632996f53e Add check if expire procedure is still running 2020-03-31 20:03:29 +02:00
Max Kostikov
710448e73f Update Expire.php 2020-03-31 19:58:08 +02:00
Max Kostikov
084177a20c Avoid multiple run of expiry procedure on large sites 2020-03-31 19:57:05 +02:00
Max Kostikov
5a2c62466e Merge branch 'dev' into 'dev'
Sync dev

See merge request kostikov/core!2
2020-03-31 19:54:20 +02:00
Mario
b739f91caa use Libsync::build_sync_packet() in mod item, default Lib/Queue driver to zot6 and some whitespace cleanup in queue_deliver() 2020-03-29 15:18:49 +00:00
Mario
b1590ad645 fix check for existing hublocs 2020-03-29 10:47:22 +00:00
Mario
f49010bb12 port fhublocs to zot6 and fix issue with primary detection 2020-03-29 08:33:42 +00:00
Mario
6e1c3b6d48 Merge branch 'z6connect' into 'dev'
Transition to zot6

See merge request hubzilla/core!1823
2020-03-28 11:12:22 +01:00
Mario
bcdd75b817 prevent mod fhublocs breaking things. it needs porting to zot6 but has no priority for now. 2020-03-28 09:29:49 +00:00
Mario
0271f2a1ae fix z6_discover() to do the right thing after transition 2020-03-26 08:14:20 +00:00
Mario
0c1c386a0a do not use channel_portable_id in process_channel_sync_delivery(). we should only accept sync packages from channels which are already transitioned to zot6. 2020-03-25 11:29:00 +00:00
zotlabs
a3acec9674 issue 1454 - some photo item ActivityStreams links not returning json-ld; requires related fixes in addons/pubcrawl 2020-03-24 18:26:20 -07:00
Mario
4eaddd1279 do not sync with incompatible hubs 2020-03-24 08:32:37 +00:00
Mario
eb3dbcce7b one more typo 2020-03-16 22:04:28 +00:00
Mario
3ecf1cab5e typo 2020-03-16 21:55:59 +00:00
Mario
c536526196 Update 1236 and bump version to 4.7.4 2020-03-16 20:12:30 +00:00
Mario
b2de12442d wrong variable 2020-03-13 19:32:59 +00:00
zotlabs
8f5cb0c45a Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-03-12 17:55:35 -07:00
Mario
3b4503c971 use xchan_guid_sig instead of channel_guid_sig since it slightly differs depending on *default* protocol 2020-03-12 19:09:34 +00:00
Mario
c358aa2806 first batch of zot6 transition patches. basic communication with transitioned channels *should* work now 2020-03-12 18:27:16 +00:00
zotlabs
938d26ba3e fix app links in DB when doing a site rename 2020-03-11 15:18:33 -07:00
Mario
b23751128b port create_identity() to zot6 2020-03-11 10:43:19 +00:00
Mario
d54ff4fae5 Merge branch 'dev' into z6connect 2020-03-11 10:35:05 +00:00
Mario
720d3dcedc z6trans preparation for db update 1236 2020-03-11 10:34:25 +00:00
Mario
ce4fc30439 use 24h time format 2020-03-06 10:11:10 +00:00
Mario
b39474456f Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-03-06 09:51:10 +00:00
Mario
25cd9b4983 provide tool to transform channels to zot6. WARNING: transformed channels will not yet be functional without additional patches. 2020-03-06 09:50:53 +00:00
Max Kostikov
2d65ce542c Merge branch 'dev' into 'dev'
Dev

See merge request hubzilla/core!1845
2020-03-06 10:42:17 +01:00
Max Kostikov
c2b691fd01 Translate 'vote' button text 2020-03-06 10:33:25 +01:00
Max Kostikov
ae691bdc7c Merge branch 'dev' into 'dev'
Sync dev

See merge request kostikov/core!1
2020-03-06 10:26:19 +01:00
Mario
ba566fd64b Merge branch 'dev' into z6connect 2020-03-02 09:50:11 +00:00
Max Kostikov
85c07d57fe Merge branch 'dev' into 'dev'
rework img alt text - preserve legacy bbcode

See merge request hubzilla/core!1844
2020-03-01 16:23:24 +01:00
zotlabs
16fd618380 rework img alt text - preserve legacy bbcode 2020-02-29 13:08:16 -08:00
Mario
06f2979e04 prevent duplicate votes 2020-02-29 10:25:22 +00:00
Mario
1ff9d1afdd Merge branch 'dev' into 'dev'
alt attribute for images

See merge request hubzilla/core!1843
2020-02-29 11:15:55 +01:00
zotlabs
a776f69a59 alt attribute for images 2020-02-28 14:31:49 -08:00
Mario
a574290235 poll UI strings 2020-02-28 13:22:30 +00:00
Mario
84c9ae04fc Merge branch 'wiki-link-titles' into 'dev'
Allow wiki link titles

See merge request hubzilla/core!1842
2020-02-28 12:23:01 +01:00
BattleMage
c74c41c3b8 Allow wiki link titles
Allow linking to wiki pages with alternating titles by separating the
title from the link with a pipe, like regular wiki markup does.
2020-02-28 10:31:07 +01:00
Mario
7cf73e0533 Merge branch 'dev' into 'dev'
add iconfig to zot6 objects

See merge request hubzilla/core!1835
2020-02-27 10:22:48 +01:00
Mario
03e9ed71b4 version 4.7.3 2020-02-27 09:22:06 +00:00
Mario
e7e79f7423 bump version 2020-02-27 08:38:01 +00:00
Mario
589af1f9ee Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-02-26 09:51:56 +00:00
Mario
e7f25b8466 implement poll UI in jot 2020-02-26 09:51:40 +00:00
Max Kostikov
2100441b54 Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1839
2020-02-26 00:17:58 +01:00
Max Kostikov
082826ee44 Update hstrings.php 2020-02-26 00:12:57 +01:00
Max Kostikov
93ad3eb6f1 Update hmessages.po 2020-02-26 00:12:23 +01:00
Max Kostikov
177209b5e9 Merge branch 'dev' into 'dev'
Fix missprint in Russian translation

See merge request hubzilla/core!1838
2020-02-25 21:43:48 +01:00
Max Kostikov
47d80df81c Update hmessages.po 2020-02-25 21:38:33 +01:00
Max Kostikov
3d6fa049da Update hstrings.php 2020-02-25 21:37:49 +01:00
Max Kostikov
16738dfe7f Merge branch 'dev' into 'dev'
Minor cdav related changes

See merge request hubzilla/core!1836
2020-02-24 12:10:00 +01:00
Max Kostikov
c28ba4be37 Update cdav import parameters comment 2020-02-24 11:39:26 +01:00
Max Kostikov
8bcdc24fcb Code reuse 2020-02-24 11:38:23 +01:00
Mario
b36eb9a91c Merge branch 'dev' into 'dev'
Implement DAV calendars sync with clones

See merge request hubzilla/core!1834
2020-02-24 10:02:09 +01:00
Max Kostikov
989fbe70cd Implement DAV calendars sync with clones 2020-02-24 10:02:09 +01:00
zotlabs
85cf25a2a8 add iconfig to zot6 objects 2020-02-23 15:28:16 -08:00
Mario
7bb94f9993 Merge branch 'patch-20200221a' into 'dev'
Fix: hang on too few items

See merge request hubzilla/core!1832
2020-02-23 14:40:18 +01:00
M. Dent
1297c8d2ae Fix: hang on too few items 2020-02-23 14:40:18 +01:00
Mario
ed28ef185e polls can also appear in shares 2020-02-23 08:45:39 +00:00
Mario
9d97cc2a1d implement optional events and polls filter 2020-02-21 10:44:26 +00:00
Mario
23acf02d58 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-02-20 21:25:52 +00:00
Mario
60311eb04b fix warning 2020-02-20 21:25:41 +00:00
Mario
b9a8b9e47b Merge branch 'dev' into 'dev'
Implement CardDAV address book sync with clones

See merge request hubzilla/core!1829
2020-02-20 20:03:50 +01:00
Max Kostikov
b7bac45427 Revert "Use argv() instead URI parsing"
This reverts commit bcfb69eeeef6a0506a0ec0574a03b673df84a55a
2020-02-20 20:03:50 +01:00
Mario
7d05b8e5fd vote issue 2020-02-20 17:16:14 +00:00
Mario
d5ae9aedc4 remove unused images 2020-02-13 10:38:47 +01:00
Max Kostikov
1b216e6019 Merge branch 'dev' into 'dev'
issue with multi-line poll elements

See merge request hubzilla/core!1831
2020-02-13 08:33:20 +01:00
zotlabs
83256c9ccd issue with multi-line poll elements 2020-02-12 14:17:28 -08:00
Mario
9f029336ca fix notifications for polls 2020-02-11 09:20:32 +00:00
Mario
95476cf33c Merge branch 'dev' into 'dev'
this allows polls to federate from hubzilla to zap, though still a remaining issue with voting

See merge request hubzilla/core!1830
2020-02-11 07:55:34 +01:00
zotlabs
bf7c96807a fix poll responses 2020-02-10 18:17:41 -08:00
zotlabs
d4a6aa7801 this allows polls to federate from hubzilla to zap, though still a remaining issue with voting 2020-02-10 15:34:33 -08:00
zotlabs
b767bda410 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-02-10 14:38:28 -08:00
Mario
a39d436f9f poll fixes 2020-02-10 20:37:35 +00:00
Mario
50dbe1e62d Merge branch 'dev' into 'dev'
poll updates

See merge request hubzilla/core!1828
2020-02-10 12:25:11 +01:00
zotlabs
be81a40b2b Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-02-09 16:33:12 -08:00
zotlabs
bbcb237f5b poll updates 2020-02-09 16:32:18 -08:00
Mario
33be244d8a Merge branch 'patch-1' into 'dev'
Add 'hook call' to be used for new addon 'NavBanner_options'

See merge request hubzilla/core!1827
2020-02-07 11:24:01 +01:00
Voryzen
ca75619518 Add 'hook call' to be used for new addon 'NavBanner_options' 2020-02-07 11:24:01 +01:00
Max Kostikov
82acfb75a1 Merge branch 'dev' into 'dev'
missing piece of poll code

See merge request hubzilla/core!1826
2020-02-05 14:28:27 +01:00
zotlabs
fc9e6d289a missing piece of poll code 2020-01-31 12:51:23 -08:00
Mario
6838342d62 fix php warningà 2020-01-31 10:29:20 +00:00
Mario
69b25e490e Merge branch 'dev' into 'dev'
polls and other backend z6 compat work

See merge request hubzilla/core!1825
2020-01-31 10:34:55 +01:00
zotlabs
b8d7647c48 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-01-30 15:58:36 -08:00
zotlabs
989443a569 basic poll support and patch to not call System::get_platform_name() within t() unless needed. Polls probably need refining and have not yet been fully tested after porting 2020-01-30 15:56:33 -08:00
Max Kostikov
c50a311ff3 Merge branch 'dev' into 'dev'
Prevent multiple database requests on name platform check

See merge request hubzilla/core!1824
2020-01-30 20:39:13 +01:00
Max Kostikov
b37e5a426a Update System.php 2020-01-30 20:36:00 +01:00
Max Kostikov
5e76318e44 Update System.php 2020-01-30 20:28:55 +01:00
Max Kostikov
8ed3971ef0 Prevent multiple database requests on name platform check 2020-01-30 20:18:25 +01:00
Mario
c2b6f0bc28 Merge branch 'dev' into 'dev'
z6 compat work

See merge request hubzilla/core!1822
2020-01-30 20:06:15 +01:00
Zot
2c42daf609 z6 compat work 2020-01-30 20:06:15 +01:00
Mario
8e2446a2fc provide img and zmg tags with image description 2020-01-30 17:24:08 +00:00
Mario
19bb9e0181 zap is storing perms different from hubzilla - revert Lib/Connect to use the hubzilla way. Eventually we might want to streamline this with zap. This will require a DB update to upgrade permissions in abconfig. 2020-01-30 10:12:45 +00:00
zotlabs
e9b2dacb61 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-01-29 14:33:43 -08:00
zotlabs
3df5d854b8 z6 transition work - prevent z6 sync packets from being unpacked into an incompatible schema 2020-01-29 14:29:06 -08:00
Mario
9545a81166 update create_identity() to use Lib/Connect via connect_and_sync() ported from zap 2020-01-26 19:41:52 +00:00
Mario
1712eceaf9 port Lib/Connect and Module/Follow from zap. Connect with new connections via zot6 2020-01-26 15:08:55 +00:00
Mario
7d8c6cb9ed Merge branch 'dev' into 'dev'
bugfix: event_addtocal not preserving original privacy expectation

See merge request hubzilla/core!1820
2020-01-26 13:54:00 +01:00
zotlabs
f123809d29 more work on zap export 2020-01-25 16:24:14 -08:00
Mario
7abcdd34af minor private forum notifications fixes 2020-01-25 14:32:35 +00:00
zotlabs
ead56c59e2 bugfix: event_addtocal not preserving original privacy expectation 2020-01-24 19:38:52 -08:00
zotlabs
19a8dfaa5c Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-01-24 19:38:21 -08:00
Mario
fa45ea1d84 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-01-23 14:25:01 +00:00
Mario
8789edb65d make sure we import the zot6 xchan if we do not have it yet 2020-01-23 14:24:46 +00:00
Max Kostikov
b6abc034cf Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1819
2020-01-22 21:11:27 +01:00
Max Kostikov
c92ea70453 Update hstrings.php 2020-01-22 21:02:46 +01:00
Max Kostikov
07eee20525 Update hmessages.po 2020-01-22 21:02:33 +01:00
Mario
6c9130be46 Merge branch 'dev' into 'dev'
Don't validate domain with PTR record; remove uneccessary CNAME check; add IPv6 check

See merge request hubzilla/core!1818
2020-01-22 20:26:10 +01:00
Mario
51f00cda92 fix typo 2020-01-21 08:55:11 +00:00
Mario
7973567a7c more shortlocalize and bdi tags 2020-01-20 09:30:24 +00:00
Max Kostikov
b81b18814e Don't validate domain with PTR record; remove uneccessary CNAME check; add IPv6 check 2020-01-19 21:55:15 +01:00
Mario
bbfe71b0c6 the address or URL as linktitle should be sufficient 2020-01-18 20:46:52 +00:00
Mario
7404183830 missing update file 2020-01-18 20:13:09 +00:00
Mario
43aea3ce38 we need 24h format 2020-01-18 20:05:05 +00:00
Mario
cbaf4b7536 introduce db_str_to_date() 2020-01-18 20:00:37 +00:00
Mario
570d84c031 fix shortlocalize 2020-01-18 16:04:40 +00:00
Mario
9eeccc087d move mail frontend to addons and remove mail app from system apps 2020-01-18 14:23:23 +00:00
Mario
7404a8ec1a implement bdi tags via bbcode where possible 2020-01-18 14:19:31 +00:00
Mario
bfae86bdb6 more bdi tags 2020-01-18 13:17:37 +00:00
Mario
66f6a1d186 wrap profile names in bdi tags to prevent mastodon-kiddies to mess with the layout 2020-01-18 10:54:53 +00:00
Mario
17a4aa983e $owner in get_feed_for() is the atom rendered channel, for atom_entry we need the owners channel_id though. 2020-01-17 21:31:37 +00:00
Mario
2a0a06d74a some work on zot6 DMs 2020-01-15 21:43:47 +00:00
Mario
ccaa93655a fix typo 2020-01-15 09:48:10 +00:00
Mario
65bc363685 Merge branch 'dev' into 'dev'
event compatibility work

See merge request hubzilla/core!1817
2020-01-15 10:30:02 +01:00
zotlabs
293d411efb Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-01-14 13:34:56 -08:00
zotlabs
2a287e6def event compatibility work 2020-01-14 13:29:45 -08:00
Mario
d96f4340e8 Merge branch 'dev' into 'dev'
Fix wrong URL detection with Markdown support enabled

See merge request hubzilla/core!1816
2020-01-14 10:38:06 +01:00
zotlabs
d3cbbe029c rework activitystreams events - send invite/event activities instead of create/event. Also a first pass at creating a Zap export file from Hubzilla. Much more work is needed before this is functional. 2020-01-12 22:41:28 -08:00
Max Kostikov
a1ccacb825 Fix wrong URL detection with Markdown support enabled 2020-01-12 18:24:59 +01:00
Mario
b04915161b composer update symfony/polyfill-ctype 2020-01-12 09:51:21 +00:00
Mario
8cb968c4b0 composer update sabre/dav 2020-01-12 09:18:07 +00:00
Mario
f645c6f3a5 update cropperjs to the recent version 2020-01-11 10:30:12 +00:00
Mario
4c1c690816 fix markdown test 2020-01-09 14:33:00 +00:00
Mario
537a7cf03d composer updates 2020-01-09 13:34:37 +00:00
Mario
662e8f8a4c Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2020-01-09 08:38:48 +00:00
Mario
7397348b9c Merge branch 'dev' into 'dev'
Add age choice on cached item retrieve

See merge request hubzilla/core!1813
2020-01-09 09:30:36 +01:00
Mario
5c43013692 deal with situations where we do not have an xchan_addr but only an xchan_url 2020-01-09 08:20:01 +00:00
Max Kostikov
908875a052 Update Cache.php 2020-01-06 20:40:18 +01:00
Max Kostikov
41ce2da080 Add age choice on cached item retrieve 2020-01-05 11:49:36 +01:00
Max Kostikov
6add6ce79b Merge branch 'dev' into 'dev'
Fixed es-es/hmessages.po

See merge request hubzilla/core!1812
2019-12-28 22:23:57 +01:00
mjfriaza
0fe9c029ab Fixed es-es/hmessages.po 2019-12-28 19:04:58 +01:00
Max Kostikov
a6522b34c7 Merge branch 'dev' into 'dev'
Update Spanish

See merge request hubzilla/core!1811
2019-12-28 18:47:08 +01:00
mjfriaza
229f99fe6b Update Spanish 2019-12-28 18:17:42 +01:00
Mario
bdc269d445 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-12-28 14:38:06 +00:00
Mario
ff63132a32 pubstream: use search mode for tag filter view and add a title 2019-12-28 14:37:52 +00:00
Max Kostikov
e7fb22edc1 Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1810
2019-12-27 19:38:17 +01:00
Max Kostikov
3c59303b68 Update hstrings.php 2019-12-27 19:25:36 +01:00
Max Kostikov
fb4504c5a3 Update hmessages.po 2019-12-27 19:25:05 +01:00
Mario
db22578c16 re-add german translations for x minutes etc. which were removed in rkor's merge request 2019-12-21 09:49:24 +00:00
Mario
300727b8cf german translation fixes 2019-12-21 09:40:57 +00:00
Mario
448fb14fc4 Merge branch 'dev' into 'dev'
Some translations to German (#1418)

See merge request hubzilla/core!1809
2019-12-21 10:35:32 +01:00
Mario
c42e8613e5 sse: fix new posts only filter broken after aditional results loaded 2019-12-20 09:53:05 +00:00
Robert Kormann
12de30a2b1 German translations related to settings and apps, German context help 2019-12-18 18:27:00 +01:00
Mario
6f93d9848c Disable oembed in directory profile about 2019-12-17 10:53:40 +01:00
Mario
3d019fa2dd Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-12-17 09:33:08 +00:00
Max Kostikov
d5aeb13601 Merge branch 'dev' into 'dev'
Fix possibly unknown author

See merge request hubzilla/core!1808
2019-12-16 21:51:40 +01:00
Mario
230f7ab6d4 sse: remove redundant code 2019-12-16 13:50:43 +00:00
Max Kostikov
d71dd21abc Fix possibly unknown author 2019-12-16 10:23:33 +01:00
Robert Kormann
0d00b72569 Merge branch 'dev' into RKor.Info 2019-12-15 18:11:47 +01:00
Mario
00f6deb9bd remove redundant css 2019-12-15 09:14:51 +00:00
Robert Kormann
cce5054aec German translations of settings and apps elements 2019-12-14 16:46:26 +01:00
Mario
544ef3bc58 update composer libs and minor notifications display fixes 2019-12-12 14:51:10 +00:00
Mario
124cc43962 when ajax loading new posts, always scroll to top first 2019-12-12 09:09:31 +00:00
Max Kostikov
4237dd457e Merge branch 'dev' into 'dev'
missing translation "%d unseen"

See merge request hubzilla/core!1806
2019-12-10 12:34:45 +01:00
zotlabs
88ebbd90d8 missing translation "%d unseen" 2019-12-09 19:43:01 -08:00
Max Kostikov
298acb9645 Merge branch 'dev' into 'dev'
directory: port censoring from zap and disable oembed in profile about

See merge request hubzilla/core!1805
2019-12-09 18:47:55 +01:00
Mario
c4f4edd743 directory: port censoring from zap and disable oembed in profile about 2019-12-09 10:44:44 +00:00
Max Kostikov
258a4e5627 Merge branch 'dev' into 'dev'
Don't show pinned post on single post displaying

See merge request hubzilla/core!1804
2019-12-08 00:22:46 +01:00
Max Kostikov
e1400e5745 Don't show pinned post on single post displaying 2019-12-08 00:18:51 +01:00
Mario
593688d539 Merge branch 'dev' into 'dev'
Add .webp image format support

See merge request hubzilla/core!1802
2019-12-07 20:14:18 +01:00
Max Kostikov
aed6823051 Add .webp image format support 2019-12-07 20:14:17 +01:00
Mario
96f9e51546 sse: encode string instead of replacing quotes in the template, use decodeURIComponent() instead of unescape() which is marked deprecated. 2019-12-07 19:09:19 +00:00
Mario
161ea6d51f sse: initial commit to deal with forum notifications 2019-12-07 13:05:07 +00:00
Max Kostikov
88e755037b Merge branch 'dev' into 'dev'
Unpin pinned item on site admin deletion

See merge request hubzilla/core!1801
2019-12-05 12:43:00 +01:00
Max Kostikov
cde706748a Unpin pinned item on site admin deletion 2019-12-05 12:37:54 +01:00
Max Kostikov
3e833a5bcd Merge branch 'dev' into 'dev'
Add missed break

See merge request hubzilla/core!1800
2019-12-04 21:00:20 +01:00
Max Kostikov
475a39ff90 Add missed break 2019-12-04 20:57:35 +01:00
Max Kostikov
2dd2b755f1 Merge branch 'dev' into 'dev'
Show unpin button in pinned post for owner only

See merge request hubzilla/core!1799
2019-12-04 15:42:48 +01:00
Max Kostikov
a6516341c5 Show unpin button for pinned post for owner only 2019-12-04 15:35:46 +01:00
Max Kostikov
9a70c3c275 Show unpin button for pinned post for owner only 2019-12-04 15:33:53 +01:00
Max Kostikov
5998445841 Merge branch 'dev' into 'dev'
Remove pinned item on every change

See merge request hubzilla/core!1798
2019-12-04 12:01:24 +01:00
Max Kostikov
d9c39d0c41 Remove pinned item on every change 2019-12-04 11:58:42 +01:00
Max Kostikov
4038b78377 Merge branch 'dev' into 'dev'
More pinned items frontend processing fixes

See merge request hubzilla/core!1797
2019-12-04 11:53:37 +01:00
Max Kostikov
dce8516da4 More pinned items frontend processing fixes 2019-12-04 11:50:56 +01:00
Mario
bde429cff6 Merge branch '4.6RC' 2019-12-04 10:25:11 +00:00
Mario
4c8d33d1eb bump version 2019-12-04 10:24:03 +00:00
Mario
fac7826efa update changelog
(cherry picked from commit 295c08fcf3)
2019-12-04 11:22:56 +01:00
Max Kostikov
d439dee736 Merge branch 'dev' into 'dev'
Fix switching pinned items

See merge request hubzilla/core!1796
2019-12-04 11:16:36 +01:00
Mario
295c08fcf3 update changelog 2019-12-04 10:14:28 +00:00
Max Kostikov
efa11cbc74 Update pinned item markup 2019-12-04 11:13:33 +01:00
Max Kostikov
4a8e222763 Fix update pin / unpin button text on pinned item replace 2019-12-04 11:11:39 +01:00
Max Kostikov
75b9c7d6b8 Fix variables for unpin button 2019-12-04 10:21:03 +01:00
Max Kostikov
d1648fb258 Remove square 2019-12-04 10:12:29 +01:00
Max Kostikov
34cda095fe Remove square 2019-12-04 10:10:39 +01:00
Max Kostikov
dad7bc82c3 Merge branch 'dev' into 'dev'
Ad unpin button for pinned content and fix unpin on unpinned item drop

See merge request hubzilla/core!1795
2019-12-04 10:07:09 +01:00
Max Kostikov
0ee65ee954 Merge branch 'dev' into 'dev'
# Conflicts:
#   Zotlabs/Widget/Pinned.php
#   view/js/main.js
#   view/tpl/conv_item.tpl
#   view/tpl/pinned_item.tpl
2019-12-04 10:03:55 +01:00
Max Kostikov
ae0780fe3f Unpin only pinned items on item drop 2019-12-04 09:58:16 +01:00
Max Kostikov
d2a65ab1be Remove hint for pin button 2019-12-04 09:50:31 +01:00
Max Kostikov
f4516826ef Add unpin button for pinned item 2019-12-04 09:49:32 +01:00
Max Kostikov
b894380f86 Add unpin button for pinned item 2019-12-04 09:49:05 +01:00
M. Dent
b48a9d3f75 Merge branch 'dev' into 'dev'
Add content pinning support

See merge request hubzilla/core!1794
2019-12-04 03:44:25 +01:00
Max Kostikov
21b398252a Add content pinning support 2019-12-04 03:44:24 +01:00
Max Kostikov
80e03268fd Fix show share menu option for pinned post 2019-12-03 23:35:19 +01:00
Max Kostikov
135b3cf1ef Fix hide pinned post button for unauthenticated viewer 2019-12-03 17:17:06 +01:00
Max Kostikov
b9e083da61 Add layout for hiding pinned content and its processing 2019-12-03 16:58:46 +01:00
Max Kostikov
74aa446190 Add hiding pinned content 2019-12-03 16:56:24 +01:00
Max Kostikov
0d7548a381 Add hiding pinned content 2019-12-03 16:55:32 +01:00
Max Kostikov
428b2cca21 Minor pinned content processing fixes 2019-12-03 16:44:27 +01:00
Max Kostikov
28a316f73f Normalize SQL query 2019-12-03 10:33:46 +01:00
Max Kostikov
0532d639c2 Optimize pinned item verbs based activity processing 2019-12-03 10:26:49 +01:00
Max Kostikov
c17717c5db Remove debug logging 2019-12-03 10:14:49 +01:00
Max Kostikov
8b00913579 Show poll results in pinned items 2019-12-03 00:24:04 +01:00
Max Kostikov
cf95c4878d Add poll results in pinned item layout 2019-12-03 00:23:02 +01:00
Max Kostikov
4958e3b42c Unpin item on drop 2019-12-02 17:07:12 +01:00
Max Kostikov
cc3edeb6f5 Fix unique HTML elements id 2019-12-02 15:09:15 +01:00
Max Kostikov
20c296ce53 Add scroll to pinned item before removal 2019-12-01 16:30:16 +01:00
Max Kostikov
5ccbcb44f7 Add pinned content on channel page 2019-12-01 15:52:57 +01:00
Max Kostikov
adcf28af7c Add Russian strings for pinned content 2019-12-01 15:41:28 +01:00
Max Kostikov
5b206cd4a7 Add Russian strings for pinned content 2019-12-01 15:41:10 +01:00
Max Kostikov
1eb70b66d8 Add missed semicolon 2019-12-01 15:37:06 +01:00
Max Kostikov
3c1ff1fc63 Add base64 mids array 2019-12-01 15:22:38 +01:00
Max Kostikov
d711f2ad4c Add b64mids to support current JS 2019-12-01 15:21:32 +01:00
Max Kostikov
ae8a1c992a Formatting 2019-12-01 14:28:26 +01:00
Max Kostikov
580d3db5a8 Add pinned content widget 2019-12-01 14:26:18 +01:00
Max Kostikov
042cc96968 Add pinning processing module 2019-12-01 14:21:08 +01:00
Max Kostikov
d177043c9f Add pinned item layout 2019-12-01 14:17:32 +01:00
Max Kostikov
4c1e2c2dd8 Fix missprint 2019-12-01 14:12:52 +01:00
Max Kostikov
7dcb0cc11b Add pinning processing 2019-12-01 14:10:47 +01:00
Max Kostikov
837d9a4df0 Add pinnig controls to item layout 2019-12-01 14:08:19 +01:00
Max Kostikov
ec1d5ead93 Add description for system.pin_types variable 2019-12-01 14:06:14 +01:00
Max Kostikov
f485ed174d Add pinned items controls 2019-12-01 14:00:10 +01:00
Max Kostikov
e8560d56f5 Add pinned items strings 2019-12-01 13:56:52 +01:00
Max Kostikov
3a937fb969 Add pinned items JS strings 2019-12-01 13:55:51 +01:00
Mario
c1aa96ebf7 sse: template fixes, fix missing forum notifications and minor impovements 2019-11-29 19:46:13 +00:00
Mario
17e012afc6 remove logging 2019-11-29 15:31:46 +00:00
Mario
1c6796f907 sse: possible fix for race condition and fix notification count if we loaded unseen items but their notifications were not yet loaded 2019-11-29 15:30:58 +00:00
DM42.Net Hubzilla Development
3e133bbfa3 Move auto_save_draft to header from thread comment
(cherry picked from commit c86b35da70)
2019-11-28 09:42:59 +01:00
Max Kostikov
6c8d1bdffe Update CHANGELOG
(cherry picked from commit 9284b60a79)
2019-11-28 09:42:00 +01:00
Max Kostikov
59fc495593 Update Russian hstrings.php
(cherry picked from commit b69f8a3f29)
2019-11-28 09:41:40 +01:00
Max Kostikov
60827bdcc4 Update Russian hmessages.po
(cherry picked from commit 8ea7c08f43)
2019-11-28 09:41:19 +01:00
Mario
f2c73c0f45 Merge branch 'fix-listmode-spinner' into 'dev'
Move auto_save_draft to header from thread comment

See merge request hubzilla/core!1793
2019-11-28 09:30:57 +01:00
Mario
78492d0037 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-11-28 08:23:13 +00:00
Mario
2b08519f5a sse: improve caching fix an issue with removing notifications and move chatpresence expiration to cron 2019-11-28 08:22:53 +00:00
DM42.Net Hubzilla Development
c86b35da70 Move auto_save_draft to header from thread comment 2019-11-28 00:27:12 -05:00
Max Kostikov
b2003e2c3c Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1791
2019-11-25 22:32:53 +01:00
Max Kostikov
8a08cceccb Update CHANGELOG 2019-11-25 22:32:39 +01:00
Max Kostikov
9284b60a79 Update CHANGELOG 2019-11-25 22:25:44 +01:00
Max Kostikov
b69f8a3f29 Update Russian hstrings.php 2019-11-25 22:22:37 +01:00
Max Kostikov
8ea7c08f43 Update Russian hmessages.po 2019-11-25 22:22:17 +01:00
Max Kostikov
78197aa625 Merge branch 'dev' into 'dev'
Dev sync

See merge request kostikov/core!6
2019-11-25 22:20:49 +01:00
Mario
f992feb71c update changelog
(cherry picked from commit fcb065bcb2)
2019-11-25 22:06:59 +01:00
Mario
fcb065bcb2 update changelog 2019-11-25 21:06:12 +00:00
Mario
cf66e66db8 Merge branch '4.6RC' of https://framagit.org/hubzilla/core into 4.6RC 2019-11-25 21:03:35 +00:00
Max Kostikov
63aa3948e5 resolve merge conflict 2019-11-25 21:03:22 +00:00
Mario
3940fa5659 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-11-25 21:00:24 +00:00
Max Kostikov
7899ed6f69 Revert "Add daily cached embedded content cleanup"
This reverts commit 5c47c9ed95

(cherry picked from commit 38de059156)
2019-11-25 21:58:36 +01:00
Max Kostikov
5e44239657 Add daily cached embedded content cleanup
(cherry picked from commit 5c47c9ed95)
2019-11-25 21:58:18 +01:00
Mario
697fbf33c5 Merge branch 'dev' into 'dev'
Fix once cached embedded content is used and stored forever

See merge request hubzilla/core!1790
2019-11-25 21:50:03 +01:00
Max Kostikov
901785663e Fix once cached embedded content is used and stored forever 2019-11-25 21:50:02 +01:00
Max Kostikov
9e4ff8ce25 Update system.object_cache_days default value 2019-11-25 17:52:21 +01:00
Max Kostikov
5f1b2b4bf7 Use cached embedded content use up to 30 days by default 2019-11-25 17:51:28 +01:00
Max Kostikov
271d280c91 Fix orthography 2019-11-25 14:37:45 +01:00
Max Kostikov
8f708fef9c Add daily expired cached embedded content cleanup 2019-11-25 14:35:03 +01:00
Max Kostikov
38de059156 Revert "Add daily cached embedded content cleanup"
This reverts commit 5c47c9ed95
2019-11-25 14:32:58 +01:00
Max Kostikov
f0b40ac15e Add system.object_cache_days variable description 2019-11-25 14:27:36 +01:00
Max Kostikov
5c47c9ed95 Add daily cached embedded content cleanup 2019-11-25 14:16:07 +01:00
Max Kostikov
dafac11aaa Remove move unused cache cleanup to cron 2019-11-25 14:08:29 +01:00
Max Kostikov
1fc81457a1 Use cached embeds for a week by default 2019-11-25 14:07:39 +01:00
Mario
0d47bb6878 remove sysmsg and sysmsg_info from session - those are now stored in xconfig (sse) 2019-11-25 12:59:16 +00:00
Mario
17cd452fff changelog
(cherry picked from commit f6f7e7e8d2)
2019-11-25 12:33:36 +01:00
Mario
f6f7e7e8d2 changelog 2019-11-25 11:32:22 +00:00
Mario
004861fbb7 merge opengraph fixes from dev 2019-11-25 08:41:34 +00:00
Mario
483d450af4 sse: use fadeOut() to be consistent 2019-11-23 20:47:34 +00:00
Mario
decc14c324 sse: more cleanup 2019-11-23 20:41:20 +00:00
Mario
1134be8d30 sse: improve handling of notification status and major cleanup 2019-11-23 20:20:13 +00:00
Mario
fb65c54123 sse: minor improvements 2019-11-23 13:33:46 +00:00
Mario
fe803135d8 sse: fix another regression 2019-11-22 21:01:54 +00:00
Mario
908ebed9fd sse: remove some logging 2019-11-22 20:55:52 +00:00
Mario
bdb6b0d237 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-11-22 20:52:55 +00:00
Mario
73a0866ac4 sse: fix a regression where not all appearances of an notification were looped through and fix format_notify() to not look for the parent item anymore 2019-11-22 20:52:22 +00:00
Max Kostikov
e6b1b20565 Add space after comma in connection accepted interactions list 2019-11-22 19:28:37 +01:00
Max Kostikov
e40ea62c7c Add space after comma in connection accepted interactions list 2019-11-22 19:24:40 +01:00
Max Kostikov
7864579b1e Add space after comma in connection accepted interactions list 2019-11-22 19:20:02 +01:00
Mario
b62eb665c5 sse: store the item mid plus reactions mids in data-mids and change functions accordingly 2019-11-22 14:11:26 +00:00
Mario
c72716eca7 missing closing tags 2019-11-22 14:08:53 +00:00
Mario
530d816df6 Merge branch 'better-conn-status' into 'dev'
More descriptive connection status icons

See merge request hubzilla/core!1789
2019-11-22 14:59:46 +01:00
M. Dent
23c47f78ea More descriptive connection status icons 2019-11-22 14:59:45 +01:00
Manuel Jiménez Friaza
8727f12b18 no mention notifications from mastodon (and pleroma)
(cherry picked from commit ea235c0c67)


(cherry picked from commit 0159b631fc)
2019-11-21 14:49:59 +01:00
Mario
4a4c43bb2c Merge branch 'cherry-pick-cc1cca5e' into 'dev'
Cherry pick cc1cca5e

See merge request hubzilla/core!1788
2019-11-21 14:47:20 +01:00
Manuel Jiménez Friaza
0159b631fc no mention notifications from mastodon (and pleroma)
(cherry picked from commit ea235c0c67)
2019-11-21 14:47:20 +01:00
Mario
e74361c4db sse: introduce sse_updateNotifications() to be able to update the notifications from different places 2019-11-20 18:38:25 +00:00
Mario
21299c6fc1 sse: defins sse_mids as array and comment out logging of dismissed notifications 2019-11-19 09:39:09 +00:00
Mario
eec42d3bb3 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-11-19 09:33:13 +00:00
Mario
bd049eddd4 sse: fix notifications visible for loaded items when the items were loaded before the notifications 2019-11-19 09:33:00 +00:00
Max Kostikov
e762347080 Merge branch 'dev' into 'dev'
Remove duplicate Opengraph creation

See merge request hubzilla/core!1786
2019-11-18 20:36:46 +01:00
Max Kostikov
53ad04cdc4 Remove duplicate Opengraph creation 2019-11-18 20:33:55 +01:00
Max Kostikov
148c3f9dc5 Merge branch 'dev' into 'dev'
Better Opengraph markup for posts

See merge request hubzilla/core!1785
2019-11-18 15:58:35 +01:00
Max Kostikov
6f1188f44f Update Articles.php 2019-11-18 15:52:59 +01:00
Max Kostikov
78868314a7 Use channelx array on Opengraph markup procedure 2019-11-18 15:47:03 +01:00
Max Kostikov
dc2f293089 Update opengraph.php 2019-11-18 15:42:14 +01:00
Max Kostikov
c7a0526428 Move back Opengraph markup creation to init stage 2019-11-18 15:40:51 +01:00
Max Kostikov
498c021aec Merge branch 'dev' into 'dev'
Dev sync

See merge request kostikov/core!5
2019-11-18 13:00:43 +01:00
Max Kostikov
5ee133843f Remove base64 decode check on Opengraph tags create 2019-11-18 12:55:09 +01:00
Max Kostikov
9ad2902add Remove unnecessary brackets 2019-11-18 12:55:02 +01:00
Mario
ef75d27afb cleanup local and session storage on channel change or logout 2019-11-15 21:12:40 +00:00
Mario
965c51c2d4 sse: implement notifications for anonymous visitors (info, notice and pubs) and fix a potential memory leak 2019-11-15 20:29:58 +00:00
Mario
05604e4bd2 onepoll: do not update dead feeds
(cherry picked from commit 5a6b14f878)
2019-11-15 11:03:54 +01:00
Mario
fd7d497cd1 make inline pdf a security option, move thumbnail security to security options from admin/site
(cherry picked from commit de9a7f0fa9)
2019-11-15 11:03:38 +01:00
Mario
a974d0d52d AP fixes
(cherry picked from commit 3009c88d24)
2019-11-15 11:02:55 +01:00
Mario
5a6b14f878 onepoll: do not update dead feeds 2019-11-15 10:01:21 +00:00
Mario
de9a7f0fa9 make inline pdf a security option, move thumbnail security to security options from admin/site 2019-11-15 09:55:44 +00:00
Mario
3009c88d24 AP fixes 2019-11-15 09:43:39 +00:00
Mario
c850a61a89 check if file exists
(cherry picked from commit 52bd27a028)
2019-11-13 16:26:57 +01:00
Mario
f3fa2d853a sse: make sure we have an observer 2019-11-13 14:30:54 +00:00
Mario
a982aecd5b sse: revert to reset to array 2019-11-13 13:51:00 +00:00
Mario
52bd27a028 check if file exists 2019-11-13 13:40:40 +00:00
Mario
e5e16da8cb sse: reset to empty string instead of empty array 2019-11-13 13:26:28 +00:00
zotlabs
3a2fdec241 wildcard tag issue
(cherry picked from commit 2f4c619d51)
2019-11-13 08:57:12 +01:00
Mario
b0adb70ffc Merge branch 'dev' into 'dev'
wildcard tag issue

See merge request hubzilla/core!1784
2019-11-13 08:56:27 +01:00
zotlabs
2f4c619d51 wildcard tag issue 2019-11-12 20:25:25 -08:00
Mario
6e36820b1b sse: do not delete xconfig - reset it 2019-11-12 21:15:01 +00:00
Mario
209d06a8f7 better detection for who to send sys notifications (needs addons update) 2019-11-12 10:11:58 +00:00
Max Kostikov
4a6d050e22 Merge branch 'sse_merge_core' into 'dev'
sse notifications

See merge request hubzilla/core!1783
2019-11-11 21:30:38 +01:00
Mario
b033597ada sse notifications 2019-11-11 21:30:38 +01:00
Mario
08b804cd2d use minified version of jquery
(cherry picked from commit 89342ca9fb)
2019-11-11 11:17:42 +01:00
Mario
89342ca9fb use minified version of jquery 2019-11-11 10:17:03 +00:00
Mario
892f4b4182 bump version 2019-11-11 08:20:30 +00:00
Mario
de7891771d update strings 2019-11-11 08:14:42 +00:00
Mario
602768209b bump version 2019-11-11 08:06:44 +00:00
Mario
73b1f8fcdd Merge branch 'cherry-pick-1affcb80' into 'dev'
fix language tests

See merge request hubzilla/core!1782
2019-11-10 14:21:13 +01:00
Mario
e1b923ab7d Merge branch 'cherry-pick-6685381f' into 'dev'
another bulk of composer updates

See merge request hubzilla/core!1781
2019-11-10 14:18:18 +01:00
Mario
bed9876d68 Merge branch 'cherry-pick-9ad4c652' into 'dev'
hopefully fix query for postgres

See merge request hubzilla/core!1780
2019-11-10 14:17:58 +01:00
Mario
d184e2708f fix language tests
(cherry picked from commit 1affcb80172576dc46e4434cd10e1a534a9bb6c2)
2019-11-10 14:10:51 +01:00
Mario
580c3f4ffe another bulk of composer updates
(cherry picked from commit 6685381fd8db507493c3d7c1793f8c05c681bbce)
2019-11-10 14:10:03 +01:00
Mario
158b8aea38 hopefully fix query for postgres
(cherry picked from commit 9ad4c6528cc3ee4e34d2b5d77027a1c33cbadf5c)
2019-11-10 12:02:12 +01:00
Max Kostikov
d22766f458 Merge branch 'cherry-pick-971e7eef' into 'dev'
remove some old unused javascript libraries

See merge request hubzilla/core!1779
2019-11-10 11:55:05 +01:00
Max Kostikov
70391243dc Merge branch 'cherry-pick-b444bf59' into 'dev'
update jquery to version 3.4.1

See merge request hubzilla/core!1778
2019-11-10 11:54:43 +01:00
Mario
61eef68ff3 Ãremove some old unused javascript libraries
(cherry picked from commit 971e7eef9c415a2ce82eb0cd22eaabee12ae719c)
2019-11-10 09:59:22 +01:00
Mario
41cc2854c5 update jquery to version 3.4.1
(cherry picked from commit b444bf59560b3d918aa13b52035c602b03e8d013)
2019-11-10 09:58:18 +01:00
Max Kostikov
ec68ede79f Merge branch 'dev' into 'dev'
Dev sync

See merge request kostikov/core!4
2019-11-08 23:39:04 +01:00
Max Kostikov
478014f02a Better BBcode to Markdown conversion 2019-11-08 23:35:05 +01:00
M. Dent
aff7c2d771 Merge branch 'dev' into 'dev'
exempt svg from tag completion

See merge request hubzilla/core!1777
2019-11-08 23:30:30 +01:00
zotlabs
00dd52317a Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-11-08 13:10:24 -08:00
zotlabs
17522b31e9 exempt svg from tag completion 2019-11-08 13:07:42 -08:00
Max Kostikov
163b1ee9f8 Merge branch 'cherry-pick-fa437b79' into 'dev'
more fix date header format

See merge request hubzilla/core!1776
2019-11-08 21:35:06 +01:00
Mario
7b9a992f83 more fix date header format
(cherry picked from commit fa437b7977ba7fffd7368fa5c75e3d57fbf75424)
2019-11-08 21:27:43 +01:00
Max Kostikov
4efb258671 Merge branch 'cherry-pick-bb11cd15' into 'dev'
fix date header format

See merge request hubzilla/core!1775
2019-11-08 21:26:54 +01:00
Mario
7532358806 fix date header format
(cherry picked from commit bb11cd15d147ebbcc90b544788c9c2ef4925daa5)
2019-11-08 21:13:58 +01:00
Max Kostikov
13c05e7937 Merge branch 'dev' into 'dev'
Do not trim a sufficiently shortened Opengraph description

See merge request hubzilla/core!1774
2019-11-08 18:13:52 +01:00
Max Kostikov
c6e9bca76c Merge branch 'cherry-pick-2df15f35' into 'dev'
update composer libs

See merge request hubzilla/core!1773
2019-11-08 18:13:27 +01:00
Max Kostikov
3706afbd01 Do not trim a sufficiently shortened Opengraph description 2019-11-08 16:19:08 +01:00
Mario
bcd0802ea4 update composr libs
(cherry picked from commit 2df15f35d706d4608ff723ce6288391ca774f7ba)
2019-11-08 10:47:28 +01:00
Mario
9360148829 Merge branch 'dev' into 'dev'
svg stuff

See merge request hubzilla/core!1772
2019-11-08 10:47:00 +01:00
Zot
a6165c00ce svg stuff 2019-11-08 10:47:00 +01:00
zotlabs
a5826fec25 svg stuff 2019-11-07 14:51:29 -08:00
zotlabs
839c6668cf Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-11-07 14:48:44 -08:00
Max Kostikov
e9a9fc5050 Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1771
2019-11-07 14:24:19 +01:00
Max Kostikov
426668cd2e Update hstrings.php 2019-11-07 14:14:41 +01:00
Max Kostikov
926d7c56a6 Update hmessages.po 2019-11-07 14:13:29 +01:00
Mario
9934dbfe69 Merge branch 'dev' into 'dev'
Sanitize title on Atom/RSS feed import

See merge request hubzilla/core!1770
2019-11-07 09:14:51 +01:00
Max Kostikov
b6314c109d Sanitize title on Atom/RSS feed import 2019-11-07 09:14:51 +01:00
Max Kostikov
f8955f90b8 Move title sanitizer code in the right place 2019-11-06 16:14:57 +01:00
Max Kostikov
9248fc96b3 Formatting 2019-11-06 16:11:10 +01:00
Max Kostikov
2875ee2423 Update feedutils.php 2019-11-06 16:08:36 +01:00
Max Kostikov
36f707b25e Sanitize title on Atom/RSS feed import 2019-11-06 16:07:04 +01:00
M. Dent
2a05bd9ed6 Merge branch 'cherry-pick-7cc8c2d1' into 'dev'
port fixes from zap to check for arrays

See merge request hubzilla/core!1767
2019-11-06 04:13:57 +01:00
M. Dent
b7db9944ec Merge branch 'cherry-pick-3604220c' into 'dev'
add date and request target headers to make pixelfed happy

See merge request hubzilla/core!1768
2019-11-06 04:11:12 +01:00
M. Dent
86f7d08483 Merge branch 'dev' into 'dev'
Prefer use Etag on photo modification validation

See merge request hubzilla/core!1769
2019-11-06 04:10:16 +01:00
zotlabs
1358a81c32 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-11-04 14:26:12 -08:00
Max Kostikov
09ad48c12b Prefer use Etag on photo modification validation 2019-11-04 21:44:42 +01:00
M. Dent
aa137fb2d2 Merge branch 'cherry-pick-4cfb9658' into 'dev'
fix duplicate attachment and regression with audio file upload

See merge request hubzilla/core!1766
2019-11-04 20:01:14 +01:00
M. Dent
09284d512d Merge branch 'cherry-pick-03317b98' into 'dev'
fix query with protocol prefix not always picking the right xchan

See merge request hubzilla/core!1765
2019-11-04 19:58:01 +01:00
Mario
02fd7e51ff add date and request target headers to make pixelfed happy
(cherry picked from commit 3604220c2a5aedddf25143cc5fd87ed576d34702)
2019-11-04 13:04:28 +01:00
Mario
b359b89aa1 port fixes from zap to check for arrays
(cherry picked from commit 7cc8c2d127b09b7e53c7916c6ea104fa566971db)
2019-11-04 13:03:00 +01:00
Mario
873b20677e fix duplicate attachment and regression with audio file upload
(cherry picked from commit 4cfb965881df2be181aab6020c9df78c0a86fd9f)
2019-11-04 10:34:24 +01:00
Mario
a049664219 fix query with protocol prefix not always picking the right xchan
(cherry picked from commit 03317b9864c0d7c99e144404c647b9923d8d29ea)
2019-11-04 09:39:56 +01:00
Max Kostikov
64c6e25896 Merge branch 'cherry-pick-4a1c2208' into 'dev'
fix issue #1402

See merge request hubzilla/core!1764
2019-11-03 14:03:00 +01:00
Mario
9f9122ab8e fix issue #1402
(cherry picked from commit 4a1c2208866360b5fe54eea71ff8e62bd6d63045)
2019-11-03 11:15:12 +01:00
Mario
d0661cd4a3 Merge branch 'commentsclosed-hook' into 'dev'
Add hook to comments_are_now_closed()

See merge request hubzilla/core!1763
2019-11-03 10:12:12 +01:00
M. Dent
707b19dc35 Add hook to comments_are_now_closed() 2019-11-03 10:12:11 +01:00
Max Kostikov
6fd15d66a7 Merge branch 'dev' into 'dev'
Change llink type in default SQL schema

See merge request hubzilla/core!1761
2019-11-02 10:42:02 +01:00
Max Kostikov
8c9a814e18 Merge branch 'homeinstall_fix_addons' into 'dev'
homeinstall fix addons

See merge request hubzilla/core!1762
2019-11-02 10:37:59 +01:00
Max Kostikov
74ef5f38e9 Fix start time to sync queries on photo cache purge 2019-11-02 10:36:04 +01:00
root
624a3ee1a7 homeinstall fix addons 2019-11-01 23:01:42 +01:00
Max Kostikov
fc658a25d7 Update schema_mysql.sql 2019-11-01 19:37:46 +01:00
Max Kostikov
308619a726 Drop llink index 2019-11-01 17:47:16 +01:00
Max Kostikov
e87d8d9856 Change llink column type and drop index 2019-11-01 17:46:28 +01:00
Max Kostikov
7594264725 Merge branch 'dev' into 'dev'
Better photo cache expiry processing

See merge request hubzilla/core!1760
2019-11-01 10:49:19 +01:00
Max Kostikov
69533ce8f5 Add missed interval in SQL query 2019-11-01 10:46:49 +01:00
Max Kostikov
9fac43a3a3 Better photo cache expiry processing 2019-11-01 10:34:02 +01:00
Max Kostikov
b00db39739 Merge branch 'dev' into 'dev'
Better cached photos processing

See merge request hubzilla/core!1759
2019-10-26 12:30:41 +02:00
Max Kostikov
6f2a584279 Update Photo.php 2019-10-26 12:24:23 +02:00
Max Kostikov
de717268f7 Better cached photos processing 2019-10-26 12:22:09 +02:00
Mario
e27b19c756 fix hardcoded code/pre css in mod admin
(cherry picked from commit cddf6c4ff51580f3dec5d32eef06a40a473a9202)
2019-10-22 13:29:52 +02:00
Mario
045cb461f1 fix encoding issue
(cherry picked from commit 067010fc0a5a6c10825b869b822c9cfbb3d4516b)
2019-10-22 10:39:54 +02:00
Max Kostikov
088c0eedc6 Merge branch 'patch-1' into 'dev'
add japanese translation

See merge request hubzilla/core!1752
2019-10-19 23:28:58 +02:00
harukin
e5137b03fc Update view/ja/hstrings.php 2019-10-19 18:41:58 +02:00
harukin
76d34a4d74 Update view/ja/hmessages.po, view/ja/hstrings.php files 2019-10-17 17:57:23 +02:00
Max Kostikov
ae4f0e5728 Merge branch 'dev' into 'dev'
Fix channel address in follow link

See merge request hubzilla/core!1757
2019-10-15 22:39:18 +02:00
Max Kostikov
5df59027ad Fix channel address in follow link 2019-10-15 22:37:03 +02:00
Max Kostikov
c888e33f04 Merge branch 'dev' into 'dev'
Better Opengraph image type detection

See merge request hubzilla/core!1756
2019-10-15 14:11:21 +02:00
Max Kostikov
1a56ecaa39 Update opengraph.php 2019-10-15 14:04:24 +02:00
Max Kostikov
d778c3cf19 Better Opengraph image type detection 2019-10-15 14:03:41 +02:00
Max Kostikov
8bf57c6226 Merge branch 'dev' into 'dev'
Dev

See merge request hubzilla/core!1755
2019-10-15 14:00:21 +02:00
Max Kostikov
3c762b8809 Fix cache-control syntax for photos 2019-10-15 13:49:46 +02:00
Max Kostikov
3561fd7c43 Merge branch 'dev' into 'dev'
Sync dev

See merge request kostikov/core!3
2019-10-15 13:48:07 +02:00
Max Kostikov
66bfc0ec64 Merge branch 'patch-20191014' into 'dev'
Updates to zcard/profile images and other public images to account for infrastructure caches (CDN)

See merge request hubzilla/core!1754
2019-10-14 22:28:48 +02:00
M. Dent
7d0e576e3b Updates to zcard/profile images and other public images to account for infrastructure caches (CDN) 2019-10-14 22:28:48 +02:00
Max Kostikov
aa330bc8c7 Merge branch 'dev' into 'dev'
Better plural function detection

See merge request hubzilla/core!1753
2019-10-14 11:16:12 +02:00
Max Kostikov
b4de492e0d Merge branch 'dev' into 'dev'
Dev

See merge request kostikov/core!2
2019-10-14 11:11:48 +02:00
Max Kostikov
5bf3114e6f Better plural function detection 2019-10-14 11:09:53 +02:00
harukin
d2b1a2e5a3 Upload .php file 2019-10-14 03:39:43 +02:00
harukin
4b01f6359b Upload .po file 2019-10-14 03:39:05 +02:00
harukin
bcfa62f45a japanese translation directory 2019-10-14 03:34:24 +02:00
Mario
e7e8a2ca5f Merge branch 'dev' into 'dev'
Better Opengraph markup

See merge request hubzilla/core!1751
2019-10-13 14:27:54 +02:00
Max Kostikov
5edeb0250b Revert "Remove visible channels list from pubstream tags cloud creation procedure"
This reverts commit 5c4c6e68f6
2019-10-13 14:27:54 +02:00
Max Kostikov
0c2657df78 Add Opengraph image type detection 2019-10-12 23:42:35 +02:00
Max Kostikov
e4c57e8031 Update opengraph.php 2019-10-12 21:22:42 +02:00
Max Kostikov
6a25548097 Update Channel.php 2019-10-12 19:26:17 +02:00
Max Kostikov
db7cbdfc44 Add Opengraph markup for articles 2019-10-12 19:23:14 +02:00
Max Kostikov
2f26badb84 Move Opengraph functions to common libraries 2019-10-12 19:05:20 +02:00
Max Kostikov
f7e665c42f Add Opengraph function 2019-10-12 19:03:21 +02:00
Max Kostikov
3bc44ee451 Minor Opengraph improvements 2019-10-11 19:29:40 +02:00
Max Kostikov
125de855ef Add Opengraph og:type object 2019-10-11 09:55:06 +02:00
Max Kostikov
3881ebcce0 Better Opengraph markup for channel 2019-10-11 00:46:02 +02:00
M. Dent
bef5324fea Merge branch 'cherry-pick-cac0672a' into 'dev'
issue #1401

See merge request hubzilla/core!1750
2019-10-08 14:26:17 +02:00
Mario Vavti
c2655370e0 issue #1401
(cherry picked from commit cac0672a49cd710b3eced1d66f1bfb18747ddbf8)
2019-10-08 11:28:36 +02:00
Max Kostikov
d017e34795 Merge branch 'dev' into 'dev'
Dev sync

See merge request kostikov/core!1
2019-10-06 19:26:23 +02:00
Max Kostikov
aa44da35ba Revert "Remove visible channels list from pubstream tags cloud creation procedure"
This reverts commit 5c4c6e68f6
2019-10-06 19:24:28 +02:00
Max Kostikov
5c4c6e68f6 Remove visible channels list from pubstream tags cloud creation procedure 2019-10-06 12:02:45 +02:00
Max Kostikov
a435363b94 Merge branch 'cherry-pick-d8b8d8ce' into 'dev'
fix zap->hubzlla event title compatibility

See merge request hubzilla/core!1749
2019-10-06 11:18:35 +02:00
Mario Vavti
d6634eb14e fix zap->hubzlla event title compatibility
(cherry picked from commit d8b8d8ceb5cc9d701f91dac26834af15f3257cce)
2019-10-05 22:04:23 +02:00
Mario
afee2cf71a Merge branch 'dev' into 'dev'
Allow addons to process forum posts published through mentions

See merge request hubzilla/core!1745
2019-10-05 10:31:47 +02:00
Max Kostikov
79b0a6ba9c Allow addons to process forum posts published through mentions 2019-10-05 10:31:47 +02:00
Mario
0c2438b36a Merge branch 'cherry-pick-79bcc157' into 'dev'
fix bbcode event reshare timezone issue

See merge request hubzilla/core!1747
2019-10-05 10:31:26 +02:00
Mario
d6da46f94b Merge branch 'dev' into 'dev'
another timezone fix

See merge request hubzilla/core!1748
2019-10-05 10:31:11 +02:00
Zot
562e39c9c5 another timezone fix 2019-10-05 10:31:11 +02:00
zotlabs
2d08e0955a Merge branch 'dev' of https://framagit.org/zot/core into dev 2019-10-04 14:31:21 -07:00
zotlabs
baffa969d3 another timezone fix 2019-10-04 14:28:31 -07:00
Mario Vavti
1fbc8739b9 fix bbcode event reshare timezone issue
(cherry picked from commit 79bcc157bf8f0c67a8ee41ae9c53a9dec969f8d1)
2019-10-04 09:25:39 +02:00
zotlabs
b9dec84489 fix event timezones for zot6 2019-10-03 22:16:11 -07:00
Max Kostikov
6feb864c38 Allow processing of forum posts through mentions in addons 2019-10-03 18:28:29 +02:00
Max Kostikov
b6db1898b1 Get extended channel info using channelx_by_hash() 2019-10-03 18:27:25 +02:00
Max Kostikov
de902d179e Allow processing of forum posts through mentions in addons 2019-10-03 18:25:57 +02:00
Max Kostikov
58b77e3427 Merge branch 'cherry-pick-2c7ed093' into 'dev'
fix missing summary in mod article_edit

See merge request hubzilla/core!1744
2019-10-02 11:43:41 +02:00
Mario Vavti
cdcac86256 fix missing summary in mod article_edit
(cherry picked from commit 2c7ed093699ea0c0f68068fdd8a035454b9a76a3)
2019-10-02 11:05:24 +02:00
Mario
79b05e48e8 Merge branch 'dev' into 'dev'
Add 'Connect' button for not connected at this location channels

See merge request hubzilla/core!1743
2019-10-01 11:15:29 +02:00
Max Kostikov
541146e8ce Add 'Connect' button for not connected at this location channels 2019-10-01 11:15:29 +02:00
Max Kostikov
97b161c536 Merge branch 'dev' into 'dev'
Fix empty string quotation; remove trailing spaces

See merge request hubzilla/core!1742
2019-09-30 16:54:35 +02:00
Max Kostikov
ba3a6ecb52 Fix empty string quotation; remove trailing spaces 2019-09-30 16:50:24 +02:00
Mario
cf27b7440d Merge branch 'dev' into 'dev'
Sync private items with clones; avoid sync if no local connection with thread owner

See merge request hubzilla/core!1739
2019-09-30 16:19:39 +02:00
Max Kostikov
407b9c9cd7 Sync private items with clones; avoid sync if no local connection with thread owner 2019-09-30 16:19:39 +02:00
Mario
d0055310ba Merge branch 'dev' into 'dev'
issue with bearcap tests

See merge request hubzilla/core!1738
2019-09-28 10:36:38 +02:00
zotlabs
02f5fa32af Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-09-26 18:36:06 -07:00
zotlabs
b6590e95b5 issue with bearcap tests 2019-09-26 18:34:08 -07:00
M. Dent
ec65211d54 Merge branch 'admindoc' into 'dev'
Improve admin documentation

See merge request hubzilla/core!1737
2019-09-24 23:36:32 +02:00
Ale Abdo
8dfa08f146 Improve admin documentation 2019-09-24 15:37:47 +02:00
M. Dent
daef2d0546 Merge branch 'dev' into 'dev'
Update plink type for MySQL schema

See merge request hubzilla/core!1736
2019-09-23 19:21:27 +02:00
M. Dent
15eaa80301 Merge branch 'cherry-pick-9aa928ec' into 'dev'
composer update simplepie/simplepie

See merge request hubzilla/core!1735
2019-09-23 19:20:45 +02:00
M. Dent
1e924a8530 Merge branch 'cherry-pick-e4336578' into 'dev'
composer update vendor/league/html-to-markdown/.github/

See merge request hubzilla/core!1734
2019-09-23 19:18:53 +02:00
M. Dent
23995ccb07 Merge branch 'cherry-pick-38cb094e' into 'dev'
composer update ezyang/htmlpurifier

See merge request hubzilla/core!1733
2019-09-23 19:16:59 +02:00
M. Dent
a4f2603454 Merge branch 'cherry-pick-a34ce790' into 'dev'
composer update ezyang/htmlpurifier

See merge request hubzilla/core!1732
2019-09-23 19:16:38 +02:00
M. Dent
cc860b4a76 Merge branch 'cherry-pick-53b8ee78' into 'dev'
composer update blueimp/jquery-file-upload

See merge request hubzilla/core!1731
2019-09-23 19:08:47 +02:00
Max Kostikov
0be82602ce Update schema_mysql.sql 2019-09-23 14:23:47 +02:00
Max Kostikov
b42c42692e Update plink type for MySQL 2019-09-23 14:14:02 +02:00
Mario Vavti
7fcbff3ceb composer update simplepie/simplepie
(cherry picked from commit 9aa928ec8f378c6df2a0c8bbe892ff971c3bc672)
2019-09-23 12:22:35 +02:00
Mario Vavti
efec0af394 composer update vendor/league/html-to-markdown/.github/
(cherry picked from commit e4336578388b3e59ba8130123649ccdc9b8487d0)
2019-09-23 12:22:08 +02:00
Mario Vavti
aafecd9d1e composer update ezyang/htmlpurifier
(cherry picked from commit 38cb094ede8a389ef0b8bb331c1e6a3befd666a8)
2019-09-23 12:21:04 +02:00
Mario Vavti
e37c43ea06 composer update ezyang/htmlpurifier
(cherry picked from commit a34ce790129bdd729a5019895ea6cd4c59f08ba4)
2019-09-23 12:20:28 +02:00
Mario Vavti
3fac7b5bb7 composer update blueimp/jquery-file-upload
(cherry picked from commit 53b8ee7866eb1394980b08b90153a63563832391)
2019-09-23 12:19:33 +02:00
Mario
9b90114d03 Merge branch 'customitem-delivery' into 'dev'
Notify on custom items - rework hooks

See merge request hubzilla/core!1730
2019-09-23 10:11:27 +02:00
M. Dent
7c5cfe6697 Notify on custom items - rework hooks 2019-09-23 10:11:27 +02:00
Mario
d1fd69337f Merge branch 'encode-comment-policy' into 'dev'
Encode comment policy into AS(Z6) packets.

See merge request hubzilla/core!1729
2019-09-23 10:10:56 +02:00
DM42.Net Zap Dev
3fc218111a Add dependency 2019-09-21 23:03:42 -04:00
DM42.Net Zap Dev
c63fb0fc6b comment policy default for ordered items 2019-09-21 13:37:20 -04:00
DM42.Net Zap Dev
6fe4ac241d encode/decode comment_policy for Z6 2019-09-21 13:30:42 -04:00
Max Kostikov
c385b80807 Merge branch 'cherry-pick-394f263d' into 'dev'
fix issue #1331

See merge request hubzilla/core!1728
2019-09-19 12:41:47 +02:00
Mario Vavti
97f36fa46f fix issue #1331
(cherry picked from commit 394f263ddd648e25ff3967bfbe3b0e25dccf89a0)
2019-09-19 12:34:01 +02:00
Mario
856d4b39d1 Merge branch 'dev' into 'dev'
change event formatting slightly for Zot6 and ActivityStreams.

See merge request hubzilla/core!1727
2019-09-18 12:43:45 +02:00
Mario
01abd73a2a Merge branch 'fix_homeinstall_for_Debian_10' into 'dev'
Fix homeinstall for debian 10

See merge request hubzilla/core!1725
2019-09-18 12:42:56 +02:00
zotlabs
375c2a87c7 change event formatting slightly for Zot6 and ActivityStreams. 2019-09-16 23:27:41 -07:00
Max Kostikov
6ca507f8dd Merge branch 'dev' into 'dev'
Prevent image blurring

See merge request hubzilla/core!1726
2019-09-15 09:23:22 +02:00
Max Kostikov
86b4a53858 Prevent image blurring 2019-09-15 09:18:42 +02:00
OJ Random
8959ba9b82 hominstall - readme 2019-09-14 19:14:31 +02:00
OJ Random
a62a230d3d hominstall - fix url rewriting and minor changes. 2019-09-14 19:09:26 +02:00
Max Kostikov
cc45129e9f Merge branch 'dev' into 'dev'
Add selected text quote on comment reply

See merge request hubzilla/core!1724
2019-09-10 10:41:53 +02:00
Max Kostikov
bffc9d5aba Merge branch 'daemon-qwfix' into 'dev'
Return in the case of further processing

See merge request hubzilla/core!1711
2019-09-10 10:41:34 +02:00
Max Kostikov
f2b121cd58 Merge branch 'dev' into 'dev'
Zot -> Zot6 translation issue, liking a "new friend" activity

See merge request hubzilla/core!1723
2019-09-10 10:40:53 +02:00
Max Kostikov
fd30be7644 Add selected text quote on comment reply 2019-09-09 12:35:47 +02:00
zotlabs
d9052c7e3c Zot -> Zot6 translation issue, liking a "new friend" activity 2019-09-03 17:00:10 -07:00
Max Kostikov
dcfe10b691 Merge branch 'dev' into 'dev'
Add CalDAV / CardDAV autodiscovery

See merge request hubzilla/core!1719
2019-09-03 14:33:37 +02:00
Max Kostikov
914a096b42 Merge branch 'dev' into 'dev'
improved conversion of emoji reactions from zot to zot6

See merge request hubzilla/core!1720
2019-09-03 14:33:09 +02:00
Max Kostikov
5fa9dcbc7e Merge branch 'dev' into 'dev'
More nofollow tags to discourage backlink farmers

See merge request hubzilla/core!1722
2019-09-03 14:32:52 +02:00
Terrox
93ec01e0a1 More nofollow tags to discourage backlink farmers 2019-09-03 14:32:52 +02:00
zotlabs
bbc98db6b4 Clarify private mail deletion policy. Related to issue #1391. 2019-08-31 14:43:08 -07:00
zotlabs
1f8d29a221 improved conversion of emoji reactions from zot to zot6 2019-08-31 14:04:10 -07:00
Max Kostikov
d267dd2515 Update Well_known.php 2019-08-30 00:55:36 +02:00
Max Kostikov
51954c7f3d Add CalDAV / CardDAV autodiscovery 2019-08-30 00:51:46 +02:00
Max Kostikov
df842a8e8d Merge branch 'dev' into 'dev'
Better spoiler BBcode tag conversion to Markdown

See merge request hubzilla/core!1718
2019-08-24 00:00:58 +02:00
Max Kostikov
60919488f1 Better spoiler BBcode tag conversion to Markdown 2019-08-23 23:58:07 +02:00
Max Kostikov
4dbaaa63bb Merge branch 'dev' into 'dev'
issues with image import to zot6 - wrong mid. Also label source project of...

See merge request hubzilla/core!1717
2019-08-23 23:09:14 +02:00
zotlabs
8cc4003837 issues with image import to zot6 - wrong mid. Also label source project of zotfeed since it is not completely compatible across projects. 2019-08-22 19:39:11 -07:00
Max Kostikov
35790c584b Merge branch 'dev' into 'dev'
possible for DB to return hublocs with no sitekey

See merge request hubzilla/core!1713
2019-08-22 20:29:53 +02:00
Max Kostikov
09d7cf2cc1 Merge branch 'dev' into 'dev'
Fix attach permissions sync for clonned channel

See merge request hubzilla/core!1716
2019-08-22 20:25:57 +02:00
Max Kostikov
58d7c7f6ae Fix attach permissions sync for clonned channel 2019-08-22 20:20:54 +02:00
Max Kostikov
cab24836d8 Merge branch 'dev' into 'dev'
Fix spoiler displaying while convert BBcode to markdown

See merge request hubzilla/core!1715
2019-08-22 20:20:44 +02:00
Max Kostikov
cf9ef615c9 Fix spoiler displaying while convert BBcode to markdown 2019-08-22 20:17:22 +02:00
zotlabs
8c96032b2b Merge branch 'dev' of https://framagit.org/zot/core into dev 2019-08-21 18:51:25 -07:00
zotlabs
d256551907 possible for DB to return hublocs with no sitekey 2019-08-21 18:50:38 -07:00
DM42.Net Zap Dev
e800e2db2b Return in the case of further processing 2019-08-19 23:13:19 -04:00
Mario Vavti
cc9f41df5f bump version 2019-08-16 20:22:16 +02:00
Mario Vavti
bb3784d8dd update changelog
(cherry picked from commit e5539c0d01)
2019-08-16 20:21:19 +02:00
Mario Vavti
e5539c0d01 update changelog 2019-08-16 20:19:49 +02:00
zotlabs
c997360b4a show correct profile photo when previewing and editing profiles
(cherry picked from commit 808baf203d)
2019-08-16 19:33:38 +02:00
Mario
ea8621d6ec Merge branch 'dev' into 'dev'
zot6 compatibility: when posting from a non-primary clone the actor->id is...

See merge request hubzilla/core!1710
2019-08-16 19:32:08 +02:00
zotlabs
88fa18204f illegal offset warning (prevents encrypted signatures from being used for encrypted messages). Not fatal but can leak metadata.
(cherry picked from commit feda23587c)
2019-08-16 19:29:21 +02:00
zotlabs
ac05a2ede7 support "bearcaps" in Activity library 2019-08-15 21:30:47 -07:00
zotlabs
808baf203d show correct profile photo when previewing and editing profiles 2019-08-15 19:18:46 -07:00
zotlabs
beeafc6bc5 fix bitrot in util/zotsh 2019-08-15 16:28:06 -07:00
zotlabs
6f8c977e73 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-08-15 13:49:02 -07:00
zotlabs
9a2fbdde20 zot6 compatibility: when posting from a non-primary clone the actor->id is that of the primary, resulting in an author/owner identity mismatch. Solution is to always post with the actor->id set to the sender if it is a local channel. 2019-08-14 17:55:56 -07:00
Max Kostikov
b325b2c003 Merge branch 'dev' into 'dev'
illegal offset warning (prevents encrypted signatures from being used for...

See merge request hubzilla/core!1709
2019-08-14 16:35:55 +02:00
zotlabs
feda23587c illegal offset warning (prevents encrypted signatures from being used for encrypted messages). Not fatal but can leak metadata. 2019-08-13 16:53:04 -07:00
Mario Vavti
e8f3b7f853 Merge branch '4.4RC' 2019-08-13 09:46:01 +02:00
Mario Vavti
e28341ca4b bump version 2019-08-13 09:44:28 +02:00
Mario Vavti
6c11a020ee Merge branch 'dev' into 4.4RC 2019-08-13 09:42:21 +02:00
Mario Vavti
7200c2ac0c update changelog 2019-08-13 09:41:58 +02:00
Mario Vavti
732ca49b02 Merge branch 'dev' into 4.4RC 2019-08-13 09:34:32 +02:00
Mario Vavti
ee976ed460 update directory servers 2019-08-13 09:33:23 +02:00
Mario Vavti
06ac3e896a Merge branch 'dev' into 4.4RC 2019-08-13 09:27:03 +02:00
Mario
6ce0f6e806 Merge branch 'dev_homeinstall_debian10' into 'dev'
Changes: Debian 10, MariaDB, adminer

See merge request hubzilla/core!1707
2019-08-13 09:23:36 +02:00
Max Kostikov
e006586275 Merge branch 'rudocs' into 'dev'
Add more Russian context help

See merge request hubzilla/core!1708
2019-08-12 23:01:09 +02:00
Max Kostikov
e9d6b17a00 Merge branch 'dev' into 'rudocs'
# Conflicts:
#   doc/context/ru/network/help.html
2019-08-12 22:55:12 +02:00
OJ Random
bf2f199f37 Changes: Debian 10, MariaDB, adminer 2019-08-12 22:02:28 +02:00
Max Kostikov
718ca548be Delete .gitkeep 2019-08-12 21:57:24 +02:00
Max Kostikov
51c0dc070a Delete .gitkeep 2019-08-12 21:57:07 +02:00
Max Kostikov
d5e0d52bc4 Update help.html 2019-08-12 21:56:50 +02:00
Max Kostikov
f6b99db738 Update help.html 2019-08-12 21:52:21 +02:00
Max Kostikov
ef69294072 Update help.html 2019-08-12 21:52:10 +02:00
Max Kostikov
c56d395c90 Add Russian context help for Connections 2019-08-12 21:43:42 +02:00
Max Kostikov
778e9141d8 Add new directory 2019-08-12 21:27:50 +02:00
Max Kostikov
c70a4662b4 Update help.html 2019-08-12 21:26:43 +02:00
Max Kostikov
e441a31051 Update help.html 2019-08-12 12:04:46 +02:00
Max Kostikov
9f5ec5cc50 Update help.html 2019-08-12 12:02:00 +02:00
Max Kostikov
825ded2e08 Update help.html 2019-08-12 12:00:25 +02:00
Max Kostikov
a7c3776557 Merge branch 'rudocs' into 'dev'
Add Russian context help and update translation

See merge request hubzilla/core!1706
2019-08-12 11:56:13 +02:00
Max Kostikov
1e7cfc2644 Update help.html 2019-08-12 11:38:34 +02:00
Max Kostikov
c6fd32ffde Update help.html 2019-08-12 11:36:35 +02:00
Max Kostikov
5f551a8b47 Update hstrings.php 2019-08-12 11:33:03 +02:00
Max Kostikov
f73ff57148 Update hmessages.po 2019-08-12 11:32:39 +02:00
Max Kostikov
c538d7372e Add Russian context help for network page 2019-08-12 11:25:08 +02:00
Max Kostikov
4e7804ca75 Add new directory 2019-08-12 10:55:50 +02:00
Max Kostikov
8fe715983a Merge branch 'dev' into 'dev'
Updated Spanish translation

See merge request hubzilla/core!1705
2019-08-12 00:14:09 +02:00
Manuel Jiménez Friaza
4a3fb07d5f Updated Spanish translation 2019-08-11 11:15:07 +02:00
Mario Vavti
f5062c0507 Merge branch 'dev' into 4.4RC 2019-08-11 10:56:00 +02:00
Mario Vavti
f0d7a17b72 linkinfo: only allow to embed public items 2019-08-11 10:55:38 +02:00
Manuel Jiménez Friaza
b89d2d7580 Merge remote-tracking branch 'upstream/dev' into dev 2019-08-11 10:39:03 +02:00
Mario Vavti
7a7f57fa45 Merge branch 'dev' into 4.4RC 2019-08-11 10:23:14 +02:00
Max Kostikov
047dd31724 Merge branch 'dev' into 'dev'
Improve plink to share tag detection

See merge request hubzilla/core!1704
2019-08-10 11:23:51 +02:00
Max Kostikov
0ce1a200f7 Improve plink to share tag detection 2019-08-10 11:15:48 +02:00
Mario Vavti
0e0024218f Merge branch 'dev' into 4.4RC 2019-08-09 22:21:40 +02:00
Mario Vavti
4886d088e9 use stripos() to match the body against terms in format_hashtags() 2019-08-09 22:19:51 +02:00
Mario Vavti
6eec6e2d65 update changelog 2019-08-09 21:58:25 +02:00
Mario Vavti
6c12880f5b fix version 2019-08-09 20:37:06 +02:00
Mario Vavti
eb472111a8 Merge branch 'dev' into 4.4RC 2019-08-09 20:35:25 +02:00
Mario Vavti
8d8b7ed567 make fetch logging less chatty
(cherry picked from commit 130cfbf231)
2019-08-09 20:34:38 +02:00
Mario Vavti
681dc70205 Merge branch 'dev' into 4.4RC 2019-08-09 20:33:45 +02:00
Mario Vavti
130cfbf231 make fetch logging less chatty 2019-08-09 20:33:03 +02:00
Mario
940e4a6152 Merge branch 'dev' into 'dev'
Replace plink URL with 'share' tag if possible

See merge request hubzilla/core!1703
2019-08-09 20:26:54 +02:00
Max Kostikov
38f7d9ad37 Replace plink URL with 'share' tag if possible 2019-08-09 19:01:21 +02:00
Max Kostikov
e896d316f2 Merge branch 'dev' into 'dev'
More intelligent quotation shortening while link embedding

See merge request hubzilla/core!1702
2019-08-09 17:05:05 +02:00
Max Kostikov
af690b64d6 More intelligent quotation shortening while link embedding 2019-08-09 16:59:14 +02:00
Max Kostikov
699aad8626 Merge branch 'dev' into 'dev'
Catch and exclude trailing punctuation while URL embedding

See merge request hubzilla/core!1701
2019-08-08 18:53:14 +02:00
Max Kostikov
4382e53acb Remove condition 2019-08-08 18:37:05 +02:00
Max Kostikov
832adf92a6 Update zid.php 2019-08-08 18:30:08 +02:00
Max Kostikov
33e2582918 Update zid.php 2019-08-08 18:29:26 +02:00
Max Kostikov
1c2f413211 Formatting 2019-08-08 18:27:07 +02:00
Max Kostikov
2300581c93 Catch and exclude trailing punctuation while URL embedding 2019-08-08 18:19:07 +02:00
Max Kostikov
03c4fba730 Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1700
2019-08-02 23:51:55 +02:00
Max Kostikov
75a8b209f5 Update hstrings.php 2019-08-02 23:42:09 +02:00
Max Kostikov
d554b41fea Update hmessages.po 2019-08-02 23:41:54 +02:00
Mario Vavti
b0db1f827e version 2019-08-01 22:37:52 +02:00
Mario Vavti
3070baf04e version 2019-08-01 22:36:51 +02:00
Mario Vavti
72629ca511 bump version 2019-08-01 22:11:27 +02:00
Mario Vavti
1c39fc71d9 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-08-01 22:07:07 +02:00
Mario Vavti
0bb59b66be update license 2019-08-01 22:00:11 +02:00
Mario Vavti
31b177f8ad update strings 2019-08-01 21:46:24 +02:00
Max Kostikov
8ee5ced08d Merge branch 'dev' into 'dev'
Minor optimizations on static file serve

See merge request hubzilla/core!1699
2019-08-01 21:01:12 +02:00
Max Kostikov
c96a1632f5 Minor optimizations on static file serve 2019-08-01 20:55:08 +02:00
Max Kostikov
b3b2649814 Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1698
2019-07-31 19:57:44 +02:00
Max Kostikov
95805d2e7c Update hstrings.php 2019-07-31 19:50:07 +02:00
Max Kostikov
d4b92141fd Update hmessages.po 2019-07-31 19:49:51 +02:00
Max Kostikov
829e915c90 Merge branch 'dev' into 'dev'
Do not limit channel if service class property value set with 0

See merge request hubzilla/core!1697
2019-07-31 17:21:06 +02:00
Max Kostikov
aaffc7485d Update account.php 2019-07-31 17:18:11 +02:00
Max Kostikov
9ea1d6e8af Do not limit channel if service class property value set with 0 2019-07-31 17:09:24 +02:00
Mario
17661b4b5f Merge branch 'dev' into 'dev'
Do not control limits on service class settings with 0 values

See merge request hubzilla/core!1696
2019-07-30 23:08:42 +02:00
Mario
32874b89ca Merge branch 'dev' into 'dev'
fix urls on imported item taxonomy

See merge request hubzilla/core!1695
2019-07-30 23:07:33 +02:00
Max Kostikov
d4a038c437 Update account.php 2019-07-30 13:59:12 +02:00
Max Kostikov
59fed33797 Do not control limits on service class settings with 0 values 2019-07-30 11:54:14 +02:00
zotlabs
feea137dbf hz core issue #1386 - function name must be a string 2019-07-28 23:46:38 -07:00
zotlabs
70e4a2c4fa Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-07-28 20:00:14 -07:00
zotlabs
696359daba fix urls on imported item taxonomy 2019-07-28 19:57:17 -07:00
Max Kostikov
5695350e98 Revert "Merge branch 'dev' into 'dev'"
This reverts merge request !1694
2019-07-25 12:25:27 +02:00
Mario Vavti
4e3a0720c3 minor css adjustions 2019-07-23 23:32:32 +02:00
Mario Vavti
dc56d8560d pleroma uses slightly different URLs in body - also look for the string 2019-07-22 20:38:10 +02:00
Mario Vavti
81ecea29c8 reflect repeats in notifications, use force flag for import_xchan_photo() in cron 2019-07-22 19:11:52 +02:00
Mario Vavti
ad58697521 move image attachments to the top 2019-07-19 18:45:34 +02:00
Mario Vavti
6ca7527ec9 add hashtag to appschema and bump appschema rev 2019-07-18 14:19:32 +02:00
Mario Vavti
8ced3699c2 fallback to id if href is not available 2019-07-18 13:52:39 +02:00
Mario Vavti
c4de5b45df do not format hashtags with missing url 2019-07-18 13:19:10 +02:00
Mario Vavti
71056e1db1 fix issue with encoding hashtags and silence parent fetch logging 2019-07-18 13:02:19 +02:00
Mario Vavti
f94faeeace streamline keyId and creator/actor 2019-07-17 23:36:41 +02:00
Mario Vavti
80f56a1315 minor css fix 2019-07-17 15:14:05 +02:00
Mario
485f5a07ed Merge branch 'dev' into 'dev'
Exclude trailing punctuations from URL

See merge request hubzilla/core!1694
2019-07-16 18:11:47 +02:00
Max Kostikov
821af482f0 Exclude trailing punctuations from URL 2019-07-16 18:11:47 +02:00
Mario Vavti
b2d1fadf66 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-07-15 15:06:08 +02:00
Mario Vavti
3b73e5223e stringify_array_elms() could return weird results if the initial array key was not zero. this could trigger obscure bugs e.g. adding an empty string value to the recipients array in the notifier which could then select some broken hubloc/xchan entries. 2019-07-15 15:05:54 +02:00
Max Kostikov
6a964e7caf Merge branch 'dev' into 'dev'
Fix ETag quotes

See merge request hubzilla/core!1693
2019-07-15 11:00:55 +02:00
Max Kostikov
a6f06c2d94 Fix ETag quotes 2019-07-15 10:57:04 +02:00
Mario
a85f0a93c6 Merge branch 'serve-static-files' into 'dev'
Serve static files directly if not caught by web server

See merge request hubzilla/core!1691
2019-07-15 09:55:11 +02:00
Mario
250387c7e5 Merge branch 'queueworker-updates' into 'dev'
Hookify Zotlabs\Daemon\Master::Summon

See merge request hubzilla/core!1692
2019-07-15 09:51:42 +02:00
DM42.Net (Matt Dent)
dde7144f5a Hookify Zotlabs\Daemon\Master::Summon 2019-07-15 00:25:19 -04:00
DM42.Net (Matt Dent)
68733a2bc0 Serve static files directly if not caught by web server 2019-07-14 23:56:11 -04:00
Mario Vavti
b2d3a11de8 update certs 2019-07-13 21:30:51 +02:00
Mario Vavti
a024e4c10a Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-07-13 20:00:05 +02:00
Mario Vavti
db6e4d1c32 admin should be allowed to delete any item 2019-07-13 19:59:52 +02:00
Max Kostikov
8393c382c3 Merge branch 'dev' into 'dev'
Missprint in Russian translation fixed

See merge request hubzilla/core!1690
2019-07-13 09:57:41 +02:00
Max Kostikov
5c0e3688fe Missprint fixed 2019-07-13 09:48:53 +02:00
Max Kostikov
1e6c07246e Missprint fixed 2019-07-13 09:48:20 +02:00
Mario
e5370971d6 Merge branch 'dev' into 'dev'
emoji reactions from hubzilla becoming top level posts on zap because of missing object

See merge request hubzilla/core!1689
2019-07-12 13:00:14 +02:00
Mario Vavti
090d921006 webfinger: better handling of URLs that contain a @ 2019-07-12 12:43:12 +02:00
zotlabs
39c0a7525b emoji reactions from hubzilla becoming top level posts on zap because of missing object 2019-07-11 20:47:38 -07:00
Mario Vavti
407b02bde8 calendar: revert back to UTC strings for dates due to better legibility. Strip timezone info from UTC string and always treat values as UTC. 2019-07-11 11:12:27 +02:00
Mario Vavti
da7912b879 calendar: display date values as ISO string 2019-07-09 23:17:48 +02:00
Mario Vavti
02c08aed12 hide timezone select on allday events 2019-07-08 21:12:54 +02:00
Mario Vavti
87668f7fa8 fix typo 2019-07-03 22:13:14 +02:00
Mario
001734a725 Merge branch 'dev' into 'dev'
begin directory migration to zot6, see the code comments

See merge request hubzilla/core!1687
2019-07-02 22:02:15 +02:00
zotlabs
276ab3eae3 I'm pretty sure the LD construct 'diaspora:guid' isn't actually legal without a definition of 'diaspora' in the current or parent LD context. 2019-07-01 23:28:31 -07:00
zotlabs
1b976f30f3 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-07-01 23:28:17 -07:00
Max Kostikov
019afe2a1a Merge branch 'dev' into 'dev'
Fix missprint in German translation

See merge request hubzilla/core!1688
2019-07-01 23:44:51 +02:00
Max Kostikov
37ebcd3b4f Update hstrings.php 2019-07-01 23:40:14 +02:00
zotlabs
5ad6eeccdf add opengraph meta info to channel page 2019-06-29 16:34:06 -07:00
zotlabs
65cd33cb15 zot_finger() and Zotlabs\Zot\Finger::run() have different output. Adjusted accordingly. 2019-06-28 16:59:15 -07:00
zotlabs
4aa59226d7 I wonder how long zot_finger() has been missing and how this may have affected the directory servers. 2019-06-28 16:49:23 -07:00
zotlabs
d53c98860d minor fix 2019-06-28 16:29:56 -07:00
zotlabs
d022e1acce Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-06-28 16:25:00 -07:00
zotlabs
98100520eb begin directory migration to zot6, see the code comments 2019-06-28 16:21:54 -07:00
Mario Vavti
42526fc2dc decode encoded mid 2019-06-28 13:09:44 +02:00
Mario Vavti
9c76afa2a3 missing class import 2019-06-28 10:35:32 +02:00
Mario Vavti
943db4496b regenerate autoload cache 2019-06-28 09:58:22 +02:00
zotlabs
4a77b6673b support zot and zot6 in social graph operations (suggestions, common friends)
(cherry picked from commit 9def9a5cb7)
2019-06-28 09:43:06 +02:00
zotlabs
62b31b1e4a photo objects: incorrect media type on links
(cherry picked from commit 60c003733e)
2019-06-28 09:42:19 +02:00
zotlabs
ddde4e1965 extend definition of direct message to anything with allow_cid but *not* allow_gid.
(cherry picked from commit 96a99935ef)
2019-06-28 09:38:28 +02:00
zotlabs
96a99935ef extend definition of direct message to anything with allow_cid but *not* allow_gid. 2019-06-27 18:37:36 -07:00
zotlabs
60c003733e photo objects: incorrect media type on links 2019-06-27 17:36:29 -07:00
zotlabs
9def9a5cb7 support zot and zot6 in social graph operations (suggestions, common friends) 2019-06-27 17:05:25 -07:00
Mario Vavti
145295302d fix typo 2019-06-27 13:45:51 +02:00
Mario Vavti
302d2dbd51 do not check send_stream permission for comments 2019-06-27 13:11:59 +02:00
Mario
49ba3ffee6 Merge branch 'httpsig' into 'dev'
http signature consolidation

See merge request hubzilla/core!1685
2019-06-27 13:05:25 +02:00
zotlabs
d83ce0863a Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-06-26 21:54:50 -07:00
zotlabs
cf844cb27c http signature consolidation 2019-06-26 21:45:21 -07:00
Mario Vavti
5ccef18d4e port some functions from osada 2019-06-26 14:00:44 +02:00
Mario
40bbdfdf6a Merge branch 'dev' into 'dev'
provide auto redirect from zot6 /item permalinks

See merge request hubzilla/core!1684
2019-06-26 09:21:22 +02:00
Mario
ad8ad0ccd7 Merge branch 'fix-item_export-api-path' into 'dev'
Make export_page API endpoint match ZAP

See merge request hubzilla/core!1683
2019-06-26 09:21:09 +02:00
Mario
1cf012650b Merge branch 'export_items-export_all' into 'dev'
Export items export all

See merge request hubzilla/core!1680
2019-06-26 09:20:54 +02:00
zotlabs
4f280b5497 allow api login by address or url (url will use zot6 hubloc records, address can use either zot or zot6 hubloc records) 2019-06-25 18:47:16 -07:00
zotlabs
5ee7009271 provide auto redirect from zot6 /item permalinks 2019-06-25 18:37:27 -07:00
DM42.Net (Matt Dent)
07f850ed15 Make export_page API endpoint match ZAP 2019-06-23 20:23:03 -04:00
Max Kostikov
1b6fbe3a2e Merge branch 'dev' into 'dev'
Fix thumbnails processing logic on files sync

See merge request hubzilla/core!1682
2019-06-21 23:26:12 +02:00
Max Kostikov
b1b415ec5b Fix thumbnails processing logic on files sync 2019-06-21 23:15:16 +02:00
Max Kostikov
8730bbac2f Revert "Respect photo thumbnails storage in import"
This reverts commit e8918ca149
2019-06-21 22:42:38 +02:00
Max Kostikov
e8918ca149 Respect photo thumbnails storage in import 2019-06-21 22:27:27 +02:00
DM42.Net (Matt Dent)
82478eef09 export all items except photos 2019-06-21 14:23:16 -04:00
zotlabs
892e9cd835 minor zot6 compatibility issues uncovered through daily use
(cherry picked from commit becaa3b920)
2019-06-21 13:03:58 +02:00
Mario Vavti
3dd6499ac4 fix mid not dbesc'd. the comment was no longer true. this fixes an issue with mid's that contain single quotes 2019-06-21 10:37:09 +02:00
Mario Vavti
109c66aea3 apply calendar encoding fixes to mod cal
(cherry picked from commit 24b0f8e27e)
2019-06-20 18:45:12 +02:00
Mario Vavti
24b0f8e27e apply calendar encoding fixes to mod cal 2019-06-20 18:44:23 +02:00
Mario Vavti
1a76e83fa4 fix encoding also for description and location
(cherry picked from commit f37387de80)
2019-06-20 18:40:57 +02:00
Mario Vavti
2fa788b01b various calendar UI improvements: make day- and weeknumbers clickable for navigation, hide start and end time fields in month view (only allday events can be generated there), remove the action arg from changeView().
;


(cherry picked from commit 4f705fc3f8)
2019-06-20 18:40:39 +02:00
zotlabs
028cbdcffa tweak to event title encoding to ensure it works with German, Russian, as well as angle chars
(cherry picked from commit 952e466d91)
2019-06-20 18:40:19 +02:00
zotlabs
8aefbd911b events: don't use htmlentities on local (hz) event titles as they are not being used in textareas and umlauts for instance are getting mangled on the calendar display
(cherry picked from commit c1cc76119c)
2019-06-20 18:39:58 +02:00
Mario Vavti
f37387de80 fix encoding also for description and location 2019-06-20 18:34:44 +02:00
Mario Vavti
4f705fc3f8 various calendar UI improvements: make day- and weeknumbers clickable for navigation, hide start and end time fields in month view (only allday events can be generated there), remove the action arg from changeView().
;
2019-06-20 18:27:46 +02:00
Mario
5b727065cf Merge branch 'dev' into 'dev'
changes to support direct messages in zot6 (set item.item_private = 2 when...

See merge request hubzilla/core!1679
2019-06-20 17:32:10 +02:00
zotlabs
952e466d91 tweak to event title encoding to ensure it works with German, Russian, as well as angle chars 2019-06-19 22:13:03 -07:00
zotlabs
c1cc76119c events: don't use htmlentities on local (hz) event titles as they are not being used in textareas and umlauts for instance are getting mangled on the calendar display 2019-06-19 21:41:46 -07:00
zotlabs
9d156141b1 changes to support direct messages in zot6 (set item.item_private = 2 when private mentions are used and federate with zot:directMessage attribute which aligns with litepub:directMessage) 2019-06-19 17:32:38 -07:00
Max Kostikov
8c92b0cd3a Merge branch 'dev' into 'dev'
Remove cached photo location directory on delete if empty

See merge request hubzilla/core!1678
2019-06-19 23:26:54 +02:00
Max Kostikov
dd515da889 Remove cached photo location directory on delete if empty 2019-06-19 23:13:53 +02:00
Max Kostikov
2862b69d56 Merge branch 'dev' into 'dev'
Use html_entity_decode() for cached photo URL

See merge request hubzilla/core!1677
2019-06-19 13:26:36 +02:00
Max Kostikov
db8e46184b Use html_entity_decode() for cached photo URL 2019-06-19 13:20:32 +02:00
Max Kostikov
99a7cd3cfb Merge branch 'dev' into 'dev'
Include Zot6 hubs in the Grid scope

See merge request hubzilla/core!1676
2019-06-19 10:29:19 +02:00
Max Kostikov
75746d714a Update zid.php 2019-06-19 09:39:56 +02:00
Max Kostikov
983d6d3b42 Include Zot6 hubs in the Grid scope 2019-06-18 22:17:50 +02:00
Max Kostikov
060dd8b020 Merge branch 'dev' into 'dev'
Update German and Russian translations

See merge request hubzilla/core!1674
2019-06-18 20:40:32 +02:00
Max Kostikov
b5be0a2e3e Update hstrings.php 2019-06-18 20:28:23 +02:00
Max Kostikov
46a687b0a6 Update hmessages.po 2019-06-18 20:28:07 +02:00
Max Kostikov
4ff7aa4352 Update hstrings.php 2019-06-18 20:15:54 +02:00
Max Kostikov
750d1f820d Update hmessages.po 2019-06-18 20:15:40 +02:00
Mario
f046a34d34 Merge branch 'patch-2' into 'master'
Fix os_path replace for thumbnails

See merge request hubzilla/core!1673
2019-06-18 19:17:33 +02:00
Max Kostikov
0d165920bb Merge branch 'dev' into 'dev'
Fix os_path replace for thumbnails

See merge request hubzilla/core!1672
2019-06-18 18:24:19 +02:00
Max Kostikov
9e3a4402e0 Fix os_path replace for thumbnails 2019-06-18 18:19:17 +02:00
Max Kostikov
34d7aea1be Fix os_path replace for thumbnails 2019-06-18 18:17:28 +02:00
Max Kostikov
e2abc0b727 Merge branch 'dev' into 'dev'
Dev

See merge request kostikov/core!1
2019-06-18 11:47:26 +02:00
Max Kostikov
a677a68ab7 Avoid to process original images using storeThumbnail 2019-06-18 11:31:14 +02:00
Mario Vavti
df228237de fix typo
(cherry picked from commit 619b39f955)
2019-06-18 10:37:56 +02:00
Mario
fc2a038ee1 Merge branch 'dev' into 'dev'
minor zot6 compatibility issues uncovered through daily use

See merge request hubzilla/core!1671
2019-06-18 10:35:50 +02:00
Mario Vavti
619b39f955 fix typo 2019-06-18 10:33:30 +02:00
zotlabs
becaa3b920 minor zot6 compatibility issues uncovered through daily use 2019-06-17 18:30:05 -07:00
Mario Vavti
c0b9ab930d update composer libs 2019-06-17 11:50:17 +02:00
Mario Vavti
f106b1db15 changelog and version 2019-06-17 10:45:43 +02:00
Mario Vavti
958217dd55 changelog and version 2019-06-17 10:42:56 +02:00
Mario Vavti
2f80fdae97 Merge branch 'dev' 2019-06-17 10:28:47 +02:00
Mario Vavti
9507f191b0 disable events module. it is now disfunctional 2019-06-17 10:16:49 +02:00
Mario Vavti
92f5d8c8be remove old fullcalendar library 2019-06-17 10:11:36 +02:00
Mario Vavti
8535eb7bf5 update feature set 2019-06-17 10:10:44 +02:00
Mario Vavti
c9604eaabf revisit mod cal 2019-06-17 10:07:00 +02:00
Mario
3bc214e544 Merge branch 'dev' into 'dev'
Add signatures processing for private messages

See merge request hubzilla/core!1670
2019-06-15 23:07:39 +02:00
Max Kostikov
43cec4398d base64 encode message signature 2019-06-15 16:03:35 +02:00
Max Kostikov
335394aaa1 Add base64 decode if signature encoded 2019-06-15 15:58:55 +02:00
Max Kostikov
c9615cc19c Formatting 2019-06-14 21:08:53 +02:00
Max Kostikov
5315d8fe3f Add signature when private message displaying 2019-06-14 20:59:07 +02:00
Max Kostikov
75dedb3345 Add signature when send private message 2019-06-14 20:57:28 +02:00
Max Kostikov
134dfb8804 Formatting 2019-06-14 20:56:00 +02:00
Max Kostikov
86f4a8d33a Add signatures processing for private messages 2019-06-14 20:54:42 +02:00
Max Kostikov
abeb924554 Add signatures processing for private messages 2019-06-14 20:53:43 +02:00
Max Kostikov
4da3933f24 Add signatures processing for private messages 2019-06-14 20:52:21 +02:00
Mario Vavti
c5703306ef fix mod cal regression
(cherry picked from commit a26774b99e)
2019-06-14 09:53:26 +02:00
Mario Vavti
a26774b99e fix mod cal regression 2019-06-14 09:52:54 +02:00
Mario
9258593776 Merge branch 'dev' into 'dev'
zot6 protocol edge case

See merge request hubzilla/core!1669
2019-06-14 09:13:57 +02:00
Mario Vavti
48604041e8 fix typo 2019-06-14 09:12:47 +02:00
zotlabs
57ed9ec8e2 zot6 protocol edge case 2019-06-13 18:28:33 -07:00
Mario Vavti
801ab611ed more work on linked item/resource deletion for photos and events, deprecate the force flag in drop_item() and comment out goaway() in drop_item(). 2019-06-13 13:34:04 +02:00
Mario Vavti
bc34167c84 port delete fixes from zap 2019-06-12 12:46:29 +02:00
Mario Vavti
decd0dc035 more work on event item deletion 2019-06-12 11:27:39 +02:00
Mario Vavti
9ac9c693ad initial support for deleting event items if an event is removed 2019-06-12 10:07:18 +02:00
Mario
9b2cd69c0f Merge branch 'dev' into 'dev'
attach sync issues

See merge request hubzilla/core!1668
2019-06-12 10:00:17 +02:00
zotlabs
b3f1a19db6 zot6 deletion issue 2019-06-11 20:22:57 -07:00
zotlabs
f3b6708a92 attach sync issues 2019-06-11 18:00:42 -07:00
Mario
8848885d9a Merge branch 'patch-1' into 'master'
Add resize on image scale to 4 and 7

See merge request hubzilla/core!1667
2019-06-11 17:16:41 +02:00
Max Kostikov
c1cab6789e Add resize on image scale to 4 and 7 2019-06-11 12:55:28 +02:00
Max Kostikov
907777eeb0 Add resize on image scale to 4 and 7 2019-06-11 12:53:46 +02:00
Mario Vavti
7889612edc remove sizeRangeSuffixes. they can cause issues with profile photos.
(cherry picked from commit e81e264988)
2019-06-10 22:40:36 +02:00
Mario Vavti
e81e264988 remove sizeRangeSuffixes. they can cause issues with profile photos. 2019-06-10 22:39:53 +02:00
Mario
eacc29ded0 add the thumbrepair script
(cherry picked from commit 15874ac45c)
2019-06-10 22:36:10 +02:00
Mario
ea04c93bfd resolve merge conflict
(cherry picked from commit 761fc74a67)
2019-06-10 22:35:30 +02:00
Mario
8692977585 fix storageconv issue with postgres
(cherry picked from commit 0e2239e50b)
2019-06-10 22:35:14 +02:00
Mario
6a40f3ed60 Revert "PgSQL compatibility on conversion"
This reverts commit dd1f631d9d
2019-06-10 22:34:51 +02:00
Max Kostikov
dd1f631d9d PgSQL compatibility on conversion
(cherry picked from commit 94254e61c1)
2019-06-10 22:32:54 +02:00
Mario
15874ac45c add the thumbrepair script 2019-06-10 22:30:38 +02:00
Mario
761fc74a67 resolve merge conflict 2019-06-10 21:52:29 +02:00
Mario
0e2239e50b fix storageconv issue with postgres 2019-06-10 21:49:34 +02:00
Max Kostikov
e9a17517d3 Merge branch 'dev' into 'dev'
PgSQL compatibility on conversion

See merge request hubzilla/core!1665
2019-06-10 20:03:55 +02:00
Max Kostikov
94254e61c1 PgSQL compatibility on conversion 2019-06-10 19:51:55 +02:00
Mario Vavti
9f403a4d6b fix css issue
(cherry picked from commit 55792d5528)
2019-06-07 09:58:51 +02:00
Mario Vavti
55792d5528 fix css issue 2019-06-07 09:51:26 +02:00
Mario Vavti
a3f726baa8 fix embedphotos image size
(cherry picked from commit ebc2b23c3a)
2019-06-07 08:45:58 +02:00
Mario Vavti
ebc2b23c3a fix embedphotos image size 2019-06-07 08:45:08 +02:00
Mario Vavti
e4ca3609d9 Merge branch '4.2RC' 2019-06-04 10:19:04 +02:00
Mario Vavti
bc092d8d78 version 4.2 2019-06-04 10:16:06 +02:00
Mario Vavti
dd5933b048 Merge branch 'dev' into 4.2RC 2019-06-04 10:13:59 +02:00
Mario Vavti
5d6128b25c update changelog 2019-06-04 10:13:25 +02:00
Mario Vavti
24cb04c346 do not change default timezone in parse_ical_file()
(cherry picked from commit f1b54cf0a4)
2019-06-03 22:43:20 +02:00
Mario Vavti
f1b54cf0a4 do not change default timezone in parse_ical_file() 2019-06-03 22:37:03 +02:00
Mario Vavti
e64a7b87a8 fix timezone issue when importing adjusted events
(cherry picked from commit 2b452ea3e8)
2019-06-03 21:04:51 +02:00
Mario Vavti
2b452ea3e8 fix timezone issue when importing adjusted events 2019-06-03 21:03:43 +02:00
Mario
66c6c6c7d1 regard timezones in calendar import/export
(cherry picked from commit 5b4aa1afc2)
2019-06-03 13:27:16 +02:00
Mario
5b4aa1afc2 regard timezones in calendar import/export 2019-06-03 13:25:48 +02:00
Mario Vavti
89205276ab update changelog
(cherry picked from commit 6d2ab6a7d6)
2019-06-03 11:49:04 +02:00
Mario Vavti
6d2ab6a7d6 update changelog 2019-06-03 11:48:30 +02:00
Mario Vavti
e6da910ee2 Merge branch 'dev' into 4.2RC 2019-06-03 11:44:31 +02:00
Max Kostikov
2100ac3cfc Merge branch 'dev' into 'dev'
fix category widget when using articles

See merge request hubzilla/core!1664
2019-05-31 23:28:09 +02:00
zotlabs
c7476a1d96 fix category widget when using articles 2019-05-31 14:19:04 -07:00
Max Kostikov
d8c3033941 Merge branch 'dev' into 'dev'
live-update not triggering on mod_search

See merge request hubzilla/core!1662
2019-05-30 19:50:58 +02:00
Max Kostikov
7e26ee5a73 Merge branch 'dev' into 'dev'
Add single photo URL rewrite for clonned channel

See merge request hubzilla/core!1663
2019-05-30 13:45:20 +02:00
Max Kostikov
a8e25ccfe6 Add single photo URL rewrite for clonned channel 2019-05-30 13:41:32 +02:00
zotlabs
b6267ec7c2 live-update not triggering on mod_search 2019-05-29 17:04:27 -07:00
Mario Vavti
b6bd2884d5 Merge branch 'dev' into 4.2RC 2019-05-29 09:08:40 +02:00
Mario
767a235611 Merge branch 'dev' into 'dev'
support 'expires' over Zot6

See merge request hubzilla/core!1661
2019-05-29 09:06:52 +02:00
zotlabs
620fc06b6c anomolies in calls to datetime_convert in include/import 2019-05-28 23:14:22 -07:00
zotlabs
0fa4c89a1b convert AS "instrument" objects to the more appropriate "generator" - this probably should happen in pubcrawl addon also 2019-05-28 20:23:03 -07:00
zotlabs
1bf046c142 Revert "another forum -> group wording change" (wrong tree)
This reverts commit 7c2aafd4ee.
2019-05-28 16:35:41 -07:00
zotlabs
52f8429218 support 'expires' over Zot6 2019-05-28 16:28:03 -07:00
zotlabs
932b414063 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-05-28 16:16:29 -07:00
Mario Vavti
097b2390db update changelog
(cherry picked from commit ca8d252ad7)
2019-05-28 12:31:48 +02:00
Mario Vavti
ca8d252ad7 update changelog 2019-05-28 12:07:14 +02:00
Mario Vavti
23a0dbe3cc 4.2RC2 2019-05-27 08:19:23 +02:00
Mario Vavti
545ece82b3 Merge branch '4.2RC' of https://framagit.org/hubzilla/core into 4.2RC 2019-05-27 08:09:36 +02:00
Mario Vavti
eaea947b74 Merge branch 'dev' into 4.2RC 2019-05-27 08:07:26 +02:00
Mario Vavti
f1b61d5882 mod cal band-aid fixes 2019-05-26 20:22:40 +02:00
Mario Vavti
e466d72058 adjust birthday handling according to community decision and slightly change display of allday event items 2019-05-26 18:05:11 +02:00
Mario Vavti
385be35ed5 fix #1374
(cherry picked from commit 528b9b6a60)
2019-05-24 12:27:14 +02:00
Mario Vavti
528b9b6a60 fix #1374 2019-05-24 10:27:45 +02:00
Mario Vavti
dd374eaebf get channel from photo uid
(cherry picked from commit 9ea483d1dc)
2019-05-24 09:59:17 +02:00
Mario Vavti
9ea483d1dc get channel from photo uid 2019-05-24 09:57:46 +02:00
Mario Vavti
b1813df61a add new directory fallback server 2019-05-23 08:46:16 +02:00
Mario Vavti
8715f74d29 Merge branch 'dev' into 4.2RC 2019-05-23 08:44:44 +02:00
Mario Vavti
152224944b add new directory fallback server 2019-05-23 08:43:48 +02:00
Mario Vavti
f86d12c8f4 Merge branch 'dev' into 4.2RC 2019-05-23 08:37:52 +02:00
Mario
94d4bc4bac Merge branch 'dev' into 'dev'
translate make-friend activities to zot6

See merge request hubzilla/core!1654
2019-05-22 12:59:41 +02:00
Mario Vavti
c95488549d Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-05-22 12:41:01 +02:00
Mario Vavti
39613aa2d9 improve timezone detection for caldav and remove smart birthday feature. Force adjust birthdays until we agree on how to deal with this. 2019-05-22 12:40:37 +02:00
zotlabs
7c2aafd4ee another forum -> group wording change 2019-05-21 18:23:45 -07:00
Mario Vavti
e834c7fe3e remove unused code 2019-05-21 12:31:50 +02:00
Mario Vavti
f96958adf8 fix all day events for caldav calendars 2019-05-21 12:29:00 +02:00
zotlabs
776074b24f translate make-friend activities to zot6 2019-05-20 19:03:10 -07:00
Mario Vavti
c9d64d75f3 move smart birthday feature to calendar settings and override the adjust flag at display time instead of import 2019-05-20 13:51:53 +02:00
Mario Vavti
9651689bb8 fix event notifications viewall url 2019-05-20 13:14:54 +02:00
Mario
75be0475ba Merge branch 'es-es' into 'dev'
Update es-es

See merge request hubzilla/core!1651
2019-05-20 13:08:37 +02:00
Mario
e130b58b20 Merge branch 'es-es' into '4.2RC'
Update es-es

See merge request hubzilla/core!1652
2019-05-20 13:06:55 +02:00
Mario Vavti
e44f0c497f be more precise with table selection 2019-05-20 12:34:05 +02:00
Mario Vavti
2d0f96d28b Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-05-20 12:27:00 +02:00
Mario Vavti
34d1f79777 calendar merge: initial commit for timezone support 2019-05-20 12:26:33 +02:00
Manuel Jiménez Friaza
2185ccd4ea Merge branch 'cherry-pick-350e636e' into 'es-es'
Updated Spanish translation

See merge request mjfriaza/core!7
2019-05-19 14:03:17 +02:00
Manuel Jiménez Friaza
125634759d Updated Spanish translation
(cherry picked from commit 350e636e3d)
2019-05-19 13:57:04 +02:00
Manuel Jiménez Friaza
350e636e3d Updated Spanish translation 2019-05-19 13:52:17 +02:00
Manuel Jiménez Friaza
429140df97 Merge remote-tracking branch 'upstream/dev' into dev 2019-05-19 13:25:00 +02:00
Xanthor
a921deafd1 Fix a really disturbing comment
(cherry picked from commit 823c0434eb)

(cherry picked from commit af2b263bc7)
2019-05-17 12:28:41 +02:00
Mario Vavti
071fba2f71 wiki: urlencode the entire share link
(cherry picked from commit aa120e0478)
2019-05-17 12:28:13 +02:00
Mario Vavti
9de729e3e7 wiki: urlencode the entire share link
(cherry picked from commit aa120e0478)
2019-05-17 12:27:54 +02:00
Mario Vavti
7cf5bd30f2 use escape_tags() wiki headers
(cherry picked from commit e7f1f496c5)
2019-05-17 12:27:18 +02:00
Mario Vavti
e6cee2965a use escape_tags() wiki headers
(cherry picked from commit e7f1f496c5)
2019-05-17 12:26:03 +02:00
Xanthor
af2b263bc7 Fix a really disturbing comment
(cherry picked from commit 823c0434eb)
2019-05-17 12:25:22 +02:00
Mario Vavti
aa120e0478 wiki: urlencode the entire share link 2019-05-17 12:24:25 +02:00
Mario
b07c55a0d9 Merge branch 'patch-1' into 'master'
Fix a really disturbing comment

See merge request hubzilla/core!1650
2019-05-17 12:01:21 +02:00
Mario Vavti
e7f1f496c5 use escape_tags() wiki headers 2019-05-17 11:57:41 +02:00
Xanthor
823c0434eb Fix a really disturbing comment 2019-05-17 05:23:12 +02:00
Mario Vavti
22162635e7 calendar merge: only export events that will not break the importer. this will probably dismiss some old experimental entries
(cherry picked from commit 8be0031602)
2019-05-15 18:25:59 +02:00
Mario Vavti
8be0031602 calendar merge: only export events that will not break the importer. this will probably dismiss some old experimental entries 2019-05-15 18:21:52 +02:00
Mario Vavti
29c5e74d31 missing backslash
(cherry picked from commit 3c8867a1e8)
2019-05-15 11:40:36 +02:00
Mario Vavti
3c8867a1e8 missing backslash 2019-05-15 11:38:23 +02:00
Mario Vavti
c439fe0437 add autocomplete js to calendar and fix issue with extended likes mid
(cherry picked from commit 15a000bb45)
2019-05-14 09:14:04 +02:00
Max Kostikov
b21db670b4 Fix comments scroll button CSS
(cherry picked from commit d0322f5fbd)
2019-05-14 09:13:40 +02:00
Mario Vavti
1f84aa9809 css fixes
(cherry picked from commit c1f01b7e35)
2019-05-14 09:13:19 +02:00
Mario Vavti
4ac249c26c deal with privacy mentions in event descriptions
(cherry picked from commit 71064f481b)
2019-05-14 09:13:02 +02:00
zotlabs
85a29fce94 bbcode map bypass wasn't catching all map forms.
(cherry picked from commit 436293713b)
2019-05-14 09:12:35 +02:00
Mario
71ecb470b6 Merge branch 'dev' into 'dev'
bbcode map bypass wasn't catching all map forms.

See merge request hubzilla/core!1647
2019-05-14 09:10:48 +02:00
Mario Vavti
15a000bb45 add autocomplete js to calendar and fix issue with extended likes mid 2019-05-14 09:09:48 +02:00
Max Kostikov
18e4a7ac6e Merge branch 'dev' into 'dev'
Fix comments scroll button CSS

See merge request hubzilla/core!1649
2019-05-13 23:19:19 +02:00
Max Kostikov
d0322f5fbd Fix comments scroll button CSS 2019-05-13 23:16:36 +02:00
Mario Vavti
c1f01b7e35 css fixes 2019-05-13 22:00:40 +02:00
Mario Vavti
71064f481b deal with privacy mentions in event descriptions 2019-05-13 15:45:05 +02:00
zotlabs
436293713b bbcode map bypass wasn't catching all map forms. 2019-05-13 05:14:43 -07:00
Mario Vavti
fc726bfb4b fix button size 2019-05-13 13:11:14 +02:00
Mario Vavti
b0c3780667 fix button size 2019-05-13 13:02:23 +02:00
Mario Vavti
3e431c65be bump version 2019-05-13 12:17:08 +02:00
Mario Vavti
5b0b90d1f5 bump version, update autoload cache and update strings 2019-05-13 12:13:18 +02:00
Mario Vavti
d16714e84b calendar merge: cleanup 2019-05-13 11:30:13 +02:00
Mario Vavti
1d5fff9f58 upgrade jgrowl 2019-05-13 10:53:10 +02:00
Mario Vavti
fbe8d6144a port db_indexes() from zap 2019-05-13 10:46:12 +02:00
Mario Vavti
d5f59a57bf don't do oembed processing on naked links and smarty lib cleanup. ported from zap. 2019-05-13 10:39:40 +02:00
Mario Vavti
7465c79884 optimise oembed pdf processing so we do not actually load the content, which could cause performance issues. ported from zap. 2019-05-13 10:28:06 +02:00
Mario Vavti
769195fcff Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-05-13 10:14:06 +02:00
Mario Vavti
dc786bd1cc form security token for mod register ported from zap 2019-05-13 10:13:51 +02:00
Max Kostikov
960f4ed649 Merge branch 'dev' into 'dev'
Add new Russian translations

See merge request hubzilla/core!1646
2019-05-12 17:15:01 +02:00
Max Kostikov
91ad3bf1b6 Update hstrings.php 2019-05-12 17:09:59 +02:00
Max Kostikov
91b495d526 Update hmessages.po 2019-05-12 17:09:15 +02:00
Mario Vavti
973d91d120 add btlogger to unxmlify() 2019-05-11 16:42:53 +02:00
Max Kostikov
bf5deace8e Merge branch 'dev' into 'dev'
Replace photo URL for gallery on clonned channel post sync

See merge request hubzilla/core!1645
2019-05-11 15:46:16 +02:00
Max Kostikov
0e4acf6299 Replace photo URL for gallery on clonned channel post sync 2019-05-11 15:40:04 +02:00
Mario
a5cd0061c5 Merge branch 'dev' into 'dev'
use 'cache' flag to bbcode() on content destined for Zot6. We've seen rendered...

See merge request hubzilla/core!1644
2019-05-11 15:39:31 +02:00
Mario Vavti
630e3903fa bump version 2019-05-10 15:44:15 +02:00
Mario Vavti
0b6a5fad70 update justified gallery lib 2019-05-10 14:55:37 +02:00
Mario Vavti
67ca1b82cc css fix for bootstrap 4.3.1 2019-05-10 14:36:11 +02:00
Mario Vavti
9866053f0c update bootstrap to version 4.3.1 2019-05-10 14:21:36 +02:00
Mario Vavti
89a2c1a09c fix issue with color selector 2019-05-10 13:56:03 +02:00
Mario Vavti
70220d8b9c typo 2019-05-10 12:21:50 +02:00
Mario Vavti
274f69526f calendar merge: implement channel calendar import in cdav/calendar 2019-05-10 12:18:37 +02:00
zotlabs
d7026fe36b use 'cache' flag to bbcode() on content destined for Zot6. We've seen rendered map HTML in a couple of places and these should never be rendered for outgoing content as they will only be purified on the other end. 2019-05-09 22:06:32 -07:00
Max Kostikov
b9b65d7dfb Merge branch 'dev' into 'dev'
remove the caldav and event app and make calendar the default app

See merge request hubzilla/core!1643
2019-05-09 19:40:47 +02:00
Max Kostikov
1545c78d05 Merge branch 'dev' into 'dev'
Add 'Create' button translation in CalDAV

See merge request hubzilla/core!1642
2019-05-09 14:41:12 +02:00
Mario Vavti
f0c292e77b remove the caldav and event app and make calendar the default app 2019-05-09 14:39:40 +02:00
Max Kostikov
62336127e3 Add 'Create' button translation 2019-05-09 14:36:02 +02:00
Max Kostikov
5beaf8ac98 Add 'Create' button translation 2019-05-09 14:34:58 +02:00
Mario Vavti
9efd484e27 calendar merge: cleanup and comment out some unused code 2019-05-09 13:43:20 +02:00
Max Kostikov
44d5cf980a Merge branch 'dev' into 'dev'
another DB update to fix uid_mid index in item table and add xchan_photo_m index to xchan table

See merge request hubzilla/core!1641
2019-05-08 23:30:48 +02:00
Mario Vavti
e53650d6c6 another DB update to fix uid_mid index in item table and add xchan_photo_m index to xchan table 2019-05-08 20:12:54 +02:00
Max Kostikov
5bf9a9828c Merge branch 'channel_update' into 'dev'
Channel update

See merge request hubzilla/core!1639
2019-05-08 19:55:21 +02:00
Mario
24f3bc9f0c Channel update 2019-05-08 19:55:21 +02:00
Mario Vavti
c200e55f95 remove option which should never have slipped into dev branch 2019-05-08 16:15:26 +02:00
Max Kostikov
ea19d59fca Merge branch 'dev' into 'dev'
Replace own image URL in clonned channel posts

See merge request hubzilla/core!1638
2019-05-08 10:43:06 +02:00
Max Kostikov
d34d14c1f4 Replace own image URL in clonned channel posts 2019-05-08 10:40:46 +02:00
Max Kostikov
7b17306dbd Merge branch 'dev' into 'dev'
Change thumbnails processing logic on image edit

See merge request hubzilla/core!1637
2019-05-08 08:32:57 +02:00
Max Kostikov
6731564c2d Update Photos.php 2019-05-08 08:30:25 +02:00
Max Kostikov
194ba0cf8d Update PhotoDriver.php 2019-05-08 08:28:35 +02:00
Max Kostikov
6fc2429540 Merge branch 'dev' into 'dev'
Respect thumbnail storage location on image editing

See merge request hubzilla/core!1636
2019-05-08 01:54:18 +02:00
Max Kostikov
bdcbe61273 Respect thumbnail storage location on image editing 2019-05-08 01:52:10 +02:00
Max Kostikov
de5d7bfbd3 Add photo usage detection if not exist on thumbnail save 2019-05-08 00:49:41 +02:00
Mario
242878c45c Merge branch 'dev' into 'dev'
possible xchan confusion include/follow

See merge request hubzilla/core!1635
2019-05-06 13:49:17 +02:00
zotlabs
c0911da887 review of last commit 2019-05-06 04:19:54 -07:00
zotlabs
6e0bf04276 possible xchan (protocol) confusion in include/follow 2019-05-06 04:15:34 -07:00
Max Kostikov
56c460d932 Merge branch 'dev' into 'dev'
Remove 'os_syspath' from direct 'photo' table update

See merge request hubzilla/core!1634
2019-05-06 10:46:11 +02:00
Max Kostikov
f0933b66a9 Remove 'os_syspath' from direct 'photo' table update 2019-05-06 10:39:47 +02:00
Max Kostikov
422d633f89 Add system.filesystem_storage_thumbnails description 2019-05-05 20:17:32 +02:00
Max Kostikov
0537be129c More precise scroll back to initial comment in thread 2019-05-05 19:00:00 +02:00
Max Kostikov
9b947c8370 Merge branch 'dev' into 'dev'
Threaded comments usability imrovements

See merge request hubzilla/core!1633
2019-05-05 18:15:58 +02:00
Max Kostikov
14eb4326e7 Scroll back to initial low level comment 2019-05-05 18:13:00 +02:00
Max Kostikov
89a3e8fcc7 Use own variable for "Go to previous comment" hint 2019-05-05 18:10:53 +02:00
Max Kostikov
6fd5133bed Force to add "go to previous comment" hint 2019-05-05 18:09:25 +02:00
Max Kostikov
e010877490 Scroll back if more than one level in thread 2019-05-05 18:07:44 +02:00
Max Kostikov
f56371c79b Merge branch 'dev' into 'dev'
Threaded comments navigation elements fixes

See merge request hubzilla/core!1632
2019-05-05 15:41:17 +02:00
Max Kostikov
c98f3c5d29 Threaded comments navigation elements fixes 2019-05-05 15:38:08 +02:00
Max Kostikov
5c8de9d82f Allign arrows position 2019-05-05 14:28:15 +02:00
Mario
b9c8b6ba23 Merge branch 'dev' into 'dev'
Add arrows to scroll between related comments

See merge request hubzilla/core!1629
2019-05-05 14:14:07 +02:00
Max Kostikov
6cd968b53b Add arrows to scroll between related comments 2019-05-05 14:14:07 +02:00
Max Kostikov
2aa76d257c Merge branch 'db_update' into 'dev'
port db update improvements from zap

See merge request hubzilla/core!1628
2019-05-04 22:37:21 +02:00
Max Kostikov
32c0be8bde Merge branch 'dev' into 'dev'
found another case where channel_r_photos could get referenced

See merge request hubzilla/core!1631
2019-05-04 12:05:38 +02:00
zotlabs
88d283a89d found another case where channel_r_photos could get referenced 2019-05-04 02:58:57 -07:00
Max Kostikov
66b370c421 Merge branch 'dev' into 'dev'
strip obsolete channel_(rw)_photos from channel sync packets

See merge request hubzilla/core!1630
2019-05-04 10:32:31 +02:00
zotlabs
20bf139b3f strip obsolete channel_(rw)_photos from channel sync packets 2019-05-03 15:27:26 -07:00
Mario Vavti
1da4602567 port db update improvements from zap 2019-05-03 15:13:13 +02:00
Max Kostikov
e7ef69e6e7 Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1627
2019-05-03 14:59:58 +02:00
Max Kostikov
d55904d4db Update hstrings.php 2019-05-03 14:52:43 +02:00
Max Kostikov
740dc59255 Update hmessages.po 2019-05-03 14:52:08 +02:00
Mario
98b6362c07 Merge branch 'dev' into 'dev'
removing items from ex-connections turns out to be more complicated than originally envisioned

See merge request hubzilla/core!1626
2019-05-03 14:16:56 +02:00
Mario Vavti
cd829c096b update directory on cover photo changes 2019-05-03 14:11:14 +02:00
zotlabs
f127c55802 removing items from ex-connections turns out to be more complicated than originally envisioned 2019-05-03 04:09:04 -07:00
zotlabs
13247a0e00 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-05-03 04:04:02 -07:00
Max Kostikov
609752d331 Merge branch 'revert-3528610a' into 'dev'
Revert "Fix comment edit field expansion on reply on comment"

See merge request kostikov/core!1
2019-05-03 10:09:54 +02:00
Max Kostikov
413410d02d Revert "Fix comment edit field expansion on reply on comment"
This reverts commit 3528610a51
2019-05-03 10:09:54 +02:00
Max Kostikov
3528610a51 Fix comment edit field expansion on reply on comment 2019-05-03 10:03:40 +02:00
Mario Vavti
59ee045c24 parent -> id 2019-05-03 09:01:53 +02:00
zotlabs
b1dec12893 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-05-03 00:00:00 -07:00
zotlabs
319b0acdd8 fix item query 2019-05-02 23:58:51 -07:00
Mario
c605c46f83 Merge branch 'replyto_fixes' into 'dev'
provide xchan_url if there is no xchan_addr

See merge request hubzilla/core!1622
2019-05-03 08:41:01 +02:00
Mario
9ef692b48c Merge branch 'dev' into 'dev'
work on emoji reactions - sync with matching update to addons

See merge request hubzilla/core!1623
2019-05-03 08:39:01 +02:00
Mario
6da4dfe605 Merge branch 'unfriend_delete_posts_bug' into 'dev'
Unfriend delete posts bug

See merge request hubzilla/core!1624
2019-05-03 08:36:58 +02:00
zotlabs
7b4cb31a10 when removed items for unfriended connections, check if the parent has been retained, not just the item 2019-05-02 22:34:34 -07:00
zotlabs
03ce4d7e2b Merge branch 'dev' of ../hz into dev 2019-05-02 21:19:15 -07:00
zotlabs
f55f5fa92a emojireaction compat 2019-05-02 21:18:54 -07:00
zotlabs
76757ad1f2 Merge branch 'dev' of /home/macgirvin/hz into dev 2019-05-02 20:33:45 -07:00
zotlabs
347e88dc65 move apschema to core to use for emojiReaction mapping for zot6 2019-05-02 20:32:26 -07:00
Mario Vavti
746d032e58 more provide xchan_url if there is no xchan_addr 2019-05-02 13:05:52 +02:00
Mario Vavti
b6d598a001 provide xchan_url if there is no xchan_addr 2019-05-02 12:58:24 +02:00
Max Kostikov
b35961c53c Merge branch 'dev' into 'dev'
Add check if threads are enabled globally

See merge request hubzilla/core!1621
2019-05-02 11:42:39 +02:00
Max Kostikov
47fba5827b Merge branch 'dev' into 'dev'
# Conflicts:
#   Zotlabs/Lib/ThreadItem.php
2019-05-02 11:33:07 +02:00
Max Kostikov
47f75ad8bf Add check if threads are enabled globally 2019-05-02 11:28:29 +02:00
Max Kostikov
516167c0f8 Revert "Merge branch 'dev' into 'dev'"
This reverts merge request !1620
2019-05-02 10:58:00 +02:00
Mario
238b3a97a8 Merge branch 'dev' into 'dev'
Check if 'reply on comment' enabled for this profile

See merge request hubzilla/core!1620
2019-05-02 10:48:55 +02:00
Max Kostikov
d4ab8a5a5d Check if 'reply on comment' enabled for this profile 2019-05-02 10:40:33 +02:00
Mario Vavti
6672299f8a calendar merge: use b64 encoded mid for plink 2019-05-02 10:11:08 +02:00
Max Kostikov
ea5f515f18 Merge branch 'dev' into 'dev'
Add Zap threads support

See merge request hubzilla/core!1619
2019-05-02 08:33:51 +02:00
Max Kostikov
ea6293544d Add Zap threads support 2019-05-02 08:30:38 +02:00
Max Kostikov
cbe35281b9 Merge branch 'dev' into 'dev'
Add AS threaded comments support

See merge request hubzilla/core!1618
2019-05-01 21:45:12 +02:00
Max Kostikov
51a0fc45e2 Add threaded comments support 2019-05-01 21:40:43 +02:00
Max Kostikov
1e7e2bd34f Update Item.php 2019-05-01 19:10:46 +02:00
Max Kostikov
fa2f3d136f Merge branch 'xmlify' into 'dev'
address xmlify/unxmlify performance issue

See merge request hubzilla/core!1616
2019-05-01 16:41:19 +02:00
Max Kostikov
92b6026695 Merge branch 'dev' into 'dev'
Use thr_parent tp handle reply on comment feature

See merge request hubzilla/core!1617
2019-05-01 16:10:40 +02:00
Mario Vavti
c9a5f21344 calendar merge: remove deprecated share variable 2019-05-01 15:52:17 +02:00
Max Kostikov
0174bf3722 Fix missprint 2019-05-01 15:49:17 +02:00
Max Kostikov
0d003e7450 Preserve parent_mid with threaded comments 2019-05-01 15:45:12 +02:00
Mario Vavti
8847838c43 address xmlify/unxmlify performance issue 2019-05-01 15:40:06 +02:00
Mario Vavti
9594ce9a8a calendar merge: fix event_xchan mixup 2019-05-01 15:35:20 +02:00
Max Kostikov
4a91d09c86 Use thr_parent for comment replies 2019-05-01 15:33:59 +02:00
Max Kostikov
06837bd32b Revert code to use thr_parent for comment replies 2019-05-01 15:12:01 +02:00
Mario
b8d8887d5a Merge branch 'dev' into 'dev'
a couple of issues with the suggestions when viewing from the directory module

See merge request hubzilla/core!1615
2019-05-01 10:07:07 +02:00
Mario
256f8dd41b Merge branch 'dev' into 'dev'
Add 'reply on comment' feature

See merge request hubzilla/core!1614
2019-05-01 10:06:24 +02:00
zotlabs
e0fdafc7e5 Merge branch 'dev' of ../hz into dev 2019-04-30 23:39:56 -07:00
zotlabs
9a55df245f disable directory options when using suggestion mode and only return one page (60 items)
so that sorting works correctly
2019-04-30 23:38:48 -07:00
zotlabs
9800d95c50 fix suggestion ordering in directory module 2019-04-30 23:19:04 -07:00
Max Kostikov
c340416c94 Add 'reply on comment' code 2019-05-01 06:24:58 +02:00
Max Kostikov
9af8a1d30c Move JS to main module 2019-05-01 06:23:56 +02:00
Max Kostikov
4da96ee980 Remove 'doreply' JS function 2019-04-30 17:35:53 +02:00
Max Kostikov
21637e033c Add JS 'doreply' function 2019-04-30 17:34:56 +02:00
Max Kostikov
9ebf2dc97b Add "reply to" hint to submit button 2019-04-30 17:33:54 +02:00
Mario Vavti
a04689b784 do not allow editing events that do not belong to us 2019-04-30 12:08:19 +02:00
Max Kostikov
5066945adc Fix add multiple icons on 'Submit' button when reply on comment 2019-04-30 11:17:22 +02:00
Max Kostikov
e945c12856 Add displaying support for threaded comments 2019-04-30 11:00:13 +02:00
Mario Vavti
0b062d0b8a select event by event_hash instead of item_id 2019-04-30 10:47:48 +02:00
Mario Vavti
9cc1eff15c remove logging 2019-04-30 00:12:19 +02:00
Mario Vavti
327e5d06e1 calendar merge: implement single event editing UI 2019-04-30 00:09:57 +02:00
Max Kostikov
a2dd0aea92 Merge branch 'cherry-pick-80ca2023' into 'dev'
Add 'reply on comment' feature

See merge request kostikov/core!1
2019-04-29 23:45:58 +02:00
Max Kostikov
39da3459c7 Add 'reply on comment' feature
(cherry picked from commit 80ca2023aa67ef7c0c43414acaf135e5748044b2)
2019-04-29 23:43:11 +02:00
Max Kostikov
c0be4c36e1 Update main.js 2019-04-29 23:40:21 +02:00
Max Kostikov
31e04378cd Add 'reply to comment' processing 2019-04-29 23:30:51 +02:00
Max Kostikov
e80c99ad74 Add 'reply to comment' button 2019-04-29 23:29:16 +02:00
Max Kostikov
d9be443e53 Add initial threaded comments support 2019-04-29 23:26:20 +02:00
Max Kostikov
6db323b15e Add variables for threaded comments support 2019-04-29 23:24:48 +02:00
Max Kostikov
5abbfd3f19 Add initial threaded comment support 2019-04-29 23:21:17 +02:00
Mario
674215e9e6 Merge branch 'dev' into 'dev'
Add jot videos inline and with poster if possible

See merge request hubzilla/core!1613
2019-04-29 11:58:59 +02:00
Mario Vavti
dce6a5763d calendar merge: d&d support and some minor cleanup and fixes 2019-04-29 11:45:55 +02:00
zotlabs
d89d6e8a01 Merge branch 'dev' of ../hz into dev 2019-04-28 18:21:41 -07:00
zotlabs
6230dbed2d Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-28 18:21:28 -07:00
zotlabs
9641254443 event attachments still weren't being delivered to zot6 2019-04-28 18:20:40 -07:00
zotlabs
95871fe13c Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-28 17:47:26 -07:00
Max Kostikov
0cecfceb14 Merge branch 'sql_fixes' into 'dev'
possible sql performance improvement

See merge request hubzilla/core!1611
2019-04-28 20:59:53 +02:00
zotlabs
13970280d9 Merge branch 'dev' of ../hz into dev 2019-04-27 17:22:00 -07:00
zotlabs
55ce80aabe Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-27 17:21:42 -07:00
zotlabs
9536a490b3 Add jot videos inline and with poster if possible 2019-04-27 17:20:38 -07:00
Mario Vavti
405e07f0a2 improve channel date query 2019-04-27 23:01:05 +02:00
Max Kostikov
d3ce91bd89 Merge branch 'dev' into 'dev'
Use goaway() base function

See merge request hubzilla/core!1612
2019-04-27 21:47:57 +02:00
Max Kostikov
eb44201c5f Use goaway() base function 2019-04-27 21:38:54 +02:00
Mario Vavti
73248aadd5 possible sql performance improvement 2019-04-27 15:35:41 +02:00
Mario Vavti
a518471a27 update changelog 2019-04-26 11:28:06 +02:00
Mario
a6f50b8c85 Merge branch 'dev' into 'dev'
import/export zot6 hublocs+xchans

See merge request hubzilla/core!1610
2019-04-26 09:34:58 +02:00
Zot
e2dfa1d72f import/export zot6 hublocs+xchans 2019-04-26 09:34:58 +02:00
zotlabs
9a61c0a6fc Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-26 00:28:29 -07:00
zotlabs
e10b25a12c Merge branch 'dev' of ../hz into dev 2019-04-26 00:25:32 -07:00
zotlabs
0c1e803208 import/export zot6 hublocs+xchans 2019-04-26 00:24:58 -07:00
Mario
b57dcc74d1 Merge branch 'dev' into 'dev'
update fix_system_urls() to handle zot6 hublocs (recommend cherry-pick to master)

See merge request hubzilla/core!1609
2019-04-26 09:12:23 +02:00
Zot
f8c583636c update fix_system_urls() to handle zot6 hublocs (recommend cherry-pick to master) 2019-04-26 09:12:23 +02:00
zotlabs
e6521d1cf3 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-25 21:49:18 -07:00
zotlabs
96785e8df1 update fix_system_urls() to handle zot6 hublocs 2019-04-25 21:45:04 -07:00
Mario
d689778465 Merge branch 'dev' into 'dev'
hubloc confusion in magic auth

See merge request hubzilla/core!1608
2019-04-25 11:54:37 +02:00
Zot
3c8f8b76aa hubloc confusion in magic auth 2019-04-25 11:54:37 +02:00
Mario Vavti
c123fa5422 update blueimp/jquery-file-upload 2019-04-25 11:50:26 +02:00
Mario Vavti
0ade8be7f7 add missing files 2019-04-25 11:47:59 +02:00
Mario Vavti
a60c2f38c6 update sabre/vobject 2019-04-25 11:47:18 +02:00
Mario
f1c0797780 Revert "update composer libs"
This reverts commit e779335d06
2019-04-25 11:24:09 +02:00
Mario
701167bc12 Revert "fix test"
This reverts commit c5fca0a1e7
2019-04-25 11:22:45 +02:00
Mario
a39e63e324 Revert "dbunit does not work wirh phpunit v 8.1.3 - try 7.5.9"
This reverts commit 8401e9c2b4
2019-04-25 11:22:21 +02:00
Mario Vavti
8401e9c2b4 dbunit does not work wirh phpunit v 8.1.3 - try 7.5.9 2019-04-25 11:14:40 +02:00
Mario Vavti
c5fca0a1e7 fix test 2019-04-25 10:52:57 +02:00
Mario Vavti
e779335d06 update composer libs 2019-04-25 08:52:50 +02:00
zotlabs
26039adf5b compound name warning 2019-04-24 16:31:31 -07:00
zotlabs
c88286556a hubloc confusion during magic auth where hublocs with more than one network may exist 2019-04-24 16:21:59 -07:00
zotlabs
831b9d4433 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-24 16:21:13 -07:00
Mario
e937e8fff9 Merge branch 'dev' into 'dev'
Add modification date in Etag hash calculation and optimize cached photos processing

See merge request hubzilla/core!1607
2019-04-24 21:11:19 +02:00
Mario Vavti
f616b2d49a calendar merge: bring back event categories 2019-04-24 14:48:30 +02:00
Max Kostikov
fe84dae313 Optimize cached photos processing 2019-04-24 11:18:17 +02:00
Max Kostikov
9104933b18 Add modified date in Etag hash calculation 2019-04-24 11:13:17 +02:00
Max Kostikov
79654635d3 Merge branch 'update-docs' into 'dev'
Update docs

See merge request hubzilla/core!1606
2019-04-22 19:49:08 +02:00
Max Kostikov
f0edfca75c Merge branch 'fix-infinite-loop' into 'dev'
Fix infinite loop using postgres as backend

See merge request hubzilla/core!1605
2019-04-22 19:47:49 +02:00
Daniel Lowe
e845da2edc Tidy up various bits of documentation 2019-04-22 15:50:02 +00:00
Daniel Lowe
7a3050f2c0 Remove section on techlevels 2019-04-22 15:49:39 +00:00
Daniel Lowe
9a6531e2a2 Fix infinite loop using postgres as backend
unescapebin is handed a string in some cases, and it causes an infinite
loop when it does.  This ensures that the argument is a resource before
loading its contents.
2019-04-21 11:14:17 +00:00
Max Kostikov
a6a17a85f3 Merge branch 'calendar_merge' into 'dev'
calendar merge - initial checkin

See merge request hubzilla/core!1599
2019-04-20 20:14:58 +02:00
Mario Vavti
9275fd16c2 resolve merge conflict 2019-04-20 10:23:11 +02:00
Max Kostikov
904ae05810 Merge branch 'dev' into 'dev'
Add anti SEO link properties in directory listing

See merge request hubzilla/core!1603
2019-04-19 23:19:38 +02:00
Max Kostikov
54f95389a8 Add anti SEO link properties in directory listing 2019-04-19 23:17:24 +02:00
Max Kostikov
a8fc70a5b9 Merge branch 'dev' into 'dev'
Fix update button in cdav_calendar.tpl

See merge request hubzilla/core!1602
2019-04-19 21:26:48 +02:00
Max Kostikov
c374072822 Update cdav_calendar.tpl 2019-04-19 21:22:42 +02:00
Max Kostikov
0212de68a4 Merge branch 'dev' into 'dev'
Add translation to calendar event update button

See merge request hubzilla/core!1601
2019-04-19 21:14:29 +02:00
Max Kostikov
2ea9b6d409 Add translation to update button 2019-04-19 21:11:34 +02:00
Max Kostikov
823d71df28 Merge branch 'dev' into 'dev'
Fix translation to update button

See merge request hubzilla/core!1600
2019-04-19 21:06:09 +02:00
Max Kostikov
7560918b32 Add translation to update button 2019-04-19 21:04:00 +02:00
Mario Vavti
fd87faa7a6 Merge branch 'dev' into calendar_merge 2019-04-19 19:37:06 +02:00
Mario Vavti
cb2d706fa1 provide location and description information 2019-04-19 19:06:01 +02:00
Mario
6b638ac896 Merge branch 'dev' into 'dev'
Add remove profile photo button

See merge request hubzilla/core!1598
2019-04-19 17:23:10 +02:00
Mario Vavti
2bd5ae3617 provide link to source and some cleanup 2019-04-19 17:21:45 +02:00
Mario Vavti
39a5311315 Merge branch 'dev' into calendar_merge 2019-04-19 15:34:02 +02:00
Mario Vavti
9b6e46dc6b calendar merge initial commit 2019-04-19 15:32:56 +02:00
Max Kostikov
7311d1182d Add remove profile photo button 2019-04-19 15:30:05 +02:00
Max Kostikov
ea1d8b8104 Add remove profile photo button 2019-04-19 15:29:08 +02:00
Mario
fb03e3f00e Merge branch 'dev' into 'dev'
required php version not available but allowed to continue

See merge request hubzilla/core!1597
2019-04-19 15:19:43 +02:00
Mario
c9c35255e7 Merge branch 'dev' into 'dev'
Precise cache related headers processing; remove duplicated code and optimization

See merge request hubzilla/core!1596
2019-04-19 15:19:19 +02:00
Mario
99a578dbad Merge branch 'homeinstall_certbot' into 'dev'
Letsencrypt: replaced dehydrated by certbot. Backup: replaced rsnaphsot by...

See merge request hubzilla/core!1592
2019-04-19 15:18:42 +02:00
zotlabs
e56c0a6251 Merge branch 'dev' of ../hm into dev 2019-04-18 13:59:06 -07:00
zotlabs
66479e2aa7 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-18 13:58:43 -07:00
zotlabs
6feddcbced required php version not available but allowed to continue 2019-04-18 13:53:39 -07:00
Max Kostikov
db020ca1a3 Update Photo.php 2019-04-18 21:55:06 +02:00
Max Kostikov
6c93518ef7 Merge branch 'dev' into 'dev'
add attachments to zot6 event objects, add zot6 to federated transports (webfinger)

See merge request hubzilla/core!1593
2019-04-18 20:59:41 +02:00
Max Kostikov
eb02d01eed Update Photo.php 2019-04-18 10:13:03 +02:00
Max Kostikov
7a9093f634 Implement ETag: header support for cache control 2019-04-18 09:50:37 +02:00
Max Kostikov
1732b2dfe3 Add 'must-revalidate' to Cache-control header for profile photos 2019-04-17 23:15:46 +02:00
Max Kostikov
a62f891a60 Precise 'Modified:' header processing if no profile photo added; remove duplicated code 2019-04-17 18:30:50 +02:00
zotlabs
a22ecd42ed Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-16 18:34:41 -07:00
Max Kostikov
b7cb2a2951 Merge branch 'dev' into 'dev'
Fix file path with filesystem storage

See merge request hubzilla/core!1595
2019-04-16 22:26:53 +02:00
Max Kostikov
c490970324 Fix file path with filesystem storage 2019-04-16 22:24:48 +02:00
Max Kostikov
5a9c8a9343 Merge branch 'dev' into 'dev'
Use base image content instead of os_path; fix base images stats

See merge request hubzilla/core!1594
2019-04-16 17:37:07 +02:00
Max Kostikov
5ba7e5d7d7 Use base image content instead of os_path; fix base images stats 2019-04-16 17:31:27 +02:00
zotlabs
f7b281a65f Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-15 22:29:50 -07:00
zotlabs
df5a1c59e6 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2019-04-15 20:53:44 -07:00
zotlabs
0615709a7a add attachments to zot6 event objects, add zot6 to federated transports (webfinger) 2019-04-15 20:51:57 -07:00
OJ Random
d85a0130b7 Letsencrypt: replaced dehydrated by certbot. Backup: replaced rsnaphsot by rsync. Readme: changed install instructions. 2019-04-15 21:01:13 +02:00
Mario
71f17a233e Merge branch 'dev' into 'dev'
Extending GitLab CI/CD.

See merge request hubzilla/core!1589
2019-04-15 17:52:52 +02:00
Max Kostikov
25c35cbbe4 Merge branch 'dev' into 'dev'
Update INSTALL.txt

See merge request hubzilla/core!1591
2019-04-15 15:20:51 +02:00
Max Kostikov
257ba570ee Update INSTALL.txt 2019-04-15 15:18:35 +02:00
Max Kostikov
91e96b2314 Merge branch 'dev' into 'dev'
Update Russian translation

See merge request hubzilla/core!1590
2019-04-15 12:55:34 +02:00
Max Kostikov
c2ee7cbff5 Update Russian hstrings.php 2019-04-15 12:25:40 +02:00
Max Kostikov
27f813e043 Update Russian hmessages.po 2019-04-15 12:24:51 +02:00
Max Kostikov
00ed91f12e Fix space in plurals regexp 2019-04-15 12:23:55 +02:00
Max Kostikov
4cb5efc277 Add command line tool for thumbnails storage convertion 2019-04-14 20:16:16 +02:00
Klaus Weidenbach
65a453d21b Extending GitLab CI/CD.
Add PHP7.3 image and .gitlab-ci.yml restructuring.
Use YAML Anchors for job templates.
Add more DB/PHP version combinations.
2019-04-13 22:55:03 +02:00
Mario
9c8cb4dea3 Merge branch 'dev' into 'dev'
Thumbnails storage in filesystem or database implementation

See merge request hubzilla/core!1588
2019-04-13 21:19:06 +02:00
Max Kostikov
ed902fdb70 Update photo usage only for thumbnails 2019-04-13 14:12:58 +02:00
Max Kostikov
509067391b Update xchan profile edited date only once 2019-04-13 14:08:44 +02:00
Max Kostikov
04b261057d Set 'os_syspath' with local path 2019-04-12 22:34:32 +02:00
Max Kostikov
852343f254 Override received 'content' if we saving thumbnail in filesystem 2019-04-12 16:27:58 +02:00
Max Kostikov
26e35344d0 Add multiple profiles support on image operations in photo driver 2019-04-12 15:53:00 +02:00
Max Kostikov
d3a619659f Fix 'os_syspath' if we store thumbnails in filesystem 2019-04-12 15:38:10 +02:00
Max Kostikov
979f2415fb Save profile photo in filesystem or database; more precise modification time processing 2019-04-12 15:06:59 +02:00
Max Kostikov
28c1d219f6 Save cover photo thumbnails in filesystem or database 2019-04-12 15:03:59 +02:00
Max Kostikov
5792f4bf07 Add comment on required changes in upcoming releases 2019-04-12 15:00:56 +02:00
Max Kostikov
3a0fa5cb29 Store thumbnails in filesystem or database 2019-04-12 14:59:13 +02:00
Max Kostikov
074ee656f0 Fetch thumbnails and store it in filesystem or DB; update xchan profile edit time on fetch 2019-04-12 14:56:07 +02:00
Mario
064f93185c Merge branch 'dev' into 'dev'
Fix use UNIX socket file to connect DB

See merge request hubzilla/core!1587
2019-04-12 14:49:01 +02:00
Max Kostikov
4b5922f652 Fix wrong image resolution selection 2019-04-10 22:09:10 +02:00
Max Kostikov
85be906b68 Fix image scale on thumbnail save 2019-04-10 14:44:50 +02:00
Max Kostikov
775285cdf8 Update comment htconfig.sample.php 2019-04-10 14:14:14 +02:00
Max Kostikov
42f96dc7a6 Fix use UNIX socket file to connect DB 2019-04-10 14:13:16 +02:00
Mario
e96fa64625 Merge branch 'dev' into 'dev'
Dev

See merge request hubzilla/core!1586
2019-04-10 13:25:57 +02:00
Mario
8dc495c9bc Merge branch 'dev' into 'dev'
Initial preparation to move local thumbnails in filesystem storage

See merge request hubzilla/core!1585
2019-04-10 13:25:03 +02:00
Max Kostikov
5d70d889e9 Revert "Update htconfig.sample.php"
This reverts commit f2126ef18c8b66020305d07dcefeacc4e55a3c12
2019-04-10 13:25:03 +02:00
zotlabs
999ae6eb49 typo 2019-04-08 17:03:08 -07:00
zotlabs
ae1450bbcf missing endTime on Zot6 encoded events, optimise the url fetch of embedphotos 2019-04-08 16:45:07 -07:00
zotlabs
1ed0079882 Merge branch 'dev' of https://gitlab.com/macgirvin/hubzilla into dev 2019-04-07 19:23:38 -07:00
zotlabs
2d886b65ce permissions cleanup 2019-04-05 18:06:59 -07:00
Manuel Jiménez Friaza
f92d2e3f7c Quickfix es-es/hstrings.php 2019-02-21 18:32:45 +01:00
Manuel Jiménez Friaza
a9b75d059b Fix es-es/hstrings.php 2019-02-21 12:40:27 +01:00
Manuel Jiménez Friaza
e6f289deb6 Update Spanish translation 2019-02-21 11:30:17 +01:00
Manuel Jiménez Friaza
0e22618d93 Merge remote-tracking branch 'upstream/dev' into dev 2019-02-21 11:18:59 +01:00
Manuel Jiménez Friaza
c5bb074573 Merge remote-tracking branch 'upstream/dev' into dev 2019-02-19 12:15:59 +01:00
Manuel Jiménez Friaza
4e8fc6d198 Merge remote-tracking branch 'upstream/dev' into dev 2019-01-20 12:58:27 +01:00
Manuel Jiménez Friaza
618d673947 Merge remote-tracking branch 'upstream/dev' into dev 2018-12-13 12:34:04 +01:00
Manuel Jiménez Friaza
4cd5529027 Merge remote-tracking branch 'upstream/dev' into dev 2018-12-05 12:32:33 +01:00
Manuel Jiménez Friaza
5ac08ec3aa Revision 1 doc/es-es/about/about.bb 2018-11-26 12:43:24 +01:00
3484 changed files with 296751 additions and 653721 deletions

View File

@@ -1,8 +1,7 @@
# Select image from https://hub.docker.com/_/php/
#image: php:7.2
# Use a prepared Hubzilla image to optimise pipeline run
image: registry.gitlab.com/dawnbreak/hubzilla/core:php7.2
#image: php:7.3
# Use a prepared Hubzilla image to optimise pipeline duration
image: registry.gitlab.com/dawnbreak/hubzilla/core:php7.3
stages:
- test
@@ -32,55 +31,28 @@ variables:
before_script:
# pecl and composer do not work with PHP production restrictions (from Hubzilla Docker image)
- if [ -f /usr/local/etc/php/conf.d/z_prod.ini ]; then mv /usr/local/etc/php/conf.d/z_prod.ini /usr/local/etc/php/conf.d/z_prod.ini.off; fi
# Install & enable Xdebug for code coverage reports
- pecl install xdebug
- docker-php-ext-enable xdebug
# Install composer
- curl -sS https://getcomposer.org/installer | php
# Install dev libraries from composer
- php composer.phar install --no-progress
- php ./composer.phar install --no-progress
# test PHP7 with MySQL 5.7
php7.2_mysql 1/2:
# hidden job definition with template for MySQL/MariaDB
.job_template_mysql: &job_definition_mysql
stage: test
services:
- mysql:5.7
script:
- echo "USE $MYSQL_DATABASE; $(cat ./install/schema_mysql.sql)" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
- echo "SHOW DATABASES;" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
- echo "USE $MYSQL_DATABASE; SHOW TABLES;" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
- vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-text
# test PHP7 with MySQL latest (8)
php7.2_mysql 2/2:
stage: test
services:
- name: mysql:latest
command: ["--default-authentication-plugin=mysql_native_password"]
script:
- echo "USE $MYSQL_DATABASE; $(cat ./install/schema_mysql.sql)" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
- echo "SHOW DATABASES;" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
- echo "USE $MYSQL_DATABASE; SHOW TABLES;" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
- vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-text
# test PHP7 with MariaDB latest (10.3)
php7.2_mariadb:
stage: test
services:
- name: mariadb:latest
alias: mysql
script:
- echo "USE $MYSQL_DATABASE; $(cat ./install/schema_mysql.sql)" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
- echo "SHOW DATABASES;" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
- echo "USE $MYSQL_DATABASE; SHOW TABLES;" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
- vendor/bin/phpunit --configuration tests/phpunit.xml --coverage-text
# test PHP7 with PostgreSQL latest
php7.2_postgres:
# hidden job definition with template for PostgreSQL
.job_template_postgres: &job_definition_postgres
stage: test
services:
- postgres:latest
@@ -95,7 +67,10 @@ php7.2_postgres:
#- psql -h "postgres" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "\dt;"
# Run the actual tests
- vendor/bin/phpunit --configuration tests/phpunit-pgsql.xml --testdox
artifacts:
# hidden job definition with artifacts config template
.artifacts_template:
artifacts: &artifacts_template
expire_in: 1 week
# Gitlab should show the results, but has problems parsing PHPUnit's junit file.
reports:
@@ -106,7 +81,52 @@ php7.2_postgres:
- tests/results/
# Generate Doxygen API Documentation and deploy it at GitLab pages
# PHP7.3 with MySQL 5.7
php7.3_mysql5.7:
<<: *job_definition_mysql
services:
- mysql:5.7
# PHP7.3 with MySQL 8 (latest)
php7.3_mysql8:
<<: *job_definition_mysql
services:
- name: mysql:8
command: ["--default-authentication-plugin=mysql_native_password"]
# PHP7.3 with MariaDB 10.2
php7.3_mariadb10.2:
<<: *job_definition_mysql
services:
- name: mariadb:10.2
alias: mysql
# PHP7.3 with MariaDB 10.3 (latest)
php7.3_mariadb10.3:
<<: *job_definition_mysql
image: registry.gitlab.com/dawnbreak/hubzilla/core:php7.3
services:
- name: mariadb:10.3
alias: mysql
# PHP7.3 with PostgreSQL latest (11)
php7.3_postgres11:
<<: *job_definition_postgres
artifacts: *artifacts_template
# PHP7.3 with PostgreSQL latest (11)
php7.3_postgres11:
<<: *job_definition_postgres
image: registry.gitlab.com/dawnbreak/hubzilla/core:php7.3
artifacts: *artifacts_template
# Generate Doxygen API Documentation and deploy it as GitLab pages
pages:
stage: deploy
cache: {}

View File

@@ -1,22 +1,10 @@
# Hubzilla at Home next to your Router
Run hubzilla-setup.sh for an unattended installation of hubzilla.
The script is known to work without adjustments with
+ Hardware
- Mini-PC with Debian-9.5-amd64, or
- Rapberry 3 with Raspbian, Debian-9.5
+ DynDNS
- selfHOST.de
- freedns.afraid.org
# How to use
## Disclaimers
- This script does work with Debian 9 only.
- This script has to be used on a fresh debian install only (it does not take account for a possibly already installed and configured webserver or sql implementation).
# Step-by-Step Overwiew
- This script does work with Debian 10 only.
- This script has to be used on a fresh debian install only (it does not take account for a possibly already installed and configured webserver or sql implementation). You may use it to install several hub/instances on the same server, though.
## Preconditions
@@ -28,97 +16,99 @@ Hardware
Software
+ Fresh installation of Debian 9 (Stretch)
+ Router with open ports 80 and 443 for your Hub
+ Fresh installation of Debian 10 (Buster)
+ Router with open ports 80 and 443 for your web server
## The basic steps (quick overview)
You can of course run the script on a VPS or any distant server as long as the above sotfware requirements are satisfied.
## How to run the script
+ Register your own domain (for example at selfHOST) or a free subdomain (for example at freeDNS)
+ Log on to your fresh Debian
- apt-get install git
- mkdir -p /var/www
- cd /var/www
- git clone https://framagit.org/hubzilla/core.git html
- git clone https://framagit.org/hubzilla/core.git html (you can replace "html" with any folder name you like, which you'll have to do if you plan to have more than one hub/instance running on your server)
- cd html/.homeinstall
- cp hubzilla-config.txt.template hubzilla-config.txt
- nano hubzilla-config.txt
- cp zotserver-config.txt.template zotserver-config.txt
- nano zotserver-config.txt
- Read the comments carefully
- Enter your values: db pass, domain, values for dyn DNS
- Make sure your external drive (for backups) is mounted
- hubzilla-setup.sh as root
- ... wait, wait, wait until the script is finised
- reboot
+ Open your domain with a browser and step throught the initial configuration of hubzilla.
## Troubleshooting
If the check of the mail address fails when you try to register the very first user in the browser. Do...
cd /var/www/html
util/config system.do_not_check_dns 1
- Prepare your external disk for backups
- ./zotserver-setup.sh as root
- ... wait, wait, wait until the script is finished
+ Open your domain with a browser and step throught the initial configuration of your hub/instance.
## Optional - Set path to imagemagick
In Admin settings of hubzilla or via terminal
In Admin settings of your hub/instance or via terminal
cd /var/www/html
cd /var/www/html (or the custom path you chose)
util/config system.imagick_convert_path /usr/bin/convert
# Step-by-Step in Detail
## Optional - Switch verification of email on/off
## Preparations Hardware
Do this just before you register the first user.
### Mini-PC
In Admin settings of your hub/instance or via terminal
### Recommended: USB Drive for Backups
cd /var/www/html
The installation will create a daily backup written to an external drive.
Check the current setting
The USB drive must be compatible with the filesystems
util/config system verify_email
- ext4 (if you do not want to encrypt the USB)
- LUKS + ext4 (if you want to encrypt the USB)
Switch the verification on/off (1/0)
The backup includes
util/config system verify_email 0
- Hubzilla DB
- Hubzilla installation /var/www/html
- Certificates for letsencrypt
## What the script will do for you...
## Preparations Software
+ install everything required by your hub/instance, basically a web server (Apache or Nginx), PHP, a database (MySQL), certbot,...
+ create a database
+ run certbot to have everything for a secure connection (httpS)
+ create a script for daily maintenance
- backup to external disk (certificates, database, /var/www/)
- renew certfificate (letsencrypt)
- update of your hub/instance (git)
- update of Debian
- restart
+ create cron jobs for
- DynDNS (selfHOST.de or freedns.afraid.org) every 5 minutes
- Run.php for your hub/instance every 10 minutes
- daily maintenance script every day at 05:30
### Install Debian Linux on the Mini-PC
The script is known to work without adjustments with
Download the stable Debian at https://www.debian.org/
(Debian 8 is no longer supported.)
+ Hardware
- Mini-PC with Debian 10 (stretch), or
- Rapberry 3 with Raspbian, Debian 10
- Rapberry 4 with Raspbian, Debian 10
+ DynDNS
- selfHOST.de
- freedns.afraid.org
Create bootable USB drive with Debian on it.You could use
- unetbootin, https://en.wikipedia.org/wiki/UNetbootin
- or simply the linux command "dd"
Example for command dd...
su -
dd if=2018-10-09-raspbian-stretch.img of=/dev/mmcblk0
Do not forget to unmount the SD card before and check if unmounted like in this example...
su -
umount /dev/mmcblk0*
df -h
The script can install [Hubzilla](https://zotlabs.org/page/hubzilla/hubzilla-project), [Zap](https://zotlabs.com/zap/) and [Mistpark 2020, aka "Misty"](https://zotlabs.com/misty/). Make sure to use the correct GIT repositories.
Switch off your mini pc, plug in your USB drive and start the mini pc from the
stick. Install Debian. Follow the instructions of the installation.
# Step-by-Step - some Details
### Configure your Router
## Preparations
Open the ports 80 and 443 on your router for your Debian
## Configure your Router
Your webserver has to be visible in the internet.
Open the ports 80 and 443 on your router for your Debian. Make sure your web server is marked as "exposed host".
## Preparations Dynamic IP Address
Your Hubzilla must be reachable by a domain that you can type in your browser
Follow the instructions in .homeinstall/zotserver-config.txt.
In short...
Your Hubzilla server must be reachable by a domain that you can type in your browser
cooldomain.org
@@ -132,105 +122,13 @@ There are two ways to get a domain...
...for example buy at selfHOST.de
The cost are around 10,- € once and 1,50 € per month (2017).
The cost is 1,50 € per month (2019).
### Method 2: Register a free subdomain
...for example register at freedns.afraid.org
Follow the instructions in .homeinstall/hubzilla-config.txt.
## Install Hubzilla on your Debian
Login to your debian
(Provided your username is "you" and the name of the mini pc is "debian". You
could take the IP address instead of "debian")
ssh -X you@debian
Change to root user
su -l
Install git
apt-get install git
Make the directory for apache and change diretory to it
mkdir /var/www
cd /var/www/
Clone hubzilla from git ("git pull" will update it later)
git clone https://framagit.org/hubzilla/core.git html
Change to the install script
cd html/.homeinstall/
Copy the template file
cp hubzilla-config.txt.template hubzilla-config.txt
Modify the file "hubzilla-config.txt". Read the instructions there carefully and enter your values.
nano hubzilla-config.txt
Make sure your external drive (for backups) is plugged in and can be mounted as configured in "hubzilla-config.txt". Otherwise the daily backups will not work.
Run the script
./hubzilla-setup.sh
Wait... The script should not finish with an error message.
In a webbrowser open your domain.
Expected: A test page of hubzilla is shown. All checks there should be
successfull. Go on...
Expected: A page for the Hubzilla server configuration shows up.
Leave db server name "127.0.0.1" and port "0" untouched.
Enter
- DB user name = hubzilla
- DB pass word = This is the password you entered in "hubzilla-config.txt"
- DB name = hubzilla
Leave db type "MySQL" untouched.
Follow the instructions in the next pages.
Recommended: Set path to imagemagick
- in admin settings of hubzilla or
- via terminal
util/config system.imagick_convert_path /usr/bin/convert
After the daily script was executed at 05:30 (am)
- look at /var/www/html/hubzilla-daily.log
- check your backup on the external drive
- optionally view the daily log under yourdomain.org/admin/logs/
- set the logfile to var/www/html/hubzilla-daily.log
## Install Hubzilla in a Virtual Machine for Test Purposes
Modify the file "hubzilla-config.txt".
nano hubzilla-config.txt
There use
le_domain=localhost
## Note for the Rasperry
The script was tested with an Raspberry 3 under Raspian (Debian 9.5, 2018-10-09-raspbian-stretch.img).
## Note on Rasperry
It is recommended to run the Raspi without graphical frontend (X-Server). Use...
@@ -240,12 +138,6 @@ to boot the Rapsi to the client console.
DO NOT FORGET TO CHANGE THE DEFAULT PASSWORD FOR USER PI!
If the validation of the mail address fails for the very first registered user...
This used to happen on some *bsd distros but there was some work to fix that a year ago (2017).
So if your system isn't registered in DNS or DNS isn't active do
cd /var/www/html
util/config system.do_not_check_dns 1
## Reminder for Different Web Wervers
For those of you who feel adventurous enough to use a different web server (i.e. Lighttpd...), don't forget that this script will install Apache or Nginx and that you can only have one web server listening to ports 80 & 443. Also, don't forget to tweak your daily shell script in /var/www/ accordingly.

View File

@@ -1,850 +0,0 @@
#!/bin/bash
#
# How to use
# ----------
#
# This file automates the installation of hubzilla under Debian Linux
#
# 1) Copy the file "hubzilla-config.txt.template" to "hubzilla-config.txt"
# Follow the instuctions there
#
# 2) Switch to user "root" by typing "su -"
#
# 3) Run with "./hubzilla-setup.sh"
# If this fails check if you can execute the script.
# - To make it executable type "chmod +x hubzilla-setup.sh"
# - or run "bash hubzilla-setup.sh"
#
#
# What does this script do basically?
# -----------------------------------
#
# This file automates the installation of hubzilla under Debian Linux
# - install
# * apache webserer,
# * php,
# * mysql - the database for hubzilla,
# * phpmyadmin,
# * git to download and update hubzilla itself
# - download hubzilla core and addons
# - configure cron
# * "poller.php" for regular background prozesses of hubzilla
# * to_do "apt-get update" and "apt-get dist-upgrade" to keep linux
# up-to-date
# * to_do backup hubzillas database and files (rsnapshot)
# - configure dynamic ip with cron
# - to_do letsencrypt
# - to_do redirection to https
#
#
# Discussion
# ----------
#
# Security - password is the same for mysql-server, phpmyadmin and hubzilla db
# - The script runs into installation errors for phpmyadmin if it uses
# different passwords. For the sake of simplicity one singel password.
#
# Security - suhosin for PHP
# - The script does not install suhosin.
# - Is the security package suhosin usefull or not usefull?
#
# Hubzilla - email verification
# - The script switches off email verification off in all htconfig.tpl.
# Example: /var/www/html/view/en/htconfig.tpl
# - Is this a silly idea or not?
#
#
# Remove Hubzilla (for a fresh start using the script)
# ----------------------------------------------------
#
# You could use /var/www/hubzilla-remove.sh
# that is created by hubzilla-setup.sh.
#
# The script will remove (almost everything) what was installed by the script.
# After the removal you could run the script again to have a fresh install
# of all applications including hubzilla and its database.
#
# How to restore from backup
# --------------------------
#
# Daily backup
# - - - - - -
#
# The installation
# - writes a script /var/www/hubzilla-daily.sh
# - creates a daily cron that runs the hubzilla-daily.sh
#
# hubzilla-daily.sh makes a (daily) backup of all relevant files
# - /var/lib/mysql/ > hubzilla database
# - /var/www/html/ > hubzilla from github
# - /var/www/letsencrypt/ > certificates
#
# hubzilla-daily.sh writes the backup
# - either to an external disk compatible to LUKS+ext4 (see hubzilla-config.txt)
# - or to /var/cache/rsnapshot in case the external disk is not plugged in
#
# Restore backup
# - - - - - - -
#
# This was not tested yet.
# Bacically you can copy the files from the backup to the server.
#
# Credits
# -------
#
# The script is based on Thomas Willinghams script "debian-setup.sh"
# which he used to install the red#matrix.
#
# The script uses another script from https://github.com/lukas2511/letsencrypt.sh
#
# The documentation for bash is here
# https://www.gnu.org/software/bash/manual/bash.html
#
function check_sanity {
# Do some sanity checking.
print_info "Sanity check..."
if [ $(/usr/bin/id -u) != "0" ]
then
die 'Must be run by root user'
fi
if [ -f /etc/lsb-release ]
then
die "Distribution is not supported"
fi
if [ ! -f /etc/debian_version ]
then
die "Debian is supported only"
fi
if ! grep -q 'Linux 9' /etc/issue
then
die "Linux 9 (stretch) is supported only"x
fi
}
function check_config {
print_info "config check..."
# Check for required parameters
if [ -z "$db_pass" ]
then
die "db_pass not set in $configfile"
fi
if [ -z "$le_domain" ]
then
die "le_domain not set in $configfile"
fi
# backup is important and should be checked
if [ -n "$backup_device_name" ]
then
if [ ! -d "$backup_mount_point" ]
then
mkdir "$backup_mount_point"
fi
device_mounted=0
if fdisk -l | grep -i "$backup_device_name.*linux"
then
print_info "ok - filesystem of external device is linux"
if [ -n "$backup_device_pass" ]
then
echo "$backup_device_pass" | cryptsetup luksOpen $backup_device_name cryptobackup
if mount /dev/mapper/cryptobackup /media/hubzilla_backup
then
device_mounted=1
print_info "ok - could encrypt and mount external backup device"
umount /media/hubzilla_backup
else
print_warn "backup to external device will fail because encryption failed"
fi
cryptsetup luksClose cryptobackup
else
if mount $backup_device_name /media/hubzilla_backup
then
device_mounted=1
print_info "ok - could mount external backup device"
umount /media/hubzilla_backup
else
print_warn "backup to external device will fail because mount failed"
fi
fi
else
print_warn "backup to external device will fail because filesystem is either not linux or 'backup_device_name' is not correct in $configfile"
fi
if [ $device_mounted == 0 ]
then
die "backup device not ready"
fi
fi
}
function die {
echo "ERROR: $1" > /dev/null 1>&2
exit 1
}
function update_upgrade {
print_info "updated and upgrade..."
# Run through the apt-get update/upgrade first. This should be done before
# we try to install any package
apt-get -q -y update && apt-get -q -y dist-upgrade
print_info "updated and upgraded linux"
}
function check_install {
if [ -z "`which "$1" 2>/dev/null`" ]
then
# export DEBIAN_FRONTEND=noninteractive ... answers from the package
# configuration database
# - q ... without progress information
# - y ... answer interactive questions with "yes"
# DEBIAN_FRONTEND=noninteractive apt-get --no-install-recommends -q -y install $2
DEBIAN_FRONTEND=noninteractive apt-get -q -y install $2
print_info "installed $2 installed for $1"
else
print_warn "$2 already installed"
fi
}
function nocheck_install {
# export DEBIAN_FRONTEND=noninteractive ... answers from the package configuration database
# - q ... without progress information
# - y ... answer interactive questions with "yes"
# DEBIAN_FRONTEND=noninteractive apt-get --no-install-recommends -q -y install $2
# DEBIAN_FRONTEND=noninteractive apt-get --install-suggests -q -y install $1
DEBIAN_FRONTEND=noninteractive apt-get -q -y install $1
print_info "installed $1"
}
function print_info {
echo -n -e '\e[1;34m'
echo -n $1
echo -e '\e[0m'
}
function print_warn {
echo -n -e '\e[1;31m'
echo -n $1
echo -e '\e[0m'
}
function stop_hubzilla {
if [ -d /etc/apache2 ]
then
print_info "stopping apache webserver..."
service apache2 stop
fi
if [ -f /etc/init.d/mysql ]
then
print_info "stopping mysql db..."
/etc/init.d/mysql stop
fi
}
function install_apache {
print_info "installing apache..."
nocheck_install "apache2 apache2-utils"
}
function install_imagemagick {
print_info "installing imagemagick..."
nocheck_install "imagemagick"
}
function install_curl {
print_info "installing curl..."
nocheck_install "curl"
}
function install_sendmail {
print_info "installing sendmail..."
nocheck_install "sendmail sendmail-bin"
}
function install_php {
# openssl and mbstring are included in libapache2-mod-php
print_info "installing php..."
nocheck_install "libapache2-mod-php php php-pear php-curl php-mcrypt php-gd"
sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 100M/g" /etc/php/7.0/apache2/php.ini
sed -i "s/^post_max_size =.*/post_max_size = 100M/g" /etc/php/7.0/apache2/php.ini
}
function install_mysql {
# http://www.microhowto.info/howto/perform_an_unattended_installation_of_a_debian_package.html
#
# To determine the required package name, key and type you can perform
# a trial installation then search the configuration database.
#
# debconf-get-selections | grep mysql-server
#
# The command debconf-get-selections is provided by the package
# debconf-utils, which you may need to install.
#
# apt-get install debconf-utils
#
# If you want to supply an answer to a configuration question but do not
# want to be prompted for it then this can be arranged by preseeding the
# DebConf database with the required information.
#
# echo mysql-server mysql-server/root_password password xyzzy | debconf-set-selections
# echo mysql-server mysql-server/root_password_again password xyzzy | debconf-set-selections
#
print_info "installing mysql..."
if [ -z "$mysqlpass" ]
then
die "mysqlpass not set in $configfile"
fi
echo mysql-server mysql-server/root_password password $mysqlpass | debconf-set-selections
echo mysql-server mysql-server/root_password_again password $mysqlpass | debconf-set-selections
nocheck_install "php-mysql mysql-server mysql-client"
}
function install_phpmyadmin {
print_info "installing phpmyadmin..."
if [ -z "$phpmyadminpass" ]
then
die "phpmyadminpass not set in $configfile"
fi
echo phpmyadmin phpmyadmin/setup-password password $phpmyadminpass | debconf-set-selections
echo phpmyadmin phpmyadmin/mysql/app-pass password $phpmyadminpass | debconf-set-selections
echo phpmyadmin phpmyadmin/app-password-confirm password $phpmyadminpass | debconf-set-selections
echo phpmyadmin phpmyadmin/mysql/admin-pass password $phpmyadminpass | debconf-set-selections
echo phpmyadmin phpmyadmin/password-confirm password $phpmyadminpass | debconf-set-selections
echo phpmyadmin phpmyadmin/reconfigure-webserver multiselect apache2 | debconf-set-selections
nocheck_install "phpmyadmin"
# It seems to be not neccessary to check rewrite.load because it comes
# with the installation. To be sure you could check this manually by:
#
# nano /etc/apache2/mods-available/rewrite.load
#
# You should find the content:
#
# LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
a2enmod rewrite
if [ ! -f /etc/apache2/apache2.conf ]
then
die "could not find file /etc/apache2/apache2.conf"
fi
sed -i \
"s/AllowOverride None/AllowOverride all/" \
/etc/apache2/apache2.conf
if [ -z "`grep 'Include /etc/phpmyadmin/apache.conf' /etc/apache2/apache2.conf`" ]
then
echo "Include /etc/phpmyadmin/apache.conf" >> /etc/apache2/apache2.conf
fi
service apache2 restart
/etc/init.d/mysql start
}
function create_hubzilla_db {
print_info "creating hubzilla database..."
if [ -z "$hubzilla_db_name" ]
then
die "hubzilla_db_name not set in $configfile"
fi
if [ -z "$hubzilla_db_user" ]
then
die "hubzilla_db_user not set in $configfile"
fi
if [ -z "$hubzilla_db_pass" ]
then
die "hubzilla_db_pass not set in $configfile"
fi
Q1="CREATE DATABASE IF NOT EXISTS $hubzilla_db_name;"
Q2="GRANT USAGE ON *.* TO $hubzilla_db_user@localhost IDENTIFIED BY '$hubzilla_db_pass';"
Q3="GRANT ALL PRIVILEGES ON $hubzilla_db_name.* to $hubzilla_db_user@localhost identified by '$hubzilla_db_pass';"
Q4="FLUSH PRIVILEGES;"
SQL="${Q1}${Q2}${Q3}${Q4}"
mysql -uroot -p$phpmyadminpass -e "$SQL"
}
function run_freedns {
print_info "run freedns (dynamic IP)..."
if [ -z "$freedns_key" ]
then
print_info "freedns was not started because 'freedns_key' is empty in $configfile"
else
if [ -n "$selfhost_user" ]
then
die "You can not use freeDNS AND selfHOST for dynamic IP updates ('freedns_key' AND 'selfhost_user' set in $configfile)"
fi
wget --no-check-certificate -O - https://freedns.afraid.org/dynamic/update.php?$freedns_key
fi
}
function install_run_selfhost {
print_info "install and start selfhost (dynamic IP)..."
if [ -z "$selfhost_user" ]
then
print_info "selfHOST was not started because 'selfhost_user' is empty in $configfile"
else
if [ -n "$freedns_key" ]
then
die "You can not use freeDNS AND selfHOST for dynamic IP updates ('freedns_key' AND 'selfhost_user' set in $configfile)"
fi
if [ -z "$selfhost_pass" ]
then
die "selfHOST was not started because 'selfhost_pass' is empty in $configfile"
fi
if [ ! -d $selfhostdir ]
then
mkdir $selfhostdir
fi
# the old way
# https://carol.selfhost.de/update?username=123456&password=supersafe
#
# the prefered way
wget --output-document=$selfhostdir/$selfhostscript http://jonaspasche.de/selfhost-updater
echo "router" > $selfhostdir/device
echo "$selfhost_user" > $selfhostdir/user
echo "$selfhost_pass" > $selfhostdir/pass
bash $selfhostdir/$selfhostscript update
fi
}
function ping_domain {
print_info "ping domain $domain..."
# Is the domain resolved? Try to ping 6 times à 10 seconds
COUNTER=0
for i in {1..6}
do
print_info "loop $i for ping -c 1 $domain ..."
if ping -c 4 -W 1 $le_domain
then
print_info "$le_domain resolved"
break
else
if [ $i -gt 5 ]
then
die "Failed to: ping -c 1 $domain not resolved"
fi
fi
sleep 10
done
sleep 5
}
function configure_cron_freedns {
print_info "configure cron for freedns..."
if [ -z "$freedns_key" ]
then
print_info "freedns is not configured because freedns_key is empty in $configfile"
else
# Use cron for dynamich ip update
# - at reboot
# - every 30 minutes
if [ -z "`grep 'freedns.afraid.org' /etc/crontab`" ]
then
echo "@reboot root https://freedns.afraid.org/dynamic/update.php?$freedns_key > /dev/null 2>&1" >> /etc/crontab
echo "*/30 * * * * root wget --no-check-certificate -O - https://freedns.afraid.org/dynamic/update.php?$freedns_key > /dev/null 2>&1" >> /etc/crontab
else
print_info "cron for freedns was configured already"
fi
fi
}
function configure_cron_selfhost {
print_info "configure cron for selfhost..."
if [ -z "$selfhost_user" ]
then
print_info "freedns is not configured because freedns_key is empty in $configfile"
else
# Use cron for dynamich ip update
# - at reboot
# - every 30 minutes
if [ -z "`grep 'selfhost-updater.sh' /etc/crontab`" ]
then
echo "@reboot root bash /etc/selfhost/selfhost-updater.sh update > /dev/null 2>&1" >> /etc/crontab
echo "*/5 * * * * root /bin/bash /etc/selfhost/selfhost-updater.sh update > /dev/null 2>&1" >> /etc/crontab
else
print_info "cron for selfhost was configured already"
fi
fi
}
function install_letsencrypt {
print_info "installing let's encrypt ..."
# check if user gave domain
if [ -z "$le_domain" ]
then
die "Failed to install let's encrypt: 'le_domain' is empty in $configfile"
fi
# configure apache
apache_le_conf=/etc/apache2/sites-available/le-default.conf
if [ -f $apache_le_conf ]
then
print_info "$apache_le_conf exist already"
else
cat > $apache_le_conf <<END
# letsencrypt default Apache configuration
Alias /.well-known/acme-challenge /var/www/letsencrypt
<Directory /var/www/letsencrypt>
Options FollowSymLinks
Allow from all
</Directory>
END
a2ensite le-default.conf
service apache2 restart
fi
# download the shell script
if [ -d $le_dir ]
then
print_info "letsenrypt exists already (nothing downloaded > no certificate created and registered)"
return 0
fi
git clone https://github.com/lukas2511/dehydrated $le_dir
cd $le_dir
# create config file for letsencrypt.sh
echo "WELLKNOWN=$le_dir" > $le_dir/config.sh
if [ -n "$le_email" ]
then
echo "CONTACT_EMAIL=$le_email" >> $le_dir/config.sh
fi
# create domain file for letsencrypt.sh
# WATCH THIS:
# - It did not work wit "sub.domain.org www.sub.domain.org".
# - So just use "sub.domain.org" only!
echo "$le_domain" > $le_dir/domains.txt
# test apache config for letsencrpyt
url_http=http://$le_domain/.well-known/acme-challenge/domains.txt
wget_output=$(wget -nv --spider --max-redirect 0 $url_http)
if [ $? -ne 0 ]
then
die "Failed to load $url_http"
fi
# accept terms of service of letsencrypt
./dehydrated --register --accept-terms
# run script dehydrated
#
./dehydrated --cron --config $le_dir/config.sh
}
function configure_apache_for_https {
print_info "configuring apache to use httpS ..."
# letsencrypt.sh
#
# "${BASEDIR}/certs/${domain}/privkey.pem"
# "${BASEDIR}/certs/${domain}/cert.pem"
# "${BASEDIR}/certs/${domain}/fullchain.pem"
#
SSLCertificateFile=${le_dir}/certs/${le_domain}/cert.pem
SSLCertificateKeyFile=${le_dir}/certs/${le_domain}/privkey.pem
SSLCertificateChainFile=${le_dir}/certs/${le_domain}/fullchain.pem
if [ ! -f $SSLCertificateFile ]
then
print_warn "Failed to configure apache for httpS: Missing certificate file $SSLCertificateFile"
return 0
fi
# make sure that the ssl mode is enabled
print_info "...configuring apache to use httpS - a2enmod ssl ..."
a2enmod ssl
# modify apach' ssl conf file
if grep -i "ServerName" $sslconf
then
print_info "seems that apache was already configered to use httpS with $sslconf"
else
sed -i "s/ServerAdmin.*$/ServerAdmin webmaster@localhost\\n ServerName ${le_domain}/" $sslconf
fi
sed -i s#/etc/ssl/certs/ssl-cert-snakeoil.pem#$SSLCertificateFile# $sslconf
sed -i s#/etc/ssl/private/ssl-cert-snakeoil.key#$SSLCertificateKeyFile# $sslconf
sed -i s#/etc/apache2/ssl.crt/server-ca.crt#$SSLCertificateChainFile# $sslconf
sed -i s/#SSLCertificateChainFile/SSLCertificateChainFile/ $sslconf
# apply changes
a2ensite default-ssl.conf
service apache2 restart
}
function check_https {
print_info "checking httpS > testing ..."
url_https=https://$le_domain
wget_output=$(wget -nv --spider --max-redirect 0 $url_https)
if [ $? -ne 0 ]
then
print_warn "check not ok"
else
print_info "check ok"
fi
}
function install_hubzilla {
print_info "installing hubzilla addons..."
cd /var/www/html/
util/add_addon_repo https://framagit.org/hubzilla/addons.git hzaddons
mkdir -p "store/[data]/smarty3"
chmod -R 777 store
touch .htconfig.php
chmod ou+w .htconfig.php
cd /var/www/
chown -R www-data:www-data html
chown root:www-data /var/www/html/
chown root:www-data /var/www/html/.htaccess
chmod 0644 /var/www/html/.htaccess
# try to switch off email registration
sed -i "s/verify_email.*1/verify_email'] = 0/" /var/www/html/view/*/ht*
if [ -n "`grep -r 'verify_email.*1' /var/www/html/view/`" ]
then
print_warn "Hubzillas registration prozess might have email verification switched on."
fi
print_info "installed hubzilla"
}
function rewrite_to_https {
print_info "configuring apache to redirect http to httpS ..."
htaccessfile=/var/www/html/.htaccess
if grep -i "https" $htaccessfile
then
print_info "...configuring apache to redirect http to httpS was already done in $htaccessfile"
else
sed -i "s#QSA]#QSA]\\n RewriteCond %{SERVER_PORT} !^443$\\n RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]#" $htaccessfile
fi
service apache2 restart
}
# This will allways overwrite both config files
# - internal disk
# - external disk (LUKS + ext4)
# of rsnapshot for hubzilla
function install_rsnapshot {
print_info "installing rsnapshot..."
nocheck_install "rsnapshot"
# internal disk
cp -f /etc/rsnapshot.conf $snapshotconfig
sed -i "s/^cmd_cp/#cmd_cp/" $snapshotconfig
sed -i "s/^backup/#backup/" $snapshotconfig
echo "backup /var/lib/mysql/ localhost/" >> $snapshotconfig
echo "backup /var/www/html/ localhost/" >> $snapshotconfig
echo "backup /var/www/letsencrypt/ localhost/" >> $snapshotconfig
# external disk
if [ -n "$backup_device_name" ]
then
cp -f /etc/rsnapshot.conf $snapshotconfig_external_device
sed -i "s#snapshot_root.*#snapshot_root $backup_mount_point#" $snapshotconfig_external_device
sed -i "/alpha/s/6/30/" $snapshotconfig_external_device
sed -i "s/^cmd_cp/#cmd_cp/" $snapshotconfig_external_device
sed -i "s/^backup/#backup/" $snapshotconfig_external_device
if [ -z "`grep 'letsencrypt' $snapshotconfig_external_device`" ]
then
echo "backup /var/lib/mysql/ localhost/" >> $snapshotconfig_external_device
echo "backup /var/www/html/ localhost/" >> $snapshotconfig_external_device
echo "backup /var/www/letsencrypt/ localhost/" >> $snapshotconfig_external_device
fi
else
print_info "No backup configuration (rsnapshot) for external device configured. Reason: backup_device_name and/or backup_device_pass not given in $configfile"
fi
}
function install_cryptosetup {
print_info "installing cryptsetup..."
nocheck_install "cryptsetup"
}
function configure_cron_daily {
print_info "configuring cron..."
# every 10 min for poller.php
if [ -z "`grep 'poller.php' /etc/crontab`" ]
then
echo "*/10 * * * * www-data cd /var/www/html; php Zotlabs/Daemon/Master.php Cron >> /dev/null 2>&1" >> /etc/crontab
fi
# Run external script daily at 05:30
# - stop apache and mysql-server
# - backup hubzilla
# - update hubzilla core and addon
# - update and upgrade linux
# - reboot
echo "#!/bin/sh" > /var/www/$hubzilladaily
echo "#" >> /var/www/$hubzilladaily
echo "echo \" \"" >> /var/www/$hubzilladaily
echo "echo \"+++ \$(date) +++\"" >> /var/www/$hubzilladaily
echo "echo \" \"" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - renew certificate...\"" >> /var/www/$hubzilladaily
echo "bash $le_dir/dehydrated --cron --config $le_dir/config.sh" >> /var/www/$hubzilladaily
echo "#" >> /var/www/$hubzilladaily
echo "# stop hubzilla" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - stoping apache and mysql...\"" >> /var/www/$hubzilladaily
echo "service apache2 stop" >> /var/www/$hubzilladaily
echo "/etc/init.d/mysql stop # to avoid inconsistancies" >> /var/www/$hubzilladaily
echo "#" >> /var/www/$hubzilladaily
echo "# backup" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - try to mount external device for backup...\"" >> /var/www/$hubzilladaily
echo "backup_device_name=$backup_device_name" >> /var/www/$hubzilladaily
echo "backup_device_pass=$backup_device_pass" >> /var/www/$hubzilladaily
echo "backup_mount_point=$backup_mount_point" >> /var/www/$hubzilladaily
echo "device_mounted=0" >> /var/www/$hubzilladaily
echo "if [ -n \"$backup_device_name\" ]" >> /var/www/$hubzilladaily
echo "then" >> /var/www/$hubzilladaily
echo " if blkid | grep $backup_device_name" >> /var/www/$hubzilladaily
echo " then" >> /var/www/$hubzilladaily
if [ -n "$backup_device_pass" ]
then
echo " echo \"decrypting backup device...\"" >> /var/www/$hubzilladaily
echo " echo "\"$backup_device_pass\"" | cryptsetup luksOpen $backup_device_name cryptobackup" >> /var/www/$hubzilladaily
fi
echo " if [ ! -d $backup_mount_point ]" >> /var/www/$hubzilladaily
echo " then" >> /var/www/$hubzilladaily
echo " mkdir $backup_mount_point" >> /var/www/$hubzilladaily
echo " fi" >> /var/www/$hubzilladaily
echo " echo \"mounting backup device...\"" >> /var/www/$hubzilladaily
if [ -n "$backup_device_pass" ]
then
echo " if mount /dev/mapper/cryptobackup $backup_mount_point" >> /var/www/$hubzilladaily
else
echo " if mount $backup_device_name $backup_mount_point" >> /var/www/$hubzilladaily
fi
echo " then" >> /var/www/$hubzilladaily
echo " device_mounted=1" >> /var/www/$hubzilladaily
echo " echo \"device $backup_device_name is now mounted. Starting backup...\"" >> /var/www/$hubzilladaily
echo " rsnapshot -c $snapshotconfig_external_device alpha" >> /var/www/$hubzilladaily
echo " echo \"\$(date) - disk sizes...\"" >> /var/www/$hubzilladaily
echo " df -h" >> /var/www/$hubzilladaily
echo " echo \"\$(date) - db size...\"" >> /var/www/$hubzilladaily
echo " du -h $backup_mount_point | grep mysql/hubzilla" >> /var/www/$hubzilladaily
echo " echo \"unmounting backup device...\"" >> /var/www/$hubzilladaily
echo " umount $backup_mount_point" >> /var/www/$hubzilladaily
echo " else" >> /var/www/$hubzilladaily
echo " echo \"failed to mount device $backup_device_name\"" >> /var/www/$hubzilladaily
echo " fi" >> /var/www/$hubzilladaily
if [ -n "$backup_device_pass" ]
then
echo " echo \"closing decrypted backup device...\"" >> /var/www/$hubzilladaily
echo " cryptsetup luksClose cryptobackup" >> /var/www/$hubzilladaily
fi
echo " fi" >> /var/www/$hubzilladaily
echo "fi" >> /var/www/$hubzilladaily
echo "if [ \$device_mounted == 0 ]" >> /var/www/$hubzilladaily
echo "then" >> /var/www/$hubzilladaily
echo " echo \"device could not be mounted $backup_device_name. No backup written.\"" >> /var/www/$hubzilladaily
echo "fi" >> /var/www/$hubzilladaily
echo "#" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - db size...\"" >> /var/www/$hubzilladaily
echo "du -h /var/lib/mysql/ | grep mysql/hubzilla" >> /var/www/$hubzilladaily
echo "#" >> /var/www/$hubzilladaily
echo "# update" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - updating dehydrated...\"" >> /var/www/$hubzilladaily
echo "git -C /var/www/letsencrypt/ pull" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - updating hubhilla core...\"" >> /var/www/$hubzilladaily
echo "(cd /var/www/html/ ; util/udall)" >> /var/www/$hubzilladaily
echo "chown -R www-data:www-data /var/www/html/ # make all accessable for the webserver" >> /var/www/$hubzilladaily
echo "chown root:www-data /var/www/html/.htaccess" >> /var/www/$hubzilladaily
echo "chmod 0644 /var/www/html/.htaccess # www-data can read but not write it" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - updating linux...\"" >> /var/www/$hubzilladaily
echo "apt-get -q -y update && apt-get -q -y dist-upgrade && apt-get -q -y autoremove # update linux and upgrade" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - Backup hubzilla and update linux finished. Rebooting...\"" >> /var/www/$hubzilladaily
echo "#" >> /var/www/$hubzilladaily
echo "reboot" >> /var/www/$hubzilladaily
if [ -z "`grep 'hubzilla-daily.sh' /etc/crontab`" ]
then
echo "30 05 * * * root /bin/bash /var/www/$hubzilladaily >> /var/www/html/hubzilla-daily.log 2>&1" >> /etc/crontab
echo "0 0 1 * * root rm /var/www/html/hubzilla-daily.log" >> /etc/crontab
fi
# This is active after either "reboot" or "/etc/init.d/cron reload"
print_info "configured cron for updates/upgrades"
}
function write_uninstall_script {
print_info "writing uninstall script..."
cat > /var/www/hubzilla-remove.sh <<END
#!/bin/sh
#
# This script removes Hubzilla.
# You might do this for a fresh start using the script.
# The script will remove (almost everything) what was installed by the script,
# all applications including hubzilla and its database.
#
# Backup the certificates of letsencrypt (you never know)
cp -a /var/www/letsencrypt/ ~/backup_le_certificats
#
# Removal
apt-get remove apache2 apache2-utils libapache2-mod-php5 php5 php-pear php5-xcache php5-curl php5-mcrypt php5-gd php5-mysql mysql-server mysql-client phpmyadmin
apt-get purge apache2 apache2-utils libapache2-mod-php5 php5 php-pear php5-xcache php5-curl php5-mcrypt php5-gd php5-mysql mysql-server mysql-client phpmyadmin
apt-get autoremove
apt-get clean
rm /etc/rsnapshot_hubzilla.conf
rm /etc/rsnapshot_hubzilla_external_device.conf
rm -R /etc/apache2/
rm -R /var/lib/mysql/
rm -R /var/www
rm -R /etc/selfhost/
# uncomment the next line if you want to remove the backups
# rm -R /var/cache/rsnapshot
nano /etc/crontab # remove entries there manually
END
chmod -x /var/www/hubzilla-remove.sh
}
########################################################################
# START OF PROGRAM
########################################################################
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
check_sanity
# Read config file edited by user
configfile=hubzilla-config.txt
source $configfile
selfhostdir=/etc/selfhost
selfhostscript=selfhost-updater.sh
hubzilladaily=hubzilla-daily.sh
plugins_update=.homeinstall/plugins_update.sh
snapshotconfig=/etc/rsnapshot_hubzilla.conf
snapshotconfig_external_device=/etc/rsnapshot_hubzilla_external_device.conf
backup_mount_point=/media/hubzilla_backup
le_dir=/var/www/letsencrypt
sslconf=/etc/apache2/sites-available/default-ssl.conf
#set -x # activate debugging from here
check_config
stop_hubzilla
update_upgrade
install_curl
install_sendmail
install_apache
install_imagemagick
install_php
install_mysql
install_phpmyadmin
create_hubzilla_db
run_freedns
install_run_selfhost
ping_domain
configure_cron_freedns
configure_cron_selfhost
if [ "$le_domain" != "localhost" ]
then
install_letsencrypt
configure_apache_for_https
check_https
else
print_info "is localhost - skipped installation of letsencrypt and configuration of apache for https"
fi
install_hubzilla
if [ "$le_domain" != "localhost" ]
then
rewrite_to_https
install_rsnapshot
else
print_info "is localhost - skipped rewrite to https and installation of rsnapshot"
fi
configure_cron_daily
if [ "$le_domain" != "localhost" ]
then
install_cryptosetup
write_uninstall_script
else
print_info "is localhost - skipped installation of cryptosetup"
fi
#set +x # stop debugging from here

View File

@@ -0,0 +1,144 @@
##
# Hubzilla/Zap/Mistpark/Osada Nginx block configuration template
# based on the example created by Olaf Conradi
#
# The files generated with this template will be added to
# /etc/nginx/sites-available & /etc/nginx/sites-enabled (symlink)
##
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
#
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
##
##
# This configuration assumes
# You filled the zotserver-config.txt file
# Your domain/subdomain is functionnal
# You want all traffic to be https
# You have PHP FastCGI Process Manager (php-fpm) running on localhost
##
server {
listen 80;
server_name SERVER_NAME;
# HTTP > HTTPS #
return 301 https://$server_name$request_uri;
}
##
# Configure Red with SSL
#
# All requests are routed to the front controller
# except for certain known file types like images, css, etc.
# Those are served statically whenever possible with a
# fall back to the front controller (needed for avatars, for example)
##
server {
listen 443 ssl;
server_name SERVER_NAME;
ssl on;
ssl_certificate /etc/letsencrypt/live/SERVER_NAME/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/SERVER_NAME/privkey.pem;
ssl_session_timeout 5m;
# DO WE NEED TO REVIEW THE FOLLOWING SETTINGS?
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
ssl_prefer_server_ciphers on;
fastcgi_param HTTPS on;
charset utf-8;
root INSTALL_PATH;
index index.php;
access_log /var/log/nginx/ZOTSERVER_LOG;
#Uncomment the following line to include a standard configuration file
#Note that the most specific rule wins and your standard configuration
#will therefore *add* to this file, but not override it.
#include standard.conf
# allow uploads up to 20MB in size
client_max_body_size 20m;
client_body_buffer_size 128k;
include mime.types;
# rewrite to front controller as default rule
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?req=$1;
}
}
# make sure webfinger and other well known services aren't blocked
# by denying dot files and rewrite request to the front controller
location ^~ /.well-known/ {
allow all;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?req=$1;
}
}
# statically serve these file types when possible
# otherwise fall back to front controller
# allow browser to cache them
# added .htm for advanced source code editor library
# location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|map|ttf|woff|woff2|svg)$ {
# expires 30d;
# try_files $uri /index.php?req=$uri&$args;
# }
# SHOULD WE UNCOMMENT THE ABOVE LINES ?
# block these file types
location ~* \.(tpl|md|tgz|log|out)$ {
deny all;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# or a unix socket
location ~* \.php$ {
# IS THE FOLLOWING STILL RELEVANT AS OF AUGUST 2020?
# Zero-day exploit defense.
# http://forum.nginx.org/read.php?2,88845,page=3
# Won't work properly (404 error) if the file is not stored on this
# server, which is entirely possible with php-fpm/php-fcgi.
# Comment the 'try_files' line out if you set up php-fpm/php-fcgi on
# another machine. And then cross your fingers that you won't get hacked.
try_files $uri =404;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# With php5-cgi alone:
# fastcgi_pass 127.0.0.1:9000;
# With php-fpm:
fastcgi_pass unix:PHP_FPM_SOCK;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# deny access to all dot files
location ~ /\. {
deny all;
}
#deny access to store
location ~ /store {
deny all;
}
}

View File

@@ -2,35 +2,50 @@
### MANDATORY - database password #############
#
# Please give your database password
# It is better to not use blanks inside the password.
# Example: db_pass=pass_word_with_no_blanks_in_it
# Example: db_pass="this password has blanks in it"
db_pass=
###############################################
### MANDATORY - let's encrypt #################
#
# Hubilla requires encrypted communication via secure HTTP (HTTPS).
# Zot requires encrypted communication via secure HTTP (HTTPS).
# This script automates installation of an SSL certificate from
# Let's Encrypt (https://letsencrypt.org)
#
# Please give the domain name of your hub
# Please give the domain name of your hub/instance
#
# Example: my.cooldomain.org
# Example: cooldomain.org
#
# Example: localhost (test installation without certificates for httpS)
# You might use "localhost" for a LOCAL TEST installation.
# This is usefull if you want to debug the server inside a VM.
#
# Email is optional
# Example: localhost
#
# Email is optional if you use "localhost".
#
#
le_domain=
le_email=
###############################################
### OPTIONAL - Webserver choice ###############
#
# Please indicate if you want to choose Nginx
# or Apache as your web server
#
# Valid strings are nginx or apache (lower case),
# any other will stop the setup script.
#
webserver=apache
###############################################
### OPTIONAL - selfHOST - dynamic IP address ##
#
# 1. Register a domain at selfhost.de
# - choose offer "DOMAIN dynamisch" 1,50€/mon at 08.01.2016
# - choose offer "DOMAIN dynamisch" 1,50€/mon at 04/2019
# 2. Get your configuration for dynamic IP update
# - Log in at selfhost.de
# - go to "DynDNS Accounte"
@@ -84,7 +99,7 @@ freedns_key=
# - encrypted LUKS + ext4, or
# - ext4
#
# You should test to mount the device befor you run the script
# You should test to mount the device before you run the script
# (hubzilla-setup.sh).
# How to find your (pluged-in) devices?
#
@@ -141,10 +156,13 @@ backup_device_pass=
#
###############################################
#
# Database for hubzilla
hubzilla_db_name=hubzilla
hubzilla_db_user=hubzilla
hubzilla_db_pass=$db_pass
# Database for your hub/instance
# If left empty, both your database and user will be named after your zot instance (hubzilla, zap or misty)
# Use custom name, at least fo the database, if you plan to run more than one hub/instance on the same server
#
zotserver_db_name=
zotserver_db_user=
zotserver_db_pass=$db_pass
#
#
# Password for package mysql-server

793
.homeinstall/zotserver-setup.sh Executable file
View File

@@ -0,0 +1,793 @@
#!/bin/bash
#
# How to use
# ----------
#
# This file automates the installation of
# - hubzilla: https://zotlabs.org/page/hubzilla/hubzilla-project and
# - zap: https://zotlabs.com/zap/
# - misty : https://zotlabs.com/misty/
# - osada : https://codeberg.org/zot/osada
# - redmatrix : https://codeberg.org/zot/redmatrix
# under Debian Linux "Buster"
#
# 1) Copy the file "zotserver-config.txt.template" to "zotserver-config.txt"
# Follow the instuctions there
#
# 2) Switch to user "root" by typing "su -"
#
# 3) Run with "./zotserver-setup.sh"
# If this fails check if you can execute the script.
# - To make it executable type "chmod +x zotserver-setup.sh"
# - or run "bash zotserver-setup.sh"
#
#
# What does this script do basically?
# -----------------------------------
#
# This file automates the installation of a Zot hub/instance under Debian Linux
# - install
# * apache webserver,
# * php,
# * mariadb - the database for zotserver,
# * adminer,
# * git to download and update addons
# - configure cron
# * "Run.php" for regular background processes of your Zot hub/instance
# * "apt-get update" and "apt-get dist-upgrade" and "apt-get autoremove" to keep linux up-to-date
# * run command to keep the IP up-to-date > DynDNS provided by selfHOST.de or freedns.afraid.org
# * backup your server's database and files (rsync)
# - run letsencrypt to create, register and use a certifacte for https
#
#
# Discussion
# ----------
#
# Security - password is the same for mysql-server, phpmyadmin and your hub/instance db
# - The script runs into installation errors for phpmyadmin if it uses
# different passwords. For the sake of simplicity one single password.
#
# How to restore from backup
# --------------------------
#
# (Some explanations here would certainly be useful)
#
# Daily backup
# ------------
#
# The installation
# - writes a shell script in /var/www/
# - creates a daily cron that runs this script
#
# The script makes a (daily) backup of all relevant files
# - /var/lib/mysql/ > database
# - /var/www/ > hubzilla/zap/misty from git repository
# - /etc/letsencrypt/ > certificates
#
# The backup will be written on an external disk compatible to LUKS+ext4 (see zotserver-config.txt)
#
# How to restore from backup
# --------------------------
#
# (Some explanations here would certainly be useful)
#
#
# Credits
# -------
#
# The script is based on Thomas Willinghams script "debian-setup.sh"
# which he used to install the red#matrix.
#
# The documentation for bash is here
# https://www.gnu.org/software/bash/manual/bash.html
#
function check_sanity {
# Do some sanity checking.
print_info "Sanity check..."
if [ $(/usr/bin/id -u) != "0" ]
then
die 'Must be run by root user'
fi
if [ -f /etc/lsb-release ]
then
die "Distribution is not supported"
fi
if [ ! -f /etc/debian_version ]
then
die "Debian is supported only"
fi
if ! grep -q 'Linux 10' /etc/issue
then
die "Linux 10 (buster) is supported only"x
fi
}
function check_config {
print_info "config check..."
# Check for required parameters
if [ -z "$db_pass" ]
then
die "db_pass not set in $configfile"
fi
if [ -z "$le_domain" ]
then
die "le_domain not set in $configfile"
fi
# backup is important and should be checked
if [ -n "$backup_device_name" ]
then
if [ ! -d "$backup_mount_point" ]
then
mkdir "$backup_mount_point"
fi
device_mounted=0
if fdisk -l | grep -i "$backup_device_name.*linux"
then
print_info "ok - filesystem of external device is linux"
if [ -n "$backup_device_pass" ]
then
echo "$backup_device_pass" | cryptsetup luksOpen $backup_device_name cryptobackup
if mount /dev/mapper/cryptobackup /media/zotserver_backup
then
device_mounted=1
print_info "ok - could encrypt and mount external backup device"
umount /media/zotserver_backup
else
print_warn "backup to external device will fail because encryption failed"
fi
cryptsetup luksClose cryptobackup
else
if mount $backup_device_name /media/zotserver_backup
then
device_mounted=1
print_info "ok - could mount external backup device"
umount /media/zotserver_backup
else
print_warn "backup to external device will fail because mount failed"
fi
fi
else
print_warn "backup to external device will fail because filesystem is either not linux or 'backup_device_name' is not correct in $configfile"
fi
if [ $device_mounted == 0 ]
then
die "backup device not ready"
fi
fi
}
function die {
echo "ERROR: $1" > /dev/null 1>&2
exit 1
}
function update_upgrade {
print_info "updated and upgrade..."
# Run through the apt-get update/upgrade first. This should be done before
# we try to install any package
apt-get -q -y update && apt-get -q -y dist-upgrade
print_info "updated and upgraded linux"
}
function check_install {
if [ -z "`which "$1" 2>/dev/null`" ]
then
# export DEBIAN_FRONTEND=noninteractive ... answers from the package
# configuration database
# - q ... without progress information
# - y ... answer interactive questions with "yes"
# DEBIAN_FRONTEND=noninteractive apt-get --no-install-recommends -q -y install $2
DEBIAN_FRONTEND=noninteractive apt-get -q -y install $2
print_info "installed $2 installed for $1"
else
print_warn "$2 already installed"
fi
}
function nocheck_install {
# export DEBIAN_FRONTEND=noninteractive ... answers from the package configuration database
# - q ... without progress information
# - y ... answer interactive questions with "yes"
# DEBIAN_FRONTEND=noninteractive apt-get --no-install-recommends -q -y install $2
# DEBIAN_FRONTEND=noninteractive apt-get --install-suggests -q -y install $1
DEBIAN_FRONTEND=noninteractive apt-get -q -y install $1
print_info "installed $1"
}
function print_info {
echo -n -e '\e[1;34m'
echo -n $1
echo -e '\e[0m'
}
function print_warn {
echo -n -e '\e[1;31m'
echo -n $1
echo -e '\e[0m'
}
function stop_zotserver {
if [ $webserver = "nginx" ]
then
print_info "stopping nginx webserver..."
systemctl stop nginx
elif [ $webserver = "apache" ]
then
print_info "stopping apache webserver..."
systemctl stop apache2
fi
print_info "stopping mysql db..."
systemctl stop mariadb
}
function install_apache {
print_info "installing apache..."
nocheck_install "apache2 apache2-utils"
a2enmod rewrite
systemctl restart apache2
}
function install_nginx {
print_info "installing nginx..."
nocheck_install "nginx"
systemctl restart nginx
}
function add_vhost {
print_info "adding apache vhost"
echo "<VirtualHost *:80>" >> "/etc/apache2/sites-available/${le_domain}.conf"
echo "ServerName ${le_domain}" >> "/etc/apache2/sites-available/${le_domain}.conf"
echo "DocumentRoot $install_path" >> "/etc/apache2/sites-available/${le_domain}.conf"
echo "</VirtualHost>" >> "/etc/apache2/sites-available/${le_domain}.conf"
a2ensite $le_domain
}
function add_nginx_block {
print_info "adding nginx block"
sed "s|SERVER_NAME|${le_domain}|g;s|INSTALL_PATH|${install_path}|g;s|ZOTSERVER_LOG|${install_folder}-${zotserver}.log|;s|PHP_FPM_SOCK|$(ls /var/run/php/*sock)|;" nginx-zotserver.conf.template >> /etc/nginx/sites-enabled/${le_domain}.conf
ln -s /etc/nginx/sites-enabled/${le_domain}.conf /etc/nginx/sites-available/
}
function install_imagemagick {
print_info "installing imagemagick..."
nocheck_install "imagemagick"
}
function install_curl {
print_info "installing curl..."
nocheck_install "curl"
}
function install_wget {
print_info "installing wget..."
nocheck_install "wget"
}
function install_sendmail {
print_info "installing sendmail..."
nocheck_install "sendmail sendmail-bin"
}
function install_php {
# openssl and mbstring are included in libapache2-mod-php
print_info "installing php..."
if [ $webserver = "nginx" ]
then
nocheck_install "php php-pear php-curl php-gd php-mbstring php-xml php-zip php-fpm"
sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 100M/g" /etc/php/7.3/fpm/php.ini
sed -i "s/^post_max_size =.*/post_max_size = 100M/g" /etc/php/7.3/fpm/php.ini
systemctl reload php7.3-fpm
elif [ $webserver = "apache" ]
then
nocheck_install "libapache2-mod-php php php-pear php-curl php-gd php-mbstring php-xml php-zip"
sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 100M/g" /etc/php/7.3/apache2/php.ini
sed -i "s/^post_max_size =.*/post_max_size = 100M/g" /etc/php/7.3/apache2/php.ini
fi
}
function install_mysql {
print_info "installing mysql..."
if [ -z "$mysqlpass" ]
then
die "mysqlpass not set in $configfile"
fi
if type mysql ; then
echo "Yes, mysql is installed"
else
echo "mariadb-server"
nocheck_install "mariadb-server"
systemctl status mariadb
systemctl start mariadb
mysql --user=root <<_EOF_
UPDATE mysql.user SET Password=PASSWORD('${mysqlpass}') WHERE User='root';
DELETE FROM mysql.user WHERE User='';
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
_EOF_
fi
}
function install_adminer {
print_info "installing adminer..."
nocheck_install "adminer"
if [ ! -f /etc/adminer/adminer.conf ]
then
echo "Alias /adminer /usr/share/adminer/adminer" > /etc/adminer/adminer.conf
ln -s /etc/adminer/adminer.conf /etc/apache2/conf-available/adminer.conf
else
print_info "file /etc/adminer/adminer.conf exists already"
fi
a2enmod rewrite
if [ ! -f /etc/apache2/apache2.conf ]
then
die "could not find file /etc/apache2/apache2.conf"
fi
sed -i \
"s/AllowOverride None/AllowOverride all/" \
/etc/apache2/apache2.conf
a2enconf adminer
systemctl restart mariadb
systemctl reload apache2
}
function create_zotserver_db {
print_info "creating zotserver database..."
if [ -z "$zotserver_db_name" ]
then
zotserver_db_name=$zotserver
fi
if [ -z "$zotserver_db_user" ]
then
zotserver_db_user=$zotserver
fi
if [ -z "$zotserver_db_pass" ]
then
die "zotserver_db_pass not set in $configfile"
fi
systemctl restart mariadb
# Make sure we don't write over an already existing database if we install more than one Zot hub/instance
if [ -z $(mysql -h localhost -u root -p$mysqlpass -e "SHOW DATABASES;" | grep $zotserver_db_name) ]
then
Q1="CREATE DATABASE IF NOT EXISTS $zotserver_db_name;"
Q2="GRANT USAGE ON *.* TO $zotserver_db_user@localhost IDENTIFIED BY '$zotserver_db_pass';"
Q3="GRANT ALL PRIVILEGES ON $zotserver_db_name.* to $zotserver_db_user@localhost identified by '$zotserver_db_pass';"
Q4="FLUSH PRIVILEGES;"
SQL="${Q1}${Q2}${Q3}${Q4}"
mysql -uroot -p$mysqlpass -e "$SQL"
else
die "Can't write over an already existing database!"
fi
}
function run_freedns {
print_info "run freedns (dynamic IP)..."
if [ -z "$freedns_key" ]
then
print_info "freedns was not started because 'freedns_key' is empty in $configfile"
else
if [ -n "$selfhost_user" ]
then
die "You can not use freeDNS AND selfHOST for dynamic IP updates ('freedns_key' AND 'selfhost_user' set in $configfile)"
fi
wget --no-check-certificate -O - http://freedns.afraid.org/dynamic/update.php?$freedns_key
fi
}
function install_run_selfhost {
print_info "install and start selfhost (dynamic IP)..."
if [ -z "$selfhost_user" ]
then
print_info "selfHOST was not started because 'selfhost_user' is empty in $configfile"
else
if [ -n "$freedns_key" ]
then
die "You can not use freeDNS AND selfHOST for dynamic IP updates ('freedns_key' AND 'selfhost_user' set in $configfile)"
fi
if [ -z "$selfhost_pass" ]
then
die "selfHOST was not started because 'selfhost_pass' is empty in $configfile"
fi
if [ ! -d $selfhostdir ]
then
mkdir $selfhostdir
fi
# the old way
# https://carol.selfhost.de/update?username=123456&password=supersafe
#
# the prefered way
wget --output-document=$selfhostdir/$selfhostscript http://jonaspasche.de/selfhost-updater
echo "router" > $selfhostdir/device
echo "$selfhost_user" > $selfhostdir/user
echo "$selfhost_pass" > $selfhostdir/pass
bash $selfhostdir/$selfhostscript update
fi
}
function ping_domain {
print_info "ping domain $domain..."
# Is the domain resolved? Try to ping 6 times à 10 seconds
COUNTER=0
for i in {1..6}
do
print_info "loop $i for ping -c 1 $domain ..."
if ping -c 4 -W 1 $le_domain
then
print_info "$le_domain resolved"
break
else
if [ $i -gt 5 ]
then
die "Failed to: ping -c 1 $domain not resolved"
fi
fi
sleep 10
done
sleep 5
}
function configure_cron_freedns {
print_info "configure cron for freedns..."
if [ -z "$freedns_key" ]
then
print_info "freedns is not configured because freedns_key is empty in $configfile"
else
# Use cron for dynamich ip update
# - at reboot
# - every 30 minutes
if [ -z "`grep 'freedns.afraid.org' /etc/crontab`" ]
then
echo "@reboot root http://freedns.afraid.org/dynamic/update.php?$freedns_key > /dev/null 2>&1" >> /etc/crontab
echo "*/30 * * * * root wget --no-check-certificate -O - http://freedns.afraid.org/dynamic/update.php?$freedns_key > /dev/null 2>&1" >> /etc/crontab
else
print_info "cron for freedns was configured already"
fi
fi
}
function configure_cron_selfhost {
print_info "configure cron for selfhost..."
if [ -z "$selfhost_user" ]
then
print_info "selfhost is not configured because selfhost_key is empty in $configfile"
else
# Use cron for dynamich ip update
# - at reboot
# - every 5 minutes
if [ -z "`grep 'selfhost-updater.sh' /etc/crontab`" ]
then
echo "@reboot root bash /etc/selfhost/selfhost-updater.sh update > /dev/null 2>&1" >> /etc/crontab
echo "*/5 * * * * root /bin/bash /etc/selfhost/selfhost-updater.sh update > /dev/null 2>&1" >> /etc/crontab
else
print_info "cron for selfhost was configured already"
fi
fi
}
function install_letsencrypt {
print_info "installing let's encrypt ..."
# check if user gave domain
if [ -z "$le_domain" ]
then
die "Failed to install let's encrypt: 'le_domain' is empty in $configfile"
fi
if [ -z "$le_email" ]
then
die "Failed to install let's encrypt: 'le_email' is empty in $configfile"
fi
if [ $webserver = "nginx" ]
then
nocheck_install "certbot"
print_info "run certbot..."
systemctl stop nginx
certbot certonly --standalone -d $le_domain -m $le_email --agree-tos --non-interactive
systemctl start nginx
elif [ $webserver = "apache" ]
then
nocheck_install "certbot python-certbot-apache"
print_info "run certbot ..."
certbot --apache -w $install_path -d $le_domain -m $le_email --agree-tos --non-interactive --redirect --hsts --uir
service apache2 restart
fi
}
function check_https {
print_info "checking httpS > testing ..."
url_https=https://$le_domain
wget_output=$(wget -nv --spider --max-redirect 0 $url_https)
if [ $? -ne 0 ]
then
print_warn "check not ok"
else
print_info "check ok"
fi
}
function zotserver_name {
if git remote -v | grep -i "origin.*hubzilla.*"
then
zotserver=hubzilla
elif git remote -v | grep -i "origin.*zap.*"
then
zotserver=zap
elif git remote -v | grep -i "origin.*misty.*"
then
zotserver=misty
elif git remote -v | grep -i "origin.*osada.*"
then
zotserver=osada
elif git remote -v | grep -i "origin.*redmatrix.*"
then
zotserver=redmatrix
else
die "neither redmatrix, osada, misty, zap nor hubzilla repository > did not install redmatrix/osada/misty/zap/hubzilla"
fi
}
function install_zotserver {
print_info "installing addons..."
cd $install_path/
if [ $zotserver = "hubzilla" ]
then
print_info "hubzilla"
util/add_addon_repo https://framagit.org/hubzilla/addons hzaddons
elif [ $zotserver = "zap" ]
then
print_info "zap"
util/add_addon_repo https://codeberg.org/zot/zap-addons.git zaddons
elif [ $zotserver = "misty" ]
then
print_info "misty"
util/add_addon_repo https://codeberg.org/zot/misty-addons.git maddons
elif [ $zotserver = "osada" ]
then
print_info "osada"
util/add_addon_repo https://codeberg.org/zot/osada-addons.git oaddons
elif [ $zotserver = "redmatrix" ]
then
print_info "redmatrix"
util/add_addon_repo https://codeberg.org/zot/redmatrix-addons.git raddons
else
die "neither redmatrix, osada, misty, zap nor hubzilla repository > did not install addons or redmatrix/osada/misty/zap/hubzilla"
fi
mkdir -p "cache/smarty3"
mkdir -p "store"
chmod -R 777 store
touch .htconfig.php
chmod ou+w .htconfig.php
cd /var/www/
chown -R www-data:www-data $install_path
chown root:www-data $install_path/
chown root:www-data $install_path/.htaccess
chmod 0644 $install_path/.htaccess
print_info "installed addons"
}
function install_rsync {
print_info "installing rsync..."
nocheck_install "rsync"
}
function install_cryptosetup {
print_info "installing cryptsetup..."
nocheck_install "cryptsetup"
}
function configure_zotserverdaily {
echo "#!/bin/sh" >> /var/www/$zotserverdaily
echo "#" >> /var/www/$zotserverdaily
echo "# update of $le_domain Zot hub/instance" >> /var/www/$zotserverdaily
echo "echo \"\$(date) - updating core and addons...\"" >> /var/www/$zotserverdaily
echo "echo \"reaching git repository for $le_domain $zotserver hub/instance...\"" >> /var/www/$zotserverdaily
echo "(cd $install_path ; util/udall)" >> /var/www/$zotserverdaily
echo "chown -R www-data:www-data $install_path # make all accessible for the webserver" >> /var/www/$zotserverdaily
if [ $webserver = "apache" ]
then
echo "chown root:www-data $install_path/.htaccess" >> /var/www/$zotserverdaily
echo "chmod 0644 $install_path/.htaccess # www-data can read but not write it" >> /var/www/$zotserverdaily
fi
chmod a+x /var/www/$zotserverdaily
}
function configure_cron_daily {
print_info "configuring cron..."
# every 10 min for poller.php
if [ -z "`grep '$install_path.*Run.php' /etc/crontab`" ]
then
echo "*/10 * * * * www-data cd $install_path; php Zotlabs/Daemon/Run.php Cron >> /dev/null 2>&1" >> /etc/crontab
fi
# Run external script daily at 05:30
# - stop apache/nginx and mysql-server
# - renew the certificate of letsencrypt
# - backup db, files ($install_path), certificates if letsencrypt
# - update zotserver core and addon
# - update and upgrade linux
# - reboot is done by "shutdown -h now" because "reboot" hangs sometimes depending on the system
echo "#!/bin/sh" > /var/www/$zotcron
echo "#" >> /var/www/$zotcron
echo "echo \" \"" >> /var/www/$zotcron
echo "echo \"+++ \$(date) +++\"" >> /var/www/$zotcron
echo "echo \" \"" >> /var/www/$zotcron
echo "echo \"\$(date) - stopping $webserver and mysql...\"" >> /var/www/$zotcron
if [ $webserver = "nginx" ]
then
echo "systemctl stop nginx" >> /var/www/$zotcron
elif [ $webserver = "apache" ]
then
echo "service apache2 stop" >> /var/www/$zotcron
fi
echo "/etc/init.d/mysql stop # to avoid inconsistencies" >> /var/www/$zotcron
echo "#" >> /var/www/$zotcron
echo "echo \"\$(date) - renew certificate...\"" >> /var/www/$zotcron
echo "certbot renew --noninteractive" >> /var/www/$zotcron
echo "#" >> /var/www/$zotcron
echo "# backup" >> /var/www/$zotcron
echo "echo \"\$(date) - try to mount external device for backup...\"" >> /var/www/$zotcron
echo "backup_device_name=$backup_device_name" >> /var/www/$zotcron
echo "backup_device_pass=$backup_device_pass" >> /var/www/$zotcron
echo "backup_mount_point=$backup_mount_point" >> /var/www/$zotcron
echo "device_mounted=0" >> /var/www/$zotcron
echo "if [ -n \"\$backup_device_name\" ]" >> /var/www/$zotcron
echo "then" >> /var/www/$zotcron
echo " if blkid | grep $backup_device_name" >> /var/www/$zotcron
echo " then" >> /var/www/$zotcron
if [ -n "$backup_device_pass" ]
then
echo " echo \"decrypting backup device...\"" >> /var/www/$zotcron
echo " echo "\"$backup_device_pass\"" | cryptsetup luksOpen $backup_device_name cryptobackup" >> /var/www/$zotcron
fi
echo " if [ ! -d $backup_mount_point ]" >> /var/www/$zotcron
echo " then" >> /var/www/$zotcron
echo " mkdir $backup_mount_point" >> /var/www/$zotcron
echo " fi" >> /var/www/$zotcron
echo " echo \"mounting backup device...\"" >> /var/www/$zotcron
if [ -n "$backup_device_pass" ]
then
echo " if mount /dev/mapper/cryptobackup $backup_mount_point" >> /var/www/$zotcron
else
echo " if mount $backup_device_name $backup_mount_point" >> /var/www/$zotcron
fi
echo " then" >> /var/www/$zotcron
echo " device_mounted=1" >> /var/www/$zotcron
echo " echo \"device $backup_device_name is now mounted. Starting backup...\"" >> /var/www/$zotcron
echo " rsync -a --delete /var/lib/mysql/ /media/zotserver_backup/mysql" >> /var/www/$zotcron
echo " rsync -a --delete /var/www/ /media/zotserver_backup/www" >> /var/www/$zotcron
echo " rsync -a --delete /etc/letsencrypt/ /media/zotserver_backup/letsencrypt" >> /var/www/$zotcron
echo " echo \"\$(date) - disk sizes...\"" >> /var/www/$zotcron
echo " df -h" >> /var/www/$zotcron
echo " echo \"\$(date) - db size...\"" >> /var/www/$zotcron
echo " du -h $backup_mount_point | grep mysql/zotserver" >> /var/www/$zotcron
echo " echo \"unmounting backup device...\"" >> /var/www/$zotcron
echo " umount $backup_mount_point" >> /var/www/$zotcron
echo " else" >> /var/www/$zotcron
echo " echo \"failed to mount device $backup_device_name\"" >> /var/www/$zotcron
echo " fi" >> /var/www/$zotcron
if [ -n "$backup_device_pass" ]
then
echo " echo \"closing decrypted backup device...\"" >> /var/www/$zotcron
echo " cryptsetup luksClose cryptobackup" >> /var/www/$zotcron
fi
echo " fi" >> /var/www/$zotcron
echo "fi" >> /var/www/$zotcron
echo "if [ \$device_mounted == 0 ]" >> /var/www/$zotcron
echo "then" >> /var/www/$zotcron
echo " echo \"device could not be mounted $backup_device_name. No backup written.\"" >> /var/www/$zotcron
echo "fi" >> /var/www/$zotcron
echo "#" >> /var/www/$zotcron
echo "echo \"\$(date) - db size...\"" >> /var/www/$zotcron
echo "du -h /var/lib/mysql/ | grep mysql/" >> /var/www/$zotcron
echo "#" >> /var/www/$zotcron
echo "cd /var/www" >> /var/www/$zotcron
echo "for f in *-daily.sh; do \"./\${f}\"; done" >> /var/www/$zotcron
echo "echo \"\$(date) - updating linux...\"" >> /var/www/$zotcron
echo "apt-get -q -y update && apt-get -q -y dist-upgrade && apt-get -q -y autoremove # update linux and upgrade" >> /var/www/$zotcron
echo "echo \"\$(date) - Backup and update finished. Rebooting...\"" >> /var/www/$zotcron
echo "#" >> /var/www/$zotcron
echo "shutdown -r now" >> /var/www/$zotcron
# If global cron job does not exist we add it to /etc/crontab
if grep -q $zotcron /etc/crontab
then
echo "cron job already in /etc/crontab"
else
echo "30 05 * * * root /bin/bash /var/www/$zotcron >> /var/www/zot-daily.log 2>&1" >> /etc/crontab
echo "0 0 1 * * root rm /var/www/zot-daily.log" >> /etc/crontab
fi
# This is active after either "reboot" or cron reload"
systemctl restart cron
print_info "configured cron for updates/upgrades"
}
########################################################################
# START OF PROGRAM
########################################################################
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
check_sanity
zotserver_name
print_info "We're installing a $zotserver instance"
install_path="$(dirname "$(pwd)")"
install_folder="$(basename $install_path)"
# Read config file edited by user
configfile=zotserver-config.txt
source $configfile
selfhostdir=/etc/selfhost
selfhostscript=selfhost-updater.sh
zotcron="zotcron.sh"
zotserverdaily="${install_folder}-${zotserver}-daily.sh"
backup_mount_point="/media/zotserver_backup"
#set -x # activate debugging from here
check_config
stop_zotserver
update_upgrade
install_curl
install_wget
install_sendmail
if [ $webserver = "nginx" ]
then
install_nginx
elif [ $webserver = "apache" ]
then
install_apache
else
die "Failed to install a Web server: 'webserver' not set to \"apache\" or \"nginx\" in $configfile"
fi
install_imagemagick
install_php
if [ $webserver = "nginx" ]
then
add_nginx_block
elif [ $webserver = "apache" ]
then
if [ "$install_path" != "/var/www/html" ]
then
add_vhost
fi
fi
install_mysql
if [ $webserver = "apache" ]
then
install_adminer
fi
create_zotserver_db
run_freedns
install_run_selfhost
ping_domain
configure_cron_freedns
configure_cron_selfhost
if [ "$le_domain" != "localhost" ]
then
install_letsencrypt
check_https
else
print_info "is localhost - skipped installation of letsencrypt and configuration of apache for https"
fi
install_zotserver
configure_zotserverdaily
configure_cron_daily
if [ "$le_domain" != "localhost" ]
then
install_cryptosetup
install_rsync
else
print_info "is localhost - skipped installation of cryptosetup"
fi
#set +x # stop debugging from here

305
CHANGELOG
View File

@@ -1,3 +1,308 @@
Hubzilla 5.0 (2020-11-05)
- Remove unmaintained and deprecated schemas
- Deprecate HTML5_Parser library
- Implement results caching for public tag and profile categories fetching
- Deprecate $a variable for *_plugin_admin() and *_plugin_admin_post()
- Support remote host cache directives on profile photo fetching
- Disable community tags until it is agreed upon on how to implement in zot6 or activitypub
- Improve home install setup script
- Cryptojs moved to addon
- Implement "more encryption" feature with the SJCL library
- Add minimum form lifetime check
- Improve updateConvItems() performance
- Improve infinite scroll experience
- Introduce a software bill of material (wip)
- Implement new forum behaviour (direct-message a forum to post on its wall) for cross-plattform forum compatibility
- Allow apps to be both pinned and starred independently
- Add images load status to spinnner if preload images is enabled
- Deprecate premium channel app
- Allow to set different values for left and right aside width in $theme.php
- Display complete permission info only to channel owner
- Set CURLOPT_ENCODING to empty string so that compressed content will be uncompressed
- Force browser photo revalidation
- Deprecate ACTIVITY_OBJ_FILE and ACTIVITY_OBJ_WIKI in favour of other object types (Document, Audio, Video)
- Use $mid as plink to prevent to long plinks
- Handle some basic friendica attachment bbcodes
- Deprecate is_edit_activity()
- Deprecate voting feature in favour of polls
- Show event timezone if it differs from the channel timezone
- Avoid multiple run of expiry procedure on large sites
- Implement zot6 as the primary protocol
- Introduce polls
- Provide titles for wiki links markup
- Implement DAV calendars sync with clones
- Optional events and poll filters for mod network
- Add new addon hook get_banner
- Provide tools to deal with spam channels for primary directory admin
- Introduce pinned posts for mod channel
- Refactor notifications to utilize server sent events
- Provide more descriptive connection status icons
Bugfixes
- Fix issue where interrupted uploads could not be resumed
- Fix photo sync issue between clones
- Fix issue where profile photos were fetched for unknown channels
- Apply channel name changes to all associated xchans
- Show unchecked box in connedit if value is false
- Reset their_perms before setting new permissions to reflect permission retractions on local hub
- Respect advanced profile setting in sexual preference selector
- Do not allow invite codes to be reused unlimited times
- Fix issue with quoted hashtags/mentions
- Fix issue generating photo thumbnails when uploaded via davfs
- Do not call System::get_platform_name() within t() unless needed
- Fix wrong URL detection with Markdown support enabled
- Fix once cached embedded content is used and stored forever
Addons
- Pubcrawl: fix issue where http signatures were not verified
- Pubcrawl: fix issue where private keys were lost from storage
- Pubcrawl: add host to signed headers (required by mastodon 3.2.1)
- Diaspora: remove relay@relay.iliketoat.net as default relay (it does not exist anymore)
- Diaspora: provide UI for admin to configure relay
- Diaspora: move the-federation.info registration to statistics addon
- Deprecate $a variable for *_plugin_admin() and *_plugin_admin_post()
- Chess: moved to addons-unmaintained repository
- Introduce cryptojs addon to allow decryption of legacy e2ee notes
- Introduce the hide aside addon - fade out aside areas after a while when using endless scroll
- Gallery: only show first row of images in the preview
- Gallery: restrict height of images to divmore_height
- Diaspora: make sure we only provide strings for unxmlify()
- Pubcrawl: fix federation with pixelfed
- Pubcrawl: dismiss announce if we already have the original item
- Gallery: implement view_storage permission for channel_apps()
- Cart: order currency param must be added to the sdk script url
- Diaspora utilize Lib/Connect
- Cart: utilize Lib/Connect
- Cart: add per item and per order customer data entry
- Pubcrawl: implement polls
- Chord Generator: moved to addons-unmaintained repository
- Custom Home: moved to addons-unmaintained repository
- Flattr Widget: moved to addons-unmaintained repository
- Friendica Photo Migrator: moved to addons-unmaintained repository
- Jappix Mini: moved to addons-unmaintained repository
- Mahjongg: moved to addons-unmaintained repository
- Torch: moved to addons-unmaintained repository
- Tour: moved to addons-unmaintained repository
- Introduce navbanner_option addon
- Pubcrawl: support image description
- Queueworker: fix duplicate checking
- Diaspora: fix dreport
- Move legacy zot/diaspora mail frontend from core to mail addon
- Diaspora: improve sql queries performance
- Pubcrawl: introduce pubcrawl_activity_mod_init()
- Twitter: replace Hubzilla bookmark with unicode icon
- Pubcrawl: add sys channel to local subscribers
- Pubcrawl: deal with arrays in attributedTo
- Workflow: various fixes
- Channelreputation: various fixes
- Introduce SSE addon to provide realtime notifications utilizing server sent events
Hubzilla 4.6 (2019-12-04)
- Improve opengraph support for channels
- Add opengraph support for articles
- Update abook_connected for RSS feeds only if handle_feed() returned success
- Do not embed PDF files by default but allow to enabled this feature in security options
- Check if file exists before we include it in the router
- Update jquery to version 3.4.1
- Update composer libraries
- Remove old and unused javascript libraries
- Improved BBcode to Markdown conversion
- Introduce inline SVG support via BBcode
- Sanitize title on Atom/RSS feed import
- Improved HTTP headers cache support for photos
- Add date headers to signed headers
- Add check if item['tag'] is an array
- Add hook comments_are_now_closed for addons to override date based comment closure
- Change mysql schema for item.llink and item.plink for new installs from char(191) to text
- Improved photo cache expiration
- Improved plural function processing on translation strings creation from .po file with util/po2php utlility
- Improved support for CDN/Infrastructure caching (especially profile images)
- New japanese translation
- Add connect button for non-zot networks not connected in current location
- Allow to send forum channels wall2wall or sent by mentions post to external sites via addons
- Allow addons to process forum posts published through mentions
- Improved internal routing for ActivityPub messages
- Improved admin documentation
- Add ITEM_TYPE_CUSTOM and hooks to permit addons to create and distribute custom item types
- Support "comment policy" in Zot6 communications
- Add selected text as quote on reply if comment button is used
- Add more nofollow tags to links to discourage backlink farmers
- Improved conversion of emoji reactions from zot to zot6
- Add CardDAV/CalDAV autodiscovery
- Label source project of zotfeed since it is not completely compatible across projects
- Update homeinstall script
Bugfixes
- Fix once cached embedded content is used and stored forever
- Fix wildcard tag issue
- Fix duplicate attachment in jot fileupload
- Fix regression with audio file upload
- Fix can not edit menu name or title (#1402)
- Fix pagination encoding issue for some server setups
- Fix Zap->Hubzilla event title compatibility
- Fix event timezones for Zot6
- Fix missing summary in mod article_edit
- Fix PHP warning failed to write session data using user defined save handler
- Fix possible thumbnails distortion on rebuild with util/thumbrepair utility
- Fix issues with image import to zot6
- Fix attachment permissions on clonned channels sync
- Fix entries without sitekey returned from DB in queue_deliver() and Lib/Queue
Addons
- Twitter: send tweet even if attached image uploading was unsuccessful
- Livejournal: add link to original post option
- Flashcards: update to version 2.08
- Pubcrawl: compatibility changes to support pixelfed
- Cart: update paypal button to API v2
- Photocache: rework for speed and lower memory consumption
- Photocache: etag support for cached photos
- Photocache: purge cache on addon uninstall
- Openstreetmap: fix regression if no default values set
- Livejournal: allow send posts from non channel owner
- Pubcrawl: fix event timezones
- Pubcrawl: better ActivityPub channel URL detection
- Pubcrawl: fix comments delivery for other channels on the same hub
- New addon "workflow" with initial basic "issue tracker" capability
Hubzilla 4.4.1 (2019-08-16)
- Fix wrong profile photo displayed when previewing and editing profiles
- Fix regression from 4.4 which prevented encrypted signatures from being used for encrypted messages
- Fix typo in queueworker addon which broke filtering of duplicate work
Hubzilla 4.4 (2019-08-13)
- Change primary directory from zotadel.net to hub.netzgemeinde.eu (requested by zotadel admin)
- Add Russian context help files
- Replace plink URL with share tag if possible
- Catch and exclude trailing punctuation while URL embedding
- Do not limit channel if service class property value is set to zero
- Streamline keyId and creator/actor
- Add daemon_master_summon hook
- Serve static files directly if not caught by web server
- Update cacert.pem
- Calendar: allow different date/time format inputs
- Calendar: hide timezone select for allday events
⁻ Add opengraph meta info to channel page
- Begin directory migration to zot6
- Support zot and zot6 in social graph operations
- Lowlevel support for zot6 direct messages
- Consolidate HTTP signatures
- Allow api login by address or url
- Provide auto redirect from zot6 /item permalinks
- Export all items except photos in channel_export_items_date()
- Calendar: clicking a day or week number will now open the day or week view
- Remove cached photo location directory on delete if empty
- Include zot6 hubs in the Grid scope
- Fix os_path replace for thumbnails
- Avoid to process original images using storeThumbnail()
Bugfixes
- Fix URLs on imported item taxonomy
- Fix admin not allowed to delete any item
- Fix webfiunger issue with URLs containing an @
- Fix missing object in emoji reactions
- Fix appschema to include diaspora:guid
- Fix zotfinger in update_directory_entry()
- Fix incorrect media type on links for photo objects
- Fix mid not dbesc'd in item_store()
- Fix calendar encoding issues
Addons
- twitter: various rendering improvements
- cavatar: fix wrong image mimetype
- gravatar: fix wrong image mimetype
- Add license file
- pubcrawl: make repeats render like wall to wall posts
- pubcrawl: fix pubcrawl_import_author() sometimes returning a non activitypub xchan
- pubcrawl: use Lib/Activity for taxonomy en/decoding
- pubcrawl: fix wrong uuid in like activity
- pubcrawl: fix issue with encoding hashtags
- openstreetmap: use https URLs by default
- queueworker: refactor and efficiency improvements
- pubcrawl: use unique IDs for follow and accept activities
- pubcrawl: implement thread completion
- pubcrawl: implement delete activity
- photocache: reduce the size of the photo cache subdirectories tree
- photocache: use html_entity_decode() for cached photo URL
- diaspora: fix possible issue with diaspora relay not initializing
Hubzilla 4.2.1 (2019-06-17)
- Deprecate mod events
- Revisit mod cal
- Fix issues with deletion of linked items and resources
- Fix zot6 delete issue
- Fix attach sync issue
- Remove sizeRangeSuffixes in justified gallery wrapper
- Fix storageconv issue with postgres
- Fix embedphotos image size
- pubcrawl: use URI instead of object for actor url
- diaspora: adjust loglevel
- gallery: remove workaround for margin issue which has been fixed upstream
- cart: warn about unsaved changes
Hubzilla 4.2 (2019-06-04)
- Introduce Calendar app which deprecates Events and CalDAV apps and streamlines the featuresets
- Update mod cal to reflect changes in the calendar app
- Improve timezone detection for CalDAV calendars
- Add mention support to event description in channel calendar
- Update jgrowl library
- Do not try to oembed URLs without embed tags
- Optimise pdf oembed processing
- Add form security token to mod register
- Replace URLs for mod gallery, mod photos and mod photo on cloned channel post sync
- Update justified gallery library
- Update bootstrap libraries
- Use "cache" flag for bbcode() on content destined for zot6
- Improve DB indexing
- Drop deprecated columns from channel the table
- Replace own image URL in clonned channel posts
- Improve DB update handling
- Improve item deletion when a contact was removed
- Zot6 compatibility for emoji reactions
- Add threaded comments support (disabled by default)
- Improve xmlify()/unxmlify() performance
- Update blueimp/jquery-file-uplad library
- Update sabre/vobject library
- Various doco updates
- Implement remove profile photo button (reset to default photo)
- Implement remove cover photo button
- Update the homeinstall script
- Add command line tool for photo thumbnails storage conversion
- Implement option to store photo thumbnails in filesystem instead of DB
Bugfixes
- Fix category widget when using articles
- Fix live update not triggering in mod search
- Fix encoded URLs in code blocks
- Fix wiki headers not escaped
- Fix possible xchan protocol confusion in new_contact()
- Fix xchan_url not displayed if xchan_addr not available
- Fix suggestion ordering in mod directory
- Fix event attachment delivery to zot6
Addons
- pubcrawl: improve friendica compatibility by adding the nonstandard diaspora:guid field
- pubcrawl: initial suport for events
- pubcrawl: improve permalink detection
- flashcards: fix moving learn buttons if viewport sizes changes
- flashcards: Move card details to the bottom of a card
- upgrade_info: provide links to changelog
- photocache: do not save filename for cached photos
- pubcrawl: save local comment activitypub payload in iconfig to be used for relay
- flashcards: UI improvements in box settings
- pubcrawl: implement profile update messages
- pubcrawl: use URI instead of object for actor
- flashcards: fix jumping sync button
- pubcrawl: add threaded comments support
- pubcrawl: ignore target encoding errors
- pubcrawl: format photo items for activitypub
Hubzilla 4.0.3 (2019-04-26)
- Add attachments to zot6 event objects
- Add zot6 to federated transports

11
LICENSE
View File

@@ -1,4 +1,5 @@
Copyright (c) 2010-2018 the Hubzilla Community
Copyright (c) 2019 Hubzilla Community
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -8,13 +9,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

32
SBOM.md Normal file
View File

@@ -0,0 +1,32 @@
# Hubzilla Software Bill of Materials - WIP
|Name|Version|License|Source|
|----|-------|-------|------|
|blueimp/jquery-file-upload|10.31.0.0|MIT|https://github.com/vkhramtsov/jQuery-File-Upload.git|
|bshaffer/oauth2-server-php|1.11.1.0|MIT|https://github.com/bshaffer/oauth2-server-php.git|
|commerceguys/intl|1.0.5.0|MIT|https://github.com/commerceguys/intl.git|
|desandro/imagesloaded|4.1.4.0|MIT|https://github.com/desandro/imagesloaded.git|
|ezyang/htmlpurifier|4.13.0.0|LGPL-2.1-or-later|https://github.com/ezyang/htmlpurifier.git|
|league/html-to-markdown|4.10.0.0|MIT|https://github.com/thephpleague/html-to-markdown.git|
|lukasreschke/id3parser|0.0.3.0|GPL|https://github.com/LukasReschke/ID3Parser.git|
|michelf/php-markdown|1.9.0.0|BSD-3-Clause|https://github.com/michelf/php-markdown.git|
|paragonie/random_compat|9.99.99.0|MIT|https://github.com/paragonie/random_compat.git|
|pear/text_languagedetect|1.0.0.0|BSD-2-Clause|https://github.com/pear/Text_LanguageDetect.git|
|psr/log|1.1.3.0|MIT|https://github.com/php-fig/log.git|
|ramsey/uuid|3.9.3.0|MIT|https://github.com/ramsey/uuid.git|
|sabre/dav|4.1.1.0|BSD-3-Clause|https://github.com/sabre-io/dav.git|
|sabre/event|5.1.0.0|BSD-3-Clause|https://github.com/sabre-io/event.git|
|sabre/http|5.1.0.0|BSD-3-Clause|https://github.com/sabre-io/http.git|
|sabre/uri|2.2.0.0|BSD-3-Clause|https://github.com/sabre-io/uri.git|
|sabre/vobject|4.3.1.0|BSD-3-Clause|https://github.com/sabre-io/vobject.git|
|sabre/xml|2.2.1.0|BSD-3-Clause|https://github.com/sabre-io/xml.git|
|simplepie/simplepie|1.5.5.0|BSD-3-Clause|https://github.com/simplepie/simplepie.git|
|smarty/smarty|3.1.36.0|LGPL-3.0|https://github.com/smarty-php/smarty.git|
|symfony/polyfill-ctype|1.13.1.0|MIT|https://github.com/symfony/polyfill-ctype.git|
|twbs/bootstrap|4.5.2.0|MIT|https://github.com/twbs/bootstrap.git|
|fullcalendar/fullcalendar|4.4.2.0|MIT|https://github.com/fullcalendar/fullcalendar.git|
|miromannino/Justified-Gallery|3.8.1.0|MIT|https://github.com/miromannino/Justified-Gallery.git|
|fengyuanchen/cropperjs|1.5.7.0|MIT|https://github.com/fengyuanchen/cropperjs.git|
|ForkAwesome/Fork-Awesome|1.1.7.0|MIT,SIL OFL,CC BY 3.0|https://github.com/ForkAwesome/Fork-Awesome.git|
|leafo/sticky-kit|1.1.2.0|MIT|https://github.com/leafo/sticky-kit.git|
|jquery/jquery|3.5.1.0|MIT|https://github.com/jquery/jquery.git|

View File

@@ -100,6 +100,7 @@ class PermissionRoles {
'post_mail', 'post_like' , 'republish', 'chat'
];
$ret['limits'] = PermissionLimits::Std_Limits();
$ret['channel_type'] = 'group';
break;
@@ -113,6 +114,7 @@ class PermissionRoles {
'view_pages', 'view_wiki', 'post_wall', 'post_comments', 'tag_deliver',
'post_mail', 'post_like' , 'chat' ];
$ret['limits'] = PermissionLimits::Std_Limits();
$ret['channel_type'] = 'group';
break;
@@ -132,6 +134,7 @@ class PermissionRoles {
$ret['limits']['view_storage'] = PERMS_SPECIFIC;
$ret['limits']['view_pages'] = PERMS_SPECIFIC;
$ret['limits']['view_wiki'] = PERMS_SPECIFIC;
$ret['channel_type'] = 'group';
break;
@@ -187,6 +190,7 @@ class PermissionRoles {
'post_mail', 'post_like' , 'republish', 'chat', 'write_wiki'
];
$ret['limits'] = PermissionLimits::Std_Limits();
$ret['channel_type'] = 'group';
break;

View File

@@ -283,4 +283,15 @@ class Permissions {
return ( [ 'perms' => $my_perms, 'automatic' => $automatic ] );
}
}
static public function serialise($p) {
$n = [];
if($p) {
foreach($p as $k => $v) {
if(intval($v)) {
$n[] = $k;
}
}
}
return implode(',',$n);
}
}

View File

@@ -2,6 +2,8 @@
namespace Zotlabs\Daemon;
use Zotlabs\Lib\Libsync;
class Cron {
static public function run($argc,$argv) {
@@ -36,10 +38,14 @@ class Cron {
Master::Summon(array('Poller'));
// maintenance for mod sharedwithme - check for updated items and remove them
require_once('include/sharedwithme.php');
apply_updates();
/**
* Chatpresence: if somebody hasn't pinged recently, they've most likely left the page
* and shouldn't count as online anymore. We allow an expection for bots.
*/
q("delete from chatpresence where cp_last < %s - INTERVAL %s and cp_client != 'auto' ",
db_utcnow(),
db_quoteinterval('3 MINUTE')
);
// expire any expired mail
@@ -97,26 +103,26 @@ class Cron {
// Clean expired photos from cache
$age = get_config('system','active_expire_days', '30');
$r = q("SELECT DISTINCT xchan, content FROM photo WHERE photo_usage = %d AND expires < %s - INTERVAL %s",
intval(PHOTO_CACHE),
db_utcnow(),
db_quoteinterval($age . ' DAY')
db_utcnow(),
db_quoteinterval(get_config('system','active_expire_days', '30') . ' DAY')
);
if($r) {
q("DELETE FROM photo WHERE photo_usage = %d AND expires < %s - INTERVAL %s",
intval(PHOTO_CACHE),
db_utcnow(),
db_quoteinterval(get_config('system','active_expire_days', '30') . ' DAY')
);
foreach($r as $rr) {
$file = dbunescbin($rr['content']);
if(is_file($file)) {
@unlink($file);
@rmdir(dirname($file));
logger('info: deleted cached photo file ' . $file, LOGGER_DEBUG);
}
}
}
q("DELETE FROM photo WHERE photo_usage = %d AND expires < %s - INTERVAL %s",
intval(PHOTO_CACHE),
db_utcnow(),
db_quoteinterval($age . ' DAY')
);
// publish any applicable items that were set to be published in the future
// (time travel posts). Restrict to items that have come of age in the last
@@ -138,7 +144,7 @@ class Cron {
if($z) {
xchan_query($z);
$sync_item = fetch_post_tags($z);
build_sync_packet($sync_item[0]['uid'],
Libsync::build_sync_packet($sync_item[0]['uid'],
[
'item' => [ encode_item($sync_item[0],true) ]
]
@@ -149,6 +155,11 @@ class Cron {
}
}
// check if any connections transitioned to zot6 and upgrade the connections to zot6 at this hub if so.
require_once('include/connections.php');
z6trans_connections();
require_once('include/attach.php');
attach_upgrade();
@@ -187,7 +198,7 @@ class Cron {
if($r) {
require_once('include/photo/photo_driver.php');
foreach($r as $rr) {
$photos = import_xchan_photo($rr['xchan_photo_l'],$rr['xchan_hash']);
$photos = import_xchan_photo($rr['xchan_photo_l'], $rr['xchan_hash'], false, true);
$x = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
where xchan_hash = '%s'",
dbesc($photos[0]),
@@ -214,7 +225,7 @@ class Cron {
$restart = true;
$generation = intval($argv[2]);
if(! $generation)
killme();
return;
}
reload_plugins();

View File

@@ -44,6 +44,17 @@ class Cron_daily {
db_utcnow(), db_quoteinterval('1 YEAR')
);
// expire anonymous sse notification entries once a day
q("delete from xconfig where xchan like '%s'",
dbesc('sse_id.%')
);
// Clean up emdedded content cache
q("DELETE FROM cache WHERE updated < %s - INTERVAL %s",
db_utcnow(),
db_quoteinterval(get_config('system','active_expire_days', '30') . ' DAY')
);
//update statistics in config
require_once('include/statistics_fns.php');
@@ -85,6 +96,7 @@ class Cron_daily {
Master::Summon(array('Cli_suggest'));
remove_obsolete_hublocs();
z6_discover();
call_hooks('cron_daily',datetime_convert());

View File

@@ -13,7 +13,7 @@ class CurlAuth {
static public function run($argc,$argv) {
if($argc != 2)
killme();
return;
\App::$session->start();
@@ -50,6 +50,6 @@ class CurlAuth {
file_put_contents($c,$x);
killme();
return;
}
}
}

View File

@@ -2,10 +2,9 @@
namespace Zotlabs\Daemon;
require_once('include/zot.php');
require_once('include/dir_fns.php');
require_once('include/queue_fn.php');
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Libzotdir;
use Zotlabs\Lib\Queue;
class Directory {
@@ -42,7 +41,7 @@ class Directory {
// this is an in-memory update and we don't need to send a network packet.
local_dir_update($argv[1],$force);
Libzotdir::local_dir_update($argv[1],$force);
q("update channel set channel_dirdate = '%s' where channel_id = %d",
dbesc(datetime_convert()),
@@ -58,13 +57,15 @@ class Directory {
// otherwise send the changes upstream
$directory = find_upstream_directory($dirmode);
$directory = Libzotdir::find_upstream_directory($dirmode);
$url = $directory['url'] . '/post';
// ensure the upstream directory is updated
$packet = zot_build_packet($channel,(($force) ? 'force_refresh' : 'refresh'));
$z = zot_zot($url,$packet);
$packet = Libzot::build_packet($channel,(($force) ? 'force_refresh' : 'refresh'));
$z = Libzot::zot($url,$packet,$channel);
// re-queue if unsuccessful
@@ -76,7 +77,7 @@ class Directory {
$hash = random_string();
queue_insert(array(
Queue::insert(array(
'hash' => $hash,
'account_id' => $channel['channel_account_id'],
'channel_id' => $channel['channel_id'],

View File

@@ -8,6 +8,15 @@ class Expire {
static public function run($argc,$argv){
cli_startup();
$pid = get_config('expire', 'procid', false);
if ($pid && (function_exists('posix_kill') ? posix_kill($pid, 0) : true)) {
logger('Expire: procedure already run with pid ' . $pid, LOGGER_DEBUG);
return;
}
$pid = getmypid();
set_config('expire', 'procid', $pid);
// perform final cleanup on previously delete items
@@ -32,7 +41,7 @@ class Expire {
if (intval(get_config('system', 'optimize_items')))
q("optimize table item");
logger('expire: start', LOGGER_DEBUG);
logger('expire: start with pid ' . $pid, LOGGER_DEBUG);
$site_expire = intval(get_config('system', 'default_expire_days'));
$commented_days = intval(get_config('system','active_expire_days'));
@@ -90,5 +99,7 @@ class Expire {
logger('Expire: sys: done', LOGGER_DEBUG);
}
del_config('expire', 'procid');
}
}

View File

@@ -2,7 +2,9 @@
namespace Zotlabs\Daemon;
require_once('include/zot.php');
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Webfinger;
use Zotlabs\Lib\Zotfinger;
// performs zot_finger on $argv[1], which is a hex_encoded webbie/reddress
@@ -22,12 +24,16 @@ class Gprobe {
);
if(! $r) {
$j = \Zotlabs\Zot\Finger::run($url,null);
if($j['success']) {
$y = import_xchan($j);
$href = Webfinger::zot_url(punify($url));
if($href) {
$zf = Zotfinger::exec($href, null);
}
if(is_array($zf) && array_path_exists('signature/signer',$zf) && $zf['signature']['signer'] === $href && intval($zf['signature']['header_valid'])) {
$xc = Libzot::import_xchan($zf['data']);
}
}
return;
}
}

View File

@@ -2,6 +2,8 @@
namespace Zotlabs\Daemon;
use Zotlabs\Lib\Libsync;
class Importfile {
static public function run($argc,$argv){
@@ -40,7 +42,7 @@ class Importfile {
$sync = attach_export_data($channel,$hash);
if($sync)
build_sync_packet($channel['channel_id'],array('file' => array($sync)));
Libsync::build_sync_packet($channel['channel_id'],array('file' => array($sync)));
return;
}

View File

@@ -9,7 +9,7 @@ if(array_search( __file__ , get_included_files()) === 0) {
if($argc)
Master::Release($argc,$argv);
killme();
return;
}
@@ -17,7 +17,22 @@ if(array_search( __file__ , get_included_files()) === 0) {
class Master {
static public function Summon($arr) {
proc_run('php','Zotlabs/Daemon/Master.php',$arr);
$hookinfo = [
'argv'=>$arr
];
call_hooks ('daemon_master_summon',$hookinfo);
$arr = $hookinfo['argv'];
$argc = count($arr);
if ((!is_array($arr) || (count($arr) < 1))) {
logger("Summon handled by hook.",LOGGER_DEBUG);
return;
}
$phpbin = get_config('system','phpbin','php');
proc_run($phpbin,'Zotlabs/Daemon/Master.php',$arr);
}
static public function Release($argc,$argv) {
@@ -33,6 +48,7 @@ class Master {
$argc = count($argv);
if ((!is_array($argv) || (count($argv) < 1))) {
logger("Release handled by hook.",LOGGER_DEBUG);
return;
}

View File

@@ -3,6 +3,7 @@
namespace Zotlabs\Daemon;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Activity;
require_once('include/queue_fn.php');
require_once('include/html2plain.php');
@@ -44,18 +45,18 @@ require_once('include/bbcode.php');
*
* where COMMAND is one of the following:
*
* activity (in diaspora.php, dfrn_confirm.php, profiles.php)
* comment-import (in diaspora.php, items.php)
* comment-new (in item.php)
* drop (in diaspora.php, items.php, photos.php)
* edit_post (in item.php)
* event (in events.php)
* expire (in items.php)
* like (in like.php, poke.php)
* mail (in message.php)
* tag (in photos.php, poke.php, tagger.php)
* tgroup (in items.php)
* wall-new (in photos.php, item.php)
* activity (in diaspora.php, dfrn_confirm.php, profiles.php)
* comment-import (in diaspora.php, items.php)
* comment-new (in item.php)
* drop (in diaspora.php, items.php, photos.php)
* edit_post (in item.php)
* event (in events.php)
* expire (in items.php)
* like (in like.php, poke.php)
* mail (in message.php)
* tag (in photos.php, poke.php, tagger.php)
* tgroup (in items.php)
* wall-new (in photos.php, item.php)
*
* and ITEM_ID is the id of the item in the database that needs to be sent to others.
*
@@ -65,9 +66,10 @@ require_once('include/bbcode.php');
* permission_reject abook_id
* permission_update abook_id
* refresh_all channel_id
* purge channel_id xchan_hash
* purge_all channel_id
* expire channel_id
* relay item_id (item was relayed to owner, we will deliver it as owner)
* relay item_id (item was relayed to owner, we will deliver it as owner)
* single_activity item_id (deliver to a singleton network from the appropriate clone)
* single_mail mail_id (deliver to a singleton network from the appropriate clone)
* location channel_id
@@ -239,25 +241,40 @@ class Notifier {
$packet_type = 'location';
$location = true;
}
elseif($cmd === 'purge') {
$xchan = $argv[3];
logger('notifier: purge: ' . $item_id . ' => ' . $xchan);
if (! $xchan) {
return;
}
$channel = channelx_by_n($item_id);
$recipients[] = $xchan;
$private = true;
$packet_type = 'purge';
$packet_recips[] = ['hash' => $xchan];
}
elseif($cmd === 'purge_all') {
logger('notifier: purge_all: ' . $item_id);
$s = q("select * from channel where channel_id = %d limit 1",
intval($item_id)
);
if($s)
$channel = $s[0];
$uid = $item_id;
$recipients = array();
$channel = channelx_by_n($item_id);
$recipients = [];
$r = q("select abook_xchan from abook where abook_channel = %d and abook_self = 0",
intval($item_id)
);
if($r) {
foreach($r as $rr) {
$recipients[] = $rr['abook_xchan'];
}
if (! $r) {
return;
}
foreach ($r as $rr) {
$recipients[] = $rr['abook_xchan'];
$packet_recips[] = ['hash' => $rr['abook_xchan']];
}
$private = false;
$packet_type = 'purge';
}
else {
@@ -277,6 +294,12 @@ class Notifier {
$r = fetch_post_tags($r);
$target_item = $r[0];
if(in_array($target_item['author']['xchan_network'], ['rss', 'anon'])) {
logger('notifier: target item author is not a fetchable actor', LOGGER_DEBUG);
return;
}
$deleted_item = false;
if(intval($target_item['item_deleted'])) {
@@ -285,8 +308,21 @@ class Notifier {
}
if(! in_array(intval($target_item['item_type']), [ ITEM_TYPE_POST ] )) {
logger('notifier: target item not forwardable: type ' . $target_item['item_type'], LOGGER_DEBUG);
return;
$hookinfo=[
'targetitem'=>$target_item,
'deliver'=>false
];
if (intval($target_item['item_type'] == ITEM_TYPE_CUSTOM)) {
call_hooks('customitem_deliver',$hookinfo);
}
if (!$hookinfo['deliver']) {
logger('notifier: target item not forwardable: type ' . $target_item['item_type'], LOGGER_DEBUG);
return;
}
$target_item = $hookinfo['targetitem'];
}
// Check for non published items, but allow an exclusion for transmitting hidden file activities
@@ -347,15 +383,24 @@ class Notifier {
$encoded_item = encode_item($target_item);
// activitystreams version
$m = get_iconfig($target_item,'activitystreams','signed_data');
// Re-use existing signature unless the activity type changed to a Tombstone, which won't verify.
$m = ((intval($target_item['item_deleted'])) ? '' : get_iconfig($target_item,'activitystreams','signed_data'));
if($m) {
$activity = json_decode($m,true);
}
else {
$activity = \Zotlabs\Lib\Activity::encode_activity($target_item);
$activity = array_merge(['@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
z_root() . ZOT_APSCHEMA_REV
]], Activity::encode_activity($target_item)
);
}
logger('target_item: ' . print_r($target_item,true), LOGGER_DEBUG);
logger('encoded: ' . print_r($activity,true), LOGGER_DEBUG);
// Send comments to the owner to re-deliver to everybody in the conversation
// We only do this if the item in question originated on this site. This prevents looping.
// To clarify, a site accepting a new comment is responsible for sending it to the owner for relay.
@@ -454,7 +499,6 @@ class Notifier {
$details = q("select xchan_hash, xchan_network, xchan_addr, xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . protect_sprintf(implode(',',$recipients)) . ")");
$recip_list = array();
if($details) {
@@ -519,18 +563,40 @@ class Notifier {
// Now we have collected recipients (except for external mentions, FIXME)
// Let's reduce this to a set of hubs; checking that the site is not dead.
$r = q("select hubloc.*, site.site_crypto, site.site_flags from hubloc left join site on site_url = hubloc_url where hubloc_hash in (" . protect_sprintf(implode(',',$recipients)) . ")
and hubloc_error = 0 and hubloc_deleted = 0 and ( site_dead = 0 OR site_dead is null ) "
);
$hubs = q("select hubloc.*, site.site_crypto, site.site_flags, site.site_version, site.site_project, site.site_dead from hubloc left join site on site_url = hubloc_url
where hubloc_hash in (" . protect_sprintf(implode(',',$recipients)) . ")
and hubloc_error = 0 and hubloc_deleted = 0"
);
if(! $r) {
// public posts won't make it to the local public stream unless there's a recipient on this site.
// This code block sees if it's a public post and localhost is missing, and if so adds an entry for the local sys channel to the $hubs list
if (! $private) {
$found_localhost = false;
if ($hubs) {
foreach ($hubs as $h) {
if ($h['hubloc_url'] === z_root()) {
$found_localhost = true;
break;
}
}
}
if (! $found_localhost) {
$localhub = q("select hubloc.*, site.site_crypto, site.site_flags, site.site_version, site.site_project, site.site_dead from hubloc
left join site on site_url = hubloc_url where hubloc_id_url = '%s' and hubloc_error = 0 and hubloc_deleted = 0",
dbesc(z_root() . '/channel/sys')
);
if ($localhub) {
$hubs = array_merge($hubs, $localhub);
}
}
}
if(! $hubs) {
logger('notifier: no hubs', LOGGER_NORMAL, LOG_NOTICE);
return;
}
$hubs = $r;
/**
* Reduce the hubs to those that are unique. For zot hubs, we need to verify uniqueness by the sitekey,
* since it may have been a re-install which has not yet been detected and pruned.
@@ -543,9 +609,15 @@ class Notifier {
$keys = []; // array of keys to check uniquness for zot hubs
$urls = []; // array of urls to check uniqueness of hubs from other networks
$hub_env = []; // per-hub envelope so we don't broadcast the entire envelope to all
$dead = []; // known dead hubs - report them as undeliverable
foreach($hubs as $hub) {
if (intval($hub['site_dead'])) {
$dead[] = $hub;
continue;
}
if($env_recips) {
foreach($env_recips as $er) {
if($hub['hubloc_hash'] === $er['hash']) {
@@ -617,7 +689,7 @@ class Notifier {
}
// singleton deliveries by definition 'not got zot'.
// Single deliveries are other federated networks (plugins) and we're essentially
// Single deliveries are other federated networks (plugins) and we're essentially
// delivering only to those that have this site url in their abook_instance
// and only from within a sync operation. This means if you post from a clone,
// and a connection is connected to one of your other clones; assuming that hub
@@ -712,7 +784,24 @@ class Notifier {
$packet = zot_build_packet($channel,'notify',$env, (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
}
}
}
// remove this after most hubs have updated to version 5.0
if(stripos($hub['site_project'], 'hubzilla') !== false && version_compare($hub['site_version'], '4.7.3', '<=')) {
if($encoded_item['type'] === 'mail') {
$encoded_item['from']['network'] = 'zot';
$encoded_item['from']['guid_sig'] = str_replace('sha256.', '', $encoded_item['from']['guid_sig']);
}
else {
$encoded_item['owner']['network'] = 'zot';
$encoded_item['owner']['guid_sig'] = str_replace('sha256.', '', $encoded_item['owner']['guid_sig']);
if(strpos($encoded_item['author']['url'], z_root()) === 0) {
$encoded_item['author']['network'] = 'zot';
$encoded_item['author']['guid_sig'] = str_replace('sha256.', '', $encoded_item['author']['guid_sig']);
}
}
}
queue_insert(
[
@@ -755,6 +844,24 @@ class Notifier {
logger('notifier: basic loop complete.', LOGGER_DEBUG);
if ($dead) {
foreach ($dead as $deceased) {
if (is_array($target_item) && (! $target_item['item_deleted']) && (! get_config('system','disable_dreport'))) {
q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_name, dreport_result, dreport_time, dreport_xchan, dreport_queue )
values ( '%s', '%s','%s','%s','%s','%s','%s','%s' ) ",
dbesc($target_item['mid']),
dbesc($deceased['hubloc_host']),
dbesc($deceased['hubloc_host']),
dbesc($deceased['hubloc_host']),
dbesc('undeliverable/unresponsive site'),
dbesc(datetime_convert()),
dbesc($channel['channel_hash']),
dbesc(random_string(48))
);
}
}
}
call_hooks('notifier_end',$target_item);
logger('notifer: complete.');

View File

@@ -2,6 +2,8 @@
namespace Zotlabs\Daemon;
use Zotlabs\Lib\Libzot;
require_once('include/zot.php');
require_once('include/socgraph.php');
@@ -61,11 +63,13 @@ class Onepoll {
if($contact['xchan_network'] === 'rss') {
logger('onepoll: processing feed ' . $contact['xchan_name'], LOGGER_DEBUG);
handle_feed($importer['channel_id'],$contact_id,$contact['xchan_hash']);
q("update abook set abook_connected = '%s' where abook_id = %d",
dbesc(datetime_convert()),
intval($contact['abook_id'])
);
$alive = handle_feed($importer['channel_id'],$contact_id,$contact['xchan_hash']);
if ($alive) {
q("update abook set abook_connected = '%s' where abook_id = %d",
dbesc(datetime_convert()),
intval($contact['abook_id'])
);
}
return;
}
@@ -74,7 +78,11 @@ class Onepoll {
// update permissions
$x = zot_refresh($contact,$importer);
if($contact['xchan_network'] === 'zot6')
$x = Libzot::refresh($contact,$importer);
if($contact['xchan_network'] === 'zot')
$x = zot_refresh($contact,$importer);
$responded = false;
$updated = datetime_convert();

View File

@@ -47,7 +47,7 @@ class Poller {
$restart = true;
$generation = intval($argv[2]);
if(! $generation)
killme();
return;
}
if(($argc > 1) && intval($argv[1])) {

411
Zotlabs/Lib/AccessList.php Normal file
View File

@@ -0,0 +1,411 @@
<?php
namespace Zotlabs\Lib;
use Zotlabs\Lib\Libsync;
class AccessList {
static function add($uid,$name,$public = 0) {
$ret = false;
if ($uid && $name) {
$r = self::byname($uid,$name); // check for dups
if ($r !== false) {
// This could be a problem.
// Let's assume we've just created a list which we once deleted
// all the old members are gone, but the list remains so we don't break any security
// access lists. What we're doing here is reviving the dead list, but old content which
// was restricted to this list may now be seen by the new list members.
$z = q("SELECT * FROM pgrp WHERE id = %d LIMIT 1",
intval($r)
);
if(($z) && $z[0]['deleted']) {
q('UPDATE pgrp SET deleted = 0 WHERE id = %d', intval($z[0]['id']));
notice( t('A deleted list with this name was revived. Existing item permissions <strong>may</strong> apply to this list and any future members. If this is not what you intended, please create another list with a different name.') . EOL);
}
return true;
}
$hash = new_uuid();
$r = q("INSERT INTO pgrp ( hash, uid, visible, gname )
VALUES( '%s', %d, %d, '%s' ) ",
dbesc($hash),
intval($uid),
intval($public),
dbesc($name)
);
$ret = $r;
}
Libsync::build_sync_packet($uid,null,true);
return $ret;
}
static function remove($uid,$name) {
$ret = false;
if ($uid && $name) {
$r = q("SELECT id, hash FROM pgrp WHERE uid = %d AND gname = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
if ($r) {
$group_id = $r[0]['id'];
$group_hash = $r[0]['hash'];
}
else {
return false;
}
// remove group from default posting lists
$r = q("SELECT channel_default_group, channel_allow_gid, channel_deny_gid FROM channel WHERE channel_id = %d LIMIT 1",
intval($uid)
);
if ($r) {
$user_info = array_shift($r);
$change = false;
if ($user_info['channel_default_group'] == $group_hash) {
$user_info['channel_default_group'] = '';
$change = true;
}
if (strpos($user_info['channel_allow_gid'], '<' . $group_hash . '>') !== false) {
$user_info['channel_allow_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_allow_gid']);
$change = true;
}
if (strpos($user_info['channel_deny_gid'], '<' . $group_hash . '>') !== false) {
$user_info['channel_deny_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_deny_gid']);
$change = true;
}
if ($change) {
q("UPDATE channel SET channel_default_group = '%s', channel_allow_gid = '%s', channel_deny_gid = '%s'
WHERE channel_id = %d",
intval($user_info['channel_default_group']),
dbesc($user_info['channel_allow_gid']),
dbesc($user_info['channel_deny_gid']),
intval($uid)
);
}
}
// remove all members
$r = q("DELETE FROM pgrp_member WHERE uid = %d AND gid = %d ",
intval($uid),
intval($group_id)
);
// remove group
$r = q("UPDATE pgrp SET deleted = 1 WHERE uid = %d AND gname = '%s'",
intval($uid),
dbesc($name)
);
$ret = $r;
}
Libsync::build_sync_packet($uid,null,true);
return $ret;
}
// returns the integer id of an access group owned by $uid and named $name
// or false.
static function byname($uid,$name) {
if (! ($uid && $name)) {
return false;
}
$r = q("SELECT id FROM pgrp WHERE uid = %d AND gname = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
if ($r) {
return $r[0]['id'];
}
return false;
}
static function by_id($uid,$id) {
if (! ($uid && $id)) {
return false;
}
$r = q("SELECT * FROM pgrp WHERE uid = %d AND id = %d and deleted = 0",
intval($uid),
intval($id)
);
if ($r) {
return array_shift($r);
}
return false;
}
static function rec_byhash($uid,$hash) {
if (! ( $uid && $hash)) {
return false;
}
$r = q("SELECT * FROM pgrp WHERE uid = %d AND hash = '%s' LIMIT 1",
intval($uid),
dbesc($hash)
);
if ($r) {
return array_shift($r);
}
return false;
}
static function member_remove($uid,$name,$member) {
$gid = self::byname($uid,$name);
if (! $gid) {
return false;
}
if (! ($uid && $gid && $member)) {
return false;
}
$r = q("DELETE FROM pgrp_member WHERE uid = %d AND gid = %d AND xchan = '%s' ",
intval($uid),
intval($gid),
dbesc($member)
);
Libsync::build_sync_packet($uid,null,true);
return $r;
}
static function member_add($uid,$name,$member,$gid = 0) {
if (! $gid) {
$gid = self::byname($uid,$name);
}
if (! ($gid && $uid && $member)) {
return false;
}
$r = q("SELECT * FROM pgrp_member WHERE uid = %d AND gid = %d AND xchan = '%s' LIMIT 1",
intval($uid),
intval($gid),
dbesc($member)
);
if ($r) {
return true; // You might question this, but
// we indicate success because the group member was in fact created
// -- It was just created at another time
}
else {
$r = q("INSERT INTO pgrp_member (uid, gid, xchan)
VALUES( %d, %d, '%s' ) ",
intval($uid),
intval($gid),
dbesc($member)
);
}
Libsync::build_sync_packet($uid,null,true);
return $r;
}
static function members($uid, $gid) {
$ret = [];
if (intval($gid)) {
$r = q("SELECT * FROM pgrp_member
LEFT JOIN abook ON abook_xchan = pgrp_member.xchan left join xchan on xchan_hash = abook_xchan
WHERE gid = %d AND abook_channel = %d and pgrp_member.uid = %d and xchan_deleted = 0 and abook_self = 0 and abook_blocked = 0 and abook_pending = 0 ORDER BY xchan_name ASC ",
intval($gid),
intval($uid),
intval($uid)
);
if ($r) {
$ret = $r;
}
}
return $ret;
}
static function members_xchan($uid,$gid) {
$ret = [];
if (intval($gid)) {
$r = q("SELECT xchan FROM pgrp_member WHERE gid = %d AND uid = %d",
intval($gid),
intval($uid)
);
if ($r) {
foreach ($r as $rv) {
$ret[] = $rv['xchan'];
}
}
}
return $ret;
}
static function members_profile_xchan($uid,$gid) {
$ret = [];
if (intval($gid)) {
$r = q("SELECT abook_xchan as xchan from abook left join profile on abook_profile = profile_guid where profile.id = %d and profile.uid = %d",
intval($gid),
intval($uid)
);
if ($r) {
foreach($r as $rv) {
$ret[] = $rv['xchan'];
}
}
}
return $ret;
}
static function select($uid,$group = '') {
$grps = [];
$r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval($uid)
);
$grps[] = [ 'name' => '', 'hash' => '0', 'selected' => '' ];
if ($r) {
foreach ($r as $rr) {
$grps[] = [ 'name' => $rr['gname'], 'id' => $rr['hash'], 'selected' => (($group == $rr['hash']) ? 'true' : '') ];
}
}
return replace_macros(get_markup_template('group_selection.tpl'), [
'$label' => t('Add new connections to this access list'),
'$groups' => $grps
]);
}
static function widget($every="connections",$each="lists",$edit = false, $group_id = 0, $cid = '',$mode = 1) {
$o = '';
$groups = [];
$r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval($_SESSION['uid'])
);
$member_of = [];
if ($cid) {
$member_of = self::containing(local_channel(),$cid);
}
if ($r) {
foreach ($r as $rr) {
$selected = (($group_id == $rr['id']) ? ' group-selected' : '');
if ($edit) {
$groupedit = [ 'href' => "lists/".$rr['id'], 'title' => t('edit') ];
}
else {
$groupedit = null;
}
$groups[] = [
'id' => $rr['id'],
'enc_cid' => base64url_encode($cid),
'cid' => $cid,
'text' => $rr['gname'],
'selected' => $selected,
'href' => (($mode == 0) ? $each.'?f=&gid='.$rr['id'] : $each."/".$rr['id']) . ((x($_GET,'new')) ? '&new=' . $_GET['new'] : '') . ((x($_GET,'order')) ? '&order=' . $_GET['order'] : ''),
'edit' => $groupedit,
'ismember' => in_array($rr['id'],$member_of),
];
}
}
return replace_macros(get_markup_template('group_side.tpl'), [
'$title' => t('Lists'),
'$edittext' => t('Edit list'),
'$createtext' => t('Create new list'),
'$ungrouped' => (($every === 'contacts') ? t('Channels not in any access list') : ''),
'$groups' => $groups,
'$add' => t('add'),
]);
}
static function expand($g) {
if (! (is_array($g) && count($g))) {
return [];
}
$ret = [];
$x = [];
// private profile linked virtual groups
foreach ($g as $gv) {
if (substr($gv,0,3) === 'vp.') {
$profile_hash = substr($gv,3);
if ($profile_hash) {
$r = q("select abook_xchan from abook where abook_profile = '%s'",
dbesc($profile_hash)
);
if ($r) {
foreach ($r as $rv) {
$ret[] = $rv['abook_xchan'];
}
}
}
}
else {
$x[] = $gv;
}
}
if ($x) {
stringify_array_elms($x,true);
$groups = implode(',', $x);
if ($groups) {
$r = q("SELECT xchan FROM pgrp_member WHERE gid IN ( select id from pgrp where hash in ( $groups ))");
if ($r) {
foreach ($r as $rv) {
$ret[] = $rv['xchan'];
}
}
}
}
return $ret;
}
static function member_of($c) {
$r = q("SELECT pgrp.gname, pgrp.id FROM pgrp LEFT JOIN pgrp_member ON pgrp_member.gid = pgrp.id
WHERE pgrp_member.xchan = '%s' AND pgrp.deleted = 0 ORDER BY pgrp.gname ASC ",
dbesc($c)
);
return $r;
}
static function containing($uid,$c) {
$r = q("SELECT gid FROM pgrp_member WHERE uid = %d AND pgrp_member.xchan = '%s' ",
intval($uid),
dbesc($c)
);
$ret = [];
if ($r) {
foreach ($r as $rv)
$ret[] = $rv['gid'];
}
return $ret;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -101,7 +101,13 @@ class ActivityStreams {
$this->actor = $this->get_actor('attributedTo',$this->obj);
}
}
// fetch recursive or embedded activities
if ($this->obj && is_array($this->obj) && array_key_exists('object',$this->obj)) {
$this->obj['object'] = $this->get_compound_property($this->obj['object']);
}
if($this->obj && is_array($this->obj) && $this->obj['actor'])
$this->obj['actor'] = $this->get_actor('actor',$this->obj);
if($this->tgt && is_array($this->tgt) && $this->tgt['actor'])
@@ -140,15 +146,20 @@ class ActivityStreams {
*/
function collect_recips($base = '', $namespace = '') {
$x = [];
$fields = [ 'to', 'cc', 'bto', 'bcc', 'audience'];
foreach($fields as $f) {
$y = $this->get_compound_property($f, $base, $namespace);
if($y) {
$x = array_merge($x, $y);
if(! is_array($this->raw_recips))
if (! is_array($this->raw_recips)) {
$this->raw_recips = [];
}
$this->raw_recips[$f] = $x;
if (! is_array($y)) {
$y = [ $y ];
}
$this->raw_recips[$f] = $y;
$x = array_merge($x, $y);
}
}
// not yet ready for prime time
@@ -263,12 +274,19 @@ class ActivityStreams {
return self::fetch($url);
}
static function fetch($url,$channel = null) {
return Activity::fetch($url,$channel);
static function fetch($url, $channel = null) {
return Activity::fetch($url, $channel);
}
static function is_an_actor($s) {
return(in_array($s,[ 'Application','Group','Organization','Person','Service' ]));
return (in_array($s, [ 'Application','Group','Organization','Person','Service' ]));
}
static function is_response_activity($s) {
if (! $s) {
return false;
}
return (in_array($s, [ 'Like', 'Dislike', 'Flag', 'Block', 'Announce', 'Accept', 'Reject', 'TentativeAccept', 'TentativeReject', 'emojiReaction', 'EmojiReaction', 'EmojiReact' ]));
}
/**
@@ -391,7 +409,6 @@ class ActivityStreams {
return $x;
}
static function is_as_request() {
$x = getBestSupportedMimeType([
@@ -404,5 +421,4 @@ class ActivityStreams {
}
}
}

View File

@@ -2,6 +2,8 @@
namespace Zotlabs\Lib;
use Zotlabs\Lib\Libsync;
require_once('include/plugin.php');
require_once('include/channel.php');
@@ -70,11 +72,10 @@ class Apps {
'Channel Home',
'View Profile',
'Photos',
'Events',
'Calendar',
'Directory',
'Search',
'Help',
'Mail',
'Profile Photo'
]);
@@ -342,7 +343,7 @@ class Apps {
'Channel Home' => t('Channel Home'),
'View Profile' => t('View Profile'),
'Photos' => t('Photos'),
'Events' => t('Events'),
'Calendar' => t('Calendar'),
'Directory' => t('Directory'),
'Help' => t('Help'),
'Mail' => t('Mail'),
@@ -363,7 +364,6 @@ class Apps {
'Privacy Groups' => t('Privacy Groups'),
'Notifications' => t('Notifications'),
'Order Apps' => t('Order Apps'),
'CalDAV' => t('CalDAV'),
'CardDAV' => t('CardDAV'),
'Channel Sources' => t('Channel Sources'),
'Guest Access' => t('Guest Access'),
@@ -372,7 +372,6 @@ class Apps {
'OAuth2 Apps Manager' => t('OAuth2 Apps Manager'),
'PDL Editor' => t('PDL Editor'),
'Permission Categories' => t('Permission Categories'),
'Premium Channel' => t('Premium Channel'),
'Public Stream' => t('Public Stream'),
'My Chatrooms' => t('My Chatrooms'),
'Channel Export' => t('Channel Export')
@@ -565,7 +564,8 @@ class Apps {
'$featured' => ((strpos($papp['categories'], 'nav_featured_app') === false) ? false : true),
'$pinned' => ((strpos($papp['categories'], 'nav_pinned_app') === false) ? false : true),
'$navapps' => (($mode == 'nav') ? true : false),
'$order' => (($mode == 'nav-order') ? true : false),
'$order' => (($mode === 'nav-order' || $mode === 'nav-order-pinned') ? true : false),
'$mode' => $mode,
'$add' => t('Add to app-tray'),
'$remove' => t('Remove from app-tray'),
'$add_nav' => t('Pin to navbar'),
@@ -605,7 +605,7 @@ class Apps {
intval(TERM_OBJ_APP),
intval($r[0]['id'])
);
build_sync_packet($uid,array('app' => $r[0]));
Libsync::build_sync_packet($uid,array('app' => $r[0]));
}
}
}
@@ -671,7 +671,7 @@ class Apps {
);
}
if(! intval($x[0]['app_system'])) {
build_sync_packet($uid,array('app' => $x));
Libsync::build_sync_packet($uid,array('app' => $x));
}
}
else {
@@ -960,9 +960,6 @@ class Apps {
if($list) {
foreach($list as $li) {
$papp = self::app_encode($li);
if($menu !== 'nav_pinned_app' && strpos($papp['categories'],'nav_pinned_app') !== false)
continue;
$syslist[] = $papp;
}
}

View File

@@ -7,12 +7,23 @@ namespace Zotlabs\Lib;
*/
class Cache {
public static function get($key) {
/**
* @brief Returns cached content
*
* @param string $key
* @param string $age in SQL format, default is '30 DAY'
* @return string
*/
public static function get($key, $age = '') {
$hash = hash('whirlpool',$key);
$r = q("SELECT v FROM cache WHERE k = '%s' limit 1",
dbesc($hash)
$r = q("SELECT v FROM cache WHERE k = '%s' AND updated > %s - INTERVAL %s LIMIT 1",
dbesc($hash),
db_utcnow(),
db_quoteinterval(($age ? $age : get_config('system','object_cache_days', '30') . ' DAY'))
);
if ($r)
@@ -40,12 +51,4 @@ class Cache {
dbesc(datetime_convert()));
}
}
public static function clear() {
q("DELETE FROM cache WHERE updated < '%s'",
dbesc(datetime_convert('UTC','UTC',"now - 30 days")));
}
}

View File

@@ -1,6 +1,8 @@
<?php
namespace Zotlabs\Lib;
use Zotlabs\Lib\Libsync;
/**
* @brief A class with chatroom related static methods.
*/
@@ -91,7 +93,7 @@ class Chatroom {
return $ret;
}
build_sync_packet($channel['channel_id'],array('chatroom' => $r));
Libsync::build_sync_packet($channel['channel_id'],array('chatroom' => $r));
q("delete from chatroom where cr_id = %d",
intval($r[0]['cr_id'])

312
Zotlabs/Lib/Connect.php Normal file
View File

@@ -0,0 +1,312 @@
<?php /** @file */
namespace Zotlabs\Lib;
use App;
use Zotlabs\Access\Permissions;
use Zotlabs\Daemon\Master;
class Connect {
/**
* Takes a $channel and a $url/handle and adds a new connection
*
* Returns array
* $return['success'] boolean true if successful
* $return['abook'] Address book entry joined with xchan if successful
* $return['message'] error text if success is false.
*
* This function does NOT send sync packets to clones. The caller is responsible for doing this
*/
static function connect($channel, $url, $sub_channel = false) {
$uid = $channel['channel_id'];
if (strpos($url,'@') === false && strpos($url,'/') === false) {
$url = $url . '@' . App::get_hostname();
}
$result = [ 'success' => false, 'message' => '' ];
$my_perms = false;
$protocol = '';
if (substr($url,0,1) === '[') {
$x = strpos($url,']');
if ($x) {
$protocol = substr($url,1,$x-1);
$url = substr($url,$x+1);
}
}
if (! check_siteallowed($url)) {
$result['message'] = t('Channel is blocked on this site.');
return $result;
}
if (! $url) {
$result['message'] = t('Channel location missing.');
return $result;
}
// check service class limits
$r = q("select count(*) as total from abook where abook_channel = %d and abook_self = 0 ",
intval($uid)
);
if ($r) {
$total_channels = $r[0]['total'];
}
if (! service_class_allows($uid,'total_channels',$total_channels)) {
$result['message'] = upgrade_message();
return $result;
}
$xchan_hash = '';
$sql_options = (($protocol) ? " and xchan_network = '" . dbesc($protocol) . "' " : '');
$r = q("select * from xchan where ( xchan_hash = '%s' or xchan_url = '%s' or xchan_addr = '%s') $sql_options ",
dbesc($url),
dbesc($url),
dbesc($url)
);
if ($r) {
// reset results to the best record or the first if we don't have the best
// note: this is a single record and not an array of results
$r = Libzot::zot_record_preferred($r,'xchan_network');
}
$singleton = false;
$d = false;
if (! $r) {
// not in cache - try discovery
$wf = discover_by_webbie($url,$protocol);
if (! $wf) {
$feeds = get_config('system','feed_contacts');
if (($feeds) && (in_array($protocol, [ '', 'feed', 'rss' ]))) {
$d = discover_by_url($url);
}
else {
$result['message'] = t('Remote channel or protocol unavailable.');
return $result;
}
}
}
if ($wf || $d) {
// something was discovered - find the record which was just created.
$r = q("select * from xchan where ( xchan_hash = '%s' or xchan_url = '%s' or xchan_addr = '%s' ) $sql_options",
dbesc(($wf) ? $wf : $url),
dbesc($url),
dbesc($url)
);
// convert to a single record (once again preferring a zot solution in the case of multiples)
if ($r) {
$r = Libzot::zot_record_preferred($r,'xchan_network');
}
}
// if discovery was a success or the channel was already cached we should have an xchan record in $r
if ($r) {
$xchan = $r;
$xchan_hash = $r['xchan_hash'];
$their_perms = EMPTY_STR;
}
// failure case
if (! $xchan_hash) {
$result['message'] = t('Channel discovery failed.');
logger('follow: ' . $result['message']);
return $result;
}
if (! check_channelallowed($xchan_hash)) {
$result['message'] = t('Channel is blocked on this site.');
logger('follow: ' . $result['message']);
return $result;
}
$allowed = ((in_array($xchan['xchan_network'],['rss','zot','zot6'])) ? 1 : 0);
$hookdata = ['channel_id' => $uid, 'follow_address' => $url, 'xchan' => $xchan, 'allowed' => $allowed, 'singleton' => 0];
call_hooks('follow_allow',$hookdata);
if(! $hookdata['allowed']) {
$result['message'] = t('Protocol disabled.');
return $result;
}
$singleton = intval($hookdata['singleton']);
// Now start processing the new connection
$aid = $channel['channel_account_id'];
$default_group = $channel['channel_default_group'];
if (in_array($xchan_hash, [$channel['channel_hash'], $channel['channel_portable_id']])) {
$result['message'] = t('Cannot connect to yourself.');
return $result;
}
if ($xchan['xchan_network'] === 'rss') {
// check service class feed limits
$t = q("select count(*) as total from abook where abook_account = %d and abook_feed = 1 ",
intval($aid)
);
if ($t) {
$total_feeds = $t[0]['total'];
}
if (! service_class_allows($uid,'total_feeds',$total_feeds)) {
$result['message'] = upgrade_message();
return $result;
}
// Always set these "remote" permissions for feeds since we cannot interact with them
// to negotiate a suitable permission response
set_abconfig($uid,$xchan_hash,'their_perms','view_stream',1);
set_abconfig($uid,$xchan_hash,'their_perms','republish',1);
}
$p = Permissions::connect_perms($uid);
// parent channels have unencumbered write permission
if ($sub_channel) {
$p['perms']['post_wall'] = 1;
$p['perms']['post_comments'] = 1;
$p['perms']['write_storage'] = 1;
$p['perms']['post_like'] = 1;
$p['perms']['delegate'] = 0;
$p['perms']['moderated'] = 0;
}
$my_perms = $p['perms'];
$profile_assign = get_pconfig($uid,'system','profile_assign','');
// See if we are already connected by virtue of having an abook record
$r = q("select abook_id, abook_xchan, abook_pending, abook_instance from abook
where abook_xchan = '%s' and abook_channel = %d limit 1",
dbesc($xchan_hash),
intval($uid)
);
if ($r) {
$abook_instance = $r[0]['abook_instance'];
// If they are on a non-nomadic network, add them to this location
if (($singleton) && strpos($abook_instance,z_root()) === false) {
if ($abook_instance) {
$abook_instance .= ',';
}
$abook_instance .= z_root();
$x = q("update abook set abook_instance = '%s', abook_not_here = 0 where abook_id = %d",
dbesc($abook_instance),
intval($r[0]['abook_id'])
);
}
// if they have a pending connection, we just followed them so approve the connection request
if (intval($r[0]['abook_pending'])) {
$x = q("update abook set abook_pending = 0 where abook_id = %d",
intval($r[0]['abook_id'])
);
}
}
else {
// create a new abook record
$closeness = get_pconfig($uid,'system','new_abook_closeness',80);
$r = abook_store_lowlevel(
[
'abook_account' => intval($aid),
'abook_channel' => intval($uid),
'abook_closeness' => intval($closeness),
'abook_xchan' => $xchan_hash,
'abook_profile' => $profile_assign,
'abook_feed' => intval(($xchan['xchan_network'] === 'rss') ? 1 : 0),
'abook_created' => datetime_convert(),
'abook_updated' => datetime_convert(),
'abook_instance' => (($singleton) ? z_root() : '')
]
);
}
if (! $r) {
logger('abook creation failed');
$result['message'] = t('error saving data');
return $result;
}
// Set suitable permissions to the connection
if($my_perms) {
foreach($my_perms as $k => $v) {
set_abconfig($uid,$xchan_hash,'my_perms',$k,$v);
}
}
// fetch the entire record
$r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash
where abook_xchan = '%s' and abook_channel = %d limit 1",
dbesc($xchan_hash),
intval($uid)
);
if ($r) {
$result['abook'] = array_shift($r);
Master::Summon([ 'Notifier', 'permission_create', $result['abook']['abook_id'] ]);
}
$arr = [ 'channel_id' => $uid, 'channel' => $channel, 'abook' => $result['abook'] ];
call_hooks('follow', $arr);
/** If there is a default group for this channel, add this connection to it */
if ($default_group) {
$g = AccessList::rec_byhash($uid,$default_group);
if ($g) {
AccessList::member_add($uid,'',$xchan_hash,$g['id']);
}
}
$result['success'] = true;
return $result;
}
}

View File

@@ -58,10 +58,15 @@ class DB_Upgrade {
$c = new $cls();
$retval = $c->run();
if($retval != UPDATE_SUCCESS) {
$source = t('Source code of failed update: ') . "\n\n" . @file_get_contents('Zotlabs/Update/' . $s . '.php');
// Prevent sending hundreds of thousands of emails by creating
// a lockfile.
@@ -86,7 +91,9 @@ class DB_Upgrade {
'$sitename' => \App::$config['system']['sitename'],
'$siteurl' => z_root(),
'$update' => $x,
'$error' => sprintf( t('Update %s failed. See error logs.'), $x)
'$error' => sprintf( t('Update %s failed. See error logs.'), $x),
'$baseurl' => z_root(),
'$source' => $source
]
)
]

View File

@@ -143,19 +143,26 @@ class Enotify {
$action = t('commented on');
if(array_key_exists('item',$params) && in_array($params['item']['verb'], [ACTIVITY_LIKE, ACTIVITY_DISLIKE])) {
if(array_key_exists('item',$params)) {
if(in_array($params['item']['verb'], [ACTIVITY_LIKE, ACTIVITY_DISLIKE])) {
if(! $always_show_in_notices || !($vnotify & VNOTIFY_LIKE)) {
logger('notification: not a visible activity. Ignoring.');
pop_lang();
return;
}
if(activity_match($params['verb'], ACTIVITY_LIKE))
$action = t('liked');
if(activity_match($params['verb'], ACTIVITY_DISLIKE))
$action = t('disliked');
if(! $always_show_in_notices || !($vnotify & VNOTIFY_LIKE)) {
logger('notification: not a visible activity. Ignoring.');
pop_lang();
return;
}
if(activity_match($params['verb'], ACTIVITY_LIKE))
$action = t('liked');
if(activity_match($params['verb'], ACTIVITY_DISLIKE))
$action = t('disliked');
if($params['item']['obj_type'] === 'Answer')
$action = t('voted on');
}
@@ -550,6 +557,11 @@ class Enotify {
if ((\App::$language === 'en' || (! \App::$language)) && strpos($msg,', '))
$msg = substr($msg,strpos($msg,', ')+1);
$datarray['id'] = $notify_id;
$datarray['msg'] = $msg;
call_hooks('enotify_store_end', $datarray);
$r = q("update notify set msg = '%s' where id = %d and uid = %d",
dbesc($msg),
intval($notify_id),
@@ -805,8 +817,17 @@ class Enotify {
}
else {
$itemem_text = (($item['item_thread_top'])
? t('created a new post')
: sprintf( t('commented on %s\'s post'), $item['owner']['xchan_name']));
? (($item['obj_type'] === 'Question') ? t('created a new poll') : t('created a new post'))
: (($item['obj_type'] === 'Answer') ? sprintf( t('voted on %s\'s poll'), '[bdi]' . $item['owner']['xchan_name'] . '[/bdi]') : sprintf( t('commented on %s\'s post'), '[bdi]' . $item['owner']['xchan_name'] . '[/bdi]'))
);
if($item['verb'] === ACTIVITY_SHARE) {
$itemem_text = sprintf( t('repeated %s\'s post'), '[bdi]' . $item['author']['xchan_name'] . '[/bdi]');
}
if(in_array($item['obj_type'], ['Document', 'Video', 'Audio', 'Image'])) {
$itemem_text = t('shared a file with you');
}
}
$edit = false;
@@ -825,21 +846,24 @@ class Enotify {
// convert this logic into a json array just like the system notifications
$who = (($item['verb'] === ACTIVITY_SHARE) ? 'owner' : 'author');
$x = array(
'notify_link' => $item['llink'],
'name' => $item['author']['xchan_name'],
'addr' => (($item['author']['xchan_addr']) ? $item['author']['xchan_addr'] : $item['author']['xchan_url']),
'url' => $item['author']['xchan_url'],
'photo' => $item['author']['xchan_photo_s'],
'when' => relative_date(($edit)? $item['edited'] : $item['created']),
'name' => $item[$who]['xchan_name'],
'addr' => (($item[$who]['xchan_addr']) ? $item[$who]['xchan_addr'] : $item[$who]['xchan_url']),
'url' => $item[$who]['xchan_url'],
'photo' => $item[$who]['xchan_photo_s'],
'when' => (($edit) ? datetime_convert('UTC', date_default_timezone_get(), $item['edited']) : datetime_convert('UTC', date_default_timezone_get(), $item['created'])),
'class' => (intval($item['item_unseen']) ? 'notify-unseen' : 'notify-seen'),
'b64mid' => ((in_array($item['verb'], [ACTIVITY_LIKE, ACTIVITY_DISLIKE])) ? 'b64.' . base64url_encode($item['thr_parent']) : 'b64.' . base64url_encode($item['mid'])),
'notify_id' => 'undefined',
'b64mid' => (($item['mid']) ? 'b64.' . base64url_encode($item['mid']) : ''),
//'b64mid' => ((in_array($item['verb'], [ACTIVITY_LIKE, ACTIVITY_DISLIKE])) ? 'b64.' . base64url_encode($item['thr_parent']) : 'b64.' . base64url_encode($item['mid'])),
'thread_top' => (($item['item_thread_top']) ? true : false),
'message' => strip_tags(bbcode($itemem_text)),
'message' => bbcode(escape_tags($itemem_text)),
'body' => htmlentities(html2plain(bbcode($item['body']), 75, true), ENT_COMPAT, 'UTF-8', false),
// these are for the superblock addon
'hash' => $item['author']['xchan_hash'],
'uid' => local_channel(),
'hash' => $item[$who]['xchan_hash'],
'uid' => $item['uid'],
'display' => true
);
@@ -851,4 +875,118 @@ class Enotify {
return $x;
}
static public function format_notify($tt) {
$message = trim(strip_tags(bbcode($tt['msg'])));
if(strpos($message, $tt['xname']) === 0)
$message = substr($message, strlen($tt['xname']) + 1);
$mid = basename($tt['link']);
$b64mid = ((strpos($mid, 'b64.') === 0) ? $mid : 'b64.' . base64url_encode($mid));
$x = [
'notify_link' => z_root() . '/notify/view/' . $tt['id'],
'name' => $tt['xname'],
'url' => $tt['url'],
'photo' => $tt['photo'],
'when' => datetime_convert('UTC', date_default_timezone_get(), $tt['created']),
'hclass' => (($tt['seen']) ? 'notify-seen' : 'notify-unseen'),
'b64mid' => (($tt['otype'] == 'item') ? $b64mid : ''),
'notify_id' => (($tt['otype'] == 'item') ? $tt['id'] : ''),
'message' => $message
];
return $x;
}
static public function format_intros($rr) {
$x = [
'notify_link' => z_root() . '/connections/ifpending',
'name' => $rr['xchan_name'],
'addr' => $rr['xchan_addr'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
'when' => datetime_convert('UTC', date_default_timezone_get(), $rr['abook_created']),
'hclass' => ('notify-unseen'),
'message' => t('added your channel')
];
return $x;
}
static public function format_files($rr) {
$x = [
'notify_link' => z_root() . '/sharedwithme',
'name' => $rr['author']['xchan_name'],
'addr' => $rr['author']['xchan_addr'],
'url' => $rr['author']['xchan_url'],
'photo' => $rr['author']['xchan_photo_s'],
'when' => datetime_convert('UTC', date_default_timezone_get(), $rr['created']),
'hclass' => ('notify-unseen'),
'message' => t('shared a file with you')
];
return $x;
}
static public function format_mail($rr) {
$x = [
'notify_link' => z_root() . '/mail/' . $rr['id'],
'name' => $rr['xchan_name'],
'addr' => $rr['xchan_addr'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
'when' => datetime_convert('UTC', date_default_timezone_get(), $rr['created']),
'hclass' => (intval($rr['mail_seen']) ? 'notify-seen' : 'notify-unseen'),
'message' => t('sent you a private message'),
];
return $x;
}
static public function format_all_events($rr) {
$bd_format = t('g A l F d') ; // 8 AM Friday January 18
$strt = datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['dtstart']);
$today = ((substr($strt, 0, 10) === datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y-m-d')) ? true : false);
$when = day_translate(datetime_convert('UTC', (($rr['adjust']) ? date_default_timezone_get() : 'UTC'), $rr['dtstart'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
$x = [
'notify_link' => z_root() . '/cdav/calendar/' . $rr['event_hash'],
'name' => $rr['xchan_name'],
'addr' => $rr['xchan_addr'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
'when' => $when,
'hclass' => (($today) ? 'notify-unseen bg-warning' : 'notify-unseen'),
'message' => t('created an event')
];
return $x;
}
static public function format_register($rr) {
$x = [
'notify_link' => z_root() . '/admin/accounts',
'name' => $rr['account_email'],
//'addr' => $rr['account_email'],
'photo' => z_root() . '/' . get_default_profile_photo(48),
'when' => datetime_convert('UTC', date_default_timezone_get(),$rr['account_created']),
'hclass' => ('notify-unseen'),
'message' => t('requires approval')
];
return $x;
}
}

View File

@@ -2,7 +2,7 @@
namespace Zotlabs\Lib;
use Zotlabs\Zot6\HTTPSig;
use Zotlabs\Web\HTTPSig;
class JSalmon {
@@ -69,4 +69,4 @@ class JSalmon {
}
}
}

View File

@@ -29,8 +29,8 @@ class LDSignatures {
$options = [
'type' => 'RsaSignature2017',
'nonce' => random_string(64),
'creator' => z_root() . '/channel/' . $channel['channel_address'] . '/public_key_pem',
'created' => datetime_convert('UTC','UTC', 'now', 'Y-m-d\Th:i:s\Z')
'creator' => z_root() . '/channel/' . $channel['channel_address'],
'created' => datetime_convert('UTC','UTC', 'now', 'Y-m-d\TH:i:s\Z')
];
$ohash = self::hash(self::signable_options($options));
@@ -124,7 +124,7 @@ class LDSignatures {
'meDataType' => $data_type,
'meEncoding' => $encoding,
'meAlgorithm' => $algorithm,
'meCreator' => z_root() . '/channel/' . $channel['channel_address'] . '/public_key_pem',
'meCreator' => z_root() . '/channel/' . $channel['channel_address'],
'meSignatureValue' => $signature
]);
@@ -132,4 +132,4 @@ class LDSignatures {
}
}

View File

@@ -83,7 +83,7 @@ class Libsync {
$info = (($packet) ? $packet : array());
$info['type'] = 'sync';
$info['encoding'] = 'red'; // note: not zot, this packet is very platform specific
$info['encoding'] = 'hz'; // note: not zot, this packet is very platform specific
$info['relocate'] = ['channel_address' => $channel['channel_address'], 'url' => z_root() ];
if(array_key_exists($uid,\App::$config) && array_key_exists('transient',\App::$config[$uid])) {
@@ -144,12 +144,13 @@ class Libsync {
foreach($synchubs as $hub) {
$hash = random_string();
$n = Libzot::build_packet($channel,'sync',$env_recips,json_encode($info),'red',$hub['hubloc_sitekey'],$hub['site_crypto']);
$n = Libzot::build_packet($channel,'sync',$env_recips,json_encode($info),'hz',$hub['hubloc_sitekey'],$hub['site_crypto']);
Queue::insert(array(
'hash' => $hash,
'account_id' => $channel['channel_account_id'],
'channel_id' => $channel['channel_id'],
'posturl' => $hub['hubloc_callback'],
'driver' => $hub['hubloc_network'],
'notify' => $n,
'msg' => EMPTY_STR
));
@@ -244,7 +245,13 @@ class Libsync {
if(array_key_exists('app',$arr) && $arr['app'])
sync_apps($channel,$arr['app']);
if(array_key_exists('addressbook',$arr) && $arr['addressbook'])
sync_addressbook($channel,$arr['addressbook']);
if(array_key_exists('calendar',$arr) && $arr['calendar'])
sync_calendar($channel,$arr['calendar']);
if(array_key_exists('chatroom',$arr) && $arr['chatroom'])
sync_chatrooms($channel,$arr['chatroom']);
@@ -812,9 +819,9 @@ class Libsync {
}
if(intval($r[0]['hubloc_primary']) && (! $location['primary'])) {
$m = q("update hubloc set hubloc_primary = 0, hubloc_updated = '%s' where hubloc_id = %d",
$m = q("update hubloc set hubloc_primary = 0, hubloc_updated = '%s' where hubloc_id_url = '%s'",
dbesc(datetime_convert()),
intval($r[0]['hubloc_id'])
dbesc($r[0]['hubloc_id_url'])
);
$r[0]['hubloc_primary'] = intval($location['primary']);
hubloc_change_primary($r[0]);
@@ -841,18 +848,18 @@ class Libsync {
}
}
if(intval($r[0]['hubloc_deleted']) && (! intval($location['deleted']))) {
$n = q("update hubloc set hubloc_deleted = 0, hubloc_updated = '%s' where hubloc_id = %d",
$n = q("update hubloc set hubloc_deleted = 0, hubloc_updated = '%s' where hubloc_id_url = '%s'",
dbesc(datetime_convert()),
intval($r[0]['hubloc_id'])
dbesc($r[0]['hubloc_id_url'])
);
$what .= 'undelete_hub ';
$changed = true;
}
elseif((! intval($r[0]['hubloc_deleted'])) && (intval($location['deleted']))) {
logger('deleting hubloc: ' . $r[0]['hubloc_addr']);
$n = q("update hubloc set hubloc_deleted = 1, hubloc_updated = '%s' where hubloc_id = %d",
$n = q("update hubloc set hubloc_deleted = 1, hubloc_updated = '%s' where hubloc_id_url = '%s'",
dbesc(datetime_convert()),
intval($r[0]['hubloc_id'])
dbesc($r[0]['hubloc_id_url'])
);
$what .= 'delete_hub ';
$changed = true;
@@ -911,9 +918,9 @@ class Libsync {
foreach($xisting as $x) {
if(! array_key_exists('updated',$x)) {
logger('Deleting unreferenced hub location ' . $x['hubloc_addr']);
$r = q("update hubloc set hubloc_deleted = 1, hubloc_updated = '%s' where hubloc_id = %d",
$r = q("update hubloc set hubloc_deleted = 1, hubloc_updated = '%s' where hubloc_id_url = '%s'",
dbesc(datetime_convert()),
intval($x['hubloc_id'])
dbesc($x['hubloc_id_url'])
);
$what .= 'removed_hub ';
$changed = true;
@@ -1016,4 +1023,4 @@ class Libsync {
}
}
}

View File

@@ -2,7 +2,7 @@
namespace Zotlabs\Lib;
use Zotlabs\Zot6\HTTPSig;
use Zotlabs\Web\HTTPSig;
use Zotlabs\Access\Permissions;
use Zotlabs\Access\PermissionLimits;
use Zotlabs\Daemon\Master;
@@ -105,7 +105,7 @@ class Libzot {
$data = [
'type' => $type,
'encoding' => $encoding,
'sender' => $channel['channel_portable_id'],
'sender' => $channel['channel_hash'],
'site_id' => self::make_xchan_hash(z_root(), get_config('system','pubkey')),
'version' => System::get_zot_revision(),
];
@@ -316,16 +316,20 @@ class Libzot {
$x = self::import_xchan($record['data'], (($force) ? UPDATE_FLAGS_FORCED : UPDATE_FLAGS_UPDATED));
if(! $x['success'])
return false;
if($channel && $record['data']['permissions']) {
$permissions = explode(',',$record['data']['permissions']);
if($permissions && is_array($permissions)) {
$old_read_stream_perm = get_abconfig($channel['channel_id'],$x['hash'],'their_perms','view_stream');
foreach($permissions as $p) {
set_abconfig($channel['channel_id'],$x['hash'],'their_perms',$p,'1');
$permissions = Permissions::FilledPerms($permissions);
foreach($permissions as $k => $v) {
set_abconfig($channel['channel_id'],$x['hash'],'their_perms',$k,$v);
}
}
@@ -422,7 +426,7 @@ class Libzot {
[
'type' => NOTIFY_INTRO,
'from_xchan' => $x['hash'],
'to_xchan' => $channel['channel_portable_id'],
'to_xchan' => $channel['channel_hash'],
'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id']
]
);
@@ -788,7 +792,7 @@ class Libzot {
// see if this is a channel clone that's hosted locally - which we treat different from other xchans/connections
$local = q("select channel_account_id, channel_id from channel where channel_portable_id = '%s' limit 1",
$local = q("select channel_account_id, channel_id from channel where channel_hash = '%s' limit 1",
dbesc($xchan_hash)
);
if($local) {
@@ -1133,6 +1137,7 @@ class Libzot {
}
logger($AS->debug(),LOGGER_DATA);
}
@@ -1151,7 +1156,7 @@ class Libzot {
if($recip_arr) {
stringify_array_elms($recip_arr,true);
$recips = implode(',',$recip_arr);
$r = q("select channel_portable_id as hash from channel where channel_portable_id in ( " . $recips . " ) and channel_removed = 0 ");
$r = q("select channel_hash as hash from channel where channel_hash in ( " . $recips . " ) and channel_removed = 0 ");
}
if(! $r) {
@@ -1193,10 +1198,6 @@ class Libzot {
if(in_array($env['type'],['activity','response'])) {
$arr = Activity::decode_note($AS);
//logger($AS->debug());
$r = q("select hubloc_hash, hubloc_network from hubloc where hubloc_id_url = '%s' ",
dbesc($AS->actor['id'])
);
@@ -1207,6 +1208,10 @@ class Libzot {
$arr['author_xchan'] = $r['hubloc_hash'];
}
if (! $arr['author_xchan']) {
logger('No author!');
return;
}
$s = q("select hubloc_hash from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1",
dbesc($env['sender'])
@@ -1220,12 +1225,42 @@ class Libzot {
$arr['owner_xchan'] = $env['sender'];
}
if($private) {
$arr['item_private'] = true;
if ($private && (! intval($arr['item_private']))) {
$arr['item_private'] = 1;
}
if ($arr['mid'] === $arr['parent_mid']) {
if (is_array($AS->obj) && array_key_exists('commentPolicy',$AS->obj)) {
$p = strstr($AS->obj['commentPolicy'],'until=');
if($p !== false) {
$arr['comments_closed'] = datetime_convert('UTC','UTC', substr($p,6));
$arr['comment_policy'] = trim(str_replace($p,'',$AS->obj['commentPolicy']));
}
else {
$arr['comment_policy'] = $AS->obj['commentPolicy'];
}
}
}
/// @FIXME - spoofable
if($AS->data['hubloc']) {
$arr['item_verified'] = true;
if (! array_key_exists('comment_policy',$arr)) {
// set comment policy depending on source hub. Unknown or osada is ActivityPub.
// Anything else we'll say is zot - which could have a range of project names
$s = q("select site_project from site where site_url = '%s' limit 1",
dbesc($r[0]['hubloc_url'])
);
if ((! $s) || (in_array($s[0]['site_project'],[ '', 'osada' ]))) {
$arr['comment_policy'] = 'authenticated';
}
else {
$arr['comment_policy'] = 'contacts';
}
}
}
if($AS->data['signed_data']) {
IConfig::Set($arr,'activitystreams','signed_data',$AS->data['signed_data'],false);
@@ -1247,7 +1282,12 @@ class Libzot {
logger('Channel sync received: ' . print_r($arr,true), LOGGER_DATA, LOG_DEBUG);
logger('Channel sync recipients: ' . print_r($deliveries,true), LOGGER_DATA, LOG_DEBUG);
$result = Libsync::process_channel_sync_delivery($env['sender'],$arr,$deliveries);
if ($env['encoding'] === 'hz') {
$result = Libsync::process_channel_sync_delivery($env['sender'],$arr,$deliveries);
}
else {
logger('sync packet type not supported.');
}
}
}
if ($result) {
@@ -1333,12 +1373,12 @@ class Libzot {
$r = [];
$c = q("select channel_id, channel_portable_id from channel where channel_removed = 0");
$c = q("select channel_id, channel_hash from channel where channel_removed = 0");
if($c) {
foreach($c as $cc) {
if(perm_is_allowed($cc['channel_id'],$msg['sender'],$perm)) {
$r[] = $cc['channel_portable_id'];
$r[] = $cc['channel_hash'];
}
}
}
@@ -1346,7 +1386,7 @@ class Libzot {
if($include_sys) {
$sys = get_sys_channel();
if($sys)
$r[] = $sys['channel_portable_id'];
$r[] = $sys['channel_hash'];
}
@@ -1362,7 +1402,7 @@ class Libzot {
if($tag['type'] === 'Mention' && (strpos($tag['href'],z_root()) !== false)) {
$address = basename($tag['href']);
if($address) {
$z = q("select channel_portable_id as hash from channel where channel_address = '%s'
$z = q("select channel_hash as hash from channel where channel_address = '%s'
and channel_removed = 0 limit 1",
dbesc($address)
);
@@ -1383,7 +1423,7 @@ class Libzot {
$thread_parent = self::find_parent($msg,$act);
if($thread_parent) {
$z = q("select channel_portable_id as hash from channel left join item on channel.channel_id = item.uid where ( item.thr_parent = '%s' OR item.parent_mid = '%s' ) ",
$z = q("select channel_hash as hash from channel left join item on channel.channel_id = item.uid where ( item.thr_parent = '%s' OR item.parent_mid = '%s' ) ",
dbesc($thread_parent),
dbesc($thread_parent)
);
@@ -1438,7 +1478,7 @@ class Libzot {
$DR = new DReport(z_root(),$sender,$d,$arr['mid']);
$channel = channelx_by_portid($d);
$channel = channelx_by_hash($d);
if (! $channel) {
$DR->update('recipient not found');
@@ -1453,13 +1493,14 @@ class Libzot {
// Try again using the delivery channel credentials.
// We will also need to re-parse the $item array,
// but preserve any values that were set during anonymous parsing.
$o = Activity::fetch($act->obj,$channel);
if($o) {
$act->obj = $o;
$arr = array_merge(Activity::decode_note($act),$arr);
}
else {
$DR->update('Incomplete or corrupt activity');
$result[] = $DR->get();
continue;
@@ -1475,7 +1516,7 @@ class Libzot {
* access checks.
*/
if($sender === $channel['channel_portable_id'] && $arr['author_xchan'] === $channel['channel_portable_id'] && $arr['mid'] === $arr['parent_mid']) {
if($sender === $channel['channel_hash'] && $arr['author_xchan'] === $channel['channel_hash'] && $arr['mid'] === $arr['parent_mid']) {
$DR->update('self delivery ignored');
$result[] = $DR->get();
continue;
@@ -1578,10 +1619,11 @@ class Libzot {
// As a side effect we will also do a preliminary check that we have the top-level-post, otherwise
// processing it is pointless.
$r = q("select route, id, owner_xchan, item_private from item where mid = '%s' and uid = %d limit 1",
$r = q("select route, id, parent_mid, mid, owner_xchan, item_private, obj_type from item where mid = '%s' and uid = %d limit 1",
dbesc($arr['parent_mid']),
intval($channel['channel_id'])
);
if(! $r) {
$DR->update('comment parent not found');
$result[] = $DR->get();
@@ -1604,6 +1646,16 @@ class Libzot {
continue;
}
if ($r[0]['obj_type'] === 'Question') {
// route checking doesn't work correctly here because we've changed the privacy
$r[0]['route'] = EMPTY_STR;
// If this is a poll response, convert the obj_type to our (internal-only) "Answer" type
if ($arr['obj_type'] === ACTIVITY_OBJ_COMMENT && $arr['title'] && (! $arr['body'])) {
$arr['obj_type'] = 'Answer';
}
}
if($relay || $friendofriend || (intval($r[0]['item_private']) === 0 && intval($arr['item_private']) === 0)) {
// reset the route in case it travelled a great distance upstream
// use our parent's route so when we go back downstream we'll match
@@ -1671,7 +1723,7 @@ class Libzot {
$arr['aid'] = $channel['channel_account_id'];
$arr['uid'] = $channel['channel_id'];
$item_id = self::delete_imported_item($sender,$arr,$channel['channel_id'],$relay);
$item_id = self::delete_imported_item($sender,$act,$arr,$channel['channel_id'],$relay);
$DR->update(($item_id) ? 'deleted' : 'delete_failed');
$result[] = $DR->get();
@@ -1685,11 +1737,15 @@ class Libzot {
continue;
}
// reactions such as like and dislike could have an mid with /activity/ in it.
// Check for both forms in order to prevent duplicates.
$r = q("select * from item where mid = '%s' and uid = %d limit 1",
$r = q("select * from item where mid in ('%s','%s') and uid = %d limit 1",
dbesc($arr['mid']),
dbesc(str_replace(z_root() . '/activity/', z_root() . '/item/', $arr['mid'])),
intval($channel['channel_id'])
);
if($r) {
// We already have this post.
$item_id = $r[0]['id'];
@@ -1734,7 +1790,7 @@ class Libzot {
// if it's a sourced post, call the post_local hooks as if it were
// posted locally so that crosspost connectors will be triggered.
if(check_item_source($arr['uid'], $arr)) {
if(check_item_source($arr['uid'], $arr) || ($channel['xchan_pubforum'] == 1)) {
/**
* @hooks post_local
* Called when an item has been posted on this machine via mod/item.php (also via API).
@@ -1781,7 +1837,7 @@ class Libzot {
$stored = (($item_result && $item_result['item']) ? $item_result['item'] : false);
if((is_array($stored)) && ($stored['id'] != $stored['parent'])
&& ($stored['author_xchan'] === $channel['channel_hash'] || $stored['author_xchan'] === $channel['channel_portable_id'])) {
&& ($stored['author_xchan'] === $channel['channel_hash'] || $stored['author_xchan'] === $channel['channel_hash'])) {
retain_item($stored['item']['parent']);
}
@@ -1819,6 +1875,10 @@ class Libzot {
$ret = [];
$signer = q("select hubloc_hash, hubloc_url from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1",
dbesc($a['signature']['signer'])
);
foreach($a['data']['orderedItems'] as $activity) {
$AS = new ActivityStreams($activity);
@@ -1877,14 +1937,31 @@ class Libzot {
if($AS->data['hubloc']) {
$arr['item_verified'] = true;
}
// set comment policy depending on source hub. Unknown or osada is ActivityPub.
// Anything else we'll say is zot - which could have a range of project names
if ($signer) {
$s = q("select site_project from site where site_url = '%s' limit 1",
dbesc($signer[0]['hubloc_url'])
);
if ((! $s) || (in_array($s[0]['site_project'],[ '', 'osada' ]))) {
$arr['comment_policy'] = 'authenticated';
}
else {
$arr['comment_policy'] = 'contacts';
}
}
if($AS->data['signed_data']) {
IConfig::Set($arr,'activitystreams','signed_data',$AS->data['signed_data'],false);
}
logger('FOF Activity received: ' . print_r($arr,true), LOGGER_DATA, LOG_DEBUG);
logger('FOF Activity recipient: ' . $channel['channel_portable_id'], LOGGER_DATA, LOG_DEBUG);
logger('FOF Activity recipient: ' . $channel['channel_hash'], LOGGER_DATA, LOG_DEBUG);
$result = self::process_delivery($arr['owner_xchan'],$AS, $arr, [ $channel['channel_portable_id'] ],false,false,true);
$result = self::process_delivery($arr['owner_xchan'],$AS, $arr, [ $channel['channel_hash'] ],false,false,true);
if ($result) {
$ret = array_merge($ret, $result);
}
@@ -2029,7 +2106,7 @@ class Libzot {
* @return boolean|int post_id
*/
static function delete_imported_item($sender, $item, $uid, $relay) {
static function delete_imported_item($sender, $act, $item, $uid, $relay) {
logger('invoked', LOGGER_DEBUG);
@@ -2037,36 +2114,39 @@ class Libzot {
$item_found = false;
$post_id = 0;
$r = q("select id, author_xchan, owner_xchan, source_xchan, item_deleted from item where ( author_xchan = '%s' or owner_xchan = '%s' or source_xchan = '%s' )
and mid = '%s' and uid = %d limit 1",
if ($item['verb'] === 'Tombstone') {
// The id of the deleted thing is the item mid (activity id)
$mid = $item['mid'];
}
else {
// The id is the object id if the type is Undo or Delete
$mid = ((is_array($act->obj)) ? $act->obj['id'] : $act->obj);
}
// we may have stored either the object id or the activity id if it was a response activity (like, dislike, etc.)
$r = q("select * from item where ( author_xchan = '%s' or owner_xchan = '%s' or source_xchan = '%s' )
and mid IN ('%s', '%s') and uid = %d limit 1",
dbesc($sender),
dbesc($sender),
dbesc($sender),
dbesc($item['mid']),
dbesc($mid),
dbesc(str_replace('/activity/','/item/',$mid)),
intval($uid)
);
if($r) {
if($r[0]['author_xchan'] === $sender || $r[0]['owner_xchan'] === $sender || $r[0]['source_xchan'] === $sender)
$ownership_valid = true;
$stored = $r[0];
$post_id = $r[0]['id'];
// we proved ownership in the sql query
$ownership_valid = true;
$post_id = $stored['id'];
$item_found = true;
}
else {
// perhaps the item is still in transit and the delete notification got here before the actual item did. Store it with the deleted flag set.
// item_store() won't try to deliver any notifications or start delivery chains if this flag is set.
// This means we won't end up with potentially even more delivery threads trying to push this delete notification.
// But this will ensure that if the (undeleted) original post comes in at a later date, we'll reject it because it will have an older timestamp.
logger('delete received for non-existent item - storing item data.');
if($item['author_xchan'] === $sender || $item['owner_xchan'] === $sender || $item['source_xchan'] === $sender) {
$ownership_valid = true;
$item_result = item_store($item);
$post_id = $item_result['item_id'];
}
// this will fail with an ownership issue, so explain the real reason
logger('delete received for non-existent item or not owned by sender - ignoring.');
}
if($ownership_valid === false) {
@@ -2074,8 +2154,27 @@ class Libzot {
return false;
}
if ($stored['resource_type'] === 'event') {
$i = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($stored['resource_id']),
intval($uid)
);
if ($i) {
if ($i[0]['event_xchan'] === $sender) {
q("delete from event where event_hash = '%s' and uid = %d",
dbesc($stored['resource_id']),
intval($uid)
);
}
else {
logger('delete linked event: not owner');
return;
}
}
}
if($item_found) {
if(intval($r[0]['item_deleted'])) {
if(intval($stored['item_deleted'])) {
logger('delete_imported_item: item was already deleted');
if(! $relay)
return false;
@@ -2087,10 +2186,10 @@ class Libzot {
// back, and we aren't going to (or shouldn't at any rate) delete it again in the future - so losing
// this information from the metadata should have no other discernible impact.
if (($r[0]['id'] != $r[0]['parent']) && intval($r[0]['item_origin'])) {
if (($stored['id'] != $stored['parent']) && intval($stored['item_origin'])) {
q("update item set item_origin = 0 where id = %d and uid = %d",
intval($r[0]['id']),
intval($r[0]['uid'])
intval($stored['id']),
intval($stored['uid'])
);
}
}
@@ -2119,7 +2218,7 @@ class Libzot {
$DR = new DReport(z_root(),$sender,$d,$arr['mid']);
$r = q("select * from channel where channel_portable_id = '%s' limit 1",
$r = q("select * from channel where channel_hash = '%s' limit 1",
dbesc($d['hash'])
);
@@ -2274,7 +2373,7 @@ class Libzot {
$loc = $locations[0];
$r = q("select * from channel where channel_portable_id = '%s' limit 1",
$r = q("select * from channel where channel_hash = '%s' limit 1",
dbesc($sender_hash)
);
@@ -2282,7 +2381,7 @@ class Libzot {
return;
if($loc['url'] !== z_root()) {
$x = q("update channel set channel_moved = '%s' where channel_portable_id = '%s' limit 1",
$x = q("update channel set channel_moved = '%s' where channel_hash = '%s' limit 1",
dbesc($loc['url']),
dbesc($sender_hash)
);
@@ -2316,7 +2415,7 @@ class Libzot {
static function encode_locations($channel) {
$ret = [];
$x = self::get_hublocs($channel['channel_portable_id']);
$x = self::get_hublocs($channel['channel_hash']);
if($x && count($x)) {
foreach($x as $hub) {
@@ -2664,13 +2763,13 @@ class Libzot {
$r = null;
if(strlen($zhash)) {
$r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
where channel_portable_id = '%s' limit 1",
$r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
where channel_hash = '%s' limit 1",
dbesc($zhash)
);
}
elseif(strlen($zguid) && strlen($zguid_sig)) {
$r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
$r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
where channel_guid = '%s' and channel_guid_sig = '%s' limit 1",
dbesc($zguid),
dbesc($zguid_sig)
@@ -2678,7 +2777,7 @@ class Libzot {
}
elseif(strlen($zaddr)) {
if(strpos($zaddr,'[system]') === false) { /* normal address lookup */
$r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
$r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
where ( channel_address = '%s' or xchan_addr = '%s' ) limit 1",
dbesc($zaddr),
dbesc($zaddr)
@@ -2698,10 +2797,10 @@ class Libzot {
*
*/
$r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
$r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
where channel_system = 1 order by channel_id limit 1");
if(! $r) {
$r = q("select channel.*, xchan.* from channel left join xchan on channel_portable_id = xchan_hash
$r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
where channel_removed = 0 order by channel_id limit 1");
}
}
@@ -2766,7 +2865,7 @@ class Libzot {
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],$e['channel_timezone'])) !== ''))
if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],'UTC')) !== ''))
$profile['next_birthday'] = $bd;
if($age = age($p[0]['dob'],$e['channel_timezone'],''))
@@ -2820,7 +2919,7 @@ class Libzot {
];
$ret['channel_role'] = get_pconfig($e['channel_id'],'system','permissions_role','custom');
$ret['protocols'] = [ 'zot', 'zot6' ];
$ret['protocols'] = [ 'zot6', 'zot' ];
$ret['searchable'] = $searchable;
$ret['adult_content'] = $adult_channel;
$ret['public_forum'] = $public_forum;

View File

@@ -3,6 +3,8 @@
namespace Zotlabs\Lib;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Zotfinger;
use Zotlabs\Lib\Webfinger;
require_once('include/permissions.php');
@@ -307,9 +309,9 @@ class Libzotdir {
if ($ud['ud_addr'] && (! ($ud['ud_flags'] & UPDATE_FLAGS_DELETED))) {
$success = false;
$href = \Zotlabs\Lib\Webfinger::zot_url(punify($ud['ud_addr']));
$href = Webfinger::zot_url(punify($ud['ud_addr']));
if($href) {
$zf = \Zotlabs\Lib\Zotfinger::exec($href);
$zf = Zotfinger::exec($href);
}
if(is_array($zf) && array_path_exists('signature/signer',$zf) && $zf['signature']['signer'] === $href && intval($zf['signature']['header_valid'])) {
$xc = Libzot::import_xchan($zf['data'], 0, $ud);
@@ -339,7 +341,7 @@ class Libzotdir {
logger('local_dir_update: uid: ' . $uid, LOGGER_DEBUG);
$p = q("select channel.channel_hash, channel_address, channel_timezone, profile.* from profile left join channel on channel_id = uid where uid = %d and is_default = 1",
$p = q("select channel.channel_hash, channel_address, channel_timezone, channel_portable_id, profile.* from profile left join channel on channel_id = uid where uid = %d and is_default = 1",
intval($uid)
);
@@ -348,6 +350,7 @@ class Libzotdir {
if ($p) {
$hash = $p[0]['channel_hash'];
$legacy_hash = $p[0]['channel_portable_id'];
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
@@ -381,14 +384,15 @@ class Libzotdir {
logger('hidden: ' . $hidden);
$r = q("select xchan_hidden from xchan where xchan_hash = '%s' limit 1",
$r = q("select xchan_hidden from xchan where xchan_hash = '%s'",
dbesc($p[0]['channel_hash'])
);
if(intval($r[0]['xchan_hidden']) != $hidden) {
$r = q("update xchan set xchan_hidden = %d where xchan_hash = '%s'",
$r = q("update xchan set xchan_hidden = %d where xchan_hash in ('%s', '%s')",
intval($hidden),
dbesc($p[0]['channel_hash'])
dbesc($hash),
dbesc($legacy_hash)
);
}
@@ -402,11 +406,13 @@ class Libzotdir {
}
else {
// they may have made it private
$r = q("delete from xprof where xprof_hash = '%s'",
dbesc($hash)
q("delete from xprof where xprof_hash in ('%s', '%s')",
dbesc($hash),
dbesc($legacy_hash)
);
$r = q("delete from xtag where xtag_hash = '%s'",
dbesc($hash)
q("delete from xtag where xtag_hash in ('%s', '%s')",
dbesc($hash),
dbesc($legacy_hash)
);
}

View File

@@ -2,6 +2,8 @@
namespace Zotlabs\Lib;
use Zotlabs\Lib\Libsync;
define ( 'NWIKI_ITEM_RESOURCE_TYPE', 'nwiki' );
class NativeWiki {
@@ -71,7 +73,7 @@ class NativeWiki {
$arr['item_thread_top'] = 1;
$arr['item_private'] = intval($acl->is_private());
$arr['verb'] = ACTIVITY_CREATE;
$arr['obj_type'] = ACTIVITY_OBJ_WIKI;
$arr['obj_type'] = 'Document';
$arr['body'] = '[table][tr][td][h1]New Wiki[/h1][/td][/tr][tr][td][zrl=' . $wiki_url . ']' . $wiki['htmlName'] . '[/zrl][/td][/tr][/table]';
$arr['public_policy'] = map_scope(\Zotlabs\Access\PermissionLimits::Get($channel['channel_id'],'view_wiki'),true);
@@ -178,7 +180,7 @@ class NativeWiki {
foreach($sync_item as $w) {
$pkt[] = encode_item($w,true);
}
build_sync_packet($uid,array('wiki' => $pkt));
Libsync::build_sync_packet($uid,array('wiki' => $pkt));
}
}
}
@@ -191,7 +193,7 @@ class NativeWiki {
return array('item' => null, 'success' => false);
}
else {
$drop = drop_item($item['id'], false, DROPITEM_NORMAL, true);
$drop = drop_item($item['id'], false, DROPITEM_NORMAL);
}
info( t('Wiki files deleted successfully'));

View File

@@ -530,8 +530,11 @@ class NativeWikiPage {
foreach ($match[1] as $m) {
// TODO: Why do we need to double urlencode for this to work?
//$pageURLs[] = urlencode(urlencode(escape_tags($m)));
$pageURLs[] = Zlib\NativeWiki::name_encode(escape_tags($m));
$pages[] = $m;
$titleUri = explode('|',$m);
$page = $titleUri[0] ?? '';
$title = $titleUri[1] ?? $page;
$pageURLs[] = Zlib\NativeWiki::name_encode(escape_tags($page));
$pages[] = $title;
}
$idx = 0;
while(strpos($s,'[[') !== false) {

View File

@@ -116,7 +116,7 @@ class Queue {
dbesc($arr['hash']),
intval($arr['account_id']),
intval($arr['channel_id']),
dbesc(($arr['driver']) ? $arr['driver'] : 'zot'),
dbesc(($arr['driver']) ? $arr['driver'] : 'zot6'),
dbesc($arr['posturl']),
intval(1),
intval(($arr['priority']) ? $arr['priority'] : 0),
@@ -250,7 +250,7 @@ class Queue {
$host_crypto = null;
if($channel && $base) {
$h = q("select hubloc_sitekey, site_crypto from hubloc left join site on hubloc_url = site_url where site_url = '%s' order by hubloc_id desc limit 1",
$h = q("select hubloc_sitekey, site_crypto from hubloc left join site on hubloc_url = site_url where site_url = '%s' and hubloc_sitekey != '' order by hubloc_id desc limit 1",
dbesc($base)
);
if($h) {

View File

@@ -2,6 +2,7 @@
namespace Zotlabs\Lib;
use Zotlabs\Lib\Activity;
class Share {
@@ -54,7 +55,7 @@ class Share {
if(! $this->item)
return $obj;
$obj['asld'] = $this->item['mid'];
$obj['asld'] = Activity::fetch_item( [ 'id' => $this->item['mid'] ] );
$obj['type'] = $this->item['obj_type'];
$obj['id'] = $this->item['mid'];
$obj['content'] = $this->item['body'];
@@ -127,7 +128,7 @@ class Share {
"' profile='" . $this->item['author']['xchan_url'] .
"' avatar='" . $this->item['author']['xchan_photo_s'] .
"' link='" . $this->item['plink'] .
"' auth='" . (($this->item['author']['network'] === 'zot') ? 'true' : 'false') .
"' auth='" . ((in_array($this->item['author']['xchan_network'], ['zot6', 'zot'])) ? 'true' : 'false') .
"' posted='" . $this->item['created'] .
"' message_id='" . $this->item['mid'] .
"']";

View File

@@ -0,0 +1,150 @@
<?php
namespace Zotlabs\Lib;
use DomDocument;
/**
* SVGSantiizer
*
* Whitelist-based PHP SVG sanitizer.
*
* @link https://github.com/alister-/SVG-Sanitizer}
* @author Alister Norris
* @copyright Copyright (c) 2013 Alister Norris
* @license http://opensource.org/licenses/mit-license.php The MIT License
* @package svgsanitizer
*/
class SvgSanitizer {
private $xmlDoc; // PHP XML DOMDocument
private $removedattrs = [];
private static $allowed_functions = [ 'matrix', 'url', 'translate', 'rgb' ];
// defines the whitelist of elements and attributes allowed.
private static $whitelist = [
'a' => [ 'class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'mask', 'opacity', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'href', 'xlink:href', 'xlink:title' ],
'circle' => [ 'class', 'clip-path', 'clip-rule', 'cx', 'cy', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'mask', 'opacity', 'r', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform' ],
'clipPath' => [ 'class', 'clipPathUnits', 'id' ],
'defs' => [ ],
'style' => [ 'type' ],
'desc' => [ ],
'ellipse' => [ 'class', 'clip-path', 'clip-rule', 'cx', 'cy', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'mask', 'opacity', 'requiredFeatures', 'rx', 'ry', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform' ],
'feGaussianBlur' => [ 'class', 'color-interpolation-filters', 'id', 'requiredFeatures', 'stdDeviation' ],
'filter' => [ 'class', 'color-interpolation-filters', 'filterRes', 'filterUnits', 'height', 'id', 'primitiveUnits', 'requiredFeatures', 'width', 'x', 'xlink:href', 'y' ],
'foreignObject' => [ 'class', 'font-size', 'height', 'id', 'opacity', 'requiredFeatures', 'style', 'transform', 'width', 'x', 'y' ],
'g' => [ 'class', 'clip-path', 'clip-rule', 'id', 'display', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'mask', 'opacity', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'font-family', 'font-size', 'font-style', 'font-weight', 'text-anchor' ],
'image' => [ 'class', 'clip-path', 'clip-rule', 'filter', 'height', 'id', 'mask', 'opacity', 'requiredFeatures', 'style', 'systemLanguage', 'transform', 'width', 'x', 'xlink:href', 'xlink:title', 'y' ],
'line' => [ 'class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'opacity', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'x1', 'x2', 'y1', 'y2' ],
'linearGradient' => [ 'class', 'id', 'gradientTransform', 'gradientUnits', 'requiredFeatures', 'spreadMethod', 'systemLanguage', 'x1', 'x2', 'xlink:href', 'y1', 'y2' ],
'marker' => [ 'id', 'class', 'markerHeight', 'markerUnits', 'markerWidth', 'orient', 'preserveAspectRatio', 'refX', 'refY', 'systemLanguage', 'viewBox' ],
'mask' => [ 'class', 'height', 'id', 'maskContentUnits', 'maskUnits', 'width', 'x', 'y' ],
'metadata' => [ 'class', 'id' ],
'path' => [ 'class', 'clip-path', 'clip-rule', 'd', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'opacity', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform' ],
'pattern' => [ 'class', 'height', 'id', 'patternContentUnits', 'patternTransform', 'patternUnits', 'requiredFeatures', 'style', 'systemLanguage', 'viewBox', 'width', 'x', 'xlink:href', 'y' ],
'polygon' => [ 'class', 'clip-path', 'clip-rule', 'id', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'class', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'opacity', 'points', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform' ],
'polyline' => [ 'class', 'clip-path', 'clip-rule', 'id', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'opacity', 'points', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform' ],
'radialGradient' => [ 'class', 'cx', 'cy', 'fx', 'fy', 'gradientTransform', 'gradientUnits', 'id', 'r', 'requiredFeatures', 'spreadMethod', 'systemLanguage', 'xlink:href' ],
'rect' => [ 'class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'height', 'id', 'mask', 'opacity', 'requiredFeatures', 'rx', 'ry', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'width', 'x', 'y' ],
'stop' => [ 'class', 'id', 'offset', 'requiredFeatures', 'stop-color', 'stop-opacity', 'style', 'systemLanguage' ],
'svg' => [ 'class', 'clip-path', 'clip-rule', 'filter', 'id', 'height', 'mask', 'preserveAspectRatio', 'requiredFeatures', 'style', 'systemLanguage', 'viewBox', 'width', 'x', 'xmlns', 'xmlns:se', 'xmlns:xlink', 'y' ],
'switch' => [ 'class', 'id', 'requiredFeatures', 'systemLanguage' ],
'symbol' => [ 'class', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'font-family', 'font-size', 'font-style', 'font-weight', 'id', 'opacity', 'preserveAspectRatio', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'viewBox' ],
'text' => [ 'class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'font-family', 'font-size', 'font-style', 'font-weight', 'id', 'mask', 'opacity', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'text-anchor', 'transform', 'x', 'xml:space', 'y' ],
'textPath' => [ 'class', 'id', 'method', 'requiredFeatures', 'spacing', 'startOffset', 'style', 'systemLanguage', 'transform', 'xlink:href' ],
'title' => [ ],
'tspan' => [ 'class', 'clip-path', 'clip-rule', 'dx', 'dy', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'font-family', 'font-size', 'font-style', 'font-weight', 'id', 'mask', 'opacity', 'requiredFeatures', 'rotate', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'text-anchor', 'textLength', 'transform', 'x', 'xml:space', 'y' ],
'use' => [ 'class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'height', 'id', 'mask', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'transform', 'width', 'x', 'xlink:href', 'y' ],
];
function __construct() {
$this->xmlDoc = new DOMDocument('1.0','UTF-8');
$this->xmlDoc->preserveWhiteSpace = false;
libxml_use_internal_errors(true);
}
// load XML SVG
function load($file) {
$this->xmlDoc->load($file);
}
function loadXML($str) {
if (! $this->xmlDoc->loadXML($str)) {
logger('loadxml: ' . print_r(libxml_get_errors(),true), LOGGER_DEBUG);
return false;
}
return true;
}
function sanitize()
{
// all elements in xml doc
$allElements = $this->xmlDoc->getElementsByTagName('*');
// loop through all elements
for($i = 0; $i < $allElements->length; $i++)
{
$this->removedattrs = [];
$currentNode = $allElements->item($i);
// logger('current_node: ' . print_r($currentNode,true));
// array of allowed attributes in specific element
$whitelist_attr_arr = self::$whitelist[$currentNode->tagName];
// does element exist in whitelist?
if(isset($whitelist_attr_arr)) {
$total = $currentNode->attributes->length;
for($x = 0; $x < $total; $x++) {
// get attributes name
$attrName = $currentNode->attributes->item($x)->nodeName;
// logger('checking: ' . print_r($currentNode->attributes->item($x),true));
$matches = false;
// check if attribute isn't in whitelist
if(! in_array($attrName, $whitelist_attr_arr)) {
$this->removedattrs[] = $attrName;
}
// check for disallowed functions
elseif (preg_match_all('/([a-zA-Z0-9]+)[\s]*\(/',
$currentNode->attributes->item($x)->textContent,$matches,PREG_SET_ORDER)) {
if ($attrName === 'text') {
continue;
}
foreach ($matches as $match) {
if(! in_array($match[1],self::$allowed_functions)) {
logger('queue_remove_function: ' . $match[1],LOGGER_DEBUG);
$this->removedattrs[] = $attrName;
}
}
}
}
if ($this->removedattrs) {
foreach ($this->removedattrs as $attr) {
$currentNode->removeAttribute($attr);
logger('removed: ' . $attr, LOGGER_DEBUG);
}
}
}
// else remove element
else {
logger('remove_node: ' . print_r($currentNode,true));
$currentNode->parentNode->removeChild($currentNode);
}
}
return true;
}
function saveSVG() {
$this->xmlDoc->formatOutput = true;
return($this->xmlDoc->saveXML());
}
}

View File

@@ -5,9 +5,14 @@ namespace Zotlabs\Lib;
class System {
static public function get_platform_name() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && array_key_exists('platform_name',\App::$config['system']))
return \App::$config['system']['platform_name'];
return PLATFORM_NAME;
static $platform_name = '';
if(empty($platform_name)) {
if(is_array(\App::$config) && is_array(\App::$config['system']) && array_key_exists('platform_name',\App::$config['system']))
$platform_name = \App::$config['system']['platform_name'];
else
$platform_name = PLATFORM_NAME;
}
return $platform_name;
}
static public function get_site_name() {

View File

@@ -38,6 +38,7 @@ class ThreadItem {
$this->data = $data;
$this->toplevel = ($this->get_id() == $this->get_data_value('parent'));
$this->threaded = get_config('system','thread_allow');
$observer = \App::get_observer();
@@ -77,7 +78,7 @@ class ThreadItem {
*/
public function get_template_data($conv_responses, $thread_level=1, $conv_flags = []) {
$result = array();
$item = $this->get_data();
@@ -94,10 +95,10 @@ class ThreadItem {
$total_children = $this->count_descendants();
$unseen_comments = (($item['real_uid']) ? 0 : $this->count_unseen_descendants());
$conv = $this->get_conversation();
$conv = $this->get_conversation();
$observer = $conv->get_observer();
$lock = ((($item['item_private'] == 1) || (($item['uid'] == local_channel()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
$lock = (((intval($item['item_private'])) || (($item['uid'] == local_channel()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
|| strlen($item['deny_cid']) || strlen($item['deny_gid']))))
? t('Private Message')
: false);
@@ -109,10 +110,10 @@ class ThreadItem {
$shareable = true;
$privacy_warning = false;
if(($item['item_private'] == 1) && ($item['owner']['xchan_network'] === 'activitypub')) {
if(intval($item['item_private']) && ($item['owner']['xchan_network'] === 'activitypub')) {
$recips = get_iconfig($item['parent'], 'activitypub', 'recips');
if(! in_array($observer['xchan_url'], $recips['to']))
if(! is_array($recips['to']) || ! in_array($observer['xchan_url'], $recips['to']))
$privacy_warning = true;
}
@@ -149,9 +150,11 @@ class ThreadItem {
$edpost = false;
if($observer['xchan_hash'] == $this->get_data_value('author_xchan')
if($observer && $observer['xchan_hash']
&& ($observer['xchan_hash'] == $this->get_data_value('author_xchan')
|| $observer['xchan_hash'] == $this->get_data_value('owner_xchan')
|| $this->get_data_value('uid') == local_channel())
|| $observer['xchan_hash'] == $this->get_data_value('source_xchan')
|| $this->get_data_value('uid') == local_channel()))
$dropping = true;
@@ -203,6 +206,10 @@ class ThreadItem {
}
}
if($item['obj_type'] === 'Question') {
$response_verbs[] = 'answer';
}
$consensus = (intval($item['item_consensus']) ? true : false);
if($consensus) {
$response_verbs[] = 'agree';
@@ -280,12 +287,16 @@ class ThreadItem {
$settings = '';
$tagger = [];
// FIXME - check this permission
if($conv->get_profile_owner() == local_channel()) {
/* disable until we agree on how to implemnt this in zot6/activitypub
$tagger = array(
'tagit' => t("Add Tag"),
'classtagger' => "",
);
*/
$settings = t('Conversation Tools');
}
@@ -305,6 +316,7 @@ class ThreadItem {
if($this->is_commentable() && $observer) {
$like = array( t("I like this \x28toggle\x29"), t("like"));
$dislike = array( t("I don't like this \x28toggle\x29"), t("dislike"));
$reply_to = array( t("Reply on this comment"), t("reply"), t("Reply to"));
}
if ($shareable) {
@@ -331,7 +343,6 @@ class ThreadItem {
if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
$is_new = true;
localize_item($item);
$body = prepare_body($item,true);
@@ -345,12 +356,8 @@ class ThreadItem {
$viewthread = z_root() . '/channel/' . $owner_address . '?f=&mid=' . urlencode(gen_link_id($item['mid']));
$comment_count_txt = sprintf( tt('%d comment','%d comments',$total_children),$total_children );
$list_unseen_txt = (($unseen_comments) ? sprintf('%d unseen',$unseen_comments) : '');
$list_unseen_txt = (($unseen_comments) ? sprintf( t('%d unseen'),$unseen_comments) : '');
$children = $this->get_children();
$has_tags = (($body['tags'] || $body['categories'] || $body['mentions'] || $body['attachments'] || $body['folders']) ? true : false);
@@ -359,11 +366,28 @@ class ThreadItem {
call_hooks('dropdown_extras',$dropdown_extras_arr);
$dropdown_extras = $dropdown_extras_arr['dropdown_extras'];
$midb64 = 'b64.' . base64url_encode($item['mid']);
$mids = [ $midb64 ];
$response_mids = [];
foreach($response_verbs as $v) {
if(isset($conv_responses[$v]['mids'][$item['mid']])) {
$response_mids = array_merge($response_mids, $conv_responses[$v]['mids'][$item['mid']]);
}
}
$mids = array_merge($mids, $response_mids);
$json_mids = json_encode($mids);
// Pinned item processing
$allowed_type = (in_array($item['item_type'], get_config('system', 'pin_types', [ ITEM_TYPE_POST ])) ? true : false);
$pinned_items = ($allowed_type ? get_pconfig($item['uid'], 'pinned', $item['item_type'], []) : []);
$pinned = ((!empty($pinned_items) && in_array($midb64, $pinned_items)) ? true : false);
$tmp_item = array(
'template' => $this->get_template(),
'mode' => $mode,
'item_type' => intval($item['item_type']),
'type' => implode("",array_slice(explode("/",$item['verb']),-1)),
//'type' => implode("",array_slice(explode("/",$item['verb']),-1)),
'body' => $body['html'],
'tags' => $body['tags'],
'categories' => $body['categories'],
@@ -372,14 +396,17 @@ class ThreadItem {
'folders' => $body['folders'],
'text' => strip_tags($body['html']),
'id' => $this->get_id(),
'mid' => $item['mid'],
'mid' => $midb64,
'mids' => $json_mids,
'parent' => $item['parent'],
'author_id' => (($item['author']['xchan_addr']) ? $item['author']['xchan_addr'] : $item['author']['xchan_url']),
'isevent' => $isevent,
'attend' => $attend,
'consensus' => $consensus,
'conlabels' => $conlabels,
'canvote' => $canvote,
'linktitle' => sprintf( t('View %s\'s profile - %s'), $profile_name, $item['author']['xchan_addr']),
'olinktitle' => sprintf( t('View %s\'s profile - %s'), $this->get_owner_name(), $item['owner']['xchan_addr']),
'linktitle' => (($item['author']['xchan_addr']) ? $item['author']['xchan_addr'] : $item['author']['xchan_url']),
'olinktitle' => (($item['owner']['xchan_addr']) ? $item['owner']['xchan_addr'] : $item['owner']['xchan_url']),
'llink' => $item['llink'],
'viewthread' => $viewthread,
'to' => t('to'),
@@ -397,7 +424,7 @@ class ThreadItem {
'sparkle' => $sparkle,
'title' => $item['title'],
'title_tosource' => get_pconfig($conv->get_profile_owner(),'system','title_tosource'),
'ago' => relative_date($item['created']),
//'ago' => relative_date($item['created']),
'app' => $item['app'],
'str_app' => sprintf( t('from %s'), $item['app']),
'isotime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'c'),
@@ -405,6 +432,7 @@ class ThreadItem {
'editedtime' => (($item['edited'] != $item['created']) ? sprintf( t('last edited: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['edited'], 'r')) : ''),
'expiretime' => (($item['expires'] > NULL_DATE) ? sprintf( t('Expires: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['expires'], 'r')):''),
'lock' => $lock,
'delayed' => $item['item_delayed'],
'privacy_warning' => $privacy_warning,
'verified' => $verified,
'unverified' => $unverified,
@@ -425,9 +453,11 @@ class ThreadItem {
'has_tags' => $has_tags,
'reactions' => $this->reactions,
// Item toolbar buttons
'emojis' => (($this->is_toplevel() && $this->is_commentable() && $observer && feature_enabled($conv->get_profile_owner(),'emojis')) ? '1' : ''),
'emojis' => (($this->is_toplevel() && $this->is_commentable() && $observer && feature_enabled($conv->get_profile_owner(),'emojis')) ? '1' : ''),
'like' => $like,
'dislike' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike : ''),
'reply_to' => (((! $this->is_toplevel()) && feature_enabled($conv->get_profile_owner(),'reply_to')) ? $reply_to : ''),
'top_hint' => t("Go to previous comment"),
'share' => $share,
'embed' => $embed,
'rawmid' => $item['mid'],
@@ -436,13 +466,15 @@ class ThreadItem {
'star' => ((feature_enabled($conv->get_profile_owner(),'star_posts') && ($item['item_type'] == ITEM_TYPE_POST)) ? $star : ''),
'tagger' => ((feature_enabled($conv->get_profile_owner(),'commtag')) ? $tagger : ''),
'filer' => ((feature_enabled($conv->get_profile_owner(),'filing') && ($item['item_type'] == ITEM_TYPE_POST)) ? $filer : ''),
'pinned' => ($pinned ? t('Pinned post') : ''),
'pinnable' => (($this->is_toplevel() && local_channel() && $item['owner_xchan'] == $observer['xchan_hash'] && $allowed_type && $item['item_private'] == 0 && $item['item_delayed'] == 0) ? '1' : ''),
'pinme' => ($pinned ? t('Unpin from the top') : t('Pin to the top')),
'bookmark' => (($conv->get_profile_owner() == local_channel() && local_channel() && $has_bookmarks) ? t('Save Bookmarks') : ''),
'addtocal' => (($has_event) ? t('Add to Calendar') : ''),
'drop' => $drop,
'multidrop' => ((feature_enabled($conv->get_profile_owner(),'multi_delete')) ? $multidrop : ''),
'dropdown_extras' => $dropdown_extras,
'dropdown_extras' => $dropdown_extras,
// end toolbar buttons
'unseen_comments' => $unseen_comments,
'comment_count' => $total_children,
'comment_count_txt' => $comment_count_txt,
@@ -463,13 +495,13 @@ class ThreadItem {
'modal_dismiss' => t('Close'),
'showlike' => $showlike,
'showdislike' => $showdislike,
'comment' => $this->get_comment_box($indent),
'comment' => ($item['item_delayed'] ? '' : $this->get_comment_box($indent)),
'previewing' => ($conv->is_preview() ? true : false ),
'preview_lbl' => t('This is an unsaved preview'),
'wait' => t('Please wait'),
'submid' => str_replace(['+','='], ['',''], base64_encode($item['mid'])),
'thread_level' => $thread_level,
'settings' => $settings
'settings' => $settings,
'thr_parent' => (($item['parent_mid'] != $item['thr_parent']) ? 'b64.' . base64url_encode($item['thr_parent']) : '')
);
$arr = array('item' => $item, 'output' => $tmp_item);
@@ -777,8 +809,6 @@ class ThreadItem {
call_hooks('comment_buttons',$arr);
$comment_buttons = $arr['comment_buttons'];
$feature_auto_save_draft = ((feature_enabled($conv->get_profile_owner(), 'auto_save_draft')) ? "true" : "false");
$comment_box = replace_macros($template,array(
'$return_path' => '',
'$threaded' => $this->is_threaded(),
@@ -813,8 +843,7 @@ class ThreadItem {
'$anoncomments' => ((($conv->get_mode() === 'channel' || $conv->get_mode() === 'display') && perm_is_allowed($conv->get_profile_owner(),'','post_comments')) ? true : false),
'$anonname' => [ 'anonname', t('Your full name (required)') ],
'$anonmail' => [ 'anonmail', t('Your email address (required)') ],
'$anonurl' => [ 'anonurl', t('Your website URL (optional)') ],
'$auto_save_draft' => $feature_auto_save_draft,
'$anonurl' => [ 'anonurl', t('Your website URL (optional)') ]
));
return $comment_box;
@@ -865,8 +894,4 @@ class ThreadItem {
return $this->visiting;
}
}

View File

@@ -23,7 +23,7 @@ class ThreadStream {
private $preview = false;
private $prepared_item = '';
public $reload = '';
private $cipher = 'aes256';
private $cipher = 'AES-128-CCM';
// $prepared_item is for use by alternate conversation structures such as photos
// wherein we've already prepared a top level item which doesn't look anything like

View File

@@ -106,4 +106,4 @@ class Webfinger {
}
}

View File

@@ -2,7 +2,7 @@
namespace Zotlabs\Lib;
use Zotlabs\Zot6\HTTPSig;
use Zotlabs\Web\HTTPSig;
class ZotURL {

View File

@@ -2,7 +2,7 @@
namespace Zotlabs\Lib;
use Zotlabs\Zot6\HTTPSig;
use Zotlabs\Web\HTTPSig;
class Zotfinger {
@@ -60,4 +60,4 @@ class Zotfinger {
}
}

View File

@@ -42,7 +42,7 @@ class Acl extends \Zotlabs\Web\Controller {
// $type =
// 'm' => autocomplete private mail recipient (checks post_mail permission)
// 'm' => autocomplete private mail recipient (checks post_mail permission and displays only zot, diaspora, friendica-over-diaspora xchan_network xchan's)
// 'a' => autocomplete connections (mod_connections, mod_poke, mod_sources, mod_photos)
// 'x' => nav search bar autocomplete (match any xchan)
// $_REQUEST['query'] contains autocomplete search text.
@@ -286,6 +286,7 @@ class Acl extends \Zotlabs\Web\Controller {
FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d
and xchan_deleted = 0
and xchan_network IN ('zot', 'diaspora', 'friendica-over-diaspora')
$sql_extra3
ORDER BY xchan_name ASC ",
intval(local_channel())

269
Zotlabs/Module/Activity.php Normal file
View File

@@ -0,0 +1,269 @@
<?php
namespace Zotlabs\Module;
use Zotlabs\Lib\IConfig;
use Zotlabs\Lib\Enotify;
use Zotlabs\Web\Controller;
use Zotlabs\Daemon\Master;
use Zotlabs\Lib\Activity as ZlibActivity;
use Zotlabs\Lib\ActivityStreams;
use Zotlabs\Lib\LDSignatures;
use Zotlabs\Web\HTTPSig;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\ThreadListener;
use App;
class Activity extends Controller {
function init() {
if (Libzot::is_zot_request()) {
$item_id = argv(1);
if (! $item_id)
http_status_exit(404, 'Not found');
$portable_id = EMPTY_STR;
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_blocked = 0 ";
$i = null;
// do we have the item (at all)?
$r = q("select * from item where mid = '%s' $item_normal limit 1",
dbesc(z_root() . '/activity/' . $item_id)
);
if (! $r) {
http_status_exit(404,'Not found');
}
// process an authenticated fetch
$sigdata = HTTPSig::verify(EMPTY_STR);
if($sigdata['portable_id'] && $sigdata['header_valid']) {
$portable_id = $sigdata['portable_id'];
observer_auth($portable_id);
// first see if we have a copy of this item's parent owned by the current signer
// include xchans for all zot-like networks - these will have the same guid and public key
$x = q("select * from xchan where xchan_hash = '%s'",
dbesc($sigdata['portable_id'])
);
if ($x) {
$xchans = q("select xchan_hash from xchan where xchan_hash = '%s' OR ( xchan_guid = '%s' AND xchan_pubkey = '%s' ) ",
dbesc($sigdata['portable_id']),
dbesc($x[0]['xchan_guid']),
dbesc($x[0]['xchan_pubkey'])
);
if ($xchans) {
$hashes = ids_to_querystr($xchans,'xchan_hash',true);
$i = q("select id as item_id from item where mid = '%s' $item_normal and owner_xchan in ( " . protect_sprintf($hashes) . " ) limit 1",
dbesc($r[0]['parent_mid'])
);
}
}
}
// if we don't have a parent id belonging to the signer see if we can obtain one as a visitor that we have permission to access
// with a bias towards those items owned by channels on this site (item_wall = 1)
$sql_extra = item_permissions_sql(0);
if (! $i) {
$i = q("select id as item_id from item where mid = '%s' $item_normal $sql_extra order by item_wall desc limit 1",
dbesc($r[0]['parent_mid'])
);
}
if(! $i) {
http_status_exit(403,'Forbidden');
}
$parents_str = ids_to_querystr($i,'item_id');
$items = q("SELECT item.*, item.id AS item_id FROM item WHERE item.parent IN ( %s ) $item_normal ",
dbesc($parents_str)
);
if(! $items) {
http_status_exit(404, 'Not found');
}
xchan_query($items,true);
$items = fetch_post_tags($items,true);
$observer = App::get_observer();
$parent = $items[0];
$recips = (($parent['owner']['xchan_network'] === 'activitypub') ? get_iconfig($parent['id'],'activitypub','recips', []) : []);
$to = (($recips && array_key_exists('to',$recips) && is_array($recips['to'])) ? $recips['to'] : null);
$nitems = [];
foreach($items as $i) {
$mids = [];
if(intval($i['item_private'])) {
if(! $observer) {
continue;
}
// ignore private reshare, possibly from hubzilla
if($i['verb'] === 'Announce') {
if(! in_array($i['thr_parent'],$mids)) {
$mids[] = $i['thr_parent'];
}
continue;
}
// also ignore any children of the private reshares
if(in_array($i['thr_parent'],$mids)) {
continue;
}
if((! $to) || (! in_array($observer['xchan_url'],$to))) {
continue;
}
}
$nitems[] = $i;
}
if(! $nitems)
http_status_exit(404, 'Not found');
$chan = channelx_by_n($nitems[0]['uid']);
if(! $chan)
http_status_exit(404, 'Not found');
if(! perm_is_allowed($chan['channel_id'],get_observer_hash(),'view_stream'))
http_status_exit(403, 'Forbidden');
$i = ZlibActivity::encode_item_collection($nitems,'conversation/' . $item_id,'OrderedCollection');
if($portable_id) {
ThreadListener::store(z_root() . '/activity/' . $item_id,$portable_id);
}
if(! $i)
http_status_exit(404, 'Not found');
$x = array_merge(['@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
z_root() . ZOT_APSCHEMA_REV
]], $i);
$headers = [];
$headers['Content-Type'] = 'application/x-zot+json' ;
$x['signature'] = LDSignatures::sign($x,$chan);
$ret = json_encode($x, JSON_UNESCAPED_SLASHES);
$headers['Digest'] = HTTPSig::generate_digest_header($ret);
$headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI'];
$h = HTTPSig::create_sig($headers,$chan['channel_prvkey'],channel_url($chan));
HTTPSig::set_headers($h);
echo $ret;
killme();
}
if(ActivityStreams::is_as_request()) {
$item_id = argv(1);
if (! $item_id) {
return;
}
$ob_authorise = false;
$item_uid = 0;
$bear = ZlibActivity::token_from_request();
if ($bear) {
logger('bear: ' . $bear, LOGGER_DEBUG);
$t = q("select item.uid, iconfig.v from iconfig left join item on iid = item.id where cat = 'ocap' and item.uuid = '%s'",
dbesc($item_id)
);
if ($t) {
foreach ($t as $token) {
if ($token['v'] === $bear) {
$ob_authorize = true;
$item_uid = $token['uid'];
break;
}
}
}
}
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0
and item.item_delayed = 0 and item.item_blocked = 0 ";
$sigdata = HTTPSig::verify(EMPTY_STR);
if ($sigdata['portable_id'] && $sigdata['header_valid']) {
$portable_id = $sigdata['portable_id'];
if (! check_channelallowed($portable_id)) {
http_status_exit(403, 'Permission denied');
}
if (! check_siteallowed($sigdata['signer'])) {
http_status_exit(403, 'Permission denied');
}
observer_auth($portable_id);
}
// if passed an owner_id of 0 to item_permissions_sql(), we force "guest access" or observer checking
// Give ocap tokens priority
if ($ob_authorize) {
$sql_extra = " and item.uid = " . intval($token['uid']) . " ";
}
else {
$sql_extra = item_permissions_sql(0);
}
$r = q("select * from item where uuid = '%s' $item_normal $sql_extra limit 1",
dbesc($item_id)
);
if (! $r) {
$r = q("select * from item where uuid = '%s' $item_normal limit 1",
dbesc($item_id)
);
if($r) {
http_status_exit(403, 'Forbidden');
}
http_status_exit(404, 'Not found');
}
xchan_query($r,true);
$items = fetch_post_tags($r,false);
$channel = channelx_by_n($items[0]['uid']);
$x = array_merge( ['@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
z_root() . ZOT_APSCHEMA_REV
]], ZlibActivity::encode_activity($items[0],true));
$headers = [];
$headers['Content-Type'] = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ;
$x['signature'] = LDSignatures::sign($x,$channel);
$ret = json_encode($x, JSON_UNESCAPED_SLASHES);
$headers['Date'] = datetime_convert('UTC','UTC', 'now', 'D, d M Y H:i:s \\G\\M\\T');
$headers['Digest'] = HTTPSig::generate_digest_header($ret);
$headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI'];
$h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel));
HTTPSig::set_headers($h);
echo $ret;
killme();
}
goaway(z_root() . '/item/' . argv(1));
}
}

View File

@@ -2,6 +2,7 @@
namespace Zotlabs\Module\Admin;
use App;
use \Zotlabs\Storage\GitRepo;
use \Michelf\MarkdownExtra;
@@ -17,7 +18,7 @@ class Addons {
@include_once("addon/" . argv(2) . "/" . argv(2) . ".php");
if(function_exists(argv(2).'_plugin_admin_post')) {
$func = argv(2) . '_plugin_admin_post';
$func($a);
$func();
}
goaway(z_root() . '/admin/addons/' . argv(2) );
@@ -253,14 +254,14 @@ class Addons {
* Single plugin
*/
if (\App::$argc == 3){
$plugin = \App::$argv[2];
if (App::$argc == 3){
$plugin = App::$argv[2];
if (!is_file("addon/$plugin/$plugin.php")){
notice( t("Item not found.") );
return '';
}
$enabled = in_array($plugin,\App::$plugins);
$enabled = in_array($plugin,App::$plugins);
$info = get_plugin_info($plugin);
$x = check_plugin_versions($info);
@@ -268,11 +269,11 @@ class Addons {
if($enabled && ! $x) {
$enabled = false;
$idz = array_search($plugin, \App::$plugins);
$idz = array_search($plugin, App::$plugins);
if ($idz !== false) {
unset(\App::$plugins[$idz]);
unset(App::$plugins[$idz]);
uninstall_plugin($plugin);
set_config("system","addon", implode(", ",\App::$plugins));
set_config("system","addon", implode(", ",App::$plugins));
}
}
$info['disabled'] = 1-intval($x);
@@ -281,19 +282,19 @@ class Addons {
check_form_security_token_redirectOnErr('/admin/addons', 'admin_addons', 't');
$pinstalled = false;
// Toggle plugin status
$idx = array_search($plugin, \App::$plugins);
$idx = array_search($plugin, App::$plugins);
if ($idx !== false){
unset(\App::$plugins[$idx]);
unset(App::$plugins[$idx]);
uninstall_plugin($plugin);
$pinstalled = false;
info( sprintf( t("Plugin %s disabled."), $plugin ) );
} else {
\App::$plugins[] = $plugin;
App::$plugins[] = $plugin;
install_plugin($plugin);
$pinstalled = true;
info( sprintf( t("Plugin %s enabled."), $plugin ) );
}
set_config("system","addon", implode(", ",\App::$plugins));
set_config("system","addon", implode(", ",App::$plugins));
if($pinstalled) {
@require_once("addon/$plugin/$plugin.php");
@@ -305,7 +306,7 @@ class Addons {
// display plugin details
if (in_array($plugin, \App::$plugins)){
if (in_array($plugin, App::$plugins)){
$status = 'on';
$action = t('Disable');
} else {
@@ -331,7 +332,7 @@ class Addons {
@require_once("addon/$plugin/$plugin.php");
if(function_exists($plugin.'_plugin_admin')) {
$func = $plugin.'_plugin_admin';
$func($a, $admin_form);
$func($admin_form);
}
}
@@ -380,18 +381,18 @@ class Addons {
list($tmp, $id) = array_map('trim', explode('/', $file));
$info = get_plugin_info($id);
$enabled = in_array($id,\App::$plugins);
$enabled = in_array($id,App::$plugins);
$x = check_plugin_versions($info);
// disable plugins which are installed but incompatible versions
if($enabled && ! $x) {
$enabled = false;
$idz = array_search($id, \App::$plugins);
$idz = array_search($id, App::$plugins);
if ($idz !== false) {
unset(\App::$plugins[$idz]);
unset(App::$plugins[$idz]);
uninstall_plugin($id);
set_config("system","addon", implode(", ",\App::$plugins));
set_config("system","addon", implode(", ",App::$plugins));
}
}
$info['disabled'] = 1-intval($x);

View File

@@ -19,7 +19,47 @@ class Dbsync {
info( t('Update has been marked successful') . EOL);
goaway(z_root() . '/admin/dbsync');
}
if(argc() > 3 && intval(argv(3)) && argv(2) === 'verify') {
$s = '_' . intval(argv(3));
$cls = '\\Zotlabs\Update\\' . $s ;
if(class_exists($cls)) {
$c = new $cls();
if(method_exists($c,'verify')) {
$retval = $c->verify();
if($retval === UPDATE_FAILED) {
$o .= sprintf( t('Verification of update %s failed. Check system logs.'), $s);
}
elseif($retval === UPDATE_SUCCESS) {
$o .= sprintf( t('Update %s was successfully applied.'), $s);
set_config('database',$s, 'success');
}
else
$o .= sprintf( t('Verifying update %s did not return a status. Unknown if it succeeded.'), $s);
}
else {
$o .= sprintf( t('Update %s does not contain a verification function.'), $s );
}
}
else
$o .= sprintf( t('Update function %s could not be found.'), $s);
return $o;
// remove the old style config if it exists
del_config('database', 'update_r' . intval(argv(3)));
set_config('database', '_' . intval(argv(3)), 'success');
if(intval(get_config('system','db_version')) < intval(argv(3)))
set_config('system','db_version',intval(argv(3)));
info( t('Update has been marked successful') . EOL);
goaway(z_root() . '/admin/dbsync');
}
if(argc() > 2 && intval(argv(2))) {
$x = intval(argv(2));
$s = '_' . $x;
@@ -28,14 +68,14 @@ class Dbsync {
$c = new $cls();
$retval = $c->run();
if($retval === UPDATE_FAILED) {
$o .= sprintf( t('Executing %s failed. Check system logs.'), $s);
$o .= sprintf( t('Executing update procedure %s failed. Check system logs.'), $s);
}
elseif($retval === UPDATE_SUCCESS) {
$o .= sprintf( t('Update %s was successfully applied.'), $s);
set_config('database',$s, 'success');
}
else
$o .= sprintf( t('Update %s did not return a status. Unknown if it succeeded.'), $s);
$o .= sprintf( t('Update %s did not return a status. It cannot be determined if it was successful.'), $s);
}
else
$o .= sprintf( t('Update function %s could not be found.'), $s);
@@ -59,6 +99,7 @@ class Dbsync {
'$banner' => t('Failed Updates'),
'$desc' => '',
'$mark' => t('Mark success (if update was manually applied)'),
'$verify' => t('Attempt to verify this update if a verification procedure exists'),
'$apply' => t('Attempt to execute this update step automatically'),
'$failed' => $failed
));

View File

@@ -43,6 +43,12 @@ class Security {
$be = $this->trim_array_elems(explode("\n",$_POST['embed_deny']));
set_config('system','embed_deny',$be);
$thumbnail_security = ((x($_POST,'thumbnail_security')) ? intval($_POST['thumbnail_security']) : 0);
set_config('system', 'thumbnail_security' , $thumbnail_security);
$inline_pdf = ((x($_POST,'inline_pdf')) ? intval($_POST['inline_pdf']) : 0);
set_config('system', 'inline_pdf' , $inline_pdf);
$ts = ((x($_POST,'transport_security')) ? True : False);
set_config('system','transport_security_header',$ts);
@@ -86,7 +92,7 @@ class Security {
$embedhelp2 = t("The recommended setting is to only allow unfiltered HTML from the following sites:");
$embedhelp3 = t("https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />");
$embedhelp4 = t("All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked.");
$t = get_markup_template('admin_security.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -106,7 +112,9 @@ class Security {
'$embed_sslonly' => array('embed_sslonly',t('Only allow embeds from secure (SSL) websites and links.'), intval(get_config('system','embed_sslonly')),''),
'$embed_allow' => array('embed_allow', t('Allow unfiltered embedded HTML content only from these domains'), $whiteembeds_str, t('One site per line. By default embedded content is filtered.')),
'$embed_deny' => array('embed_deny', t('Block embedded HTML from these domains'), $blackembeds_str, ''),
'$thumbnail_security' => [ 'thumbnail_security', t("Allow SVG thumbnails in file browser"), get_config('system','thumbnail_security',0), t("WARNING: SVG images may contain malicious code.") ],
'$inline_pdf' => [ 'inline_pdf', t("Allow embedded (inline) PDF files"), get_config('system','inline_pdf',0), '' ],
// '$embed_coop' => array('embed_coop', t('Cooperative embed security'), $embed_coop, t('Enable to share embed security with other compatible sites/hubs')),
'$submit' => t('Submit')
@@ -128,4 +136,4 @@ class Security {
}
}
}

View File

@@ -73,7 +73,6 @@ class Site {
$feed_contacts = ((x($_POST,'feed_contacts')) ? intval($_POST['feed_contacts']) : 0);
$verify_email = ((x($_POST,'verify_email')) ? 1 : 0);
$imagick_path = ((x($_POST,'imagick_path')) ? trim($_POST['imagick_path']) : '');
$thumbnail_security = ((x($_POST,'thumbnail_security')) ? intval($_POST['thumbnail_security']) : 0);
$force_queue = ((intval($_POST['force_queue']) > 0) ? intval($_POST['force_queue']) : 3000);
$pub_incl = escape_tags(trim($_POST['pub_incl']));
$pub_excl = escape_tags(trim($_POST['pub_excl']));
@@ -100,7 +99,6 @@ class Site {
set_config('system', 'from_email', $from_email);
set_config('system', 'from_email_name' , $from_email_name);
set_config('system', 'imagick_convert_path' , $imagick_path);
set_config('system', 'thumbnail_security' , $thumbnail_security);
set_config('system', 'default_permissions_role', $permissions_role);
set_config('system', 'pubstream_incl',$pub_incl);
set_config('system', 'pubstream_excl',$pub_excl);
@@ -341,7 +339,6 @@ class Site {
'$force_queue' => array('force_queue', t("Queue Threshold"), get_config('system','force_queue_threshold',3000), t("Always defer immediate delivery if queue contains more than this number of entries.")),
'$poll_interval' => array('poll_interval', t("Poll interval"), (x(get_config('system','poll_interval'))?get_config('system','poll_interval'):2), t("Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval.")),
'$imagick_path' => array('imagick_path', t("Path to ImageMagick convert program"), get_config('system','imagick_convert_path'), t("If set, use this program to generate photo thumbnails for huge images ( > 4000 pixels in either dimension), otherwise memory exhaustion may occur. Example: /usr/bin/convert")),
'$thumbnail_security' => array('thumbnail_security', t("Allow SVG thumbnails in file browser"), get_config('system','thumbnail_security',0), t("WARNING: SVG images may contain malicious code.")),
'$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")),
'$default_expire_days' => array('default_expire_days', t('Expiration period in days for imported (grid/network) content'), intval(get_config('system','default_expire_days')), t('0 for no expiration of imported content')),
'$active_expire_days' => array('active_expire_days', t('Do not expire any posts which have comments less than this many days ago'), intval(get_config('system','active_expire_days',7)), ''),

View File

@@ -34,9 +34,9 @@ class Apporder extends \Zotlabs\Web\Controller {
foreach($syslist as $app) {
if($l === 'nav_pinned_app') {
$navbar_apps[] = Zlib\Apps::app_render($app,'nav-order');
$navbar_apps[] = Zlib\Apps::app_render($app,'nav-order-pinned');
}
elseif(strpos($app['categories'],'nav_pinned_app') === false) {
else {
$nav_apps[] = Zlib\Apps::app_render($app,'nav-order');
}
}

View File

@@ -0,0 +1,66 @@
<?php
namespace Zotlabs\Module;
class Apschema extends \Zotlabs\Web\Controller {
function init() {
$base = z_root();
$arr = [
'@context' => [
'zot' => z_root() . '/apschema#',
'id' => '@id',
'type' => '@type',
'commentPolicy' => 'as:commentPolicy',
'meData' => 'zot:meData',
'meDataType' => 'zot:meDataType',
'meEncoding' => 'zot:meEncoding',
'meAlgorithm' => 'zot:meAlgorithm',
'meCreator' => 'zot:meCreator',
'meSignatureValue' => 'zot:meSignatureValue',
'locationAddress' => 'zot:locationAddress',
'locationPrimary' => 'zot:locationPrimary',
'locationDeleted' => 'zot:locationDeleted',
'nomadicLocation' => 'zot:nomadicLocation',
'nomadicHubs' => 'zot:nomadicHubs',
'emojiReaction' => 'zot:emojiReaction',
'expires' => 'zot:expires',
'directMessage' => 'zot:directMessage',
'schema' => 'http://schema.org#',
'PropertyValue' => 'schema:PropertyValue',
'value' => 'schema:value',
'magicEnv' => [
'@id' => 'zot:magicEnv',
'@type' => '@id'
],
'nomadicLocations' => [
'@id' => 'zot:nomadicLocations',
'@type' => '@id'
],
'ostatus' => 'http://ostatus.org#',
'conversation' => 'ostatus:conversation',
'diaspora' => 'https://diasporafoundation.org/ns/',
'guid' => 'diaspora:guid',
'Hashtag' => 'as:Hashtag'
]
];
header('Content-Type: application/ld+json');
echo json_encode($arr,JSON_UNESCAPED_SLASHES);
killme();
}
}

View File

@@ -85,10 +85,9 @@ class Article_edit extends \Zotlabs\Web\Controller {
$mimetype = $itm[0]['mimetype'];
$summary = (($itm[0]['summary']) ? '[summary]' . $itm[0]['summary'] . '[/summary]' . "\r\n" : '');
$content = $itm[0]['body'];
$rp = 'articles/' . $channel['channel_address'];
$x = array(
@@ -110,7 +109,7 @@ class Article_edit extends \Zotlabs\Web\Controller {
'ptyp' => $itm[0]['type'],
'mimeselect' => false,
'mimetype' => $itm[0]['mimetype'],
'body' => undo_post_tagging($content),
'body' => $summary . undo_post_tagging($content),
'post_id' => $post_id,
'visitor' => true,
'title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),

View File

@@ -9,6 +9,7 @@ use Zotlabs\Lib\PermissionDescription;
require_once('include/channel.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
require_once('include/opengraph.php');
class Articles extends Controller {
@@ -148,7 +149,7 @@ class Articles extends Controller {
}
$itemspage = get_pconfig(local_channel(),'system','itemspage');
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 10));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
@@ -192,7 +193,7 @@ class Articles extends Controller {
$parents_str = ids_to_querystr($r,'id');
$items = q("SELECT item.*, item.id AS item_id
$r = q("SELECT item.*, item.id AS item_id
FROM item
WHERE item.uid = %d $item_normal
AND item.parent IN ( %s )
@@ -200,15 +201,18 @@ class Articles extends Controller {
intval(App::$profile['profile_uid']),
dbesc($parents_str)
);
if($items) {
xchan_query($items);
$items = fetch_post_tags($items, true);
if($r) {
xchan_query($r);
$items = fetch_post_tags($r, true);
$items = conv_sort($items,'updated');
}
else
$items = [];
}
// Add Opengraph markup
opengraph_add_meta((! empty($items) ? $r[0] : []), $channel);
$mode = 'articles';
if(get_pconfig(local_channel(),'system','articles_list_mode') && (! $selected_card))

View File

@@ -1,6 +1,10 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
require_once('include/conversation.php');
require_once('include/bbcode.php');
require_once('include/datetime.php');
@@ -9,15 +13,13 @@ require_once('include/items.php');
require_once('include/html2plain.php');
class Cal extends \Zotlabs\Web\Controller {
class Cal extends Controller {
function init() {
if(observer_prohibited()) {
return;
}
$o = '';
if(argc() > 1) {
$nick = argv(1);
@@ -25,19 +27,21 @@ class Cal extends \Zotlabs\Web\Controller {
$channelx = channelx_by_nick($nick);
if(! $channelx)
if(! $channelx) {
notice( t('Channel not found.') . EOL);
return;
}
\App::$data['channel'] = $channelx;
App::$data['channel'] = $channelx;
$observer = \App::get_observer();
\App::$data['observer'] = $observer;
$observer = App::get_observer();
App::$data['observer'] = $observer;
$observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
head_set_icon(\App::$data['channel']['xchan_photo_s']);
head_set_icon(App::$data['channel']['xchan_photo_s']);
\App::$page['htmlhead'] .= "<script> var profile_uid = " . ((\App::$data['channel']) ? \App::$data['channel']['channel_id'] : 0) . "; </script>" ;
App::$page['htmlhead'] .= "<script> var profile_uid = " . ((App::$data['channel']) ? App::$data['channel']['channel_id'] : 0) . "; </script>" ;
}
@@ -52,18 +56,8 @@ class Cal extends \Zotlabs\Web\Controller {
return;
}
$channel = null;
if(argc() > 1) {
$channel = channelx_by_nick(argv(1));
}
if(! $channel) {
notice( t('Channel not found.') . EOL);
return;
}
$channel = App::$data['channel'];
// since we don't currently have an event permission - use the stream permission
if(! perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_stream')) {
@@ -72,287 +66,152 @@ class Cal extends \Zotlabs\Web\Controller {
}
nav_set_selected('Calendar');
head_add_css('/library/fullcalendar/packages/core/main.min.css');
head_add_css('/library/fullcalendar/packages/daygrid/main.min.css');
head_add_css('cdav_calendar.css');
head_add_js('/library/fullcalendar/packages/core/main.min.js');
head_add_js('/library/fullcalendar/packages/daygrid/main.min.js');
$sql_extra = permissions_sql($channel['channel_id'], get_observer_hash(), 'event');
if(! perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_contacts') || App::$profile['hide_friends'])
$sql_extra .= " and etype != 'birthday' ";
$sql_extra = permissions_sql($channel['channel_id'],get_observer_hash(),'event');
$first_day = feature_enabled($channel['channel_id'], 'events_cal_first_day');
$first_day = feature_enabled($channel['channel_id'], 'cal_first_day');
$first_day = (($first_day) ? $first_day : 0);
$htpl = get_markup_template('event_head.tpl');
\App::$page['htmlhead'] .= replace_macros($htpl,array(
'$baseurl' => z_root(),
'$module_url' => '/cal/' . $channel['channel_address'],
'$modparams' => 2,
'$lang' => \App::$language,
'$first_day' => $first_day
));
$o = '';
$mode = 'view';
$y = 0;
$m = 0;
$ignored = ((x($_REQUEST,'ignored')) ? " and dismissed = " . intval($_REQUEST['ignored']) . " " : '');
// logger('args: ' . print_r(\App::$argv,true));
if(argc() > 3 && intval(argv(2)) && intval(argv(3))) {
$mode = 'view';
$y = intval(argv(2));
$m = intval(argv(3));
}
if(argc() <= 3) {
$mode = 'view';
$event_id = argv(2);
$start = '';
$finish = '';
if (argv(2) === 'json') {
if (x($_GET,'start')) $start = $_GET['start'];
if (x($_GET,'end')) $finish = $_GET['end'];
}
if($mode == 'view') {
/* edit/create form */
if($event_id) {
$r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($event_id),
intval($channel['channel_id'])
);
if(count($r))
$orig_event = $r[0];
}
// Passed parameters overrides anything found in the DB
if(!x($orig_event))
$orig_event = array();
$tz = date_default_timezone_get();
if(x($orig_event))
$tz = (($orig_event['adjust']) ? date_default_timezone_get() : 'UTC');
$syear = datetime_convert('UTC', $tz, $sdt, 'Y');
$smonth = datetime_convert('UTC', $tz, $sdt, 'm');
$sday = datetime_convert('UTC', $tz, $sdt, 'd');
$shour = datetime_convert('UTC', $tz, $sdt, 'H');
$sminute = datetime_convert('UTC', $tz, $sdt, 'i');
$stext = datetime_convert('UTC',$tz,$sdt);
$stext = substr($stext,0,14) . "00:00";
$fyear = datetime_convert('UTC', $tz, $fdt, 'Y');
$fmonth = datetime_convert('UTC', $tz, $fdt, 'm');
$fday = datetime_convert('UTC', $tz, $fdt, 'd');
$fhour = datetime_convert('UTC', $tz, $fdt, 'H');
$fminute = datetime_convert('UTC', $tz, $fdt, 'i');
$ftext = datetime_convert('UTC',$tz,$fdt);
$ftext = substr($ftext,0,14) . "00:00";
$type = ((x($orig_event)) ? $orig_event['etype'] : 'event');
$f = get_config('system','event_input_format');
if(! $f)
$f = 'ymd';
$catsenabled = feature_enabled($channel['channel_id'],'categories');
$show_bd = perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_contacts');
if(! $show_bd) {
$sql_extra .= " and event.etype != 'birthday' ";
}
$category = '';
$thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
$thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
if(! $y)
$y = intval($thisyear);
if(! $m)
$m = intval($thismonth);
// Put some limits on dates. The PHP date functions don't seem to do so well before 1900.
// An upper limit was chosen to keep search engines from exploring links millions of years in the future.
if($y < 1901)
$y = 1900;
if($y > 2099)
$y = 2100;
$nextyear = $y;
$nextmonth = $m + 1;
if($nextmonth > 12) {
$nextmonth = 1;
$nextyear ++;
}
$prevyear = $y;
if($m > 1)
$prevmonth = $m - 1;
else {
$prevmonth = 12;
$prevyear --;
}
$dim = get_dim($y,$m);
$start = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0);
$finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
if (argv(2) === 'json'){
if (x($_GET,'start')) $start = $_GET['start'];
if (x($_GET,'end')) $finish = $_GET['end'];
}
$start = datetime_convert('UTC','UTC',$start);
$finish = datetime_convert('UTC','UTC',$finish);
$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
$start = datetime_convert('UTC','UTC',$start);
$finish = datetime_convert('UTC','UTC',$finish);
$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
if(! perm_is_allowed(\App::$profile['uid'],get_observer_hash(),'view_contacts'))
$sql_extra .= " and etype != 'birthday' ";
if (x($_GET, 'id')) {
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan, item.id as item_id
from event left join item on item.resource_id = event.event_hash
where item.resource_type = 'event' and event.uid = %d and event.id = %d $sql_extra limit 1",
intval($channel['channel_id']),
intval($_GET['id'])
);
}
else {
// fixed an issue with "nofinish" events not showing up in the calendar.
// There's still an issue if the finish date crosses the end of month.
// Noting this for now - it will need to be fixed here and in Friendica.
// Ultimately the finish date shouldn't be involved in the query.
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan, item.id as item_id
from event left join item on event.event_hash = item.resource_id
where item.resource_type = 'event' and event.uid = %d and event.uid = item.uid
AND (( event.adjust = 0 AND ( event.dtend >= '%s' or event.nofinish = 1 ) AND event.dtstart <= '%s' )
OR ( event.adjust = 1 AND ( event.dtend >= '%s' or event.nofinish = 1 ) AND event.dtstart <= '%s' ))
$sql_extra",
intval($channel['channel_id']),
dbesc($start),
dbesc($finish),
dbesc($adjust_start),
dbesc($adjust_finish)
);
}
if($r) {
xchan_query($r);
$r = fetch_post_tags($r,true);
$r = sort_by_date($r);
}
if (x($_GET,'id')){
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d $sql_extra limit 1",
intval($channel['channel_id']),
intval($_GET['id'])
);
}
else {
// fixed an issue with "nofinish" events not showing up in the calendar.
// There's still an issue if the finish date crosses the end of month.
// Noting this for now - it will need to be fixed here and in Friendica.
// Ultimately the finish date shouldn't be involved in the query.
$events = [];
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on event_hash = resource_id
where resource_type = 'event' and event.uid = %d and event.uid = item.uid $ignored
AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) $sql_extra ",
intval($channel['channel_id']),
dbesc($start),
dbesc($finish),
dbesc($adjust_start),
dbesc($adjust_finish)
);
}
$links = array();
if($r) {
xchan_query($r);
$r = fetch_post_tags($r,true);
$r = sort_by_date($r);
}
if($r) {
foreach($r as $rr) {
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
if(! x($links,$j))
$links[$j] = z_root() . '/' . \App::$cmd . '#link-' . $j;
if($r) {
foreach($r as $rr) {
$tz = get_iconfig($rr, 'event', 'timezone');
if(! $tz)
$tz = 'UTC';
$start = (($rr['adjust']) ? datetime_convert($tz, date_default_timezone_get(), $rr['dtstart'], 'c') : datetime_convert('UTC', 'UTC', $rr['dtstart'], 'c'));
if ($rr['nofinish']){
$end = null;
} else {
$end = (($rr['adjust']) ? datetime_convert($tz, date_default_timezone_get(), $rr['dtend'], 'c') : datetime_convert('UTC', 'UTC', $rr['dtend'], 'c'));
}
}
$events=array();
$last_date = '';
$fmt = t('l, F j');
if($r) {
foreach($r as $rr) {
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], $fmt) : datetime_convert('UTC','UTC',$rr['dtstart'],$fmt));
$d = day_translate($d);
$start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'c') : datetime_convert('UTC','UTC',$rr['dtstart'],'c'));
if ($rr['nofinish']){
$end = null;
} else {
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtend'], 'c') : datetime_convert('UTC','UTC',$rr['dtend'],'c'));
}
$is_first = ($d !== $last_date);
$last_date = $d;
$edit = false;
$drop = false;
$title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8'));
if(! $title) {
list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
$title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
}
$html = '';
if (x($_GET,'id')) {
$rr['timezone'] = $tz;
$html = format_event_html($rr);
$rr['desc'] = zidify_links(smilies(bbcode($rr['desc'])));
$rr['description'] = htmlentities(html2plain(bbcode($rr['description'])),ENT_COMPAT,'UTF-8',false);
$rr['location'] = zidify_links(smilies(bbcode($rr['location'])));
$events[] = array(
'id'=>$rr['id'],
'hash' => $rr['event_hash'],
'start'=> $start,
'end' => $end,
'drop' => $drop,
'allDay' => false,
'title' => $title,
'j' => $j,
'd' => $d,
'edit' => $edit,
'is_first'=>$is_first,
'item'=>$rr,
'html'=>$html,
'plink' => array($rr['plink'],t('Link to Source'),'',''),
);
}
$events[] = array(
'calendar_id' => 'channel_calendar',
'rw' => true,
'id'=>$rr['id'],
'uri' => $rr['event_hash'],
'timezone' => $tz,
'start'=> $start,
'end' => $end,
'drop' => $drop,
'allDay' => (($rr['adjust']) ? 0 : 1),
'title' => html_entity_decode($rr['summary'], ENT_COMPAT, 'UTF-8'),
'editable' => $edit ? true : false,
'item' => $rr,
'plink' => [$rr['plink'], t('Link to source')],
'description' => html_entity_decode($rr['description'], ENT_COMPAT, 'UTF-8'),
'location' => html_entity_decode($rr['location'], ENT_COMPAT, 'UTF-8'),
'allow_cid' => expand_acl($rr['allow_cid']),
'allow_gid' => expand_acl($rr['allow_gid']),
'deny_cid' => expand_acl($rr['deny_cid']),
'deny_gid' => expand_acl($rr['deny_gid']),
'html' => $html
);
}
if (argv(2) === 'json'){
echo json_encode($events); killme();
}
// links: array('href', 'text', 'extra css classes', 'title')
if (x($_GET,'id')){
$tpl = get_markup_template("event_cal.tpl");
}
else {
$tpl = get_markup_template("events_cal-js.tpl");
}
$nick = $channel['channel_address'];
$o = replace_macros($tpl, array(
'$baseurl' => z_root(),
'$new_event' => array(z_root().'/cal',(($event_id) ? t('Edit Event') : t('Create Event')),'',''),
'$previus' => array(z_root()."/cal/$nick/$prevyear/$prevmonth",t('Previous'),'',''),
'$next' => array(z_root()."/cal/$nick/$nextyear/$nextmonth",t('Next'),'',''),
'$export' => array(z_root()."/cal/$nick/$y/$m/export",t('Export'),'',''),
'$calendar' => cal($y,$m,$links, ' eventcal'),
'$events' => $events,
'$upload' => t('Import'),
'$submit' => t('Submit'),
'$prev' => t('Previous'),
'$next' => t('Next'),
'$today' => t('Today'),
'$form' => $form,
'$expandform' => ((x($_GET,'expandform')) ? true : false)
));
if (x($_GET,'id')){ echo $o; killme(); }
return $o;
}
if (argv(2) === 'json') {
echo json_encode($events);
killme();
}
if (x($_GET,'id')) {
$o = replace_macros(get_markup_template("cal_event.tpl"), [
'$events' => $events
]);
echo $o;
killme();
}
$nick = $channel['channel_address'];
$sources = '{
id: \'channel_calendar\',
url: \'/cal/' . $nick . '/json/\',
color: \'#3a87ad\'
}';
$o = replace_macros(get_markup_template("cal_calendar.tpl"), [
'$sources' => $sources,
'$lang' => App::$language,
'$timezone' => date_default_timezone_get(),
'$first_day' => $first_day,
'$prev' => t('Previous'),
'$next' => t('Next'),
'$today' => t('Today'),
'$title' => $title,
'$dtstart' => $dtstart,
'$dtend' => $dtend,
'$nick' => $nick
]);
return $o;
}

View File

@@ -145,7 +145,7 @@ class Cards extends Controller {
$itemspage = get_pconfig(local_channel(),'system','itemspage');
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 10));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));

File diff suppressed because it is too large Load Diff

View File

@@ -6,13 +6,14 @@ namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\PermissionDescription;
use Zotlabs\Zot6\HTTPSig;
use Zotlabs\Web\HTTPSig;
use Zotlabs\Lib\Libzot;
require_once('include/items.php');
require_once('include/security.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
require_once('include/opengraph.php');
/**
@@ -46,14 +47,14 @@ class Channel extends Controller {
$channel = App::get_channel();
if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
$which = $channel['channel_address'];
$profile = argv(1);
}
$which = $channel['channel_address'];
$profile = argv(1);
}
$channel = channelx_by_nick($which);
if(! $channel) {
http_status_exit(404, 'Not found');
}
if(! $channel) {
http_status_exit(404, 'Not found');
}
// handle zot6 channel discovery
@@ -109,8 +110,20 @@ class Channel extends Controller {
// Run profile_load() here to make sure the theme is set before
// we start loading content
profile_load($which,$profile);
// Add Opengraph markup
$mid = ((x($_REQUEST,'mid')) ? $_REQUEST['mid'] : '');
if(strpos($mid,'b64.') === 0)
$mid = @base64url_decode(substr($mid,4));
if($mid)
$r = q("SELECT * FROM item WHERE mid = '%s' AND uid = %d AND item_private = 0 LIMIT 1",
dbesc($mid),
intval($channel['channel_id'])
);
opengraph_add_meta($r ? $r[0] : [], $channel);
}
function get($update = 0, $load = false) {
@@ -226,8 +239,12 @@ class Channel extends Controller {
/**
* Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups
*/
$item_normal = item_normal();
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_deleted = 0
and item.item_unpublished = 0 and item.item_pending_remove = 0
and item.item_blocked = 0 ";
if (! $is_owner)
$item_normal .= "and item.item_delayed = 0 ";
$item_normal_update = item_normal_update();
$sql_extra = item_permissions_sql(App::$profile['profile_uid']);
@@ -310,10 +327,6 @@ class Channel extends Controller {
$sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
}
if($datequery || $datequery2) {
$sql_extra2 .= " and item.item_thread_top != 0 ";
}
if($order === 'post')
$ordering = "created";
else
@@ -321,7 +334,7 @@ class Channel extends Controller {
$itemspage = get_pconfig(local_channel(),'system','itemspage');
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 10));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
if($noscript_content || $load) {
@@ -342,7 +355,7 @@ class Channel extends Controller {
AND (abook.abook_blocked = 0 or abook.abook_flags is null)
AND item.item_wall = 1 AND item.item_thread_top = 1
$sql_extra $sql_extra2
ORDER BY $ordering DESC $pager_sql ",
ORDER BY $ordering DESC, item_id $pager_sql ",
intval(App::$profile['profile_uid'])
);
}
@@ -355,7 +368,7 @@ class Channel extends Controller {
$parents_str = ids_to_querystr($r,'item_id');
$items = q("SELECT item.*, item.id AS item_id
$r = q("SELECT item.*, item.id AS item_id
FROM item
WHERE item.uid = %d $item_normal
AND item.parent IN ( %s )
@@ -364,8 +377,8 @@ class Channel extends Controller {
dbesc($parents_str)
);
xchan_query($items);
$items = fetch_post_tags($items, true);
xchan_query($r);
$items = fetch_post_tags($r, true);
$items = conv_sort($items,$ordering);
if($load && $mid && (! count($items))) {
@@ -410,6 +423,7 @@ class Channel extends Controller {
'$nouveau' => '0',
'$wall' => '1',
'$fh' => '0',
'$dm' => '0',
'$static' => $static,
'$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
'$search' => $search,
@@ -428,36 +442,11 @@ class Channel extends Controller {
}
$update_unseen = '';
if($page_mode === 'list') {
/**
* in "list mode", only mark the parent item and any like activities as "seen".
* We won't distinguish between comment likes and post likes. The important thing
* is that the number of unseen comments will be accurate. The SQL to separate the
* comment likes could also get somewhat hairy.
*/
if($parents_str) {
$update_unseen = " AND ( id IN ( " . dbesc($parents_str) . " )";
$update_unseen .= " OR ( parent IN ( " . dbesc($parents_str) . " ) AND verb in ( '" . dbesc(ACTIVITY_LIKE) . "','" . dbesc(ACTIVITY_DISLIKE) . "' ))) ";
}
}
else {
if($parents_str) {
$update_unseen = " AND parent IN ( " . dbesc($parents_str) . " )";
}
}
if($is_owner && $update_unseen) {
$x = [ 'channel_id' => local_channel(), 'update' => 'unset' ];
call_hooks('update_unseen',$x);
if($x['update'] === 'unset' || intval($x['update'])) {
$r = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 and item_wall = 1 AND uid = %d $update_unseen",
intval(local_channel())
);
}
// Add pinned content
if(! x($_REQUEST,'mid') && ! $search) {
$pinned = new \Zotlabs\Widget\Pinned;
$r = $pinned->widget(intval(App::$profile['profile_uid']), [ITEM_TYPE_POST]);
$o .= $r['html'];
}
$mode = (($search) ? 'search' : 'channel');

View File

@@ -0,0 +1,501 @@
<?php
namespace Zotlabs\Module;
use Zotlabs\Lib\Libsync;
require_once('include/conversation.php');
require_once('include/bbcode.php');
require_once('include/datetime.php');
require_once('include/event.php');
require_once('include/items.php');
require_once('include/html2plain.php');
class Channel_calendar extends \Zotlabs\Web\Controller {
function post() {
logger('post: ' . print_r($_REQUEST,true), LOGGER_DATA);
if(! local_channel())
return;
$event_id = ((x($_POST,'event_id')) ? intval($_POST['event_id']) : 0);
$event_hash = ((x($_POST,'event_hash')) ? $_POST['event_hash'] : '');
$xchan = ((x($_POST,'xchan')) ? dbesc($_POST['xchan']) : '');
$uid = local_channel();
// only allow editing your own events.
if(($xchan) && ($xchan !== get_observer_hash()))
return;
$categories = escape_tags(trim($_POST['categories']));
// allday events have adjust = 0, normal events have adjust = 1
$adjust = intval($_POST['adjust']);
$start = datetime_convert((($adjust) ? $tz : 'UTC'), 'UTC', escape_tags($_REQUEST['dtstart']));
$finish = datetime_convert((($adjust) ? $tz : 'UTC'), 'UTC', escape_tags($_REQUEST['dtend']));
$timezone = ((x($_POST,'timezone_select')) ? escape_tags(trim($_POST['timezone_select'])) : '');
$tz = (($timezone) ? $timezone : date_default_timezone_get());
if(! $adjust)
$tz = 'UTC';
$summary = escape_tags(trim($_POST['summary']));
$desc = escape_tags(trim($_POST['desc']));
$location = escape_tags(trim($_POST['location']));
$type = escape_tags(trim($_POST['type']));
// Don't allow the event to finish before it begins.
// It won't hurt anything, but somebody will file a bug report
// and we'll waste a bunch of time responding to it. Time that
// could've been spent doing something else.
if(strcmp($finish,$start) < 0 && !$nofinish) {
notice( t('Event can not end before it has started.') . EOL);
if(intval($_REQUEST['preview'])) {
echo( t('Unable to generate preview.'));
}
killme();
}
if((! $summary) || (! $start)) {
notice( t('Event title and start time are required.') . EOL);
if(intval($_REQUEST['preview'])) {
echo( t('Unable to generate preview.'));
}
killme();
}
$channel = \App::get_channel();
$acl = new \Zotlabs\Access\AccessList(false);
if($event_id) {
$x = q("select * from event where id = %d and uid = %d limit 1",
intval($event_id),
intval(local_channel())
);
if(! $x) {
notice( t('Event not found.') . EOL);
if(intval($_REQUEST['preview'])) {
echo( t('Unable to generate preview.'));
killme();
}
return;
}
$acl->set($x[0]);
$created = $x[0]['created'];
$edited = datetime_convert();
}
else {
$created = $edited = datetime_convert();
$acl->set_from_array($_POST);
}
$post_tags = array();
$channel = \App::get_channel();
$ac = $acl->get();
$str_contact_allow = $ac['allow_cid'];
$str_group_allow = $ac['allow_gid'];
$str_contact_deny = $ac['deny_cid'];
$str_group_deny = $ac['deny_gid'];
$private = $acl->is_private();
require_once('include/text.php');
$results = linkify_tags($desc, local_channel());
if($results) {
// Set permissions based on tag replacements
set_linkified_perms($results, $str_contact_allow, $str_group_allow, local_channel(), false, $private);
foreach($results as $result) {
$success = $result['success'];
if($success['replaced']) {
$post_tags[] = array(
'uid' => local_channel(),
'ttype' => $success['termtype'],
'otype' => TERM_OBJ_POST,
'term' => $success['term'],
'url' => $success['url']
);
}
}
}
if(strlen($categories)) {
$cats = explode(',',$categories);
foreach($cats as $cat) {
$post_tags[] = array(
'uid' => local_channel(),
'ttype' => TERM_CATEGORY,
'otype' => TERM_OBJ_POST,
'term' => trim($cat),
'url' => $channel['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
);
}
}
$datarray = array();
$datarray['dtstart'] = $start;
$datarray['dtend'] = $finish;
$datarray['summary'] = $summary;
$datarray['description'] = $desc;
$datarray['location'] = $location;
$datarray['etype'] = $type;
$datarray['adjust'] = $adjust;
$datarray['nofinish'] = 0;
$datarray['uid'] = local_channel();
$datarray['account'] = get_account_id();
$datarray['event_xchan'] = $channel['channel_hash'];
$datarray['allow_cid'] = $str_contact_allow;
$datarray['allow_gid'] = $str_group_allow;
$datarray['deny_cid'] = $str_contact_deny;
$datarray['deny_gid'] = $str_group_deny;
$datarray['private'] = intval($private);
$datarray['id'] = $event_id;
$datarray['created'] = $created;
$datarray['edited'] = $edited;
$datarray['timezone'] = $tz;
if(intval($_REQUEST['preview'])) {
$html = format_event_html($datarray);
echo $html;
killme();
}
$event = event_store_event($datarray);
if($post_tags)
$datarray['term'] = $post_tags;
$item_id = event_store_item($datarray,$event);
if($item_id) {
$r = q("select * from item where id = %d",
intval($item_id)
);
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
$z = q("select * from event where event_hash = '%s' and uid = %d limit 1",
dbesc($r[0]['resource_id']),
intval($channel['channel_id'])
);
if($z) {
Libsync::build_sync_packet($channel['channel_id'],array('event_item' => array(encode_item($sync_item[0],true)),'event' => $z));
}
}
}
\Zotlabs\Daemon\Master::Summon(array('Notifier','event',$item_id));
killme();
}
function get() {
if(argc() > 2 && argv(1) == 'ical') {
$event_id = argv(2);
require_once('include/security.php');
$sql_extra = permissions_sql(local_channel());
$r = q("select * from event where event_hash = '%s' $sql_extra limit 1",
dbesc($event_id)
);
if($r) {
header('Content-type: text/calendar');
header('content-disposition: attachment; filename="' . t('event') . '-' . $event_id . '.ics"' );
echo ical_wrapper($r);
killme();
}
else {
notice( t('Event not found.') . EOL );
return;
}
}
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return;
}
if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
$r = q("update event set dismissed = 1 where id = %d and uid = %d",
intval(argv(2)),
intval(local_channel())
);
}
if((argc() > 2) && (argv(1) === 'unignore') && intval(argv(2))) {
$r = q("update event set dismissed = 0 where id = %d and uid = %d",
intval(argv(2)),
intval(local_channel())
);
}
$channel = \App::get_channel();
$mode = 'view';
$export = false;
$ignored = ((x($_REQUEST,'ignored')) ? " and dismissed = " . intval($_REQUEST['ignored']) . " " : '');
if(argc() > 1) {
if(argc() > 2 && argv(1) === 'add') {
$mode = 'add';
$item_id = intval(argv(2));
}
if(argc() > 2 && argv(1) === 'drop') {
$mode = 'drop';
$event_id = argv(2);
}
if(argc() <= 2 && argv(1) === 'export') {
$export = true;
}
if(argc() > 2 && intval(argv(1)) && intval(argv(2))) {
$mode = 'view';
}
if(argc() <= 2) {
$mode = 'view';
$event_id = argv(1);
}
}
if($mode === 'add') {
event_addtocal($item_id,local_channel());
killme();
}
if($mode == 'view') {
/* edit/create form */
if($event_id) {
$r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($event_id),
intval(local_channel())
);
if(count($r))
$orig_event = $r[0];
}
$channel = \App::get_channel();
if (argv(1) === 'json'){
if (x($_GET,'start')) $start = $_GET['start'];
if (x($_GET,'end')) $finish = $_GET['end'];
}
$start = datetime_convert('UTC','UTC',$start);
$finish = datetime_convert('UTC','UTC',$finish);
$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
if (x($_GET,'id')){
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan, item.id as item_id
from event left join item on item.resource_id = event.event_hash
where item.resource_type = 'event' and event.uid = %d and event.id = %d limit 1",
intval(local_channel()),
intval($_GET['id'])
);
}
elseif($export) {
$r = q("SELECT event.*, item.id as item_id
from event left join item on item.resource_id = event.event_hash
where event.uid = %d and event.dtstart > '%s' and event.dtend > event.dtstart",
intval(local_channel()),
dbesc(NULL_DATE)
);
}
else {
// fixed an issue with "nofinish" events not showing up in the calendar.
// There's still an issue if the finish date crosses the end of month.
// Noting this for now - it will need to be fixed here and in Friendica.
// Ultimately the finish date shouldn't be involved in the query.
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan, item.id as item_id
from event left join item on event.event_hash = item.resource_id
where item.resource_type = 'event' and event.uid = %d and event.uid = item.uid $ignored
AND (( event.adjust = 0 AND ( event.dtend >= '%s' or event.nofinish = 1 ) AND event.dtstart <= '%s' )
OR ( event.adjust = 1 AND ( event.dtend >= '%s' or event.nofinish = 1 ) AND event.dtstart <= '%s' )) ",
intval(local_channel()),
dbesc($start),
dbesc($finish),
dbesc($adjust_start),
dbesc($adjust_finish)
);
}
if($r && ! $export) {
xchan_query($r);
$r = fetch_post_tags($r,true);
$r = sort_by_date($r);
}
$events = [];
if($r) {
foreach($r as $rr) {
$start = (($rr['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $rr['dtstart'], 'c') : datetime_convert('UTC', 'UTC', $rr['dtstart'], 'c'));
if ($rr['nofinish']){
$end = null;
} else {
$end = (($rr['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $rr['dtend'], 'c') : datetime_convert('UTC', 'UTC', $rr['dtend'], 'c'));
}
$catsenabled = feature_enabled(local_channel(),'categories');
$categories = '';
if($catsenabled){
if($rr['term']) {
$cats = get_terms_oftype($rr['term'], TERM_CATEGORY);
foreach ($cats as $cat) {
if(strlen($categories))
$categories .= ', ';
$categories .= $cat['term'];
}
}
}
$edit = ((local_channel() && $rr['author_xchan'] == get_observer_hash()) ? array(z_root().'/events/'.$rr['event_hash'].'?expandform=1',t('Edit event'),'','') : false);
$drop = array(z_root().'/events/drop/'.$rr['event_hash'],t('Delete event'),'','');
$tz = get_iconfig($rr, 'event', 'timezone');
if(! $tz)
$tz = 'UTC';
$events[] = array(
'calendar_id' => 'channel_calendar',
'rw' => true,
'id'=>$rr['id'],
'uri' => $rr['event_hash'],
'timezone' => $tz,
'start'=> $start,
'end' => $end,
'drop' => $drop,
'allDay' => (($rr['adjust']) ? 0 : 1),
'title' => html_entity_decode($rr['summary'], ENT_COMPAT, 'UTF-8'),
'editable' => $edit ? true : false,
'item' => $rr,
'plink' => [$rr['plink'], t('Link to source')],
'description' => html_entity_decode($rr['description'], ENT_COMPAT, 'UTF-8'),
'location' => html_entity_decode($rr['location'], ENT_COMPAT, 'UTF-8'),
'allow_cid' => expand_acl($rr['allow_cid']),
'allow_gid' => expand_acl($rr['allow_gid']),
'deny_cid' => expand_acl($rr['deny_cid']),
'deny_gid' => expand_acl($rr['deny_gid']),
'categories' => $categories
);
}
}
if($export) {
header('Content-type: text/calendar');
header('content-disposition: attachment; filename="' . t('calendar') . '-' . $channel['channel_address'] . '.ics"' );
echo ical_wrapper($r);
killme();
}
if (\App::$argv[1] === 'json'){
json_return_and_die($events);
}
}
if($mode === 'drop' && $event_id) {
$r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($event_id),
intval(local_channel())
);
$sync_event = $r[0];
if($r) {
$r = q("delete from event where event_hash = '%s' and uid = %d",
dbesc($event_id),
intval(local_channel())
);
if($r) {
$sync_event['event_deleted'] = 1;
Libsync::build_sync_packet(0,array('event' => array($sync_event)));
$i = q("select * from item where resource_type = 'event' and resource_id = '%s' and uid = %d",
dbesc($event_id),
intval(local_channel())
);
if ($i) {
$can_delete = false;
$local_delete = true;
$ob_hash = get_observer_hash();
if($ob_hash && ($ob_hash === $i[0]['author_xchan'] || $ob_hash === $i[0]['owner_xchan'] || $ob_hash === $i[0]['source_xchan'])) {
$can_delete = true;
}
// The site admin can delete any post/item on the site.
// If the item originated on this site+channel the deletion will propagate downstream.
// Otherwise just the local copy is removed.
if(is_site_admin()) {
$local_delete = true;
if(intval($i[0]['item_origin']))
$can_delete = true;
}
if($can_delete || $local_delete) {
// if this is a different page type or it's just a local delete
// but not by the item author or owner, do a simple deletion
$complex = false;
if(intval($i[0]['item_type']) || ($local_delete && (! $can_delete))) {
drop_item($i[0]['id']);
}
else {
// complex deletion that needs to propagate and be performed in phases
drop_item($i[0]['id'],true,DROPITEM_PHASE1);
$complex = true;
}
$ii = q("select * from item where id = %d",
intval($i[0]['id'])
);
if($ii) {
xchan_query($ii);
$sync_item = fetch_post_tags($ii);
Libsync::build_sync_packet($i[0]['uid'],array('item' => array(encode_item($sync_item[0],true))));
}
if($complex) {
tag_deliver($i[0]['uid'],$i[0]['id']);
}
}
}
killme();
}
notice( t('Failed to remove event' ) . EOL);
killme();
}
}
}
}

View File

@@ -1,31 +1,35 @@
<?php
namespace Zotlabs\Module;
require_once('include/zot.php');
use App;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Webfinger;
use Zotlabs\Lib\Zotfinger;
class Chanview extends \Zotlabs\Web\Controller {
function get() {
$observer = \App::get_observer();
$observer = App::get_observer();
$xchan = null;
$r = null;
if($_REQUEST['hash']) {
$r = q("select * from xchan where xchan_hash = '%s' limit 1",
$r = q("select * from xchan where xchan_hash = '%s'",
dbesc($_REQUEST['hash'])
);
}
if($_REQUEST['address']) {
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
$r = q("select * from xchan where xchan_addr = '%s'",
dbesc(punify($_REQUEST['address']))
);
}
elseif(local_channel() && intval($_REQUEST['cid'])) {
$r = q("SELECT abook.*, xchan.*
FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d and abook_id = %d LIMIT 1",
WHERE abook_channel = %d and abook_id = %d",
intval(local_channel()),
intval($_REQUEST['cid'])
);
@@ -35,12 +39,12 @@ class Chanview extends \Zotlabs\Web\Controller {
// if somebody re-installed they will have more than one xchan, use the most recent name date as this is
// the most useful consistently ascending table item we have.
$r = q("select * from xchan where xchan_url = '%s' order by xchan_name_date desc limit 1",
$r = q("select * from xchan where xchan_url = '%s' order by xchan_name_date desc",
dbesc($_REQUEST['url'])
);
}
if($r) {
\App::$poi = $r[0];
App::$poi = Libzot::zot_record_preferred($r, 'xchan_network');
}
@@ -49,74 +53,63 @@ class Chanview extends \Zotlabs\Web\Controller {
// address, we can and should try to import it. If it's just a hash, we can't continue, but we
// probably wouldn't have a hash if we don't already have an xchan for this channel.
if(! \App::$poi) {
if(! App::$poi) {
logger('mod_chanview: fallback');
// This is hackish - construct a zot address from the url
if($_REQUEST['url']) {
if(preg_match('/https?\:\/\/(.*?)(\/channel\/|\/profile\/)(.*?)$/ism',$_REQUEST['url'],$matches)) {
$_REQUEST['address'] = $matches[3] . '@' . $matches[1];
if($_REQUEST['address']) {
$href = Webfinger::zot_url(punify($_REQUEST['address']));
if($href) {
$_REQUEST['url'] = $href;
}
logger('mod_chanview: constructed address ' . print_r($matches,true));
}
$r = null;
if($_REQUEST['address']) {
$j = \Zotlabs\Zot\Finger::run($_REQUEST['address'],null);
if($j['success']) {
import_xchan($j);
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
dbesc($_REQUEST['address'])
if($_REQUEST['url']) {
$zf = Zotfinger::exec($_REQUEST['url'], null);
if(array_path_exists('signature/signer',$zf) && $zf['signature']['signer'] === $_REQUEST['url'] && intval($zf['signature']['header_valid'])) {
Libzot::import_xchan($j);
$r = q("select * from xchan where xchan_url = '%s'",
dbesc($_REQUEST['url'])
);
if($r) {
\App::$poi = $r[0];
App::$poi = Libzot::zot_record_preferred($r, 'xchan_network');
}
}
if(! $r) {
if(discover_by_webbie($_REQUEST['address'])) {
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
dbesc($_REQUEST['address'])
if(discover_by_webbie($_REQUEST['url'])) {
$r = q("select * from xchan where xchan_url = '%s'",
dbesc($_REQUEST['url'])
);
if($r) {
\App::$poi = $r[0];
App::$poi = Libzot::zot_record_preferred($r, 'xchan_network');
}
}
}
}
}
if(! \App::$poi) {
// We don't know who this is, and we can't figure it out from the URL
// On the plus side, there's a good chance we know somebody else at that
// hub so sending them there with a Zid will probably work anyway.
$url = ($_REQUEST['url']);
if(! $url) {
notice( t('Channel not found.') . EOL);
return;
}
if($observer)
$url = zid($url);
if(! App::$poi) {
notice( t('Channel not found.') . EOL);
return;
}
$is_zot = false;
$connected = false;
if (\App::$poi) {
$url = \App::$poi['xchan_url'];
if(in_array(\App::$poi['xchan_network'], ['zot', 'zot6'])) {
$is_zot = true;
}
if(local_channel()) {
$c = q("select abook_id from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
intval(local_channel()),
dbesc(\App::$poi['xchan_hash'])
);
if($c)
$connected = true;
}
$url = App::$poi['xchan_url'];
if(in_array(App::$poi['xchan_network'], ['zot', 'zot6'])) {
$is_zot = true;
}
if(local_channel()) {
$c = q("select abook_id from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
intval(local_channel()),
dbesc(App::$poi['xchan_hash'])
);
if($c)
$connected = true;
}
// We will load the chanview template if it's a foreign network,

View File

@@ -7,9 +7,7 @@ use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Chatroom;
use Zotlabs\Access\AccessList;
use Zotlabs\Lib\Libsync;
require_once('include/bookmarks.php');
@@ -80,7 +78,7 @@ class Chat extends Controller {
intval(local_channel())
);
build_sync_packet(0, array('chatroom' => $x));
Libsync::build_sync_packet(0, array('chatroom' => $x));
if($x)
goaway(z_root() . '/chat/' . $channel['channel_address'] . '/' . $x[0]['cr_id']);
@@ -199,7 +197,7 @@ class Chat extends Controller {
$cipher = get_pconfig(local_channel(),'system','default_cipher');
if(! $cipher)
$cipher = 'aes256';
$cipher = 'AES-128-CCM';
$o = replace_macros(get_markup_template('chat.tpl'),array(

View File

@@ -35,13 +35,6 @@ class Cloud extends \Zotlabs\Web\Controller {
if (argc() > 1)
$which = argv(1);
if (argc() < 2 && intval(get_config('system','cloud_disable_siteroot'))) {
notice( t('Permission denied.') . EOL);
construct_page();
killme();
}
$profile = 0;
if ($which)

View File

@@ -28,10 +28,6 @@ class Connect extends Controller {
$channel_id = App::$data['channel']['channel_id'];
if(! Apps::system_app_installed($channel_id, 'Premium Channel')) {
return;
}
profile_load($which,'');
}
@@ -42,10 +38,6 @@ class Connect extends Controller {
$channel_id = App::$data['channel']['channel_id'];
if(! Apps::system_app_installed($channel_id, 'Premium Channel')) {
return;
}
$edit = ((local_channel() && (local_channel() == $channel_id)) ? true : false);
if($edit) {
@@ -97,15 +89,6 @@ class Connect extends Controller {
$channel_id = App::$data['channel']['channel_id'];
if(! Apps::system_app_installed($channel_id, 'Premium Channel')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Premium Channel App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Allows you to set restrictions and terms on those that connect with your channel');
return $o;
}
$edit = ((local_channel() && (local_channel() == $channel_id)) ? true : false);
$text = get_pconfig($channel_id,'system','selltext');

View File

@@ -34,7 +34,7 @@ class Connections extends \Zotlabs\Web\Controller {
}
nav_set_selected('Connections');
$active = false;
$blocked = false;
$hidden = false;
@@ -283,6 +283,28 @@ class Connections extends \Zotlabs\Web\Controller {
if(! intval(get_abconfig(local_channel(),$rr['xchan_hash'],'their_perms','post_comments'))) {
$oneway = true;
}
$perminfo['connpermcount']=0;
$perminfo['connperms']=t('Accepts').': ';
if(intval(get_abconfig(local_channel(),$rr['xchan_hash'],'their_perms','post_comments'))) {
$perminfo['connpermcount']++;
$perminfo['connperms'] .= t('Comments');
}
if(intval(get_abconfig(local_channel(),$rr['xchan_hash'],'their_perms','send_stream'))) {
$perminfo['connpermcount']++;
$perminfo['connperms'] = ($perminfo['connperms']) ? $perminfo['connperms'] . ', ' : $perminfo['connperms'] ;
$perminfo['connperms'] .= t('Stream items');
}
if(intval(get_abconfig(local_channel(),$rr['xchan_hash'],'their_perms','post_wall'))) {
$perminfo['connpermcount']++;
$perminfo['connperms'] = ($perminfo['connperms']) ? $perminfo['connperms'] . ', ' : $perminfo['connperms'] ;
$perminfo['connperms'] .= t('Wall posts');
}
if ($perminfo['connpermcount'] == 0) {
$perminfo['connperms'] .= t('Nothing');
}
foreach($status as $str) {
if(!$str)
@@ -322,7 +344,11 @@ class Connections extends \Zotlabs\Web\Controller {
'ignore' => ((! $rr['abook_ignored']) ? t('Ignore') : false),
'recent_label' => t('Recent activity'),
'recentlink' => z_root() . '/network/?f=&cid=' . intval($rr['abook_id']) . '&name=' . $rr['xchan_name'],
'oneway' => $oneway
'oneway' => $oneway,
'perminfo' => $perminfo,
'connect' => (intval($rr['abook_not_here']) ? t('Connect') : ''),
'follow' => z_root() . '/follow/?f=&url=' . urlencode($rr['xchan_hash']) . '&interactive=0',
'connect_hover' => t('Connect at this location')
);
}
}

View File

@@ -7,8 +7,16 @@ namespace Zotlabs\Module;
*
*/
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Libsync;
use Zotlabs\Daemon\Master;
use Zotlabs\Web\Controller;
use Zotlabs\Access\Permissions;
use Zotlabs\Access\PermissionLimits;
use Zotlabs\Web\HTTPHeaders;
use Zotlabs\Lib\Permcat;
require_once('include/socgraph.php');
require_once('include/selectors.php');
@@ -16,7 +24,7 @@ require_once('include/group.php');
require_once('include/photos.php');
class Connedit extends \Zotlabs\Web\Controller {
class Connedit extends Controller {
/* @brief Initialize the connection-editor
*
@@ -36,12 +44,12 @@ class Connedit extends \Zotlabs\Web\Controller {
intval(argv(1))
);
if($r) {
\App::$poi = array_shift($r);
App::$poi = array_shift($r);
}
}
$channel = \App::get_channel();
$channel = App::get_channel();
if($channel)
head_set_icon($channel['xchan_photo_s']);
@@ -61,7 +69,7 @@ class Connedit extends \Zotlabs\Web\Controller {
if(! $contact_id)
return;
$channel = \App::get_channel();
$channel = App::get_channel();
// TODO if configured for hassle-free permissions, we'll post the form with ajax as soon as the
// connection enable is toggled to a special autopost url and set permissions immediately, leaving
@@ -140,7 +148,7 @@ class Connedit extends \Zotlabs\Web\Controller {
$rating_text = trim(escape_tags($_REQUEST['rating_text']));
$all_perms = \Zotlabs\Access\Permissions::Perms();
$all_perms = Permissions::Perms();
if($all_perms) {
foreach($all_perms as $perm => $desc) {
@@ -212,7 +220,7 @@ class Connedit extends \Zotlabs\Web\Controller {
$record = $z[0]['xlink_id'];
}
if($record) {
\Zotlabs\Daemon\Master::Summon(array('Ratenotif','rating',$record));
Master::Summon(array('Ratenotif','rating',$record));
}
}
@@ -227,7 +235,7 @@ class Connedit extends \Zotlabs\Web\Controller {
// request. The workaround is to approve the connection, then go back and
// adjust permissions as desired.
$p = \Zotlabs\Access\Permissions::connect_perms(local_channel());
$p = Permissions::connect_perms(local_channel());
$my_perms = $p['perms'];
if($my_perms) {
foreach($my_perms as $k => $v) {
@@ -257,12 +265,12 @@ class Connedit extends \Zotlabs\Web\Controller {
else
notice( t('Failed to update connection record.') . EOL);
if(! intval(\App::$poi['abook_self'])) {
if(! intval(App::$poi['abook_self'])) {
if($new_friend) {
\Zotlabs\Daemon\Master::Summon( [ 'Notifier', 'permission_accept', $contact_id ] );
Master::Summon( [ 'Notifier', 'permission_accept', $contact_id ] );
}
\Zotlabs\Daemon\Master::Summon( [
Master::Summon( [
'Notifier',
(($new_friend) ? 'permission_create' : 'permission_update'),
$contact_id
@@ -275,7 +283,7 @@ class Connedit extends \Zotlabs\Web\Controller {
require_once('include/group.php');
$g = group_rec_byhash(local_channel(),$default_group);
if($g)
group_add_member(local_channel(),'',\App::$poi['abook_xchan'],$g['id']);
group_add_member(local_channel(),'',App::$poi['abook_xchan'],$g['id']);
}
// Check if settings permit ("post new friend activity" is allowed, and
@@ -299,19 +307,19 @@ class Connedit extends \Zotlabs\Web\Controller {
$xarr['item_private'] = (($xarr['allow_cid']||$xarr['allow_gid']||$xarr['deny_cid']||$xarr['deny_gid']) ? 1 : 0);
$obj = array(
'type' => ACTIVITY_OBJ_PERSON,
'title' => \App::$poi['xchan_name'],
'id' => \App::$poi['xchan_hash'],
'title' => App::$poi['xchan_name'],
'id' => App::$poi['xchan_hash'],
'link' => array(
array('rel' => 'alternate', 'type' => 'text/html', 'href' => \App::$poi['xchan_url']),
array('rel' => 'photo', 'type' => \App::$poi['xchan_photo_mimetype'], 'href' => \App::$poi['xchan_photo_l'])
array('rel' => 'alternate', 'type' => 'text/html', 'href' => App::$poi['xchan_url']),
array('rel' => 'photo', 'type' => App::$poi['xchan_photo_mimetype'], 'href' => App::$poi['xchan_photo_l'])
),
);
$xarr['obj'] = json_encode($obj);
$xarr['obj_type'] = ACTIVITY_OBJ_PERSON;
$xarr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t('is now connected to') . ' ' . '[zrl=' . \App::$poi['xchan_url'] . ']' . \App::$poi['xchan_name'] . '[/zrl]';
$xarr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t('is now connected to') . ' ' . '[zrl=' . App::$poi['xchan_url'] . ']' . App::$poi['xchan_name'] . '[/zrl]';
$xarr['body'] .= "\n\n\n" . '[zrl=' . \App::$poi['xchan_url'] . '][zmg=80x80]' . \App::$poi['xchan_photo_m'] . '[/zmg][/zrl]';
$xarr['body'] .= "\n\n\n" . '[zrl=' . App::$poi['xchan_url'] . '][zmg=80x80]' . App::$poi['xchan_photo_m'] . '[/zmg][/zrl]';
post_activity_item($xarr);
@@ -319,7 +327,7 @@ class Connedit extends \Zotlabs\Web\Controller {
// pull in a bit of content if there is any to pull in
\Zotlabs\Daemon\Master::Summon(array('Onepoll',$contact_id));
Master::Summon(array('Onepoll',$contact_id));
}
@@ -332,11 +340,11 @@ class Connedit extends \Zotlabs\Web\Controller {
intval($contact_id)
);
if($r) {
\App::$poi = $r[0];
App::$poi = $r[0];
}
if($new_friend) {
$arr = array('channel_id' => local_channel(), 'abook' => \App::$poi);
$arr = array('channel_id' => local_channel(), 'abook' => App::$poi);
call_hooks('accept_follow', $arr);
}
@@ -356,23 +364,23 @@ class Connedit extends \Zotlabs\Web\Controller {
function connedit_clone(&$a) {
if(! \App::$poi)
if(! App::$poi)
return;
$channel = \App::get_channel();
$channel = App::get_channel();
$r = q("SELECT abook.*, xchan.*
FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d and abook_id = %d LIMIT 1",
intval(local_channel()),
intval(\App::$poi['abook_id'])
intval(App::$poi['abook_id'])
);
if($r) {
\App::$poi = array_shift($r);
App::$poi = array_shift($r);
}
$clone = \App::$poi;
$clone = App::$poi;
unset($clone['abook_id']);
unset($clone['abook_account']);
@@ -382,7 +390,7 @@ class Connedit extends \Zotlabs\Web\Controller {
if($abconfig)
$clone['abconfig'] = $abconfig;
build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
Libsync::build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
}
/* @brief Generate content of connection edit page
@@ -401,11 +409,11 @@ class Connedit extends \Zotlabs\Web\Controller {
}
$section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
$channel = \App::get_channel();
$channel = App::get_channel();
$yes_no = array(t('No'),t('Yes'));
$connect_perms = \Zotlabs\Access\Permissions::connect_perms(local_channel());
$connect_perms = Permissions::connect_perms(local_channel());
$o .= "<script>function connectDefaultShare() {
\$('.abook-edit-me').each(function() {
@@ -426,7 +434,7 @@ class Connedit extends \Zotlabs\Web\Controller {
return;
$cmd = argv(2);
$orig_record = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_id = %d AND abook_channel = %d AND abook_self = 0 LIMIT 1",
intval($contact_id),
@@ -440,7 +448,7 @@ class Connedit extends \Zotlabs\Web\Controller {
if($cmd === 'update') {
// pull feed and consume it, which should subscribe to the hub.
\Zotlabs\Daemon\Master::Summon(array('Poller',$contact_id));
Master::Summon(array('Poller',$contact_id));
goaway(z_root() . '/connedit/' . $contact_id);
}
@@ -450,7 +458,7 @@ class Connedit extends \Zotlabs\Web\Controller {
$recurse = 0;
$x = z_fetch_url(zid($url),false,$recurse,['session' => true]);
if($x['success']) {
$h = new \Zotlabs\Web\HTTPHeaders($x['header']);
$h = new HTTPHeaders($x['header']);
$fields = $h->fetch();
if($fields) {
foreach($fields as $y) {
@@ -481,17 +489,17 @@ class Connedit extends \Zotlabs\Web\Controller {
if($cmd === 'refresh') {
if($orig_record[0]['xchan_network'] === 'zot') {
if(! zot_refresh($orig_record[0],\App::get_channel()))
if(! zot_refresh($orig_record[0],App::get_channel()))
notice( t('Refresh failed - channel is currently unavailable.') );
}
elseif($orig_record[0]['xchan_network'] === 'zot6') {
if(! Libzot::refresh($orig_record[0],\App::get_channel()))
if(! Libzot::refresh($orig_record[0],App::get_channel()))
notice( t('Refresh failed - channel is currently unavailable.') );
}
else {
// if you are on a different network we'll force a refresh of the connection basic info
\Zotlabs\Daemon\Master::Summon(array('Notifier','permission_update',$contact_id));
Master::Summon(array('Notifier','permission_update',$contact_id));
}
goaway(z_root() . '/connedit/' . $contact_id);
}
@@ -549,16 +557,11 @@ class Connedit extends \Zotlabs\Web\Controller {
if($cmd === 'drop') {
// @FIXME
// We need to send either a purge or a refresh packet to the other side (the channel being unfriended).
// The issue is that the abook DB record _may_ get destroyed when we call contact_remove. As the notifier
// runs in the background there could be a race condition preventing this packet from being sent in all
// cases.
// PLACEHOLDER
contact_remove(local_channel(), $orig_record[0]['abook_id']);
build_sync_packet(0 /* use the current local_channel */,
Master::Summon( [ 'Notifier', 'purge', local_channel(), $orig_record[0]['xchan_hash'] ] );
Libsync::build_sync_packet(0 /* use the current local_channel */,
array('abook' => array(array(
'abook_xchan' => $orig_record[0]['abook_xchan'],
'entry_deleted' => true))
@@ -573,13 +576,13 @@ class Connedit extends \Zotlabs\Web\Controller {
}
}
if(\App::$poi) {
if(App::$poi) {
$abook_prev = 0;
$abook_next = 0;
$contact_id = \App::$poi['abook_id'];
$contact = \App::$poi;
$contact_id = App::$poi['abook_id'];
$contact = App::$poi;
$cn = q("SELECT abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and abook_self = 0 and xchan_deleted = 0 order by xchan_name",
intval(local_channel())
@@ -787,9 +790,9 @@ class Connedit extends \Zotlabs\Web\Controller {
$perms = array();
$channel = \App::get_channel();
$channel = App::get_channel();
$global_perms = \Zotlabs\Access\Permissions::Perms();
$global_perms = Permissions::Perms();
$existing = get_all_perms(local_channel(),$contact['abook_xchan'],false);
@@ -821,7 +824,7 @@ class Connedit extends \Zotlabs\Web\Controller {
$thisperm = get_abconfig(local_channel(),$contact['abook_xchan'],'my_perms',$k);
//fixme
$checkinherited = \Zotlabs\Access\PermissionLimits::Get(local_channel(),$k);
$checkinherited = PermissionLimits::Get(local_channel(),$k);
// For auto permissions (when $self is true) we don't want to look at existing
// permissions because they are enabled for the channel owner
@@ -834,7 +837,7 @@ class Connedit extends \Zotlabs\Web\Controller {
$perms[] = array('perms_' . $k, $v, ((array_key_exists($k,$their_perms)) ? intval($their_perms[$k]) : ''),$thisperm, 1, (($checkinherited & PERMS_SPECIFIC) ? '' : '1'), '', $checkinherited);
}
$pcat = new \Zotlabs\Lib\Permcat(local_channel());
$pcat = new Permcat(local_channel());
$pcatlist = $pcat->listing();
$permcats = [];
if($pcatlist) {

View File

@@ -1,6 +1,8 @@
<?php
namespace Zotlabs\Module;
use Zotlabs\Lib\Libsync;
/*
@file cover_photo.php
@brief Module-file with functions for handling of cover-photos
@@ -66,9 +68,12 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$sync = attach_export_data($channel,$r[0]['resource_id']);
if($sync)
build_sync_packet($channel['channel_id'],array('file' => array($sync)));
Libsync::build_sync_packet($channel['channel_id'],array('file' => array($sync)));
}
// Update directory in background
\Zotlabs\Daemon\Master::Summon(array('Directory',$channel['channel_id']));
goaway(z_root() . '/cover_photo');
}
@@ -129,7 +134,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
if(file_exists($tmp_name)) {
$base_image = $r[0];
$gis = getimagesize($tmp_name);
logger('gis: ' . print_r($gis,true));
logger('gis: ' . print_r($gis,true), LOGGER_DEBUG);
$base_image['width'] = $gis[0];
$base_image['height'] = $gis[1];
$base_image['content'] = @file_get_contents($tmp_name);
@@ -190,25 +195,18 @@ logger('gis: ' . print_r($gis,true));
'filename' => $base_image['filename'],
'album' => t('Cover Photos'),
'os_path' => $base_image['os_path'],
'display_path' => $base_image['display_path']
'display_path' => $base_image['display_path'],
'photo_usage' => PHOTO_COVER
];
$p['imgscale'] = 7;
$p['photo_usage'] = PHOTO_COVER;
$r1 = $im->save($p);
$r1 = $im->storeThumbnail($p, PHOTO_RES_COVER_1200);
$im->doScaleImage(850,310);
$p['imgscale'] = 8;
$r2 = $im->save($p);
$r2 = $im->storeThumbnail($p, PHOTO_RES_COVER_850);
$im->doScaleImage(425,160);
$p['imgscale'] = 9;
$r3 = $im->save($p);
$r3 = $im->storeThumbnail($p, PHOTO_RES_COVER_425);
if($r1 === false || $r2 === false || $r3 === false) {
// if one failed, delete them all so we can start over.
notice( t('Image resize failed.') . EOL );
@@ -216,6 +214,17 @@ logger('gis: ' . print_r($gis,true));
dbesc($base_image['resource_id']),
local_channel()
);
$x = q("SELECT content FROM photo WHERE resource_id = '%s' AND uid = %d AND os_storage = 1 AND imgscale >= 7",
dbesc($base_image['resource_id']),
local_channel()
);
if($x) {
foreach($x as $xx) {
@unlink(dbunescbin($xx['content']));
}
}
return;
}
@@ -223,8 +232,10 @@ logger('gis: ' . print_r($gis,true));
$sync = attach_export_data($channel,$base_image['resource_id']);
if($sync)
build_sync_packet($channel['channel_id'],array('file' => array($sync)));
Libsync::build_sync_packet($channel['channel_id'],array('file' => array($sync)));
// Update directory in background
\Zotlabs\Daemon\Master::Summon(array('Directory',$channel['channel_id']));
}
else
notice( t('Unable to process image') . EOL);
@@ -282,14 +293,6 @@ logger('gis: ' . print_r($gis,true));
$arr['item_thread_top'] = 1;
$arr['item_origin'] = 1;
$arr['item_wall'] = 1;
$arr['obj_type'] = ACTIVITY_OBJ_PHOTO;
$arr['verb'] = ACTIVITY_UPDATE;
$arr['obj'] = json_encode(array(
'type' => $arr['obj_type'],
'id' => z_root() . '/photo/' . $photo['resource_id'] . '-7',
'link' => array('rel' => 'photo', 'type' => $photo['mimetype'], 'href' => z_root() . '/photo/' . $photo['resource_id'] . '-7')
));
if($profile && stripos($profile['gender'],t('female')) !== false)
$t = t('%1$s updated her %2$s');

View File

@@ -8,8 +8,9 @@
namespace Zotlabs\Module;
use \Sabre\DAV as SDAV;
use \Zotlabs\Storage;
use Sabre\DAV as SDAV;
use Zotlabs\Storage;
use Zotlabs\Web\HTTPSig;
require_once('include/attach.php');
require_once('include/auth.php');
@@ -46,7 +47,7 @@ class Dav extends \Zotlabs\Web\Controller {
continue;
}
$sigblock = \Zotlabs\Web\HTTPSig::parse_sigheader($_SERVER[$head]);
$sigblock = HTTPSig::parse_sigheader($_SERVER[$head]);
if($sigblock) {
$keyId = str_replace('acct:','',$sigblock['keyId']);
if($keyId) {
@@ -69,7 +70,7 @@ class Dav extends \Zotlabs\Web\Controller {
continue;
if($record) {
$verified = \Zotlabs\Web\HTTPSig::verify('',$record['channel']['channel_pubkey']);
$verified = HTTPSig::verify('',$record['channel']['channel_pubkey']);
if(! ($verified && $verified['header_signed'] && $verified['header_valid'])) {
$record = null;
}
@@ -94,6 +95,8 @@ class Dav extends \Zotlabs\Web\Controller {
$auth = new \Zotlabs\Storage\BasicAuth();
// $auth->observer = get_observer_hash();
$auth->setRealm(ucfirst(\Zotlabs\Lib\System::get_platform_name()) . ' ' . 'WebDAV');
$rootDirectory = new \Zotlabs\Storage\Directory('/', $auth);

View File

@@ -4,6 +4,7 @@ namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Libsync;
require_once('include/socgraph.php');
require_once('include/selectors.php');
@@ -164,7 +165,7 @@ class Defperms extends Controller {
if($abconfig)
$clone['abconfig'] = $abconfig;
build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
Libsync::build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)));
}
/* @brief Generate content of connection default permissions page

View File

@@ -0,0 +1,52 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
class Dircensor extends Controller {
function get() {
if(! is_site_admin()) {
return;
}
$dirmode = intval(get_config('system','directory_mode'));
if (! ($dirmode == DIRECTORY_MODE_PRIMARY || $dirmode == DIRECTORY_MODE_STANDALONE)) {
return;
}
$xchan = argv(1);
if(! $xchan) {
return;
}
$r = q("select * from xchan where xchan_hash = '%s'",
dbesc($xchan)
);
if(! $r) {
return;
}
$val = (($r[0]['xchan_censored']) ? 0 : 1);
q("update xchan set xchan_censored = $val where xchan_hash = '%s'",
dbesc($xchan)
);
if($val) {
info( t('Entry censored') . EOL);
}
else {
info( t('Entry uncensored') . EOL);
}
goaway(z_root() . '/directory');
}
}

View File

@@ -2,15 +2,19 @@
namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
require_once('include/socgraph.php');
require_once('include/dir_fns.php');
require_once('include/bbcode.php');
require_once('include/html2plain.php');
class Directory extends \Zotlabs\Web\Controller {
class Directory extends Controller {
function init() {
\App::set_pager_itemspage(60);
App::set_pager_itemspage(30);
if(local_channel() && x($_GET,'ignore')) {
q("insert into xign ( uid, xchan ) values ( %d, '%s' ) ",
@@ -21,7 +25,7 @@ class Directory extends \Zotlabs\Web\Controller {
}
if(local_channel())
\App::$profile_uid = local_channel();
App::$profile_uid = local_channel();
$observer = get_observer_hash();
$global_changed = false;
@@ -103,8 +107,14 @@ class Directory extends \Zotlabs\Web\Controller {
$suggest = (local_channel() && x($_REQUEST,'suggest')) ? $_REQUEST['suggest'] : '';
if($suggest) {
$r = suggestion_query(local_channel(),get_observer_hash());
// the directory options have no effect in suggestion mode
$globaldir = 1;
$safe_mode = 1;
$type = 0;
$r = suggestion_query(local_channel(),get_observer_hash(),0,60);
if(! $r) {
notice( t('No default suggestions were found.') . EOL);
@@ -134,9 +144,15 @@ class Directory extends \Zotlabs\Web\Controller {
$dirmode = intval(get_config('system','directory_mode'));
$directory_admin = false;
if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
$url = z_root() . '/dirsearch';
}
if (is_site_admin()) {
$directory_admin = true;
}
}
if(! $url) {
$directory = find_upstream_directory($dirmode);
if((! $directory) || (! array_key_exists('url',$directory)) || (! $directory['url']))
@@ -176,7 +192,7 @@ class Directory extends \Zotlabs\Web\Controller {
$query .= '&t=' . $token;
if(! $globaldir)
$query .= '&hub=' . \App::get_hostname();
$query .= '&hub=' . App::get_hostname();
if($search)
$query .= '&name=' . urlencode($search) . '&keywords=' . urlencode($search);
@@ -198,8 +214,8 @@ class Directory extends \Zotlabs\Web\Controller {
if($sort_order)
$query .= '&order=' . urlencode($sort_order);
if(\App::$pager['page'] != 1)
$query .= '&p=' . \App::$pager['page'];
if(App::$pager['page'] != 1)
$query .= '&p=' . App::$pager['page'];
logger('mod_directory: query: ' . $query);
@@ -212,12 +228,17 @@ class Directory extends \Zotlabs\Web\Controller {
if($j) {
if($j['results']) {
$results = $j['results'];
if($suggest) {
$results = self::reorder_results($results,$addresses);
}
$entries = array();
$photo = 'thumb';
foreach($j['results'] as $rr) {
foreach($results as $rr) {
$profile_link = chanlink_url($rr['url']);
@@ -272,12 +293,15 @@ class Directory extends \Zotlabs\Web\Controller {
$marital = ((x($profile,'marital') == 1) ? t('Status: ') . $profile['marital']: False);
$homepage = ((x($profile,'homepage') == 1) ? t('Homepage: ') : False);
$homepageurl = ((x($profile,'homepage') == 1) ? $profile['homepage'] : '');
$homepageurl = ((x($profile,'homepage') == 1) ? html2plain($profile['homepage']) : '');
$hometown = ((x($profile,'hometown') == 1) ? $profile['hometown'] : False);
$about = ((x($profile,'about') == 1) ? zidify_links(bbcode($profile['about'])) : False);
$hometown = ((x($profile,'hometown') == 1) ? html2plain($profile['hometown']) : False);
$about = ((x($profile,'about') == 1) ? zidify_links(bbcode($profile['about'], ['tryoembed' => false])) : False);
if ($about && $safe_mode) {
$about = html2plain($about);
}
$keywords = ((x($profile,'keywords')) ? $profile['keywords'] : '');
@@ -332,9 +356,11 @@ class Directory extends \Zotlabs\Web\Controller {
'canrate' => (($rating_enabled && local_channel()) ? true : false),
'pdesc' => $pdesc,
'pdesc_label' => t('Description:'),
'censor' => (($directory_admin) ? 'dircensor/' . $rr['hash'] : ''),
'censor_label' => (($rr['censored']) ? t('Uncensor') : t('Censor')),
'marital' => $marital,
'homepage' => $homepage,
'homepageurl' => linkify($homepageurl),
'homepageurl' => (($safe_mode) ? $homepageurl : linkify($homepageurl)),
'hometown' => $hometown,
'hometown_label' => t('Hometown:'),
'about' => $about,
@@ -376,7 +402,7 @@ class Directory extends \Zotlabs\Web\Controller {
ksort($entries); // Sort array by key so that foreach-constructs work as expected
if($j['keywords']) {
\App::$data['directory_keywords'] = $j['keywords'];
App::$data['directory_keywords'] = $j['keywords'];
}
logger('mod_directory: entries: ' . print_r($entries,true), LOGGER_DATA);
@@ -427,7 +453,7 @@ class Directory extends \Zotlabs\Web\Controller {
echo $o;
killme();
}
if(\App::$pager['page'] == 1 && $j['records'] == 0 && strpos($search,'@')) {
if(App::$pager['page'] == 1 && $j['records'] == 0 && strpos($search,'@')) {
goaway(z_root() . '/chanview/?f=&address=' . $search);
}
info( t("No entries (some entries may be hidden).") . EOL);
@@ -438,5 +464,22 @@ class Directory extends \Zotlabs\Web\Controller {
return $o;
}
static public function reorder_results($results,$suggests) {
if(! $suggests)
return $results;
$out = [];
foreach($suggests as $k => $v) {
foreach($results as $rv) {
if($k == $rv['address']) {
$out[intval($v)] = $rv;
break;
}
}
}
return $out;
}
}

View File

@@ -1,14 +1,17 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
require_once('include/dir_fns.php');
class Dirsearch extends \Zotlabs\Web\Controller {
class Dirsearch extends Controller {
function init() {
\App::set_pager_itemspage(60);
App::set_pager_itemspage(30);
}
@@ -25,7 +28,8 @@ class Dirsearch extends \Zotlabs\Web\Controller {
$ret['message'] = t('This site is not a directory server');
json_return_and_die($ret);
}
$access_token = $_REQUEST['t'];
$token = get_config('system','realm_token');
@@ -286,29 +290,29 @@ class Dirsearch extends \Zotlabs\Web\Controller {
else
$entry['total_ratings'] = 0;
$entry['name'] = $rr['xchan_name'];
$entry['hash'] = $rr['xchan_hash'];
$entry['name'] = $rr['xchan_name'];
$entry['hash'] = $rr['xchan_hash'];
$entry['censored'] = $rr['xchan_censored'];
$entry['selfcensored'] = $rr['xchan_selfcensored'];
$entry['public_forum'] = (intval($rr['xchan_pubforum']) ? true : false);
$entry['url'] = $rr['xchan_url'];
$entry['photo_l'] = $rr['xchan_photo_l'];
$entry['photo'] = $rr['xchan_photo_m'];
$entry['address'] = $rr['xchan_addr'];
$entry['description'] = $rr['xprof_desc'];
$entry['locale'] = $rr['xprof_locale'];
$entry['region'] = $rr['xprof_region'];
$entry['postcode'] = $rr['xprof_postcode'];
$entry['country'] = $rr['xprof_country'];
$entry['birthday'] = $rr['xprof_dob'];
$entry['age'] = $rr['xprof_age'];
$entry['gender'] = $rr['xprof_gender'];
$entry['marital'] = $rr['xprof_marital'];
$entry['sexual'] = $rr['xprof_sexual'];
$entry['about'] = $rr['xprof_about'];
$entry['homepage'] = $rr['xprof_homepage'];
$entry['hometown'] = $rr['xprof_hometown'];
$entry['keywords'] = $rr['xprof_keywords'];
$entry['url'] = $rr['xchan_url'];
$entry['photo_l'] = $rr['xchan_photo_l'];
$entry['photo'] = $rr['xchan_photo_m'];
$entry['address'] = $rr['xchan_addr'];
$entry['description'] = $rr['xprof_desc'];
$entry['locale'] = $rr['xprof_locale'];
$entry['region'] = $rr['xprof_region'];
$entry['postcode'] = $rr['xprof_postcode'];
$entry['country'] = $rr['xprof_country'];
$entry['birthday'] = $rr['xprof_dob'];
$entry['age'] = $rr['xprof_age'];
$entry['gender'] = $rr['xprof_gender'];
$entry['marital'] = $rr['xprof_marital'];
$entry['sexual'] = $rr['xprof_sexual'];
$entry['about'] = $rr['xprof_about'];
$entry['homepage'] = $rr['xprof_homepage'];
$entry['hometown'] = $rr['xprof_hometown'];
$entry['keywords'] = $rr['xprof_keywords'];
$entries[] = $entry;
@@ -394,7 +398,7 @@ class Dirsearch extends \Zotlabs\Web\Controller {
$quoted_string = false;
}
else
$curr['value'] .= ' ' . trim(q);
$curr['value'] .= ' ' . trim($q);
}
}
}

View File

@@ -47,7 +47,6 @@ class Display extends \Zotlabs\Web\Controller {
}
$observer_is_owner = false;
$updateable = false;
if(local_channel() && (! $update)) {
@@ -101,7 +100,7 @@ class Display extends \Zotlabs\Web\Controller {
if($decoded)
$item_hash = $decoded;
$r = q("select id, uid, mid, parent_mid, thr_parent, verb, item_type, item_deleted, author_xchan, item_blocked from item where mid like '%s' limit 1",
$r = q("select id, uid, mid, parent, parent_mid, thr_parent, verb, item_type, item_deleted, author_xchan, item_blocked from item where mid like '%s' limit 1",
dbesc($item_hash . '%')
);
@@ -159,14 +158,17 @@ class Display extends \Zotlabs\Web\Controller {
}
}
if($target_item['item_type'] == ITEM_TYPE_CARD) {
$x = q("select * from channel where channel_id = %d limit 1",
intval($target_item['uid'])
);
$y = q("select * from iconfig left join item on iconfig.iid = item.id
where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'CARD' and item.id = %d limit 1",
intval($target_item['uid']),
intval($target_item['parent'])
);
if($x && $y) {
goaway(z_root() . '/cards/' . $x[0]['channel_address'] . '/' . $y[0]['v']);
}
@@ -200,7 +202,8 @@ class Display extends \Zotlabs\Web\Controller {
// if the target item is not a post (eg a like) we want to address its thread parent
$mid = ((($target_item['verb'] == ACTIVITY_LIKE) || ($target_item['verb'] == ACTIVITY_DISLIKE)) ? $target_item['thr_parent'] : $target_item['mid']);
//$mid = ((($target_item['verb'] == ACTIVITY_LIKE) || ($target_item['verb'] == ACTIVITY_DISLIKE)) ? $target_item['thr_parent'] : $target_item['mid']);
$mid = $target_item['mid'];
// if we got a decoded hash we must encode it again before handing to javascript
if($decoded)
@@ -223,6 +226,7 @@ class Display extends \Zotlabs\Web\Controller {
'$conv' => '0',
'$spam' => '0',
'$fh' => '0',
'$dm' => '0',
'$nouveau' => '0',
'$wall' => '0',
'$static' => $static,
@@ -269,9 +273,6 @@ class Display extends \Zotlabs\Web\Controller {
intval(local_channel()),
dbesc($target_item['parent_mid'])
);
if($r) {
$updateable = true;
}
}
if(! $r) {
@@ -313,9 +314,6 @@ class Display extends \Zotlabs\Web\Controller {
intval(local_channel()),
dbesc($target_item['parent_mid'])
);
if($r) {
$updateable = true;
}
}
if($r === null) {
@@ -427,13 +425,6 @@ class Display extends \Zotlabs\Web\Controller {
killme();
}
if($updateable) {
$x = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 AND uid = %d and parent = %d ",
intval(local_channel()),
intval($r[0]['item_id'])
);
}
$o .= '<div id="content-complete"></div>';

View File

@@ -45,7 +45,8 @@ class Editpost extends \Zotlabs\Web\Controller {
}
if($itm[0]['resource_type'] === 'event' && $itm[0]['resource_id']) {
goaway(z_root() . '/events/' . $itm[0]['resource_id'] . '?expandform=1');
goaway(z_root() . '/cdav/calendar/' . $itm[0]['resource_id']);
//goaway(z_root() . '/events/' . $itm[0]['resource_id'] . '?expandform=1');
}
$owner_uid = $itm[0]['uid'];

View File

@@ -41,24 +41,46 @@ class Embedphotos extends \Zotlabs\Web\Controller {
json_return_and_die(array('errormsg' => 'Error retrieving link ' . $href, 'status' => false));
}
$resource_id = array_pop(explode('/', $href));
$r = q("SELECT obj from item where resource_type = 'photo' and resource_id = '%s' limit 1",
dbesc($resource_id)
);
if (!$r) {
json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
}
$obj = json_decode($r[0]['obj'], true);
if (x($obj, 'body')) {
$photolink = $obj['body'];
} elseif (x($obj, 'bbcode')) {
$photolink = $obj['bbcode'];
} else {
json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
}
json_return_and_die(array('status' => true, 'photolink' => $photolink, 'resource_id' => $resource_id));
$x = self::photolink($resource_id);
if($x)
json_return_and_die(array('status' => true, 'photolink' => $x, 'resource_id' => $resource_id));
json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
}
}
protected static function photolink($resource) {
$channel = \App::get_channel();
$output = EMPTY_STR;
if($channel) {
$resolution = ((feature_enabled($channel['channel_id'],'large_photos')) ? 1 : 2);
$r = q("select mimetype, height, width from photo where resource_id = '%s' and $resolution = %d and uid = %d limit 1",
dbesc($resource),
intval($resolution),
intval($channel['channel_id'])
);
if(! $r)
return $output;
if($r[0]['mimetype'] === 'image/jpeg')
$ext = '.jpg';
elseif($r[0]['mimetype'] === 'image/png')
$ext = '.png';
elseif($r[0]['mimetype'] === 'image/gif')
$ext = '.gif';
elseif($r[0]['mimetype'] === 'image/webp')
$exp = '.webp';
else
$ext = EMPTY_STR;
$output = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $resource . ']' .
'[zmg=' . $r[0]['width'] . 'x' . $r[0]['height'] . ']' . z_root() . '/photo/' . $resource . '-' . $resolution . $ext . '[/zmg][/zrl]';
return $output;
}
}
/**
* @brief Get photos from an album.
*

76
Zotlabs/Module/Event.php Normal file
View File

@@ -0,0 +1,76 @@
<?php
namespace Zotlabs\Module;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\ActivityStreams;
use Zotlabs\Lib\Activity;
use Zotlabs\Lib\LDSignatures;
use Zotlabs\Web\HTTPSig;
class Event extends Controller {
function init() {
if(ActivityStreams::is_as_request()) {
$item_id = argv(1);
if(! $item_id)
return;
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0
and item.item_delayed = 0 and item.item_blocked = 0 ";
$sql_extra = item_permissions_sql(0);
$r = q("select * from item where mid like '%s' $item_normal $sql_extra limit 1",
dbesc(z_root() . '/activity/' . $item_id . '%')
);
if(! $r) {
$r = q("select * from item where mid like '%s' $item_normal limit 1",
dbesc(z_root() . '/activity/' . $item_id . '%')
);
if($r) {
http_status_exit(403, 'Forbidden');
}
http_status_exit(404, 'Not found');
}
xchan_query($r,true);
$items = fetch_post_tags($r,true);
$channel = channelx_by_n($items[0]['uid']);
if(! is_array($items[0]['obj'])) {
$obj = json_decode($items[0]['obj'],true);
}
else {
$obj = $items[0]['obj'];
}
$x = array_merge(['@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
z_root() . ZOT_APSCHEMA_REV
]], $obj );
$headers = [];
$headers['Content-Type'] = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ;
$x['signature'] = LDSignatures::sign($x,$channel);
$ret = json_encode($x, JSON_UNESCAPED_SLASHES);
$headers['Date'] = datetime_convert('UTC','UTC', 'now', 'D, d M Y H:i:s \\G\\M\\T');
$headers['Digest'] = HTTPSig::generate_digest_header($ret);
$headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI'];
$h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel));
HTTPSig::set_headers($h);
echo $ret;
killme();
}
}
}

View File

@@ -11,6 +11,9 @@ require_once('include/html2plain.php');
class Events extends \Zotlabs\Web\Controller {
function post() {
// this module is deprecated
return;
logger('post: ' . print_r($_REQUEST,true), LOGGER_DATA);
@@ -245,6 +248,9 @@ class Events extends \Zotlabs\Web\Controller {
function get() {
// this module is deprecated
return;
if(argc() > 2 && argv(1) == 'ical') {
$event_id = argv(2);
@@ -662,9 +668,10 @@ class Events extends \Zotlabs\Web\Controller {
'html'=>$html,
'plink' => array($rr['plink'],t('Link to Source'),'',''),
);
}
}
if($export) {
header('Content-type: text/calendar');
header('content-disposition: attachment; filename="' . t('calendar') . '-' . $channel['channel_address'] . '.ics"' );

View File

@@ -17,7 +17,7 @@ class Feed extends \Zotlabs\Web\Controller {
$params['pages'] = ((x($_REQUEST,'pages')) ? intval($_REQUEST['pages']) : 0);
$params['top'] = ((x($_REQUEST,'top')) ? intval($_REQUEST['top']) : 0);
$params['start'] = ((x($_REQUEST,'start')) ? intval($_REQUEST['start']) : 0);
$params['records'] = ((x($_REQUEST,'records')) ? intval($_REQUEST['records']) : 40);
$params['records'] = ((x($_REQUEST,'records')) ? intval($_REQUEST['records']) : 10);
$params['direction'] = ((x($_REQUEST,'direction')) ? dbesc($_REQUEST['direction']) : 'desc');
$params['cat'] = ((x($_REQUEST,'cat')) ? escape_tags($_REQUEST['cat']) : '');
$params['compat'] = ((x($_REQUEST,'compat')) ? intval($_REQUEST['compat']) : 0);

View File

@@ -0,0 +1,79 @@
<?php
namespace Zotlabs\Module;
/* fix missing or hubloc_id_url entries */
class Fhubloc_id_url extends \Zotlabs\Web\Controller {
function get() {
if(! is_site_admin())
return;
q("START TRANSACTION");
// remove broken xchan entries
$r0 = dbq("DELETE FROM xchan WHERE xchan_hash = ''");
// remove broken hubloc entries
$r1 = dbq("DELETE FROM hubloc WHERE hubloc_hash = ''");
// fix legacy zot hubloc_id_url
$r2 = dbq("UPDATE hubloc
SET hubloc_id_url = CONCAT(hubloc_url, '/channel/', SUBSTRING(hubloc_addr FROM 1 FOR POSITION('@' IN hubloc_addr) -1))
WHERE hubloc_network = 'zot'
AND hubloc_id_url = ''"
);
// fix singleton networks hubloc_id_url
if(ACTIVE_DBTYPE == DBTYPE_MYSQL) {
// fix entries for activitypub which miss the xchan_url due to an earlier bug
$r3 = dbq("UPDATE xchan
SET xchan_url = xchan_hash
WHERE xchan_network = 'activitypub'
AND xchan_url = ''"
);
$r4 = dbq("UPDATE hubloc
LEFT JOIN xchan ON hubloc.hubloc_hash = xchan.xchan_hash
SET hubloc.hubloc_id_url = xchan.xchan_url
WHERE hubloc.hubloc_network IN ('activitypub', 'diaspora', 'friendica-over-diaspora', 'gnusoc')
AND hubloc.hubloc_id_url = ''
AND xchan.xchan_url IS NOT NULL"
);
}
if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
// fix entries for activitypub which miss the xchan_url due to an earlier bug
$r3 = dbq("UPDATE xchan
SET xchan_url = xchan_hash
WHERE xchan_network = 'activitypub'
AND xchan_url = ''"
);
$r4 = dbq("UPDATE hubloc
SET hubloc_id_url = xchan_url
FROM xchan
WHERE hubloc_hash = xchan_hash
AND hubloc_network IN ('activitypub', 'diaspora', 'friendica-over-diaspora', 'gnusoc')
AND hubloc_id_url = ''
AND xchan_url IS NOT NULL"
);
}
if($r0 && $r1 && $r2 && $r3 && $r4) {
// remove hubloc entries where hubloc_id_url could not be fixed
$r5 = dbq("DELETE FROM hubloc WHERE hubloc_id_url = ''");
}
if($r0 && $r1 && $r2 && $r3 && $r4 && $r5) {
q("COMMIT");
return 'Completed';
}
q("ROLLBACK");
return 'Failed';
}
}

View File

@@ -1,6 +1,8 @@
<?php
namespace Zotlabs\Module;
use Zotlabs\Lib\Libzot;
require_once('include/zot.php');
require_once('include/crypto.php');
@@ -10,7 +12,7 @@ require_once('include/crypto.php');
class Fhublocs extends \Zotlabs\Web\Controller {
function get() {
if(! is_site_admin())
return;
@@ -21,9 +23,11 @@ class Fhublocs extends \Zotlabs\Web\Controller {
if($r) {
foreach($r as $rr) {
$found = false;
$primary_address = '';
$x = zot_get_hublocs($rr['channel_hash']);
$x = Libzot::get_hublocs($rr['channel_hash']);
if($x) {
foreach($x as $xx) {
if($xx['hubloc_url'] === z_root() && $xx['hubloc_sitekey'] === $sitekey) {
@@ -42,13 +46,12 @@ class Fhublocs extends \Zotlabs\Web\Controller {
if($y)
$primary_address = $y[0]['xchan_addr'];
$hub_address = channel_reddress($rr['channel']);
$hub_address = channel_reddress($rr);
$primary = (($hub_address === $primary_address) ? 1 : 0);
if(! $y)
$primary = 1;
$m = q("delete from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' ",
dbesc($rr['channel_hash']),
dbesc(z_root())
@@ -56,7 +59,7 @@ class Fhublocs extends \Zotlabs\Web\Controller {
// Create a verified hub location pointing to this site.
/*
$h = hubloc_store_lowlevel(
[
'hubloc_guid' => $rr['channel_guid'],
@@ -72,7 +75,26 @@ class Fhublocs extends \Zotlabs\Web\Controller {
'hubloc_sitekey' => $sitekey
]
);
*/
$h = hubloc_store_lowlevel(
[
'hubloc_guid' => $rr['channel_guid'],
'hubloc_guid_sig' => $rr['channel_guid_sig'],
'hubloc_hash' => $rr['channel_hash'],
'hubloc_id_url' => channel_url($rr),
'hubloc_addr' => channel_reddress($rr),
'hubloc_primary' => intval($primary),
'hubloc_url' => z_root(),
'hubloc_url_sig' => Libzot::sign(z_root(), $rr['channel_prvkey']),
'hubloc_site_id' => Libzot::make_xchan_hash(z_root(), $sitekey),
'hubloc_host' => \App::get_hostname(),
'hubloc_callback' => z_root() . '/zot',
'hubloc_sitekey' => $sitekey,
'hubloc_network' => 'zot6',
'hubloc_updated' => datetime_convert()
]
);
if($h)
$o . 'local hubloc created for ' . $rr['channel_name'] . EOL;
else

View File

@@ -1,6 +1,8 @@
<?php
namespace Zotlabs\Module;
use Zotlabs\Lib\Libsync;
require_once('include/attach.php');
require_once('include/channel.php');
require_once('include/photos.php');
@@ -41,7 +43,7 @@ class File_upload extends \Zotlabs\Web\Controller {
$sync = attach_export_data($channel,$hash);
if($sync) {
build_sync_packet($channel['channel_id'],array('file' => array($sync)));
Libsync::build_sync_packet($channel['channel_id'],array('file' => array($sync)));
}
goaway(z_root() . '/cloud/' . $channel['channel_address'] . '/' . $r['data']['display_path']);
@@ -97,7 +99,7 @@ class File_upload extends \Zotlabs\Web\Controller {
if($r['success']) {
$sync = attach_export_data($channel,$r['data']['hash']);
if($sync)
build_sync_packet($channel['channel_id'],array('file' => array($sync)));
Libsync::build_sync_packet($channel['channel_id'],array('file' => array($sync)));
}
}

View File

@@ -5,7 +5,7 @@ namespace Zotlabs\Module;
*
*/
use Zotlabs\Lib\Libsync;
class Filestorage extends \Zotlabs\Web\Controller {
@@ -35,12 +35,12 @@ class Filestorage extends \Zotlabs\Web\Controller {
$url = get_cloud_url($channel_id, $channel['channel_address'], $resource);
//get the object before permissions change so we can catch eventual former allowed members
$object = get_file_activity_object($channel_id, $resource, $url);
attach_change_permissions($channel_id, $resource, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], $recurse, true);
file_activity($channel_id, $object, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], 'post', $notify);
if($notify) {
$observer = \App::get_observer();
attach_store_item($channel, $observer, $resource);
}
goaway(dirname($url));
}
@@ -131,7 +131,7 @@ class Filestorage extends \Zotlabs\Web\Controller {
if(! $admin_delete) {
$sync = attach_export_data($channel, $f['hash'], true);
if($sync) {
build_sync_packet($channel['channel_id'], array('file' => array($sync)));
Libsync::build_sync_packet($channel['channel_id'], array('file' => array($sync)));
}
}

View File

@@ -1,31 +1,88 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Libsync;
use Zotlabs\Lib\ActivityStreams;
use Zotlabs\Lib\Activity;
use Zotlabs\Web\HTTPSig;
use Zotlabs\Lib\LDSignatures;
use Zotlabs\Lib\Connect;
use Zotlabs\Daemon\Master;
require_once('include/follow.php');
class Follow extends \Zotlabs\Web\Controller {
class Follow extends Controller {
function init() {
if(! local_channel()) {
if (ActivityStreams::is_as_request() && argc() == 2) {
$abook_id = intval(argv(1));
if(! $abook_id)
return;
$r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d",
intval($abook_id)
);
if (! $r) {
return;
}
$chan = channelx_by_n($r[0]['abook_channel']);
if (! $chan) {
http_status_exit(404, 'Not found');
}
$actor = Activity::encode_person($chan,true,true);
if (! $actor) {
http_status_exit(404, 'Not found');
}
$x = array_merge(['@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
z_root() . ZOT_APSCHEMA_REV
]],
[
'id' => z_root() . '/follow/' . $r[0]['abook_id'],
'type' => 'Follow',
'actor' => $actor,
'object' => $r[0]['xchan_url']
]);
$headers = [];
$headers['Content-Type'] = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ;
$x['signature'] = LDSignatures::sign($x,$chan);
$ret = json_encode($x, JSON_UNESCAPED_SLASHES);
$headers['Date'] = datetime_convert('UTC','UTC', 'now', 'D, d M Y H:i:s \\G\\M\\T');
$headers['Digest'] = HTTPSig::generate_digest_header($ret);
$headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI'];
$h = HTTPSig::create_sig($headers,$chan['channel_prvkey'],channel_url($chan));
HTTPSig::set_headers($h);
echo $ret;
killme();
}
if (! local_channel()) {
return;
}
$uid = local_channel();
$url = notags(trim(punify($_REQUEST['url'])));
$return_url = $_SESSION['return_url'];
$confirm = intval($_REQUEST['confirm']);
$interactive = (($_REQUEST['interactive']) ? intval($_REQUEST['interactive']) : 1);
$channel = \App::get_channel();
$channel = App::get_channel();
$result = new_contact($uid,$url,$channel,$interactive,$confirm);
$result = Connect::connect($channel,$url);
if($result['success'] == false) {
if($result['message'])
if ($result['success'] == false) {
if ($result['message']) {
notice($result['message']);
if($interactive) {
}
if ($interactive) {
goaway($return_url);
}
else {
@@ -36,8 +93,8 @@ class Follow extends \Zotlabs\Web\Controller {
info( t('Connection added.') . EOL);
$clone = array();
foreach($result['abook'] as $k => $v) {
if(strpos($k,'abook_') === 0) {
foreach ($result['abook'] as $k => $v) {
if (strpos($k,'abook_') === 0) {
$clone[$k] = $v;
}
}
@@ -46,20 +103,21 @@ class Follow extends \Zotlabs\Web\Controller {
unset($clone['abook_channel']);
$abconfig = load_abconfig($channel['channel_id'],$clone['abook_xchan']);
if($abconfig)
if ($abconfig) {
$clone['abconfig'] = $abconfig;
}
Libsync::build_sync_packet(0, [ 'abook' => [ $clone ] ], true);
build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone)), true);
$can_view_stream = intval(get_abconfig($channel['channel_id'],$clone['abook_xchan'],'their_perms','view_stream'));
$can_view_stream = their_perms_contains($channel['channel_id'],$clone['abook_xchan'],'view_stream');
// If we can view their stream, pull in some posts
if(($can_view_stream) || ($result['abook']['xchan_network'] === 'rss'))
\Zotlabs\Daemon\Master::Summon(array('Onepoll',$result['abook']['abook_id']));
if (($can_view_stream) || ($result['abook']['xchan_network'] === 'rss')) {
Master::Summon([ 'Onepoll', $result['abook']['abook_id'] ]);
}
if($interactive) {
goaway(z_root() . '/connedit/' . $result['abook']['abook_id'] . '?f=&follow=1');
if ($interactive) {
goaway(z_root() . '/connedit/' . $result['abook']['abook_id'] . '?follow=1');
}
else {
json_return_and_die([ 'success' => true ]);
@@ -68,7 +126,7 @@ class Follow extends \Zotlabs\Web\Controller {
}
function get() {
if(! local_channel()) {
if (! local_channel()) {
return login();
}
}

View File

@@ -1,6 +1,8 @@
<?php
namespace Zotlabs\Module;
use Zotlabs\Web\HTTPSig;
/**
* module: getfile
*
@@ -35,7 +37,6 @@ class Getfile extends \Zotlabs\Web\Controller {
$sig = $_POST['signature'];
$resource = $_POST['resource'];
$revision = intval($_POST['revision']);
$resolution = (-1);
if(! $hash)
killme();
@@ -47,7 +48,7 @@ class Getfile extends \Zotlabs\Web\Controller {
continue;
}
$sigblock = \Zotlabs\Web\HTTPSig::parse_sigheader($_SERVER[$head]);
$sigblock = HTTPSig::parse_sigheader($_SERVER[$head]);
if($sigblock) {
$keyId = $sigblock['keyId'];
@@ -58,7 +59,7 @@ class Getfile extends \Zotlabs\Web\Controller {
);
if($r) {
$hubloc = $r[0];
$verified = \Zotlabs\Web\HTTPSig::verify('',$hubloc['xchan_pubkey']);
$verified = HTTPSig::verify('',$hubloc['xchan_pubkey']);
if($verified && $verified['header_signed'] && $verified['header_valid'] && $hash == $hubloc['hubloc_hash']) {
$header_verified = true;
}
@@ -81,9 +82,14 @@ class Getfile extends \Zotlabs\Web\Controller {
killme();
}
if(substr($resource,-2,1) == '-') {
if(isset($_POST['resolution']))
$resolution = intval($_POST['resolution']);
elseif(substr($resource,-2,1) == '-') {
$resolution = intval(substr($resource,-1,1));
$resource = substr($resource,0,-2);
}
else {
$resolution = (-1);
}
$slop = intval(get_pconfig($channel['channel_id'],'system','getfile_time_slop'));
@@ -106,9 +112,10 @@ class Getfile extends \Zotlabs\Web\Controller {
}
if($resolution > 0) {
$r = q("select * from photo where resource_id = '%s' and uid = %d limit 1",
$r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND imgscale = %d LIMIT 1",
dbesc($resource),
intval($channel['channel_id'])
intval($channel['channel_id']),
$resolution
);
if($r) {
header('Content-type: ' . $r[0]['mimetype']);

View File

@@ -4,6 +4,7 @@ namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Apps;
use Zotlabs\Lib\Libsync;
require_once('include/group.php');
@@ -80,7 +81,7 @@ class Group extends Controller {
info( t('Privacy group updated.') . EOL );
build_sync_packet(local_channel(),null,true);
Libsync::build_sync_packet(local_channel(),null,true);
}
goaway(z_root() . '/group/' . argv(1) . '/' . argv(2));
@@ -177,7 +178,7 @@ class Group extends Controller {
if($r)
$result = group_rmv(local_channel(),$r[0]['gname']);
if($result) {
$hookinfo = [ 'pgrp_extras' => '', 'group'=>$argv(2) ];
$hookinfo = [ 'pgrp_extras' => '', 'group' => argv(2) ];
call_hooks ('privacygroup_extras_drop',$hookinfo);
info( t('Privacy group removed.') . EOL);
}

View File

@@ -66,7 +66,10 @@ class Help extends \Zotlabs\Web\Controller {
case IMAGETYPE_PNG:
header("Content-Type: image/png");
break;
default:
case IMAGETYPE_WEBP:
header("Content-Type: image/webp");
break;
default:
break;
}
header("Content-Length: " . filesize($realpath));

View File

@@ -152,8 +152,8 @@ class Hq extends \Zotlabs\Web\Controller {
if($target_item) {
// if the target item is not a post (eg a like) we want to address its thread parent
$mid = ((($target_item['verb'] == ACTIVITY_LIKE) || ($target_item['verb'] == ACTIVITY_DISLIKE)) ? $target_item['thr_parent'] : $target_item['mid']);
//$mid = ((($target_item['verb'] == ACTIVITY_LIKE) || ($target_item['verb'] == ACTIVITY_DISLIKE)) ? $target_item['thr_parent'] : $target_item['mid']);
$mid = $target_item['mid'];
// if we got a decoded hash we must encode it again before handing to javascript
if($decoded)
$mid = 'b64.' . base64url_encode($mid);
@@ -179,6 +179,7 @@ class Hq extends \Zotlabs\Web\Controller {
'$conv' => '0',
'$spam' => '0',
'$fh' => '0',
'$dm' => '0',
'$nouveau' => '0',
'$wall' => '0',
'$static' => $static,
@@ -198,8 +199,6 @@ class Hq extends \Zotlabs\Web\Controller {
]);
}
$updateable = false;
if($load && $target_item) {
$r = null;
@@ -212,10 +211,6 @@ class Hq extends \Zotlabs\Web\Controller {
dbesc($target_item['parent_mid'])
);
if($r) {
$updateable = true;
}
if(!$r) {
$sys_item = true;
@@ -242,10 +237,6 @@ class Hq extends \Zotlabs\Web\Controller {
dbesc($target_item['parent_mid'])
);
if($r) {
$updateable = true;
}
if(!$r) {
$sys_item = true;
@@ -282,13 +273,6 @@ class Hq extends \Zotlabs\Web\Controller {
$o .= conversation($items, 'hq', $update, 'client');
if($updateable) {
$x = q("UPDATE item SET item_unseen = 0 WHERE item_unseen = 1 AND uid = %d AND parent = %d ",
intval(local_channel()),
intval($r[0]['item_id'])
);
}
$o .= '<div id="content-complete"></div>';
return $o;

View File

@@ -12,7 +12,7 @@ namespace Zotlabs\Module;
use Zotlabs\Lib\Activity;
use Zotlabs\Lib\ActivityStreams;
use Zotlabs\Lib\LDSignatures;
use Zotlabs\Zot6\HTTPSig;
use Zotlabs\Web\HTTPSig;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\ThreadListener;

View File

@@ -137,6 +137,11 @@ class Import extends \Zotlabs\Web\Controller {
return;
}
if(version_compare($data['compatibility']['version'], '4.7.3', '<=')) {
// zot6 transition: cloning is not compatible with older versions
notice('Data export format is not compatible with this software (not a zot6 channel)');
return;
}
if($moving)
$seize = 1;
@@ -212,50 +217,21 @@ class Import extends \Zotlabs\Web\Controller {
// create new hubloc for the new channel at this site
if(array_key_exists('channel',$data)) {
$r = hubloc_store_lowlevel(
[
'hubloc_guid' => $channel['channel_guid'],
'hubloc_guid_sig' => $channel['channel_guid_sig'],
'hubloc_hash' => $channel['channel_hash'],
'hubloc_addr' => channel_reddress($channel),
'hubloc_network' => 'zot',
'hubloc_primary' => (($seize) ? 1 : 0),
'hubloc_url' => z_root(),
'hubloc_url_sig' => base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'])),
'hubloc_host' => \App::get_hostname(),
'hubloc_callback' => z_root() . '/post',
'hubloc_sitekey' => get_config('system','pubkey'),
'hubloc_updated' => datetime_convert()
]
);
// reset the original primary hubloc if it is being seized
if($seize) {
$r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' and hubloc_url != '%s' ",
dbesc($channel['channel_hash']),
dbesc(z_root())
);
}
// create a new zot6 hubloc if we have got a channel_portable_id
if($channel['channel_portable_id']) {
$r = hubloc_store_lowlevel(
[
'hubloc_guid' => $channel['channel_guid'],
'hubloc_guid_sig' => 'sha256.' . $channel['channel_guid_sig'],
'hubloc_guid_sig' => $channel['channel_guid_sig'],
'hubloc_hash' => $channel['channel_portable_id'],
'hubloc_addr' => channel_reddress($channel),
'hubloc_network' => 'zot6',
'hubloc_network' => 'zot',
'hubloc_primary' => (($seize) ? 1 : 0),
'hubloc_url' => z_root(),
'hubloc_url_sig' => 'sha256.' . base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'])),
'hubloc_url_sig' => base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'])),
'hubloc_host' => \App::get_hostname(),
'hubloc_callback' => z_root() . '/zot',
'hubloc_callback' => z_root() . '/post',
'hubloc_sitekey' => get_config('system','pubkey'),
'hubloc_updated' => datetime_convert(),
'hubloc_id_url' => channel_url($channel),
'hubloc_site_id' => Libzot::make_xchan_hash(z_root(),get_config('system','pubkey'))
'hubloc_updated' => datetime_convert()
]
);
@@ -266,7 +242,35 @@ class Import extends \Zotlabs\Web\Controller {
dbesc(z_root())
);
}
}
// create a new zot6 hubloc if we have got a channel_portable_id
$r = hubloc_store_lowlevel(
[
'hubloc_guid' => $channel['channel_guid'],
'hubloc_guid_sig' => $channel['channel_guid_sig'],
'hubloc_hash' => $channel['channel_hash'],
'hubloc_addr' => channel_reddress($channel),
'hubloc_network' => 'zot6',
'hubloc_primary' => (($seize) ? 1 : 0),
'hubloc_url' => z_root(),
'hubloc_url_sig' => 'sha256.' . base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'])),
'hubloc_host' => \App::get_hostname(),
'hubloc_callback' => z_root() . '/zot',
'hubloc_sitekey' => get_config('system','pubkey'),
'hubloc_updated' => datetime_convert(),
'hubloc_id_url' => channel_url($channel),
'hubloc_site_id' => Libzot::make_xchan_hash(z_root(),get_config('system','pubkey'))
]
);
// reset the original primary hubloc if it is being seized
if($seize) {
$r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' and hubloc_url != '%s' ",
dbesc($channel['channel_hash']),
dbesc(z_root())
);
}
}
@@ -285,6 +289,28 @@ class Import extends \Zotlabs\Web\Controller {
dbesc($channel['channel_portable_id'])
);
if($channel['channel_portable_id']) {
$r = xchan_store_lowlevel(
[
'xchan_hash' => $channel['channel_portable_id'],
'xchan_guid' => $channel['channel_guid'],
'xchan_guid_sig' => $channel['channel_guid_sig'],
'xchan_pubkey' => $channel['channel_pubkey'],
'xchan_photo_l' => z_root() . "/photo/profile/l/" . $channel['channel_id'],
'xchan_photo_m' => z_root() . "/photo/profile/m/" . $channel['channel_id'],
'xchan_photo_s' => z_root() . "/photo/profile/s/" . $channel['channel_id'],
'xchan_addr' => channel_reddress($channel),
'xchan_url' => z_root() . '/channel/' . $channel['channel_address'],
'xchan_connurl' => z_root() . '/poco/' . $channel['channel_address'],
'xchan_follow' => z_root() . '/follow?f=&url=%s',
'xchan_name' => $channel['channel_name'],
'xchan_network' => 'zot',
'xchan_photo_date' => datetime_convert(),
'xchan_name_date' => datetime_convert()
]
);
}
$r = xchan_store_lowlevel(
[
'xchan_hash' => $channel['channel_hash'],
@@ -299,35 +325,12 @@ class Import extends \Zotlabs\Web\Controller {
'xchan_connurl' => z_root() . '/poco/' . $channel['channel_address'],
'xchan_follow' => z_root() . '/follow?f=&url=%s',
'xchan_name' => $channel['channel_name'],
'xchan_network' => 'zot',
'xchan_network' => 'zot6',
'xchan_photo_date' => datetime_convert(),
'xchan_name_date' => datetime_convert()
]
);
if($channel['channel_portable_id']) {
$r = xchan_store_lowlevel(
[
'xchan_hash' => \Zotlabs\Lib\Libzot::make_xchan_hash($channel['channel_guid'],$channel['channel_pubkey']),
'xchan_guid' => $channel['channel_guid'],
'xchan_guid_sig' => 'sha256.' . $channel['channel_guid_sig'],
'xchan_pubkey' => $channel['channel_pubkey'],
'xchan_photo_l' => z_root() . "/photo/profile/l/" . $channel['channel_id'],
'xchan_photo_m' => z_root() . "/photo/profile/m/" . $channel['channel_id'],
'xchan_photo_s' => z_root() . "/photo/profile/s/" . $channel['channel_id'],
'xchan_addr' => channel_reddress($channel),
'xchan_url' => z_root() . '/channel/' . $channel['channel_address'],
'xchan_connurl' => z_root() . '/poco/' . $channel['channel_address'],
'xchan_follow' => z_root() . '/follow?f=&url=%s',
'xchan_name' => $channel['channel_name'],
'xchan_network' => 'zot6',
'xchan_photo_date' => datetime_convert(),
'xchan_name_date' => datetime_convert()
]
);
}
}
logger('import step 6');
@@ -346,7 +349,7 @@ class Import extends \Zotlabs\Web\Controller {
}
if($xchan['xchan_network'] === 'zot6') {
$zhash = \Zotlabs\Lib\Libzot::make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_pubkey']);
$zhash = Libzot::make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_pubkey']);
if($zhash !== $xchan['xchan_hash']) {
logger('forged xchan: ' . print_r($xchan,true));
continue;

View File

@@ -2,6 +2,7 @@
namespace Zotlabs\Module;
use Zotlabs\Lib\Config;
use Zotlabs\Lib\IConfig;
use Zotlabs\Lib\Enotify;
use Zotlabs\Web\Controller;
@@ -9,9 +10,11 @@ use Zotlabs\Daemon\Master;
use Zotlabs\Lib\Activity;
use Zotlabs\Lib\ActivityStreams;
use Zotlabs\Lib\LDSignatures;
use Zotlabs\Zot6\HTTPSig;
use Zotlabs\Web\HTTPSig;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Libsync;
use Zotlabs\Lib\ThreadListener;
use Zotlabs\Access\PermissionRoles;
use App;
require_once('include/crypto.php');
@@ -46,7 +49,7 @@ class Item extends Controller {
$item_id = argv(1);
if (! $item_id)
if(! $item_id)
http_status_exit(404, 'Not found');
$portable_id = EMPTY_STR;
@@ -67,40 +70,33 @@ class Item extends Controller {
// process an authenticated fetch
$sigdata = HTTPSig::verify(EMPTY_STR);
if($sigdata['portable_id'] && $sigdata['header_valid']) {
$sigdata = HTTPSig::verify(($_SERVER['REQUEST_METHOD'] === 'POST') ? file_get_contents('php://input') : EMPTY_STR);
if ($sigdata['portable_id'] && $sigdata['header_valid']) {
$portable_id = $sigdata['portable_id'];
if (! check_channelallowed($portable_id)) {
http_status_exit(403, 'Permission denied');
}
if (! check_siteallowed($sigdata['signer'])) {
http_status_exit(403, 'Permission denied');
}
observer_auth($portable_id);
// first see if we have a copy of this item's parent owned by the current signer
// include xchans for all zot-like networks - these will have the same guid and public key
$x = q("select * from xchan where xchan_hash = '%s'",
dbesc($sigdata['portable_id'])
$i = q("select id as item_id from item where mid = '%s' $item_normal and owner_xchan = '%s' limit 1",
dbesc($r[0]['parent_mid']),
dbesc($portable_id)
);
if ($x) {
$xchans = q("select xchan_hash from xchan where xchan_hash = '%s' OR ( xchan_guid = '%s' AND xchan_pubkey = '%s' ) ",
dbesc($sigdata['portable_id']),
dbesc($x[0]['xchan_guid']),
dbesc($x[0]['xchan_pubkey'])
);
if ($xchans) {
$hashes = ids_to_querystr($xchans,'xchan_hash',true);
$i = q("select id as item_id from item where mid = '%s' $item_normal and owner_xchan in ( " . protect_sprintf($hashes) . " ) limit 1",
dbesc($r[0]['parent_mid'])
);
}
}
}
elseif (Config::get('system','require_authenticated_fetch',false)) {
http_status_exit(403,'Permission denied');
}
// if we don't have a parent id belonging to the signer see if we can obtain one as a visitor that we have permission to access
// with a bias towards those items owned by channels on this site (item_wall = 1)
$sql_extra = item_permissions_sql(0);
if (! $i) {
$i = q("select id as item_id from item where mid = '%s' $item_normal $sql_extra limit 1",
$i = q("select id as item_id from item where mid = '%s' $item_normal $sql_extra order by item_wall desc limit 1",
dbesc($r[0]['parent_mid'])
);
}
@@ -111,7 +107,7 @@ class Item extends Controller {
$parents_str = ids_to_querystr($i,'item_id');
$items = q("SELECT item.*, item.id AS item_id FROM item WHERE item.parent IN ( %s ) $item_normal ",
$items = q("SELECT item.*, item.id AS item_id FROM item WHERE item.parent IN ( %s ) $item_normal order by item.id asc",
dbesc($parents_str)
);
@@ -122,43 +118,10 @@ class Item extends Controller {
xchan_query($items,true);
$items = fetch_post_tags($items,true);
$observer = App::get_observer();
$parent = $items[0];
$recips = (($parent['owner']['xchan_network'] === 'activitypub') ? get_iconfig($parent['id'],'activitypub','recips', []) : []);
$to = (($recips && array_key_exists('to',$recips) && is_array($recips['to'])) ? $recips['to'] : null);
$nitems = [];
foreach($items as $i) {
$mids = [];
if(intval($i['item_private'])) {
if(! $observer) {
continue;
}
// ignore private reshare, possibly from hubzilla
if($i['verb'] === 'Announce') {
if(! in_array($i['thr_parent'],$mids)) {
$mids[] = $i['thr_parent'];
}
continue;
}
// also ignore any children of the private reshares
if(in_array($i['thr_parent'],$mids)) {
continue;
}
if((! $to) || (! in_array($observer['xchan_url'],$to))) {
continue;
}
}
$nitems[] = $i;
}
if(! $nitems)
if(! $items)
http_status_exit(404, 'Not found');
$chan = channelx_by_n($nitems[0]['uid']);
$chan = channelx_by_n($items[0]['uid']);
if(! $chan)
http_status_exit(404, 'Not found');
@@ -166,7 +129,8 @@ class Item extends Controller {
if(! perm_is_allowed($chan['channel_id'],get_observer_hash(),'view_stream'))
http_status_exit(403, 'Forbidden');
$i = Activity::encode_item_collection($nitems,'conversation/' . $item_id,'OrderedCollection');
$i = Activity::encode_item_collection($items, 'conversation/' . $item_id, 'OrderedCollection');
if($portable_id) {
ThreadListener::store(z_root() . '/item/' . $item_id,$portable_id);
}
@@ -192,6 +156,126 @@ class Item extends Controller {
killme();
}
if(ActivityStreams::is_as_request()) {
$item_id = argv(1);
if(! $item_id)
http_status_exit(404, 'Not found');
$portable_id = EMPTY_STR;
$item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_blocked = 0 ";
$i = null;
// do we have the item (at all)?
// add preferential bias to item owners (item_wall = 1)
$r = q("select * from item where mid = '%s' or uuid = '%s' $item_normal order by item_wall desc limit 1",
dbesc(z_root() . '/item/' . $item_id),
dbesc($item_id)
);
if (! $r) {
http_status_exit(404,'Not found');
}
// process an authenticated fetch
$sigdata = HTTPSig::verify(EMPTY_STR);
if ($sigdata['portable_id'] && $sigdata['header_valid']) {
$portable_id = $sigdata['portable_id'];
if (! check_channelallowed($portable_id)) {
http_status_exit(403, 'Permission denied');
}
if (! check_siteallowed($sigdata['signer'])) {
http_status_exit(403, 'Permission denied');
}
observer_auth($portable_id);
$i = q("select id as item_id from item where mid = '%s' $item_normal and owner_xchan = '%s' limit 1 ",
dbesc($r[0]['parent_mid']),
dbesc($portable_id)
);
}
elseif (Config::get('system','require_authenticated_fetch',false)) {
http_status_exit(403,'Permission denied');
}
// if we don't have a parent id belonging to the signer see if we can obtain one as a visitor that we have permission to access
// with a bias towards those items owned by channels on this site (item_wall = 1)
$sql_extra = item_permissions_sql(0);
if (! $i) {
$i = q("select id as item_id from item where mid = '%s' $item_normal $sql_extra order by item_wall desc limit 1",
dbesc($r[0]['parent_mid'])
);
}
if(! $i) {
http_status_exit(403,'Forbidden');
}
// If we get to this point we have determined we can access the original in $r (fetched much further above), so use it.
xchan_query($r,true);
$items = fetch_post_tags($r,false);
$chan = channelx_by_n($items[0]['uid']);
if(! $chan)
http_status_exit(404, 'Not found');
if(! perm_is_allowed($chan['channel_id'],get_observer_hash(),'view_stream'))
http_status_exit(403, 'Forbidden');
$i = Activity::encode_item($items[0],true);
if(! $i)
http_status_exit(404, 'Not found');
$x = array_merge(['@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
z_root() . ZOT_APSCHEMA_REV
]], $i);
$headers = [];
$headers['Content-Type'] = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ;
$x['signature'] = LDSignatures::sign($x,$chan);
$ret = json_encode($x, JSON_UNESCAPED_SLASHES);
$headers['Date'] = datetime_convert('UTC','UTC', 'now', 'D, d M Y H:i:s \\G\\M\\T');
$headers['Digest'] = HTTPSig::generate_digest_header($ret);
$headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI'];
$h = HTTPSig::create_sig($headers,$chan['channel_prvkey'],channel_url($chan));
HTTPSig::set_headers($h);
echo $ret;
killme();
}
if(argc() > 1 && argv(1) !== 'drop') {
$x = q("select uid, item_wall, llink, mid from item where mid = '%s' or mid = '%s' ",
dbesc(z_root() . '/item/' . argv(1)),
dbesc(z_root() . '/activity/' . argv(1))
);
if($x) {
foreach($x as $xv) {
if (intval($xv['item_wall'])) {
$c = channelx_by_n($xv['uid']);
if ($c) {
goaway($c['xchan_url'] . '?mid=' . gen_link_id($xv['mid']));
}
}
}
goaway($x[0]['llink']);
}
http_status_exit(404, 'Not found');
}
}
@@ -253,7 +337,9 @@ class Item extends Controller {
$consensus = intval($_REQUEST['consensus']);
$nocomment = intval($_REQUEST['nocomment']);
$is_poll = ((trim($_REQUEST['poll_answers'][0]) != '' && trim($_REQUEST['poll_answers'][1]) != '') ? true : false);
// 'origin' (if non-zero) indicates that this network is where the message originated,
// for the purpose of relaying comments to other conversation members.
// If using the API from a device (leaf node) you must set origin to 1 (default) or leave unset.
@@ -550,10 +636,10 @@ class Item extends Controller {
$public_policy = $orig_post['public_policy'];
$private = $orig_post['item_private'];
}
if($private || $public_policy || $acl->is_private())
$private = 1;
if($public_policy || $acl->is_private()) {
$private = (($private) ? $private : 1);
}
$location = $orig_post['location'];
$coord = $orig_post['coord'];
@@ -630,12 +716,11 @@ class Item extends Controller {
$allow_empty = ((array_key_exists('allow_empty',$_REQUEST)) ? intval($_REQUEST['allow_empty']) : 0);
$private = intval($acl->is_private() || ($public_policy));
$private = (($private) ? $private : intval($acl->is_private() || ($public_policy)));
// If this is a comment, set the permissions from the parent.
if($parent_item) {
$private = 0;
$acl->set($parent_item);
$private = intval($acl->is_private() || $parent_item['item_private']);
$public_policy = $parent_item['public_policy'];
@@ -692,6 +777,27 @@ class Item extends Controller {
$str_group_allow = $gacl['allow_gid'];
$str_contact_deny = $gacl['deny_cid'];
$str_group_deny = $gacl['deny_gid'];
$groupww = false;
// if this is a wall-to-wall post to a group, turn it into a direct message
$role = get_pconfig($profile_uid,'system','permissions_role');
$rolesettings = PermissionRoles::role_perms($role);
$channel_type = isset($rolesettings['channel_type']) ? $rolesettings['channel_type'] : 'normal';
$is_group = (($channel_type === 'group') ? true : false);
if (($is_group) && ($walltowall) && (! $walltowall_comment)) {
$groupww = true;
$str_contact_allow = $owner_xchan['xchan_hash'];
$str_group_allow = '';
}
$post_tags = [];
if($mimetype === 'text/bbcode') {
@@ -701,19 +807,18 @@ class Item extends Controller {
// BBCODE alert: the following functions assume bbcode input
// and will require alternatives for alternative content-types (text/html, text/markdown, text/plain, etc.)
// we may need virtual or template classes to implement the possible alternatives
if(strpos($body,'[/summary]') !== false) {
$match = '';
$cnt = preg_match("/\[summary\](.*?)\[\/summary\]/ism",$body,$match);
if($cnt) {
$summary .= $match[1];
}
$body_content = preg_replace("/^(.*?)\[summary\](.*?)\[\/summary\](.*?)$/ism", '',$body);
$body = trim($body_content);
}
$summary = cleanup_bbcode($summary);
$match = '';
$cnt = preg_match("/\[summary\](.*?)\[\/summary\]/ism",$body,$match);
if($cnt) {
$summary .= $match[1];
}
$body_content = preg_replace("/\[summary\](.*?)\[\/summary\]/ism", '',$body);
$body = trim($body_content);
}
$summary = cleanup_bbcode($summary);
$body = cleanup_bbcode($body);
@@ -727,7 +832,6 @@ class Item extends Controller {
// Set permissions based on tag replacements
set_linkified_perms($results, $str_contact_allow, $str_group_allow, $profile_uid, $parent_item, $private);
$post_tags = array();
foreach($results as $result) {
$success = $result['success'];
if($success['replaced']) {
@@ -740,8 +844,14 @@ class Item extends Controller {
);
}
}
}
if(($str_contact_allow) && (! $str_group_allow)) {
// direct message - private between individual channels but not groups
$private = 2;
}
/**
*
@@ -793,11 +903,6 @@ class Item extends Controller {
'revision' => $r['data']['revision']
);
}
$ext = substr($r['data']['filename'],strrpos($r['data']['filename'],'.'));
if(strpos($r['data']['filetype'],'audio/') !== false)
$attach_link = '[audio]' . z_root() . '/attach/' . $r['data']['hash'] . '/' . $r['data']['revision'] . (($ext) ? $ext : '') . '[/audio]';
elseif(strpos($r['data']['filetype'],'video/') !== false)
$attach_link = '[video]' . z_root() . '/attach/' . $r['data']['hash'] . '/' . $r['data']['revision'] . (($ext) ? $ext : '') . '[/video]';
$body = str_replace($match[1][$i],$attach_link,$body);
$i++;
}
@@ -811,8 +916,6 @@ class Item extends Controller {
$i = 0;
foreach($match[2] as $mtch) {
$reshare = new \Zotlabs\Lib\Share($mtch);
$datarray['obj'] = $reshare->obj();
$datarray['obj_type'] = $datarray['obj']['type'];
$body = str_replace($match[1][$i],$reshare->bbcode(),$body);
$i++;
}
@@ -905,6 +1008,27 @@ class Item extends Controller {
}
if($is_poll) {
$poll = [
'question' => $body,
'answers' => $_REQUEST['poll_answers'],
'multiple_answers' => $_REQUEST['poll_multiple_answers'],
'expire_value' => $_REQUEST['poll_expire_value'],
'expire_unit' => $_REQUEST['poll_expire_unit']
];
$obj = $this->extract_poll_data($poll, [ 'item_private' => $private, 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_contact_deny ]);
}
else {
$obj = $this->extract_bb_poll_data($body,[ 'item_private' => $private, 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_contact_deny ]);
}
if ($obj) {
$obj['url'] = $mid;
$obj['attributedTo'] = channel_url($channel);
$datarray['obj'] = $obj;
$obj_type = 'Question';
}
if(! $parent_mid) {
$parent_mid = $mid;
}
@@ -950,10 +1074,15 @@ class Item extends Controller {
}
if ((! $plink) && ($item_thread_top)) {
$plink = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . gen_link_id($mid);
$plink = substr($plink,0,190);
// $plink = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . gen_link_id($mid);
// $plink = substr($plink,0,190);
$plink = $mid;
}
if ($datarray['obj']) {
$datarray['obj']['id'] = $mid;
}
$datarray['aid'] = $channel['channel_account_id'];
$datarray['uid'] = $profile_uid;
$datarray['uuid'] = $uuid;
@@ -1011,10 +1140,9 @@ class Item extends Controller {
$datarray['layout_mid'] = $layout_mid;
$datarray['public_policy'] = $public_policy;
$datarray['comment_policy'] = map_scope($comment_policy);
$datarray['term'] = $post_tags;
$datarray['term'] = array_unique($post_tags, SORT_REGULAR);
$datarray['plink'] = $plink;
$datarray['route'] = $route;
// A specific ACL over-rides public_policy completely
@@ -1112,7 +1240,7 @@ class Item extends Controller {
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
build_sync_packet($profile_uid,array('item' => array(encode_item($sync_item[0],true))));
Libsync::build_sync_packet($profile_uid,array('item' => array(encode_item($sync_item[0],true))));
}
}
if(! $nopush)
@@ -1208,20 +1336,14 @@ class Item extends Controller {
killme();
}
if(($parent) && ($parent != $post_id)) {
// Store the comment signature information in case we need to relay to Diaspora
//$ditem = $datarray;
//$ditem['author'] = $observer;
//store_diaspora_comment_sig($ditem,$channel,$parent_item, $post_id, (($walltowall_comment) ? 1 : 0));
}
else {
if(($parent == $post_id) || ($datarray['item_private'] == 1)) {
$r = q("select * from item where id = %d",
intval($post_id)
);
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
build_sync_packet($profile_uid,array('item' => array(encode_item($sync_item[0],true))));
Libsync::build_sync_packet($profile_uid,array('item' => array(encode_item($sync_item[0],true))));
}
}
@@ -1229,7 +1351,11 @@ class Item extends Controller {
$datarray['llink'] = z_root() . '/display/' . gen_link_id($datarray['mid']);
call_hooks('post_local_end', $datarray);
if ($groupww) {
$nopush = false;
}
if(! $nopush)
Master::Summon([ 'Notifier', $notify_type, $post_id ]);
@@ -1323,7 +1449,7 @@ class Item extends Controller {
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
build_sync_packet($i[0]['uid'],array('item' => array(encode_item($sync_item[0],true))));
Libsync::build_sync_packet($i[0]['uid'],array('item' => array(encode_item($sync_item[0],true))));
}
if($complex) {
@@ -1376,5 +1502,104 @@ class Item extends Controller {
return $ret;
}
function extract_bb_poll_data(&$body,$item) {
$multiple = false;
if (strpos($body,'[/question]') === false && strpos($body,'[/answer]') === false) {
return false;
}
if (strpos($body,'[nobb]') !== false) {
return false;
}
$obj = [];
$ptr = [];
$matches = null;
$obj['type'] = 'Question';
if (preg_match_all('/\[answer\](.*?)\[\/answer\]/ism',$body,$matches,PREG_SET_ORDER)) {
foreach ($matches as $match) {
$ptr[] = [ 'name' => $match[1], 'type' => 'Note', 'replies' => [ 'type' => 'Collection', 'totalItems' => 0 ]];
$body = str_replace('[answer]' . $match[1] . '[/answer]', EMPTY_STR, $body);
}
}
$matches = null;
if (preg_match('/\[question\](.*?)\[\/question\]/ism',$body,$matches)) {
$obj['content'] = bbcode($matches[1]);
$body = str_replace('[question]' . $matches[1] . '[/question]', $matches[1], $body);
$obj['oneOf'] = $ptr;
}
$matches = null;
if (preg_match('/\[question=multiple\](.*?)\[\/question\]/ism',$body,$matches)) {
$obj['content'] = bbcode($matches[1]);
$body = str_replace('[question=multiple]' . $matches[1] . '[/question]', $matches[1], $body);
$obj['anyOf'] = $ptr;
}
$matches = null;
if (preg_match('/\[ends\](.*?)\[\/ends\]/ism',$body,$matches)) {
$obj['endTime'] = datetime_convert(date_default_timezone_get(),'UTC', $matches[1],ATOM_TIME);
$body = str_replace('[ends]' . $matches[1] . '[/ends]', EMPTY_STR, $body);
}
if ($item['item_private']) {
$obj['to'] = Activity::map_acl($item);
}
else {
$obj['to'] = [ ACTIVITY_PUBLIC_INBOX ];
}
return $obj;
}
function extract_poll_data($poll, $item) {
$multiple = intval($poll['multiple_answers']);
$expire_value = intval($poll['expire_value']);
$expire_unit = $poll['expire_unit'];
$question = $poll['question'];
$answers = $poll['answers'];
$obj = [];
$ptr = [];
$obj['type'] = 'Question';
$obj['content'] = bbcode($question);
foreach($answers as $answer) {
if(trim($answer))
$ptr[] = [ 'name' => escape_tags($answer), 'type' => 'Note', 'replies' => [ 'type' => 'Collection', 'totalItems' => 0 ]];
}
if($multiple) {
$obj['anyOf'] = $ptr;
}
else {
$obj['oneOf'] = $ptr;
}
$obj['endTime'] = datetime_convert(date_default_timezone_get(), 'UTC', 'now + ' . $expire_value . ' ' . $expire_unit, ATOM_TIME);
if ($item['item_private']) {
$obj['to'] = Activity::map_acl($item);
}
else {
$obj['to'] = [ ACTIVITY_PUBLIC_INBOX ];
}
return $obj;
}
}

View File

@@ -2,6 +2,7 @@
namespace Zotlabs\Module;
use Zotlabs\Lib\Activity;
use Zotlabs\Lib\Libsync;
require_once('include/security.php');
require_once('include/bbcode.php');
@@ -75,7 +76,12 @@ class Like extends \Zotlabs\Web\Controller {
return EMPTY_STR;
}
$is_rsvp = false;
if (in_array($activity, [ ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE ])) {
$is_rsvp = true;
}
$extended_like = false;
$object = $target = null;
$post_type = EMPTY_STR;
@@ -204,20 +210,8 @@ class Like extends \Zotlabs\Web\Controller {
if(! $plink)
$plink = '[zrl=' . z_root() . '/profile/' . $ch[0]['channel_address'] . ']' . $post_type . '[/zrl]';
$links = array();
$links[] = array('rel' => 'alternate', 'type' => 'text/html',
'href' => z_root() . '/profile/' . $ch[0]['channel_address']);
$links[] = array('rel' => 'photo', 'type' => $ch[0]['xchan_photo_mimetype'],
'href' => $ch[0]['xchan_photo_l']);
$object = json_encode(array(
'type' => ACTIVITY_OBJ_PROFILE,
'title' => $ch[0]['channel_name'],
'id' => $ch[0]['xchan_url'] . '/' . $ch[0]['xchan_hash'],
'link' => $links
));
$object = json_encode(Activity::fetch_profile([ 'id' => channel_url($ch[0]) ]));
// second like of the same thing is "undo" for the first like
$z = q("select * from likes where channel_id = %d and liker = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s' limit 1",
@@ -230,7 +224,7 @@ class Like extends \Zotlabs\Web\Controller {
if($z) {
$z[0]['deleted'] = 1;
build_sync_packet($ch[0]['channel_id'],array('likes' => $z));
Libsync::build_sync_packet($ch[0]['channel_id'],array('likes' => $z));
q("delete from likes where id = %d",
intval($z[0]['id'])
@@ -381,7 +375,7 @@ class Like extends \Zotlabs\Web\Controller {
$arr = array();
$arr['uuid'] = $uuid;
$arr['mid'] = z_root() . '/item/' . $uuid;
$arr['mid'] = z_root() . (($is_rsvp) ? '/activity/' : '/item/') . $uuid;
if($extended_like) {
$arr['item_thread_top'] = 1;
@@ -402,27 +396,8 @@ class Like extends \Zotlabs\Web\Controller {
$body = $item['body'];
$object = json_encode(array(
'type' => $objtype,
'id' => $item['mid'],
'asld' => Activity::fetch_item( [ 'id' => $item['mid'] ] ),
'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']),
'link' => $links,
'title' => $item['title'],
'content' => $item['body'],
'created' => $item['created'],
'edited' => $item['edited'],
'author' => array(
'name' => $item_author['xchan_name'],
'address' => $item_author['xchan_addr'],
'guid' => $item_author['xchan_guid'],
'guid_sig' => $item_author['xchan_guid_sig'],
'link' => array(
array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
),
));
$object = json_encode(Activity::fetch_item( [ 'id' => $item['mid'] ]));
if(! intval($item['item_thread_top']))
$post_type = 'comment';
@@ -466,15 +441,15 @@ class Like extends \Zotlabs\Web\Controller {
if($extended_like) {
$ulink = '[zrl=' . $ch[0]['xchan_url'] . ']' . $ch[0]['xchan_name'] . '[/zrl]';
$alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
$ulink = '[zrl=' . $ch[0]['xchan_url'] . '][bdi]' . $ch[0]['xchan_name'] . '[/bdi][/zrl]';
$alink = '[zrl=' . $observer['xchan_url'] . '][bdi]' . $observer['xchan_name'] . '[/bdi][/zrl]';
$private = (($public) ? 0 : 1);
}
else {
$arr['parent'] = $item['id'];
$arr['thr_parent'] = $item['mid'];
$ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
$alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
$ulink = '[zrl=' . $item_author['xchan_url'] . '][bdi]' . $item_author['xchan_name'] . '[/bdi][/zrl]';
$alink = '[zrl=' . $observer['xchan_url'] . '][bdi]' . $observer['xchan_name'] . '[/bdi][/zrl]';
$plink = '[zrl=' . z_root() . '/display/' . gen_link_id($item['mid']) . ']' . $post_type . '[/zrl]';
$allow_cid = $item['allow_cid'];
$allow_gid = $item['allow_gid'];
@@ -491,7 +466,7 @@ class Like extends \Zotlabs\Web\Controller {
$arr['item_flags'] = $item_flags;
$arr['item_wall'] = $item_wall;
$arr['parent_mid'] = (($extended_like) ? $mid : $item['mid']);
$arr['parent_mid'] = (($extended_like) ? $arr['mid'] : $item['mid']);
$arr['owner_xchan'] = (($extended_like) ? $ch[0]['xchan_hash'] : $thread_owner['xchan_hash']);
$arr['author_xchan'] = $observer['xchan_hash'];
@@ -546,7 +521,7 @@ class Like extends \Zotlabs\Web\Controller {
dbesc($observer['xchan_hash']),
dbesc($ch[0]['channel_hash']),
intval($post_id),
dbesc($mid),
dbesc($arr['mid']),
dbesc($activity),
dbesc(($tgttype)? $tgttype : $objtype),
dbesc($obj_id),
@@ -555,13 +530,13 @@ class Like extends \Zotlabs\Web\Controller {
$r = q("select * from likes where liker = '%s' and likee = '%s' and i_mid = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s' ",
dbesc($observer['xchan_hash']),
dbesc($ch[0]['channel_hash']),
dbesc($mid),
dbesc($arr['mid']),
dbesc($activity),
dbesc(($tgttype)? $tgttype : $objtype),
dbesc($obj_id)
);
if($r)
build_sync_packet($ch[0]['channel_id'],array('likes' => $r));
Libsync::build_sync_packet($ch[0]['channel_id'],array('likes' => $r));
}

View File

@@ -2,9 +2,6 @@
namespace Zotlabs\Module;
class Linkinfo extends \Zotlabs\Web\Controller {
function get() {
@@ -48,7 +45,22 @@ class Linkinfo extends \Zotlabs\Web\Controller {
}
logger('linkinfo: ' . $url);
// Replace plink URL with 'share' tag if possible
preg_match("/(mid=b64\.|display\/|posts\/)([\w\-]+)(&.+)?$/", $url, $mid);
if (!empty($mid) && $mid[1] == 'mid=b64.')
$mid[2] = base64_decode($mid[2]);
$r = q("SELECT id FROM item WHERE mid = '%s' AND uid = %d AND item_private = 0 LIMIT 1",
dbesc((empty($mid) ? $url : $mid[2])),
intval(local_channel())
);
if ($r) {
echo "[share=" . $r[0]['id'] . "][/share]";
killme();
}
$result = z_fetch_url($url,false,0,array('novalidate' => true, 'nobody' => true));
if($result['success']) {
$hdrs=array();
@@ -69,6 +81,14 @@ class Linkinfo extends \Zotlabs\Web\Controller {
killme();
}
if(stripos($type,'video/') !== false) {
$thumb = self::get_video_poster($url);
if($thumb) {
if ($zrl)
echo $br . '[zvideo poster=\'' . $thumb . '\']' . $url . '[/zvideo]' . $br;
else
echo $br . '[video poster=\'' . $thumb . '\']' . $url . '[/video]' . $br;
killme();
}
if($zrl)
echo $br . '[zvideo]' . $url . '[/zvideo]' . $br;
else
@@ -216,7 +236,42 @@ class Linkinfo extends \Zotlabs\Web\Controller {
return($complete);
}
public static function get_video_poster($url) {
if(strpos($url,z_root() . '/cloud/') === false) {
return EMPTY_STR;
}
$m = parse_url($url,PHP_URL_PATH);
if($m) {
// strip leading '/cloud/'
$m = substr($m,7);
}
$nick = substr($m,0,strpos($m,'/'));
$p = substr($m,strpos($m,'/')+1);
// get the channel to check permissions
$u = channelx_by_nick($nick);
if($u && $p) {
$sql_extra = permissions_sql(intval($u['channel_id']));
$r = q("select hash, content from attach where display_path = '%s' and uid = %d and os_storage = 1 $sql_extra limit 1",
dbesc($p),
intval($u['channel_id'])
);
if($r) {
$path = dbunescbin($r[0]['content']);
if($path && @file_exists($path . '.thumb')) {
return z_root() . '/poster/' . $nick . '/' . $r[0]['hash'];
}
}
}
return EMPTY_STR;
}
public static function parseurl_getsiteinfo($url) {
$siteinfo = array();
@@ -232,7 +287,7 @@ class Linkinfo extends \Zotlabs\Web\Controller {
// Check codepage in HTTP headers or HTML if not exist
$cp = (preg_match('/Content-Type: text\/html; charset=(.+)\r\n/i', $header, $o) ? $o[1] : '');
if(empty($cp))
$cp = (preg_match('/meta.+content=["|\']text\/html; charset=([^"|\']+)/i', $body, $o) ? $o[1] : 'AUTO');
$cp = (preg_match('/meta.+content=["\']text\/html; charset=([^"\']+)/i', $body, $o) ? $o[1] : 'AUTO');
$body = mb_convert_encoding($body, 'UTF-8', $cp);
$body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
@@ -401,8 +456,9 @@ class Linkinfo extends \Zotlabs\Web\Controller {
while (strpos($text, " "))
$text = trim(str_replace(" ", " ", $text));
$siteinfo["text"] = html_entity_decode(substr($text,0,350), ENT_QUOTES, "UTF-8").'...';
$text = substr(html_entity_decode($text, ENT_QUOTES, "UTF-8"), 0, 350);
$siteinfo["text"] = rtrim(substr($text, 0, strrpos($text, " ")), "?.,:;!-") . '...';
}
}

View File

@@ -76,7 +76,7 @@ class Lockview extends \Zotlabs\Web\Controller {
killme();
}
if(($item['item_private'] == 1) && (! strlen($item['allow_cid'])) && (! strlen($item['allow_gid']))
if(intval($item['item_private']) && (! strlen($item['allow_cid'])) && (! strlen($item['allow_gid']))
&& (! strlen($item['deny_cid'])) && (! strlen($item['deny_gid']))) {
// if the post is private, but public_policy is blank ("visible to the internet"), and there aren't any

View File

@@ -1,22 +1,24 @@
<?php
namespace Zotlabs\Module; /** @file */
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Daemon\Master;
class Locs extends \Zotlabs\Web\Controller {
class Locs extends Controller {
function post() {
if(! local_channel())
return;
$channel = \App::get_channel();
$channel = App::get_channel();
if($_REQUEST['primary']) {
$hubloc_id = intval($_REQUEST['primary']);
if($hubloc_id) {
$r = q("select hubloc_id from hubloc where hubloc_id = %d and hubloc_hash = '%s' limit 1",
$r = q("select * from hubloc where hubloc_id = %d and hubloc_hash = '%s' limit 1",
intval($hubloc_id),
dbesc($channel['channel_hash'])
);
@@ -26,15 +28,16 @@ class Locs extends \Zotlabs\Web\Controller {
return;
}
$r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' ",
dbesc($channel['channel_hash'])
q("UPDATE hubloc SET hubloc_primary = 0 WHERE hubloc_primary = 1 AND (hubloc_hash = '%s' OR hubloc_hash = '%s')",
dbesc($channel['channel_hash']),
dbesc($channel['channel_portable_id'])
);
$r = q("update hubloc set hubloc_primary = 1 where hubloc_id = %d and hubloc_hash = '%s'",
q("UPDATE hubloc SET hubloc_primary = 1 WHERE hubloc_id = %d AND hubloc_hash = '%s'",
intval($hubloc_id),
dbesc($channel['channel_hash'])
);
\Zotlabs\Daemon\Master::Summon(array('Notifier','location',$channel['channel_id']));
Master::Summon( [ 'Notifier', 'refresh_all', $channel['channel_id'] ] );
return;
}
}
@@ -68,11 +71,12 @@ class Locs extends \Zotlabs\Web\Controller {
}
}
$r = q("update hubloc set hubloc_deleted = 1 where hubloc_id = %d and hubloc_hash = '%s'",
intval($hubloc_id),
dbesc($channel['channel_hash'])
q("UPDATE hubloc SET hubloc_deleted = 1 WHERE hubloc_id_url = '%s' AND (hubloc_hash = '%s' OR hubloc_hash = '%s')",
dbesc($r[0]['hubloc_id_url']),
dbesc($channel['channel_hash']),
dbesc($channel['channel_portable_id'])
);
\Zotlabs\Daemon\Master::Summon(array('Notifier','location',$channel['channel_id']));
Master::Summon( [ 'Notifier', 'refresh_all', $channel['channel_id'] ] );
return;
}
}
@@ -88,10 +92,10 @@ class Locs extends \Zotlabs\Web\Controller {
return;
}
$channel = \App::get_channel();
$channel = App::get_channel();
if($_REQUEST['sync']) {
\Zotlabs\Daemon\Master::Summon(array('Notifier','location',$channel['channel_id']));
Master::Summon( [ 'Notifier', 'refresh_all', $channel['channel_id'] ] );
info( t('Syncing locations') . EOL);
goaway(z_root() . '/locs');
}

View File

@@ -1,213 +1,133 @@
<?php
namespace Zotlabs\Module;
@require_once('include/zot.php');
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Web\HTTPSig;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\SConfig;
class Magic extends \Zotlabs\Web\Controller {
class Magic extends Controller {
function init() {
$ret = array('success' => false, 'url' => '', 'message' => '');
logger('mod_magic: invoked', LOGGER_DEBUG);
logger('mod_magic: args: ' . print_r($_REQUEST,true),LOGGER_DATA);
$addr = ((x($_REQUEST,'addr')) ? $_REQUEST['addr'] : '');
$bdest = ((x($_REQUEST,'bdest')) ? $_REQUEST['bdest'] : '');
$dest = ((x($_REQUEST,'dest')) ? $_REQUEST['dest'] : '');
$test = ((x($_REQUEST,'test')) ? intval($_REQUEST['test']) : 0);
$rev = ((x($_REQUEST,'rev')) ? intval($_REQUEST['rev']) : 0);
$owa = ((x($_REQUEST,'owa')) ? intval($_REQUEST['owa']) : 0);
$delegate = ((x($_REQUEST,'delegate')) ? $_REQUEST['delegate'] : '');
if($bdest)
$ret = [
'success' => false,
'url' => '',
'message' => ''
];
logger('mod_magic: invoked', LOGGER_DEBUG);
logger('args: ' . print_r($_REQUEST,true),LOGGER_DATA);
$addr = ((x($_REQUEST,'addr')) ? $_REQUEST['addr'] : '');
$bdest = ((x($_REQUEST,'bdest')) ? $_REQUEST['bdest'] : '');
$dest = ((x($_REQUEST,'dest')) ? $_REQUEST['dest'] : '');
$rev = ((x($_REQUEST,'rev')) ? intval($_REQUEST['rev']) : 0);
$owa = ((x($_REQUEST,'owa')) ? intval($_REQUEST['owa']) : 0);
$delegate = ((x($_REQUEST,'delegate')) ? $_REQUEST['delegate'] : '');
// bdest is preferred as it is hex-encoded and can survive url rewrite and argument parsing
if ($bdest) {
$dest = hex2bin($bdest);
}
$parsed = parse_url($dest);
if(! $parsed) {
if($test) {
$ret['message'] .= 'could not parse ' . $dest . EOL;
return($ret);
}
if (! $parsed) {
goaway($dest);
}
$basepath = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '');
$x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
dbesc($basepath)
);
if(! $x) {
/*
* We have no records for, or prior communications with this hub.
* If an address was supplied, let's finger them to create a hub record.
* Otherwise we'll use the special address '[system]' which will return
* either a system channel or the first available normal channel. We don't
* really care about what channel is returned - we need the hub information
* from that response so that we can create signed auth packets destined
* for that hub.
*
*/
$j = \Zotlabs\Zot\Finger::run((($addr) ? $addr : '[system]@' . $parsed['host']),null);
if($j['success']) {
import_xchan($j);
// Now try again
$x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
dbesc($basepath)
);
}
}
if(! $x) {
if($rev)
goaway($dest);
else {
logger('mod_magic: no channels found for requested hub.' . print_r($_REQUEST,true));
if($test) {
$ret['message'] .= 'This site has no previous connections with ' . $basepath . EOL;
return $ret;
}
notice( t('Hub not found.') . EOL);
return;
}
}
$owapath = SConfig::get($basepath,'system','openwebauth', $basepath . '/owa');
// This is ready-made for a plugin that provides a blacklist or "ask me" before blindly authenticating.
// By default, we'll proceed without asking.
$arr = array(
'channel_id' => local_channel(),
'xchan' => $x[0],
$arr = [
'channel_id' => local_channel(),
'destination' => $dest,
'proceed' => true
);
'proceed' => true
];
call_hooks('magic_auth',$arr);
$dest = $arr['destination'];
if(! $arr['proceed']) {
if($test) {
$ret['message'] .= 'cancelled by plugin.' . EOL;
return $ret;
}
if (! $arr['proceed']) {
goaway($dest);
}
if((get_observer_hash()) && ($x[0]['hubloc_url'] === z_root())) {
if((get_observer_hash()) && (stripos($dest,z_root()) === 0)) {
// We are already authenticated on this site and a registered observer.
// Just redirect.
if($test) {
$ret['success'] = true;
$ret['message'] .= 'Local site - you are already authenticated.' . EOL;
return $ret;
}
$delegation_success = false;
if($delegate) {
// First check if this is a delegate request on the local system and process accordingly.
// Otherwise redirect.
if ($delegate) {
$r = q("select * from channel left join hubloc on channel_hash = hubloc_hash where hubloc_addr = '%s' limit 1",
dbesc($delegate)
);
if($r && intval($r[0]['channel_id'])) {
$allowed = perm_is_allowed($r[0]['channel_id'],get_observer_hash(),'delegate');
if($allowed) {
if ($r) {
$c = array_shift($r);
if (perm_is_allowed($c['channel_id'],get_observer_hash(),'delegate')) {
$tmp = $_SESSION;
$_SESSION['delegate_push'] = $tmp;
$_SESSION['delegate_channel'] = $r[0]['channel_id'];
$_SESSION['delegate'] = get_observer_hash();
$_SESSION['account_id'] = intval($r[0]['channel_account_id']);
change_channel($r[0]['channel_id']);
$delegation_success = true;
$_SESSION['delegate_push'] = $tmp;
$_SESSION['delegate_channel'] = $c['channel_id'];
$_SESSION['delegate'] = get_observer_hash();
$_SESSION['account_id'] = intval($c['channel_account_id']);
change_channel($c['channel_id']);
}
}
}
// FIXME: check and honour local delegation
goaway($dest);
}
if(local_channel()) {
$channel = \App::get_channel();
if (local_channel()) {
$channel = App::get_channel();
// OpenWebAuth
if($owa) {
if ($owa) {
$dest = strip_zids($dest);
$dest = strip_query_param($dest,'f');
// We now post to the OWA endpoint. This improves security by providing a signed digest
$data = json_encode([ 'OpenWebAuth' => random_string() ]);
$headers = [];
$headers['Accept'] = 'application/x-zot+json' ;
$headers['Content-Type'] = 'application/x-zot+json' ;
$headers['X-Open-Web-Auth'] = random_string();
$headers['Digest'] = HTTPSig::generate_digest_header($data);
$headers['Host'] = $parsed['host'];
$headers['Digest'] = 'SHA-256=' . \Zotlabs\Web\HTTPSig::generate_digest($data,false);
$headers['(request-target)'] = 'post ' . '/owa';
$headers = \Zotlabs\Web\HTTPSig::create_sig('',$headers,$channel['channel_prvkey'],
'acct:' . $channel['channel_address'] . '@' . \App::get_hostname(),false,true,'sha512');
$x = z_post_url($basepath . '/owa',$data,$redirects,[ 'headers' => $headers ]);
if($x['success']) {
$headers = HTTPSig::create_sig($headers,$channel['channel_prvkey'], channel_url($channel),true,'sha512');
$x = z_post_url($owapath,$data,$redirects,[ 'headers' => $headers ]);
logger('owa fetch returned: ' . print_r($x,true),LOGGER_DATA);
if ($x['success']) {
$j = json_decode($x['body'],true);
if($j['success']) {
if ($j['success'] && $j['encrypted_token']) {
// decrypt the token using our private key
$token = '';
if($j['encrypted_token']) {
openssl_private_decrypt(base64url_decode($j['encrypted_token']),$token,$channel['channel_prvkey']);
}
else {
$token = $j['token'];
}
$strp = strpbrk($dest,'?&');
$args = (($strp) ? '&owt=' . $token : '?f=&owt=' . $token) . (($delegate) ? '&delegate=1' : '');
openssl_private_decrypt(base64url_decode($j['encrypted_token']),$token,$channel['channel_prvkey']);
$x = strpbrk($dest,'?&');
// redirect using the encrypted token which will be exchanged for an authenticated session
$args = (($x) ? '&owt=' . $token : '?f=&owt=' . $token) . (($delegate) ? '&delegate=1' : '');
goaway($dest . $args);
}
}
goaway($dest);
}
$token = random_string();
\Zotlabs\Lib\Verify::create('auth',$channel['channel_id'],$token,$x[0]['hubloc_url']);
$target_url = $x[0]['hubloc_callback'] . '/?f=&auth=' . urlencode(channel_reddress($channel))
. '&sec=' . $token . '&dest=' . urlencode($dest) . '&version=' . ZOT_REVISION;
if($delegate)
$target_url .= '&delegate=' . urlencode($delegate);
logger('mod_magic: redirecting to: ' . $target_url, LOGGER_DEBUG);
if($test) {
$ret['success'] = true;
$ret['url'] = $target_url;
$ret['message'] = 'token ' . $token . ' created for channel ' . $channel['channel_id'] . ' for url ' . $x[0]['hubloc_url'] . EOL;
return $ret;
}
goaway($target_url);
}
if($test) {
$ret['message'] = 'Not authenticated or invalid arguments to mod_magic' . EOL;
return $ret;
}
goaway($dest);
}
}

View File

@@ -1,444 +0,0 @@
<?php
namespace Zotlabs\Module;
require_once('include/acl_selectors.php');
require_once('include/message.php');
require_once('include/zot.php');
require_once("include/bbcode.php");
class Mail extends \Zotlabs\Web\Controller {
function post() {
if(! local_channel())
return;
$replyto = ((x($_REQUEST,'replyto')) ? notags(trim($_REQUEST['replyto'])) : '');
$subject = ((x($_REQUEST,'subject')) ? notags(trim($_REQUEST['subject'])) : '');
$body = ((x($_REQUEST,'body')) ? escape_tags(trim($_REQUEST['body'])) : '');
$recipient = ((x($_REQUEST,'messageto')) ? notags(trim(urldecode($_REQUEST['messageto']))) : '');
$rstr = ((x($_REQUEST,'messagerecip')) ? notags(trim($_REQUEST['messagerecip'])) : '');
$preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
$expires = ((x($_REQUEST,'expires')) ? datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expires']) : NULL_DATE);
$raw = ((x($_REQUEST,'raw')) ? intval($_REQUEST['raw']) : 0);
$mimetype = ((x($_REQUEST,'mimetype')) ? notags(trim($_REQUEST['mimetype'])) : 'text/bbcode');
if($preview) {
if($raw) {
$body = mail_prepare_binary(['id' => 'M0']);
echo json_encode(['preview' => $body]);
}
else {
$body = cleanup_bbcode($body);
$results = linkify_tags($body, local_channel());
if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
$attachments = array();
foreach($match[2] as $mtch) {
$hash = substr($mtch,0,strpos($mtch,','));
$rev = intval(substr($mtch,strpos($mtch,',')));
$r = attach_by_hash_nodata($hash,get_observer_hash(),$rev);
if($r['success']) {
$attachments[] = array(
'href' => z_root() . '/attach/' . $r['data']['hash'],
'length' => $r['data']['filesize'],
'type' => $r['data']['filetype'],
'title' => urlencode($r['data']['filename']),
'revision' => $r['data']['revision']
);
}
$body = trim(str_replace($match[1],'',$body));
}
}
echo json_encode(['preview' => zidify_links(smilies(bbcode($body)))]);
}
killme();
}
// If we have a raw string for a recipient which hasn't been auto-filled,
// it means they probably aren't in our address book, hence we don't know
// if we have permission to send them private messages.
// finger them and find out before we try and send it.
if(! $recipient) {
$channel = \App::get_channel();
$j = \Zotlabs\Zot\Finger::run(punify($rstr),$channel);
if(! $j['success']) {
notice( t('Unable to lookup recipient.') . EOL);
return;
}
logger('message_post: lookup: ' . $rstr . ' ' . print_r($j,true));
if(! $j['guid']) {
notice( t('Unable to communicate with requested channel.'));
return;
}
$x = import_xchan($j);
if(! $x['success']) {
notice( t('Cannot verify requested channel.'));
return;
}
$recipient = $x['hash'];
$their_perms = 0;
if($j['permissions']['data']) {
$permissions = crypto_unencapsulate($j['permissions'],$channel['channel_prvkey']);
if($permissions)
$permissions = json_decode($permissions, true);
logger('decrypted permissions: ' . print_r($permissions,true), LOGGER_DATA);
}
else
$permissions = $j['permissions'];
if(! ($permissions['post_mail'])) {
notice( t('Selected channel has private message restrictions. Send failed.'));
// reported issue: let's still save the message and continue. We'll just tell them
// that nothing useful is likely to happen. They might have spent hours on it.
// return;
}
}
require_once('include/text.php');
linkify_tags($body, local_channel());
if(! $recipient) {
notice('No recipient found.');
\App::$argc = 2;
\App::$argv[1] = 'new';
return;
}
// We have a local_channel, let send_message use the session channel and save a lookup
$ret = send_message(0, $recipient, $body, $subject, $replyto, $expires, $mimetype, $raw);
if($ret['success']) {
xchan_mail_query($ret['mail']);
build_sync_packet(0,array('conv' => array($ret['conv']),'mail' => array(encode_mail($ret['mail'],true))));
}
else {
notice($ret['message']);
}
goaway(z_root() . '/mail/combined');
}
function get() {
$o = '';
nav_set_selected('Mail');
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return login();
}
$channel = \App::get_channel();
head_set_icon($channel['xchan_photo_s']);
$cipher = get_pconfig(local_channel(),'system','default_cipher');
if(! $cipher)
$cipher = 'aes256';
$tpl = get_markup_template('mail_head.tpl');
$header = replace_macros($tpl, array(
'$header' => t('Messages'),
));
if(argc() == 3 && intval(argv(1)) && argv(2) === 'download') {
$r = q("select * from mail where id = %d and channel_id = %d",
intval(argv(1)),
intval(local_channel())
);
if($r) {
header('Content-type: ' . $r[0]['mail_mimetype']);
header('Content-disposition: attachment; filename="' . t('message') . '-' . $r[0]['id'] . '"' );
$body = (($r[0]['mail_obscured']) ? base64url_decode(str_rot47($r[0]['body'])) : $r[0]['body']);
echo $body;
killme();
}
}
if((argc() == 4) && (argv(2) === 'drop')) {
if(! intval(argv(3)))
return;
$cmd = argv(2);
$mailbox = argv(1);
$r = private_messages_drop(local_channel(), argv(3));
if($r) {
//info( t('Message deleted.') . EOL );
}
goaway(z_root() . '/mail/' . $mailbox);
}
if((argc() == 4) && (argv(2) === 'recall')) {
if(! intval(argv(3)))
return;
$cmd = argv(2);
$mailbox = argv(1);
$r = q("update mail set mail_recalled = 1 where id = %d and channel_id = %d",
intval(argv(3)),
intval(local_channel())
);
$x = q("select * from mail where id = %d and channel_id = %d",
intval(argv(3)),
intval(local_channel())
);
if($x) {
build_sync_packet(local_channel(),array('mail' => encode_mail($x[0],true)));
}
\Zotlabs\Daemon\Master::Summon(array('Notifier','mail',intval(argv(3))));
if($r) {
info( t('Message recalled.') . EOL );
}
goaway(z_root() . '/mail/' . $mailbox . '/' . argv(3));
}
if((argc() == 4) && (argv(2) === 'dropconv')) {
if(! intval(argv(3)))
return;
$cmd = argv(2);
$mailbox = argv(1);
$r = private_messages_drop(local_channel(), argv(3), true);
if($r)
info( t('Conversation removed.') . EOL );
goaway(z_root() . '/mail/' . $mailbox);
}
if((argc() > 1) && (argv(1) === 'new')) {
$plaintext = true;
$tpl = get_markup_template('msg-header.tpl');
$header = replace_macros($tpl, array(
'$baseurl' => z_root(),
'$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
'$nickname' => $channel['channel_address'],
'$linkurl' => t('Please enter a link URL:'),
'$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
));
\App::$page['htmlhead'] .= $header;
$prename = '';
$preid = '';
if(x($_REQUEST,'hash')) {
$r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash
where abook_channel = %d and abook_xchan = '%s' limit 1",
intval(local_channel()),
dbesc($_REQUEST['hash'])
);
if(!$r) {
$r = q("select * from xchan where xchan_hash = '%s' and xchan_network = 'zot' limit 1",
dbesc($_REQUEST['hash'])
);
}
if($r) {
$prename = (($r[0]['abook_id']) ? $r[0]['xchan_name'] : $r[0]['xchan_addr']);
$preurl = $r[0]['xchan_url'];
$preid = (($r[0]['abook_id']) ? ($r[0]['xchan_hash']) : '');
}
else {
notice( t('Requested channel is not in this network') . EOL );
}
}
$tpl = get_markup_template('prv_message.tpl');
$o .= replace_macros($tpl,array(
'$new' => true,
'$header' => t('Send Private Message'),
'$to' => t('To:'),
'$prefill' => $prename,
'$preid' => $preid,
'$subject' => t('Subject:'),
'$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''),
'$text' => ((x($_REQUEST,'body')) ? htmlspecialchars($_REQUEST['body'], ENT_COMPAT, 'UTF-8') : ''),
'$yourmessage' => t('Your message:'),
'$parent' => '',
'$attach' => t('Attach file'),
'$insert' => t('Insert web link'),
'$submit' => t('Send'),
'$defexpire' => '',
'$feature_expire' => ((feature_enabled(local_channel(),'content_expire')) ? true : false),
'$expires' => t('Set expiration date'),
'$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false),
'$encrypt' => t('Encrypt text'),
'$cipher' => $cipher,
));
return $o;
}
$direct_mid = 0;
switch(argv(1)) {
case 'combined':
$mailbox = 'combined';
break;
case 'inbox':
$mailbox = 'inbox';
break;
case 'outbox':
$mailbox = 'outbox';
break;
default:
$mailbox = 'combined';
// notifications direct to mail/nn
if(intval(argv(1)))
$direct_mid = intval(argv(1));
break;
}
$last_message = private_messages_list(local_channel(), $mailbox, 0, 1);
$mid = ((argc() > 2) && (intval(argv(2)))) ? argv(2) : $last_message[0]['id'];
if($direct_mid)
$mid = $direct_mid;
$plaintext = true;
// if( local_channel() && feature_enabled(local_channel(),'richtext') )
// $plaintext = false;
if($mailbox == 'combined') {
$messages = private_messages_fetch_conversation(local_channel(), $mid, true);
}
else {
$messages = private_messages_fetch_message(local_channel(), $mid, true);
}
if(! $messages) {
//info( t('Message not found.') . EOL);
return;
}
if($messages[0]['to_xchan'] === $channel['channel_hash'])
\App::$poi = $messages[0]['from'];
else
\App::$poi = $messages[0]['to'];
$tpl = get_markup_template('msg-header.tpl');
\App::$page['htmlhead'] .= replace_macros($tpl, array(
'$nickname' => $channel['channel_address'],
'$baseurl' => z_root(),
'$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
'$linkurl' => t('Please enter a link URL:'),
'$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
));
$mails = array();
$seen = 0;
$unknown = false;
foreach($messages as $message) {
$s = theme_attachments($message);
if($message['mail_raw'])
$message['body'] = mail_prepare_binary([ 'id' => $message['id'] ]);
else
$message['body'] = zidify_links(smilies(bbcode($message['body'])));
$mails[] = array(
'mailbox' => $mailbox,
'id' => $message['id'],
'mid' => $message['mid'],
'from_name' => $message['from']['xchan_name'],
'from_url' => chanlink_hash($message['from_xchan']),
'from_photo' => $message['from']['xchan_photo_s'],
'to_name' => $message['to']['xchan_name'],
'to_url' => chanlink_hash($message['to_xchan']),
'to_photo' => $message['to']['xchan_photo_s'],
'subject' => $message['title'],
'body' => $message['body'],
'attachments' => $s,
'delete' => t('Delete message'),
'dreport' => t('Delivery report'),
'recall' => t('Recall message'),
'can_recall' => ($channel['channel_hash'] == $message['from_xchan']),
'is_recalled' => (intval($message['mail_recalled']) ? t('Message has been recalled.') : ''),
'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'], 'c'),
);
$seen = $message['seen'];
}
$recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to' : 'from');
$tpl = get_markup_template('mail_display.tpl');
$o = replace_macros($tpl, array(
'$mailbox' => $mailbox,
'$prvmsg_header' => $message['title'],
'$thread_id' => $mid,
'$thread_subject' => $message['title'],
'$thread_seen' => $seen,
'$delete' => t('Delete Conversation'),
'$canreply' => (($unknown) ? false : '1'),
'$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."),
'$mails' => $mails,
// reply
'$header' => t('Send Reply'),
'$to' => t('To:'),
'$reply' => true,
'$subject' => t('Subject:'),
'$subjtxt' => $message['title'],
'$yourmessage' => sprintf(t('Your message for %s (%s):'), $message[$recp]['xchan_name'], $message[$recp]['xchan_addr']),
'$text' => '',
'$parent' => $message['parent_mid'],
'$recphash' => $message[$recp]['xchan_hash'],
'$attach' => t('Attach file'),
'$insert' => t('Insert web link'),
'$submit' => t('Submit'),
'$defexpire' => '',
'$feature_expire' => ((feature_enabled(local_channel(),'content_expire')) ? true : false),
'$expires' => t('Set expiration date'),
'$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false),
'$encrypt' => t('Encrypt text'),
'$cipher' => $cipher,
));
return $o;
}
}

View File

@@ -54,9 +54,10 @@ class Menu extends \Zotlabs\Web\Controller {
if($_REQUEST['menu_system'])
$_REQUEST['menu_flags'] |= MENU_SYSTEM;
$menu_id = ((argc() > 1) ? intval(argv(1)) : 0);
$menu_id = ((argc() > 2) ? intval(argv(2)) : 0);
if($menu_id) {
$_REQUEST['menu_id'] = intval(argv(1));
$_REQUEST['menu_id'] = $menu_id;
$r = menu_edit($_REQUEST);
if($r) {
menu_sync_packet($uid,get_observer_hash(),$menu_id);

View File

@@ -2,6 +2,8 @@
namespace Zotlabs\Module;
use Zotlabs\Lib\Libsync;
require_once('include/conversation.php');
@@ -14,7 +16,7 @@ class Moderate extends \Zotlabs\Web\Controller {
return;
}
\App::set_pager_itemspage(60);
\App::set_pager_itemspage(30);
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
//show all items
@@ -77,7 +79,7 @@ class Moderate extends \Zotlabs\Web\Controller {
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
build_sync_packet(local_channel(),array('item' => array(encode_item($sync_item[0],true))));
Libsync::build_sync_packet(local_channel(),array('item' => array(encode_item($sync_item[0],true))));
}
if($action === 'approve') {
\Zotlabs\Daemon\Master::Summon(array('Notifier', 'comment-new', $post_id));

Some files were not shown because too many files have changed in this diff Show More