Compare commits

...

1045 Commits
3.6 ... 3.8.9

Author SHA1 Message Date
Mario
90fd323ac5 bump version 2019-02-03 15:03:56 +01:00
Mario Vavti
b6c384a0f7 cleanup logging and return if query returns empty result
(cherry picked from commit c657d766cf)
2019-02-03 15:02:06 +01:00
Mario Vavti
cda8a7be38 do not overwrite $sql_extra
(cherry picked from commit 4706ff6938)
2019-02-03 15:01:39 +01:00
Mario Vavti
ddbc35181c fix page jumping when liking a collapsed/expanded post
(cherry picked from commit 54806f6ee8)
2019-01-24 13:39:49 +01:00
zotlabs
57dde3e980 failure to import mail
(cherry picked from commit 7b30fc4b82)
2019-01-11 12:20:50 +01:00
Mario Vavti
3eba0c2297 do not count removed channels
(cherry picked from commit 01f4ce96f1)
2019-01-10 13:36:31 +01:00
Mario
414b7e28d3 bump version 2018-12-22 21:02:49 +01:00
Mario Vavti
fca464071f update changelog
(cherry picked from commit cdb85f1309)
2018-12-22 21:01:50 +01:00
Mario Vavti
4f08f4b84c use count() instead of sizeof()
(cherry picked from commit 774dd6d5e3)
2018-12-22 20:20:58 +01:00
Mario Vavti
1b5175d018 check if we deal with an array before sizeof()
(cherry picked from commit 339c9cceec)
2018-12-22 20:20:13 +01:00
Mario Vavti
0bfda6d4c8 revert padding for text highlight. It is messing with indent punctuation and decreases legibility of the highlighted text.
(cherry picked from commit fac3579fb0)
2018-12-22 20:18:12 +01:00
Mario
880b22604b manualy Fix cURL with HTTP/2 due to merge conflicts 2018-12-22 20:17:20 +01:00
Mario
04a2dc075f manualy remove scale_external_images() due to merge conflicts 2018-12-22 20:08:44 +01:00
Max Kostikov
01448c152c Remove scale_external_images()
(cherry picked from commit 1541f67eab)
2018-12-22 20:04:09 +01:00
Max Kostikov
a09beb3833 Remove scale_external_images()
(cherry picked from commit a2959c6e9e)
2018-12-22 20:03:49 +01:00
phani00
feda1e6d84 remove color from style.css (default) but add a little padding; add color & border radius to dark.css.
(cherry picked from commit 2354bb5427)
2018-12-22 19:54:48 +01:00
phani00
4256bea418 change hl text color to the default text color in non-dark schema. looks good, except in dark, where i can change it in dark.css.
(cherry picked from commit b97143e9db)
2018-12-22 19:54:31 +01:00
phani00
4d47b098e5 remove some fancy formatting.
(cherry picked from commit aaab905e72)
2018-12-22 19:54:11 +01:00
Mario Vavti
163754a46c make mod channel deal with b64 encoded mid\s
;


(cherry picked from commit bc6d384ca9)
2018-12-22 19:53:37 +01:00
phani00
66b56416b6 new fix for dark theme
change implementation of hl-tags in include/bbcode.php
insert class='default-highlight' instead of background-color: 'yellow' into span
add span.default-highlight definition to view/theme/redbasic/css/style.css

this works for all schemas incl. dark.


(cherry picked from commit aace8a14ce)
2018-12-22 19:52:39 +01:00
phani00
c855346358 remove my dark theme fixes.
(cherry picked from commit 70a7661711)
2018-12-22 19:52:09 +01:00
Pascal Deklerck
0e32c86c3d Update OAuth2Storage.php - fix email retrieval in getUser
(cherry picked from commit 6a825cc504)
2018-12-22 19:51:16 +01:00
M. Dent
19952264c8 Add reload to util/addons
(cherry picked from commit 0e5d76e735)
2018-12-22 19:43:16 +01:00
Mario Vavti
5ec1e97cae do not add timestamp to the photo src. caching is handled in mod photo now.
(cherry picked from commit e34853e19e)
2018-12-21 21:45:33 +01:00
zotlabs
5f5746a2f6 like permission issue
(cherry picked from commit 389b4beba4)
2018-12-21 21:44:33 +01:00
Mario Vavti
d0ee6d1ad2 missing observer check
(cherry picked from commit ec769bc9f9)
2018-12-20 19:45:59 +01:00
zotlabs
06c71eec65 default curl to http/1.1
(cherry picked from commit 04a45a407e)
2018-12-17 12:17:44 +01:00
DM42.Net (Matt Dent)
aabc6c2825 Add return if no local_channel()
(cherry picked from commit 5bcc379530)
2018-12-17 10:46:43 +01:00
DM42.Net (Matt Dent)
8323458da9 ARTICLES MODULE: Default to local_channel() user when no argv(1) is passed.
(cherry picked from commit 3f06a857c2)
2018-12-17 10:46:24 +01:00
Mario Vavti
d7c7ff1c12 fix wiki preview issue with hyperlinks
(cherry picked from commit 919ea9f750)
2018-12-15 18:20:21 +01:00
Mario Vavti
d77c7d51e3 update changelog
(cherry picked from commit 4ff3c57976)
2018-12-14 21:47:20 +01:00
Mario Vavti
d51d0160d3 fix issue with linkdropper
(cherry picked from commit f81a3ba45d)
2018-12-14 21:32:23 +01:00
zotlabs
c2ad9d4996 regression: the ability to order apps messed up since adding pinned apps to the ordering
(cherry picked from commit 6464099364)
2018-12-14 21:31:02 +01:00
Mario
79f828125d version bump 2018-12-14 11:47:02 +01:00
Mario Vavti
ad4b18cbbe return on readImageBlob() exception
(cherry picked from commit 993db01400)
2018-12-14 11:31:11 +01:00
Mario Vavti
1bd49671b7 add photo_view_filter hook and fix minor issue with unset auto_save_draft variable which resultet in a javascript error
(cherry picked from commit 7894fed741)
2018-12-14 11:30:57 +01:00
zotlabs
9896057549 home notifications won't expand if there are more than 300 unseen network notifications ahead of them.
(cherry picked from commit 30efeb5bec)
2018-12-14 11:30:25 +01:00
phani00
44832bbacb change redbasic dark schema to make categories and highlights readable
additions to /view/theme/redbasic/schema/dark.css to change the appearance of category
badges and highlighted text ([hl]...[/hl]).

hl text changed from master: it's not 'strong' anymore. commented out the pseudo-class
selector that works in master but not in dev anymore.


(cherry picked from commit 18caf0273f)
2018-12-14 11:30:05 +01:00
zotlabs
f20a923dd7 total_identities restriction off by one
(cherry picked from commit e60fb17524)
2018-12-14 11:29:33 +01:00
zotlabs
30403da326 reset page title if article has no title.
(cherry picked from commit 8ab1f31058)
2018-12-14 11:29:06 +01:00
Mario Vavti
6b68a76bbe quickfix for es-es language 2018-12-03 21:22:02 +01:00
Mario Vavti
8f10b58cb1 version 3.8.6 2018-12-03 12:23:55 +01:00
Mario Vavti
f8bc408abc update strings 2018-12-03 12:07:56 +01:00
Mario Vavti
f581f6163a optimize autoload cache 2018-12-03 11:52:38 +01:00
Mario Vavti
88486a1278 changelog 2018-12-03 11:47:28 +01:00
Mario Vavti
9fcadc2d7c prevent incompatible export files (osada/zap) from being imported (manual patch from dev) 2018-12-03 11:08:39 +01:00
Mario Vavti
9ef6c57ca5 more notifications fixes 2018-12-03 10:46:49 +01:00
Mario Vavti
443d7684db catch exception if readImageBlob() receives bogus data 2018-12-03 10:45:43 +01:00
Mario Vavti
a3ba7f0788 fallback to url if we have not got an addr 2018-12-02 11:38:13 +01:00
Mario Vavti
f083c0cba1 fix filtering by addr in handleNotificationsItems() 2018-12-02 10:58:54 +01:00
Mario Vavti
defa2d9df1 make pdf preview 100% width and 300px height to match it openstreetmaps preview
(cherry picked from commit df84352385)
2018-12-02 10:18:37 +01:00
Mario Vavti
05c422ef23 redbasic sticky aside fixes
(cherry picked from commit 8d4f6a7865)
2018-12-02 10:18:20 +01:00
zotlabs
51d274961b typo
(cherry picked from commit 6f22e47feb)
2018-12-02 10:18:05 +01:00
zotlabs
4b4cc04897 allow notification filtering by name or addr
(cherry picked from commit c6acb6191c)
2018-12-02 10:17:45 +01:00
zotlabs
4bf3d4d87a attached photo permissions regression
(cherry picked from commit 6cade7d935)
2018-12-02 10:17:29 +01:00
Manuel Jiménez Friaza
71cc980e96 Revision 1 doc/es-es/about/about.bb
(cherry picked from commit 5ac08ec3aa)

(cherry picked from commit 37d563c30e)
2018-12-02 10:16:50 +01:00
Mario
58c0b81908 use flex for the default template
(cherry picked from commit 3775be4ce9)
2018-12-02 10:16:24 +01:00
M. Dent
3b42bd43ab Do not store serialized pconfig value received via to Module/Pconfig.php
(cherry picked from commit 6b02c664fb)
2018-12-02 10:15:55 +01:00
Mario
a151532ffa update jquery-file-upload and psr-log via composer
(cherry picked from commit c7ae3fdc9a)
2018-12-02 10:14:58 +01:00
Mario
a0d1ce77dc update imagesloaded to version 4.1.4 via composer
(cherry picked from commit c667572d3e)
2018-12-02 10:14:37 +01:00
Manuel Jiménez Friaza
863cae1bab Update es-es
(cherry picked from commit ca98a566ee)
2018-12-02 10:13:43 +01:00
zotlabs
4010ea814a fix mastodon tag notifications (again)
(cherry picked from commit 8e71324514)
2018-12-02 10:13:12 +01:00
zotlabs
8e25c091f4 no mention notifications from mastodon (and pleroma)
(cherry picked from commit ea235c0c67)
2018-12-02 10:12:44 +01:00
Mario Vavti
0bba9482df fix call to undefined function 2018-11-21 13:21:29 +01:00
Mario Vavti
f8a8559523 fix typo which prevented propagation of comments
(cherry picked from commit 0c94747ab1)
2018-11-20 10:09:46 +01:00
Mario Vavti
1044e8e91a version 3.8.5 2018-11-19 11:12:32 +01:00
Mario Vavti
ba4b1cb5af Merge branch 'master' of https://framagit.org/hubzilla/core 2018-11-19 11:10:36 +01:00
Mario Vavti
5cb4cdaa5e changelog 2018-11-19 11:10:22 +01:00
Mario
7be1d9e45a Merge branch 'patch-20181118a' into 'dev'
Patch 20181118a - fix delayed publication of posts

See merge request hubzilla/core!1398

(cherry picked from commit f34af496ec)

3787c490 Fix: delayed items propagate before publication on cloned channels
2018-11-19 10:45:01 +01:00
Mario Vavti
ae97649948 update sql schemas to include update column in pconfig table 2018-11-19 10:42:18 +01:00
Mario Vavti
f15e32d063 recalculate photo filesize when rotating an image 2018-11-17 09:41:26 +01:00
Mario Vavti
afc75af62f strlen($this->imageString()) does not return the correct size when dealing with os_storage images. use filesize() instead. 2018-11-16 22:14:11 +01:00
Mario
2778a7220f Merge branch 'master' into 'master'
delivery issue

See merge request hubzilla/core!1397
2018-11-16 10:29:45 +01:00
zotlabs
26f593afaa delivery issue 2018-11-15 13:52:25 -08:00
Mario Vavti
beac45b075 more changelog 2018-11-14 11:20:39 +01:00
Mario Vavti
dfc5159aa3 Merge branch 'dev' 2018-11-14 11:12:20 +01:00
Mario Vavti
886cdb440b changelog and version 2018-11-14 11:08:25 +01:00
Mario
6ed9443972 Merge branch 'patch-20181113b' into 'dev'
Patch 20181113b

See merge request hubzilla/core!1395
2018-11-14 09:30:54 +01:00
Mario
08e0f172de Merge branch 'dev' into 'dev'
Remove unneccessary fetch_image_from_url() function

See merge request hubzilla/core!1393
2018-11-14 09:30:28 +01:00
DM42.Net (Matt Dent)
f1d168f781 Fix double escaping after xss fix 2018-11-13 23:06:00 -05:00
DM42.Net (Matt Dent)
302d9796c4 Revert "Filter search box before display"
This reverts commit 35e66770be.
2018-11-13 22:59:36 -05:00
M. Dent
1260887fa7 Merge branch 'patch-20181113a' into 'dev'
Patch 20181113a

See merge request hubzilla/core!1394
2018-11-14 03:21:32 +01:00
DM42.Net (Matt Dent)
ce8073d25e Merge remote-tracking branch red/master into patch-20181113a. Add Mike's fix to search xss and Superblock fix. 2018-11-13 20:19:12 -05:00
zotlabs
31f4d9066b xss in search 2018-11-13 14:23:56 -08:00
DM42.Net (Matt Dent)
35e66770be Filter search box before display 2018-11-13 17:20:21 -05:00
Max Kostikov
cf2f7f2132 Update Photo.php 2018-11-13 12:52:35 +01:00
Max Kostikov
a145559662 Remove uneccessary include/photos.php 2018-11-13 11:45:18 +01:00
Max Kostikov
d029e3dc16 Text formatting in Photo.php 2018-11-13 11:39:42 +01:00
Max Kostikov
286326a98e Replace fetch_image_from_url() with z_fetch_url() 2018-11-13 11:38:49 +01:00
Max Kostikov
2f59d78737 Remove fetch_image_from_url() because of functions duplicate 2018-11-13 11:37:32 +01:00
Max Kostikov
adf4782076 Merge branch 'revert-6375f2d7' into 'dev'
Revert "Replace fetch_image_from_url() with z_fetch_url()"

See merge request hubzilla/core!1392
2018-11-13 11:36:02 +01:00
Max Kostikov
b38ffef2be Revert "Replace fetch_image_from_url() with z_fetch_url()"
This reverts commit 6375f2d73a
2018-11-13 11:25:46 +01:00
Max Kostikov
6375f2d73a Replace fetch_image_from_url() with z_fetch_url() 2018-11-13 11:25:14 +01:00
M. Dent
a7d3a49171 Merge branch 'fix-activity-filter-widget' into 'dev'
use the correct javascript function for this case

See merge request hubzilla/core!1390
2018-11-12 21:50:08 +01:00
M. Dent
920e7db709 Merge branch 'css-fixes' into 'dev'
css fixes

See merge request hubzilla/core!1391
2018-11-12 21:49:07 +01:00
zotlabs
4a6b45cf04 enotify::format hook for superblock 2018-11-12 11:13:36 -08:00
Mario Vavti
7bd60adfbe fix css issues in bbcode conversion and focus-light schema 2018-11-12 09:35:12 +01:00
Mario Vavti
c335719e8f use the correct javascript function for this case 2018-11-11 14:46:35 +01:00
Mario Vavti
d57cdf645e Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-11-11 14:01:25 +01:00
Mario
e47a96bf24 Merge branch 'dev' into 'dev'
Preserve photo modification date on edit

See merge request hubzilla/core!1389
2018-11-11 13:49:29 +01:00
Mario
daad607c7c Merge branch 'dev' into 'dev'
fix shared_header img expanding to 100% width when sharing a share

See merge request hubzilla/core!1387
2018-11-11 13:47:03 +01:00
Max Kostikov
29f1f9c872 Merge branch 'dev' into 'dev'
# Conflicts:
#   include/photo/photo_driver.php
2018-11-10 20:47:35 +01:00
Max Kostikov
a49cfa8142 Update photo_driver.php 2018-11-10 20:45:20 +01:00
Max Kostikov
b57d296adc Preserve photo modification date 2018-11-10 20:35:14 +01:00
Mario
01d8bd445e Merge branch 'dev' into 'dev'
Remove DNS check for database connection during installation...

See merge request hubzilla/core!1384
2018-11-10 15:02:27 +01:00
Mario Vavti
750d6f4be9 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-11-10 12:22:09 +01:00
Max Kostikov
c6e14a696e Fixed wrong value assign on compare with 0 2018-11-10 11:56:34 +01:00
Max Kostikov
d34423fce9 Fixed wrong value assign on compare with 0 2018-11-10 11:53:49 +01:00
Mario
4999547f87 Merge branch 'dev' into 'dev'
Preserve received image modification date on caching

See merge request hubzilla/core!1386
2018-11-10 11:47:20 +01:00
Mario Vavti
fc5dc9717a fix shared_header img expanding to 100% width when sharing a share 2018-11-10 11:31:06 +01:00
Max Kostikov
d20759c141 Do not return default images from vCard 2018-11-10 11:11:23 +01:00
Max Kostikov
f7b00c62a4 Remove unnecessary Zulu timezone mention 2018-11-10 10:05:28 +01:00
Max Kostikov
32873ce70d Preserve received image modification date on caching 2018-11-09 22:20:41 +01:00
Max Kostikov
dc59561a95 Fixed timezone conversion 2018-11-09 22:17:11 +01:00
Mario
4bf3fdd898 Merge branch 'patch-1' into 'dev'
Return image modification date on remote fetch for caching

See merge request hubzilla/core!1383
2018-11-09 16:51:36 +01:00
Andrew Manning
108a892a11 Remove DNS check for database connection during installation. Causes friction with Docker deployment. 2018-11-09 05:31:55 -05:00
Max Kostikov
2c4bd9a3fe Workaround for local resource path to photo from Diaspora 2018-11-09 10:03:58 +01:00
Max Kostikov
098ec1abb4 remove image type double guess by checking HTTP headers 2018-11-08 22:43:17 +01:00
Max Kostikov
17cf824545 Return image modification date using HTTP 'Last-Modified' and '304 Not Modified' on remote fetch for caching 2018-11-08 18:00:18 +01:00
M. Dent
e35f5d3c93 Merge branch 'fix-photo' into 'dev'
Fix photo

See merge request hubzilla/core!1382
2018-11-08 13:09:05 +01:00
Mario
f4f98e5856 Merge branch 'patch-1' into 'fix-photo'
Correct "Content-Length:" calculation added

See merge request mario/core!1
2018-11-08 12:13:00 +01:00
Max Kostikov
dc0335d1d5 Correct "Content-Length:" calculation added 2018-11-08 11:53:27 +01:00
M. Dent
6013814cf4 Merge branch 'fix-photo' into 'dev'
$data only contains the link to the image if the image is in os storage. The…

See merge request hubzilla/core!1379
2018-11-08 11:25:36 +01:00
Mario Vavti
e0a0570cc4 $data only contains the link to the image if the image is in os storage. The size is calculatet wrong in this case and the download fails. rely on filesize from the db for content-length 2018-11-08 11:06:44 +01:00
Mario
61deb4fcfd Merge branch 'patch-1' into 'dev'
Disable image caching if personal or group permissions enabled

See merge request hubzilla/core!1377
2018-11-08 10:25:11 +01:00
Mario Vavti
7c4c60425b Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-11-08 10:16:17 +01:00
Mario Vavti
302f49baf2 provide a function to log to syslog 2018-11-08 10:12:33 +01:00
Max Kostikov
3f6cd5a663 Disable image caching if personal or group permissions enabled 2018-11-07 19:52:38 +01:00
M. Dent
1b232041c9 Merge branch 'patch-1' into 'dev'
Added `If-Modified-Since` header support for better image caching and fixed absent 404 for photos

See merge request hubzilla/core!1375
2018-11-07 18:22:55 +01:00
Max Kostikov
eaf117cce1 Added If-Modified-Since header support for better image caching and fixed absent 404 for photos 2018-11-07 18:22:55 +01:00
zotlabs
7148311953 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-11-07 01:43:26 -08:00
Mario Vavti
c23dfa0d23 Merge remote-tracking branch 'mike/master' into dev 2018-11-07 10:15:40 +01:00
Mario Vavti
b08de33b0b fix es-es hstrings.php 2018-11-07 10:02:24 +01:00
Mario
fc1d8c0138 Merge branch 'revert-40d9277e' into 'dev'
Revert "remove 'Expiries' HTTP header"

See merge request hubzilla/core!1372
2018-11-07 09:36:30 +01:00
Max Kostikov
a5a77d1e7c Revert "remove 'Expiries' HTTP header"
This reverts commit 40d9277ef3
2018-11-07 08:41:32 +01:00
zotlabs
f57fcefe6b signature issue 2018-11-06 21:45:43 -08:00
M. Dent
6c6dca05e7 Merge branch 'patch-25' into 'dev'
'Last-Modified' and 'Content-Length' HTTP headers added for better image caching

See merge request hubzilla/core!1369
2018-11-06 19:25:38 +01:00
M. Dent
97b4a31b16 Merge branch 'patch-26' into 'dev'
New plural functions for JavaScript compatibility

See merge request hubzilla/core!1370
2018-11-06 18:26:58 +01:00
Max Kostikov
40d9277ef3 remove 'Expiries' HTTP header 2018-11-06 16:22:34 +01:00
Max Kostikov
009044b71e Update hmessages.po 2018-11-06 14:58:06 +01:00
Max Kostikov
4760a3f3e8 Update hmessages.po 2018-11-06 14:57:12 +01:00
Max Kostikov
3302012c02 New pt-br plural function for JavaScript compatibility 2018-11-06 14:55:58 +01:00
Max Kostikov
812c5a314f New nl plural function for JavaScript compatibility 2018-11-06 14:55:21 +01:00
Max Kostikov
c2da8c3fd4 New nb-no plural function for JavaScript compatibility 2018-11-06 14:54:49 +01:00
Max Kostikov
aa78640491 New it plural function for JavaScript compatibility 2018-11-06 14:54:06 +01:00
Max Kostikov
7c49688e1b New he plural function for JavaScript compatibility 2018-11-06 14:53:29 +01:00
Max Kostikov
dbe10c7965 New fi plural function for JavaScript compatibility 2018-11-06 14:52:58 +01:00
Max Kostikov
f1f5107282 New es plural function for JavaScript compatibility 2018-11-06 14:52:23 +01:00
Max Kostikov
cc06250bf8 New fr plural function for JavaScript compatibility 2018-11-06 14:50:37 +01:00
Max Kostikov
af1ea7f495 New plural function for JavaScript compatibility 2018-11-06 14:48:58 +01:00
Max Kostikov
3491c488d3 Update Photo.php 2018-11-06 13:51:01 +01:00
Max Kostikov
1828b6daab Update Photo.php 2018-11-06 13:41:41 +01:00
Max Kostikov
c26f45b7c2 Update Photo.php 2018-11-06 13:39:36 +01:00
Max Kostikov
e116b90116 'Last-Modified' and 'Content-Length' HTTP headers added for better image caching 2018-11-06 13:37:50 +01:00
zotlabs
43a5f928ba these changes needed to ensure cloning/syncing works in the future to non-zot6 enabled servers after the (coming) zot6 schema updates. This should probably be on a fast track to master branch 2018-11-05 16:57:32 -08:00
M. Dent
873fa16517 Merge branch 'patch-23' into 'dev'
Use modern get_config() syntax

See merge request hubzilla/core!1368
2018-11-06 01:27:06 +01:00
Max Kostikov
f7ce374a28 Update Photo.php 2018-11-05 21:26:10 +01:00
Max Kostikov
2dd124d09e Use modern get_config() syntax 2018-11-05 21:25:08 +01:00
Mario
d6523c67a6 Merge branch 'patch-20181028a' into 'dev'
Add timestamp to pconfig

See merge request hubzilla/core!1355
2018-11-05 10:40:29 +01:00
Mario Vavti
a9fd3608ea version 3.8.3 2018-11-05 10:26:59 +01:00
Mario Vavti
b25cace3ea update changelog 2018-11-05 10:25:57 +01:00
Mario Vavti
4320f047db update changelog and bump version 2018-11-05 10:22:56 +01:00
Mario Vavti
b4b3e7b9a4 update linkinfo from dev 2018-11-05 09:59:25 +01:00
Mario Vavti
b6938da552 Merge remote-tracking branch 'mike/master' into dev 2018-11-05 09:56:52 +01:00
Mario Vavti
4830a1559d Merge branch 'dev' 2018-11-05 09:55:23 +01:00
Mario
92ea3ef720 Merge branch 'dev' into 'dev'
more fixes for forum notifications handling: do not count likes/dislikes if…

See merge request hubzilla/core!1367
2018-11-05 09:42:07 +01:00
zotlabs
73d2719330 debug zot6 discovery 2018-11-04 19:35:55 -08:00
zotlabs
af82aab3a6 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-11-04 13:58:02 -08:00
zotlabs
51b4b6216f z6 updates to owa, linkinfo improved image detection 2018-11-04 13:56:32 -08:00
Mario Vavti
de32b0bba5 more fixes for forum notifications handling: do not count likes/dislikes if likes notifications are disabled and also do not show like activities when clicking a forum notification and like notifications are disabled 2018-11-03 20:53:23 +01:00
Mario
de0fab78ed Merge branch 'dev' into 'dev'
Fixed typo at view/es-es/hstrings.php

See merge request hubzilla/core!1366
2018-11-03 20:11:14 +01:00
Manuel Jiménez Friaza
71425c3b23 Fixed typo at view/es-es/hstrings.php 2018-11-03 19:19:01 +01:00
Mario
75f7b1e261 Merge branch 'patch-3' into 'dev'
Update hmessages.po

See merge request hubzilla/core!1365
2018-11-03 13:22:34 +01:00
Mario
9af35d998f Merge branch 'patch-2' into 'dev'
Update hstrings.php

See merge request hubzilla/core!1364
2018-11-03 13:21:53 +01:00
Mario
34e3f3907a Merge branch 'patch-22' into 'dev'
More precise content encoding detection on conversion

See merge request hubzilla/core!1363
2018-11-03 13:21:22 +01:00
Max Kostikov
46b0510b99 Update Linkinfo.php 2018-11-03 10:41:31 +01:00
Max Kostikov
a7624ea48b Update Linkinfo.php 2018-11-03 00:10:05 +01:00
Max Kostikov
2f3b4a7aaf Update Linkinfo.php 2018-11-03 00:01:15 +01:00
Max Kostikov
a9bbe0b128 Update Linkinfo.php 2018-11-02 22:40:48 +01:00
Max Kostikov
0d9d0a4b70 more precise codepage detection 2018-11-02 22:37:53 +01:00
gia vec
8235d0bd50 Update hmessages.po 2018-11-02 19:41:07 +01:00
gia vec
c2e01bedc5 Update hstrings.php 2018-11-02 19:27:11 +01:00
Max Kostikov
32c4614a32 Workaround for incorrect ISO-8859-5 encoded content conversion 2018-11-02 10:52:52 +01:00
Mario
24ae6c91ea Merge branch 'patch-21' into 'dev'
Fix wrong image resize for some external images

See merge request hubzilla/core!1362
2018-11-02 10:20:18 +01:00
M.Dent
346a4f5933 strpos needs to test with ===0 not ==0 2018-11-01 20:23:22 -04:00
Max Kostikov
c6551336c8 Fix wrong image resize for some external images 2018-11-01 21:50:36 +01:00
Mario Vavti
3dab0d365d css fix for reshared-content images and whitespace 2018-10-31 13:20:09 +01:00
Mario Vavti
0252bac4ba Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-10-31 09:39:10 +01:00
Mario
b468069875 Merge branch 'patch-20' into 'dev'
Beautiful embedding for Hubzilla links

See merge request hubzilla/core!1360
2018-10-31 09:36:09 +01:00
Mike Macgirvin
7e1f431eca yet another blueimp vulnerability. Move to composer. 2018-10-31 15:56:08 +11:00
zotlabs
70c55da1df Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-10-30 18:11:49 -07:00
M. Dent
f9ab7647dd Merge branch 'composer-updates' into 'dev'
update html_to_markdown, smarty and sabredav libs via composer

See merge request hubzilla/core!1361
2018-10-31 01:32:44 +01:00
zotlabs
623aa7ea48 remove primary/clone counts from admin summary. The last checkins should fix this count "eventually" but the information has little direct value and may require location information for a local channel to change before it is actually corrected. 2018-10-30 17:30:59 -07:00
M. Dent
046d264688 Merge branch 'forum-ping' into 'dev'
fix forum ping results - the term query requires xchan_name instead of…

See merge request hubzilla/core!1358
2018-10-31 01:25:41 +01:00
M. Dent
944e168120 Merge branch 'wikilist-widget' into 'dev'
allow wiki_list widget to be used in any page

See merge request hubzilla/core!1359
2018-10-31 01:24:32 +01:00
zotlabs
9594105e57 typo 2018-10-30 17:21:39 -07:00
zotlabs
675343f575 issue syncing the channel_primary setting which shows up as a wrong count on the admin summary page 2018-10-30 17:18:15 -07:00
Mario Vavti
fc6ff45c49 fix another markdown test 2018-10-30 22:51:52 +01:00
Mario Vavti
b4bac88c39 fix markdown tests 2018-10-30 22:37:41 +01:00
Mario Vavti
c622ba84b9 really fix html2markdown() - when using environment, we must set the defaults 2018-10-30 22:16:37 +01:00
Max Kostikov
339f95c647 Update oembed.php 2018-10-30 16:49:48 +01:00
Max Kostikov
ec67e0ab22 Beautiful embedding for Hubzilla links 2018-10-30 15:38:19 +01:00
Mario Vavti
0b371c8103 fix html2markdown() and re-enable previously failing tests 2018-10-30 13:55:08 +01:00
Mario Vavti
2192ea6fdf update html_to_markdown, smarty and sabredav libs via composer 2018-10-30 12:12:07 +01:00
M.Dent
0060f88c45 Add tracking of deleted pconfig variables 2018-10-29 23:04:13 -04:00
Mario Vavti
1eac4db491 fix forum ping results - the term query requires xchan_name instead of xchan_hash. also improve the query itself - item_permission_sql() is redundant here since we always deal with local_channel() and use count(id) instead of sum(item_unseen) to get the unseen count 2018-10-29 23:01:13 +01:00
Mario Vavti
0d2c3be367 allow wiki_list widget to be used in any page 2018-10-29 22:55:24 +01:00
Mario Vavti
c8dd516d6c Merge branch 'dev' 2018-10-29 11:02:51 +01:00
Mario Vavti
0f19627407 changelog 2018-10-29 10:59:54 +01:00
Mario Vavti
3eb71fe7b5 merge Zotlabs/Access/PermissionLimits.php from dev 2018-10-29 10:21:10 +01:00
Mario Vavti
0035584d91 merge view/fr/hmessages.po from dev 2018-10-29 10:20:36 +01:00
Mario Vavti
8cbd2e3e9e merge view/ru/hstrings.php from dev 2018-10-29 10:19:55 +01:00
Mario Vavti
b0f5c7f36f merge view/ru/hmessages.po from dev 2018-10-29 10:19:31 +01:00
Mario Vavti
412eb0a90b merge view/it/hstrings.php from dev 2018-10-29 10:18:21 +01:00
Mario Vavti
f8e816629d merge view/it/hmessages.po from dev 2018-10-29 10:17:54 +01:00
Mario Vavti
3d0138569d merge view/es-es/hstrings.php from dev 2018-10-29 10:17:04 +01:00
Mario Vavti
7bb7d736a2 merge view/es-es/hmessages.po from dev 2018-10-29 10:16:29 +01:00
Mario Vavti
7910f39613 merge util/zotsh/zotsh.py from dev 2018-10-29 10:16:01 +01:00
Mario Vavti
bf6ef2a588 merge util/update_theme_repo from dev 2018-10-29 10:15:18 +01:00
Mario Vavti
a11d89daa3 merge util/update_autoloader from dev 2018-10-29 10:14:43 +01:00
Mario Vavti
b8a4a6b959 merge util/hmessages.po from dev 2018-10-29 10:10:03 +01:00
Mario Vavti
dd6045d9f8 merge install/schema_postgres.sql from dev 2018-10-29 10:08:37 +01:00
Mario Vavti
e1c3a19420 merge include/zot.php from dev 2018-10-29 10:08:12 +01:00
Mario Vavti
cc586685e6 merge include/nav.php from dev 2018-10-29 10:07:54 +01:00
Mario Vavti
31883f603c merge include/import.php from dev 2018-10-29 10:07:15 +01:00
Mario Vavti
f377c81c8a merge include/connections.php from dev 2018-10-29 10:06:44 +01:00
Mario Vavti
32384eaf07 merge Zotlabs/Widget/Wiki_pages.php from dev 2018-10-29 10:06:01 +01:00
Mario Vavti
7c2efa697c merge Zotlabs/Module/Photo.php from dev 2018-10-29 10:04:34 +01:00
Mario Vavti
e1df69dfcb Merge branch 'dev' 2018-10-29 07:43:40 +01:00
M.Dent
1241e778f9 Fix to set update time in pconfig on update 2018-10-28 17:30:22 -04:00
M.Dent
3ab0ef1902 Add timestamp and associated logic to pconfig 2018-10-28 17:23:31 -04:00
M.Dent
c7c35b8b5a DB Updates to prep for pconfig timestamps. 2018-10-28 17:20:29 -04:00
M. Dent
3d9b1fd343 Merge branch 'dev' into 'dev'
fix issues with forum handling in mod network and ping. also some code cleanup.

See merge request hubzilla/core!1354
2018-10-28 03:22:22 +01:00
Mario Vavti
96bed3a623 fix issues with forum handling in mod network and ping. also some code cleanup. 2018-10-27 22:34:18 +02:00
Mario Vavti
e72b0edce2 Merge remote-tracking branch 'mike/master' into dev 2018-10-27 13:50:30 +02:00
zotlabs
ae4aeb4b1e delivery chain linkage messed up if original post was edited 2018-10-26 13:00:26 -07:00
M. Dent
302abc2a60 Merge branch 'dev' into 'dev'
notifications: fix unseen forum count

See merge request hubzilla/core!1351
2018-10-26 17:10:10 +02:00
Mario Vavti
2b3cbc638b notifications: fix unseen forum count 2018-10-26 09:53:56 +02:00
Mario
3de055bf65 Merge branch 'dev' into 'dev'
New strings in Spanish translation

See merge request hubzilla/core!1349

(cherry picked from commit df449e7bfe)

802a7ff3 New strings in Spanish translation
2018-10-26 08:16:54 +02:00
Mario
df449e7bfe Merge branch 'dev' into 'dev'
New strings in Spanish translation

See merge request hubzilla/core!1349
2018-10-26 08:16:16 +02:00
Mario
6326a50d20 Merge branch 'patch-20181025a' into 'dev'
Add entropy to queue worker - and fix requeuing of expired tasks

See merge request hubzilla/core!1350
2018-10-26 08:15:11 +02:00
M.Dent
aef212ada9 Add entropy to queue worker - and fix requeuing of expired tasks 2018-10-25 10:12:03 -04:00
Manuel Jiménez Friaza
802a7ff3a8 New strings in Spanish translation 2018-10-25 11:37:06 +02:00
M. Dent
9cedc864c2 Merge branch 'dev' into 'dev'
Editor contact autocomplete performance & refine stream filter and forum notification behaviour (mostly for performance)

See merge request hubzilla/core!1348
2018-10-25 03:38:05 +02:00
Mario Vavti
ee804cd6b1 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-10-24 23:08:22 +02:00
Mario Vavti
25c7e64ded fix get on {1} 2018-10-24 23:06:32 +02:00
Mario Vavti
5c4fbbebe1 refine stream filter and forum notification behaviour (mostly for performance). personal posts will be displayed in unthreaded mode and clicking a forum notification will show only the unseen items of the forum in unthreaded mode. group the filters in the widget - threaded at the top, unthreaded beneath. 2018-10-24 20:58:25 +02:00
Mario Vavti
615402ea83 wrong var 2018-10-24 20:34:15 +02:00
Mario
a0a72a9f6d Merge branch 'patch-19' into 'dev'
Convert non UTF-8 content on link embeding

See merge request hubzilla/core!1347
2018-10-24 20:26:32 +02:00
Mario Vavti
8b9acf750b autocomplete performance: this slightly changes the editor contact autocomplete behaviour. queries using *like* with a prepended % to the query string do not make use of indices. this is no big issue when we query abook but can get really slow when xchan table is involved. this commit changes the xchan table only queries to use the *str%* format. this means that the result set for channels we are not connected with will change in a way that xchan_name and xchan_addr will bematched only from the beginning of the name or address. this commit also changes textcomplete to only start the query after the 3rd character. the result set between 2 and 3 characters is mostly very different and only from 3 chars on there is a high possibility the channel we look for is already in the result. 2018-10-24 20:22:27 +02:00
Max Kostikov
24d68a7f09 Update Linkinfo.php 2018-10-24 10:28:18 +02:00
Max Kostikov
781eeff021 Update Linkinfo.php 2018-10-23 20:36:30 +02:00
Max Kostikov
3e6c2c6024 Update Linkinfo.php 2018-10-23 19:57:21 +02:00
Max Kostikov
f180558041 Convert non UTF-8 content on link embeding 2018-10-23 19:32:36 +02:00
zotlabs
506ea71302 for whatever reason there were two of these
(cherry picked from commit 7ed197f46b)
2018-10-23 13:23:18 +02:00
Mario Vavti
01e11e9043 Merge remote-tracking branch 'mike/master' into dev 2018-10-23 13:18:04 +02:00
zotlabs
7ed197f46b for whatever reason there were two of these 2018-10-22 17:12:36 -07:00
Mario Vavti
5c36eef039 textcomplete: return up to 100 items and look for for matches in the entire string (not just the beginning) when suggesting emojis 2018-10-22 15:36:02 +02:00
Mario Vavti
26e20f9999 add summary to bbcode autocomplete list 2018-10-22 14:04:09 +02:00
Mario Vavti
71195895ba update blueimp_upload to version 9.23 2018-10-22 09:45:20 +02:00
Mario
c7ebb4b009 version 3.8.1 2018-10-21 09:25:37 +02:00
Mario Vavti
c0cef8dd12 changelog for 3.8.1
(cherry picked from commit ea850e58d2)
2018-10-21 09:23:37 +02:00
Mario Vavti
ea850e58d2 changelog for 3.8.1 2018-10-21 09:22:42 +02:00
Mario Vavti
dcdd97a985 fix ellipsis for too long nav banner
(cherry picked from commit a61ce45a32)
2018-10-21 09:10:45 +02:00
Mario Vavti
a61ce45a32 fix ellipsis for too long nav banner 2018-10-21 09:10:02 +02:00
mike
1326c4e71e fix wrong value being used for menu_id
(cherry picked from commit fdb7c115a7)
2018-10-21 09:02:17 +02:00
Mario
ad5f3877f1 Merge branch 'edit-menu-contents-fix' into 'dev'
fix wrong value being used for menu_id

See merge request hubzilla/core!1345
2018-10-21 09:00:48 +02:00
zotlabs
9cbbc80f7a disable blueimp demo server
(cherry picked from commit 7c49f22702)
2018-10-21 08:49:43 +02:00
Mario Vavti
8a02e967d3 Merge remote-tracking branch 'mike/master' into dev 2018-10-21 08:42:37 +02:00
zotlabs
7c49f22702 disable blueimp demo server 2018-10-20 15:27:35 -07:00
mike
fdb7c115a7 fix wrong value being used for menu_id 2018-10-20 16:55:54 -04:00
Mario Vavti
fa9e9510e5 Merge branch '3.8RC' 2018-10-19 11:18:28 +02:00
Mario Vavti
06b3ad1071 version 3.8 2018-10-19 11:16:44 +02:00
Mario Vavti
d96a731e93 bump version 2018-10-19 11:14:20 +02:00
Mario Vavti
847ff77a81 optimize autoload
(cherry picked from commit 2583270774)
2018-10-19 11:13:33 +02:00
Mario Vavti
df746c7911 strings and bump apd versions to version 2
(cherry picked from commit 4aed866d69)
2018-10-19 11:12:33 +02:00
Mario Vavti
2583270774 optimize autoload 2018-10-19 11:12:07 +02:00
Mario Vavti
5393d674f9 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-10-19 11:07:40 +02:00
Mario Vavti
4aed866d69 strings and bump apd versions to version 2 2018-10-19 11:07:06 +02:00
Mario
d775a7ee21 Merge branch 'patch-18' into 'dev'
Russian translation for upgrade plugin added

See merge request hubzilla/core!1344

(cherry picked from commit c044ff3444)

ac2b6bcc Russian translation for upgrade plugin added
6e758423 Update hstrings.php
2018-10-19 10:56:55 +02:00
Mario
c044ff3444 Merge branch 'patch-18' into 'dev'
Russian translation for upgrade plugin added

See merge request hubzilla/core!1344
2018-10-19 10:56:46 +02:00
Max Kostikov
6e75842354 Update hstrings.php 2018-10-18 11:19:02 +02:00
Max Kostikov
ac2b6bcc33 Russian translation for upgrade plugin added 2018-10-18 11:18:14 +02:00
Mario
c440b758a3 Merge branch 'dev' into 'dev'
Fix template root redirection

See merge request hubzilla/core!1343

(cherry picked from commit e9471124c0)

442d1cb4 Fix template root redirection
2018-10-18 09:12:38 +02:00
Mario
e9471124c0 Merge branch 'dev' into 'dev'
Fix template root redirection

See merge request hubzilla/core!1343
2018-10-18 09:12:30 +02:00
M.Dent
442d1cb48f Fix template root redirection 2018-10-17 22:21:31 -04:00
Mario Vavti
5030c55b1e complete changelog
(cherry picked from commit fa91e2a60c)
2018-10-17 12:51:36 +02:00
Mario Vavti
fa91e2a60c complete changelog 2018-10-17 12:25:46 +02:00
Mario
32de123db0 fix sql error 2018-10-17 11:05:28 +02:00
Mario Vavti
90e9c37d35 improve posting to mod pconfig via ajax
(cherry picked from commit ae875734e2)
2018-10-16 21:20:47 +02:00
Mario
84d4036117 Merge branch 'fix-master-rate-limiter' into 'dev'
Fix master rate limiter

See merge request hubzilla/core!1341

(cherry picked from commit e38e85572e)

49eff772 Fix worker age calculation
be30dc9e Move logger to debug/all
b6a9be88 Delete duplicate queue items
2018-10-16 21:19:28 +02:00
Mario
e38e85572e Merge branch 'fix-master-rate-limiter' into 'dev'
Fix master rate limiter

See merge request hubzilla/core!1341
2018-10-16 21:19:16 +02:00
M. Dent
f50d6208c8 Fix master rate limiter 2018-10-16 21:19:16 +02:00
M. Dent
34d189c02e Merge branch 'dev' into 'dev'
improve posting to mod pconfig via ajax

See merge request hubzilla/core!1340
2018-10-16 21:08:19 +02:00
Mario
ba9b49bc83 Merge branch 'patch-17' into 'dev'
Add Russian translations to Newmember widget

See merge request hubzilla/core!1339

(cherry picked from commit ed08eb07c6)

04edb741 Add Russian translations to Newmember widget
d2d6f8c9 Update hstrings.php
2018-10-16 14:08:02 +02:00
Mario
ed08eb07c6 Merge branch 'patch-17' into 'dev'
Add Russian translations to Newmember widget

See merge request hubzilla/core!1339
2018-10-16 14:07:52 +02:00
Mario Vavti
ae875734e2 improve posting to mod pconfig via ajax 2018-10-16 13:46:03 +02:00
Max Kostikov
d2d6f8c970 Update hstrings.php 2018-10-15 21:28:54 +02:00
Max Kostikov
04edb741a6 Add Russian translations to Newmember widget 2018-10-15 21:28:01 +02:00
Mario Vavti
34b4b65865 add missing features section to newmember widget
(cherry picked from commit 25a74f3664)
2018-10-15 20:33:28 +02:00
Mario Vavti
25a74f3664 add missing features section to newmember widget 2018-10-15 20:18:25 +02:00
Mario Vavti
fa5537bfc0 allow to undelete deleted base apps
(cherry picked from commit 3588c4ab99)
2018-10-15 15:45:51 +02:00
Mario Vavti
3588c4ab99 allow to undelete deleted base apps 2018-10-15 15:43:55 +02:00
Mario Vavti
5a9b1f769d some changelog work
(cherry picked from commit 782ec06f2b)
2018-10-15 14:24:54 +02:00
Mario Vavti
782ec06f2b some changelog work 2018-10-15 14:23:58 +02:00
Mario Vavti
5b43db7171 fix wiki issue with wiki page links when using bbcode
(cherry picked from commit df62037c4a)
2018-10-15 13:14:30 +02:00
Mario Vavti
df62037c4a fix wiki issue with wiki page links when using bbcode 2018-10-15 13:13:04 +02:00
Mario Vavti
ad1cc82b38 update readme for master and dev branch buildstatus
(cherry picked from commit 05b8c53ff7)
2018-10-15 10:38:57 +02:00
Mario Vavti
05b8c53ff7 update readme for master and dev branch buildstatus 2018-10-15 10:37:14 +02:00
Mario
7268426248 Merge branch 'dev' into 'dev'
Bring back some basic automated testing for PHP7.1 and mysql via gitlab-ci.

See merge request hubzilla/core!1332

(cherry picked from commit c39de966df)

b77acb3e add gitlab-ci.yml and phpunit.xml
22275f30 fix dba_pdoTest
0db047e5 fix phpunit error with html2markdown test and temporary disable failing markdown…
2018-10-15 10:00:06 +02:00
Mario
c39de966df Merge branch 'dev' into 'dev'
Bring back some basic automated testing for PHP7.1 and mysql via gitlab-ci.

See merge request hubzilla/core!1332
2018-10-15 09:59:52 +02:00
Mario
eb133ef9a7 Merge branch 'patch-16' into 'dev'
JS plurals displaying code cleanup

See merge request hubzilla/core!1338

(cherry picked from commit 721461dd3e)

b7280a44 JS plurals displaying code cleanup
ab0e2f52 Update language.php
f9c3b807 Update main.js
ce52c27a Update main.js
2018-10-15 09:59:25 +02:00
Mario
721461dd3e Merge branch 'patch-16' into 'dev'
JS plurals displaying code cleanup

See merge request hubzilla/core!1338
2018-10-15 09:59:17 +02:00
Mario
337e25ad43 Merge branch 'patch-15' into 'dev'
Add JS function code for plurals translation in Russian

See merge request hubzilla/core!1337

(cherry picked from commit 7042528d26)

ee4a2629 Add JS function code for plurals translation
8af91b02 Update hstrings.php
2018-10-15 09:58:24 +02:00
Mario
7042528d26 Merge branch 'patch-15' into 'dev'
Add JS function code for plurals translation in Russian

See merge request hubzilla/core!1337
2018-10-15 09:58:09 +02:00
Max Kostikov
ce52c27a8a Update main.js 2018-10-14 22:45:11 +02:00
Max Kostikov
f9c3b80780 Update main.js 2018-10-14 22:28:47 +02:00
Max Kostikov
ab0e2f5236 Update language.php 2018-10-14 22:28:14 +02:00
Max Kostikov
b7280a442e JS plurals displaying code cleanup 2018-10-14 22:26:56 +02:00
Max Kostikov
8af91b0209 Update hstrings.php 2018-10-14 22:24:36 +02:00
Max Kostikov
ee4a262953 Add JS function code for plurals translation 2018-10-14 15:21:00 +02:00
Mario Vavti
d584293cde min version bump 2018-10-13 20:28:24 +02:00
Mario
c60c9b323b another min version change to mitigate caching issues. we are now at 3.8RC2.2 2018-10-13 20:22:04 +02:00
Mario
eaee27c9e4 Merge branch 'patch-14' into 'dev'
Add date/time plurals translation in JavaScript

See merge request hubzilla/core!1336

(cherry picked from commit a2575059e2)

5c0d3187 Add date/time plurals translation in JavaScript
729d0d53 Update language.php
f68674b3 Update js_strings.tpl
3ac4337a Update main.js
e96e3dc6 Update po2php.php
54bdf59d Update js_strings.php
2018-10-13 20:17:14 +02:00
Mario
a2575059e2 Merge branch 'patch-14' into 'dev'
Add date/time plurals translation in JavaScript

See merge request hubzilla/core!1336
2018-10-13 20:16:56 +02:00
Max Kostikov
54bdf59dde Update js_strings.php 2018-10-13 19:56:07 +02:00
Max Kostikov
e96e3dc6e6 Update po2php.php 2018-10-13 19:54:13 +02:00
Max Kostikov
3ac4337aec Update main.js 2018-10-13 19:52:59 +02:00
Max Kostikov
f68674b35a Update js_strings.tpl 2018-10-13 19:51:33 +02:00
Max Kostikov
729d0d5368 Update language.php 2018-10-13 19:50:09 +02:00
Max Kostikov
5c0d31873a Add date/time plurals translation in JavaScript 2018-10-13 19:48:45 +02:00
Mario
5310f4e310 bump version to 3.8RC2.1 due to javascript changes 2018-10-13 17:32:08 +02:00
Mario Vavti
2c961328f1 Merge branch 'dev' into 3.8RC 2018-10-13 17:21:12 +02:00
Mario Vavti
c36773674e Revert "Merge branch 'patch-11' into 'dev'"
This reverts commit e518445853, reversing
changes made to 8ce240b95c.
2018-10-13 17:18:42 +02:00
Max Kostikov
54c615dbc2 Update hmessages.po
(cherry picked from commit 451ee5a593)
2018-10-13 14:55:25 +02:00
Max Kostikov
483ef09890 Update hstrings.php
(cherry picked from commit ba3811a284)
2018-10-13 14:54:57 +02:00
Max Kostikov
81a741e760 Update hstrings.php
(cherry picked from commit e2241b9365)
2018-10-13 14:54:29 +02:00
Max Kostikov
278f2a6cac New russian plurals for JavaScript
(cherry picked from commit fe2bb84403)
2018-10-13 14:54:05 +02:00
Mario
cf277261dc Merge branch 'patch-12' into 'dev'
New russian plurals for JavaScript

See merge request hubzilla/core!1333
2018-10-13 14:51:59 +02:00
Max Kostikov
451ee5a593 Update hmessages.po 2018-10-13 14:22:58 +02:00
Max Kostikov
ba3811a284 Update hstrings.php 2018-10-13 14:22:13 +02:00
Max Kostikov
e2241b9365 Update hstrings.php 2018-10-13 14:20:48 +02:00
Max Kostikov
fe2bb84403 New russian plurals for JavaScript 2018-10-13 14:20:10 +02:00
Mario Vavti
6f1067a889 version 3.8RC2 2018-10-13 14:12:09 +02:00
Mario Vavti
f0cdbd0f52 Merge branch 'dev' into 3.8RC 2018-10-13 14:11:08 +02:00
Mario Vavti
9632cafa95 bump version 2018-10-13 14:05:44 +02:00
ZotSocial Admin
321b2b9b49 Fix order of assignment and get template file before return
(cherry picked from commit 8ebcc4439b)
2018-10-13 14:01:43 +02:00
Mario
fb3dd5eee6 Merge branch 'dev' into 'dev'
Fix order of assignment and get template file before return

See merge request hubzilla/core!1329
2018-10-13 14:01:01 +02:00
Mario
e518445853 Merge branch 'patch-11' into 'dev'
Add date/time plurals translation in JavaScript

See merge request hubzilla/core!1331
2018-10-13 14:00:12 +02:00
Mario
8ce240b95c Merge branch 'patch-10' into 'dev'
Missed strings added to Russian translation

See merge request hubzilla/core!1328
2018-10-13 13:57:48 +02:00
git-marijus
0db047e572 fix phpunit error with html2markdown test and temporary disable failing markdown test in connection with **bold** and _italic_ (it is not clear why they fail and the code appears to work as expected) 2018-10-13 13:39:22 +02:00
git-marijus
22275f3077 fix dba_pdoTest 2018-10-13 13:26:59 +02:00
git-marijus
b77acb3e53 add gitlab-ci.yml and phpunit.xml 2018-10-13 13:19:17 +02:00
Max Kostikov
6ae9ef571e Update language.php 2018-10-13 02:14:19 +02:00
Max Kostikov
8e5189464e Update language.php 2018-10-13 01:36:24 +02:00
Max Kostikov
0de713ff36 Update language.php 2018-10-13 01:08:06 +02:00
Max Kostikov
137bee9d27 Update language.php 2018-10-13 00:40:06 +02:00
Max Kostikov
3641ab8c7d Update language.php 2018-10-13 00:28:12 +02:00
Max Kostikov
16b6b76507 Update language.php 2018-10-13 00:25:57 +02:00
Max Kostikov
5cd9540d5f Update language.php 2018-10-13 00:24:04 +02:00
Max Kostikov
ae7873260e Update language.php 2018-10-13 00:20:23 +02:00
Max Kostikov
3dfe604ba0 Update main.js 2018-10-13 00:15:48 +02:00
Max Kostikov
3e19c4ddae Update language.php 2018-10-13 00:12:17 +02:00
Max Kostikov
de59300aaf Update js_strings.tpl 2018-10-12 23:51:01 +02:00
Max Kostikov
8cb05a91ab Update language.php 2018-10-12 23:45:52 +02:00
Max Kostikov
5f2c3f607e Add plurals translation at browser side (JS) 2018-10-12 23:43:38 +02:00
ZotSocial Admin
8ebcc4439b Fix order of assignment and get template file before return 2018-10-12 15:20:57 -04:00
Max Kostikov
b65ee01aef Update hmessages.po 2018-10-12 16:39:03 +02:00
Max Kostikov
2b311bd860 Update hstrings.php 2018-10-12 16:38:58 +02:00
Max Kostikov
a841b75b98 Update hstrings.php 2018-10-12 11:50:21 +02:00
Max Kostikov
9b3b7dc098 Update hmessages.po 2018-10-12 11:49:48 +02:00
zotlabs
f783454774 verify some edge case http signatures
(cherry picked from commit c6bfd5e7be)
2018-10-12 10:56:28 +02:00
Mario Vavti
81d9258e80 Merge remote-tracking branch 'mike/master' into dev 2018-10-12 09:42:57 +02:00
zotlabs
c6bfd5e7be verify some edge case http signatures 2018-10-11 21:28:47 -07:00
Max Kostikov
3c5cfd465b Update hstrings.php 2018-10-11 23:39:58 +02:00
Max Kostikov
f61f9bdc5f Missed strings added to Russian translation 2018-10-11 23:39:13 +02:00
Manuel Jiménez Friaza
2ab6e0843d Typos in Spanish translation
(cherry picked from commit c54ba1fb86)
2018-10-11 16:06:45 +02:00
Mario
d21bf41b6c Merge branch 'dev' into 'dev'
Typos  in Spanish translation

See merge request hubzilla/core!1327
2018-10-11 16:06:25 +02:00
Manuel Jiménez Friaza
c54ba1fb86 Typos in Spanish translation 2018-10-11 12:23:00 +02:00
M.Dent
4d86a199f0 Add wiki_preprocess hook and documentation
(cherry picked from commit bad4ea6e65)
2018-10-11 11:42:29 +02:00
Mario
4756826054 Merge branch 'dev' into 'dev'
Add wiki_preprocess hook and documentation

See merge request hubzilla/core!1326
2018-10-11 11:42:00 +02:00
Mario
ea309aa19e Merge branch 'patch-9' into 'dev'
Formatting fix in russian translation

See merge request hubzilla/core!1325
2018-10-11 11:40:11 +02:00
M.Dent
bad4ea6e65 Add wiki_preprocess hook and documentation 2018-10-10 22:46:00 -04:00
Mario Vavti
cf4288767a fix issue in zot finger
(cherry picked from commit 802ccdff4a)
2018-10-10 23:08:58 +02:00
Mario Vavti
802ccdff4a fix issue in zot finger 2018-10-10 23:00:59 +02:00
Mario Vavti
ba50de15ea revert gitlab-ci until we have a working configuration 2018-10-10 20:15:35 +02:00
Max Kostikov
73e30e8085 Update hstrings.php 2018-10-10 17:45:03 +02:00
Max Kostikov
a53912cc19 Formatting fix in russian translation 2018-10-10 17:43:41 +02:00
Mario Vavti
f105f70ded missing install 2018-10-10 15:47:55 +02:00
Mario Vavti
f0cd084738 one last try for now 2018-10-10 15:45:54 +02:00
Mario Vavti
ae5158b676 sigh... 2018-10-10 15:36:16 +02:00
Mario Vavti
bfd45a0017 lets try this 2018-10-10 15:27:43 +02:00
Mario Vavti
78be0c66da add some dependencies for gd 2018-10-10 15:21:54 +02:00
Mario Vavti
562cde37f4 probably that is the way to do it 2018-10-10 15:15:09 +02:00
Mario Vavti
263dea0e36 wrong package name 2018-10-10 15:06:19 +02:00
Mario Vavti
de743e35d0 add php-gd and use php7 image 2018-10-10 15:01:42 +02:00
Mario Vavti
09a46d0c74 gitlab-ci example file 2018-10-10 14:54:13 +02:00
Mario Vavti
ca5a1d0853 fix minor issue in dark and light schemas
(cherry picked from commit 97fcc495f2)
2018-10-10 14:03:12 +02:00
Mario Vavti
97fcc495f2 fix minor issue in dark and light schemas 2018-10-10 14:01:03 +02:00
zotlabs
4e69467b14 SECURITY: signature issue
(cherry picked from commit c6f3298f78)
2018-10-10 13:34:54 +02:00
Mario Vavti
d2e366a46f Merge remote-tracking branch 'mike/master' into dev 2018-10-10 13:33:15 +02:00
Mario Vavti
94905a71ac fix even more wiki issues
(cherry picked from commit c06b37b798)
2018-10-10 11:07:00 +02:00
Mario Vavti
c7644ad29d fix some more wiki issues
(cherry picked from commit d29caa099a)
2018-10-10 11:06:39 +02:00
M.Dent
0daa462207 Fix escaping quote for wiki_delete_page
(cherry picked from commit 1ccca9863c)
2018-10-10 11:06:07 +02:00
M.Dent
d8f79f48e9 Rework Wiki encoding scheme.
(cherry picked from commit 709665846e)
2018-10-10 11:05:34 +02:00
M.Dent
bf878dc446 Implement custom escaping
(cherry picked from commit 93a310582f)
2018-10-10 11:04:58 +02:00
Mario Vavti
c06b37b798 fix even more wiki issues 2018-10-10 11:01:13 +02:00
Mario Vavti
30e3580856 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-10-10 10:39:42 +02:00
Mario Vavti
d29caa099a fix some more wiki issues 2018-10-10 10:39:28 +02:00
Manuel Jiménez Friaza
d1270aab4d Fixed some errors in Spanish translation
(cherry picked from commit a7b03c1cea)
2018-10-10 09:23:32 +02:00
Mario
cd55298616 Merge branch 'dev' into 'dev'
Fixed some errors in Spanish translation

See merge request hubzilla/core!1323
2018-10-10 09:22:32 +02:00
zotlabs
c6f3298f78 SECURITY: signature issue 2018-10-09 22:37:53 -07:00
M. Dent
350db4ed9f Merge branch 'fix-wiki-escaping' into 'dev'
Fix escaping quote for wiki_delete_page

See merge request hubzilla/core!1324
2018-10-10 03:04:31 +02:00
M.Dent
1ccca9863c Fix escaping quote for wiki_delete_page 2018-10-09 21:01:05 -04:00
Manuel Jiménez Friaza
a7b03c1cea Fixed some errors in Spanish translation 2018-10-09 11:48:08 +02:00
zotlabs
2cb52f8875 Merge branch 'dev' 2018-10-08 20:58:16 -07:00
zotlabs
2c797807cd whitespace 2018-10-08 20:56:20 -07:00
Mario
37b94bf5fa Merge branch 'fix-wiki-escaping' into 'dev'
Fix wiki escaping (Regression tests needed)

See merge request hubzilla/core!1321
2018-10-08 21:20:17 +02:00
Manuel Jiménez Friaza
cbbe4b33a3 Update Spanish translation
(cherry picked from commit e877a001ab)
2018-10-08 21:10:04 +02:00
Mario
a00a849952 Merge branch 'dev' into 'dev'
Update Spanish translation

See merge request hubzilla/core!1322
2018-10-08 21:08:39 +02:00
Manuel Jiménez Friaza
e877a001ab Update Spanish translation 2018-10-08 19:57:11 +02:00
M.Dent
709665846e Rework Wiki encoding scheme. 2018-10-08 13:35:18 -04:00
M.Dent
93a310582f Implement custom escaping 2018-10-08 13:35:18 -04:00
Mario Vavti
9f4219773e typo
(cherry picked from commit f0b7a7e5d3)
2018-10-08 11:39:25 +02:00
Mario Vavti
f0b7a7e5d3 typo 2018-10-08 11:38:45 +02:00
Mario Vavti
97502f4c04 the root cause for doubled entries is fixed now
(cherry picked from commit e0568f33e8)
2018-10-08 11:27:06 +02:00
Mario Vavti
737f660011 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-10-08 11:26:14 +02:00
Mario Vavti
e0568f33e8 the root cause for doubled entries is fixed now 2018-10-08 11:25:49 +02:00
Max Kostikov
2ba95758eb Prevent links damage on foreign channel repost for cloned
(cherry picked from commit d9efb037e3)
2018-10-08 11:20:34 +02:00
Mario
fc3d0233af Merge branch 'patch-8' into 'dev'
New russian translation

See merge request hubzilla/core!1319
2018-10-08 11:19:14 +02:00
Mario
13c08f9660 Merge branch 'patch-2' into 'dev'
Prevent links damage on foreign channel repost for cloned

See merge request hubzilla/core!1307
2018-10-08 11:18:28 +02:00
zotlabs
82528e2f38 hubzilla core issue #1278 - page update always reloads if noscript content is enabled
(cherry picked from commit 69584f541d)
2018-10-08 11:14:37 +02:00
M.Dent
90a983a7e5 Fix too many arguments
(cherry picked from commit 60d5443f00)
2018-10-08 11:12:28 +02:00
M. Dent
58a9cde61d Fix (potential) runaway cron
(cherry picked from commit 108855aca2)
2018-10-08 11:12:09 +02:00
Mario Vavti
a00aae702d Merge remote-tracking branch 'mike/master' into dev 2018-10-08 11:05:53 +02:00
zotlabs
69584f541d hubzilla core issue #1278 - page update always reloads if noscript content is enabled 2018-10-07 22:12:49 -07:00
M. Dent
855f4b869a Merge branch 'fix-runaway-cron' into 'dev'
Fix too many arguments in ClearQueue() queries

See merge request hubzilla/core!1320
2018-10-08 01:30:20 +02:00
M.Dent
60d5443f00 Fix too many arguments 2018-10-07 19:18:35 -04:00
Max Kostikov
527b0a7065 Update hstrings.php 2018-10-08 00:31:32 +02:00
Max Kostikov
22a7c21886 New russian translation 2018-10-08 00:30:35 +02:00
M. Dent
484d240e7e Merge branch 'fix-runaway-cron' into 'dev'
Fix (potential) runaway cron

See merge request hubzilla/core!1318
2018-10-07 19:43:03 +02:00
M. Dent
108855aca2 Fix (potential) runaway cron 2018-10-07 19:43:03 +02:00
M.Dent
8ca321df7c Add missing else clause
(cherry picked from commit 259db3778c)
2018-10-07 08:43:58 +02:00
zotlabs
ed97800c80 use hubloc_store_lowlevel to ensure all hubloc columns are initialised
(cherry picked from commit 52be5c1660)
2018-10-07 08:43:28 +02:00
zotlabs
78c6f40093 minor app cleanup
(cherry picked from commit 835e222af0)
2018-10-07 08:43:03 +02:00
Mario Vavti
5acd166d18 Merge remote-tracking branch 'mike/master' into dev 2018-10-07 08:39:29 +02:00
M. Dent
3efeeecace Merge branch 'dev' into 'dev'
Add missing else clause

See merge request hubzilla/core!1317
2018-10-07 05:05:27 +02:00
M.Dent
259db3778c Add missing else clause 2018-10-06 23:02:22 -04:00
zotlabs
52be5c1660 use hubloc_store_lowlevel to ensure all hubloc columns are initialised 2018-10-06 14:47:40 -07:00
Mario Vavti
f85cce714f return success for postgres
(cherry picked from commit 2d9fe72215)
2018-10-06 23:13:01 +02:00
Mario Vavti
2eb93387c2 fix issue #1281 - hubloc default values
(cherry picked from commit dd3ec468f6)
2018-10-06 23:12:38 +02:00
Mario Vavti
2d9fe72215 return success for postgres 2018-10-06 23:10:52 +02:00
Mario Vavti
dd3ec468f6 fix issue #1281 - hubloc default values 2018-10-06 23:05:45 +02:00
Mario
88d28cd6fe minor version 2018-10-06 21:02:11 +02:00
Mario Vavti
b4035c2d19 those 3px make a difference on medium sized screens
(cherry picked from commit 65dcb39bac)
2018-10-06 21:01:27 +02:00
Mario Vavti
65dcb39bac those 3px make a difference on medium sized screens 2018-10-06 21:01:00 +02:00
Mario Vavti
b92bb0bd28 give apps some more space and prevent linebreaks in app names. Add ellipsis to too long names.
(cherry picked from commit 62433b5f05)
2018-10-06 20:56:47 +02:00
Mario Vavti
0a840c02f7 another db update to get rid of the old view bookmarks entries
(cherry picked from commit 6ffdf3880f)
2018-10-06 20:56:23 +02:00
Mario Vavti
62433b5f05 give apps some more space and prevent linebreaks in app names. Add ellipsis to too long names. 2018-10-06 20:55:28 +02:00
Mario Vavti
6ffdf3880f another db update to get rid of the old view bookmarks entries 2018-10-06 20:48:29 +02:00
Mario Vavti
9bfa5c82d1 move profile assign selector to profile settings and personal menu selector to channel_home settings and get rid of misc channel settings section.
(cherry picked from commit 66cf085272)
2018-10-06 20:34:57 +02:00
Mario Vavti
66cf085272 move profile assign selector to profile settings and personal menu selector to channel_home settings and get rid of misc channel settings section. 2018-10-06 20:29:32 +02:00
Mario Vavti
567448e2fd this did not actually make sense
(cherry picked from commit d174531931)
2018-10-06 17:44:53 +02:00
Mario Vavti
d174531931 this did not actually make sense 2018-10-06 17:43:37 +02:00
Mario Vavti
a38ded702f strings and force import_system_apps() on std_version change
(cherry picked from commit cd5f255966)
2018-10-06 17:21:49 +02:00
Mario Vavti
cd5f255966 strings and force import_system_apps() on std_version change 2018-10-06 17:20:23 +02:00
Mario Vavti
d1a3561585 rename widget titles
(cherry picked from commit da8b276699)
2018-10-06 16:53:59 +02:00
Mario Vavti
da8b276699 rename widget titles 2018-10-06 16:52:42 +02:00
Mario Vavti
5aa0304149 version RC1 2018-10-06 16:43:28 +02:00
Mario Vavti
7877e2467e rename grid to network (for consistency) and activity to stream (as seen in osada) because it makes much more sense.
(cherry picked from commit 96277372d5)
2018-10-06 16:41:19 +02:00
Mario Vavti
96277372d5 rename grid to network (for consistency) and activity to stream (as seen in osada) because it makes much more sense. 2018-10-06 16:40:30 +02:00
Mario Vavti
98ee99071c pubstream app
(cherry picked from commit b8991750c5)
2018-10-06 16:09:05 +02:00
Mario Vavti
b8991750c5 pubstream app 2018-10-06 16:08:15 +02:00
Mario Vavti
97acfd23fb randprof app
(cherry picked from commit 18726737d0)
2018-10-06 15:28:17 +02:00
Mario Vavti
18726737d0 randprof app 2018-10-06 15:27:46 +02:00
Mario Vavti
af05fa3e85 remote diagnostics app
(cherry picked from commit 6a297a8f3d)
2018-10-06 15:22:27 +02:00
Mario Vavti
6a297a8f3d remote diagnostics app 2018-10-06 15:21:22 +02:00
Mario Vavti
309904b15a admin should not be an app imho - we can not install/delete admin abilities. Remove suggest channels from base apps.
(cherry picked from commit 453ce4df3b)
2018-10-06 15:12:56 +02:00
Mario Vavti
453ce4df3b admin should not be an app imho - we can not install/delete admin abilities. Remove suggest channels from base apps. 2018-10-06 15:12:13 +02:00
Mario Vavti
02537b80b2 gallery is not a core app
(cherry picked from commit 9850d18420)
2018-10-06 15:02:29 +02:00
Mario Vavti
62730366ee bookmarks: change wording
(cherry picked from commit a522a66715)
2018-10-06 15:02:07 +02:00
Mario Vavti
0558a25141 bookmark app
(cherry picked from commit c2c891723f)
2018-10-06 15:01:45 +02:00
Mario Vavti
3f57609b75 merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-10-06 15:00:40 +02:00
Mario Vavti
9850d18420 gallery is not a core app 2018-10-06 15:00:28 +02:00
Mario
05ae18d74e Merge branch 'patch-6' into 'dev'
Add new table names in docs

See merge request hubzilla/core!1315

(cherry picked from commit 778086ce19)

4f70fd3e Add new table names in docs
2e4772ac Update db_groups.bb
4cb46c12 Update intro_for_developers.bb
c087aaf5 Update database.bb
2018-10-06 14:54:38 +02:00
Mario
778086ce19 Merge branch 'patch-6' into 'dev'
Add new table names in docs

See merge request hubzilla/core!1315
2018-10-06 14:54:21 +02:00
Mario
63ba72331f Merge branch 'patch-5' into 'dev'
Respect new table names on import

See merge request hubzilla/core!1314

(cherry picked from commit 3e231e7c13)

ebb4811a Respect new table names on import
2018-10-06 14:53:37 +02:00
Mario
3e231e7c13 Merge branch 'patch-5' into 'dev'
Respect new table names on import

See merge request hubzilla/core!1314
2018-10-06 14:53:18 +02:00
Mario Vavti
a522a66715 bookmarks: change wording 2018-10-06 14:50:17 +02:00
Mario Vavti
c2c891723f bookmark app 2018-10-06 14:48:12 +02:00
Max Kostikov
c087aaf5be Update database.bb 2018-10-06 14:48:04 +02:00
Max Kostikov
4cb46c124a Update intro_for_developers.bb 2018-10-06 14:43:40 +02:00
Max Kostikov
2e4772ac0e Update db_groups.bb 2018-10-06 14:40:48 +02:00
Max Kostikov
4f70fd3e71 Add new table names in docs 2018-10-06 14:39:54 +02:00
Max Kostikov
ebb4811a75 Respect new table names on import 2018-10-06 14:06:24 +02:00
zotlabs
835e222af0 minor app cleanup 2018-10-05 16:27:50 -07:00
M. Dent
a5e63aa90a Merge branch 'revert-f5acbccb' into 'dev'
Revert Fix: for hook registration.  Needs more testing.

See merge request hubzilla/core!1311
2018-10-05 19:32:42 +02:00
M. Dent
1922a2139d Revert "Merge branch 'dev' into 'dev'"
This reverts merge request !1310
2018-10-05 19:30:49 +02:00
M. Dent
f5acbccb79 Merge branch 'dev' into 'dev'
Fix: hooks not added to App::$hooks[] at the time of registration

See merge request hubzilla/core!1310
2018-10-05 19:27:30 +02:00
M.Dent
d39ebebc9d Fix: hooks not added to App::[] at the time of registration 2018-10-05 13:25:16 -04:00
Max Kostikov
b5ed1de31e New russian translations hmessages.po
(cherry picked from commit ff53da5b0a)
2018-10-05 14:54:53 +02:00
Max Kostikov
5cf156f698 New russian translations hstrings.php
(cherry picked from commit 9520123f6d)
2018-10-05 14:54:22 +02:00
Mario
dcd99c2d30 Merge branch 'undefined' into '3.8RC'
New russian translations

See merge request hubzilla/core!1308
2018-10-05 14:53:23 +02:00
Mario
a29e5521cc Merge branch 'patch-3' into 'dev'
Add 'Channel Export' in Apps list

See merge request hubzilla/core!1309
2018-10-05 14:52:46 +02:00
Max Kostikov
59bd90b967 Add 'Channel Export' in Apps list 2018-10-05 13:31:54 +02:00
Max Kostikov
ff53da5b0a New russian translations hmessages.po 2018-10-05 13:25:40 +02:00
Max Kostikov
9520123f6d New russian translations hstrings.php 2018-10-05 13:23:37 +02:00
Max Kostikov
d9efb037e3 Prevent links damage on foreign channel repost for cloned 2018-10-05 13:16:29 +02:00
Mario Vavti
c403c9aece Merge branch '3.8RC' of https://framagit.org/hubzilla/core into 3.8RC 2018-10-05 12:10:15 +02:00
Mario Vavti
df5115e7b8 force major version system apps import for 3.8RC - remove this at a later point 2018-10-05 12:09:54 +02:00
zotlabs
22fbb512d5 do not propagate channel deletion for an already deleted channel.
(cherry picked from commit 7c1e99884c)
2018-10-05 11:45:09 +02:00
zotlabs
2acfa7e525 regression: double linebreaks in viewsrc output
(cherry picked from commit d33c331abd)
2018-10-05 11:44:32 +02:00
Mario Vavti
69659e9bd5 Merge remote-tracking branch 'mike/master' into dev 2018-10-05 11:40:50 +02:00
Mario Vavti
6c066f6107 bump version 2018-10-05 11:33:52 +02:00
Mario Vavti
b96a05494b optimize autoloader 2018-10-05 11:28:14 +02:00
Mario Vavti
0d42b4cf8a strings 2018-10-05 11:26:26 +02:00
Mario Vavti
df0c77ccd3 bump version 2018-10-05 11:17:00 +02:00
zotlabs
3a0a611f15 Merge branch 'dev' 2018-10-04 19:20:10 -07:00
Mario Vavti
1eaf6df842 fix issues with bs accordions 2018-10-04 22:21:20 +02:00
Mario Vavti
9fe9137c96 fix displaying of perm cats selector 2018-10-04 22:01:34 +02:00
Mario Vavti
363fc5c72b whitespace 2018-10-04 21:49:00 +02:00
Mario Vavti
d4af745fc8 move *_divmore_height setting to the module extra_settings, and fix issue where feature settings were not synced if rpath was provided 2018-10-04 21:38:39 +02:00
Mario Vavti
6e03104e3e move *_list_mode to features 2018-10-04 20:48:22 +02:00
Mario
e89a84608f Merge branch 'patch-1' into 'dev'
Incorrect block wrapping fixed

See merge request hubzilla/core!1306
2018-10-04 14:57:03 +02:00
Max Kostikov
1dbd83a582 Update settings.tpl 2018-10-04 14:35:32 +02:00
Mario
c1002557cf Merge branch 'patch-1' into 'dev'
button sticking fixed

See merge request hubzilla/core!1305
2018-10-04 13:53:00 +02:00
Mario Vavti
cccea911fa remove redundant var 2018-10-04 13:44:26 +02:00
Mario Vavti
eb10120607 add apd file 2018-10-04 13:27:16 +02:00
Mario Vavti
c00dc6120d defperm app 2018-10-04 13:26:45 +02:00
Mario Vavti
d0605e8d5f uexport app 2018-10-04 11:50:38 +02:00
zotlabs
d33c331abd regression: double linebreaks in viewsrc output 2018-10-03 21:18:23 -07:00
Max Kostikov
05b6c33a2c button sticking fixed 2018-10-03 21:19:13 +02:00
Mario
3064f2ced5 bump activity app version 2018-10-03 16:09:31 +02:00
Mario
5e7c9b9d4a jot: show settings icon only to local profile owner 2018-10-03 15:21:20 +02:00
Mario
009e03c3ba move archives from network to channel_home 2018-10-03 11:47:12 +02:00
Mario Vavti
af3b0146a8 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-10-03 10:44:18 +02:00
Mario Vavti
883e2ccc91 move filing from conversation to network - it is only functional there. 2018-10-03 10:43:54 +02:00
zotlabs
7c1e99884c do not propagate channel deletion for an already deleted channel. 2018-10-02 19:42:21 -07:00
M. Dent
29e1302f3f Merge branch 'dev' into 'dev'
Fix misplaced comma with period.

See merge request hubzilla/core!1304
2018-10-03 03:18:43 +02:00
M.Dent
798f2466e4 Fix misplaced comma with period. 2018-10-02 21:14:36 -04:00
Mario Vavti
67f19745fd add app_destroy hook which allows addons to perform post delete actions 2018-10-02 14:29:56 +02:00
Mario Vavti
72abe5f3d3 do not rely on startpage pconfig anymore 2018-10-01 12:47:14 +02:00
Mario Vavti
08a287dea1 do not default to channel_startpage if startpage app is not installed 2018-10-01 12:38:04 +02:00
Mario Vavti
7dadf387e5 indicate locked features 2018-10-01 11:01:56 +02:00
M. Dent
8febcc2705 Merge branch 'status-editor-hook' into 'dev'
Status editor hook

See merge request hubzilla/core!1300
2018-09-29 20:22:27 +02:00
M. Dent
ff20370d0b Status editor hook 2018-09-29 20:22:27 +02:00
Mario Vavti
cc9ca8bbff do not unset $_GET[search] and adjust activity_order widget 2018-09-29 18:38:19 +02:00
Mario Vavti
5906d6cce3 improve network search 2018-09-29 18:00:14 +02:00
Mario Vavti
8265dac9c0 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-09-29 16:00:54 +02:00
Mario Vavti
6eeac03a0e appman: query terms also by uid to prevent double entries 2018-09-29 16:00:34 +02:00
Mario Vavti
7ca8f7b5cc allow to install apps by name 2018-09-29 15:42:22 +02:00
Mario Vavti
d7ed5518d1 Merge remote-tracking branch 'mike/master' into dev 2018-09-29 15:41:54 +02:00
zotlabs
6f036bc778 hubzilla core issue #1276 2018-09-28 15:44:18 -07:00
M. Dent
ba4a8aa762 Merge branch 'remove-servicelevel-logic' into 'dev'
Remove servicelevel logic

See merge request hubzilla/core!1291
2018-09-29 00:17:55 +02:00
M. Dent
5f992ffe15 Remove servicelevel logic 2018-09-29 00:17:55 +02:00
M. Dent
2904e58a9f Merge translations for non-installed apps message
See merge request hubzilla/core!1296
2018-09-28 21:34:15 +02:00
Max Kostikov
c45a9504e7 Update Group.php 2018-09-28 19:52:11 +02:00
Max Kostikov
403ead44f9 Update Wiki.php 2018-09-28 19:50:45 +02:00
Max Kostikov
9b0d123217 Update Webpages.php 2018-09-28 19:50:29 +02:00
Max Kostikov
8e673a6cdf Update Tokens.php 2018-09-28 19:50:15 +02:00
Max Kostikov
6d3c1fb7fc Update Sources.php 2018-09-28 19:49:56 +02:00
Max Kostikov
01043fa790 Update Poke.php 2018-09-28 19:49:42 +02:00
Max Kostikov
23d5e15f0f Update Permcats.php 2018-09-28 19:49:20 +02:00
Max Kostikov
5500473387 Update Pdledit.php 2018-09-28 19:49:02 +02:00
Max Kostikov
c8399e8104 Update Oauth2.php 2018-09-28 19:48:44 +02:00
Max Kostikov
423e1422ef Update Oauth.php 2018-09-28 19:48:25 +02:00
Max Kostikov
c34c0c6718 Update Notes.php 2018-09-28 19:48:09 +02:00
Max Kostikov
e3e96e59d2 Update Mood.php 2018-09-28 19:47:52 +02:00
Max Kostikov
accb211280 Update Lang.php 2018-09-28 19:47:37 +02:00
Max Kostikov
f07a4667b6 Update Invite.php 2018-09-28 19:47:20 +02:00
Max Kostikov
cb768ea23f Update Connect.php 2018-09-28 19:46:36 +02:00
Max Kostikov
b3249c10c2 Update Chat.php 2018-09-28 19:46:20 +02:00
Max Kostikov
c6fce5de24 Update Cdav.php 2018-09-28 19:46:04 +02:00
Max Kostikov
5c8e1169cd Update Cards.php 2018-09-28 19:45:11 +02:00
Max Kostikov
c0a485083d Update Articles.php 2018-09-28 19:44:35 +02:00
Max Kostikov
5f7d83bd4d Update Articles.php 2018-09-28 19:44:10 +02:00
Max Kostikov
52916bfcec Merge branch 'patch-11' into 'dev'
add translations

See merge request Kostikov/core!21
2018-09-28 16:04:29 +02:00
Max Kostikov
cb2646154a Merge branch 'patch-12' into 'dev'
Update Oauth2.php

See merge request Kostikov/core!20
2018-09-28 16:03:44 +02:00
Max Kostikov
61a7c4fb33 Merge branch 'patch-13' into 'dev'
Update Pdledit.php

See merge request Kostikov/core!19
2018-09-28 16:03:05 +02:00
Max Kostikov
3a3abc8087 Merge branch 'patch-14' into 'dev'
Update Permcats.php

See merge request Kostikov/core!18
2018-09-28 16:02:33 +02:00
Max Kostikov
e9b60cfb26 Merge branch 'patch-15' into 'dev'
Update Poke.php

See merge request Kostikov/core!17
2018-09-28 16:01:49 +02:00
Max Kostikov
eea9e2c1d0 Merge branch 'patch-16' into 'dev'
Update Sources.php

See merge request Kostikov/core!16
2018-09-28 16:01:05 +02:00
Max Kostikov
171d129ad1 Merge branch 'patch-17' into 'dev'
Update Tokens.php

See merge request Kostikov/core!15
2018-09-28 16:00:32 +02:00
Max Kostikov
0154c5d74e Merge branch 'patch-18' into 'dev'
Update Webpages.php

See merge request Kostikov/core!14
2018-09-28 15:59:48 +02:00
Max Kostikov
9032a656fa Merge branch 'patch-19' into 'dev'
Update Wiki.php

See merge request Kostikov/core!13
2018-09-28 15:58:55 +02:00
Max Kostikov
fda57a93a5 Merge branch 'patch-20' into 'dev'
Update Articles.php

See merge request Kostikov/core!12
2018-09-28 15:58:05 +02:00
Max Kostikov
4ad208668a Merge branch 'patch-21' into 'dev'
Update Cards.php

See merge request Kostikov/core!11
2018-09-28 15:57:29 +02:00
Max Kostikov
23edb51ba4 Merge branch 'patch-22' into 'dev'
Update Cdav.php

See merge request Kostikov/core!10
2018-09-28 15:56:55 +02:00
Max Kostikov
adf10296f1 Merge branch 'patch-23' into 'dev'
Update Chat.php

See merge request Kostikov/core!9
2018-09-28 15:56:17 +02:00
Max Kostikov
d3e6d6b6a6 Merge branch 'patch-24' into 'dev'
Update Connect.php

See merge request Kostikov/core!8
2018-09-28 15:55:41 +02:00
Max Kostikov
82de0862a1 Merge branch 'patch-25' into 'dev'
Update Group.php

See merge request Kostikov/core!7
2018-09-28 15:54:45 +02:00
Max Kostikov
1969537fd7 Merge branch 'patch-26' into 'dev'
Update Invite.php

See merge request Kostikov/core!6
2018-09-28 15:54:08 +02:00
Max Kostikov
973afe042a Merge branch 'patch-27' into 'dev'
Update Lang.php

See merge request Kostikov/core!5
2018-09-28 15:53:14 +02:00
Max Kostikov
99ceb1691b Merge branch 'patch-28' into 'dev'
Update Mood.php

See merge request Kostikov/core!4
2018-09-28 15:52:28 +02:00
Max Kostikov
4a904fa3a8 Merge branch 'patch-29' into 'dev'
Patch 29

See merge request Kostikov/core!3
2018-09-28 15:46:14 +02:00
Max Kostikov
c13d7e29ef Update Notes.php 2018-09-28 15:35:39 +02:00
Max Kostikov
58d9ca1bfd Update Mood.php 2018-09-28 15:35:14 +02:00
Max Kostikov
e2115e8ea5 Update Lang.php 2018-09-28 15:34:45 +02:00
Max Kostikov
ba417894ed Update Invite.php 2018-09-28 15:34:20 +02:00
Max Kostikov
a237248388 Update Group.php 2018-09-28 15:33:50 +02:00
Max Kostikov
7fd332f8cf Update Connect.php 2018-09-28 15:33:17 +02:00
Max Kostikov
2811d6ae53 Update Chat.php 2018-09-28 15:32:27 +02:00
Max Kostikov
d8c6d93c6e Update Cdav.php 2018-09-28 15:31:22 +02:00
Max Kostikov
134529a09d Update Cards.php 2018-09-28 15:30:30 +02:00
Max Kostikov
24c7bb600e Update Articles.php 2018-09-28 15:30:03 +02:00
Max Kostikov
90e9948dbe Update Wiki.php 2018-09-28 15:29:33 +02:00
Max Kostikov
db006b911a Update Webpages.php 2018-09-28 15:28:57 +02:00
Max Kostikov
eb2c2b9400 Update Tokens.php 2018-09-28 15:27:54 +02:00
Max Kostikov
86fc5b5ed8 Update Sources.php 2018-09-28 15:27:16 +02:00
Max Kostikov
f7e9454697 Update Poke.php 2018-09-28 15:26:46 +02:00
Max Kostikov
02a16050d9 Update Permcats.php 2018-09-28 15:26:09 +02:00
Max Kostikov
598fe91464 Update Pdledit.php 2018-09-28 15:25:38 +02:00
Max Kostikov
21272735ae Update Oauth2.php 2018-09-28 15:24:45 +02:00
Max Kostikov
52fea09c53 add translations 2018-09-28 15:23:38 +02:00
Mario Vavti
d9ccd24b02 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-09-28 13:08:04 +02:00
Mario
27fef98a39 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-09-28 13:05:44 +02:00
Mario Vavti
c6db644c42 Merge remote-tracking branch 'mike/master' into dev 2018-09-28 12:46:36 +02:00
Mario
41108fc4d3 nav_channel_select should be off by default 2018-09-28 11:46:17 +02:00
Mario Vavti
d7a20821c3 move display settings up 2018-09-28 11:32:00 +02:00
Mario Vavti
20285d076b settings for channel home 2018-09-28 11:29:05 +02:00
Mario
44bb070203 add transaction, commit and rollback to update 1221 2018-09-28 09:55:10 +02:00
Mario
9e87219aea Merge branch 'patch-10' into 'dev'
rename groups and group_members tables for MySQL 8 compatibility

See merge request hubzilla/core!1290
2018-09-28 09:41:21 +02:00
M. Dent
1b7e220de7 Merge branch 'channel-limits' into 'dev'
Hide form when at or over service_class['limit_identities']

See merge request hubzilla/core!1292
2018-09-28 04:46:48 +02:00
M.Dent
fe8b723622 Hide form when at or over service_class['limit_identities'] 2018-09-27 22:43:36 -04:00
M. Dent
1e85c40c42 Merge branch 'patch-9' into 'dev'
Add translation for new apps

See merge request hubzilla/core!1289
2018-09-28 04:15:28 +02:00
M. Dent
f72464a240 Merge branch 'patch-8' into 'dev'
Missprint in Oauth.php fixed

See merge request hubzilla/core!1288
2018-09-28 04:14:51 +02:00
Max Kostikov
65785ead69 Update zot.php 2018-09-28 01:05:03 +02:00
Max Kostikov
c550100a55 Update Group.php 2018-09-28 00:52:49 +02:00
Max Kostikov
2836bce8fe Update security.php 2018-09-28 00:51:21 +02:00
Max Kostikov
7f95d47721 Update Group.php 2018-09-28 00:49:32 +02:00
Max Kostikov
51c0045be4 Update zot.php 2018-09-28 00:38:36 +02:00
Max Kostikov
abfbfd9e9b Update group.php 2018-09-28 00:33:52 +02:00
Max Kostikov
5d6c8fd807 Update Import.php 2018-09-28 00:28:15 +02:00
Max Kostikov
f4799b2ddb Update Group.php 2018-09-28 00:26:01 +02:00
Max Kostikov
9afa6cc245 Update Libsync.php 2018-09-28 00:20:03 +02:00
Max Kostikov
25e8d70786 Update Acl.php 2018-09-28 00:14:21 +02:00
Max Kostikov
978e45911f Update Connections.php 2018-09-28 00:12:00 +02:00
Max Kostikov
da7bce3470 Update Contactgroup.php 2018-09-28 00:11:03 +02:00
Max Kostikov
4efa5cfa75 Update Group.php 2018-09-28 00:10:20 +02:00
Max Kostikov
444ae51a3e Update Lockview.php 2018-09-28 00:06:26 +02:00
Max Kostikov
07f82e4a14 Update Network.php 2018-09-28 00:05:43 +02:00
Max Kostikov
3379f6f793 Update Channel.php 2018-09-28 00:02:58 +02:00
Max Kostikov
80b47734a7 Update Activity_filter.php 2018-09-28 00:01:39 +02:00
Max Kostikov
69d46538ce Update boot.php 2018-09-28 00:00:38 +02:00
Max Kostikov
208d38207e Update acl_selectors.php 2018-09-27 23:59:45 +02:00
Max Kostikov
ffe80c66d7 Update api_zot.php 2018-09-27 23:58:49 +02:00
Max Kostikov
bfa672f42c Update channel.php 2018-09-27 23:56:54 +02:00
Max Kostikov
9f89f3190a Update connections.php 2018-09-27 23:55:20 +02:00
Max Kostikov
71931b423c Update items.php 2018-09-27 23:53:51 +02:00
Max Kostikov
b54aabc958 Update security.php 2018-09-27 23:52:46 +02:00
Max Kostikov
a45fe72eb9 Update text.php 2018-09-27 23:50:26 +02:00
Max Kostikov
62d64631b5 Update xchan.php 2018-09-27 23:49:41 +02:00
Max Kostikov
11945ce7bc Update schema_mysql.sql 2018-09-27 23:48:25 +02:00
Max Kostikov
bb3d908bcf Update schema_postgres.sql 2018-09-27 23:46:58 +02:00
Max Kostikov
98b3946fca rename groups and group_members tables for MySQL 8 compatibility 2018-09-27 23:42:11 +02:00
Mario
c15de3b68b more checks 2018-09-27 22:45:43 +02:00
Max Kostikov
78ed1ae446 Add translation for new apps 2018-09-27 21:57:27 +02:00
Max Kostikov
56fdc4f3fe Missprint in Oauth.php fixed 2018-09-27 20:26:47 +02:00
M. Dent
f17261020d Merge branch 'dev' into 'dev'
Translate system app names

See merge request hubzilla/core!1286
2018-09-27 19:38:39 +02:00
M.Dent
6f98ca68af Translate system app names 2018-09-27 13:37:15 -04:00
Mario Vavti
269538fdc7 bump version 2018-09-27 14:57:22 +02:00
Mario Vavti
6b23c3e179 implement conversation tools (settings/conversation), remove additional features from the settings menu and get rid of skill levels 2018-09-27 14:56:47 +02:00
zotlabs
5cc19ce053 jsonld signature issue (library is using sha1, spec requires sha256) 2018-09-26 16:39:08 -07:00
Mario Vavti
bdf6289b32 tokens: add css file and fix argc and argv values 2018-09-26 22:32:06 +02:00
Mario Vavti
e3c04b1fd0 guest access app 2018-09-26 22:24:36 +02:00
Mario Vavti
a7948d7bfe permcats app 2018-09-26 22:02:50 +02:00
Mario Vavti
505782f224 remove oauth from features 2018-09-26 16:35:05 +02:00
Mario Vavti
1353c291e9 add check for local_channel() 2018-09-26 16:32:06 +02:00
Mario Vavti
9af1b62bee change wording 2018-09-26 16:26:36 +02:00
Mario Vavti
d7ec36e3da wrong app name 2018-09-26 16:23:12 +02:00
Mario Vavti
aab97adb23 oauth and oauth2 apps manager 2018-09-26 16:22:34 +02:00
Mario Vavti
91502b4104 change wording 2018-09-26 15:13:19 +02:00
Mario Vavti
9bc76b4259 appification of the pdl editor and move advanced_theming to theme settings where it belongs 2018-09-26 15:02:20 +02:00
Mario Vavti
9948bb3f2a appification of privacy groups 2018-09-25 12:59:53 +02:00
Mario Vavti
0722775038 missing file 2018-09-25 12:22:43 +02:00
Mario Vavti
65423b1768 get rid of general features 2018-09-25 12:02:48 +02:00
Mario Vavti
9bb0f1d18e move advanced_theming switch to settings/display for now 2018-09-25 12:02:00 +02:00
Mario Vavti
39866b7463 move start_menu switch to settings/display for now 2018-09-25 11:37:22 +02:00
Mario Vavti
4c58a5cef2 premium channel app 2018-09-25 10:06:24 +02:00
Mario Vavti
c748230b35 revert nav settings opacity 2018-09-24 11:51:20 +02:00
Mario Vavti
c3aa15cc16 appification of notes 2018-09-24 11:46:18 +02:00
Mario Vavti
b45bd901e0 move categories from tools to editor settings 2018-09-24 10:13:56 +02:00
Mario
317fd06357 Merge branch 'app-installed-filters' into 'dev'
Add filters for addon/app installed checks and docs

See merge request hubzilla/core!1284
2018-09-24 09:57:26 +02:00
Mario
4a7c678213 fade in nav settings button 2018-09-24 09:46:19 +02:00
Mario
85e06a77af add file 2018-09-24 09:34:28 +02:00
Mario
7cadc30914 settings for directory and set App::$profile_uid in directory if local_channel() 2018-09-24 09:33:52 +02:00
M.Dent
995fc63f2c Add filters for addon/app installed checks and docs 2018-09-23 22:36:27 -04:00
Mario
e735220691 only explain how to select a channel if there are channels to select 2018-09-23 20:54:36 +02:00
Mario
9b7c6e96f7 only show nav settings icon when hovering over nav 2018-09-23 20:41:01 +02:00
Mario
d83fe9d417 minor cleanup 2018-09-23 20:02:28 +02:00
Mario
a1d1d5dba7 use different settings for cal_first_day in events and cdav/calendar. This is a tradeoff. It would be better to have one setting for both but if we want to preserve the *all settings* view, this would break its functionality 2018-09-23 19:40:52 +02:00
Mario
781fdaafcd settings for events and cdav calendar 2018-09-23 19:18:05 +02:00
Mario
1f1d5b9181 provide settings for mod photo and make it slightly simpler to create new module settings 2018-09-23 17:52:32 +02:00
Mario
9e22ec267c keep the features in the central array but sort them by module name 2018-09-23 01:11:06 +02:00
Mario
b296a73330 this should be off by default 2018-09-22 20:15:34 +02:00
Mario
65be3de200 add files and settings for channel manager 2018-09-22 20:10:48 +02:00
Mario
45078dda82 introduce profile settings and provide a way for modules without an app to still be able to link to its settings page from the navbar 2018-09-22 19:48:17 +02:00
Mario Vavti
822bbd9ad5 another try to fix Fix PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: no name in Entity 2018-09-22 14:18:37 +02:00
Mario
c873f7e702 Revert "Fix PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: no name in Entity"
This reverts commit 184928204a
2018-09-22 14:15:30 +02:00
Mario Vavti
0a5ac62b59 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-09-22 13:32:58 +02:00
Mario Vavti
1e5405ccaf appification of sources 2018-09-22 13:32:42 +02:00
Mario
12d2270935 Merge branch 'page-meta-properties' into 'dev'
Page meta properties

See merge request hubzilla/core!1283
2018-09-22 10:44:51 +02:00
M. Dent
ed00d1b2e3 Page meta properties 2018-09-22 10:44:51 +02:00
Mario Vavti
2b452ffbd3 rge remote-tracking branch 'mike/master' into dev 2018-09-22 08:44:01 +02:00
zotlabs
3b4a23c4a1 doc cleanup 2018-09-21 17:21:47 -07:00
Mario Vavti
4484985c2d add file 2018-09-21 21:37:00 +02:00
Mario Vavti
6f99ca1d31 opacity for jot settings/reset buttons 2018-09-21 20:59:31 +02:00
Mario Vavti
8efa103041 provide editor settings 2018-09-21 20:57:01 +02:00
Mario Vavti
9638bf2b1e provide a return path from settings pages 2018-09-21 20:23:31 +02:00
Mario Vavti
6f43468724 compare strpos() result against false 2018-09-21 15:08:02 +02:00
Mario Vavti
18a9ebdb1e add missing check 2018-09-21 14:07:30 +02:00
Mario
604142af93 Merge branch 'patch-5' into 'dev'
save admin page values

See merge request hubzilla/core!1282
2018-09-21 13:55:47 +02:00
Max Kostikov
2d83868ed9 Update admin_account_edit.tpl 2018-09-21 13:50:50 +02:00
Max Kostikov
73195a0215 Update admin_account_edit.tpl 2018-09-21 13:48:44 +02:00
Max Kostikov
13d05549f8 Update admin_accounts.tpl 2018-09-21 13:48:40 +02:00
Max Kostikov
0143bc734c Update admin_channels.tpl 2018-09-21 13:48:35 +02:00
Max Kostikov
ff860a3310 Update admin_logs.tpl 2018-09-21 13:48:27 +02:00
Max Kostikov
ed0044aeab Update admin_profiles.tpl 2018-09-21 13:48:22 +02:00
Max Kostikov
1a6d290d71 Update admin_security.tpl 2018-09-21 13:48:12 +02:00
Max Kostikov
dbb7245e22 Update admin_site.tpl 2018-09-21 13:48:07 +02:00
Mario Vavti
437aa4082c Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-09-21 13:24:38 +02:00
Mario
0f9802a47c Merge branch 'patch-5' into 'dev'
Admin forms buttons design unification

See merge request hubzilla/core!1281
2018-09-21 13:24:29 +02:00
Mario Vavti
46d6d1c329 Merge remote-tracking branch 'mike/master' into dev 2018-09-21 12:45:32 +02:00
Mario Vavti
4dd1521677 fix position of nav settings icon 2018-09-21 12:16:36 +02:00
Mario Vavti
32fba39915 fix typo 2018-09-21 11:22:11 +02:00
Mario Vavti
c1697ce96b fix can not enter text in notes widget 2018-09-21 11:15:18 +02:00
zotlabs
ba49e6a588 don't double encode 2018-09-20 22:46:47 -07:00
zotlabs
5525f082e6 remove bbcode from event hovertip 2018-09-20 22:43:01 -07:00
zotlabs
a4d987b45a Merge branch 'dev' 2018-09-20 18:36:14 -07:00
zotlabs
3cc66b6816 bookmarks fail to sync 2018-09-20 16:07:32 -07:00
Max Kostikov
21ff570c4d Update admin_account_edit.tpl 2018-09-20 23:40:09 +02:00
Max Kostikov
f2e4cf3a92 Update admin_security.tpl 2018-09-20 23:39:46 +02:00
Max Kostikov
7123de66f9 Update admin_profiles.tpl 2018-09-20 23:39:18 +02:00
Max Kostikov
e4fe202fc6 Update admin_site.tpl 2018-09-20 23:38:48 +02:00
Max Kostikov
bde6caf167 Update admin_accounts.tpl 2018-09-20 23:38:19 +02:00
Max Kostikov
96f45b5fbe Update admin_channels.tpl 2018-09-20 23:36:35 +02:00
Max Kostikov
4352afeeb0 Update admin_logs.tpl 2018-09-20 23:32:13 +02:00
Mario Vavti
369f34b2d1 remove connection filter from network settings 2018-09-20 13:25:47 +02:00
Mario Vavti
1ca558f011 move connection filtering setting from network to connections, provide a link to settings in the navbar if present for a module and some code optimisation 2018-09-20 13:22:41 +02:00
Mario Vavti
a6db822a69 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-09-20 12:10:39 +02:00
Mario Vavti
ad8226d549 deal with the ability to provide settings url in apd files in include/nav.php 2018-09-20 12:10:27 +02:00
Mario
1b27327057 Merge branch 'preempt-hooks' into 'dev'
Preempt hooks

See merge request hubzilla/core!1279
2018-09-20 12:08:45 +02:00
Mario
3d713cee62 Merge branch 'hook-docs' into 'dev'
Document new hooks

See merge request hubzilla/core!1278
2018-09-20 12:07:47 +02:00
Mario Vavti
afd4da8f11 Merge remote-tracking branch 'mike/master' into dev 2018-09-20 11:16:14 +02:00
M.Dent (DM42.Net)
3ee632514c Add structure to permit_hook 2018-09-19 22:33:25 -04:00
M.Dent (DM42.Net)
456fe71ca9 add hook: permit_hook 2018-09-19 21:54:46 -04:00
M.Dent (DM42.Net)
f2c59b3881 Document new hooks 2018-09-19 21:18:06 -04:00
zotlabs
2c1560e027 fix setup 2018-09-19 17:56:23 -07:00
Mario Vavti
34fec995f7 allow a second url in apd files for settings, hide pin and star buttons in edit mode and use strpos() instead of strstr() in some places 2018-09-19 15:00:06 +02:00
Mario Vavti
ec7cbe272a Merge remote-tracking branch 'mike/master' into dev 2018-09-19 11:23:38 +02:00
zotlabs
98bc1ed600 this was needed 2018-09-18 23:18:59 -07:00
zotlabs
7756773683 missing autocomplete (e.g. mentions) in mod_photos comments 2018-09-18 19:52:10 -07:00
zotlabs
dfdf11d461 Merge branch 'dev' 2018-09-17 19:38:40 -07:00
zotlabs
cc5ef57843 fix listeners table create and expire federation had a syntax error 2018-09-17 18:40:49 -07:00
Mario Vavti
71c599f50e remove superfluous comma 2018-09-17 22:16:42 +02:00
Mario Vavti
a1f3a5d9b6 remove unused variable 2018-09-17 22:16:10 +02:00
Mario Vavti
a9e89d2fcc Merge remote-tracking branch 'mike/master' into dev 2018-09-17 22:07:50 +02:00
zotlabs
fdc89d1b89 pdo install check requires namespacing 2018-09-17 13:03:17 -07:00
Mario
c4c1b1f5a2 Merge branch 'patch-3' into 'dev'
Save combined view while deleting or recalling first message in thread

See merge request hubzilla/core!1273
2018-09-17 13:29:52 +02:00
Max Kostikov
12b9106fc7 Update zot.php 2018-09-17 13:16:04 +02:00
Max Kostikov
faaffdd618 Update message.php 2018-09-17 13:15:43 +02:00
Max Kostikov
774729b221 Update msglib.php 2018-09-17 13:15:24 +02:00
Mario Vavti
1455fa6bc3 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-09-17 11:36:25 +02:00
Mario Vavti
a9853e6033 seperate settings for mod network 2018-09-17 11:36:11 +02:00
Mario
eefa47776b Merge branch 'trap-template-errors' into 'dev'
Trap errors in template rendering.  Output a generic error and log problem.

See merge request hubzilla/core!1274
2018-09-17 11:03:37 +02:00
Mario
0b12a7e66f Merge branch 'delete-attach-hook' into 'dev'
delete_attach hook

See merge request hubzilla/core!1275
2018-09-17 11:00:22 +02:00
Mario
3019d8341d Merge branch 'app-list-hook' into 'dev'
Add hook to allow addons to filter the list returned by app_list

See merge request hubzilla/core!1276
2018-09-17 10:55:47 +02:00
Mario Vavti
dcacfc1124 Merge remote-tracking branch 'mike/master' into dev 2018-09-17 10:31:13 +02:00
Mario Vavti
2f6cb764a4 prepare submodule to interact with route 2018-09-17 10:30:47 +02:00
M.Dent
a0cf2b53e0 Add hook to allow addons to filter the list returned by app_list 2018-09-16 23:01:17 -04:00
zotlabs
593a5072d9 Some improvements to setup checks: image library and pdo support 2018-09-16 20:00:20 -07:00
zotlabs
27617efbfb Merge branch 'dev' 2018-09-16 19:05:12 -07:00
zotlabs
6ab12597f5 do not sync the channel_moved field 2018-09-16 18:59:12 -07:00
Mario Vavti
07cd1d1272 appification of the lang module 2018-09-16 09:30:07 +02:00
M.Dent (DM42.Net)
abe35817cd Add attach_delete hook 2018-09-15 23:09:16 -04:00
Max Kostikov
585bdf562a Update msglib.php 2018-09-16 00:43:45 +02:00
Max Kostikov
034441bd13 use common msg_drop function 2018-09-15 22:32:56 +02:00
Max Kostikov
1819704620 Use common msg_drop function 2018-09-15 22:32:07 +02:00
Max Kostikov
18801a6c60 formatting 2018-09-15 22:31:08 +02:00
Max Kostikov
f83c2d5cd1 Create msglib.php 2018-09-15 22:27:39 +02:00
Max Kostikov
724dc48fe8 Add new file 2018-09-15 21:41:13 +02:00
Mario Vavti
791ff25d52 appify poke 2018-09-15 11:09:16 +02:00
Mario Vavti
299eb469f8 appify mood 2018-09-15 11:00:41 +02:00
Mario Vavti
0f9a8a43e4 appify invite 2018-09-15 10:48:51 +02:00
Mario Vavti
7856f5882b appify cdav stuff. WARNING: if you use caldav or carddav from a client or the webinterface you will need to enable those apps to make things work again 2018-09-15 10:10:43 +02:00
Max Kostikov
284e5dd2e8 unification with zot.php code for future reuse 2018-09-15 01:45:54 +02:00
Max Kostikov
3d3f4f50fb formatting 2018-09-15 01:40:17 +02:00
Max Kostikov
8d89c4bbce Save combined view on calling first message in thread 2018-09-15 01:20:49 +02:00
Max Kostikov
85d8225cc0 less data in select 2018-09-15 01:01:48 +02:00
M.Dent
8ad24ca3e8 Catch errors in template rendering. Output a generic error and log problem. 2018-09-14 17:53:28 -04:00
Max Kostikov
6360dee125 formatting 2018-09-14 17:45:42 +02:00
Max Kostikov
e931616011 Save combined view while deleting first message in thread 2018-09-14 17:38:14 +02:00
Mario
ab611e9ef3 Merge branch 'patch-2' into 'dev'
php2po.php unify quote/unquote

See merge request hubzilla/core!1272
2018-09-14 10:48:03 +02:00
Max Kostikov
240d4704aa php2po.php unify quote/unquote 2018-09-13 21:28:15 +02:00
Mario Vavti
f9d43479f2 css issues 2018-09-13 15:14:46 +02:00
Mario Vavti
c2f6f87cae add activity_filter and activity_order .bb files 2018-09-13 11:55:37 +02:00
Mario Vavti
869534fafa remove network_tabs() which has been deprecated and replaced by activity_{order, filters} widgets 2018-09-13 11:53:59 +02:00
Mario Vavti
56f88f2e30 move chat from feature to apps 2018-09-13 11:32:43 +02:00
Mario Vavti
a1d5ce3716 remove profile_tabs() which has been deprecated and replaced by channel_apps() 2018-09-13 10:59:37 +02:00
Mario
78dc679a72 Merge branch 'patch-1' into 'dev'
z_fetch_url with case insensitive headers

See merge request hubzilla/core!1271
2018-09-12 21:11:47 +02:00
Mario Vavti
57e3ee47ee more feature to app transition 2018-09-12 20:52:55 +02:00
Mario Vavti
184928204a Fix PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: no name in Entity 2018-09-12 11:14:49 +02:00
Mario Vavti
2651eae663 mpre feature to app transition 2018-09-12 11:08:53 +02:00
Mario Vavti
28e4977c33 include item.title in /network and /channel search 2018-09-11 11:16:58 +02:00
zotlabs
adc164b825 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-09-10 22:11:26 -07:00
Max Kostikov
66bf55710e Update network.php 2018-09-10 15:13:28 +02:00
Mario Vavti
c6abe87ec2 move cards from features to apps 2018-09-10 13:34:05 +02:00
Mario Vavti
4bb16b18ed cover photo: mior issue and more cleanup 2018-09-10 12:12:05 +02:00
Mario Vavti
4cc413cdaf cover photo: some code cleanup and fix height issue when photo was not cached 2018-09-10 11:12:15 +02:00
zotlabs
be3b630474 important hyperdrive component 2018-09-09 20:53:20 -07:00
Mario Vavti
677ad71b96 fix some issues with latest notification improvements 2018-09-09 19:44:27 +02:00
Mario Vavti
9607bb29fd missing text 2018-09-07 14:58:16 +02:00
Mario Vavti
d29415a6e2 provide a noscript_content switch for mod channel and display 2018-09-07 14:23:16 +02:00
Mario Vavti
54fa28441c install bootstrap via composer 2018-09-07 11:26:02 +02:00
Mario Vavti
bb42ec2bfc apps: change page title to available/installed, display install action label in button and use different icons for installable and updateable apps 2018-09-07 10:39:15 +02:00
Mario Vavti
d31251c54e overflow should be auto not visible 2018-09-07 10:07:29 +02:00
Mario Vavti
6a338e28b2 -1 has issues in some browsers 2018-09-06 14:27:56 +02:00
Mario Vavti
f3ce5e73fe Merge remote-tracking branch 'mike/master' into dev 2018-09-06 12:22:41 +02:00
Mario Vavti
c53d3a4b3a bump version 2018-09-06 11:44:47 +02:00
Mario Vavti
5135f236c2 improve cover-photo handling 2018-09-06 11:30:50 +02:00
Mario Vavti
78c847ef7d improve notification handling on small screens 2018-09-06 11:14:08 +02:00
Mario Vavti
673a2f67f1 sticky-kit: improve handling 2018-09-06 10:08:55 +02:00
zotlabs
c5bc4fe245 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-09-05 21:02:06 -07:00
zotlabs
bc4a92b702 detect and automatically repair duplicate plugin hook scenarios. 2018-09-05 19:43:07 -07:00
Mario Vavti
ea381d9180 move str_replace inside if clause 2018-09-05 14:44:06 +02:00
Mario Vavti
4f82428a20 hide cover photo by default and show it only if conditions are met 2018-09-05 14:31:34 +02:00
Mario Vavti
e494a76b33 revert "Add bottom margin on aside elements and main to allow for viewport footer."
This reverts commit 1d7d604016.
2018-09-05 12:34:30 +02:00
Mario Vavti
1753e40466 Revert "Fix jumpy sidebars"
This reverts commit 79eb6d3942.
2018-09-05 12:32:53 +02:00
Mario Vavti
6667ba4172 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-09-05 12:20:06 +02:00
Mario Vavti
75e8aa8aee bump version 2018-09-05 12:19:52 +02:00
Mario
a81a1bd5f1 Merge branch 'fix-authorcomment-fix' into 'dev'
Corrected resubmit of fixes to Authors unable to comment on posts they authored…

See merge request hubzilla/core!1269
2018-09-05 12:18:56 +02:00
Mario Vavti
5d1539df75 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-09-05 12:17:50 +02:00
Mario Vavti
a821682c8c instead of not displaying the cover-photo at all after first page load, load the page with the cover slided up. change pointer to n-resize if cover is not slid. 2018-09-05 12:17:32 +02:00
M.Dent
9446e0348e Corrected resubmit of fixes to Authors unable to comment on posts they authored when owned by others. 2018-09-04 08:14:52 -04:00
Mario Vavti
41ccb61c2e Revert "Fix: Authors unable to comment on posts they authored when under owned by others in certain circumstances."
This reverts commit e2824f9259.

Reverting because it breaks forum mentions.
2018-09-03 18:14:17 +02:00
Mario
1b7781a159 Merge branch 'add-delivery-status-info' into 'dev'
Fix: Authors unable to comment on posts they authored when under owned by others…

See merge request hubzilla/core!1268
2018-09-02 09:17:29 +02:00
Mario Vavti
d66f58a550 fix undefined constant warning 2018-09-01 21:09:04 +02:00
M.Dent
e2824f9259 Fix: Authors unable to comment on posts they authored when under owned by others in certain circumstances. 2018-09-01 13:45:05 -04:00
Mario Vavti
4376f8f030 do not count sys channel in totals 2018-09-01 13:43:32 +02:00
Mario Vavti
d377660b5a update 1218: missing default value for pg 2018-08-31 20:26:31 +02:00
Mario
c5ce9b0699 Merge branch 'call-hooks-optimization' into 'dev'
Micro-optimization to call_hooks()

See merge request hubzilla/core!1267
2018-08-30 10:09:00 +02:00
Mario
c74a7ce4fc Merge branch 'add-delivery-status-info' into 'dev'
Add dreport_process hook

See merge request hubzilla/core!1266
2018-08-30 10:07:18 +02:00
Mario Vavti
d98ed68749 html-to-markdown adds a backslash infront of a hash after each new line - manualy remove those 2018-08-29 16:16:17 +02:00
M.Dent
70d6d2f2db Micro-optimization to call_hooks() 2018-08-29 10:02:04 -04:00
M.Dent
da441c59f6 Add dreport_process hook 2018-08-29 08:58:49 -04:00
Mario Vavti
42093aedcf db update to get rid of bogus activitypub xchans which got created due to a bug in the pubcrawl addon 2018-08-29 13:57:36 +02:00
Mario Vavti
74d80473df Merge remote-tracking branch 'mike/master' into dev 2018-08-29 11:50:40 +02:00
zotlabs
7ecb337405 redirect stdout/stderr on cron command 2018-08-28 22:43:37 -07:00
Mario Vavti
07792adc56 add paragonie and symfonie since ramsey/uuid appears to require them 2018-08-28 12:06:36 +02:00
Mario Vavti
c0c827d3ad update composer libs and add ramsey/uuid 2018-08-28 12:00:23 +02:00
Mario Vavti
6a2bbed73d remove distinct from network query again until performance issue is resolved or another fix for the underlying problem is found 2018-08-27 10:19:10 +02:00
Mario
4c1944a08d Merge branch 'extend-convitems-dropdown' into 'dev'
Extend cog dropdown & temp fix for feed display of corrupt mids

See merge request hubzilla/core!1265
2018-08-27 10:02:58 +02:00
Mario
95f870f1b4 Merge branch 'dev' into 'dev'
Add translation to missed strings in Wiki

See merge request hubzilla/core!1264
2018-08-27 10:00:50 +02:00
Mario Vavti
c250de7dae Merge remote-tracking branch 'mike/master' into dev 2018-08-27 09:48:22 +02:00
zotlabs
e4b6a143c7 Revert "Change main router request variable from 'q' to 'req'. This is necessary to implement search in the twitter api addon, because twitter requires use of the variable 'q'." Reverting because this will only work with Apache and break nginx/other installations.
This reverts commit 9367e9fe5a.
2018-08-26 23:05:56 -07:00
zotlabs
9367e9fe5a Change main router request variable from 'q' to 'req'. This is necessary to implement search in the twitter api addon, because twitter requires use of the variable 'q'. 2018-08-26 23:00:31 -07:00
M.Dent
a0c2bbac9d Add hook to extend conv_item cog dropdown menu 2018-08-26 23:26:10 -04:00
Max Kostikov
f5f6ec3d71 Update wiki.tpl 2018-08-25 21:34:58 +02:00
Max Kostikov
c57c1c8b2e Merge branch 'revert-c16fda1c' into 'dev'
Revert "Update wiki.tpl"

See merge request Kostikov/core!2
2018-08-25 21:31:58 +02:00
Max Kostikov
44f639f371 Revert "Update wiki.tpl"
This reverts commit c16fda1cb6
2018-08-25 21:31:47 +02:00
Max Kostikov
4435717168 Merge branch 'revert-ff1a0d21' into 'dev'
Revert "Update wiki.tpl"

See merge request Kostikov/core!1
2018-08-25 21:31:17 +02:00
Max Kostikov
6767ff5434 Revert "Update wiki.tpl"
This reverts commit ff1a0d217f
2018-08-25 21:30:58 +02:00
Max Kostikov
ff1a0d217f Update wiki.tpl 2018-08-25 21:29:25 +02:00
Max Kostikov
42c5e98670 Update Wiki_page_history.php 2018-08-25 21:27:20 +02:00
Max Kostikov
c9b80a3612 Update Wiki.php 2018-08-25 21:26:50 +02:00
Max Kostikov
e78a4d61d8 Update NativeWikiPage.php 2018-08-25 21:25:26 +02:00
Max Kostikov
88ebcb56e7 Update Wiki_page_history.php 2018-08-25 21:23:08 +02:00
Max Kostikov
308dda1587 Update Wiki.php 2018-08-25 21:21:57 +02:00
Max Kostikov
67a9dd8497 Update NativeWikiPage.php 2018-08-25 21:20:00 +02:00
Max Kostikov
732ce25d7f Update nwiki_page_history.tpl 2018-08-25 21:17:25 +02:00
Max Kostikov
c16fda1cb6 Update wiki.tpl 2018-08-25 21:16:05 +02:00
Mario Vavti
f036c25dca Merge remote-tracking branch 'mike/master' into dev 2018-08-24 14:44:45 +02:00
Mario
7fc4292ed8 Merge branch 'dm42fixes' into 'dev'
fix exclusion of redmatrix theme

See merge request hubzilla/core!1263
2018-08-24 14:33:04 +02:00
Mario
b50e8a5cf9 Merge branch 'patch-19' into 'dev'
Update Russian translation

See merge request hubzilla/core!1262
2018-08-24 14:31:28 +02:00
zotlabs
7018da3f12 code cleanup 2018-08-23 22:44:22 -07:00
zotlabs
a66c43166a first_post_date() (used by archive widget) - trigger the query options off of the active module rather than rely on passed parameters 2018-08-23 21:01:28 -07:00
M.Dent
2893f7d481 Get full page of items 2018-08-23 23:54:18 -04:00
M.Dent
398e42acb5 fix exclusion of redmatrix theme 2018-08-23 20:53:24 -04:00
zotlabs
6ecd31a715 tweak archive widget for articles 2018-08-22 13:30:16 -07:00
Max Kostikov
456bc2ef86 Update hstrings.php 2018-08-22 15:13:01 +02:00
Max Kostikov
e071cd4635 Update hmessages.po 2018-08-22 15:12:09 +02:00
Mario Vavti
cc03e1ceef Merge remote-tracking branch 'mike/master' into dev 2018-08-22 10:47:40 +02:00
Mario
e4d08fc5d7 Merge branch 'redbasic-addroomforfooter' into 'dev'
Fix jumpy sidebars

See merge request hubzilla/core!1261
2018-08-22 10:46:02 +02:00
zotlabs
b25192332b profile likes - liker image was a bit large and didn't make a very pleasant looking dropdown, may have been overlooked when other related things were changed to menu-img-1 class 2018-08-21 23:39:49 -07:00
zotlabs
0eeaf8713f add api_not_found hook 2018-08-21 23:13:54 -07:00
zotlabs
42c4a0da51 Zot/Finger: ignore deleted hublocs 2018-08-21 21:38:10 -07:00
M.Dent
79eb6d3942 Fix jumpy sidebars 2018-08-21 13:18:42 -04:00
Mario Vavti
db853134e3 Merge remote-tracking branch 'mike/master' into dev 2018-08-21 13:19:30 +02:00
Mario
218029ee57 Merge branch 'redbasic-addroomforfooter' into 'dev'
Add bottom margin on aside elements and main to allow for viewport footer.

See merge request hubzilla/core!1259
2018-08-21 13:17:14 +02:00
Mario
4295fbf6c6 Merge branch 'dev' into 'dev'
Update catalan translations for sstrings up to 18th July 2018

See merge request hubzilla/core!1260

(cherry picked from commit 0985adb770)

af31bbeb Update catalan translations for sstrings up to 18th July 2018
2018-08-21 13:14:25 +02:00
Mario
0985adb770 Merge branch 'dev' into 'dev'
Update catalan translations for sstrings up to 18th July 2018

See merge request hubzilla/core!1260
2018-08-21 13:13:48 +02:00
Mario
5d2ac10073 Merge branch 'patch-17' into 'master'
Add missed app 'Order Apps'

See merge request hubzilla/core!1258

(cherry picked from commit 85aa495741)

6086a70e Add missed app 'Order Apps'
2018-08-21 13:13:23 +02:00
Mario
85aa495741 Merge branch 'patch-17' into 'master'
Add missed app 'Order Apps'

See merge request hubzilla/core!1258
2018-08-21 13:12:41 +02:00
zotlabs
8bf1e3a944 more code optimisation 2018-08-20 22:02:08 -07:00
zotlabs
066febdf40 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-08-20 20:20:57 -07:00
zotlabs
9b620b2a35 remove checkjs reloader from mod_display also 2018-08-20 20:07:54 -07:00
zotlabs
a9bbfe9c4f Only show cover photos once per login session. After that they can get annoying. If there is pushback on this, then it should perhaps be optional. 2018-08-20 17:38:38 -07:00
zotlabs
d95735deaf channel page performance improvement: don't use "checkjs" with an associated page reload. Wrap a static copy of the content in noscript tags instead. 2018-08-20 17:22:49 -07:00
fadelkon
af31bbeba1 Update catalan translations for sstrings up to 18th July 2018 2018-08-20 22:50:46 +02:00
M.Dent
1d7d604016 Add bottom margin on aside elements and main to allow for viewport footer. 2018-08-20 00:15:34 -04:00
zotlabs
df26fec1b3 hubzilla core issue #1262 2018-08-17 21:21:02 -07:00
Max Kostikov
6086a70e06 Add missed app 'Order Apps' 2018-08-17 17:48:55 +02:00
zotlabs
e5529938ea Suppress duplicate info() messages. This was done long for notice(), but info() was overlooked at that time. 2018-08-16 12:35:57 -07:00
Mario Vavti
e25db4d1b5 Merge remote-tracking branch 'mike/master' into dev 2018-08-16 08:50:52 +02:00
zotlabs
32acb0ff01 missing files 2018-08-15 21:33:11 -07:00
zotlabs
f230c07ba5 possible fixes for can_comment_on_post(), provide wiki_list on wiki sidebar 2018-08-15 17:00:37 -07:00
Mario Vavti
2becc3273a Merge remote-tracking branch 'mike/master' into dev 2018-08-15 13:21:12 +02:00
zotlabs
f4f610f1a3 more backporting for zot6 2018-08-14 18:19:34 -07:00
Mario Vavti
10c5b46e3b Merge remote-tracking branch 'mike/master' into dev 2018-08-14 13:04:37 +02:00
Mario
b503ef8761 Merge branch 'override-helpfiles' into 'dev'
Override helpfiles

See merge request hubzilla/core!1257
2018-08-14 13:03:26 +02:00
M. Dent
94393d27c8 Override helpfiles 2018-08-14 13:03:26 +02:00
zotlabs
12f4787b67 issue with mdpost addon and archive.org links which contain a full url as a path/query component 2018-08-13 23:11:10 -07:00
zotlabs
f15c1c4e54 hubloc DB changes needed for z6 2018-08-13 21:18:20 -07:00
zotlabs
62925c4c3f oidc cleanup and discovery 2018-08-13 20:24:04 -07:00
zotlabs
4fdf5d28ca minor oauth2 updates - renamed zot webbie to 'webfinger' and zothash to 'portable_id', fixed/simplified cgi auth mode 2018-08-13 17:24:48 -07:00
Mario
b78c9a2251 Merge branch 'add-template-overrides' into 'dev'
Add template overrides

See merge request hubzilla/core!1256
2018-08-13 14:06:36 +02:00
M.Dent
b436c4a94c Add support for overriding the default template location and individual templates via .htconfig.php 2018-08-12 19:47:10 -04:00
zotlabs
db1a546aba add table support to markdown 2018-08-12 16:25:14 -07:00
M.Dent
9402f537b6 Fix root not added to internationalized template search 2018-08-12 19:02:11 -04:00
zotlabs
2d29095348 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-08-12 15:10:19 -07:00
zotlabs
ac03b4ccd7 make channel_remove less memory hungry 2018-08-12 15:09:02 -07:00
Mario Vavti
759a18685b Merge remote-tracking branch 'mike/master' into dev 2018-08-12 14:07:16 +02:00
Mario
e07ab65d73 Merge branch 'oauth2-ui-pr' into 'dev'
Oauth2 ui pr

See merge request hubzilla/core!1255
2018-08-12 14:06:24 +02:00
Mario
26f51ece90 Merge branch 'oauth2' into 'dev'
Fixes to OAuth2 connect-with-openid.  Add zothash Claim.  Add zotwebbie Claim.

See merge request hubzilla/core!1254
2018-08-12 14:03:36 +02:00
Mario
99066ae939 Merge branch 'patch-16' into 'dev'
Add translation for missed string

See merge request hubzilla/core!1253

(cherry picked from commit 5ff0f09a45)

d3362dfa Add translation for missed string
2018-08-12 13:59:49 +02:00
Mario
5ff0f09a45 Merge branch 'patch-16' into 'dev'
Add translation for missed string

See merge request hubzilla/core!1253
2018-08-12 13:59:07 +02:00
zotlabs
5afe779ffc prevent json-ld bombing, turn off browser autocomplete on channel sources creation 2018-08-11 16:16:54 -07:00
M.Dent
af042ccf07 OAuth2 UI and settings updates 2018-08-10 13:54:26 -04:00
M.Dent
e587fe5ce8 Add user_id = local_channel() to the where clause of updates 2018-08-10 13:54:07 -04:00
M.Dent
0b31c677f2 Fixes to OAuth2 connect-with-openid. Add zothash Claim. Add zotwebbie Claim. 2018-08-10 12:01:05 -04:00
Max Kostikov
d3362dfa0c Add translation for missed string 2018-08-10 16:56:22 +02:00
Mario Vavti
7890157f52 revert debug comment from the last commit 2018-08-09 23:07:50 +02:00
Mario Vavti
b3d1ea4cd5 fix zid leaking to nonzot sites if markdown is enabled 2018-08-09 17:03:20 +02:00
Mario Vavti
7c842f3170 search form action for channel search needs the channel address
(cherry picked from commit 054c5da294)
2018-08-09 15:50:49 +02:00
Mario Vavti
054c5da294 search form action for channel search needs the channel address 2018-08-09 15:47:57 +02:00
Mario Vavti
5c5a808290 Merge remote-tracking branch 'mike/master' into dev 2018-08-09 11:07:38 +02:00
Mario Vavti
5c30b2f271 update install.txt 2018-08-08 09:10:03 +02:00
Mario
ce2216f544 Merge branch 'patch-15' into 'dev'
Add XMLreader in PHP requirements

See merge request hubzilla/core!1252
2018-08-08 09:07:26 +02:00
zotlabs
1d13cc1601 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-08-06 21:32:45 -07:00
zotlabs
166879b8b0 bring some Zot6 libraries and interfaces to red/hubzilla 2018-08-06 17:43:22 -07:00
zotlabs
aeb9d5cd90 create alter_pdl hook 2018-08-05 23:19:33 -07:00
zotlabs
8e9d076216 ability for addons to create .pdl files and load them automatically 2018-08-04 13:50:49 -07:00
Max Kostikov
0d48cb959f Add XMLreader in PHP requirements 2018-08-03 19:32:51 +02:00
zotlabs
d908f53607 add app_options field 2018-08-02 22:49:30 -07:00
Mario
238551b024 Merge branch 'fixactivityorderwithfilters' into 'master'
Add GET for filtered forums

See merge request hubzilla/core!1251

(cherry picked from commit 4e6539efec)

ee1fde42 Add GET for filtered forums
2018-08-02 20:17:16 +02:00
Mario
4e6539efec Merge branch 'fixactivityorderwithfilters' into 'master'
Add GET for filtered forums

See merge request hubzilla/core!1251
2018-08-02 20:16:25 +02:00
zotlabs
c806279fa9 update certs 2018-08-01 21:32:05 -07:00
DM42.Net (Matt Dent)
ee1fde4262 Add GET for filtered forums 2018-08-01 21:14:48 -04:00
zotlabs
4d0611b7d4 hubzilla core issue #1258 2018-08-01 16:12:44 -07:00
Mario
1358303e42 Merge branch 'dev' into 'dev'
Update Spanish translation

See merge request hubzilla/core!1249

(cherry picked from commit c17f0fb44f)

edf83418 Update Spanish translation
2018-07-31 14:42:18 +02:00
Mario
c17f0fb44f Merge branch 'dev' into 'dev'
Update Spanish translation

See merge request hubzilla/core!1249
2018-07-31 14:42:01 +02:00
Mario Vavti
569cd6c57c Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-07-31 14:39:51 +02:00
zotlabs
0cfaf34a22 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-07-30 18:11:49 -07:00
zotlabs
e8aeecc4c9 When checking permissions ignore checking site "Block Public" settings in cases where site permissions aren't applicable 2018-07-30 17:41:37 -07:00
Manuel Jiménez Friaza
edf834188d Update Spanish translation 2018-07-30 12:03:03 +02:00
Mario
4e402dca7d Merge branch 'patch-13' into 'dev'
Workaround on possible error with php2po

See merge request hubzilla/core!1247
2018-07-30 10:01:19 +02:00
Mario
7f6bf7170a Merge branch 'patch-9' into 'dev'
Respect navbar translations

See merge request hubzilla/core!1243

(cherry picked from commit cbd8c07265)

05b3237b Update nav.php
2018-07-30 10:00:24 +02:00
Mario
0ed9d3c62c Merge branch 'patch-8' into 'dev'
Fix navbar missed translations

See merge request hubzilla/core!1242

(cherry picked from commit 3a6d3cb396)

0fe7004d Update Apps.php
4fd9d1ee Update Apps.php
2018-07-30 10:00:01 +02:00
gia vec
149071bf0c Update network.php
(cherry picked from commit 8db006d9a1)
2018-07-30 09:48:24 +02:00
Mario
720e691f33 Merge branch 'patch-1' into 'master'
Update network.php

See merge request hubzilla/core!1248
2018-07-30 09:47:41 +02:00
zotlabs
32614e4074 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-07-29 18:00:56 -07:00
zotlabs
9dc5a3bfc9 this may conflict 2018-07-29 17:59:40 -07:00
gia vec
8db006d9a1 Update network.php 2018-07-29 19:19:37 +02:00
Max Kostikov
cb4afd39bd Workaround on possible error 2018-07-29 16:26:33 +02:00
Max Kostikov
e078caffd8 Update php2po.php 2018-07-29 14:20:01 +02:00
Max Kostikov
90a9febb6c Workaround on possible error 2018-07-29 12:05:53 +02:00
Mario Vavti
d00761628f fix sql empty query error in db update 1216
(cherry picked from commit e4a1286aae)
2018-07-29 08:06:29 +02:00
Mario Vavti
e4a1286aae fix sql empty query error in db update 1216 2018-07-29 08:05:41 +02:00
Mario
08a8011456 Merge branch 'patch-12' into 'dev'
Process msgctxt plurals

See merge request hubzilla/core!1246
2018-07-29 07:14:09 +02:00
Mario Vavti
6c10af29ee verrsion bump 2018-07-29 07:09:46 +02:00
Mario Vavti
ae62d6fb86 wrong class name
(cherry picked from commit 5dbd11c6ed)
2018-07-29 07:05:29 +02:00
zotlabs
d2e0ecd6a3 fix unsanitised xchan_name
(cherry picked from commit 9701516228)
2018-07-29 07:05:07 +02:00
zotlabs
13386ddbd7 SECURITY: sanitise vcard fields
(cherry picked from commit 2367d94a42)
2018-07-29 07:04:38 +02:00
Mario Vavti
643b6f0aa3 version 2018-07-29 07:00:30 +02:00
Mario Vavti
45d262d6c0 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-07-29 06:59:10 +02:00
Mario Vavti
5dbd11c6ed wrong class name 2018-07-29 06:58:35 +02:00
Mario Vavti
3fcb6df0f1 Merge remote-tracking branch 'mike/master' into dev 2018-07-29 06:43:55 +02:00
zotlabs
9701516228 fix unsanitised xchan_name 2018-07-28 17:17:12 -07:00
Max Kostikov
77dfe63d90 Process msgctxt plurals 2018-07-29 02:11:27 +02:00
zotlabs
2367d94a42 SECURITY: sanitise vcard fields 2018-07-28 15:33:20 -07:00
Mario
d85c849668 Merge branch 'patch-11' into 'dev'
Plural form strings export added

See merge request hubzilla/core!1245
2018-07-28 21:23:31 +02:00
Mario
cbd8c07265 Merge branch 'patch-9' into 'dev'
Respect navbar translations

See merge request hubzilla/core!1243
2018-07-28 21:22:51 +02:00
Mario
3a6d3cb396 Merge branch 'patch-8' into 'dev'
Fix navbar missed translations

See merge request hubzilla/core!1242
2018-07-28 21:22:12 +02:00
Mario
6e52f552cf Merge branch 'patch-7' into 'dev'
Russian translation update

See merge request hubzilla/core!1241
2018-07-28 21:20:01 +02:00
Mario
973114caf6 Merge branch 'patch-6' into 'dev'
Fix duplicate transport displaying

See merge request hubzilla/core!1240
2018-07-28 21:19:40 +02:00
zotlabs
17291e04df app update and ownership issues
(cherry picked from commit e28dab17d6)
2018-07-28 21:18:28 +02:00
Max Kostikov
e27e0ca198 Plural form strings export added 2018-07-28 17:36:48 +02:00
Mario Vavti
27329e39e4 Merge remote-tracking branch 'mike/master' into dev 2018-07-28 09:33:17 +02:00
zotlabs
38c2070aab Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-07-27 15:27:52 -07:00
zotlabs
a0f28708ab don't sync system apps 2018-07-27 15:05:29 -07:00
zotlabs
e25d205a7f app delete issue with base installed apps and app photo being reloaded uneccessarily 2018-07-27 14:36:06 -07:00
zotlabs
e28dab17d6 app update and ownership issues 2018-07-27 13:59:27 -07:00
Max Kostikov
05b3237bae Update nav.php 2018-07-27 11:50:04 +02:00
Max Kostikov
4fd9d1ee5f Update Apps.php 2018-07-27 11:29:38 +02:00
Max Kostikov
0fe7004d38 Update Apps.php 2018-07-27 11:03:02 +02:00
Max Kostikov
06b0dbdfba Update hstrings.php 2018-07-26 12:21:33 +02:00
Max Kostikov
48fb3d3653 Update hmessages.po 2018-07-26 12:20:53 +02:00
Max Kostikov
baa5fd9739 Update passchanged_eml.tpl 2018-07-26 12:19:59 +02:00
Max Kostikov
e01c277c56 Update lostpass_eml.tpl 2018-07-26 12:18:54 +02:00
Mario Vavti
7062a7ce66 fix sql error
(cherry picked from commit ec3a066e4e)
2018-07-26 09:34:48 +02:00
Mario Vavti
ec3a066e4e fix sql error 2018-07-26 09:32:52 +02:00
kostikov
b0c8e75c6e Fix duplicate transport displaying 2018-07-25 22:28:21 +02:00
Mario
d39942902c Merge branch 'patch-4' into 'dev'
Update hmessages.po

See merge request hubzilla/core!1238
2018-07-23 19:57:43 +02:00
Mario
87fc4e6588 Merge branch 'patch-5' into 'dev'
Update hstrings.php

See merge request hubzilla/core!1239
2018-07-23 19:57:10 +02:00
Mario
84e57d040b Merge branch 'patch-2' into 'dev'
Escape internal quotes in translation on export

See merge request hubzilla/core!1237
2018-07-23 19:55:00 +02:00
kostikov
a4f64c02d0 Update hstrings.php 2018-07-23 12:20:50 +02:00
kostikov
278eeb5ee9 Update hmessages.po 2018-07-23 12:19:46 +02:00
kostikov
3342fc2244 Update hstrings.php 2018-07-23 12:15:10 +02:00
kostikov
87857fe5d9 Update hmessages.po 2018-07-23 12:14:33 +02:00
kostikov
64efd07f6b Escape internal quotes in translation on export 2018-07-22 19:39:53 +02:00
Mario Vavti
6be66d6df9 update changelog 2018-07-21 22:01:59 +02:00
Mario
a68934f498 Merge branch 'patch-2' into 'dev'
New russian templates

See merge request hubzilla/core!1233
2018-07-21 11:29:09 +02:00
Mario
95ef78ab23 Merge branch 'patch-1' into 'dev'
Add var to respect current hstrings.php format

See merge request hubzilla/core!1231
2018-07-21 11:27:49 +02:00
Mario
5be0743751 Merge branch 'dev' into 'dev'
Update russian translation for 3.6

See merge request hubzilla/core!1230
2018-07-21 11:26:43 +02:00
kostikov
8fc7f2aca1 Update update_fail_eml.tpl 2018-07-20 19:28:45 +02:00
kostikov
4db4ab9798 Create register_verify_member.tpl 2018-07-20 19:28:13 +02:00
kostikov
b6c2c8117e Update register_verify_eml.tpl 2018-07-20 19:27:29 +02:00
kostikov
86a42aad16 Update register_open_eml.tpl 2018-07-20 19:26:54 +02:00
kostikov
8e2e09bb16 Update passchanged_eml.tpl 2018-07-20 19:26:24 +02:00
kostikov
3713aa210f Update lostpass_eml.tpl 2018-07-20 19:25:46 +02:00
kostikov
a65c23546b Add new file 2018-07-20 19:21:58 +02:00
Mario Vavti
f6de91bf0f prevent double file uploads when dropping files into jot 2018-07-20 16:44:43 +02:00
kostikov
062633d312 Add var to respect current hstrings.php format 2018-07-20 16:40:35 +02:00
Mario Vavti
4a54699c1f Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2018-07-20 10:42:45 +02:00
Mario Vavti
c72f6e6ea8 fix jot drag and drop 2018-07-20 10:42:16 +02:00
kostikov
790a9155d4 Update hstrings.php 2018-07-20 10:25:03 +02:00
kostikov
f141b845fd Update hmessages.po 2018-07-20 10:24:23 +02:00
Mario
a274c87cb3 Merge branch 'dev' into 'dev'
Update php2po.php

See merge request hubzilla/core!1229
2018-07-20 09:21:35 +02:00
zotlabs
a94c9d2709 checkjs fix ($page not bin-hex in all cases) 2018-07-19 17:19:19 -07:00
kostikov
f9b18aa62f Update php2po.php 2018-07-20 00:22:04 +02:00
zotlabs
0866cea72c Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-07-19 13:45:30 -07:00
zotlabs
6adbb93f0a fix the filtered query string so it can potentially be re-used as is. 2018-07-19 13:42:57 -07:00
Mario Vavti
fe0e00f8f8 Merge remote-tracking branch 'mike/master' into dev 2018-07-19 09:12:33 +02:00
zotlabs
13d19d42cb Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-07-18 19:14:21 -07:00
zotlabs
ec852b0c8d typo 2018-07-18 17:51:10 -07:00
zotlabs
a05c8ff66b query filter was a bit greedy 2018-07-18 17:48:23 -07:00
zotlabs
5ce50d0a2e mangled urls on redirects 2018-07-18 17:05:38 -07:00
Mario Vavti
dfbdeafa39 Merge remote-tracking branch 'mike/master' into dev 2018-07-18 20:59:45 +02:00
Mario Vavti
eb322e8312 set the correct album name when moving photos 2018-07-18 13:18:37 +02:00
Mario Vavti
c2e819771f version 3.7 2018-07-18 11:56:26 +02:00
zotlabs
744d548380 util/typo - perform php -l and then include the file. We'll catch a bunch more stuff. 2018-07-17 05:01:22 -07:00
zotlabs
82a4bbd571 spellcheck 2018-07-15 23:32:09 -07:00
zotlabs
c187461985 update_addon_repo: scan the addon dir after updating and remove dead symlinks (which represent deprecated/removed addons). 2018-07-15 21:34:06 -07:00
zotlabs
cc91db55b7 Merge branch 'dev' of https://framagit.org/hubzilla/core into xdev_merge 2018-07-15 18:43:41 -07:00
zotlabs
d71e70bedf functions to support module and widget registration by plugins. These have identical construction to core modules and widgets and are registered just like hooks during addon load. Also additional Apps functions addon_app_installed() and system_app_installed() which will eventually replace feature_installed() for features which are converted to apps. The convention being used is that the module associated with the app calls the appropriate *_app_installed() function and if not present emits descriptive text about the app and exits. This allows one to click on an 'available' app and learn about it. Once installed, the app module behaves normally and may offer functionality or what once were addon settings on the settings/featured page. Refer to zap-addons in the zap repository for examples of how this is being used to eliminate the 'additional features' and 'addon settings' pages. 2018-07-12 16:23:32 -07:00
1288 changed files with 111767 additions and 48384 deletions

2
.gitignore vendored
View File

@@ -37,7 +37,7 @@ pageheader.html
doc/SiteTOS.md
# themes except for redbasic
view/theme/*
! view/theme/redbasic
!view/theme/redbasic
# site theme schemas
view/theme/redbasic/schema/default.php
# Doxygen API documentation, run 'doxygen util/Doxyfile' to generate it

36
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,36 @@
# Select image from https://hub.docker.com/_/php/
image: php:7.1
# Select what we should cache
cache:
paths:
- vendor/
variables:
# Configure mysql service (https://hub.docker.com/_/mysql/)
MYSQL_DATABASE: hello_world_test
MYSQL_ROOT_PASSWORD: mysql
services:
- mysql:5.7
before_script:
- apt-get update -yqq
- apt-get install -yqq git mysql-server mysql-client libmcrypt-dev libpq-dev libcurl4-gnutls-dev libicu-dev libvpx-dev libjpeg-dev libpng-dev libxpm-dev zlib1g-dev libfreetype6-dev libxml2-dev libexpat1-dev libbz2-dev libgmp3-dev libldap2-dev unixodbc-dev libsqlite3-dev libaspell-dev libsnmp-dev libpcre3-dev libtidy-dev
# Install PHP extensions
- docker-php-ext-install mbstring mcrypt pdo_mysql pdo_pgsql curl json intl gd xml zip bz2 opcache
# Install & enable Xdebug for code coverage reports
- pecl install xdebug
- docker-php-ext-enable xdebug
# Install and run Composer
- curl -sS https://getcomposer.org/installer | php
- php composer.phar install
# We test PHP7 with MySQL, but we allow it to fail
test:php: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

221
CHANGELOG
View File

@@ -1,4 +1,223 @@
Hubzilla 3.6 (????-??-??)
Hubzilla 3.8.8 (2018-12-22)
- Fix issue with linkinfo
- Fix cURL with HTTP/2
- Remove scale_external_images()
- Style highlight bbcode via css
- Make mod channel deal with b64 encoded mid's
- Fix email retrieval in OAuth2Storage
- Add reinstall option to util/addons
- Remove deprecated caching protection from mod photo
- Add missing check for observer in mod like
- Articles: default to logged in channel if channel name is not passed
- Wiki: fix preview issue with hyperlinks
- Cart: backport fixes from osada
- Gallery: provide file extensions for better compatibility
- Hsse: fix issue when linkinfo data was inserted
- Diaspora: remove deprecated scale_external_images()
Hubzilla 3.8.7 (2018-12-14)
- Fix issue with linkdropper in comment area
- Fix regression wit app ordering
- Fix return if readImnageBlob() throws an exception
- Introduce photo_view_filter hook
- Fix home notifications not expanding in certain situations
- Fix for dark schema
- Fix total identities restriction
- Fix article page title not updating if article has no title
- Gallery: the gallery app will now act as the full-size photo viewer in /photos if installed
Hubzilla 3.8.6 (2018-12-03)
- Prevent incompatible export files (osada/zap) from being imported
- Catch exception if readImageBlob() receives bogus data
- Streamline PDF previews
- Allow notification filtering by name or address
- Fix too restrictive attached photo permissions
- Update ES translation
- Use flex for the default template
- Do not store serialized pconfig value received via to Module/Pconfig.php
- Update jquery-file-upload lib and move to composer
- Update imagesloaded lib and move to composer
- Fix activitypub tag notifications
- Fix call to undefined function in PConfig
- Fix typo which prevented propagation of comments to zot6 (dev)
- Activitypub: add support for pterotype (wordpress plugin)
- Openstreetmap: check validity of lat+lon before rendering a map
Hubzilla 3.8.5 (2018-11-19)
- Fix pconfig for new installs
- Fix delayed publication of posts in combination with channel clones
- Fix issue where photo filesize was not updated in the DB when a photo was edited
- Fix issue where the original photo size was not set correct in the DB
- Fix delivery issue in zot_fetch()
- Fix typo in channel reputation addon
Hubzilla 3.8.4 (2018-11-14)
- Fix xss issue (thanks to Eduardo)
- Implement hook in enotify to be used by superblock
- Various css fixes
- Improve photo cache handling
- Provide a function hz_syslog() to log to syslog
- Fix request_target in z_post_url()
- Fix plural handling for various languages
- Some preparatory work for zot6
- Fix warning in gallery addon
- Fix date issue on xchan photo update in diaspora and pubcrawl addons
- Fix typos in startpage addon
- Improve activitypub addressing
- Fix taxonomy in activitypub direct messages
- Fix syntax error in diaspora addon
- New e-learning addon flashcards
- Remove DNS check for database connection during installation
- Implement timestamps for pconfig
Hubzilla 3.8.3 (2018-11-05)
- Do not count likes in forum notifications if likes notifications are disabled
- Fix typo in spanish translation which broke javascript
- Improve linkinfo charset handling and image detection
- Fix wrong image resize for some external images
- Move blueimp upload lib to composer and update to version 9.25
- Remove primary/clone counts from admin summary until we have a mechanism to update the fixed counts
- Fix html2markdown() and re-enable previously failing tests
- Improve look of oembed content for Hubzilla links
- Fix forum notifications count not correct
- Fix gallery addon which broke mod apps in some situations
- Fix wiki_list widget not working on every page respectively level
Hubzilla 3.8.2 (2018-10-29)
- Merge unmerged changes from dev into master
- Fix issues with forum handling in mod network and ping
- Fix delivery chain linkage messed up if original post was edited
- Fix issues with the experimental queue worker
- Fix call to image source {1} from html template
- Group stream filters by threaded and unthreaded default view
- Show only unseen forum messages when clicking on forum notification
- Improve editor contact autocomplete performance
- Convert non UTF-8 content on link embeding
- Make textcomplete return up to 100 items
- Look for for matches in the entire string when suggesting emojis
- Add [summary] bbcode to autocomplete list
- Update blueimp_upload to version 9.23
- Update spanish strings
Addons
- Cart: don't allow items to be added unless user is logged into the Grid.
- Pubcrawl: simplify asencode_activity() addressing to reflect upcoming changes in mastodon 2.6
- Rendezvous: Update rendezvous_group.tpl to fix broken Bootstrap library reference
Hubzilla 3.8.1 (2018-10-21)
- Fix issue with too long navbar banners
- Fix menu item edit link
- Fix issue with jquery file upload
Hubzilla 3.8 (2018-10-19)
- Re-implement basic build test via gitlab-ci
- Rework wiki encoding/decoding
- Implement improved worker (experimental - off by default)
- Rework hubzilla settings infrastructure
- Port the features to stand-alone apps
- Add app_destroy hook
- Improve mod network search
- Extend app_install() to allow installing by app name
- Remove tech levels
- Hide channel creation form when at or over service_class['limit_identities']
- Rename groups and group_members tables for MySQL 8 compatibility
- Improve checks for image magick and pdo at setup
- Allow a second url in apd files for settings
- Add contact autocomplete to mod photo comments
- Add hook to allow addons to filter the list returned by app_list
- Do not sync channel moved field
- Add attach_delete hook
- Catch errors in template rendering
- Provide a noscript_content switch for mod channel and display
- Install and update bootstrap via composer
- Improve cover-photo handling
- Improve notification handling on small screens
- Detect and automatically repair duplicate plugin hook scenarios
- Add dreport_process hook
- Redirect stdout/stderr on cron command
- Update composer libs and add ramsey/uuid
- Add hook to extend conv_item cog dropdown menu
- Trigger the query options off of the active module rather than passed parameters in first_post_date()
- Tweak archive widget for articles
- Add api_not_found hook
- Ignore deleted hublocs in zot finger
- Don't use "checkjs" with an associated page reload - wrap a static copy of the content in noscript tags instead
- Add possibility to override helpfiles
- Add support for overriding the default template location and individual templates via .htconfig.php
- Add table support to markdown
- Make channel_remove less memory hungry
- Prevent json-ld bombing
- Turn off browser autocomplete on channel sources creation
- Add alter_pdl hook
- Add ability for addons to create .pdl files and load them automatically
- Sanitise vcard fields
- Don't sync system apps
Bugfixes
- Fix issue with timeago plurals
- Fix issue with HTTP signatures
- Fix issues with channel import
- Fix double linebreaks in viewsrc output
- Fix jsonld signature issue (library is using sha1, spec requires sha256)
- Fix bookmarks not syncing between clones
- Fix combined view getting lost when deleting first message in pm thread
- Fix authors unable to comment on posts they authored when owned by others in certain circumstances
- Fix syschannel included in total channels count
- Fix html-to-markdown adds a backslash infront of a hash after each new line
- Fix profile likes dropdown
- Fix tags corruption when editing posts
- Fix duplicate info() messages
- Fix zid leaking to nonzot sites if markdown is enabled
- Fix app delete issue with base installed apps and app photo being reloaded uneccessarily
- Fix app update and ownership issues
Addons
- Upgrade Info: new addon to inform channel owners about system upgrades
- Superblock: fix issue with not removeable channels
- Cart: fix subscription table not created on install
- Hsse: new addon - a WYSIWYG editor for certain modules
- Rainbowtag: convert to app infrastructure
- Superblock: convert to app infrastructure
- Send ZID: convert to app infrastructure
- Adultphotoflag: move setting to mod photos
- GNU-Social: convert to app infrastructure
- Pubcrawl: convert to app infrastructure
- Startpage: convert to app infrastructure
- Wppost: convert to app infrastructure
- Diaspora: convert to app infrastructure
- Mdpost: move setting to editor settings
- Cart: convert to app infrastructure
- Cart: reflect renaming of groups table
- Authchoose: convert to app infrastructure
- Channelreputation: new addon - reputation system for community channels (forums, etc.)
- Diaspora: fix commenting on diaspora reshares
- Gallery: convert to app infrastructure
- Nsfw: convert to app infrastructure
- Diaspora: change top level retraction type from StatusMessage to Post
- Delivery Notice: new addon - display delivery status information at the top of items
- Diaspora: exclude xchan_networks rss, anon and unknown from the query to make the results more reliable
- Diaspora: provide xchan_url if we have no xchan_addr for mentions
- Diaspora: fix x-social-relay tags converted to associative array
- Twitter API: improvements for the twidere client
- Pubcrawl: partial support for inbound AP events
- Pubcrawl: add support for image objects
- Gallery: provide a way to direct link to a photo album gallery
- Pubcrawl: improve can_comment_on_post handler
- Pubcrawl: implement pleroma quirks regarding follow activities
- Cart: add ability to create catalog entries for physical and/or manually fulfilled items
- Cart: add subscriptions submodule
Hubzilla 3.6 (2018-07-25)
- Update jquery.timeago library
- Implement Hookable CSP
- ActivityStreams: accept header changes to support plume

View File

@@ -25,5 +25,8 @@ Hubzilla is completely decentralised and open source, for you modify or adapt to
The Hubzilla community consists of passionate volunteers creating an open source commons of decentralised services which are highly integrated and can rival the feature set of large centralised providers. We do our best to provide ethical software which places you in control of your online communications and privacy expectations.
Build status master branch:
[![Build Status Master](https://framagit.org/hubzilla/core/badges/master/build.svg)](https://framagit.org/hubzilla/core/badges/master/build.svg)
[![Build Status](https://travis-ci.org/redmatrix/hubzilla.svg)](https://travis-ci.org/redmatrix/hubzilla)
Build status dev branch:
[![Build Status Dev](https://framagit.org/hubzilla/core/badges/dev/build.svg)](https://framagit.org/hubzilla/core/badges/dev/build.svg)

View File

@@ -88,4 +88,4 @@ class PermissionLimits {
return false;
}
}
}

View File

@@ -60,7 +60,7 @@ class Cron {
drop_item($rr['id'],false,(($rr['item_wall']) ? DROPITEM_PHASE1 : DROPITEM_NORMAL));
if($rr['item_wall']) {
// The notifier isn't normally invoked unless item_drop is interactive.
Zotlabs\Daemon\Master::Summon( [ 'Notifier', 'drop', $rr['id'] ] );
Master::Summon( [ 'Notifier', 'drop', $rr['id'] ] );
}
}
}

View File

@@ -3,7 +3,6 @@
namespace Zotlabs\Daemon;
if(array_search( __file__ , get_included_files()) === 0) {
require_once('include/cli_startup.php');
array_shift($argv);
$argc = count($argv);
@@ -17,14 +16,135 @@ if(array_search( __file__ , get_included_files()) === 0) {
class Master {
static public $queueworker = null;
static public function Summon($arr) {
proc_run('php','Zotlabs/Daemon/Master.php',$arr);
}
static public function Release($argc,$argv) {
cli_startup();
logger('Master: release: ' . print_r($argv,true), LOGGER_ALL,LOG_DEBUG);
$cls = '\\Zotlabs\\Daemon\\' . $argv[0];
$cls::run($argc,$argv);
$maxworkers = get_config('system','max_queue_workers');
if (!$maxworkers || $maxworkers == 0) {
logger('Master: release: ' . print_r($argv,true), LOGGER_ALL,LOG_DEBUG);
$cls = '\\Zotlabs\\Daemon\\' . $argv[0];
$cls::run($argc,$argv);
self::ClearQueue();
} else {
logger('Master: enqueue: ' . print_r($argv,true), LOGGER_ALL,LOG_DEBUG);
$workinfo = ['argc'=>$argc,'argv'=>$argv];
q("insert into config (cat,k,v) values ('queuework','%s','%s')",
dbesc(uniqid('workitem:',true)),
dbesc(serialize($workinfo)));
self::Process();
}
}
static public function GetWorkerID() {
$maxworkers = get_config('system','max_queue_workers');
$maxworkers = ($maxworkers) ? $maxworkers : 3;
$workermaxage = get_config('system','max_queue_worker_age');
$workermaxage = ($workermaxage) ? $workermaxage : 300;
$workers = q("select * from config where cat='queueworkers' and k like '%s'", 'workerstarted_%');
if (count($workers) > $maxworkers) {
foreach ($workers as $idx => $worker) {
$curtime = time();
$age = (intval($curtime) - intval($worker['v']));
if ( $age > $workermaxage) {
logger("Prune worker: ".$worker['k'], LOGGER_ALL, LOGGER_DEBUG);
$k = explode('_',$worker['k']);
q("delete from config where cat='queueworkers' and k='%s'",
'workerstarted_'.$k[1]);
q("update config set k='%s' where cat='queuework' and k='%s'",
dbesc(uniqid('workitem:',true)),
'workitem_'.$k[1]);
unset($workers[$idx]);
}
}
if (count($workers) > $maxworkers) {
return false;
}
}
return uniqid('',true);
}
static public function Process() {
self::$queueworker = self::GetWorkerID();
if (!self::$queueworker) {
logger('Master: unable to obtain worker ID.');
killme();
}
set_config('queueworkers','workerstarted_'.self::$queueworker,time());
$workersleep = get_config('system','queue_worker_sleep');
$workersleep = ($workersleep) ? $workersleep : 5;
cli_startup();
$work = q("update config set k='%s' where cat='queuework' and k like '%s' limit 1",
'workitem_'.self::$queueworker,
dbesc('workitem:%'));
$jobs = 0;
while ($work) {
$workitem = q("select * from config where cat='queuework' and k='%s'",
'workitem_'.self::$queueworker);
if (isset($workitem[0])) {
$jobs++;
$workinfo = unserialize($workitem[0]['v']);
$argc = $workinfo['argc'];
$argv = $workinfo['argv'];
logger('Master: process: ' . print_r($argv,true), LOGGER_ALL,LOG_DEBUG);
//Delete unclaimed duplicate workitems.
q("delete from config where cat='queuework' and k='workitem' and v='%s'",
serialize($argv));
$cls = '\\Zotlabs\\Daemon\\' . $argv[0];
$cls::run($argc,$argv);
//Right now we assume that if we get a return, everything is OK.
//At some point we may want to test whether the run returns true/false
// and requeue the work to be tried again. But we probably want
// to implement some sort of "retry interval" first.
q("delete from config where cat='queuework' and k='%s'",
'workitem_'.self::$queueworker);
} else {
break;
}
sleep ($workersleep);
$work = q("update config set k='%s' where cat='queuework' and k like '%s' limit 1",
'workitem_'.self::$queueworker,
dbesc('workitem:%'));
}
logger('Master: Worker Thread: queue items processed:' . $jobs);
q("delete from config where cat='queueworkers' and k='%s'",
'workerstarted_'.self::$queueworker);
}
static public function ClearQueue() {
$work = q("select * from config where cat='queuework' and k like '%s'",
dbesc('workitem%'));
foreach ($work as $workitem) {
$workinfo = unserialize($workitem['v']);
$argc = $workinfo['argc'];
$argv = $workinfo['argv'];
logger('Master: process: ' . print_r($argv,true), LOGGER_ALL,LOG_DEBUG);
$cls = '\\Zotlabs\\Daemon\\' . $argv[0];
$cls::run($argc,$argv);
}
$work = q("delete from config where cat='queuework' and k like '%s'",
dbesc('workitem%'));
}
}

View File

@@ -559,6 +559,8 @@ class Notifier {
foreach($dhubs as $hub) {
logger('notifier_hub: ' . $hub['hubloc_url'],LOGGER_DEBUG);
if($hub['hubloc_network'] !== 'zot') {
$narr = [
'channel' => $channel,

48
Zotlabs/Extend/Route.php Normal file
View File

@@ -0,0 +1,48 @@
<?php
namespace Zotlabs\Extend;
class Route {
static function register($file,$modname) {
$rt = self::get();
$rt[] = [ $file, $modname ];
self::set($rt);
}
static function unregister($file,$modname) {
$rt = self::get();
if($rt) {
$n = [];
foreach($rt as $r) {
if($r[0] !== $file && $r[1] !== $modname) {
$n[] = $r;
}
}
self::set($n);
}
}
static function unregister_by_file($file) {
$rt = self::get();
if($rt) {
$n = [];
foreach($rt as $r) {
if($r[0] !== $file) {
$n[] = $r;
}
}
self::set($n);
}
}
static function get() {
return get_config('system','routes',[]);
}
static function set($r) {
return set_config('system','routes',$r);
}
}

47
Zotlabs/Extend/Widget.php Normal file
View File

@@ -0,0 +1,47 @@
<?php
namespace Zotlabs\Extend;
class Widget {
static function register($file,$widget) {
$rt = self::get();
$rt[] = [ $file, $widget ];
self::set($rt);
}
static function unregister($file,$widget) {
$rt = self::get();
if($rt) {
$n = [];
foreach($rt as $r) {
if($r[0] !== $file && $r[1] !== $widget) {
$n[] = $r;
}
}
self::set($n);
}
}
static function unregister_by_file($file) {
$rt = self::get();
if($rt) {
$n = [];
foreach($rt as $r) {
if($r[0] !== $file) {
$n[] = $r;
}
}
self::set($n);
}
}
static function get() {
return get_config('system','widgets',[]);
}
static function set($r) {
return set_config('system','widgets',$r);
}
}

View File

@@ -4,7 +4,7 @@ namespace Zotlabs\Identity;
class OAuth2Server extends \OAuth2\Server {
public function __construct(OAuth2Storage $storage, $config = []) {
public function __construct(OAuth2Storage $storage, $config = null) {
if(! is_array($config)) {
$config = [
@@ -19,7 +19,8 @@ class OAuth2Server extends \OAuth2\Server {
$this->addGrantType(new \OAuth2\GrantType\ClientCredentials($storage));
// Add the "Authorization Code" grant type (this is where the oauth magic happens)
$this->addGrantType(new \OAuth2\GrantType\AuthorizationCode($storage));
// Need to use OpenID\GrantType to return id_token (see:https://github.com/bshaffer/oauth2-server-php/issues/443)
$this->addGrantType(new \OAuth2\OpenID\GrantType\AuthorizationCode($storage));
$keyStorage = new \OAuth2\Storage\Memory( [
'keys' => [

View File

@@ -50,20 +50,78 @@ class OAuth2Storage extends \OAuth2\Storage\Pdo {
public function getUser($username)
{
$x = channelx_by_nick($username);
$x = channelx_by_n($username);
if(! $x) {
return false;
}
$a = q("select * from account where account_id = %d",
intval($x['channel_account_id'])
);
$n = explode(' ', $x['channel_name']);
return( [
'username' => $x['channel_address'],
'user_id' => $x['channel_id'],
'firstName' => $x['channel_name'],
'lastName' => '',
'password' => 'NotARealPassword'
'webfinger' => channel_reddress($x),
'portable_id' => $x['channel_hash'],
'email' => $a[0]['account_email'],
'username' => $x['channel_address'],
'user_id' => $x['channel_id'],
'name' => $x['channel_name'],
'firstName' => ((count($n) > 1) ? $n[1] : $n[0]),
'lastName' => ((count($n) > 2) ? $n[count($n) - 1] : ''),
'picture' => $x['xchan_photo_l']
] );
}
public function scopeExists($scope) {
// Report that the scope is valid even if it's not.
// We will only return a very small subset no matter what.
// @TODO: Truly validate the scope
// see vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php and
// vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php
// for more info.
return true;
}
public function getDefaultScope($client_id=null) {
// Do not REQUIRE a scope
// see vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php and
// for more info.
return null;
}
public function getUserClaims ($user_id, $claims) {
// Populate the CLAIMS requested (if any).
// @TODO: create a more reasonable/comprehensive list.
// @TODO: present claims on the AUTHORIZATION screen
$userClaims = Array();
$claims = explode (' ', trim($claims));
$validclaims = Array ("name","preferred_username","webfinger","portable_id","email","picture","firstName","lastName");
$claimsmap = Array (
"webfinger" => 'webfinger',
"portable_id" => 'portable_id',
"name" => 'name',
"email" => 'email',
"preferred_username" => 'username',
"picture" => 'picture',
"given_name" => 'firstName',
"family_name" => 'lastName'
);
$userinfo = $this->getUser($user_id);
foreach ($validclaims as $validclaim) {
if (in_array($validclaim,$claims)) {
$claimkey = $claimsmap[$validclaim];
$userClaims[$validclaim] = $userinfo[$claimkey];
} else {
$userClaims[$validclaim] = $validclaim;
}
}
$userClaims["sub"]=$user_id;
return $userClaims;
}
/**
* plaintext passwords are bad! Override this for your application
*
@@ -78,4 +136,4 @@ class OAuth2Storage extends \OAuth2\Storage\Pdo {
return true;
}
}
}

1725
Zotlabs/Lib/Activity.php Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -56,15 +56,10 @@ class Apps {
}
static public function import_system_apps() {
if(! local_channel())
return;
self::$base_apps = get_config('system','base_apps',[
static public function get_base_apps() {
return get_config('system','base_apps',[
'Connections',
'Suggest Channels',
'Grid',
'Network',
'Settings',
'Files',
'Channel Home',
@@ -77,7 +72,14 @@ class Apps {
'Mail',
'Profile Photo'
]);
}
static public function import_system_apps() {
if(! local_channel())
return;
self::$base_apps = self::get_base_apps();
$apps = self::get_system_apps(false);
self::$available_apps = q("select * from app where app_channel = 0");
@@ -140,10 +142,15 @@ class Apps {
foreach(self::$available_apps as $iapp) {
if($iapp['app_id'] == hash('whirlpool',$app['name'])) {
$notfound = false;
if(($iapp['app_version'] != $app['version'])
if(($iapp['app_version'] !== $app['version'])
|| ($app['plugin'] && (! $iapp['app_plugin']))) {
return intval($iapp['app_id']);
}
if(($iapp['app_url'] !== $app['url'])
|| ($iapp['app_photo'] !== $app['photo'])) {
return intval($iapp['app_id']);
}
}
}
@@ -198,12 +205,11 @@ class Apps {
if($lines) {
foreach($lines as $x) {
if(preg_match('/^([a-zA-Z].*?):(.*?)$/ism',$x,$matches)) {
$ret[$matches[1]] = trim(str_replace(array('$baseurl','$nick'),array($baseurl,$address),$matches[2]));
$ret[$matches[1]] = trim($matches[2]);
}
}
}
if(! $ret['photo'])
$ret['photo'] = $baseurl . '/' . get_default_profile_photo(80);
@@ -262,6 +268,10 @@ class Apps {
if(! can_view_public_stream())
unset($ret);
break;
case 'custom_role':
if(get_pconfig(local_channel(),'system','permissions_role') !== 'custom')
unset($ret);
break;
case 'observer':
if(! $observer)
unset($ret);
@@ -293,14 +303,14 @@ class Apps {
'Cards' => t('Cards'),
'Admin' => t('Site Admin'),
'Report Bug' => t('Report Bug'),
'View Bookmarks' => t('View Bookmarks'),
'My Chatrooms' => t('My Chatrooms'),
'Bookmarks' => t('Bookmarks'),
'Chatrooms' => t('Chatrooms'),
'Connections' => t('Connections'),
'Remote Diagnostics' => t('Remote Diagnostics'),
'Suggest Channels' => t('Suggest Channels'),
'Login' => t('Login'),
'Channel Manager' => t('Channel Manager'),
'Grid' => t('Activity'),
'Network' => t('Stream'),
'Settings' => t('Settings'),
'Files' => t('Files'),
'Webpages' => t('Webpages'),
@@ -323,7 +333,25 @@ class Apps {
'Features' => t('Features'),
'Language' => t('Language'),
'Post' => t('Post'),
'Profile Photo' => t('Profile Photo')
'Profile Photo' => t('Profile Photo'),
'Profile' => t('Profile'),
'Profiles' => t('Profiles'),
'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'),
'Notes' => t('Notes'),
'OAuth Apps Manager' => t('OAuth Apps Manager'),
'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')
);
if(array_key_exists('name',$arr)) {
@@ -335,6 +363,9 @@ class Apps {
for($x = 0; $x < count($arr); $x++) {
if(array_key_exists($arr[$x]['name'],$apps)) {
$arr[$x]['name'] = $apps[$arr[$x]['name']];
} else {
// Try to guess by app name if not in list
$arr[$x]['name'] = t(trim($arr[$x]['name']));
}
}
}
@@ -372,9 +403,29 @@ class Apps {
$papp['papp'] = self::papp_encode($papp);
if(! strstr($papp['url'],'://'))
// This will catch somebody clicking on a system "available" app that hasn't had the path macros replaced
// and they are allowed to see the app
if(strpos($papp['url'],'$baseurl') !== false || strpos($papp['url'],'$nick') !== false || strpos($papp['photo'],'$baseurl') !== false || strpos($papp['photo'],'$nick') !== false) {
$view_channel = local_channel();
if(! $view_channel) {
$sys = get_sys_channel();
$view_channel = $sys['channel_id'];
}
self::app_macros($view_channel,$papp);
}
if(strpos($papp['url'], ',')) {
$urls = explode(',', $papp['url']);
$papp['url'] = trim($urls[0]);
$papp['settings_url'] = trim($urls[1]);
}
if(! strpos($papp['url'],'://'))
$papp['url'] = z_root() . ((strpos($papp['url'],'/') === 0) ? '' : '/') . $papp['url'];
foreach($papp as $k => $v) {
if(strpos($v,'http') === 0 && $k != 'papp') {
if(! (local_channel() && strpos($v,z_root()) === 0)) {
@@ -418,6 +469,10 @@ class Apps {
if(! can_view_public_stream())
return '';
break;
case 'custom_role':
if(get_pconfig(local_channel(),'system','permissions_role') != 'custom')
return '';
break;
case 'observer':
$observer = \App::get_observer();
if(! $observer)
@@ -439,7 +494,9 @@ class Apps {
$hosturl = '';
if(local_channel()) {
$installed = self::app_installed(local_channel(),$papp);
if(self::app_installed(local_channel(),$papp) && !$papp['deleted'])
$installed = true;
$hosturl = z_root() . '/';
}
elseif(remote_channel()) {
@@ -466,18 +523,21 @@ class Apps {
if($mode === 'install') {
$papp['embed'] = true;
}
return replace_macros(get_markup_template('app.tpl'),array(
'$app' => $papp,
'$icon' => $icon,
'$hosturl' => $hosturl,
'$purchase' => (($papp['page'] && (! $installed)) ? t('Purchase') : ''),
'$install' => (($hosturl && in_array($mode, ['view','install'])) ? $install_action : ''),
'$installed' => $installed,
'$action_label' => (($hosturl && in_array($mode, ['view','install'])) ? $install_action : ''),
'$edit' => ((local_channel() && $installed && $mode == 'edit') ? t('Edit') : ''),
'$delete' => ((local_channel() && $installed && $mode == 'edit') ? t('Delete') : ''),
'$undelete' => ((local_channel() && $installed && $mode == 'edit') ? t('Undelete') : ''),
'$delete' => ((local_channel() && $mode == 'edit') ? t('Delete') : ''),
'$undelete' => ((local_channel() && $mode == 'edit') ? t('Undelete') : ''),
'$settings_url' => ((local_channel() && $installed && $mode == 'list') ? $papp['settings_url'] : ''),
'$deleted' => $papp['deleted'],
'$feature' => (($papp['embed']) ? false : true),
'$pin' => (($papp['embed']) ? false : true),
'$feature' => (($papp['embed'] || $mode == 'edit') ? false : true),
'$pin' => (($papp['embed'] || $mode == 'edit') ? false : true),
'$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),
@@ -485,14 +545,26 @@ class Apps {
'$add' => t('Add to app-tray'),
'$remove' => t('Remove from app-tray'),
'$add_nav' => t('Pin to navbar'),
'$remove_nav' => t('Unpin from navbar')
'$remove_nav' => t('Unpin from navbar'),
'$rpath' => z_root() . '/apps'
));
}
static public function app_install($uid,$app) {
if(! is_array($app)) {
$r = q("select * from app where app_name = '%s' and app_channel = 0",
dbesc($app)
);
if(! $r)
return false;
$app = self::app_encode($r[0]);
}
$app['uid'] = $uid;
if(self::app_installed($uid,$app))
if(self::app_installed($uid,$app,true))
$x = self::app_update($app);
else
$x = self::app_store($app);
@@ -503,7 +575,7 @@ class Apps {
intval($uid)
);
if($r) {
if(! $r[0]['app_system']) {
if(($app['uid']) && (! $r[0]['app_system'])) {
if($app['categories'] && (! $app['term'])) {
$r[0]['term'] = q("select * from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
@@ -518,8 +590,25 @@ class Apps {
return false;
}
static public function app_destroy($uid,$app) {
static public function can_delete($uid,$app) {
if(! $uid) {
return false;
}
$base_apps = self::get_base_apps();
if($base_apps) {
foreach($base_apps as $b) {
if($app['guid'] === hash('whirlpool',$b)) {
return false;
}
}
}
return true;
}
static public function app_destroy($uid,$app) {
if($uid && $app['guid']) {
@@ -530,23 +619,33 @@ class Apps {
if($x) {
if(! intval($x[0]['app_deleted'])) {
$x[0]['app_deleted'] = 1;
q("delete from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($x[0]['id'])
);
$r = q("delete from app where app_id = '%s' and app_channel = %d",
dbesc($app['guid']),
intval($uid)
);
// we don't sync system apps - they may be completely different on the other system
build_sync_packet($uid,array('app' => $x));
if(self::can_delete($uid,$app)) {
$r = q("delete from app where app_id = '%s' and app_channel = %d",
dbesc($app['guid']),
intval($uid)
);
q("delete from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($x[0]['id'])
);
call_hooks('app_destroy', $x[0]);
}
else {
$r = q("update app set app_deleted = 1 where app_id = '%s' and app_channel = %d",
dbesc($app['guid']),
intval($uid)
);
}
if(! intval($x[0]['app_system'])) {
build_sync_packet($uid,array('app' => $x));
}
}
else {
self::app_undestroy($uid,$app);
}
}
}
}
static public function app_undestroy($uid,$app) {
@@ -594,17 +693,66 @@ class Apps {
}
}
static public function app_installed($uid,$app) {
static public function app_installed($uid,$app,$bypass_filter=false) {
$r = q("select id from app where app_id = '%s' and app_channel = %d limit 1",
dbesc((array_key_exists('guid',$app)) ? $app['guid'] : ''),
intval($uid)
);
if (!$bypass_filter) {
$filter_arr = [
'uid'=>$uid,
'app'=>$app,
'installed'=>$r
];
call_hooks('app_installed_filter',$filter_arr);
$r = $filter_arr['installed'];
}
return(($r) ? true : false);
}
static public function addon_app_installed($uid,$app,$bypass_filter=false) {
$r = q("select id from app where app_plugin = '%s' and app_channel = %d limit 1",
dbesc($app),
intval($uid)
);
if (!$bypass_filter) {
$filter_arr = [
'uid'=>$uid,
'app'=>$app,
'installed'=>$r
];
call_hooks('addon_app_installed_filter',$filter_arr);
$r = $filter_arr['installed'];
}
return(($r) ? true : false);
}
static public function system_app_installed($uid,$app,$bypass_filter=false) {
$r = q("select id from app where app_id = '%s' and app_channel = %d limit 1",
dbesc(hash('whirlpool',$app)),
intval($uid)
);
if (!$bypass_filter) {
$filter_arr = [
'uid'=>$uid,
'app'=>$app,
'installed'=>$r
];
call_hooks('system_app_installed_filter',$filter_arr);
$r = $filter_arr['installed'];
}
return(($r) ? true : false);
}
static public function app_list($uid, $deleted = false, $cats = []) {
if($deleted)
$sql_extra = "";
@@ -644,6 +792,9 @@ class Apps {
);
if($r) {
$hookinfo = Array('uid'=>$uid,'deleted'=>$deleted,'cats'=>$cats,'apps'=>$r);
call_hooks('app_list',$hookinfo);
$r = $hookinfo['apps'];
for($x = 0; $x < count($r); $x ++) {
if(! $r[$x]['app_system'])
$r[$x]['type'] = 'personal';
@@ -657,12 +808,14 @@ class Apps {
return($r);
}
static public function app_order($uid,$apps) {
static public function app_order($uid,$apps,$menu) {
if(! $apps)
return $apps;
$x = (($uid) ? get_pconfig($uid,'system','app_order') : get_config('system','app_order'));
$conf = (($menu === 'nav_featured_app') ? 'app_order' : 'app_pin_order');
$x = (($uid) ? get_pconfig($uid,'system',$conf) : get_config('system',$conf));
if(($x) && (! is_array($x))) {
$y = explode(',',$x);
$y = array_map('trim',$y);
@@ -699,19 +852,25 @@ class Apps {
return false;
}
static function moveup($uid,$guid) {
static function moveup($uid,$guid,$menu) {
$syslist = array();
$list = self::app_list($uid, false, ['nav_featured_app', 'nav_pinned_app']);
$conf = (($menu === 'nav_featured_app') ? 'app_order' : 'app_pin_order');
$list = self::app_list($uid, false, [ $menu ]);
if($list) {
foreach($list as $li) {
$syslist[] = self::app_encode($li);
$papp = self::app_encode($li);
if($menu !== 'nav_pinned_app' && strpos($papp['categories'],'nav_pinned_app') !== false)
continue;
$syslist[] = $papp;
}
}
self::translate_system_apps($syslist);
usort($syslist,'self::app_name_compare');
$syslist = self::app_order($uid,$syslist);
$syslist = self::app_order($uid,$syslist,$menu);
if(! $syslist)
return;
@@ -736,23 +895,29 @@ class Apps {
$narr[] = $x['name'];
}
set_pconfig($uid,'system','app_order',implode(',',$narr));
set_pconfig($uid,'system',$conf,implode(',',$narr));
}
static function movedown($uid,$guid) {
static function movedown($uid,$guid,$menu) {
$syslist = array();
$list = self::app_list($uid, false, ['nav_featured_app', 'nav_pinned_app']);
$conf = (($menu === 'nav_featured_app') ? 'app_order' : 'app_pin_order');
$list = self::app_list($uid, false, [ $menu ]);
if($list) {
foreach($list as $li) {
$syslist[] = self::app_encode($li);
$papp = self::app_encode($li);
if($menu !== 'nav_pinned_app' && strpos($papp['categories'],'nav_pinned_app') !== false)
continue;
$syslist[] = $papp;
}
}
self::translate_system_apps($syslist);
usort($syslist,'self::app_name_compare');
$syslist = self::app_order($uid,$syslist);
$syslist = self::app_order($uid,$syslist,$menu);
if(! $syslist)
return;
@@ -777,7 +942,7 @@ class Apps {
$narr[] = $x['name'];
}
set_pconfig($uid,'system','app_order',implode(',',$narr));
set_pconfig($uid,'system',$conf,implode(',',$narr));
}
@@ -787,6 +952,29 @@ class Apps {
}
static public function app_macros($uid,&$arr) {
if(! intval($uid))
return;
$baseurl = z_root();
$channel = channelx_by_n($uid);
$address = (($channel) ? $channel['channel_address'] : '');
//future expansion
$observer = \App::get_observer();
$arr['url'] = str_replace(array('$baseurl','$nick'),array($baseurl,$address),$arr['url']);
$arr['photo'] = str_replace(array('$baseurl','$nick'),array($baseurl,$address),$arr['photo']);
}
static public function app_store($arr) {
//logger('app_store: ' . print_r($arr,true));
@@ -796,6 +984,7 @@ class Apps {
$sys = get_sys_channel();
self::app_macros($arr['uid'],$arr);
$darray['app_url'] = ((x($arr,'url')) ? $arr['url'] : '');
$darray['app_channel'] = ((x($arr,'uid')) ? $arr['uid'] : 0);
@@ -807,8 +996,8 @@ class Apps {
$arr['author'] = $sys['channel_hash'];
}
if($arr['photo'] && (strpos($arr['photo'],'icon:') !== 0) && (! strstr($arr['photo'],z_root()))) {
$x = import_xchan_photo($arr['photo'],get_observer_hash(),true);
if($arr['photo'] && (strpos($arr['photo'],'icon:') === false) && (strpos($arr['photo'],z_root()) !== false)) {
$x = import_xchan_photo(str_replace('$baseurl',z_root(),$arr['photo']),get_observer_hash(),true);
$arr['photo'] = $x[1];
}
@@ -827,10 +1016,11 @@ class Apps {
$darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : '');
$darray['app_system'] = ((x($arr,'system')) ? intval($arr['system']) : 0);
$darray['app_deleted'] = ((x($arr,'deleted')) ? intval($arr['deleted']) : 0);
$darray['app_options'] = ((x($arr,'options')) ? intval($arr['options']) : 0);
$created = datetime_convert();
$r = q("insert into app ( app_id, app_sig, app_author, app_name, app_desc, app_url, app_photo, app_version, app_channel, app_addr, app_price, app_page, app_requires, app_created, app_edited, app_system, app_plugin, app_deleted ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', %d )",
$r = q("insert into app ( app_id, app_sig, app_author, app_name, app_desc, app_url, app_photo, app_version, app_channel, app_addr, app_price, app_page, app_requires, app_created, app_edited, app_system, app_plugin, app_deleted, app_options ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', %d, %d )",
dbesc($darray['app_id']),
dbesc($darray['app_sig']),
dbesc($darray['app_author']),
@@ -848,7 +1038,8 @@ class Apps {
dbesc($created),
intval($darray['app_system']),
dbesc($darray['app_plugin']),
intval($darray['app_deleted'])
intval($darray['app_deleted']),
intval($darray['app_options'])
);
if($r) {
@@ -881,15 +1072,18 @@ class Apps {
$darray = array();
$ret = array('success' => false);
self::app_macros($arr['uid'],$arr);
$darray['app_url'] = ((x($arr,'url')) ? $arr['url'] : '');
$darray['app_channel'] = ((x($arr,'uid')) ? $arr['uid'] : 0);
$darray['app_id'] = ((x($arr,'guid')) ? $arr['guid'] : 0);
if((! $darray['app_url']) || (! $darray['app_channel']) || (! $darray['app_id']))
if((! $darray['app_url']) || (! $darray['app_id']))
return $ret;
if($arr['photo'] && (strpos($arr['photo'],'icon:') !== 0) && (! strstr($arr['photo'],z_root()))) {
$x = import_xchan_photo($arr['photo'],get_observer_hash(),true);
if($arr['photo'] && (strpos($arr['photo'],'icon:') === false) && (strpos($arr['photo'],z_root()) !== false)) {
$x = import_xchan_photo(str_replace('$baseurl',z_root(),$arr['photo']),get_observer_hash(),true);
$arr['photo'] = $x[1];
}
@@ -906,10 +1100,11 @@ class Apps {
$darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : '');
$darray['app_system'] = ((x($arr,'system')) ? intval($arr['system']) : 0);
$darray['app_deleted'] = ((x($arr,'deleted')) ? intval($arr['deleted']) : 0);
$darray['app_options'] = ((x($arr,'options')) ? intval($arr['options']) : 0);
$edited = datetime_convert();
$r = q("update app set app_sig = '%s', app_author = '%s', app_name = '%s', app_desc = '%s', app_url = '%s', app_photo = '%s', app_version = '%s', app_addr = '%s', app_price = '%s', app_page = '%s', app_requires = '%s', app_edited = '%s', app_system = %d, app_plugin = '%s', app_deleted = %d where app_id = '%s' and app_channel = %d",
$r = q("update app set app_sig = '%s', app_author = '%s', app_name = '%s', app_desc = '%s', app_url = '%s', app_photo = '%s', app_version = '%s', app_addr = '%s', app_price = '%s', app_page = '%s', app_requires = '%s', app_edited = '%s', app_system = %d, app_plugin = '%s', app_deleted = %d, app_options = %d where app_id = '%s' and app_channel = %d",
dbesc($darray['app_sig']),
dbesc($darray['app_author']),
dbesc($darray['app_name']),
@@ -925,6 +1120,7 @@ class Apps {
intval($darray['app_system']),
dbesc($darray['app_plugin']),
intval($darray['app_deleted']),
intval($darray['app_options']),
dbesc($darray['app_id']),
intval($darray['app_channel'])
);
@@ -972,9 +1168,6 @@ class Apps {
$ret['type'] = 'personal';
if($app['app_id'])
$ret['guid'] = $app['app_id'];
if($app['app_id'])
$ret['guid'] = $app['app_id'];
@@ -1017,6 +1210,9 @@ class Apps {
if($app['app_system'])
$ret['system'] = $app['app_system'];
if($app['app_options'])
$ret['options'] = $app['app_options'];
if($app['app_plugin'])
$ret['plugin'] = trim($app['app_plugin']);

View File

@@ -825,9 +825,10 @@ class Enotify {
// convert this logic into a json array just like the system notifications
return array(
$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']),
@@ -835,9 +836,19 @@ class Enotify {
'b64mid' => ((in_array($item['verb'], [ACTIVITY_LIKE, ACTIVITY_DISLIKE])) ? 'b64.' . base64url_encode($item['thr_parent']) : 'b64.' . base64url_encode($item['mid'])),
'notify_id' => 'undefined',
'thread_top' => (($item['item_thread_top']) ? true : false),
'message' => strip_tags(bbcode($itemem_text))
'message' => strip_tags(bbcode($itemem_text)),
// these are for the superblock addon
'hash' => $item['author']['xchan_hash'],
'uid' => local_channel(),
'display' => true
);
call_hooks('enotify_format',$x);
if(! $x['display']) {
return [];
}
return $x;
}
}

405
Zotlabs/Lib/Group.php Normal file
View File

@@ -0,0 +1,405 @@
<?php
namespace Zotlabs\Lib;
use Zotlabs\Lib\Libsync;
class Group {
static function add($uid,$name,$public = 0) {
$ret = false;
if(x($uid) && x($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 group which we once deleted
// all the old members are gone, but the group remains so we don't break any security
// access lists. What we're doing here is reviving the dead group, but old content which
// was restricted to this group may now be seen by the new group 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 group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name.') . EOL);
}
return true;
}
do {
$dups = false;
$hash = random_string(32) . str_replace(['<','>'],['.','.'], $name);
$r = q("SELECT id FROM pgrp WHERE hash = '%s' LIMIT 1", dbesc($hash));
if($r)
$dups = true;
} while($dups == true);
$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(x($uid) && x($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'];
}
if(! $group_id)
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 = $r[0];
$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;
}
static function byname($uid,$name) {
if((! $uid) || (! strlen($name)))
return false;
$r = q("SELECT * FROM pgrp WHERE uid = %d AND gname = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
if($r)
return $r[0]['id'];
return false;
}
static function rec_byhash($uid,$hash) {
if((! $uid) || (! strlen($hash)))
return false;
$r = q("SELECT * FROM pgrp WHERE uid = %d AND hash = '%s' LIMIT 1",
intval($uid),
dbesc($hash)
);
if($r)
return $r[0];
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
if(! $r)
$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($gid) {
$ret = array();
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(local_channel()),
intval(local_channel())
);
if($r)
$ret = $r;
}
return $ret;
}
static function members_xchan($gid) {
$ret = [];
if(intval($gid)) {
$r = q("SELECT xchan FROM pgrp_member WHERE gid = %d AND uid = %d",
intval($gid),
intval(local_channel())
);
if($r) {
foreach($r as $rr) {
$ret[] = $rr['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 $rr) {
$ret[] = $rr['xchan'];
}
}
}
return $ret;
}
static function select($uid,$group = '') {
$grps = [];
$o = '';
$r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval($uid)
);
$grps[] = array('name' => '', 'hash' => '0', 'selected' => '');
if($r) {
foreach($r as $rr) {
$grps[] = array('name' => $rr['gname'], 'id' => $rr['hash'], 'selected' => (($group == $rr['hash']) ? 'true' : ''));
}
}
logger('select: ' . print_r($grps,true), LOGGER_DATA);
$o = replace_macros(get_markup_template('group_selection.tpl'), array(
'$label' => t('Add new connections to this privacy group'),
'$groups' => $grps
));
return $o;
}
static function widget($every="connections",$each="group",$edit = false, $group_id = 0, $cid = '',$mode = 1) {
$o = '';
if(! (local_channel() && feature_enabled(local_channel(),'groups'))) {
return '';
}
$groups = array();
$r = q("SELECT * FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval($_SESSION['uid'])
);
$member_of = array();
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' => "group/".$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),
];
}
}
$tpl = get_markup_template("group_side.tpl");
$o = replace_macros($tpl, array(
'$title' => t('Privacy Groups'),
'$edittext' => t('Edit group'),
'$createtext' => t('Add privacy group'),
'$ungrouped' => (($every === 'contacts') ? t('Channels not in any privacy group') : ''),
'$groups' => $groups,
'$add' => t('add'),
));
return $o;
}
static function expand($g) {
if(! (is_array($g) && count($g)))
return array();
$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 $rr) {
$ret[] = $rr['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 = array();
if($r) {
foreach($r as $rr)
$ret[] = $rr['gid'];
}
return $ret;
}
}

1019
Zotlabs/Lib/Libsync.php Normal file

File diff suppressed because it is too large Load Diff

3014
Zotlabs/Lib/Libzot.php Normal file

File diff suppressed because it is too large Load Diff

654
Zotlabs/Lib/Libzotdir.php Normal file
View File

@@ -0,0 +1,654 @@
<?php
namespace Zotlabs\Lib;
use Zotlabs\Lib\Libzot;
require_once('include/permissions.php');
class Libzotdir {
/**
* @brief
*
* @param int $dirmode
* @return array
*/
static function find_upstream_directory($dirmode) {
global $DIRECTORY_FALLBACK_SERVERS;
$preferred = get_config('system','directory_server');
// Thwart attempts to use a private directory
if(($preferred) && ($preferred != z_root())) {
$r = q("select * from site where site_url = '%s' limit 1",
dbesc($preferred)
);
if(($r) && ($r[0]['site_flags'] & DIRECTORY_MODE_STANDALONE)) {
$preferred = '';
}
}
if (! $preferred) {
/*
* No directory has yet been set. For most sites, pick one at random
* from our list of directory servers. However, if we're a directory
* server ourself, point at the local instance
* We will then set this value so this should only ever happen once.
* Ideally there will be an admin setting to change to a different
* directory server if you don't like our choice or if circumstances change.
*/
$dirmode = intval(get_config('system','directory_mode'));
if ($dirmode == DIRECTORY_MODE_NORMAL) {
$toss = mt_rand(0,count($DIRECTORY_FALLBACK_SERVERS));
$preferred = $DIRECTORY_FALLBACK_SERVERS[$toss];
if(! $preferred) {
$preferred = DIRECTORY_FALLBACK_MASTER;
}
set_config('system','directory_server',$preferred);
}
else {
set_config('system','directory_server',z_root());
}
}
if($preferred) {
return [ 'url' => $preferred ];
}
else {
return [];
}
}
/**
* Directories may come and go over time. We will need to check that our
* directory server is still valid occasionally, and reset to something that
* is if our directory has gone offline for any reason
*/
static function check_upstream_directory() {
$directory = get_config('system', 'directory_server');
// it's possible there is no directory server configured and the local hub is being used.
// If so, default to preserving the absence of a specific server setting.
$isadir = true;
if ($directory) {
$j = Zotfinger::exec($directory);
if(array_path_exists('data/directory_mode',$j)) {
if ($j['data']['directory_mode'] === 'normal') {
$isadir = false;
}
}
}
if (! $isadir)
set_config('system', 'directory_server', '');
}
static function get_directory_setting($observer, $setting) {
if ($observer)
$ret = get_xconfig($observer, 'directory', $setting);
else
$ret = ((array_key_exists($setting,$_SESSION)) ? intval($_SESSION[$setting]) : false);
if($ret === false)
$ret = get_config('directory', $setting);
// 'safemode' is the default if there is no observer or no established preference.
if($setting === 'safemode' && $ret === false)
$ret = 1;
if($setting === 'globaldir' && intval(get_config('system','localdir_hide')))
$ret = 1;
return $ret;
}
/**
* @brief Called by the directory_sort widget.
*/
static function dir_sort_links() {
$safe_mode = 1;
$observer = get_observer_hash();
$safe_mode = self::get_directory_setting($observer, 'safemode');
$globaldir = self::get_directory_setting($observer, 'globaldir');
$pubforums = self::get_directory_setting($observer, 'pubforums');
$hide_local = intval(get_config('system','localdir_hide'));
if($hide_local)
$globaldir = 1;
// Build urls without order and pubforums so it's easy to tack on the changed value
// Probably there's an easier way to do this
$directory_sort_order = get_config('system','directory_sort_order');
if(! $directory_sort_order)
$directory_sort_order = 'date';
$current_order = (($_REQUEST['order']) ? $_REQUEST['order'] : $directory_sort_order);
$suggest = (($_REQUEST['suggest']) ? '&suggest=' . $_REQUEST['suggest'] : '');
$url = 'directory?f=';
$tmp = array_merge($_GET,$_POST);
unset($tmp['suggest']);
unset($tmp['pubforums']);
unset($tmp['global']);
unset($tmp['safe']);
unset($tmp['q']);
unset($tmp['f']);
$forumsurl = $url . http_build_query($tmp) . $suggest;
$o = replace_macros(get_markup_template('dir_sort_links.tpl'), [
'$header' => t('Directory Options'),
'$forumsurl' => $forumsurl,
'$safemode' => array('safemode', t('Safe Mode'),$safe_mode,'',array(t('No'), t('Yes')),' onchange=\'window.location.href="' . $forumsurl . '&safe="+(this.checked ? 1 : 0)\''),
'$pubforums' => array('pubforums', t('Public Forums Only'),$pubforums,'',array(t('No'), t('Yes')),' onchange=\'window.location.href="' . $forumsurl . '&pubforums="+(this.checked ? 1 : 0)\''),
'$hide_local' => $hide_local,
'$globaldir' => array('globaldir', t('This Website Only'), 1-intval($globaldir),'',array(t('No'), t('Yes')),' onchange=\'window.location.href="' . $forumsurl . '&global="+(this.checked ? 0 : 1)\''),
]);
return $o;
}
/**
* @brief Checks the directory mode of this hub.
*
* Checks the directory mode of this hub to see if it is some form of directory server. If it is,
* get the directory realm of this hub. Fetch a list of all other directory servers in this realm and request
* a directory sync packet. This will contain both directory updates and new ratings. Store these all in the DB.
* In the case of updates, we will query each of them asynchronously from a poller task. Ratings are stored
* directly if the rater's signature matches.
*
* @param int $dirmode;
*/
static function sync_directories($dirmode) {
if ($dirmode == DIRECTORY_MODE_STANDALONE || $dirmode == DIRECTORY_MODE_NORMAL)
return;
$realm = get_directory_realm();
if ($realm == DIRECTORY_REALM) {
$r = q("select * from site where (site_flags & %d) > 0 and site_url != '%s' and site_type = %d and ( site_realm = '%s' or site_realm = '') ",
intval(DIRECTORY_MODE_PRIMARY|DIRECTORY_MODE_SECONDARY),
dbesc(z_root()),
intval(SITE_TYPE_ZOT),
dbesc($realm)
);
}
else {
$r = q("select * from site where (site_flags & %d) > 0 and site_url != '%s' and site_realm like '%s' and site_type = %d ",
intval(DIRECTORY_MODE_PRIMARY|DIRECTORY_MODE_SECONDARY),
dbesc(z_root()),
dbesc(protect_sprintf('%' . $realm . '%')),
intval(SITE_TYPE_ZOT)
);
}
// If there are no directory servers, setup the fallback master
/** @FIXME What to do if we're in a different realm? */
if ((! $r) && (z_root() != DIRECTORY_FALLBACK_MASTER)) {
$x = site_store_lowlevel(
[
'site_url' => DIRECTORY_FALLBACK_MASTER,
'site_flags' => DIRECTORY_MODE_PRIMARY,
'site_update' => NULL_DATE,
'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch',
'site_realm' => DIRECTORY_REALM,
'site_valid' => 1,
]
);
$r = q("select * from site where site_flags in (%d, %d) and site_url != '%s' and site_type = %d ",
intval(DIRECTORY_MODE_PRIMARY),
intval(DIRECTORY_MODE_SECONDARY),
dbesc(z_root()),
intval(SITE_TYPE_ZOT)
);
}
if (! $r)
return;
foreach ($r as $rr) {
if (! $rr['site_directory'])
continue;
logger('sync directories: ' . $rr['site_directory']);
// for brand new directory servers, only load the last couple of days.
// It will take about a month for a new directory to obtain the full current repertoire of channels.
/** @FIXME Go back and pick up earlier ratings if this is a new directory server. These do not get refreshed. */
$token = get_config('system','realm_token');
$syncdate = (($rr['site_sync'] <= NULL_DATE) ? datetime_convert('UTC','UTC','now - 2 days') : $rr['site_sync']);
$x = z_fetch_url($rr['site_directory'] . '?f=&sync=' . urlencode($syncdate) . (($token) ? '&t=' . $token : ''));
if (! $x['success'])
continue;
$j = json_decode($x['body'],true);
if (!($j['transactions']) || ($j['ratings']))
continue;
q("update site set site_sync = '%s' where site_url = '%s'",
dbesc(datetime_convert()),
dbesc($rr['site_url'])
);
logger('sync_directories: ' . $rr['site_url'] . ': ' . print_r($j,true), LOGGER_DATA);
if (is_array($j['transactions']) && count($j['transactions'])) {
foreach ($j['transactions'] as $t) {
$r = q("select * from updates where ud_guid = '%s' limit 1",
dbesc($t['transaction_id'])
);
if($r)
continue;
$ud_flags = 0;
if (is_array($t['flags']) && in_array('deleted',$t['flags']))
$ud_flags |= UPDATE_FLAGS_DELETED;
if (is_array($t['flags']) && in_array('forced',$t['flags']))
$ud_flags |= UPDATE_FLAGS_FORCED;
$z = q("insert into updates ( ud_hash, ud_guid, ud_date, ud_flags, ud_addr )
values ( '%s', '%s', '%s', %d, '%s' ) ",
dbesc($t['hash']),
dbesc($t['transaction_id']),
dbesc($t['timestamp']),
intval($ud_flags),
dbesc($t['address'])
);
}
}
}
}
/**
* @brief
*
* Given an update record, probe the channel, grab a zot-info packet and refresh/sync the data.
*
* Ignore updating records marked as deleted.
*
* If successful, sets ud_last in the DB to the current datetime for this
* reddress/webbie.
*
* @param array $ud Entry from update table
*/
static function update_directory_entry($ud) {
logger('update_directory_entry: ' . print_r($ud,true), LOGGER_DATA);
if ($ud['ud_addr'] && (! ($ud['ud_flags'] & UPDATE_FLAGS_DELETED))) {
$success = false;
$href = \Zotlabs\Lib\Webfinger::zot_url(punify($url));
if($href) {
$zf = \Zotlabs\Lib\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);
}
else {
q("update updates set ud_last = '%s' where ud_addr = '%s'",
dbesc(datetime_convert()),
dbesc($ud['ud_addr'])
);
}
}
}
/**
* @brief Push local channel updates to a local directory server.
*
* This is called from include/directory.php if a profile is to be pushed to the
* directory and the local hub in this case is any kind of directory server.
*
* @param int $uid
* @param boolean $force
*/
static function local_dir_update($uid, $force) {
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",
intval($uid)
);
$profile = array();
$profile['encoding'] = 'zot';
if ($p) {
$hash = $p[0]['channel_hash'];
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
if ($age = age($p[0]['dob'],$p[0]['channel_timezone'],''))
$profile['age'] = $age;
$profile['gender'] = $p[0]['gender'];
$profile['marital'] = $p[0]['marital'];
$profile['sexual'] = $p[0]['sexual'];
$profile['locale'] = $p[0]['locality'];
$profile['region'] = $p[0]['region'];
$profile['postcode'] = $p[0]['postal_code'];
$profile['country'] = $p[0]['country_name'];
$profile['about'] = $p[0]['about'];
$profile['homepage'] = $p[0]['homepage'];
$profile['hometown'] = $p[0]['hometown'];
if ($p[0]['keywords']) {
$tags = array();
$k = explode(' ', $p[0]['keywords']);
if ($k)
foreach ($k as $kk)
if (trim($kk))
$tags[] = trim($kk);
if ($tags)
$profile['keywords'] = $tags;
}
$hidden = (1 - intval($p[0]['publish']));
logger('hidden: ' . $hidden);
$r = q("select xchan_hidden from xchan where xchan_hash = '%s' limit 1",
dbesc($p[0]['channel_hash'])
);
if(intval($r[0]['xchan_hidden']) != $hidden) {
$r = q("update xchan set xchan_hidden = %d where xchan_hash = '%s'",
intval($hidden),
dbesc($p[0]['channel_hash'])
);
}
$arr = [ 'channel_id' => $uid, 'hash' => $hash, 'profile' => $profile ];
call_hooks('local_dir_update', $arr);
$address = channel_reddress($p[0]);
if (perm_is_allowed($uid, '', 'view_profile')) {
self::import_directory_profile($hash, $arr['profile'], $address, 0);
}
else {
// they may have made it private
$r = q("delete from xprof where xprof_hash = '%s'",
dbesc($hash)
);
$r = q("delete from xtag where xtag_hash = '%s'",
dbesc($hash)
);
}
}
$ud_hash = random_string() . '@' . \App::get_hostname();
self::update_modtime($hash, $ud_hash, channel_reddress($p[0]),(($force) ? UPDATE_FLAGS_FORCED : UPDATE_FLAGS_UPDATED));
}
/**
* @brief Imports a directory profile.
*
* @param string $hash
* @param array $profile
* @param string $addr
* @param number $ud_flags (optional) UPDATE_FLAGS_UPDATED
* @param number $suppress_update (optional) default 0
* @return boolean $updated if something changed
*/
static function import_directory_profile($hash, $profile, $addr, $ud_flags = UPDATE_FLAGS_UPDATED, $suppress_update = 0) {
logger('import_directory_profile', LOGGER_DEBUG);
if (! $hash)
return false;
$arr = array();
$arr['xprof_hash'] = $hash;
$arr['xprof_dob'] = (($profile['birthday'] === '0000-00-00') ? $profile['birthday'] : datetime_convert('','',$profile['birthday'],'Y-m-d')); // !!!! check this for 0000 year
$arr['xprof_age'] = (($profile['age']) ? intval($profile['age']) : 0);
$arr['xprof_desc'] = (($profile['description']) ? htmlspecialchars($profile['description'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_gender'] = (($profile['gender']) ? htmlspecialchars($profile['gender'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_marital'] = (($profile['marital']) ? htmlspecialchars($profile['marital'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_sexual'] = (($profile['sexual']) ? htmlspecialchars($profile['sexual'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_locale'] = (($profile['locale']) ? htmlspecialchars($profile['locale'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_region'] = (($profile['region']) ? htmlspecialchars($profile['region'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_postcode'] = (($profile['postcode']) ? htmlspecialchars($profile['postcode'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_country'] = (($profile['country']) ? htmlspecialchars($profile['country'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_about'] = (($profile['about']) ? htmlspecialchars($profile['about'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_homepage'] = (($profile['homepage']) ? htmlspecialchars($profile['homepage'], ENT_COMPAT,'UTF-8',false) : '');
$arr['xprof_hometown'] = (($profile['hometown']) ? htmlspecialchars($profile['hometown'], ENT_COMPAT,'UTF-8',false) : '');
$clean = array();
if (array_key_exists('keywords', $profile) and is_array($profile['keywords'])) {
self::import_directory_keywords($hash,$profile['keywords']);
foreach ($profile['keywords'] as $kw) {
$kw = trim(htmlspecialchars($kw,ENT_COMPAT, 'UTF-8', false));
$kw = trim($kw, ',');
$clean[] = $kw;
}
}
$arr['xprof_keywords'] = implode(' ',$clean);
// Self censored, make it so
// These are not translated, so the German "erwachsenen" keyword will not censor the directory profile. Only the English form - "adult".
if(in_arrayi('nsfw',$clean) || in_arrayi('adult',$clean)) {
q("update xchan set xchan_selfcensored = 1 where xchan_hash = '%s'",
dbesc($hash)
);
}
$r = q("select * from xprof where xprof_hash = '%s' limit 1",
dbesc($hash)
);
if ($arr['xprof_age'] > 150)
$arr['xprof_age'] = 150;
if ($arr['xprof_age'] < 0)
$arr['xprof_age'] = 0;
if ($r) {
$update = false;
foreach ($r[0] as $k => $v) {
if ((array_key_exists($k,$arr)) && ($arr[$k] != $v)) {
logger('import_directory_profile: update ' . $k . ' => ' . $arr[$k]);
$update = true;
break;
}
}
if ($update) {
q("update xprof set
xprof_desc = '%s',
xprof_dob = '%s',
xprof_age = %d,
xprof_gender = '%s',
xprof_marital = '%s',
xprof_sexual = '%s',
xprof_locale = '%s',
xprof_region = '%s',
xprof_postcode = '%s',
xprof_country = '%s',
xprof_about = '%s',
xprof_homepage = '%s',
xprof_hometown = '%s',
xprof_keywords = '%s'
where xprof_hash = '%s'",
dbesc($arr['xprof_desc']),
dbesc($arr['xprof_dob']),
intval($arr['xprof_age']),
dbesc($arr['xprof_gender']),
dbesc($arr['xprof_marital']),
dbesc($arr['xprof_sexual']),
dbesc($arr['xprof_locale']),
dbesc($arr['xprof_region']),
dbesc($arr['xprof_postcode']),
dbesc($arr['xprof_country']),
dbesc($arr['xprof_about']),
dbesc($arr['xprof_homepage']),
dbesc($arr['xprof_hometown']),
dbesc($arr['xprof_keywords']),
dbesc($arr['xprof_hash'])
);
}
} else {
$update = true;
logger('New profile');
q("insert into xprof (xprof_hash, xprof_desc, xprof_dob, xprof_age, xprof_gender, xprof_marital, xprof_sexual, xprof_locale, xprof_region, xprof_postcode, xprof_country, xprof_about, xprof_homepage, xprof_hometown, xprof_keywords) values ('%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
dbesc($arr['xprof_hash']),
dbesc($arr['xprof_desc']),
dbesc($arr['xprof_dob']),
intval($arr['xprof_age']),
dbesc($arr['xprof_gender']),
dbesc($arr['xprof_marital']),
dbesc($arr['xprof_sexual']),
dbesc($arr['xprof_locale']),
dbesc($arr['xprof_region']),
dbesc($arr['xprof_postcode']),
dbesc($arr['xprof_country']),
dbesc($arr['xprof_about']),
dbesc($arr['xprof_homepage']),
dbesc($arr['xprof_hometown']),
dbesc($arr['xprof_keywords'])
);
}
$d = [
'xprof' => $arr,
'profile' => $profile,
'update' => $update
];
/**
* @hooks import_directory_profile
* Called when processing delivery of a profile structure from an external source (usually for directory storage).
* * \e array \b xprof
* * \e array \b profile
* * \e boolean \b update
*/
call_hooks('import_directory_profile', $d);
if (($d['update']) && (! $suppress_update))
self::update_modtime($arr['xprof_hash'],random_string() . '@' . \App::get_hostname(), $addr, $ud_flags);
return $d['update'];
}
/**
* @brief
*
* @param string $hash An xtag_hash
* @param array $keywords
*/
static function import_directory_keywords($hash, $keywords) {
$existing = array();
$r = q("select * from xtag where xtag_hash = '%s' and xtag_flags = 0",
dbesc($hash)
);
if($r) {
foreach($r as $rr)
$existing[] = $rr['xtag_term'];
}
$clean = array();
foreach($keywords as $kw) {
$kw = trim(htmlspecialchars($kw,ENT_COMPAT, 'UTF-8', false));
$kw = trim($kw, ',');
$clean[] = $kw;
}
foreach($existing as $x) {
if(! in_array($x, $clean))
$r = q("delete from xtag where xtag_hash = '%s' and xtag_term = '%s' and xtag_flags = 0",
dbesc($hash),
dbesc($x)
);
}
foreach($clean as $x) {
if(! in_array($x, $existing)) {
$r = q("insert into xtag ( xtag_hash, xtag_term, xtag_flags) values ( '%s' ,'%s', 0 )",
dbesc($hash),
dbesc($x)
);
}
}
}
/**
* @brief
*
* @param string $hash
* @param string $guid
* @param string $addr
* @param int $flags (optional) default 0
*/
static function update_modtime($hash, $guid, $addr, $flags = 0) {
$dirmode = intval(get_config('system', 'directory_mode'));
if($dirmode == DIRECTORY_MODE_NORMAL)
return;
if($flags) {
q("insert into updates (ud_hash, ud_guid, ud_date, ud_flags, ud_addr ) values ( '%s', '%s', '%s', %d, '%s' )",
dbesc($hash),
dbesc($guid),
dbesc(datetime_convert()),
intval($flags),
dbesc($addr)
);
}
else {
q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and not (ud_flags & %d)>0 ",
intval(UPDATE_FLAGS_UPDATED),
dbesc($addr),
intval(UPDATE_FLAGS_UPDATED)
);
}
}
}

View File

@@ -26,7 +26,8 @@ class NativeWiki {
$w['rawName'] = get_iconfig($w, 'wiki', 'rawName');
$w['htmlName'] = escape_tags($w['rawName']);
$w['urlName'] = urlencode(urlencode($w['rawName']));
//$w['urlName'] = urlencode(urlencode($w['rawName']));
$w['urlName'] = self::name_encode($w['rawName']);
$w['mimeType'] = get_iconfig($w, 'wiki', 'mimeType');
$w['typelock'] = get_iconfig($w, 'wiki', 'typelock');
$w['lockstate'] = (($w['allow_cid'] || $w['allow_gid'] || $w['deny_cid'] || $w['deny_gid']) ? 'lock' : 'unlock');
@@ -233,7 +234,8 @@ class NativeWiki {
'wiki' => $w,
'rawName' => $rawName,
'htmlName' => escape_tags($rawName),
'urlName' => urlencode(urlencode($rawName)),
//'urlName' => urlencode(urlencode($rawName)),
'urlName' => self::name_encode($rawName),
'mimeType' => $mimeType,
'typelock' => $typelock
);
@@ -249,7 +251,8 @@ class NativeWiki {
WHERE resource_type = '%s' AND iconfig.v = '%s' AND uid = %d
AND item_deleted = 0 $sql_extra limit 1",
dbesc(NWIKI_ITEM_RESOURCE_TYPE),
dbesc(urldecode($urlName)),
//dbesc(urldecode($urlName)),
dbesc(self::name_decode($urlName)),
intval($uid)
);
@@ -286,4 +289,32 @@ class NativeWiki {
return array('read' => true, 'write' => $write, 'success' => true);
}
}
public static function name_encode ($string) {
$string = html_entity_decode($string);
$encoding = mb_internal_encoding();
mb_internal_encoding("UTF-8");
$ret = mb_ereg_replace_callback ('[^A-Za-z0-9\-\_\.\~]',function ($char) {
$charhex = unpack('H*',$char[0]);
$ret = '('.$charhex[1].')';
return $ret;
}
,$string);
mb_internal_encoding($encoding);
return $ret;
}
public static function name_decode ($string) {
$encoding = mb_internal_encoding();
mb_internal_encoding("UTF-8");
$ret = mb_ereg_replace_callback ('(\(([0-9a-f]+)\))',function ($chars) {
return pack('H*',$chars[2]);
}
,$string);
mb_internal_encoding($encoding);
return $ret;
}
}

View File

@@ -44,7 +44,8 @@ class NativeWikiPage {
$pages[] = [
'resource_id' => $resource_id,
'title' => escape_tags($title),
'url' => str_replace('%2F','/',urlencode(str_replace('%2F','/',urlencode($title)))),
//'url' => str_replace('%2F','/',urlencode(str_replace('%2F','/',urlencode($title)))),
'url' => Zlib\NativeWiki::name_encode($title),
'link_id' => 'id_' . substr($resource_id, 0, 10) . '_' . $page_item['id']
];
}
@@ -98,7 +99,8 @@ class NativeWikiPage {
$page = [
'rawName' => $name,
'htmlName' => escape_tags($name),
'urlName' => urlencode($name),
//'urlName' => urlencode($name),
'urlName' => Zlib\NativeWiki::name_encode($name)
];
@@ -154,7 +156,8 @@ class NativeWikiPage {
$page = [
'rawName' => $pageNewName,
'htmlName' => escape_tags($pageNewName),
'urlName' => urlencode(escape_tags($pageNewName))
//'urlName' => urlencode(escape_tags($pageNewName))
'urlName' => Zlib\NativeWiki::name_encode($pageNewName)
];
return [ 'success' => true, 'page' => $page ];
@@ -365,7 +368,6 @@ class NativeWikiPage {
unset($item['id']);
unset($item['author']);
$item['parent'] = 0;
$item['body'] = $content;
$item['author_xchan'] = $observer_hash;
@@ -527,7 +529,8 @@ class NativeWikiPage {
$pages = $pageURLs = array();
foreach ($match[1] as $m) {
// TODO: Why do we need to double urlencode for this to work?
$pageURLs[] = urlencode(urlencode(escape_tags($m)));
//$pageURLs[] = urlencode(urlencode(escape_tags($m)));
$pageURLs[] = Zlib\NativeWiki::name_encode(escape_tags($m));
$pages[] = $m;
}
$idx = 0;
@@ -556,7 +559,10 @@ class NativeWikiPage {
'$pageHistory' => $pageHistory['history'],
'$permsWrite' => $arr['permsWrite'],
'$name_lbl' => t('Name'),
'$msg_label' => t('Message','wiki_history')
'$msg_label' => t('Message','wiki_history'),
'$date_lbl' => t('Date'),
'$revert_btn' => t('Revert'),
'$compare_btn' => t('Compare')
));
}
@@ -613,7 +619,7 @@ class NativeWikiPage {
$s = str_replace('[observer.webname]', '', $s);
$s = str_replace('[observer.photo]', '', $s);
}
return $s;
}

View File

@@ -57,6 +57,7 @@ class PConfig {
\App::$config[$uid][$c]['config_loaded'] = true;
}
\App::$config[$uid][$c][$k] = $rr['v'];
\App::$config[$uid][$c]['pcfgud:'.$k] = $rr['updated'];
}
}
}
@@ -113,7 +114,7 @@ class PConfig {
* The value to store
* @return mixed Stored $value or false
*/
static public function Set($uid, $family, $key, $value) {
static public function Set($uid, $family, $key, $value, $updated=NULL) {
// this catches subtle errors where this function has been called
// with local_channel() when not logged in (which returns false)
@@ -130,29 +131,74 @@ class PConfig {
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
if (! $updated) {
$updated = datetime_convert();
}
$hash = hash('sha256',$family.':'.$key);
if (self::Get($uid, 'hz_delpconfig', $hash) !== false) {
if (self::Get($uid, 'hz_delpconfig', $hash) > $updated) {
logger('Refusing to update pconfig with outdated info (Item deleted more recently).', LOGGER_NORMAL, LOG_ERR);
return self::Get($uid,$family,$key);
} else {
self::Delete($uid,'hz_delpconfig',$hash);
}
}
if(self::Get($uid, $family, $key) === false) {
if(! array_key_exists($uid, \App::$config))
\App::$config[$uid] = array();
if(! array_key_exists($family, \App::$config[$uid]))
\App::$config[$uid][$family] = array();
$ret = q("INSERT INTO pconfig ( uid, cat, k, v ) VALUES ( %d, '%s', '%s', '%s' ) ",
$ret = q("INSERT INTO pconfig ( uid, cat, k, v, updated ) VALUES ( %d, '%s', '%s', '%s', '%s' ) ",
intval($uid),
dbesc($family),
dbesc($key),
dbesc($dbvalue)
dbesc($dbvalue),
dbesc($updated)
);
// There is a possible race condition if another process happens
// to insert something after this thread has Loaded and now. We should
// at least make a note of it if it happens.
if (!$ret) {
logger("Error: Insert to pconfig failed.",LOGGER_NORMAL, LOG_ERR);
}
\App::$config[$uid][$family]['pcfgud:'.$key] = $updated;
}
else {
$new = (\App::$config[$uid][$family]['pcfgud:'.$key] < $updated);
$ret = q("UPDATE pconfig SET v = '%s' WHERE uid = %d and cat = '%s' AND k = '%s'",
dbesc($dbvalue),
intval($uid),
dbesc($family),
dbesc($key)
);
if ($new) {
// @NOTE There is still a possible race condition under limited circumstances
// where a value will be updated by another thread with more current data than
// we have. At this point there is no easy way to test for it, so we update
// and hope for the best.
$ret = q("UPDATE pconfig SET v = '%s', updated = '%s' WHERE uid = %d and cat = '%s' AND k = '%s' ",
dbesc($dbvalue),
dbesc($updated),
intval($uid),
dbesc($family),
dbesc($key)
);
\App::$config[$uid][$family]['pcfgud:'.$key] = $updated;
} else {
logger('Refusing to update pconfig with outdated info.', LOGGER_NORMAL, LOG_ERR);
return self::Get($uid, $family, $key);
}
}
// keep a separate copy for all variables which were
// set in the life of this page. We need this to
// synchronise channel clones.
@@ -163,7 +209,11 @@ class PConfig {
\App::$config[$uid]['transient'][$family] = array();
\App::$config[$uid][$family][$key] = $value;
\App::$config[$uid]['transient'][$family][$key] = $value;
if ($new) {
\App::$config[$uid]['transient'][$family][$key] = $value;
\App::$config[$uid]['transient'][$family]['pcfgud:'.$key] = $updated;
}
if($ret)
return $value;
@@ -186,18 +236,29 @@ class PConfig {
* The configuration key to delete
* @return mixed
*/
static public function Delete($uid, $family, $key) {
static public function Delete($uid, $family, $key, $updated = NULL) {
if(is_null($uid) || $uid === false)
return false;
$updated = ($updated) ? $updated : datetime_convert();
$newer = (\App::$config[$uid][$family]['pcfgud:'.$key] < $updated);
if (! $newer) {
logger('Refusing to delete pconfig with outdated delete request.', LOGGER_NORMAL, LOG_ERR);
return false;
}
$ret = false;
if(array_key_exists($uid,\App::$config)
&& is_array(\App::$config['uid'])
&& array_key_exists($family,\App::$config['uid'])
&& array_key_exists($key, \App::$config[$uid][$family]))
if (isset(\App::$config[$uid][$family][$key])) {
unset(\App::$config[$uid][$family][$key]);
}
if (isset(\App::$config[$uid][$family]['pcfgud:'.$key])) {
unset(\App::$config[$uid][$family]['pcfgud:'.$key]);
}
$ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s'",
intval($uid),
@@ -205,6 +266,22 @@ class PConfig {
dbesc($key)
);
if ($family != 'hz_delpconfig') {
$hash = hash('sha256',$family.':'.$key);
set_pconfig($uid,'hz_delpconfig',$hash,$updated);
}
// Synchronize delete with clones.
if(! array_key_exists('transient', \App::$config[$uid]))
\App::$config[$uid]['transient'] = array();
if(! array_key_exists($family, \App::$config[$uid]['transient']))
\App::$config[$uid]['transient'][$family] = array();
if ($new) {
\App::$config[$uid]['transient'][$family]['pcfgdel:'.$key] = $updated;
}
return $ret;
}

278
Zotlabs/Lib/Queue.php Normal file
View File

@@ -0,0 +1,278 @@
<?php /** @file */
namespace Zotlabs\Lib;
use Zotlabs\Lib\Libzot;
class Queue {
static function update($id, $add_priority = 0) {
logger('queue: requeue item ' . $id,LOGGER_DEBUG);
$x = q("select outq_created, outq_posturl from outq where outq_hash = '%s' limit 1",
dbesc($id)
);
if(! $x)
return;
$y = q("select min(outq_created) as earliest from outq where outq_posturl = '%s'",
dbesc($x[0]['outq_posturl'])
);
// look for the oldest queue entry with this destination URL. If it's older than a couple of days,
// the destination is considered to be down and only scheduled once an hour, regardless of the
// age of the current queue item.
$might_be_down = false;
if($y)
$might_be_down = ((datetime_convert('UTC','UTC',$y[0]['earliest']) < datetime_convert('UTC','UTC','now - 2 days')) ? true : false);
// Set all other records for this destination way into the future.
// The queue delivers by destination. We'll keep one queue item for
// this destination (this one) with a shorter delivery. If we succeed
// once, we'll try to deliver everything for that destination.
// The delivery will be set to at most once per hour, and if the
// queue item is less than 12 hours old, we'll schedule for fifteen
// minutes.
$r = q("UPDATE outq SET outq_scheduled = '%s' WHERE outq_posturl = '%s'",
dbesc(datetime_convert('UTC','UTC','now + 5 days')),
dbesc($x[0]['outq_posturl'])
);
$since = datetime_convert('UTC','UTC',$x[0]['outq_created']);
if(($might_be_down) || ($since < datetime_convert('UTC','UTC','now - 12 hour'))) {
$next = datetime_convert('UTC','UTC','now + 1 hour');
}
else {
$next = datetime_convert('UTC','UTC','now + ' . intval($add_priority) . ' minutes');
}
q("UPDATE outq SET outq_updated = '%s',
outq_priority = outq_priority + %d,
outq_scheduled = '%s'
WHERE outq_hash = '%s'",
dbesc(datetime_convert()),
intval($add_priority),
dbesc($next),
dbesc($id)
);
}
static function remove($id,$channel_id = 0) {
logger('queue: remove queue item ' . $id,LOGGER_DEBUG);
$sql_extra = (($channel_id) ? " and outq_channel = " . intval($channel_id) . " " : '');
q("DELETE FROM outq WHERE outq_hash = '%s' $sql_extra",
dbesc($id)
);
}
static function remove_by_posturl($posturl) {
logger('queue: remove queue posturl ' . $posturl,LOGGER_DEBUG);
q("DELETE FROM outq WHERE outq_posturl = '%s' ",
dbesc($posturl)
);
}
static function set_delivered($id,$channel = 0) {
logger('queue: set delivered ' . $id,LOGGER_DEBUG);
$sql_extra = (($channel_id) ? " and outq_channel = " . intval($channel_id) . " " : '');
// Set the next scheduled run date so far in the future that it will be expired
// long before it ever makes it back into the delivery chain.
q("update outq set outq_delivered = 1, outq_updated = '%s', outq_scheduled = '%s' where outq_hash = '%s' $sql_extra ",
dbesc(datetime_convert()),
dbesc(datetime_convert('UTC','UTC','now + 5 days')),
dbesc($id)
);
}
static function insert($arr) {
// do not queue anything with no destination
if(! (array_key_exists('posturl',$arr) && trim($arr['posturl']))) {
return false;
}
$x = q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_priority,
outq_created, outq_updated, outq_scheduled, outq_notify, outq_msg )
values ( '%s', %d, %d, '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s' )",
dbesc($arr['hash']),
intval($arr['account_id']),
intval($arr['channel_id']),
dbesc(($arr['driver']) ? $arr['driver'] : 'zot'),
dbesc($arr['posturl']),
intval(1),
intval(($arr['priority']) ? $arr['priority'] : 0),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc($arr['notify']),
dbesc(($arr['msg']) ? $arr['msg'] : '')
);
return $x;
}
static function deliver($outq, $immediate = false) {
$base = null;
$h = parse_url($outq['outq_posturl']);
if($h !== false)
$base = $h['scheme'] . '://' . $h['host'] . (($h['port']) ? ':' . $h['port'] : '');
if(($base) && ($base !== z_root()) && ($immediate)) {
$y = q("select site_update, site_dead from site where site_url = '%s' ",
dbesc($base)
);
if($y) {
if(intval($y[0]['site_dead'])) {
self::remove_by_posturl($outq['outq_posturl']);
logger('dead site ignored ' . $base);
return;
}
if($y[0]['site_update'] < datetime_convert('UTC','UTC','now - 1 month')) {
self::update($outq['outq_hash'],10);
logger('immediate delivery deferred for site ' . $base);
return;
}
}
else {
// zot sites should all have a site record, unless they've been dead for as long as
// your site has existed. Since we don't know for sure what these sites are,
// call them unknown
site_store_lowlevel(
[
'site_url' => $base,
'site_update' => datetime_convert(),
'site_dead' => 0,
'site_type' => intval(($outq['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN),
'site_crypto' => ''
]
);
}
}
$arr = array('outq' => $outq, 'base' => $base, 'handled' => false, 'immediate' => $immediate);
call_hooks('queue_deliver',$arr);
if($arr['handled'])
return;
// "post" queue driver - used for diaspora and friendica-over-diaspora communications.
if($outq['outq_driver'] === 'post') {
$result = z_post_url($outq['outq_posturl'],$outq['outq_msg']);
if($result['success'] && $result['return_code'] < 300) {
logger('deliver: queue post success to ' . $outq['outq_posturl'], LOGGER_DEBUG);
if($base) {
q("update site set site_update = '%s', site_dead = 0 where site_url = '%s' ",
dbesc(datetime_convert()),
dbesc($base)
);
}
q("update dreport set dreport_result = '%s', dreport_time = '%s' where dreport_queue = '%s'",
dbesc('accepted for delivery'),
dbesc(datetime_convert()),
dbesc($outq['outq_hash'])
);
self::remove($outq['outq_hash']);
// server is responding - see if anything else is going to this destination and is piled up
// and try to send some more. We're relying on the fact that do_delivery() results in an
// immediate delivery otherwise we could get into a queue loop.
if(! $immediate) {
$x = q("select outq_hash from outq where outq_posturl = '%s' and outq_delivered = 0",
dbesc($outq['outq_posturl'])
);
$piled_up = array();
if($x) {
foreach($x as $xx) {
$piled_up[] = $xx['outq_hash'];
}
}
if($piled_up) {
// call do_delivery() with the force flag
do_delivery($piled_up, true);
}
}
}
else {
logger('deliver: queue post returned ' . $result['return_code']
. ' from ' . $outq['outq_posturl'],LOGGER_DEBUG);
self::update($outq['outq_hash'],10);
}
return;
}
// normal zot delivery
logger('deliver: dest: ' . $outq['outq_posturl'], LOGGER_DEBUG);
if($outq['outq_posturl'] === z_root() . '/zot') {
// local delivery
$zot = new \Zotlabs\Zot6\Receiver(new \Zotlabs\Zot6\Zot6Handler(),$outq['outq_notify']);
$result = $zot->run(true);
logger('returned_json: ' . json_encode($result,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES), LOGGER_DATA);
logger('deliver: local zot delivery succeeded to ' . $outq['outq_posturl']);
Libzot::process_response($outq['outq_posturl'],[ 'success' => true, 'body' => json_encode($result) ], $outq);
}
else {
logger('remote');
$channel = null;
if($outq['outq_channel']) {
$channel = channelx_by_n($outq['outq_channel']);
}
$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",
dbesc($base)
);
if($h) {
$host_crypto = $h[0];
}
}
$msg = $outq['outq_notify'];
$result = Libzot::zot($outq['outq_posturl'],$msg,$channel,$host_crypto);
if($result['success']) {
logger('deliver: remote zot delivery succeeded to ' . $outq['outq_posturl']);
Libzot::process_response($outq['outq_posturl'],$result, $outq);
}
else {
logger('deliver: remote zot delivery failed to ' . $outq['outq_posturl']);
logger('deliver: remote zot delivery fail data: ' . print_r($result,true), LOGGER_DATA);
self::update($outq['outq_hash'],10);
}
}
return;
}
}

View File

@@ -2,6 +2,8 @@
namespace Zotlabs\Lib;
use Zotlabs\Lib\Apps;
require_once('include/text.php');
/**
@@ -259,7 +261,7 @@ class ThreadItem {
$forged = ((($item['sig']) && (! intval($item['item_verified']))) ? t('Message signature incorrect') : '');
$unverified = '' ; // (($this->is_wall_to_wall() && (! intval($item['item_verified']))) ? t('Message cannot be verified') : '');
$settings = '';
// FIXME - check this permission
if($conv->get_profile_owner() == local_channel()) {
@@ -267,12 +269,14 @@ class ThreadItem {
'tagit' => t("Add Tag"),
'classtagger' => "",
);
$settings = t('Conversation Tools');
}
$has_bookmarks = false;
if(is_array($item['term'])) {
if(Apps::system_app_installed(local_channel(), 'Bookmarks') && is_array($item['term'])) {
foreach($item['term'] as $t) {
if((get_account_techlevel() > 0) && ($t['ttype'] == TERM_BOOKMARK))
if(($t['ttype'] == TERM_BOOKMARK))
$has_bookmarks = true;
}
}
@@ -325,6 +329,10 @@ class ThreadItem {
$has_tags = (($body['tags'] || $body['categories'] || $body['mentions'] || $body['attachments'] || $body['folders']) ? true : false);
$dropdown_extras_arr = [ 'item' => $item , 'dropdown_extras' => '' ];
call_hooks('dropdown_extras',$dropdown_extras_arr);
$dropdown_extras = $dropdown_extras_arr['dropdown_extras'];
$tmp_item = array(
'template' => $this->get_template(),
'mode' => $mode,
@@ -404,6 +412,7 @@ class ThreadItem {
'addtocal' => (($has_event) ? t('Add to Calendar') : ''),
'drop' => $drop,
'multidrop' => ((feature_enabled($conv->get_profile_owner(),'multi_delete')) ? $multidrop : ''),
'dropdown_extras' => $dropdown_extras,
// end toolbar buttons
'unseen_comments' => $unseen_comments,
@@ -431,7 +440,8 @@ class ThreadItem {
'preview_lbl' => t('This is an unsaved preview'),
'wait' => t('Please wait'),
'submid' => str_replace(['+','='], ['',''], base64_encode($item['mid'])),
'thread_level' => $thread_level
'thread_level' => $thread_level,
'settings' => $settings
);
$arr = array('item' => $item, 'output' => $tmp_item);

View File

@@ -196,7 +196,6 @@ class ThreadStream {
$item->set_commentable(false);
}
require_once('include/channel.php');
$item->set_conversation($this);
$this->threads[] = $item;

109
Zotlabs/Lib/Webfinger.php Normal file
View File

@@ -0,0 +1,109 @@
<?php
namespace Zotlabs\Lib;
/**
* @brief Fetch and return a webfinger for a resource
*
* @param string $resource - The resource
* @return boolean|string false or associative array from result JSON
*/
class Webfinger {
static private $server = EMPTY_STR;
static private $resource = EMPTY_STR;
static function exec($resource) {
if(! $resource) {
return false;
}
self::parse_resource($resource);
if(! ( self::$server && self::$resource)) {
return false;
}
if(! check_siteallowed(self::$server)) {
logger('blacklisted: ' . self::$server);
return false;
}
btlogger('fetching resource: ' . self::$resource . ' from ' . self::$server, LOGGER_DEBUG, LOG_INFO);
$url = 'https://' . self::$server . '/.well-known/webfinger?f=&resource=' . self::$resource ;
$counter = 0;
$s = z_fetch_url($url, false, $counter, [ 'headers' => [ 'Accept: application/jrd+json, */*' ] ]);
if($s['success']) {
$j = json_decode($s['body'], true);
return($j);
}
return false;
}
static function parse_resource($resource) {
self::$resource = urlencode($resource);
if(strpos($resource,'http') === 0) {
$m = parse_url($resource);
if($m) {
if($m['scheme'] !== 'https') {
return false;
}
self::$server = $m['host'] . (($m['port']) ? ':' . $m['port'] : '');
}
else {
return false;
}
}
elseif(strpos($resource,'tag:') === 0) {
$arr = explode(':',$resource); // split the tag
$h = explode(',',$arr[1]); // split the host,date
self::$server = $h[0];
}
else {
$x = explode('@',$resource);
$username = $x[0];
if(count($x) > 1) {
self::$server = $x[1];
}
else {
return false;
}
if(strpos($resource,'acct:') !== 0) {
self::$resource = urlencode('acct:' . $resource);
}
}
}
/**
* @brief fetch a webfinger resource and return a zot6 discovery url if present
*
*/
static function zot_url($resource) {
$arr = self::exec($resource);
if(is_array($arr) && array_key_exists('links',$arr)) {
foreach($arr['links'] as $link) {
if(array_key_exists('rel',$link) && $link['rel'] === PROTOCOL_ZOT6) {
if(array_key_exists('href',$link) && $link['href'] !== EMPTY_STR) {
return $link['href'];
}
}
}
}
return false;
}
}

50
Zotlabs/Lib/Zotfinger.php Normal file
View File

@@ -0,0 +1,50 @@
<?php
namespace Zotlabs\Lib;
use Zotlabs\Web\HTTPSig;
class Zotfinger {
static function exec($resource,$channel = null) {
if(! $resource) {
return false;
}
if($channel) {
$headers = [
'Accept' => 'application/x-zot+json',
'X-Zot-Token' => random_string(),
];
$h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel),false);
}
else {
$h = [ 'Accept: application/x-zot+json' ];
}
$result = [];
$redirects = 0;
$x = z_fetch_url($resource,false,$redirects, [ 'headers' => $h ] );
if($x['success']) {
$result['signature'] = HTTPSig::verify($x);
$result['data'] = json_decode($x['body'],true);
if($result['data'] && is_array($result['data']) && array_key_exists('encrypted',$result['data']) && $result['data']['encrypted']) {
$result['data'] = json_decode(crypto_unencapsulate($result['data'],get_config('system','prvkey')),true);
}
return $result;
}
return false;
}
}

View File

@@ -81,9 +81,10 @@ class Acl extends \Zotlabs\Web\Controller {
if($search) {
$sql_extra = " AND groups.gname LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
$sql_extra = " AND pgrp.gname LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
$sql_extra2 = "AND ( xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'%" . dbesc(punify($search)) . ((strpos($search,'@') === false) ? "%@%'" : "%'")) . ") ";
$sql_extra2_xchan = "AND ( xchan_name LIKE " . protect_sprintf( "'" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'" . dbesc(punify($search)) . ((strpos($search,'@') === false) ? "%@%'" : "%'")) . ") ";
// This horrible mess is needed because position also returns 0 if nothing is found.
// Would be MUCH easier if it instead returned a very large value
// Otherwise we could just
@@ -128,13 +129,13 @@ class Acl extends \Zotlabs\Web\Controller {
// Normal privacy groups
$r = q("SELECT groups.id, groups.hash, groups.gname
FROM groups, group_member
WHERE groups.deleted = 0 AND groups.uid = %d
AND group_member.gid = groups.id
$r = q("SELECT pgrp.id, pgrp.hash, pgrp.gname
FROM pgrp, pgrp_member
WHERE pgrp.deleted = 0 AND pgrp.uid = %d
AND pgrp_member.gid = pgrp.id
$sql_extra
GROUP BY groups.id
ORDER BY groups.gname
GROUP BY pgrp.id
ORDER BY pgrp.gname
LIMIT %d OFFSET %d",
intval(local_channel()),
intval($count),
@@ -226,7 +227,7 @@ class Acl extends \Zotlabs\Web\Controller {
else { // Visitors
$r = q("SELECT xchan_hash as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, 0 as abook_their_perms, 0 as abook_flags, 0 as abook_self
FROM xchan left join xlink on xlink_link = xchan_hash
WHERE xlink_xchan = '%s' AND xchan_deleted = 0 $sql_extra2 order by $order_extra2 xchan_name asc" ,
WHERE xlink_xchan = '%s' AND xchan_deleted = 0 $sql_extra2_xchan order by $order_extra2 xchan_name asc" ,
dbesc(get_observer_hash())
);
@@ -270,7 +271,7 @@ class Acl extends \Zotlabs\Web\Controller {
if((count($r) < 100) && $type == 'c') {
$r2 = q("SELECT substr(xchan_hash,1,18) as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, 0 as abook_their_perms, 0 as abook_flags, 0 as abook_self
FROM xchan
WHERE xchan_deleted = 0 and not xchan_network in ('rss','anon','unknown') $sql_extra2 order by $order_extra2 xchan_name asc"
WHERE xchan_deleted = 0 and not xchan_network in ('rss','anon','unknown') $sql_extra2_xchan order by $order_extra2 xchan_name asc"
);
if($r2) {
$r = array_merge($r,$r2);

View File

@@ -109,11 +109,9 @@ class Admin extends \Zotlabs\Web\Controller {
// available channels, primary and clones
$channels = array();
$r = q("SELECT COUNT(*) AS total, COUNT(CASE WHEN channel_primary = 1 THEN 1 ELSE NULL END) AS main, COUNT(CASE WHEN channel_primary = 0 THEN 1 ELSE NULL END) AS clones FROM channel WHERE channel_removed = 0");
$r = q("SELECT COUNT(*) AS total FROM channel WHERE channel_removed = 0 and channel_system = 0");
if ($r) {
$channels['total'] = array('label' => t('Channels'), 'val' => $r[0]['total']);
$channels['main'] = array('label' => t('Primary'), 'val' => $r[0]['main']);
$channels['clones'] = array('label' => t('Clones'), 'val' => $r[0]['clones']);
}
// We can do better, but this is a quick queue status

View File

@@ -31,7 +31,7 @@ class Account_edit {
}
$service_class = trim($_REQUEST['service_class']);
$account_level = intval(trim($_REQUEST['account_level']));
$account_level = 5;
$account_language = trim($_REQUEST['account_language']);
$r = q("update account set account_service_class = '%s', account_level = %d, account_language = '%s'
@@ -68,7 +68,6 @@ class Account_edit {
'$title' => t('Account Edit'),
'$pass1' => [ 'pass1', t('New Password'), ' ','' ],
'$pass2' => [ 'pass2', t('New Password again'), ' ','' ],
'$account_level' => [ 'account_level', t('Technical skill level'), $x[0]['account_level'], '', \Zotlabs\Lib\Techlevels::levels() ],
'$account_language' => [ 'account_language' , t('Account language (for emails)'), $x[0]['account_language'], '', language_list() ],
'$service_class' => [ 'service_class', t('Service class'), $x[0]['account_service_class'], '' ],
'$submit' => t('Submit'),
@@ -81,4 +80,4 @@ class Account_edit {
}
}
}

View File

@@ -72,7 +72,6 @@ class Site {
$maxloadavg = ((x($_POST,'maxloadavg')) ? intval(trim($_POST['maxloadavg'])) : 50);
$feed_contacts = ((x($_POST,'feed_contacts')) ? intval($_POST['feed_contacts']) : 0);
$verify_email = ((x($_POST,'verify_email')) ? 1 : 0);
$techlevel_lock = ((x($_POST,'techlock')) ? intval($_POST['techlock']) : 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);
@@ -81,10 +80,6 @@ class Site {
$permissions_role = escape_tags(trim($_POST['permissions_role']));
$techlevel = null;
if(array_key_exists('techlevel', $_POST))
$techlevel = intval($_POST['techlevel']);
set_config('system', 'feed_contacts', $feed_contacts);
set_config('system', 'delivery_interval', $delivery_interval);
set_config('system', 'delivery_batch_count', $delivery_batch_count);
@@ -110,12 +105,6 @@ class Site {
set_config('system', 'pubstream_incl',$pub_incl);
set_config('system', 'pubstream_excl',$pub_excl);
set_config('system', 'techlevel_lock', $techlevel_lock);
if(! is_null($techlevel))
set_config('system', 'techlevel', $techlevel);
if($directory_server)
set_config('system','directory_server',$directory_server);
@@ -284,15 +273,6 @@ class Site {
// now invert the logic for the setting.
$discover_tab = (1 - $discover_tab);
$techlevels = [
'0' => t('Beginner/Basic'),
'1' => t('Novice - not skilled but willing to learn'),
'2' => t('Intermediate - somewhat comfortable'),
'3' => t('Advanced - very comfortable'),
'4' => t('Expert - I can write computer code'),
'5' => t('Wizard - I probably know more than you do')
];
$perm_roles = \Zotlabs\Access\PermissionRoles::roles();
$default_role = get_config('system','default_permissions_role','social');
@@ -316,10 +296,6 @@ class Site {
// name, label, value, help string, extra data...
'$sitename' => array('sitename', t("Site name"), htmlspecialchars(get_config('system','sitename'), ENT_QUOTES, 'UTF-8'),''),
'$techlevel' => [ 'techlevel', t('Site default technical skill level'), get_config('system','techlevel'), t('Used to provide a member experience matched to technical comfort level'), $techlevels ],
'$techlock' => [ 'techlock', t('Lock the technical skill level setting'), get_config('system','techlevel_lock'), t('Members can set their own technical comfort level by default') ],
'$banner' => array('banner', t("Banner/Logo"), $banner, t('Unfiltered HTML/CSS/JS is allowed')),
'$admininfo' => array('admininfo', t("Administrator Information"), $admininfo, t("Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here")),
'$siteinfo' => array('siteinfo', t('Site Information'), get_config('system','siteinfo'), t("Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here")),
@@ -332,10 +308,10 @@ class Site {
'$register_policy' => array('register_policy', t("Does this site allow new member registration?"), get_config('system','register_policy'), "", $register_choices),
'$invite_only' => array('invite_only', t("Invitation only"), get_config('system','invitation_only'), t("Only allow new member registrations with an invitation code. Above register policy must be set to Yes.")),
'$minimum_age' => array('minimum_age', t("Minimum age"), (x(get_config('system','minimum_age'))?get_config('system','minimum_age'):13), t("Minimum age (in years) for who may register on this site.")),
'$access_policy' => array('access_policy', t("Which best describes the types of account offered by this hub?"), get_config('system','access_policy'), "This is displayed on the public server site list.", $access_choices),
'$access_policy' => array('access_policy', t("Which best describes the types of account offered by this hub?"), get_config('system','access_policy'), t("This is displayed on the public server site list."), $access_choices),
'$register_text' => array('register_text', t("Register text"), htmlspecialchars(get_config('system','register_text'), ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")),
'$role' => $role,
'$frontpage' => array('frontpage', t("Site homepage to show visitors (default: login box)"), get_config('system','frontpage'), t("example: 'public' to show public stream, 'page/sys/home' to show a system webpage called 'home' or 'include:home.html' to include a file.")),
'$frontpage' => array('frontpage', t("Site homepage to show visitors (default: login box)"), get_config('system','frontpage'), t("example: 'pubstream' to show public stream, 'page/sys/home' to show a system webpage called 'home' or 'include:home.html' to include a file.")),
'$mirror_frontpage' => array('mirror_frontpage', t("Preserve site homepage URL"), get_config('system','mirror_frontpage'), t('Present the site homepage in a frame at the original location instead of redirecting')),
'$abandon_days' => array('abandon_days', t('Accounts abandoned after x days'), get_config('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')),
'$allowed_sites' => array('allowed_sites', t("Allowed friend domains"), get_config('system','allowed_sites'), t("Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains")),

View File

@@ -90,12 +90,12 @@ class Appman extends \Zotlabs\Web\Controller {
$channel = \App::get_channel();
if(argc() > 2) {
if(argc() > 3) {
if(argv(2) === 'moveup') {
Zlib\Apps::moveup(local_channel(),argv(1));
Zlib\Apps::moveup(local_channel(),argv(1),argv(3));
}
if(argv(2) === 'movedown') {
Zlib\Apps::movedown(local_channel(),argv(1));
Zlib\Apps::movedown(local_channel(),argv(1),argv(3));
}
goaway(z_root() . '/apporder');
}
@@ -113,10 +113,12 @@ class Appman extends \Zotlabs\Web\Controller {
if($r) {
$app = $r[0];
$term = q("select * from term where otype = %d and oid = %d",
$term = q("select * from term where otype = %d and oid = %d and uid = %d",
intval(TERM_OBJ_APP),
intval($r[0]['id'])
intval($r[0]['id']),
intval(local_channel())
);
if($term) {
$app['categories'] = '';
foreach($term as $t) {

View File

@@ -17,25 +17,28 @@ class Apporder extends \Zotlabs\Web\Controller {
nav_set_selected('Order Apps');
$syslist = array();
$list = Zlib\Apps::app_list(local_channel(), false, ['nav_featured_app', 'nav_pinned_app']);
if($list) {
foreach($list as $li) {
$syslist[] = Zlib\Apps::app_encode($li);
foreach( [ 'nav_featured_app', 'nav_pinned_app' ] as $l ) {
$syslist = [];
$list = Zlib\Apps::app_list(local_channel(), false, [ $l ]);
if($list) {
foreach($list as $li) {
$syslist[] = Zlib\Apps::app_encode($li);
}
}
}
Zlib\Apps::translate_system_apps($syslist);
Zlib\Apps::translate_system_apps($syslist);
usort($syslist,'Zotlabs\\Lib\\Apps::app_name_compare');
usort($syslist,'Zotlabs\\Lib\\Apps::app_name_compare');
$syslist = Zlib\Apps::app_order(local_channel(),$syslist);
$syslist = Zlib\Apps::app_order(local_channel(),$syslist, $l);
foreach($syslist as $app) {
if(strpos($app['categories'],'nav_pinned_app') !== false) {
$navbar_apps[] = Zlib\Apps::app_render($app,'nav-order');
}
else {
$nav_apps[] = Zlib\Apps::app_render($app,'nav-order');
foreach($syslist as $app) {
if($l === 'nav_pinned_app') {
$navbar_apps[] = Zlib\Apps::app_render($app,'nav-order');
}
elseif(strpos($app['categories'],'nav_pinned_app') === false) {
$nav_apps[] = Zlib\Apps::app_render($app,'nav-order');
}
}
}

View File

@@ -47,11 +47,11 @@ class Apps extends \Zotlabs\Web\Controller {
return replace_macros(get_markup_template('myapps.tpl'), array(
'$sitename' => get_config('system','sitename'),
'$cat' => $cat,
'$title' => t('Apps'),
'$title' => (($available) ? t('Available Apps') : t('Installed Apps')),
'$apps' => $apps,
'$authed' => ((local_channel()) ? true : false),
'$manage' => (($available) ? '' : t('Manage apps')),
'$create' => (($mode == 'edit') ? t('Create new app') : '')
'$manage' => (($available) ? '' : t('Manage Apps')),
'$create' => (($mode == 'edit') ? t('Create Custom App') : '')
));
}

View File

@@ -122,7 +122,7 @@ class Article_edit extends \Zotlabs\Web\Controller {
'bbcode' => (($mimetype == 'text/bbcode') ? true : false)
);
$editor = status_editor($a, $x);
$editor = status_editor($a, $x, false, 'Article_edit');
$o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
'$title' => t('Edit Article'),

View File

@@ -1,19 +1,32 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\PermissionDescription;
require_once('include/channel.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
class Articles extends \Zotlabs\Web\Controller {
class Articles extends Controller {
function init() {
if(argc() > 1)
$which = argv(1);
else
return;
if(! $which) {
if(local_channel()) {
$channel = App::get_channel();
if($channel && $channel['channel_address'])
$which = $channel['channel_address'];
} else {
return;
}
}
profile_load($which);
@@ -25,22 +38,27 @@ class Articles extends \Zotlabs\Web\Controller {
return login();
}
if(! \App::$profile) {
if(! App::$profile) {
notice( t('Requested profile is not available.') . EOL );
\App::$error = 404;
App::$error = 404;
return;
}
if(! feature_enabled(\App::$profile_uid,'articles')) {
return;
if(! Apps::system_app_installed(App::$profile_uid, 'Articles')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Articles App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Create interactive articles');
return $o;
}
nav_set_selected(t('Articles'));
nav_set_selected('Articles');
head_add_link([
'rel' => 'alternate',
'type' => 'application/json+oembed',
'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string),
'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . App::$query_string),
'title' => 'oembed'
]);
@@ -48,19 +66,21 @@ class Articles extends \Zotlabs\Web\Controller {
$category = (($_REQUEST['cat']) ? escape_tags(trim($_REQUEST['cat'])) : '');
if($category) {
$sql_extra2 .= protect_sprintf(term_item_parent_query(\App::$profile['profile_uid'],'item', $category, TERM_CATEGORY));
$sql_extra2 .= protect_sprintf(term_item_parent_query(App::$profile['profile_uid'],'item', $category, TERM_CATEGORY));
}
$datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
$datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
$which = argv(1);
$selected_card = ((argc() > 2) ? argv(2) : '');
$_SESSION['return_url'] = \App::$query_string;
$_SESSION['return_url'] = App::$query_string;
$uid = local_channel();
$owner = \App::$profile_uid;
$observer = \App::get_observer();
$owner = App::$profile_uid;
$observer = App::get_observer();
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
@@ -98,7 +118,7 @@ class Articles extends \Zotlabs\Web\Controller {
'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid']
|| $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
'acl' => (($is_owner) ? populate_acl($channel_acl, false,
\Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')) : ''),
PermissionDescription::fromGlobalPermission('view_pages')) : ''),
'permissions' => $channel_acl,
'showacl' => (($is_owner) ? true : false),
'visitor' => true,
@@ -120,7 +140,7 @@ class Articles extends \Zotlabs\Web\Controller {
$x['title'] = $_REQUEST['title'];
if($_REQUEST['body'])
$x['body'] = $_REQUEST['body'];
$editor = status_editor($a,$x);
$editor = status_editor($a,$x,false,'Articles');
}
else {
@@ -128,8 +148,8 @@ class Articles extends \Zotlabs\Web\Controller {
}
$itemspage = get_pconfig(local_channel(),'system','itemspage');
\App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
$sql_extra = item_permissions_sql($owner);
@@ -143,10 +163,21 @@ class Articles extends \Zotlabs\Web\Controller {
$sql_item = "and item.id = " . intval($r[0]['iid']) . " ";
}
}
if($datequery) {
$sql_extra2 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery))));
$order = 'post';
}
if($datequery2) {
$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 ";
}
$r = q("select * from item
where item.uid = %d and item_type = %d
$sql_extra $sql_item order by item.created desc $pager_sql",
$sql_extra $sql_extra2 $sql_item order by item.created desc $pager_sql",
intval($owner),
intval(ITEM_TYPE_ARTICLE)
);
@@ -166,7 +197,7 @@ class Articles extends \Zotlabs\Web\Controller {
WHERE item.uid = %d $item_normal
AND item.parent IN ( %s )
$sql_extra $sql_extra2 ",
intval(\App::$profile['profile_uid']),
intval(App::$profile['profile_uid']),
dbesc($parents_str)
);
if($items) {

View File

@@ -7,27 +7,34 @@ use Zotlabs\Identity\OAuth2Storage;
class Authorize extends \Zotlabs\Web\Controller {
function get() {
if (!local_channel()) {
if (! local_channel()) {
return login();
} else {
// TODO: Fully implement the dynamic client registration protocol:
// OpenID Connect Dynamic Client Registration 1.0 Client Metadata
// http://openid.net/specs/openid-connect-registration-1_0.html
$app = array(
'name' => (x($_REQUEST, 'client_name') ? urldecode($_REQUEST['client_name']) : t('Unknown App')),
'icon' => (x($_REQUEST, 'logo_uri') ? urldecode($_REQUEST['logo_uri']) : z_root() . '/images/icons/plugin.png'),
'url' => (x($_REQUEST, 'client_uri') ? urldecode($_REQUEST['client_uri']) : ''),
);
$o .= replace_macros(get_markup_template('oauth_authorize.tpl'), array(
'$title' => t('Authorize'),
'$authorize' => sprintf( t('Do you authorize the app %s to access your channel data?'), '<a style="float: none;" href="' . $app['url'] . '">' . $app['name'] . '</a> '),
'$app' => $app,
'$yes' => t('Allow'),
'$no' => t('Deny'),
'$client_id' => (x($_REQUEST, 'client_id') ? $_REQUEST['client_id'] : ''),
}
else {
$name = $_REQUEST['client_name'];
if(! $name) {
$name = (($_REQUEST['client_id']) ?: t('Unknown App'));
}
$app = [
'name' => $name,
'icon' => (x($_REQUEST, 'logo_uri') ? $_REQUEST['logo_uri'] : z_root() . '/images/icons/plugin.png'),
'url' => (x($_REQUEST, 'client_uri') ? $_REQUEST['client_uri'] : ''),
];
$link = (($app['url']) ? '<a style="float: none;" href="' . $app['url'] . '">' . $app['name'] . '</a> ' : $app['name']);
$o .= replace_macros(get_markup_template('oauth_authorize.tpl'), [
'$title' => t('Authorize'),
'$authorize' => sprintf( t('Do you authorize the app %s to access your channel data?'), $link ),
'$app' => $app,
'$yes' => t('Allow'),
'$no' => t('Deny'),
'$client_id' => (x($_REQUEST, 'client_id') ? $_REQUEST['client_id'] : ''),
'$redirect_uri' => (x($_REQUEST, 'redirect_uri') ? $_REQUEST['redirect_uri'] : ''),
'$state' => (x($_REQUEST, 'state') ? $_REQUEST['state'] : ''),
));
'$state' => (x($_REQUEST, 'state') ? $_REQUEST['state'] : ''),
]);
return $o;
}
}
@@ -60,13 +67,16 @@ class Authorize extends \Zotlabs\Web\Controller {
$request = \OAuth2\Request::createFromGlobals();
$response = new \OAuth2\Response();
// Note, "sub" field must match type and content. $user_id is used to populate - make sure it's a string.
$channel = channelx_by_n(local_channel());
$user_id = $channel['channel_id'];
// If the client is not registered, add to the database
if (!$client = $storage->getClientDetails($client_id)) {
$client_secret = random_string(16);
// Until "Dynamic Client Registration" is pursued - allow new clients to assign their own secret in the REQUEST
$client_secret = (isset($_REQUEST['client_secret'])) ? $_REQUEST['client_secret'] : random_string(16);
// Client apps are registered per channel
$user_id = local_channel();
$storage->setClientDetails($client_id, $client_secret, $redirect_uri, 'authorization_code', null, $user_id);
$storage->setClientDetails($client_id, $client_secret, $redirect_uri, 'authorization_code', $_REQUEST['scope'], $user_id);
}
if (!$client = $storage->getClientDetails($client_id)) {
// There was an error registering the client.
@@ -83,7 +93,7 @@ class Authorize extends \Zotlabs\Web\Controller {
// print the authorization code if the user has authorized your client
$is_authorized = ($_POST['authorize'] === 'allow');
$s->handleAuthorizeRequest($request, $response, $is_authorized, local_channel());
$s->handleAuthorizeRequest($request, $response, $is_authorized, $user_id);
if ($is_authorized) {
$code = substr($response->getHttpHeader('Location'), strpos($response->getHttpHeader('Location'), 'code=') + 5, 40);
logger('Authorization Code: ' . $code);

View File

@@ -109,7 +109,7 @@ class Blocks extends \Zotlabs\Web\Controller {
if($_REQUEST['pagetitle'])
$x['pagetitle'] = $_REQUEST['pagetitle'];
$editor = status_editor($a,$x);
$editor = status_editor($a,$x,false,'Blocks');
$r = q("select iconfig.iid, iconfig.k, iconfig.v, mid, title, body, mimetype, created, edited from iconfig

View File

@@ -1,6 +1,9 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
class Bookmarks extends \Zotlabs\Web\Controller {
@@ -8,7 +11,10 @@ class Bookmarks extends \Zotlabs\Web\Controller {
if(! local_channel())
return;
nav_set_selected('View Bookmarks');
if(! Apps::system_app_installed(local_channel(), 'Bookmarks'))
return;
nav_set_selected('Bookmarks');
$item_id = intval($_REQUEST['item']);
$burl = trim($_REQUEST['burl']);
@@ -59,19 +65,26 @@ class Bookmarks extends \Zotlabs\Web\Controller {
killme();
}
function get() {
function get() {
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return;
}
if(! Apps::system_app_installed(local_channel(), 'Bookmarks')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Bookmarks App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Bookmark links from posts and manage them');
return $o;
}
require_once('include/menu.php');
require_once('include/conversation.php');
$channel = \App::get_channel();
//$o = profile_tabs($a,true,$channel['channel_address']);
$o = '';
$o .= '<div class="generic-content-wrapper-styled">';

View File

@@ -6,6 +6,7 @@ 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 Cal extends \Zotlabs\Web\Controller {
@@ -74,7 +75,7 @@ class Cal extends \Zotlabs\Web\Controller {
$sql_extra = permissions_sql($channel['channel_id'],get_observer_hash(),'event');
$first_day = get_pconfig(local_channel(),'system','cal_first_day');
$first_day = feature_enabled($channel['channel_id'], 'events_cal_first_day');
$first_day = (($first_day) ? $first_day : 0);
$htpl = get_markup_template('event_head.tpl');
@@ -88,9 +89,6 @@ class Cal extends \Zotlabs\Web\Controller {
$o = '';
//$tabs = profile_tabs($a, True, $channel['channel_address']);
$tabs = '';
$mode = 'view';
$y = 0;
$m = 0;
@@ -296,6 +294,7 @@ class Cal extends \Zotlabs\Web\Controller {
}
$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'],
@@ -347,8 +346,7 @@ class Cal extends \Zotlabs\Web\Controller {
'$next' => t('Next'),
'$today' => t('Today'),
'$form' => $form,
'$expandform' => ((x($_GET,'expandform')) ? true : false),
'$tabs' => $tabs
'$expandform' => ((x($_GET,'expandform')) ? true : false)
));
if (x($_GET,'id')){ echo $o; killme(); }

View File

@@ -122,7 +122,7 @@ class Card_edit extends \Zotlabs\Web\Controller {
'bbcode' => (($mimetype == 'text/bbcode') ? true : false)
);
$editor = status_editor($a, $x);
$editor = status_editor($a, $x, false, 'Card_edit');
$o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
'$title' => t('Edit Card'),

View File

@@ -1,12 +1,16 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\PermissionDescription;
require_once('include/channel.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
class Cards extends \Zotlabs\Web\Controller {
class Cards extends Controller {
function init() {
@@ -29,22 +33,27 @@ class Cards extends \Zotlabs\Web\Controller {
return login();
}
if(! \App::$profile) {
if(! App::$profile) {
notice( t('Requested profile is not available.') . EOL );
\App::$error = 404;
App::$error = 404;
return;
}
if(! feature_enabled(\App::$profile_uid, 'cards')) {
return;
if(! Apps::system_app_installed(App::$profile_uid, 'Cards')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Cards App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Create personal planning cards');
return $o;
}
nav_set_selected(t('Cards'));
nav_set_selected('Cards');
head_add_link([
'rel' => 'alternate',
'type' => 'application/json+oembed',
'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string),
'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . App::$query_string),
'title' => 'oembed'
]);
@@ -52,7 +61,7 @@ class Cards extends \Zotlabs\Web\Controller {
$category = (($_REQUEST['cat']) ? escape_tags(trim($_REQUEST['cat'])) : '');
if($category) {
$sql_extra2 .= protect_sprintf(term_item_parent_query(\App::$profile['profile_uid'], 'item', $category, TERM_CATEGORY));
$sql_extra2 .= protect_sprintf(term_item_parent_query(App::$profile['profile_uid'], 'item', $category, TERM_CATEGORY));
}
@@ -60,11 +69,11 @@ class Cards extends \Zotlabs\Web\Controller {
$selected_card = ((argc() > 2) ? argv(2) : '');
$_SESSION['return_url'] = \App::$query_string;
$_SESSION['return_url'] = App::$query_string;
$uid = local_channel();
$owner = \App::$profile_uid;
$observer = \App::get_observer();
$owner = App::$profile_uid;
$observer = App::get_observer();
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
@@ -101,8 +110,8 @@ class Cards extends \Zotlabs\Web\Controller {
'nickname' => $channel['channel_address'],
'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid']
|| $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
'acl' => (($is_owner) ? populate_acl($channel_acl, false,
\Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')) : ''),
'acl' => (($is_owner) ? populate_acl($channel_acl, false,
PermissionDescription::fromGlobalPermission('view_pages')) : ''),
'permissions' => $channel_acl,
'showacl' => (($is_owner) ? true : false),
'visitor' => true,
@@ -124,7 +133,7 @@ class Cards extends \Zotlabs\Web\Controller {
if($_REQUEST['body'])
$x['body'] = $_REQUEST['body'];
$editor = status_editor($a, $x);
$editor = status_editor($a, $x, false, 'Cards');
}
else {
$editor = '';
@@ -132,8 +141,8 @@ class Cards extends \Zotlabs\Web\Controller {
$itemspage = get_pconfig(local_channel(),'system','itemspage');
\App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
$sql_extra = item_permissions_sql($owner);
@@ -171,7 +180,7 @@ class Cards extends \Zotlabs\Web\Controller {
WHERE item.uid = %d $item_normal
AND item.parent IN ( %s )
$sql_extra $sql_extra2 ",
intval(\App::$profile['profile_uid']),
intval(App::$profile['profile_uid']),
dbesc($parents_str)
);
if($items) {

View File

@@ -1,12 +1,16 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
require_once('include/event.php');
require_once('include/auth.php');
require_once('include/security.php');
class Cdav extends \Zotlabs\Web\Controller {
class Cdav extends Controller {
function init() {
@@ -126,8 +130,18 @@ class Cdav extends \Zotlabs\Web\Controller {
$auth->setRealm(ucfirst(\Zotlabs\Lib\System::get_platform_name()) . 'CalDAV/CardDAV');
if (local_channel()) {
logger('loggedin');
$channel = \App::get_channel();
if((argv(1) == 'calendars') && (!Apps::system_app_installed(local_channel(), 'CalDAV'))) {
killme();
}
if((argv(1) == 'addressbooks') && (!Apps::system_app_installed(local_channel(), 'CardDAV'))) {
killme();
}
$channel = App::get_channel();
$auth->setCurrentUser($channel['channel_address']);
$auth->channel_id = $channel['channel_id'];
$auth->channel_hash = $channel['channel_hash'];
@@ -161,12 +175,15 @@ class Cdav extends \Zotlabs\Web\Controller {
$nodes = [
// /principals
new \Sabre\CalDAV\Principal\Collection($principalBackend),
// /calendars
new \Sabre\CalDAV\CalendarRoot($principalBackend, $caldavBackend),
// /addressbook
new \Sabre\CardDAV\AddressBookRoot($principalBackend, $carddavBackend),
new \Sabre\CardDAV\AddressBookRoot($principalBackend, $carddavBackend)
];
// The object tree needs in turn to be passed to the server class
$server = new \Sabre\DAV\Server($nodes);
@@ -204,7 +221,15 @@ class Cdav extends \Zotlabs\Web\Controller {
if(! local_channel())
return;
$channel = \App::get_channel();
if((argv(1) === 'calendar') && (! Apps::system_app_installed(local_channel(), 'CalDAV'))) {
return;
}
if((argv(1) === 'addressbook') && (! Apps::system_app_installed(local_channel(), 'CardDAV'))) {
return;
}
$channel = App::get_channel();
$principalUri = 'principals/' . $channel['channel_address'];
if(!cdav_principal($principalUri))
@@ -807,7 +832,27 @@ class Cdav extends \Zotlabs\Web\Controller {
if(!local_channel())
return;
$channel = \App::get_channel();
if((argv(1) === 'calendar') && (! Apps::system_app_installed(local_channel(), 'CalDAV'))) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('CalDAV App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('CalDAV capable calendar');
return $o;
}
if((argv(1) === 'addressbook') && (! Apps::system_app_installed(local_channel(), 'CardDAV'))) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('CardDAV App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('CalDAV capable addressbook');
return $o;
}
App::$profile_uid = local_channel();
$channel = App::get_channel();
$principalUri = 'principals/' . $channel['channel_address'];
$pdo = \DBA::$dba->db;
@@ -862,7 +907,7 @@ class Cdav extends \Zotlabs\Web\Controller {
$sources = rtrim($sources, ', ');
$first_day = get_pconfig(local_channel(),'system','cal_first_day');
$first_day = feature_enabled(local_channel(), 'cal_first_day');
$first_day = (($first_day) ? $first_day : 0);
$title = ['title', t('Event title')];
@@ -874,7 +919,7 @@ class Cdav extends \Zotlabs\Web\Controller {
$o .= replace_macros(get_markup_template('cdav_calendar.tpl'), [
'$sources' => $sources,
'$color' => $color,
'$lang' => \App::$language,
'$lang' => App::$language,
'$first_day' => $first_day,
'$prev' => t('Previous'),
'$next' => t('Next'),

View File

@@ -2,19 +2,23 @@
namespace Zotlabs\Module;
require_once('include/contact_widgets.php');
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\PermissionDescription;
require_once('include/items.php');
require_once("include/bbcode.php");
require_once('include/security.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
require_once('include/permissions.php');
/**
* @brief Channel Controller
*
*/
class Channel extends \Zotlabs\Web\Controller {
class Channel extends Controller {
function init() {
@@ -26,7 +30,7 @@ class Channel extends \Zotlabs\Web\Controller {
$which = argv(1);
if(! $which) {
if(local_channel()) {
$channel = \App::get_channel();
$channel = App::get_channel();
if($channel && $channel['channel_address'])
$which = $channel['channel_address'];
}
@@ -37,7 +41,7 @@ class Channel extends \Zotlabs\Web\Controller {
}
$profile = 0;
$channel = \App::get_channel();
$channel = App::get_channel();
if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
$which = $channel['channel_address'];
@@ -67,15 +71,20 @@ class Channel extends \Zotlabs\Web\Controller {
function get($update = 0, $load = false) {
$noscript_content = get_config('system', 'noscript_content', '1');
if($load)
$_SESSION['loadtime'] = datetime_convert();
$checkjs = new \Zotlabs\Web\CheckJS(1);
$category = $datequery = $datequery2 = '';
$mid = ((x($_REQUEST,'mid')) ? $_REQUEST['mid'] : '');
if(strpos($mid,'b64.') === 0)
$decoded = @base64url_decode(substr($mid,4));
if($decoded)
$mid = $decoded;
$datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
$datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
@@ -95,22 +104,22 @@ class Channel extends \Zotlabs\Web\Controller {
if($update) {
// Ensure we've got a profile owner if updating.
\App::$profile['profile_uid'] = \App::$profile_uid = $update;
App::$profile['profile_uid'] = App::$profile_uid = $update;
}
$is_owner = (((local_channel()) && (\App::$profile['profile_uid'] == local_channel())) ? true : false);
$is_owner = (((local_channel()) && (App::$profile['profile_uid'] == local_channel())) ? true : false);
$channel = \App::get_channel();
$observer = \App::get_observer();
$channel = App::get_channel();
$observer = App::get_observer();
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
$perms = get_all_perms(\App::$profile['profile_uid'],$ob_hash);
$perms = get_all_perms(App::$profile['profile_uid'],$ob_hash);
if(! $perms['view_stream']) {
// We may want to make the target of this redirect configurable
if($perms['view_profile']) {
notice( t('Insufficient permissions. Request redirected to profile page.') . EOL);
goaway (z_root() . "/profile/" . \App::$profile['channel_address']);
goaway (z_root() . "/profile/" . App::$profile['channel_address']);
}
notice( t('Permission denied.') . EOL);
return;
@@ -121,7 +130,7 @@ class Channel extends \Zotlabs\Web\Controller {
nav_set_selected('Channel Home');
$static = channel_manual_conv_update(\App::$profile['profile_uid']);
$static = channel_manual_conv_update(App::$profile['profile_uid']);
// search terms header
if($search) {
@@ -147,16 +156,16 @@ class Channel extends \Zotlabs\Web\Controller {
$x = array(
'is_owner' => $is_owner,
'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig(\App::$profile['profile_uid'],'system','use_browser_location')))) ? true : false),
'default_location' => (($is_owner) ? \App::$profile['channel_location'] : ''),
'nickname' => \App::$profile['channel_address'],
'lockstate' => (((strlen(\App::$profile['channel_allow_cid'])) || (strlen(\App::$profile['channel_allow_gid'])) || (strlen(\App::$profile['channel_deny_cid'])) || (strlen(\App::$profile['channel_deny_gid']))) ? 'lock' : 'unlock'),
'acl' => (($is_owner) ? populate_acl($channel_acl,true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post') : ''),
'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig(App::$profile['profile_uid'],'system','use_browser_location')))) ? true : false),
'default_location' => (($is_owner) ? App::$profile['channel_location'] : ''),
'nickname' => App::$profile['channel_address'],
'lockstate' => (((strlen(App::$profile['channel_allow_cid'])) || (strlen(App::$profile['channel_allow_gid'])) || (strlen(App::$profile['channel_deny_cid'])) || (strlen(App::$profile['channel_deny_gid']))) ? 'lock' : 'unlock'),
'acl' => (($is_owner) ? populate_acl($channel_acl,true, PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post') : ''),
'permissions' => $channel_acl,
'showacl' => (($is_owner) ? 'yes' : ''),
'bang' => '',
'visitor' => (($is_owner || $observer) ? true : false),
'profile_uid' => \App::$profile['profile_uid'],
'profile_uid' => App::$profile['profile_uid'],
'editor_autocomplete' => true,
'bbco_autocomplete' => 'bbcode',
'bbcode' => true,
@@ -164,7 +173,7 @@ class Channel extends \Zotlabs\Web\Controller {
'reset' => t('Reset form')
);
$o .= status_editor($a,$x);
$o .= status_editor($a,$x,false,'Channel');
}
}
@@ -176,14 +185,14 @@ class Channel extends \Zotlabs\Web\Controller {
$item_normal = item_normal();
$item_normal_update = item_normal_update();
$sql_extra = item_permissions_sql(\App::$profile['profile_uid']);
$sql_extra = item_permissions_sql(App::$profile['profile_uid']);
if(get_pconfig(\App::$profile['profile_uid'],'system','channel_list_mode') && (! $mid))
if(feature_enabled(App::$profile['profile_uid'], 'channel_list_mode') && (! $mid))
$page_mode = 'list';
else
$page_mode = 'client';
$abook_uids = " and abook.abook_channel = " . intval(\App::$profile['profile_uid']) . " ";
$abook_uids = " and abook.abook_channel = " . intval(App::$profile['profile_uid']) . " ";
$simple_update = (($update) ? " AND item_unseen = 1 " : '');
@@ -193,7 +202,8 @@ class Channel extends \Zotlabs\Web\Controller {
$sql_extra .= term_query('item',substr($search,1),TERM_HASHTAG,TERM_COMMUNITYTAG);
}
else {
$sql_extra .= sprintf(" AND item.body like '%s' ",
$sql_extra .= sprintf(" AND (item.body like '%s' OR item.title like '%s') ",
dbesc(protect_sprintf('%' . $search . '%')),
dbesc(protect_sprintf('%' . $search . '%'))
);
}
@@ -203,7 +213,7 @@ class Channel extends \Zotlabs\Web\Controller {
head_add_link([
'rel' => 'alternate',
'type' => 'application/json+oembed',
'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string),
'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . App::$query_string),
'title' => 'oembed'
]);
@@ -221,7 +231,7 @@ class Channel extends \Zotlabs\Web\Controller {
$r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal_update
AND item_wall = 1 $simple_update $sql_extra limit 1",
dbesc($mid . '%'),
intval(\App::$profile['profile_uid'])
intval(App::$profile['profile_uid'])
);
$_SESSION['loadtime'] = datetime_convert();
}
@@ -233,7 +243,7 @@ class Channel extends \Zotlabs\Web\Controller {
AND (abook.abook_blocked = 0 or abook.abook_flags is null)
$sql_extra
ORDER BY created DESC",
intval(\App::$profile['profile_uid'])
intval(App::$profile['profile_uid'])
);
$_SESSION['loadtime'] = datetime_convert();
}
@@ -242,10 +252,10 @@ class Channel extends \Zotlabs\Web\Controller {
else {
if(x($category)) {
$sql_extra2 .= protect_sprintf(term_item_parent_query(\App::$profile['profile_uid'],'item', $category, TERM_CATEGORY));
$sql_extra2 .= protect_sprintf(term_item_parent_query(App::$profile['profile_uid'],'item', $category, TERM_CATEGORY));
}
if(x($hashtags)) {
$sql_extra2 .= protect_sprintf(term_item_parent_query(\App::$profile['profile_uid'],'item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
$sql_extra2 .= protect_sprintf(term_item_parent_query(App::$profile['profile_uid'],'item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
}
if($datequery) {
@@ -267,15 +277,15 @@ class Channel extends \Zotlabs\Web\Controller {
$itemspage = get_pconfig(local_channel(),'system','itemspage');
\App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
if($load || ($checkjs->disabled())) {
if($noscript_content || $load) {
if($mid) {
$r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal
AND item_wall = 1 $sql_extra limit 1",
dbesc($mid . '%'),
intval(\App::$profile['profile_uid'])
intval(App::$profile['profile_uid'])
);
if (! $r) {
notice( t('Permission denied.') . EOL);
@@ -289,7 +299,7 @@ class Channel extends \Zotlabs\Web\Controller {
AND item.item_wall = 1 AND item.item_thread_top = 1
$sql_extra $sql_extra2
ORDER BY $ordering DESC $pager_sql ",
intval(\App::$profile['profile_uid'])
intval(App::$profile['profile_uid'])
);
}
}
@@ -306,7 +316,7 @@ class Channel extends \Zotlabs\Web\Controller {
WHERE item.uid = %d $item_normal
AND item.parent IN ( %s )
$sql_extra ",
intval(\App::$profile['profile_uid']),
intval(App::$profile['profile_uid']),
dbesc($parents_str)
);
@@ -326,22 +336,25 @@ class Channel extends \Zotlabs\Web\Controller {
if((! $update) && (! $load)) {
if($decoded)
$mid = 'b64.' . base64url_encode($mid);
// This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
// because browser prefetching might change it on us. We have to deliver it with the page.
$maxheight = get_pconfig(\App::$profile['profile_uid'],'system','channel_divmore_height');
$maxheight = get_pconfig(App::$profile['profile_uid'],'system','channel_divmore_height');
if(! $maxheight)
$maxheight = 400;
$o .= '<div id="live-channel"></div>' . "\r\n";
$o .= "<script> var profile_uid = " . \App::$profile['profile_uid']
. "; var netargs = '?f='; var profile_page = " . \App::$pager['page']
$o .= "<script> var profile_uid = " . App::$profile['profile_uid']
. "; var netargs = '?f='; var profile_page = " . App::$pager['page']
. "; divmore_height = " . intval($maxheight) . "; </script>\r\n";
\App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
'$baseurl' => z_root(),
'$pgtype' => 'channel',
'$uid' => ((\App::$profile['profile_uid']) ? \App::$profile['profile_uid'] : '0'),
'$uid' => ((App::$profile['profile_uid']) ? App::$profile['profile_uid'] : '0'),
'$gid' => '0',
'$cid' => '0',
'$cmin' => '(-1)',
@@ -354,7 +367,7 @@ class Channel extends \Zotlabs\Web\Controller {
'$wall' => '1',
'$fh' => '0',
'$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
'$search' => $search,
'$xchan' => '',
'$order' => $order,
@@ -405,17 +418,26 @@ class Channel extends \Zotlabs\Web\Controller {
$mode = (($search) ? 'search' : 'channel');
if($checkjs->disabled()) {
$o .= conversation($items,$mode,$update,'traditional');
}
else {
if($update) {
$o .= conversation($items,$mode,$update,$page_mode);
}
else {
$o .= '<noscript>';
if($noscript_content) {
$o .= conversation($items,$mode,$update,'traditional');
$o .= alt_pager(count($items));
}
else {
$o .= '<div class="section-content-warning-wrapper">' . t('You must enable javascript for your browser to be able to view this content.') . '</div>';
}
$o .= '</noscript>';
$o .= conversation($items,$mode,$update,$page_mode);
if((! $update) || ($checkjs->disabled())) {
$o .= alt_pager(count($items));
if ($mid && $items[0]['title'])
\App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title'];
App::$page['title'] = $items[0]['title'] . " - " . App::$page['title'];
}
if($mid)

View File

@@ -1,13 +1,19 @@
<?php /** @file */
namespace Zotlabs\Module;
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Chatroom;
use Zotlabs\Access\AccessList;
require_once('include/bookmarks.php');
use \Zotlabs\Lib as Zlib;
class Chat extends \Zotlabs\Web\Controller {
class Chat extends Controller {
function init() {
@@ -16,7 +22,7 @@ class Chat extends \Zotlabs\Web\Controller {
$which = argv(1);
if(! $which) {
if(local_channel()) {
$channel = \App::get_channel();
$channel = App::get_channel();
if($channel && $channel['channel_address'])
$which = $channel['channel_address'];
}
@@ -27,7 +33,7 @@ class Chat extends \Zotlabs\Web\Controller {
}
$profile = 0;
$channel = \App::get_channel();
$channel = App::get_channel();
if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
$which = $channel['channel_address'];
@@ -49,16 +55,16 @@ class Chat extends \Zotlabs\Web\Controller {
if((! $room) || (! local_channel()))
return;
$channel = \App::get_channel();
$channel = App::get_channel();
if($_POST['action'] === 'drop') {
logger('delete chatroom');
Zlib\Chatroom::destroy($channel,array('cr_name' => $room));
Chatroom::destroy($channel,array('cr_name' => $room));
goaway(z_root() . '/chat/' . $channel['channel_address']);
}
$acl = new \Zotlabs\Access\AccessList($channel);
$acl = new AccessList($channel);
$acl->set_from_array($_REQUEST);
$arr = $acl->get();
@@ -67,7 +73,7 @@ class Chat extends \Zotlabs\Web\Controller {
if(intval($arr['expire']) < 0)
$arr['expire'] = 0;
Zlib\Chatroom::create($channel,$arr);
Chatroom::create($channel,$arr);
$x = q("select * from chatroom where cr_name = '%s' and cr_uid = %d limit 1",
dbesc($room),
@@ -88,26 +94,35 @@ class Chat extends \Zotlabs\Web\Controller {
function get() {
if(! Apps::system_app_installed(App::$profile_uid, 'Chatrooms')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Chatrooms App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Access Controlled Chatrooms');
return $o;
}
if(local_channel()) {
$channel = \App::get_channel();
nav_set_selected('My Chatrooms');
$channel = App::get_channel();
nav_set_selected('Chatrooms');
}
$ob = \App::get_observer();
$ob = App::get_observer();
$observer = get_observer_hash();
if(! $observer) {
notice( t('Permission denied.') . EOL);
return;
}
if(! perm_is_allowed(\App::$profile['profile_uid'],$observer,'chat')) {
if(! perm_is_allowed(App::$profile['profile_uid'],$observer,'chat')) {
notice( t('Permission denied.') . EOL);
return;
}
if((argc() > 3) && intval(argv(2)) && (argv(3) === 'leave')) {
Zlib\Chatroom::leave($observer,argv(2),$_SERVER['REMOTE_ADDR']);
Chatroom::leave($observer,argv(2),$_SERVER['REMOTE_ADDR']);
goaway(z_root() . '/channel/' . argv(1));
}
@@ -160,16 +175,16 @@ class Chat extends \Zotlabs\Web\Controller {
$room_id = intval(argv(2));
$bookmark_link = get_bookmark_link($ob);
$x = Zlib\Chatroom::enter($observer,$room_id,'online',$_SERVER['REMOTE_ADDR']);
$x = Chatroom::enter($observer,$room_id,'online',$_SERVER['REMOTE_ADDR']);
if(! $x)
return;
$x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
intval($room_id),
intval(\App::$profile['profile_uid'])
intval(App::$profile['profile_uid'])
);
if($x) {
$acl = new \Zotlabs\Access\AccessList(false);
$acl = new AccessList(false);
$acl->set($x[0]);
$private = $acl->is_private();
@@ -208,19 +223,12 @@ class Chat extends \Zotlabs\Web\Controller {
));
return $o;
}
require_once('include/conversation.php');
//$o = profile_tabs($a,((local_channel() && local_channel() == \App::$profile['profile_uid']) ? true : false),\App::$profile['channel_address']);
$o = '';
if(! feature_enabled(\App::$profile['profile_uid'],'ajaxchat')) {
notice( t('Feature disabled.') . EOL);
return $o;
}
$acl = new \Zotlabs\Access\AccessList($channel);
$acl = new AccessList($channel);
$channel_acl = $acl->get();
$lockstate = (($channel_acl['allow_cid'] || $channel_acl['allow_gid'] || $channel_acl['deny_cid'] || $channel_acl['deny_gid']) ? 'lock' : 'unlock');
@@ -244,17 +252,17 @@ class Chat extends \Zotlabs\Web\Controller {
));
}
$rooms = Zlib\Chatroom::roomlist(\App::$profile['profile_uid']);
$rooms = Chatroom::roomlist(App::$profile['profile_uid']);
$o .= replace_macros(get_markup_template('chatrooms.tpl'), array(
'$header' => sprintf( t('%1$s\'s Chatrooms'), \App::$profile['fullname']),
'$header' => sprintf( t('%1$s\'s Chatrooms'), App::$profile['fullname']),
'$name' => t('Name'),
'$baseurl' => z_root(),
'$nickname' => \App::$profile['channel_address'],
'$nickname' => App::$profile['channel_address'],
'$rooms' => $rooms,
'$norooms' => t('No chatrooms available'),
'$newroom' => t('Create New'),
'$is_owner' => ((local_channel() && local_channel() == \App::$profile['profile_uid']) ? 1 : 0),
'$is_owner' => ((local_channel() && local_channel() == App::$profile['profile_uid']) ? 1 : 0),
'$chatroom_new' => $chatroom_new,
'$expire' => t('Expiration'),
'$expire_unit' => t('min') //minutes

View File

@@ -1,21 +1,21 @@
<?php
namespace Zotlabs\Module; /** @file */
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Apps;
require_once('include/contact_widgets.php');
require_once('include/items.php');
class Connect extends \Zotlabs\Web\Controller {
class Connect extends Controller {
function init() {
if(argc() > 1)
$which = argv(1);
else {
notice( t('Requested profile is not available.') . EOL );
\App::$error = 404;
App::$error = 404;
return;
}
@@ -24,20 +24,32 @@ class Connect extends \Zotlabs\Web\Controller {
);
if($r)
\App::$data['channel'] = $r[0];
App::$data['channel'] = $r[0];
$channel_id = App::$data['channel']['channel_id'];
if(! Apps::system_app_installed($channel_id, 'Premium Channel')) {
return;
}
profile_load($which,'');
}
function post() {
if(! array_key_exists('channel', \App::$data))
if(! array_key_exists('channel', App::$data))
return;
$channel_id = App::$data['channel']['channel_id'];
if(! Apps::system_app_installed($channel_id, 'Premium Channel')) {
return;
}
$edit = ((local_channel() && (local_channel() == \App::$data['channel']['channel_id'])) ? true : false);
$edit = ((local_channel() && (local_channel() == $channel_id)) ? true : false);
if($edit) {
$has_premium = ((\App::$data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? 1 : 0);
$has_premium = ((App::$data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? 1 : 0);
$premium = (($_POST['premium']) ? intval($_POST['premium']) : 0);
$text = escape_tags($_POST['text']);
@@ -48,25 +60,25 @@ class Connect extends \Zotlabs\Web\Controller {
intval(local_channel())
);
\Zotlabs\Daemon\Master::Summon(array('Notifier','refresh_all',\App::$data['channel']['channel_id']));
\Zotlabs\Daemon\Master::Summon(array('Notifier','refresh_all',$channel_id));
}
set_pconfig(\App::$data['channel']['channel_id'],'system','selltext',$text);
set_pconfig($channel_id,'system','selltext',$text);
// reload the page completely to get fresh data
goaway(z_root() . '/' . \App::$query_string);
goaway(z_root() . '/' . App::$query_string);
}
$url = '';
$observer = \App::get_observer();
$observer = App::get_observer();
if(($observer) && ($_POST['submit'] === t('Continue'))) {
if($observer['xchan_follow'])
$url = sprintf($observer['xchan_follow'],urlencode(channel_reddress(\App::$data['channel'])));
$url = sprintf($observer['xchan_follow'],urlencode(channel_reddress(App::$data['channel'])));
if(! $url) {
$r = q("select * from hubloc where hubloc_hash = '%s' order by hubloc_id desc limit 1",
dbesc($observer['xchan_hash'])
);
if($r)
$url = $r[0]['hubloc_url'] . '/follow?f=&url=' . urlencode(channel_reddress(\App::$data['channel']));
$url = $r[0]['hubloc_url'] . '/follow?f=&url=' . urlencode(channel_reddress(App::$data['channel']));
}
}
if($url)
@@ -79,17 +91,31 @@ class Connect extends \Zotlabs\Web\Controller {
function get() {
if(! array_key_exists('channel', App::$data))
return;
$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() == \App::$data['channel']['channel_id'])) ? true : false);
$edit = ((local_channel() && (local_channel() == $channel_id)) ? true : false);
$text = get_pconfig(\App::$data['channel']['channel_id'],'system','selltext');
$text = get_pconfig($channel_id,'system','selltext');
if($edit) {
$o = replace_macros(get_markup_template('sellpage_edit.tpl'),array(
'$header' => t('Premium Channel Setup'),
'$address' => \App::$data['channel']['channel_address'],
'$premium' => array('premium', t('Enable premium channel connection restrictions'),((\App::$data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? '1' : ''),''),
'$address' => App::$data['channel']['channel_address'],
'$premium' => array('premium', t('Enable premium channel connection restrictions'),((App::$data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? '1' : ''),''),
'$lbl_about' => t('Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc.'),
'$text' => $text,
'$desc' => t('This channel may require additional steps or acknowledgement of the following conditions prior to connecting:'),
@@ -107,7 +133,7 @@ class Connect extends \Zotlabs\Web\Controller {
$submit = replace_macros(get_markup_template('sellpage_submit.tpl'), array(
'$continue' => t('Continue'),
'$address' => \App::$data['channel']['channel_address']
'$address' => App::$data['channel']['channel_address']
));
$o = replace_macros(get_markup_template('sellpage_view.tpl'),array(
@@ -120,7 +146,7 @@ class Connect extends \Zotlabs\Web\Controller {
));
$arr = array('channel' => \App::$data['channel'],'observer' => \App::get_observer(), 'sellpage' => $o, 'submit' => $submit);
$arr = array('channel' => App::$data['channel'],'observer' => App::get_observer(), 'sellpage' => $o, 'submit' => $submit);
call_hooks('connect_premium', $arr);
$o = $arr['sellpage'];

View File

@@ -1,6 +1,7 @@
<?php
namespace Zotlabs\Module;
use App;
require_once('include/socgraph.php');
require_once('include/selectors.php');
@@ -12,8 +13,10 @@ class Connections extends \Zotlabs\Web\Controller {
if(! local_channel())
return;
App::$profile_uid = local_channel();
$channel = \App::get_channel();
$channel = App::get_channel();
if($channel)
head_set_icon($channel['xchan_photo_s']);
@@ -43,7 +46,7 @@ class Connections extends \Zotlabs\Web\Controller {
$all = false;
if(! $_REQUEST['aj'])
$_SESSION['return_url'] = \App::$query_string;
$_SESSION['return_url'] = App::$query_string;
$search_flags = "";
$head = '';
@@ -88,14 +91,14 @@ class Connections extends \Zotlabs\Web\Controller {
$search_flags = " and abook_pending = 1 ";
$head = t('New');
$pending = true;
\App::$argv[1] = 'pending';
App::$argv[1] = 'pending';
}
else {
$head = t('All');
$search_flags = '';
$all = true;
\App::$argc = 1;
unset(\App::$argv[1]);
App::$argc = 1;
unset(App::$argv[1]);
}
break;
// case 'unconnected':
@@ -217,7 +220,7 @@ class Connections extends \Zotlabs\Web\Controller {
$sql_extra .= (($searching) ? protect_sprintf(" AND xchan_name like '%$search_txt%' ") : "");
if($_REQUEST['gid']) {
$sql_extra .= " and xchan_hash in ( select xchan from group_member where gid = " . intval($_REQUEST['gid']) . " and uid = " . intval(local_channel()) . " ) ";
$sql_extra .= " and xchan_hash in ( select xchan from pgrp_member where gid = " . intval($_REQUEST['gid']) . " and uid = " . intval(local_channel()) . " ) ";
}
$r = q("SELECT COUNT(abook.abook_id) AS total FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
@@ -225,15 +228,15 @@ class Connections extends \Zotlabs\Web\Controller {
intval(local_channel())
);
if($r) {
\App::set_pager_total($r[0]['total']);
App::set_pager_total($r[0]['total']);
$total = $r[0]['total'];
}
$r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
WHERE abook_channel = %d and abook_self = 0 and xchan_deleted = 0 and xchan_orphan = 0 $sql_extra $sql_extra2 ORDER BY xchan_name LIMIT %d OFFSET %d ",
intval(local_channel()),
intval(\App::$pager['itemspage']),
intval(\App::$pager['start'])
intval(App::$pager['itemspage']),
intval(App::$pager['start'])
);
$contacts = array();
@@ -337,7 +340,7 @@ class Connections extends \Zotlabs\Web\Controller {
'$finding' => (($searching) ? t('Connections search') . ": '" . $search . "'" : ""),
'$submit' => t('Find'),
'$edit' => t('Edit'),
'$cmd' => \App::$cmd,
'$cmd' => App::$cmd,
'$contacts' => $contacts,
'$paginate' => paginate($a),

View File

@@ -7,6 +7,7 @@ namespace Zotlabs\Module;
*
*/
use Zotlabs\Lib\Apps;
require_once('include/socgraph.php');
require_once('include/selectors.php');
@@ -774,7 +775,7 @@ class Connedit extends \Zotlabs\Web\Controller {
$global_perms = \Zotlabs\Access\Permissions::Perms();
$existing = get_all_perms(local_channel(),$contact['abook_xchan']);
$existing = get_all_perms(local_channel(),$contact['abook_xchan'],false);
$unapproved = array('pending', t('Approve this connection'), '', t('Accept connection to allow communication'), array(t('No'),('Yes')));
@@ -851,7 +852,7 @@ class Connedit extends \Zotlabs\Web\Controller {
'$autoperms' => array('autoperms',t('Apply these permissions automatically'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('Connection requests will be approved without your interaction'), $yes_no),
'$permcat' => [ 'permcat', t('Permission role'), '', '<span class="loading invisible">' . t('Loading') . '<span class="jumping-dots"><span class="dot-1">.</span><span class="dot-2">.</span><span class="dot-3">.</span></span></span>',$permcats ],
'$permcat_new' => t('Add permission role'),
'$permcat_enable' => feature_enabled(local_channel(),'permcats'),
'$permcat_enable' => Apps::system_app_installed(local_channel(), 'Permission Categories'),
'$addr' => unpunify($contact['xchan_addr']),
'$primeurl' => unpunify($contact['xchan_url']),
'$section' => $section,

View File

@@ -23,7 +23,7 @@ class Contactgroup extends \Zotlabs\Web\Controller {
if((argc() > 1) && (intval(argv(1)))) {
$r = q("SELECT * FROM groups WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1",
$r = q("SELECT * FROM pgrp WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1",
intval(argv(1)),
intval(local_channel())
);

View File

@@ -1,14 +1,16 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
require_once('include/socgraph.php');
require_once('include/selectors.php');
require_once('include/group.php');
require_once('include/photos.php');
class Defperms extends \Zotlabs\Web\Controller {
class Defperms extends Controller {
/* @brief Initialize the connection-editor
*
@@ -19,6 +21,9 @@ class Defperms extends \Zotlabs\Web\Controller {
if(! local_channel())
return;
if(! Apps::system_app_installed(local_channel(), 'Default Permissions'))
return;
$r = q("SELECT abook.*, xchan.*
FROM abook left join xchan on abook_xchan = xchan_hash
@@ -26,10 +31,10 @@ class Defperms extends \Zotlabs\Web\Controller {
intval(local_channel())
);
if($r) {
\App::$poi = $r[0];
App::$poi = $r[0];
}
$channel = \App::get_channel();
$channel = App::get_channel();
if($channel)
head_set_icon($channel['xchan_photo_s']);
}
@@ -43,12 +48,15 @@ class Defperms extends \Zotlabs\Web\Controller {
if(! local_channel())
return;
if(! Apps::system_app_installed(local_channel(), 'Default Permissions'))
return;
$contact_id = intval(argv(1));
if(! $contact_id)
return;
$channel = \App::get_channel();
$channel = App::get_channel();
$orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
intval($contact_id),
@@ -112,7 +120,7 @@ class Defperms extends \Zotlabs\Web\Controller {
intval($contact_id)
);
if($r) {
\App::$poi = $r[0];
App::$poi = $r[0];
}
@@ -131,22 +139,22 @@ class Defperms extends \Zotlabs\Web\Controller {
function defperms_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']);
@@ -173,9 +181,18 @@ class Defperms extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
return login();
}
if(! Apps::system_app_installed(local_channel(), 'Default Permissions')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Default Permissions App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Set custom default permissions for new connections');
return $o;
}
$section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
$channel = \App::get_channel();
$channel = App::get_channel();
$yes_no = array(t('No'),t('Yes'));
@@ -193,7 +210,7 @@ class Defperms extends \Zotlabs\Web\Controller {
}
$o .= " }\n</script>\n";
if(\App::$poi) {
if(App::$poi) {
$sections = [];
@@ -203,13 +220,12 @@ class Defperms extends \Zotlabs\Web\Controller {
$perms = array();
$channel = \App::get_channel();
$channel = App::get_channel();
$contact = \App::$poi;
$contact = App::$poi;
$global_perms = \Zotlabs\Access\Permissions::Perms();
$existing = get_all_perms(local_channel(),$contact['abook_xchan']);
$hidden_perms = [];
foreach($global_perms as $k => $v) {
@@ -239,7 +255,7 @@ class Defperms extends \Zotlabs\Web\Controller {
'$autoperms' => array('autoperms',t('Apply these permissions automatically'), ((get_pconfig(local_channel(),'system','autoperms')) ? 1 : 0), t('If enabled, connection requests will be approved without your interaction'), $yes_no),
'$permcat' => [ 'permcat', t('Permission role'), '', '<span class="loading invisible">' . t('Loading') . '<span class="jumping-dots"><span class="dot-1">.</span><span class="dot-2">.</span><span class="dot-3">.</span></span></span>',$permcats ],
'$permcat_new' => t('Add permission role'),
'$permcat_enable' => feature_enabled(local_channel(),'permcats'),
'$permcat_enable' => Apps::system_app_installed(local_channel(), 'Permission Categories'),
'$section' => $section,
'$sections' => $sections,
'$autolbl' => t('The permissions indicated on this page will be applied to all new connections.'),

View File

@@ -12,13 +12,16 @@ class Directory extends \Zotlabs\Web\Controller {
function init() {
\App::set_pager_itemspage(60);
if(x($_GET,'ignore')) {
if(local_channel() && x($_GET,'ignore')) {
q("insert into xign ( uid, xchan ) values ( %d, '%s' ) ",
intval(local_channel()),
dbesc($_GET['ignore'])
);
goaway(z_root() . '/directory?f=&suggest=1');
}
if(local_channel())
\App::$profile_uid = local_channel();
$observer = get_observer_hash();
$global_changed = false;
@@ -55,6 +58,7 @@ class Directory extends \Zotlabs\Web\Controller {
if($observer)
set_xconfig($observer,'directory','pubforums',$pubforums);
}
}
function get() {

View File

@@ -12,8 +12,9 @@ class Display extends \Zotlabs\Web\Controller {
function get($update = 0, $load = false) {
$module_format = 'html';
$noscript_content = (get_config('system', 'noscript_content', '1') && (! $update));
$module_format = 'html';
if(argc() > 1) {
$module_format = substr(argv(1),strrpos(argv(1),'.') + 1);
@@ -21,8 +22,6 @@ class Display extends \Zotlabs\Web\Controller {
$module_format = 'html';
}
$checkjs = new \Zotlabs\Web\CheckJS(1);
if($load)
$_SESSION['loadtime'] = datetime_convert();
@@ -82,7 +81,7 @@ class Display extends \Zotlabs\Web\Controller {
);
$o = '<div id="jot-popup">';
$o .= status_editor($a,$x);
$o .= status_editor($a,$x,false,'Display');
$o .= '</div>';
}
@@ -253,53 +252,44 @@ class Display extends \Zotlabs\Web\Controller {
$sql_extra = public_permissions_sql($observer_hash);
if(($update && $load) || ($checkjs->disabled()) || ($module_format !== 'html')) {
if($noscript_content || $load) {
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']),intval(\App::$pager['start']));
$r = null;
if($load || ($checkjs->disabled()) || ($module_format !== 'html')) {
require_once('include/channel.php');
$sys = get_sys_channel();
$sysid = $sys['channel_id'];
$r = null;
require_once('include/channel.php');
$sys = get_sys_channel();
$sysid = $sys['channel_id'];
if(local_channel()) {
$r = q("SELECT item.id as item_id from item
WHERE uid = %d
and mid = '%s'
$item_normal
limit 1",
intval(local_channel()),
dbesc($target_item['parent_mid'])
);
if($r) {
$updateable = true;
}
if(local_channel()) {
$r = q("SELECT item.id as item_id from item WHERE uid = %d and mid = '%s' $item_normal limit 1",
intval(local_channel()),
dbesc($target_item['parent_mid'])
);
if($r) {
$updateable = true;
}
}
if(! $r) {
if(! $r) {
// in case somebody turned off public access to sys channel content using permissions
// make that content unsearchable by ensuring the owner uid can't match
// in case somebody turned off public access to sys channel content using permissions
// make that content unsearchable by ensuring the owner uid can't match
if(! perm_is_allowed($sysid,$observer_hash,'view_stream'))
$sysid = 0;
if(! perm_is_allowed($sysid,$observer_hash,'view_stream'))
$sysid = 0;
$r = q("SELECT item.id as item_id from item
WHERE mid = '%s'
AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
AND item.deny_gid = '' AND item_private = 0 )
and uid in ( " . stream_perms_api_uids(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
OR uid = %d )
$sql_extra )
$item_normal
limit 1",
dbesc($target_item['parent_mid']),
intval($sysid)
);
}
$r = q("SELECT item.id as item_id from item
WHERE mid = '%s'
AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
AND item.deny_gid = '' AND item_private = 0 )
and uid in ( " . stream_perms_api_uids(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
OR uid = %d )
$sql_extra )
$item_normal
limit 1",
dbesc($target_item['parent_mid']),
intval($sysid)
);
}
}
@@ -309,7 +299,6 @@ class Display extends \Zotlabs\Web\Controller {
require_once('include/channel.php');
$sys = get_sys_channel();
$sysid = $sys['channel_id'];
if(local_channel()) {
$r = q("SELECT item.parent AS item_id from item
WHERE uid = %d
@@ -350,7 +339,7 @@ class Display extends \Zotlabs\Web\Controller {
else {
$r = array();
}
if($r) {
$parents_str = ids_to_querystr($r,'item_id');
if($parents_str) {
@@ -373,14 +362,23 @@ class Display extends \Zotlabs\Web\Controller {
case 'html':
if ($checkjs->disabled()) {
$o .= conversation($items, 'display', $update, 'traditional');
if ($items[0]['title'])
\App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title'];
}
else {
if ($update) {
$o .= conversation($items, 'display', $update, 'client');
}
else {
$o .= '<noscript>';
if($noscript_content) {
$o .= conversation($items, 'display', $update, 'traditional');
}
else {
$o .= '<div class="section-content-warning-wrapper">' . t('You must enable javascript for your browser to be able to view this content.') . '</div>';
}
$o .= '</noscript>';
\App::$page['title'] = (($items[0]['title']) ? $items[0]['title'] . " - " . \App::$page['title'] : \App::$page['title']);
$o .= conversation($items, 'display', $update, 'client');
}
break;
@@ -435,7 +433,7 @@ class Display extends \Zotlabs\Web\Controller {
$o .= '<div id="content-complete"></div>';
if((($update && $load) || $checkjs->disabled()) && (! $items)) {
if((($update && $load) || $noscript_content) && (! $items)) {
$r = q("SELECT id, item_deleted FROM item WHERE mid = '%s' LIMIT 1",
dbesc($item_hash)

View File

@@ -132,7 +132,7 @@ class Editblock extends \Zotlabs\Web\Controller {
'bbcode' => (($mimetype == 'text/bbcode') ? true : false)
);
$editor = status_editor($a, $x);
$editor = status_editor($a, $x, false, 'Editblock');
$o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
'$title' => t('Edit Block'),

View File

@@ -131,7 +131,7 @@ class Editlayout extends \Zotlabs\Web\Controller {
'profile_uid' => intval($owner),
);
$editor = status_editor($a, $x);
$editor = status_editor($a, $x, false, 'Editlayout');
$o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
'$title' => t('Edit Layout'),

View File

@@ -102,7 +102,7 @@ class Editpost extends \Zotlabs\Web\Controller {
'bbcode' => true
);
$editor = status_editor($a, $x);
$editor = status_editor($a, $x, false, 'Editpost');
$o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
'$title' => t('Edit post'),

View File

@@ -160,7 +160,7 @@ class Editwebpage extends \Zotlabs\Web\Controller {
'bbcode' => (($mimetype == 'text/bbcode') ? true : false)
);
$editor = status_editor($a, $x);
$editor = status_editor($a, $x, false, 'Editwebpage');
$o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
'$title' => t('Edit Webpage'),

View File

@@ -6,7 +6,7 @@ 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 Events extends \Zotlabs\Web\Controller {
@@ -271,8 +271,10 @@ class Events extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
return;
}
\App::$profile_uid = local_channel();
nav_set_selected('Events');
if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
$r = q("update event set dismissed = 1 where id = %d and uid = %d",
@@ -288,7 +290,7 @@ class Events extends \Zotlabs\Web\Controller {
);
}
$first_day = get_pconfig(local_channel(),'system','cal_first_day');
$first_day = feature_enabled(local_channel(), 'events_cal_first_day');
$first_day = (($first_day) ? $first_day : 0);
$htpl = get_markup_template('event_head.tpl');
@@ -641,6 +643,7 @@ class Events extends \Zotlabs\Web\Controller {
}
$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'],
@@ -659,8 +662,6 @@ class Events extends \Zotlabs\Web\Controller {
'html'=>$html,
'plink' => array($rr['plink'],t('Link to Source'),'',''),
);
}
}

View File

@@ -128,7 +128,7 @@ class Filestorage extends \Zotlabs\Web\Controller {
}
}
if(json_return)
if($json_return)
json_return_and_die([ 'success' => true ]);
goaway(dirname($url));

View File

@@ -1,11 +1,13 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Apps;
require_once('include/group.php');
class Group extends \Zotlabs\Web\Controller {
class Group extends Controller {
function init() {
if(! local_channel()) {
@@ -13,7 +15,11 @@ class Group extends \Zotlabs\Web\Controller {
return;
}
\App::$profile_uid = local_channel();
if(! Apps::system_app_installed(local_channel(), 'Privacy Groups')) {
return;
}
App::$profile_uid = local_channel();
nav_set_selected('Privacy Groups');
}
@@ -24,6 +30,10 @@ class Group extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
return;
}
if(! Apps::system_app_installed(local_channel(), 'Privacy Groups')) {
return;
}
if((argc() == 2) && (argv(1) === 'new')) {
check_form_security_token_redirectOnErr('/group/new', 'group_edit');
@@ -43,7 +53,7 @@ class Group extends \Zotlabs\Web\Controller {
if((argc() == 2) && (intval(argv(1)))) {
check_form_security_token_redirectOnErr('/group', 'group_edit');
$r = q("SELECT * FROM groups WHERE id = %d AND uid = %d LIMIT 1",
$r = q("SELECT * FROM pgrp WHERE id = %d AND uid = %d LIMIT 1",
intval(argv(1)),
intval(local_channel())
);
@@ -57,7 +67,7 @@ class Group extends \Zotlabs\Web\Controller {
$public = intval($_POST['public']);
if((strlen($groupname)) && (($groupname != $group['gname']) || ($public != $group['visible']))) {
$r = q("UPDATE groups SET gname = '%s', visible = %d WHERE uid = %d AND id = %d",
$r = q("UPDATE pgrp SET gname = '%s', visible = %d WHERE uid = %d AND id = %d",
dbesc($groupname),
intval($public),
intval(local_channel()),
@@ -77,13 +87,22 @@ class Group extends \Zotlabs\Web\Controller {
$change = false;
logger('mod_group: ' . \App::$cmd,LOGGER_DEBUG);
logger('mod_group: ' . App::$cmd,LOGGER_DEBUG);
if(! local_channel()) {
notice( t('Permission denied') . EOL);
return;
}
if(! Apps::system_app_installed(local_channel(), 'Privacy Groups')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Privacy Groups App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Management of privacy groups');
return $o;
}
// Switch to text mode interface if we have more than 'n' contacts or group members
$switchtotext = get_pconfig(local_channel(),'system','groupedit_image_limit');
if($switchtotext === false)
@@ -96,7 +115,7 @@ class Group extends \Zotlabs\Web\Controller {
$new = (((argc() == 2) && (argv(1) === 'new')) ? true : false);
$groups = q("SELECT id, gname FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
$groups = q("SELECT id, gname FROM pgrp WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval(local_channel())
);
@@ -141,7 +160,7 @@ class Group extends \Zotlabs\Web\Controller {
check_form_security_token_redirectOnErr('/group', 'group_drop', 't');
if(intval(argv(2))) {
$r = q("SELECT gname FROM groups WHERE id = %d AND uid = %d LIMIT 1",
$r = q("SELECT gname FROM pgrp WHERE id = %d AND uid = %d LIMIT 1",
intval(argv(2)),
intval(local_channel())
);
@@ -173,7 +192,7 @@ class Group extends \Zotlabs\Web\Controller {
if((argc() > 1) && (intval(argv(1)))) {
require_once('include/acl_selectors.php');
$r = q("SELECT * FROM groups WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1",
$r = q("SELECT * FROM pgrp WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1",
intval(argv(1)),
intval(local_channel())
);

View File

@@ -13,14 +13,12 @@ class Home extends \Zotlabs\Web\Controller {
$ret = array();
call_hooks('home_init',$ret);
$splash = ((argc() > 1 && argv(1) === 'splash') ? true : false);
$channel = \App::get_channel();
if(local_channel() && $channel && $channel['xchan_url'] && ! $splash) {
$dest = $channel['channel_startpage'];
if(! $dest)
$dest = get_pconfig(local_channel(),'system','startpage');
$dest = (($ret['startpage']) ? $ret['startpage'] : '');
if(! $dest)
$dest = get_config('system','startpage');
if(! $dest)

View File

@@ -138,7 +138,7 @@ class Hq extends \Zotlabs\Web\Controller {
[
'$no_messages' => (($target_item) ? false : true),
'$no_messages_label' => [ t('Welcome to Hubzilla!'), t('You have got no unseen posts...') ],
'$editor' => status_editor($a,$x)
'$editor' => status_editor($a,$x,false,'Hq')
]
);

View File

@@ -127,6 +127,15 @@ class Import extends \Zotlabs\Web\Controller {
//
// }
// prevent incompatible osada or zap data from horking your database
if(array_path_exists('compatibility/codebase',$data)) {
notice('Data export format is not compatible with this software');
return;
}
if($moving)
$seize = 1;
@@ -426,9 +435,9 @@ class Import extends \Zotlabs\Web\Controller {
unset($group['id']);
$group['uid'] = $channel['channel_id'];
create_table_from_array('groups', $group);
create_table_from_array('pgrp', $group);
}
$r = q("select * from groups where uid = %d",
$r = q("select * from pgrp where uid = %d",
intval($channel['channel_id'])
);
if($r) {
@@ -448,7 +457,7 @@ class Import extends \Zotlabs\Web\Controller {
if($x['old'] == $group_member['gid'])
$group_member['gid'] = $x['new'];
}
create_table_from_array('group_member', $group_member);
create_table_from_array('pgrp_member', $group_member);
}
}

View File

@@ -1,6 +1,10 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
/**
* module: invite.php
*
@@ -9,7 +13,7 @@ namespace Zotlabs\Module;
*/
class Invite extends \Zotlabs\Web\Controller {
class Invite extends Controller {
function post() {
@@ -17,6 +21,10 @@ class Invite extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
return;
}
if(! Apps::system_app_installed(local_channel(), 'Invite')) {
return;
}
check_form_security_token_redirectOnErr('/', 'send_invite');
@@ -57,7 +65,7 @@ class Invite extends \Zotlabs\Web\Controller {
else
$nmessage = $message;
$account = \App::get_account();
$account = App::get_account();
$res = z_mail(
[
@@ -95,6 +103,15 @@ class Invite extends \Zotlabs\Web\Controller {
return;
}
if(! Apps::system_app_installed(local_channel(), 'Invite')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Invite App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Send email invitations to join this network');
return $o;
}
nav_set_selected('Invite');
$tpl = get_markup_template('invite.tpl');
@@ -127,11 +144,11 @@ class Invite extends \Zotlabs\Web\Controller {
}
}
$ob = \App::get_observer();
$ob = App::get_observer();
if(! $ob)
return $o;
$channel = \App::get_channel();
$channel = App::get_channel();
$o = replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("send_invite"),

View File

@@ -29,7 +29,7 @@ use \Zotlabs\Lib as Zlib;
class Item extends \Zotlabs\Web\Controller {
function post() {
// This will change. Figure out who the observer is and whether or not
// they have permission to post here. Else ignore the post.
@@ -237,10 +237,12 @@ class Item extends \Zotlabs\Web\Controller {
if($parent) {
logger('mod_item: item_post parent=' . $parent);
$can_comment = false;
if((array_key_exists('owner',$parent_item)) && intval($parent_item['owner']['abook_self']))
$can_comment = perm_is_allowed($profile_uid,$observer['xchan_hash'],'post_comments');
else
$can_comment = can_comment_on_post($observer['xchan_hash'],$parent_item);
$can_comment = can_comment_on_post($observer['xchan_hash'],$parent_item);
if (!$can_comment) {
if((array_key_exists('owner',$parent_item)) && intval($parent_item['owner']['abook_self'])==1 )
$can_comment = perm_is_allowed($profile_uid,$observer['xchan_hash'],'post_comments');
}
if(! $can_comment) {
notice( t('Permission denied.') . EOL) ;
@@ -533,7 +535,7 @@ class Item extends \Zotlabs\Web\Controller {
// Look for tags and linkify them
$results = linkify_tags($a, $body, ($uid) ? $uid : $profile_uid);
logger('linkify: ' . print_r($results,true));
if($results) {
// Set permissions based on tag replacements
@@ -1163,28 +1165,6 @@ logger('linkify: ' . print_r($results,true));
return $ret;
}
// auto-upgrade beginner (techlevel 0) accounts - if they have at least two friends and ten posts
// and have uploaded something (like a profile photo), promote them to level 1.
$a = q("select account_id, account_level from account where account_id = (select channel_account_id from channel where channel_id = %d limit 1)",
intval($channel_id)
);
if((! intval($a[0]['account_level'])) && intval($r[0]['total']) > 10) {
$x = q("select count(abook_id) as total from abook where abook_channel = %d",
intval($channel_id)
);
if($x && intval($x[0]['total']) > 2) {
$y = q("select count(id) as total from attach where uid = %d",
intval($channel_id)
);
if($y && intval($y[0]['total']) > 1) {
q("update account set account_level = 1 where account_id = %d limit 1",
intval($a[0]['account_id'])
);
}
}
}
if (!$iswebpage) {
$max = engr_units_to_bytes(service_class_fetch($channel_id,'total_items'));
if(! service_class_allows($channel_id,'total_items',$r[0]['total'])) {

View File

@@ -1,13 +1,28 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
class Lang extends \Zotlabs\Web\Controller {
class Lang extends Controller {
function get() {
if(local_channel()) {
if(! Apps::system_app_installed(local_channel(), 'Language')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Language App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Change UI language');
return $o;
}
}
nav_set_selected('Language');
return lang_selector();
}
}

View File

@@ -141,7 +141,7 @@ class Layouts extends \Zotlabs\Web\Controller {
if($_REQUEST['pagetitle'])
$x['pagetitle'] = $_REQUEST['pagetitle'];
$editor = status_editor($a,$x);
$editor = status_editor($a,$x,false,'Layouts');
$r = q("select iconfig.iid, iconfig.v, mid, title, body, mimetype, created, edited, item_type from iconfig
left join item on iconfig.iid = item.id

View File

@@ -50,7 +50,7 @@ class Like extends \Zotlabs\Web\Controller {
$observer = \App::get_observer();
$interactive = $_REQUEST['interactive'];
if($interactive) {
if((! $observer) || ($interactive)) {
$o .= '<h1>' . t('Like/Dislike') . '</h1>';
$o .= EOL . EOL;
@@ -249,6 +249,9 @@ class Like extends \Zotlabs\Web\Controller {
}
}
else {
if(! $observer)
killme();
// this is used to like an item or comment

View File

@@ -138,8 +138,8 @@ class Linkinfo extends \Zotlabs\Web\Controller {
}
$image = "";
if(sizeof($siteinfo["images"]) > 0){
if(is_array($siteinfo["images"]) && count($siteinfo["images"])){
/* Execute below code only if image is present in siteinfo */
$total_images = 0;
@@ -161,7 +161,7 @@ class Linkinfo extends \Zotlabs\Web\Controller {
$total_images ++;
if($max_images && $max_images >= $total_images)
break;
}
}
}
if(strlen($text)) {
@@ -228,8 +228,13 @@ class Linkinfo extends \Zotlabs\Web\Controller {
$header = $result['header'];
$body = $result['body'];
$body = mb_convert_encoding($body, 'UTF-8', 'UTF-8');
// 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');
$body = mb_convert_encoding($body, 'UTF-8', $cp);
$body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
$doc = new \DOMDocument();
@@ -265,20 +270,43 @@ class Linkinfo extends \Zotlabs\Web\Controller {
$attr["content"] = html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8");
switch (strtolower($attr["name"])) {
case 'generator':
$siteinfo['generator'] = $attr['content'];
break;
case "fulltitle":
$siteinfo["title"] = $attr["content"];
$siteinfo["title"] = trim($attr["content"]);
break;
case "description":
$siteinfo["text"] = $attr["content"];
$siteinfo["text"] = trim($attr["content"]);
break;
case "thumbnail":
$siteinfo["image"] = $attr["content"];
break;
case "twitter:image":
$siteinfo["image"] = $attr["content"];
break;
case "twitter:image:src":
$siteinfo["image"] = $attr["content"];
break;
case "twitter:card":
if (($siteinfo["type"] == "") || ($attr["content"] == "photo")) {
$siteinfo["type"] = $attr["content"];
}
break;
case "twitter:description":
$siteinfo["text"] = trim($attr["content"]);
break;
case "twitter:title":
$siteinfo["title"] = trim($attr["content"]);
break;
case "dc.title":
$siteinfo["title"] = $attr["content"];
$siteinfo["title"] = trim($attr["content"]);
break;
case "dc.description":
$siteinfo["text"] = $attr["content"];
$siteinfo["text"] = trim($attr["content"]);
break;
case "keywords":
$keywords = explode(",", $attr["content"]);
break;
case "news_keywords":
$keywords = explode(",", $attr["content"]);
break;
}
}

View File

@@ -118,7 +118,7 @@ class Lockview extends \Zotlabs\Web\Controller {
}
if(count($allowed_groups)) {
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
$r = q("SELECT gname FROM pgrp WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<div class="dropdown-item"><b>' . $rr['gname'] . '</b></div>';
@@ -156,7 +156,7 @@ class Lockview extends \Zotlabs\Web\Controller {
if(count($deny_groups)) {
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
$r = q("SELECT gname FROM pgrp WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<div class="dropdown-item"><b><strike>' . $rr['gname'] . '</strike></b></div>';

View File

@@ -146,12 +146,17 @@ class Magic extends \Zotlabs\Web\Controller {
$dest = strip_zids($dest);
$dest = strip_query_param($dest,'f');
$data = json_encode([ 'OpenWebAuth' => random_string() ]);
$headers = [];
$headers['Accept'] = 'application/x-zot+json' ;
$headers['X-Open-Web-Auth'] = random_string();
$headers['Host'] = $parsed['host'];
$headers['Digest'] = 'SHA-256=' . \Zotlabs\Web\HTTPSig::generate_digest($data,false);
$headers = \Zotlabs\Web\HTTPSig::create_sig('',$headers,$channel['channel_prvkey'],
'acct:' . $channel['channel_address'] . '@' . \App::get_hostname(),false,true,'sha512');
$x = z_fetch_url($basepath . '/owa',false,$redirects,[ 'headers' => $headers ]);
$x = z_post_url($basepath . '/owa',$data,$redirects,[ 'headers' => $headers ]);
if($x['success']) {
$j = json_decode($x['body'],true);

View File

@@ -393,7 +393,7 @@ class Mail extends \Zotlabs\Web\Controller {
'delete' => t('Delete message'),
'dreport' => t('Delivery report'),
'recall' => t('Recall message'),
'can_recall' => (($channel['channel_hash'] == $message['from_xchan'] && get_account_techlevel() > 0) ? true : false),
'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'),
);

View File

@@ -11,7 +11,7 @@ class Manage extends \Zotlabs\Web\Controller {
return;
}
nav_set_selected('Channel Manager');
nav_set_selected('Channel Manager', 'settings/manage');
require_once('include/security.php');
@@ -129,7 +129,7 @@ class Manage extends \Zotlabs\Web\Controller {
}
}
$r = q("select count(channel_id) as total from channel where channel_account_id = %d and channel_removed = 0",
intval(get_account_id())
);
@@ -170,7 +170,7 @@ class Manage extends \Zotlabs\Web\Controller {
'$header' => t('Channel Manager'),
'$msg_selected' => t('Current Channel'),
'$selected' => local_channel(),
'$desc' => t('Switch to one of your channels by selecting it.'),
'$desc' => ((count($channels) > 1 || $delegates) ? t('Switch to one of your channels by selecting it.') : ''),
'$msg_default' => t('Default Channel'),
'$msg_make_default' => t('Make Default'),
'$create' => $create,

View File

@@ -213,7 +213,7 @@ class Menu extends \Zotlabs\Web\Controller {
'$header' => t('Edit Menu'),
'$sys' => \App::$is_sys,
'$menu_id' => intval(argv(2)),
'$menu_edit_link' => 'mitem/' . $which . '/' . intval(argv(1)) . ((\App::$is_sys) ? '?f=&sys=1' : ''),
'$menu_edit_link' => 'mitem/' . $which . '/' . intval(argv(2)) . ((\App::$is_sys) ? '?f=&sys=1' : ''),
'$hintedit' => t('Add or remove entries to this menu'),
'$editcontents' => t('Edit menu contents'),
'$menu_name' => array('menu_name', t('Menu name'), $m['menu_name'], t('Must be unique, only seen by you'), '*'),

View File

@@ -1,21 +1,29 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
require_once('include/security.php');
require_once('include/bbcode.php');
require_once('include/items.php');
class Mood extends \Zotlabs\Web\Controller {
class Mood extends Controller {
function init() {
if(! local_channel())
return;
if(! Apps::system_app_installed(local_channel(), 'Mood')) {
return;
}
$uid = local_channel();
$channel = \App::get_channel();
$channel = App::get_channel();
$verb = notags(trim($_GET['verb']));
if(! $verb)
@@ -60,7 +68,7 @@ class Mood extends \Zotlabs\Web\Controller {
$deny_gid = $channel['channel_deny_gid'];
}
$poster = \App::get_observer();
$poster = App::get_observer();
$mid = item_message_id();
@@ -117,6 +125,15 @@ class Mood extends \Zotlabs\Web\Controller {
return;
}
if(! Apps::system_app_installed(local_channel(), 'Mood')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Mood App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Set your current mood and tell your friends');
return $o;
}
nav_set_selected('Mood');
$parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : '0');

View File

@@ -1,6 +1,8 @@
<?php
namespace Zotlabs\Module;
use App;
require_once('include/items.php');
require_once('include/group.php');
require_once('include/contact_widgets.php');
@@ -25,8 +27,8 @@ class Network extends \Zotlabs\Web\Controller {
goaway('network' . '?f=&' . $network_options);
}
$channel = \App::get_channel();
\App::$profile_uid = local_channel();
$channel = App::get_channel();
App::$profile_uid = local_channel();
head_set_icon($channel['xchan_photo_s']);
}
@@ -34,7 +36,7 @@ class Network extends \Zotlabs\Web\Controller {
function get($update = 0, $load = false) {
if(! local_channel()) {
$_SESSION['return_url'] = \App::$query_string;
$_SESSION['return_url'] = App::$query_string;
return login(false);
}
@@ -44,11 +46,11 @@ class Network extends \Zotlabs\Web\Controller {
$_SESSION['loadtime'] = datetime_convert();
}
$arr = array('query' => \App::$query_string);
$arr = array('query' => App::$query_string);
call_hooks('network_content_init', $arr);
$channel = \App::get_channel();
$channel = App::get_channel();
$item_normal = item_normal();
$item_normal_update = item_normal_update();
@@ -82,20 +84,9 @@ class Network extends \Zotlabs\Web\Controller {
$search = (($_GET['search']) ? $_GET['search'] : '');
if($search) {
$_GET['netsearch'] = escape_tags($search);
if(strpos($search,'@') === 0) {
$r = q("select abook_id from abook left join xchan on abook_xchan = xchan_hash where xchan_name = '%s' and abook_channel = %d limit 1",
dbesc(substr($search,1)),
intval(local_channel())
);
if($r) {
$_GET['cid'] = $r[0]['abook_id'];
$search = $_GET['search'] = '';
}
}
elseif(strpos($search,'#') === 0) {
if(strpos($search,'#') === 0) {
$hashtags = substr($search,1);
$search = $_GET['search'] = '';
$search = '';
}
}
@@ -106,7 +97,7 @@ class Network extends \Zotlabs\Web\Controller {
// filter by collection (e.g. group)
if($gid) {
$r = q("SELECT * FROM groups WHERE id = %d AND uid = %d LIMIT 1",
$r = q("SELECT * FROM pgrp WHERE id = %d AND uid = %d LIMIT 1",
intval($gid),
intval(local_channel())
);
@@ -137,11 +128,12 @@ class Network extends \Zotlabs\Web\Controller {
$xchan = ((x($_GET,'xchan')) ? $_GET['xchan'] : '');
$net = ((x($_GET,'net')) ? $_GET['net'] : '');
$pf = ((x($_GET,'pf')) ? $_GET['pf'] : '');
$unseen = ((x($_GET,'unseen')) ? $_GET['unseen'] : '');
$deftag = '';
if(x($_GET,'search') || $file || (!$pf && $cid))
if(x($_GET,'search') || $file || (!$pf && $cid) || $hashtags || $verb || $category || $conv || $unseen)
$nouveau = true;
if($cid) {
@@ -165,17 +157,15 @@ class Network extends \Zotlabs\Web\Controller {
}
if(! $update) {
$tabs = ''; //network_tabs();
$o .= $tabs;
// search terms header
if($search) {
if($search || $hashtags) {
$o .= replace_macros(get_markup_template("section_title.tpl"),array(
'$title' => t('Search Results For:') . ' ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8')
'$title' => t('Search Results For:') . ' ' . (($search) ? htmlspecialchars($search, ENT_COMPAT,'UTF-8') : '#' . htmlspecialchars($hashtags, ENT_COMPAT,'UTF-8'))
));
}
nav_set_selected('Grid');
nav_set_selected('Network');
$channel_acl = array(
'allow_cid' => $channel['channel_allow_cid'],
@@ -207,7 +197,7 @@ class Network extends \Zotlabs\Web\Controller {
$x['pretext'] = $deftag;
$status_editor = status_editor($a,$x);
$status_editor = status_editor($a,$x,false,'Network');
$o .= $status_editor;
$static = channel_manual_conv_update(local_channel());
@@ -231,6 +221,7 @@ class Network extends \Zotlabs\Web\Controller {
$sql_extra = '';
if($group) {
$contact_str = '';
$contacts = group_get_members($group);
if($contacts) {
@@ -243,7 +234,6 @@ class Network extends \Zotlabs\Web\Controller {
}
}
$item_thread_top = '';
$sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str )) or allow_gid like '" . protect_sprintf('%<' . dbesc($group_hash) . '>%') . "' ) and id = parent $item_normal ) ";
$x = group_rec_byhash(local_channel(), $group_hash);
@@ -254,8 +244,7 @@ class Network extends \Zotlabs\Web\Controller {
));
}
$o = $tabs;
$o .= $title;
$o = $title;
$o .= $status_editor;
}
@@ -264,15 +253,39 @@ class Network extends \Zotlabs\Web\Controller {
if($load || $update) {
if(!$pf && $nouveau) {
// This is for nouveau view cid queries (not a public forum)
$sql_extra = " AND author_xchan = '" . dbesc($cid_r[0]['abook_xchan']) . "' ";
}
elseif($pf && $unseen && $nouveau) {
$vnotify = get_pconfig(local_channel(), 'system', 'vnotify');
if(! ($vnotify & VNOTIFY_LIKE))
$likes_sql = " AND verb NOT IN ('" . dbesc(ACTIVITY_LIKE) . "', '" . dbesc(ACTIVITY_DISLIKE) . "') ";
// This is for nouveau view public forum cid queries (if a forum notification is clicked)
$p = q("SELECT oid AS parent FROM term WHERE uid = %d AND ttype = %d AND term = '%s'",
intval(local_channel()),
intval(TERM_FORUM),
dbesc($cid_r[0]['xchan_name'])
);
$p_str = ids_to_querystr($p, 'parent');
if($p_str)
$p_sql = " OR item.parent IN ( $p_str ) ";
$sql_extra = " AND ( owner_xchan = '" . protect_sprintf(dbesc($cid_r[0]['abook_xchan'])) . "' OR owner_xchan = '" . protect_sprintf(dbesc($cid_r[0]['abook_xchan'])) . "' $p_sql ) AND item_unseen = 1 $likes_sql ";
}
else {
// This is for threaded view cid queries (e.g. if a forum is selected from the forum filter)
$ttype = (($pf) ? TERM_FORUM : TERM_MENTION);
$p1 = q("SELECT DISTINCT parent FROM item WHERE uid = " . intval(local_channel()) . " AND ( author_xchan = '" . dbesc($cid_r[0]['abook_xchan']) . "' OR owner_xchan = '" . dbesc($cid_r[0]['abook_xchan']) . "' ) $item_normal ");
$p2 = q("SELECT oid AS parent FROM term WHERE uid = " . intval(local_channel()) . " AND ttype = $ttype AND term = '" . dbesc($cid_r[0]['xchan_name']) . "'");
$p_str = ids_to_querystr(array_merge($p1,$p2),'parent');
if(! $p_str)
killme();
$sql_extra = " AND item.parent IN ( $p_str ) ";
}
}
@@ -281,8 +294,7 @@ class Network extends \Zotlabs\Web\Controller {
'$title' => '<a href="' . zid($cid_r[0]['xchan_url']) . '" ><img src="' . zid($cid_r[0]['xchan_photo_s']) . '" alt="' . urlencode($cid_r[0]['xchan_name']) . '" /></a> <a href="' . zid($cid_r[0]['xchan_url']) . '" >' . $cid_r[0]['xchan_name'] . '</a>'
));
$o = $tabs;
$o .= $title;
$o = $title;
$o .= $status_editor;
}
elseif($xchan) {
@@ -295,8 +307,8 @@ class Network extends \Zotlabs\Web\Controller {
$title = replace_macros(get_markup_template("section_title.tpl"),array(
'$title' => '<a href="' . zid($r[0]['xchan_url']) . '" ><img src="' . zid($r[0]['xchan_photo_s']) . '" alt="' . urlencode($r[0]['xchan_name']) . '" /></a> <a href="' . zid($r[0]['xchan_url']) . '" >' . $r[0]['xchan_name'] . '</a>'
));
$o = $tabs;
$o .= $title;
$o = $title;
$o .= $status_editor;
}
@@ -326,10 +338,10 @@ class Network extends \Zotlabs\Web\Controller {
$o .= '<div id="live-network"></div>' . "\r\n";
$o .= "<script> var profile_uid = " . local_channel()
. "; var profile_page = " . \App::$pager['page']
. "; var profile_page = " . App::$pager['page']
. "; divmore_height = " . intval($maxheight) . "; </script>\r\n";
\App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
'$baseurl' => z_root(),
'$pgtype' => 'network',
'$uid' => ((local_channel()) ? local_channel() : '0'),
@@ -346,7 +358,7 @@ class Network extends \Zotlabs\Web\Controller {
'$wall' => '0',
'$static' => $static,
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
'$search' => (($search) ? $search : ''),
'$xchan' => $xchan,
'$order' => $order,
@@ -358,7 +370,8 @@ class Network extends \Zotlabs\Web\Controller {
'$verb' => $verb,
'$net' => $net,
'$dbegin' => $datequery2,
'$pf' => (($pf) ? $pf : '0'),
'$pf' => (($pf) ? $pf : '0'),
'$unseen' => $unseen
));
}
@@ -380,7 +393,8 @@ class Network extends \Zotlabs\Web\Controller {
$sql_extra .= term_query('item',substr($search,1),TERM_HASHTAG,TERM_COMMUNITYTAG);
}
else {
$sql_extra .= sprintf(" AND item.body like '%s' ",
$sql_extra .= sprintf(" AND (item.body like '%s' OR item.title like '%s') ",
dbesc(protect_sprintf('%' . $search . '%')),
dbesc(protect_sprintf('%' . $search . '%'))
);
}
@@ -398,15 +412,7 @@ class Network extends \Zotlabs\Web\Controller {
if($conv) {
$item_thread_top = '';
if($nouveau) {
$sql_extra .= " AND author_xchan = '" . dbesc($channel['channel_hash']) . "' ";
}
else {
$sql_extra .= sprintf(" AND parent IN (SELECT distinct(parent) from item where ( author_xchan = '%s' or item_mentionsme = 1 )) ",
dbesc(protect_sprintf($channel['channel_hash']))
);
}
$sql_extra .= " AND ( author_xchan = '" . dbesc($channel['channel_hash']) . "' OR item_mentionsme = 1 ) ";
}
if($update && ! $load) {
@@ -417,8 +423,8 @@ class Network extends \Zotlabs\Web\Controller {
}
else {
$itemspage = get_pconfig(local_channel(),'system','itemspage');
\App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
}
// cmin and cmax are both -1 when the affinity tool is disabled
@@ -449,13 +455,15 @@ class Network extends \Zotlabs\Web\Controller {
$abook_uids = " and abook.abook_channel = " . local_channel() . " ";
$uids = " and item.uid = " . local_channel() . " ";
if(get_pconfig(local_channel(),'system','network_list_mode'))
if(feature_enabled(local_channel(), 'network_list_mode'))
$page_mode = 'list';
else
$page_mode = 'client';
$simple_update = (($update) ? " and item_unseen = 1 " : '');
$parents_str = '';
$update_unseen = '';
$simple_update = (($update) ? " and item_unseen = 1 " : '');
// This fixes a very subtle bug so I'd better explain it. You wake up in the morning or return after a day
// or three and look at your matrix page - after opening up your browser. The first page loads just as it
@@ -471,15 +479,15 @@ class Network extends \Zotlabs\Web\Controller {
if($update && $_SESSION['loadtime'])
$simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
if($load)
$simple_update = '';
if($load)
$simple_update = '';
if($static && $simple_update)
$simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' ";
if($nouveau && $load) {
// "New Item View" - show all items unthreaded in reverse created date order
$items = q("SELECT item.*, item.id AS item_id, created FROM item
left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
$net_query
@@ -490,7 +498,12 @@ class Network extends \Zotlabs\Web\Controller {
$net_query2
ORDER BY item.created DESC $pager_sql "
);
$parents_str = ids_to_querystr($items,'item_id');
if($parents_str) {
$update_unseen = " AND id IN ( " . dbesc($parents_str) . " )";
}
require_once('include/items.php');
xchan_query($items);
@@ -533,8 +546,6 @@ class Network extends \Zotlabs\Web\Controller {
}
// Then fetch all the children of the parents that are on this page
$parents_str = '';
$update_unseen = '';
if($r) {

View File

@@ -134,7 +134,7 @@ class New_channel extends \Zotlabs\Web\Controller {
$default_role = '';
$aid = get_account_id();
if($aid) {
$r = q("select count(channel_id) as total from channel where channel_account_id = %d",
$r = q("select count(channel_id) as total from channel where channel_account_id = %d and channel_removed = 0",
intval($aid)
);
if($r && (! intval($r[0]['total']))) {
@@ -142,9 +142,12 @@ class New_channel extends \Zotlabs\Web\Controller {
}
$limit = account_service_class_fetch(get_account_id(),'total_identities');
$canadd = true;
if($r && ($limit !== false)) {
$channel_usage_message = sprintf( t("You have created %1$.0f of %2$.0f allowed channels."), $r[0]['total'], $limit);
if ($r[0]['total'] > $limit) {
$canadd = false;
}
}
else {
$channel_usage_message = '';
@@ -168,8 +171,6 @@ class New_channel extends \Zotlabs\Web\Controller {
$privacy_role = ((x($_REQUEST,'permissions_role')) ? $_REQUEST['permissions_role'] : "" );
$perm_roles = \Zotlabs\Access\PermissionRoles::roles();
if((get_account_techlevel() < 4) && $privacy_role !== 'custom')
unset($perm_roles[t('Other')]);
$name = array('name', t('Channel name'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), $name_help, "*");
$nickhub = '@' . \App::get_hostname();
@@ -186,7 +187,8 @@ class New_channel extends \Zotlabs\Web\Controller {
'$nickname' => $nickname,
'$validate' => t('Validate'),
'$submit' => t('Create'),
'$channel_usage_message' => $channel_usage_message
'$channel_usage_message' => $channel_usage_message,
'$canadd' => $canadd
));
return $o;

View File

@@ -1,13 +1,19 @@
<?php
namespace Zotlabs\Module; /** @file */
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Apps;
class Notes extends \Zotlabs\Web\Controller {
class Notes extends Controller {
function init() {
function post() {
if(! local_channel())
return;
return EMPTY_STR;
if(! Apps::system_app_installed(local_channel(), 'Notes'))
return EMPTY_STR;
$ret = array('success' => true);
if(array_key_exists('note_text',$_REQUEST)) {
@@ -24,17 +30,38 @@ class Notes extends \Zotlabs\Web\Controller {
}
set_pconfig(local_channel(),'notes','text',$body);
}
// push updates to channel clones
if((argc() > 1) && (argv(1) === 'sync')) {
require_once('include/zot.php');
build_sync_packet();
}
logger('notes saved.', LOGGER_DEBUG);
json_return_and_die($ret);
}
function get() {
if(! local_channel())
return EMPTY_STR;
if(! Apps::system_app_installed(local_channel(), 'Notes')) {
//Do not display any associated widgets at this point
App::$pdl = EMPTY_STR;
$o = '<b>' . t('Notes App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('A simple notes app with a widget (note: notes are not encrypted)');
return $o;
}
$w = new \Zotlabs\Widget\Notes;
$arr = ['app' => true];
return $w->widget($arr);
}
}

View File

@@ -1,27 +1,37 @@
<?php
namespace Zotlabs\Module\Settings;
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
class Oauth {
class Oauth extends Controller {
function post() {
if(! local_channel())
return;
if(! Apps::system_app_installed(local_channel(), 'OAuth Apps Manager'))
return;
if(x($_POST,'remove')){
check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
check_form_security_token_redirectOnErr('/oauth', 'oauth');
$key = $_POST['remove'];
q("DELETE FROM tokens WHERE id='%s' AND uid=%d",
dbesc($key),
local_channel());
goaway(z_root()."/settings/oauth/");
goaway(z_root()."/oauth");
return;
}
if((argc() > 2) && (argv(2) === 'edit' || argv(2) === 'add') && x($_POST,'submit')) {
if((argc() > 1) && (argv(1) === 'edit' || argv(1) === 'add') && x($_POST,'submit')) {
check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
check_form_security_token_redirectOnErr('oauth', 'oauth');
$name = ((x($_POST,'name')) ? escape_tags($_POST['name']) : '');
$key = ((x($_POST,'key')) ? escape_tags($_POST['key']) : '');
@@ -73,17 +83,30 @@ class Oauth {
);
}
}
goaway(z_root()."/settings/oauth/");
goaway(z_root()."/oauth");
return;
}
}
function get() {
if(! local_channel())
return;
if(! Apps::system_app_installed(local_channel(), 'OAuth Apps Manager')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('OAuth Apps Manager App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('OAuth authentication tokens for mobile and remote apps');
return $o;
}
if((argc() > 2) && (argv(2) === 'add')) {
$tpl = get_markup_template("settings_oauth_edit.tpl");
if((argc() > 1) && (argv(1) === 'add')) {
$tpl = get_markup_template("oauth_edit.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("settings_oauth"),
'$form_security_token' => get_form_security_token("oauth"),
'$title' => t('Add application'),
'$submit' => t('Submit'),
'$cancel' => t('Cancel'),
@@ -96,9 +119,9 @@ class Oauth {
return $o;
}
if((argc() > 3) && (argv(2) === 'edit')) {
if((argc() > 2) && (argv(1) === 'edit')) {
$r = q("SELECT * FROM clients WHERE client_id='%s' AND uid=%d",
dbesc(argv(3)),
dbesc(argv(2)),
local_channel());
if (!count($r)){
@@ -107,9 +130,9 @@ class Oauth {
}
$app = $r[0];
$tpl = get_markup_template("settings_oauth_edit.tpl");
$tpl = get_markup_template("oauth_edit.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("settings_oauth"),
'$form_security_token' => get_form_security_token("oauth"),
'$title' => t('Add application'),
'$submit' => t('Update'),
'$cancel' => t('Cancel'),
@@ -122,13 +145,13 @@ class Oauth {
return $o;
}
if((argc() > 3) && (argv(2) === 'delete')) {
check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth', 't');
if((argc() > 2) && (argv(1) === 'delete')) {
check_form_security_token_redirectOnErr('/oauth', 'oauth', 't');
$r = q("DELETE FROM clients WHERE client_id='%s' AND uid=%d",
dbesc(argv(3)),
dbesc(argv(2)),
local_channel());
goaway(z_root()."/settings/oauth/");
goaway(z_root()."/oauth");
return;
}
@@ -141,11 +164,11 @@ class Oauth {
local_channel());
$tpl = get_markup_template("settings_oauth.tpl");
$tpl = get_markup_template("oauth.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("settings_oauth"),
'$form_security_token' => get_form_security_token("oauth"),
'$baseurl' => z_root(),
'$title' => t('Connected Apps'),
'$title' => t('Connected OAuth Apps'),
'$add' => t('Add application'),
'$edit' => t('Edit'),
'$delete' => t('Delete'),
@@ -158,4 +181,4 @@ class Oauth {
}
}
}

View File

@@ -1,28 +1,46 @@
<?php
namespace Zotlabs\Module\Settings;
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
class Oauth2 {
class Oauth2 extends Controller {
function post() {
if(! local_channel())
return;
if(! Apps::system_app_installed(local_channel(), 'OAuth2 Apps Manager'))
return;
if(x($_POST,'remove')){
check_form_security_token_redirectOnErr('/settings/oauth2', 'settings_oauth2');
check_form_security_token_redirectOnErr('oauth2', 'oauth2');
$name = ((x($_POST,'name')) ? escape_tags(trim($_POST['name'])) : '');
logger("REMOVE! ".$name." uid: ".local_channel());
$key = $_POST['remove'];
q("DELETE FROM tokens WHERE id='%s' AND uid=%d",
dbesc($key),
q("DELETE FROM oauth_authorization_codes WHERE client_id='%s' AND user_id=%d",
dbesc($name),
intval(local_channel())
);
goaway(z_root()."/settings/oauth2/");
q("DELETE FROM oauth_access_tokens WHERE client_id='%s' AND user_id=%d",
dbesc($name),
intval(local_channel())
);
q("DELETE FROM oauth_refresh_tokens WHERE client_id='%s' AND user_id=%d",
dbesc($name),
intval(local_channel())
);
goaway(z_root()."/oauth2");
return;
}
if((argc() > 2) && (argv(2) === 'edit' || argv(2) === 'add') && x($_POST,'submit')) {
if((argc() > 1) && (argv(1) === 'edit' || argv(1) === 'add') && x($_POST,'submit')) {
check_form_security_token_redirectOnErr('/settings/oauth2', 'settings_oauth2');
check_form_security_token_redirectOnErr('oauth2', 'oauth2');
$name = ((x($_POST,'name')) ? escape_tags(trim($_POST['name'])) : '');
$secret = ((x($_POST,'secret')) ? escape_tags(trim($_POST['secret'])) : '');
@@ -45,14 +63,15 @@ class Oauth2 {
grant_types = '%s',
scope = '%s',
user_id = %d
WHERE client_id='%s'",
WHERE client_id='%s' and user_id = %s",
dbesc($name),
dbesc($secret),
dbesc($redirect),
dbesc($grant),
dbesc($scope),
intval(local_channel()),
dbesc($name));
dbesc($name),
intval(local_channel()));
} else {
$r = q("INSERT INTO oauth_clients (client_id, client_secret, redirect_uri, grant_types, scope, user_id)
VALUES ('%s','%s','%s','%s','%s',%d)",
@@ -70,17 +89,29 @@ class Oauth2 {
);
}
}
goaway(z_root()."/settings/oauth2/");
goaway(z_root()."/oauth2");
return;
}
}
function get() {
if(! local_channel())
return;
if(! Apps::system_app_installed(local_channel(), 'OAuth2 Apps Manager')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('OAuth2 Apps Manager App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('OAuth2 authenticatication tokens for mobile and remote apps');
return $o;
}
if((argc() > 2) && (argv(2) === 'add')) {
$tpl = get_markup_template("settings_oauth2_edit.tpl");
if((argc() > 1) && (argv(1) === 'add')) {
$tpl = get_markup_template("oauth2_edit.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("settings_oauth2"),
'$form_security_token' => get_form_security_token("oauth2"),
'$title' => t('Add OAuth2 application'),
'$submit' => t('Submit'),
'$cancel' => t('Cancel'),
@@ -93,9 +124,9 @@ class Oauth2 {
return $o;
}
if((argc() > 3) && (argv(2) === 'edit')) {
if((argc() > 2) && (argv(1) === 'edit')) {
$r = q("SELECT * FROM oauth_clients WHERE client_id='%s' AND user_id= %d",
dbesc(argv(3)),
dbesc(argv(2)),
intval(local_channel())
);
@@ -106,44 +137,57 @@ class Oauth2 {
$app = $r[0];
$tpl = get_markup_template("settings_oauth2_edit.tpl");
$tpl = get_markup_template("oauth2_edit.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("settings_oauth2"),
'$form_security_token' => get_form_security_token("oauth2"),
'$title' => t('Add application'),
'$submit' => t('Update'),
'$cancel' => t('Cancel'),
'$name' => array('name', t('Name'), $app['client_id'], t('Name of application')),
'$secret' => array('secret', t('Consumer Secret'), $app['client_secret'], t('Automatically generated - change if desired. Max length 20')),
'$redirect' => array('redirect', t('Redirect'), $app['redirect_uri'], t('Redirect URI - leave blank unless your application specifically requires this')),
'$grant' => array('grant', t('Grant Types'), $app['grant_types'], t('leave blank unless your application sepcifically requires this')),
'$scope' => array('scope', t('Authorization scope'), $app['scope'], t('leave blank unless your application sepcifically requires this')),
'$grant' => array('grant', t('Grant Types'), $app['grant_types'], t('leave blank unless your application specifically requires this')),
'$scope' => array('scope', t('Authorization scope'), $app['scope'], t('leave blank unless your application specifically requires this')),
));
return $o;
}
if((argc() > 3) && (argv(2) === 'delete')) {
check_form_security_token_redirectOnErr('/settings/oauth2', 'settings_oauth2', 't');
if((argc() > 2) && (argv(1) === 'delete')) {
check_form_security_token_redirectOnErr('oauth2', 'oauth2', 't');
$r = q("DELETE FROM oauth_clients WHERE client_id = '%s' AND user_id = %d",
dbesc(argv(3)),
dbesc(argv(2)),
intval(local_channel())
);
goaway(z_root()."/settings/oauth2/");
$r = q("DELETE FROM oauth_access_tokens WHERE client_id = '%s' AND user_id = %d",
dbesc(argv(2)),
intval(local_channel())
);
$r = q("DELETE FROM oauth_authorization_codes WHERE client_id = '%s' AND user_id = %d",
dbesc(argv(2)),
intval(local_channel())
);
$r = q("DELETE FROM oauth_refresh_tokens WHERE client_id = '%s' AND user_id = %d",
dbesc(argv(2)),
intval(local_channel())
);
goaway(z_root()."/oauth2");
return;
}
$r = q("SELECT oauth_clients.*, oauth_access_tokens.access_token as oauth_token, (oauth_clients.user_id = %d) AS my
FROM oauth_clients
LEFT JOIN oauth_access_tokens ON oauth_clients.client_id=oauth_access_tokens.client_id
LEFT JOIN oauth_access_tokens ON oauth_clients.client_id=oauth_access_tokens.client_id AND
oauth_clients.user_id=oauth_access_tokens.user_id
WHERE oauth_clients.user_id IN (%d,0)",
intval(local_channel()),
intval(local_channel())
);
$tpl = get_markup_template("settings_oauth2.tpl");
$tpl = get_markup_template("oauth2.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("settings_oauth2"),
'$form_security_token' => get_form_security_token("oauth2"),
'$baseurl' => z_root(),
'$title' => t('Connected OAuth2 Apps'),
'$add' => t('Add application'),

View File

@@ -5,19 +5,17 @@ namespace Zotlabs\Module;
class Oauthinfo extends \Zotlabs\Web\Controller {
function init() {
$ret = [
'issuer' => z_root(),
'authorization_endpoint' => z_root() . '/authorize',
'token_endpoint' => z_root() . '/token',
'userinfo_endpoint' => z_root() . '/userinfo',
'scopes_supported' => [ 'openid', 'profile', 'email' ],
'response_types_supported' => [ 'code', 'token', 'id_token', 'code id_token', 'token id_token' ]
];
json_return_and_die($ret);
}
}

View File

@@ -181,7 +181,7 @@ class Oep extends \Zotlabs\Web\Controller {
dbesc($res)
);
if($r) {
$sql_extra = "and item.id = " . intval($r[0]['iid']) . " ";
$sql_extra .= " and item.id = " . intval($r[0]['iid']) . " ";
}
else {
return $ret;
@@ -194,6 +194,9 @@ class Oep extends \Zotlabs\Web\Controller {
intval(ITEM_TYPE_CARD)
);
if(! $r)
return;
$item_normal = " and item.item_hidden = 0 and item.item_type in (0,6) and item.item_deleted = 0
and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0
and item.item_blocked = 0 ";
@@ -255,7 +258,6 @@ class Oep extends \Zotlabs\Web\Controller {
if(! $channel)
return $ret;
if(! perm_is_allowed($channel['channel_id'],get_observer_hash(),'view_pages'))
return $ret;
@@ -265,7 +267,7 @@ class Oep extends \Zotlabs\Web\Controller {
dbesc($res)
);
if($r) {
$sql_extra = "and item.id = " . intval($r[0]['iid']) . " ";
$sql_extra .= " and item.id = " . intval($r[0]['iid']) . " ";
}
else {
return $ret;
@@ -278,6 +280,9 @@ class Oep extends \Zotlabs\Web\Controller {
intval(ITEM_TYPE_ARTICLE)
);
if(! $r)
return;
$item_normal = " and item.item_hidden = 0 and item.item_type in (0,7) and item.item_deleted = 0
and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0
and item.item_blocked = 0 ";

View File

@@ -31,21 +31,23 @@ class Owa extends \Zotlabs\Web\Controller {
if($keyId) {
$r = q("select * from hubloc left join xchan on hubloc_hash = xchan_hash
where hubloc_addr = '%s' ",
dbesc(str_replace('acct:','',$keyId))
where ( hubloc_addr = '%s' or hubloc_id_url = '%s' ) ",
dbesc(str_replace('acct:','',$keyId)),
dbesc($keyId)
);
if(! $r) {
$found = discover_by_webbie(str_replace('acct:','',$keyId));
if($found) {
$r = q("select * from hubloc left join xchan on hubloc_hash = xchan_hash
where hubloc_addr = '%s' ",
dbesc(str_replace('acct:','',$keyId))
where ( hubloc_addr = '%s' or hubloc_id_url = '%s' ) ",
dbesc(str_replace('acct:','',$keyId)),
dbesc($keyId)
);
}
}
if($r) {
foreach($r as $hubloc) {
$verified = \Zotlabs\Web\HTTPSig::verify('',$hubloc['xchan_pubkey']);
$verified = \Zotlabs\Web\HTTPSig::verify(file_get_contents('php://input'),$hubloc['xchan_pubkey']);
if($verified && $verified['header_signed'] && $verified['header_valid']) {
logger('OWA header: ' . print_r($verified,true),LOGGER_DATA);
logger('OWA success: ' . $hubloc['hubloc_addr'],LOGGER_DATA);

View File

@@ -13,14 +13,20 @@ class Pconfig extends \Zotlabs\Web\Controller {
return;
if($_SESSION['delegate'])
return;
if($_SESSION['delegate'])
return;
check_form_security_token_redirectOnErr('/pconfig', 'pconfig');
$cat = trim(escape_tags($_POST['cat']));
$k = trim(escape_tags($_POST['k']));
$v = trim($_POST['v']);
$aj = intval($_POST['aj']);
// Do not store "serialized" data received in the $_POST
if (preg_match('|^a:[0-9]+:{.*}$|s',$v) || preg_match('O:8:"stdClass":[0-9]+:{.*}$|s',$v)) {
return;
}
if(in_array(argv(2),$this->disallowed_pconfig())) {
notice( t('This setting requires special processing and editing has been blocked.') . EOL);
@@ -33,9 +39,12 @@ class Pconfig extends \Zotlabs\Web\Controller {
set_pconfig(local_channel(),$cat,$k,$v);
build_sync_packet();
goaway(z_root() . '/pconfig/' . $cat . '/' . $k);
if($aj)
killme();
else
goaway(z_root() . '/pconfig/' . $cat . '/' . $k);
}

View File

@@ -1,15 +1,20 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Apps;
class Pdledit extends \Zotlabs\Web\Controller {
class Pdledit extends Controller {
function post() {
if(! local_channel())
return;
if(! $_REQUEST['module'])
if(! Apps::system_app_installed(local_channel(), 'PDL Editor'))
return;
if(! feature_enabled(local_channel(),'advanced_theming'))
if(! $_REQUEST['module'])
return;
if(! trim($_REQUEST['content'])) {
@@ -30,9 +35,13 @@ class Pdledit extends \Zotlabs\Web\Controller {
return;
}
if(! feature_enabled(local_channel(),'advanced_theming')) {
notice( t('Feature disabled.') . EOL);
return;
if(! Apps::system_app_installed(local_channel(), 'PDL Editor')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('PDL Editor App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Provides the ability to edit system page layouts');
return $o;
}
if(argc() > 2 && argv(2) === 'reset') {

View File

@@ -1,26 +1,31 @@
<?php
namespace Zotlabs\Module\Settings;
namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
use Zotlabs\Lib\Apps;
class Permcats {
class Permcats extends Controller {
function post() {
if(! local_channel())
return;
$channel = \App::get_channel();
if(! Apps::system_app_installed(local_channel(), 'Permission Categories'))
return;
check_form_security_token_redirectOnErr('/settings/permcats', 'settings_permcats');
$channel = App::get_channel();
check_form_security_token_redirectOnErr('/permcats', 'permcats');
$all_perms = \Zotlabs\Access\Permissions::Perms();
$name = escape_tags(trim($_POST['name']));
if(! $name) {
notice( t('Permission Name is required.') . EOL);
notice( t('Permission category name is required.') . EOL);
return;
}
@@ -50,13 +55,21 @@ class Permcats {
if(! local_channel())
return;
$channel = \App::get_channel();
if(! Apps::system_app_installed(local_channel(), 'Permission Categories')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Permission Categories App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Create custom connection permission limits');
return $o;
}
if(argc() > 2)
$name = hex2bin(argv(2));
$channel = App::get_channel();
if(argc() > 3 && argv(3) === 'drop') {
if(argc() > 1)
$name = hex2bin(argv(1));
if(argc() > 2 && argv(2) === 'drop') {
\Zotlabs\Lib\Permcat::delete(local_channel(),$name);
build_sync_packet();
json_return_and_die([ 'success' => true ]);
@@ -93,9 +106,9 @@ class Permcats {
$tpl = get_markup_template("settings_permcats.tpl");
$tpl = get_markup_template("permcats.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("settings_permcats"),
'$form_security_token' => get_form_security_token("permcats"),
'$title' => t('Permission Categories'),
'$desc' => $desc,
'$desc2' => $desc2,
@@ -104,7 +117,7 @@ class Permcats {
'$atoken' => $atoken,
'$url1' => z_root() . '/channel/' . $channel['channel_address'],
'$url2' => z_root() . '/photos/' . $channel['channel_address'],
'$name' => array('name', t('Permission Name') . ' <span class="required">*</span>', (($name) ? $name : ''), ''),
'$name' => array('name', t('Permission category name') . ' <span class="required">*</span>', (($name) ? $name : ''), ''),
'$me' => t('My Settings'),
'$perms' => $perms,
'$inherited' => t('inherited'),

View File

@@ -4,13 +4,12 @@ namespace Zotlabs\Module;
require_once('include/security.php');
require_once('include/attach.php');
require_once('include/photo/photo_driver.php');
require_once('include/photos.php');
class Photo extends \Zotlabs\Web\Controller {
function init() {
$prvcachecontrol = false;
$streaming = null;
$channel = null;
@@ -32,26 +31,26 @@ class Photo extends \Zotlabs\Web\Controller {
}
$observer_xchan = get_observer_hash();
$ismodified = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
$default = z_root() . '/' . get_default_profile_photo();
if(isset($type)) {
/**
* Profile photos - Access controls on default profile photos are not honoured since they need to be exchanged with remote sites.
*
*/
$default = get_default_profile_photo();
if($type === 'profile') {
switch($res) {
case 'm':
$resolution = 5;
$default = z_root() . '/' . get_default_profile_photo(80);
$default = get_default_profile_photo(80);
break;
case 's':
$resolution = 6;
$default = z_root() . '/' . get_default_profile_photo(48);
$default = get_default_profile_photo(48);
break;
case 'l':
default:
@@ -60,6 +59,8 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
$modified = filemtime($default);
$default = z_root() . '/' . $default;
$uid = $person;
$d = [ 'imgscale' => $resolution, 'channel_id' => $uid, 'default' => $default, 'data' => '', 'mimetype' => '' ];
@@ -78,17 +79,18 @@ class Photo extends \Zotlabs\Web\Controller {
intval(PHOTO_PROFILE)
);
if($r) {
$modified = strtotime($r[0]['edited'] . "Z");
$data = dbunescbin($r[0]['content']);
$mimetype = $r[0]['mimetype'];
}
if(intval($r[0]['os_storage']))
$data = file_get_contents($data);
}
if(! $data) {
$data = fetch_image_from_url($default,$mimetype);
}
if(! $mimetype) {
$mimetype = 'image/png';
$x = z_fetch_url($default,true,0,[ 'novalidate' => true ]);
$data = ($x['success'] ? $x['body'] : EMPTY_STR);
$mimetype = 'image/png';
}
}
else {
@@ -124,9 +126,7 @@ class Photo extends \Zotlabs\Web\Controller {
$photo = substr($photo,0,-2);
// If viewing on a high-res screen, attempt to serve a higher resolution image:
if ($resolution == 2 && ($cookie_value > 1))
{
$resolution = 1;
}
}
$r = q("SELECT uid, photo_usage FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
@@ -151,18 +151,6 @@ class Photo extends \Zotlabs\Web\Controller {
$allowed = attach_can_view($r[0]['uid'],$observer_xchan,$photo);
}
if(intval($r[0]['photo_usage'])) {
$allowed = 1;
if(intval($r[0]['photo_usage']) === PHOTO_COVER)
if($resolution < PHOTO_RES_COVER_1200)
$allowed = (-1);
if(intval($r[0]['photo_usage']) === PHOTO_PROFILE)
if(! in_array($resolution,[4,5,6]))
$allowed = (-1);
}
if($allowed === (-1))
$allowed = attach_can_view($r[0]['uid'],$observer_xchan,$photo);
$channel = channelx_by_n($r[0]['uid']);
// Now we'll see if we can access the photo
@@ -175,10 +163,13 @@ class Photo extends \Zotlabs\Web\Controller {
if($exists && $allowed) {
$data = dbunescbin($e[0]['content']);
$filesize = $e[0]['filesize'];
$mimetype = $e[0]['mimetype'];
if(intval($e[0]['os_storage'])) {
$modified = strtotime($e[0]['edited'] . 'Z');
if(intval($e[0]['os_storage']))
$streaming = $data;
}
if($e[0]['allow_cid'] != '' || $e[0]['allow_gid'] != '' || $e[0]['deny_gid'] != '' || $e[0]['deny_gid'] != '')
$prvcachecontrol = true;
}
else {
if(! $allowed) {
@@ -189,27 +180,40 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
} else {
http_status_exit(404,'not found');
}
}
header_remove('Pragma');
if($ismodified === gmdate("D, d M Y H:i:s", $modified) . " GMT") {
header_remove('Expires');
header_remove('Cache-Control');
header_remove('Set-Cookie');
http_status_exit(304,'not modified');
}
if(! isset($data)) {
if(isset($resolution)) {
switch($resolution) {
case 4:
$data = fetch_image_from_url(z_root() . '/' . get_default_profile_photo(),$mimetype);
$default = get_default_profile_photo();
break;
case 5:
$data = fetch_image_from_url(z_root() . '/' . get_default_profile_photo(80),$mimetype);
$default = get_default_profile_photo(80);
break;
case 6:
$data = fetch_image_from_url(z_root() . '/' . get_default_profile_photo(48),$mimetype);
$default = get_default_profile_photo(48);
break;
default:
killme();
// NOTREACHED
break;
}
$x = z_fetch_url(z_root() . '/' . $default,true,0,[ 'novalidate' => true ]);
$data = ($x['success'] ? $x['body'] : EMPTY_STR);
$mimetype = 'image/png';
}
}
@@ -222,15 +226,14 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
// @FIXME Seems never invoked
// Writing in cachefile
if (isset($cachefile) && $cachefile != '')
if (isset($cachefile) && $cachefile != '') {
file_put_contents($cachefile, $data);
if(function_exists('header_remove')) {
header_remove('Pragma');
header_remove('pragma');
$modified = filemtime($cachefile);
}
header("Content-type: " . $mimetype);
if($prvcachecontrol) {
@@ -252,15 +255,16 @@ class Photo extends \Zotlabs\Web\Controller {
// This has performance considerations but we highly recommend you
// leave it alone.
$cache = get_config('system','photo_cache_time');
if(! $cache)
$cache = (3600 * 24); // 1 day
$cache = get_config('system','photo_cache_time', 86400); // 1 day by default
header("Expires: " . gmdate("D, d M Y H:i:s", time() + $cache) . " GMT");
header("Cache-Control: max-age=" . $cache);
}
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modified) . " GMT");
header("Content-Length: " . (isset($filesize) ? $filesize : strlen($data)));
// If it's a file resource, stream it.
if($streaming && $channel) {

View File

@@ -263,7 +263,8 @@ class Photos extends \Zotlabs\Web\Controller {
$fsize = strlen($data);
}
$x = q("update photo set content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 0",
$x = q("update photo set edited = '%s', content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 0",
dbesc(datetime_convert()),
dbescbin($data),
intval($fsize),
intval($height),
@@ -277,9 +278,13 @@ class Photos extends \Zotlabs\Web\Controller {
$width = $ph->getWidth();
$height = $ph->getHeight();
$data = $ph->imageString();
$fsize = strlen($data);
$x = q("update photo set content = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 1",
dbescbin($ph->imageString()),
$x = q("update photo set edited = '%s', content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 1",
dbesc(datetime_convert()),
dbescbin($data),
intval($fsize),
intval($height),
intval($width),
dbesc($resource_id),
@@ -292,9 +297,13 @@ class Photos extends \Zotlabs\Web\Controller {
$width = $ph->getWidth();
$height = $ph->getHeight();
$data = $ph->imageString();
$fsize = strlen($data);
$x = q("update photo set content = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 2",
dbescbin($ph->imageString()),
$x = q("update photo set edited = '%s', content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 2",
dbesc(datetime_convert()),
dbescbin($data),
intval($fsize),
intval($height),
intval($width),
dbesc($resource_id),
@@ -307,9 +316,13 @@ class Photos extends \Zotlabs\Web\Controller {
$width = $ph->getWidth();
$height = $ph->getHeight();
$data = $ph->imageString();
$fsize = strlen($data);
$x = q("update photo set content = '%s', height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 3",
dbescbin($ph->imageString()),
$x = q("update photo set edited = '%s', content = '%s', filesize = %d, height = %d, width = %d where resource_id = '%s' and uid = %d and imgscale = 3",
dbesc(datetime_convert()),
dbescbin($data),
intval($fsize),
intval($height),
intval($width),
dbesc($resource_id),
@@ -612,18 +625,15 @@ class Photos extends \Zotlabs\Web\Controller {
nav_set_selected('Photos');
$o = '<script src="library/blueimp_upload/js/vendor/jquery.ui.widget.js"></script>
<script src="library/blueimp_upload/js/jquery.iframe-transport.js"></script>
<script src="library/blueimp_upload/js/jquery.fileupload.js"></script>';
$o = '<script src="vendor/blueimp/jquery-file-upload/js/vendor/jquery.ui.widget.js"></script>
<script src="vendor/blueimp/jquery-file-upload/js/jquery.iframe-transport.js"></script>
<script src="vendor/blueimp/jquery-file-upload/js/jquery.fileupload.js"></script>';
$o .= "<script> var profile_uid = " . \App::$profile['profile_uid']
. "; var netargs = '?f='; var profile_page = " . \App::$pager['page'] . "; </script>\r\n";
// tabs
$_is_owner = (local_channel() && (local_channel() == $owner_uid));
//$o .= profile_tabs($a,$_is_owner, \App::$data['channel']['channel_address']);
/**
* Display upload form
@@ -978,7 +988,7 @@ class Photos extends \Zotlabs\Web\Controller {
$photo = array(
'href' => z_root() . '/photo/' . $hires['resource_id'] . '-' . $hires['imgscale'] . '.' . $phototypes[$hires['mimetype']],
'title'=> t('View Full Size'),
'src' => z_root() . '/photo/' . $lores['resource_id'] . '-' . $lores['imgscale'] . '.' . $phototypes[$lores['mimetype']] . '?f=&_u=' . datetime_convert('','','','ymdhis')
'src' => z_root() . '/photo/' . $lores['resource_id'] . '-' . $lores['imgscale'] . '.' . $phototypes[$lores['mimetype']]
);
if($nextlink)
@@ -1112,6 +1122,7 @@ class Photos extends \Zotlabs\Web\Controller {
$comments = '';
if(! $r) {
if($observer && ($can_post || $can_comment)) {
$feature_auto_save_draft = ((feature_enabled($owner_uid, 'auto_save_draft')) ? "true" : "false");
$commentbox = replace_macros($cmnt_tpl,array(
'$return_path' => '',
'$mode' => 'photos',
@@ -1127,7 +1138,8 @@ class Photos extends \Zotlabs\Web\Controller {
'$submit' => t('Submit'),
'$preview' => t('Preview'),
'$ww' => '',
'$feature_encrypt' => false
'$feature_encrypt' => false,
'$auto_save_draft' => $feature_auto_save_draft
));
}
}
@@ -1260,8 +1272,14 @@ class Photos extends \Zotlabs\Web\Controller {
if(feature_enabled($owner_uid,'dislike'))
$response_verbs[] = 'dislike';
$responses = get_responses($conv_responses,$response_verbs,'',$link_item);
$hookdata = [
'onclick' => '$.colorbox({href: \'' . $photo['href'] . '\'}); return false;',
'raw_photo' => $ph[0],
'nickname' => \App::$data['channel']['channel_address']
];
call_hooks('photo_view_filter', $hookdata);
$photo_tpl = get_markup_template('photo_view.tpl');
$o .= replace_macros($photo_tpl, array(
@@ -1299,6 +1317,7 @@ class Photos extends \Zotlabs\Web\Controller {
'$comments' => $comments,
'$commentbox' => $commentbox,
'$paginate' => $paginate,
'$onclick' => $hookdata['onclick']
));
\App::$data['photo_html'] = $o;

View File

@@ -2,6 +2,8 @@
namespace Zotlabs\Module;
use Zotlabs\Lib\Apps;
require_once('include/bbcode.php');
/**
@@ -147,9 +149,12 @@ class Ping extends \Zotlabs\Web\Controller {
if(! ($vnotify & VNOTIFY_LIKE))
$sql_extra = " AND verb NOT IN ('" . dbesc(ACTIVITY_LIKE) . "', '" . dbesc(ACTIVITY_DISLIKE) . "') ";
$discover_tab_on = can_view_public_stream();
$notify_pubs = ((local_channel()) ? ($vnotify & VNOTIFY_PUBS) && $discover_tab_on : $discover_tab_on);
if(local_channel()) {
$notify_pubs = ($vnotify & VNOTIFY_PUBS) && can_view_public_stream() && Apps::system_app_installed(local_channel(), 'Public Stream');
}
else {
$notify_pubs = can_view_public_stream();
}
if($notify_pubs) {
$sys = get_sys_channel();
@@ -325,6 +330,7 @@ class Ping extends \Zotlabs\Web\Controller {
$notifs[] = array(
'notify_link' => z_root() . '/mail/' . $zz['id'],
'name' => $zz['xchan_name'],
'addr' => $zz['xchan_addr'],
'url' => $zz['xchan_url'],
'photo' => $zz['xchan_photo_s'],
'when' => relative_date($zz['created']),
@@ -341,6 +347,10 @@ class Ping extends \Zotlabs\Web\Controller {
if(argc() > 1 && (argv(1) === 'network' || argv(1) === 'home')) {
$result = array();
if(argv(1) === 'home') {
$sql_extra .= ' and item_wall = 1 ';
}
$r = q("SELECT * FROM item
WHERE uid = %d
AND item_unseen = 1
@@ -356,8 +366,6 @@ class Ping extends \Zotlabs\Web\Controller {
if($r) {
xchan_query($r);
foreach($r as $item) {
if((argv(1) === 'home') && (! intval($item['item_wall'])))
continue;
$result[] = \Zotlabs\Lib\Enotify::format($item);
}
}
@@ -378,6 +386,7 @@ class Ping extends \Zotlabs\Web\Controller {
$result[] = array(
'notify_link' => z_root() . '/connections/ifpending',
'name' => $rr['xchan_name'],
'addr' => $rr['xchan_addr'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
'when' => relative_date($rr['abook_created']),
@@ -402,6 +411,7 @@ class Ping extends \Zotlabs\Web\Controller {
$result[] = array(
'notify_link' => z_root() . '/admin/accounts',
'name' => $rr['account_email'],
'addr' => $rr['account_email'],
'url' => '',
'photo' => z_root() . '/' . get_default_profile_photo(48),
'when' => relative_date($rr['account_created']),
@@ -439,6 +449,7 @@ class Ping extends \Zotlabs\Web\Controller {
$result[] = array(
'notify_link' => z_root() . '/events', /// @FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
'name' => $rr['xchan_name'],
'addr' => $rr['xchan_addr'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
'when' => $when,
@@ -455,7 +466,7 @@ class Ping extends \Zotlabs\Web\Controller {
if(argc() > 1 && (argv(1) === 'files')) {
$result = array();
$r = q("SELECT item.created, xchan.xchan_name, xchan.xchan_url, xchan.xchan_photo_s FROM item
$r = q("SELECT item.created, xchan.xchan_name, xchan.xchan_addr, xchan.xchan_url, xchan.xchan_photo_s FROM item
LEFT JOIN xchan on author_xchan = xchan_hash
WHERE item.verb = '%s'
AND item.obj_type = '%s'
@@ -472,6 +483,7 @@ class Ping extends \Zotlabs\Web\Controller {
$result[] = array(
'notify_link' => z_root() . '/sharedwithme',
'name' => $rr['xchan_name'],
'addr' => $rr['xchan_addr'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
'when' => relative_date($rr['created']),
@@ -629,24 +641,31 @@ class Ping extends \Zotlabs\Web\Controller {
if($vnotify & VNOTIFY_FORUMS) {
$forums = get_forum_channels(local_channel());
if(! $forums) {
$result['forums'] = 0;
}
else {
$perms_sql = item_permissions_sql(local_channel()) . item_normal();
if($forums) {
$item_normal = item_normal();
$fcount = count($forums);
$forums['total'] = 0;
for($x = 0; $x < $fcount; $x ++) {
$r = q("select sum(item_unseen) as unseen from item
where uid = %d and owner_xchan = '%s' and item_unseen = 1 $perms_sql ",
$p = q("SELECT oid AS parent FROM term WHERE uid = %d AND ttype = %d AND term = '%s'",
intval(local_channel()),
intval(TERM_FORUM),
dbesc($forums[$x]['xchan_name'])
);
$p_str = ids_to_querystr($p, 'parent');
$p_sql = (($p_str) ? "OR parent IN ( $p_str )" : '');
$r = q("select count(id) as unseen from item
where uid = %d and ( owner_xchan = '%s' OR author_xchan = '%s' $p_sql ) and item_unseen = 1 $item_normal $sql_extra",
intval(local_channel()),
dbesc($forums[$x]['xchan_hash']),
dbesc($forums[$x]['xchan_hash'])
);
if($r[0]['unseen']) {
$forums[$x]['notify_link'] = (($forums[$x]['private_forum']) ? $forums[$x]['xchan_url'] : z_root() . '/network/?f=&pf=1&cid=' . $forums[$x]['abook_id']);
$forums[$x]['notify_link'] = (($forums[$x]['private_forum']) ? $forums[$x]['xchan_url'] : z_root() . '/network/?f=&pf=1&unseen=1&cid=' . $forums[$x]['abook_id']);
$forums[$x]['name'] = $forums[$x]['xchan_name'];
$forums[$x]['addr'] = $forums[$x]['xchan_addr'];
$forums[$x]['url'] = $forums[$x]['xchan_url'];
$forums[$x]['photo'] = $forums[$x]['xchan_photo_s'];
$forums[$x]['unseen'] = $r[0]['unseen'];

View File

@@ -1,6 +1,10 @@
<?php
namespace Zotlabs\Module; /** @file */
use App;
use Zotlabs\Lib\Apps;
use Zotlabs\Web\Controller;
/**
*
* Poke, prod, finger, or otherwise do unspeakable things to somebody - who must be a connection in your address book
@@ -18,15 +22,19 @@ namespace Zotlabs\Module; /** @file */
require_once('include/items.php');
class Poke extends \Zotlabs\Web\Controller {
class Poke extends Controller {
function init() {
if(! local_channel())
return;
if(! Apps::system_app_installed(local_channel(), 'Poke')) {
return;
}
$uid = local_channel();
$channel = \App::get_channel();
$channel = App::get_channel();
$verb = notags(trim($_REQUEST['verb']));
@@ -150,6 +158,15 @@ class Poke extends \Zotlabs\Web\Controller {
return;
}
if(! Apps::system_app_installed(local_channel(), 'Poke')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Poke App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Poke somebody in your addressbook');
return $o;
}
nav_set_selected('Poke');
$name = '';

View File

@@ -1,16 +1,29 @@
<?php
namespace Zotlabs\Module;
require_once('include/zot.php');
use App;
use Zotlabs\Lib\Apps;
require_once('include/zot.php');
class Probe extends \Zotlabs\Web\Controller {
function get() {
if(local_channel()) {
if(! Apps::system_app_installed(local_channel(), 'Remote Diagnostics')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Remote Diagnostics App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Perform diagnostics on remote channels');
return $o;
}
}
nav_set_selected('Remote Diagnostics');
$o .= '<h3>Probe Diagnostic</h3>';
$o .= '<h3>Remote Diagnostics</h3>';
$o .= '<form action="probe" method="get">';
$o .= 'Lookup address: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" />';
@@ -19,7 +32,7 @@ class Probe extends \Zotlabs\Web\Controller {
$o .= '<br /><br />';
if(x($_GET,'addr')) {
$channel = \App::get_channel();
$channel = App::get_channel();
$addr = trim($_GET['addr']);
$do_import = ((intval($_GET['import']) && is_site_admin()) ? true : false);
@@ -27,12 +40,11 @@ class Probe extends \Zotlabs\Web\Controller {
$o .= '<pre>';
if(! $j['success']) {
$o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
$o .= "<strong>https connection failed. Trying again with auto failover to http.</strong>\r\n\r\n";
$j = \Zotlabs\Zot\Finger::run($addr,$channel,true);
if(! $j['success'])
$o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
if(! $j['success']) {
return $o;
}
}
if($do_import && $j)
$x = import_xchan($j);

View File

@@ -8,8 +8,8 @@ require_once('include/selectors.php');
class Profiles extends \Zotlabs\Web\Controller {
function init() {
nav_set_selected('Profiles');
nav_set_selected('Profiles', 'settings/profiles');
if(! local_channel()) {
return;

View File

@@ -1,6 +1,9 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
@@ -9,6 +12,17 @@ class Pubstream extends \Zotlabs\Web\Controller {
function get($update = 0, $load = false) {
if(local_channel()) {
if(! Apps::system_app_installed(local_channel(), 'Public Stream')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Public Stream App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('The unmoderated public stream of this hub');
return $o;
}
}
if($load)
$_SESSION['loadtime'] = datetime_convert();
@@ -81,7 +95,7 @@ class Pubstream extends \Zotlabs\Web\Controller {
);
$o = '<div id="jot-popup">';
$o .= status_editor($a,$x);
$o .= status_editor($a,$x,false,'Pubstream');
$o .= '</div>';
}

View File

@@ -1,11 +1,17 @@
<?php
namespace Zotlabs\Module;
use App;
use Zotlabs\Lib\Apps;
class Randprof extends \Zotlabs\Web\Controller {
function init() {
if(local_channel()) {
if(! Apps::system_app_installed(local_channel(), 'Random Channel'))
return;
}
$x = random_profile();
if($x)
goaway(chanlink_hash($x));
@@ -13,5 +19,19 @@ class Randprof extends \Zotlabs\Web\Controller {
/** FIXME this doesn't work at the moment as a fallback */
goaway(z_root() . '/profile');
}
function get() {
if(local_channel()) {
if(! Apps::system_app_installed(local_channel(), 'Random Channel')) {
//Do not display any associated widgets at this point
App::$pdl = '';
$o = '<b>' . t('Random Channel App') . ' (' . t('Not Installed') . '):</b><br>';
$o .= t('Visit a random channel in the $Projectname network');
return $o;
}
}
}
}

View File

@@ -227,11 +227,6 @@ class Register extends \Zotlabs\Web\Controller {
$perm_roles = \Zotlabs\Access\PermissionRoles::roles();
// A new account will not have a techlevel, but accounts can also be created by the administrator.
if((get_account_techlevel() < 4) && $privacy_role !== 'custom')
unset($perm_roles[t('Other')]);
// Configurable terms of service link
$tosurl = get_config('system','tos_url');

View File

@@ -138,7 +138,7 @@ class Rpost extends \Zotlabs\Web\Controller {
'jotnets' => true
);
$editor = status_editor($a,$x);
$editor = status_editor($a,$x,false,'Rpost');
$o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
'$title' => t('Edit post'),

View File

@@ -6,7 +6,7 @@ class Search extends \Zotlabs\Web\Controller {
function init() {
if(x($_REQUEST,'search'))
\App::$data['search'] = $_REQUEST['search'];
\App::$data['search'] = escape_tags($_REQUEST['search']);
}
@@ -46,12 +46,12 @@ class Search extends \Zotlabs\Web\Controller {
if(x(\App::$data,'search'))
$search = trim(\App::$data['search']);
else
$search = ((x($_GET,'search')) ? trim(rawurldecode($_GET['search'])) : '');
$search = ((x($_GET,'search')) ? trim(escape_tags(rawurldecode($_GET['search']))) : '');
$tag = false;
if(x($_GET,'tag')) {
$tag = true;
$search = ((x($_GET,'tag')) ? trim(rawurldecode($_GET['tag'])) : '');
$search = ((x($_GET,'tag')) ? trim(escape_tags(rawurldecode($_GET['tag']))) : '');
}
$static = ((array_key_exists('static',$_REQUEST)) ? intval($_REQUEST['static']) : 0);
@@ -227,9 +227,9 @@ class Search extends \Zotlabs\Web\Controller {
}
if($tag)
$o .= '<h2>' . sprintf( t('Items tagged with: %s'),htmlspecialchars($search, ENT_COMPAT,'UTF-8')) . '</h2>';
$o .= '<h2>' . sprintf( t('Items tagged with: %s'),$search) . '</h2>';
else
$o .= '<h2>' . sprintf( t('Search results for: %s'),htmlspecialchars($search, ENT_COMPAT,'UTF-8')) . '</h2>';
$o .= '<h2>' . sprintf( t('Search results for: %s'),$search) . '</h2>';
$o .= conversation($items,'search',$update,'client');

View File

@@ -12,7 +12,6 @@ class Account {
$errs = array();
$email = ((x($_POST,'email')) ? trim(notags($_POST['email'])) : '');
$techlevel = ((array_key_exists('techlevel',$_POST)) ? intval($_POST['techlevel']) : 0);
$account = \App::get_account();
if($email != $account['account_email']) {
@@ -32,13 +31,6 @@ class Account {
$errs[] = t('System failure storing new email. Please try again.');
}
}
if($techlevel != $account['account_level']) {
$r = q("update account set account_level = %d where account_id = %d",
intval($techlevel),
intval($account['account_id'])
);
info( t('Technical skill level updated') . EOL);
}
if($errs) {
foreach($errs as $err)
@@ -101,11 +93,6 @@ class Account {
$email = \App::$account['account_email'];
$techlevels = \Zotlabs\Lib\Techlevels::levels();
$def_techlevel = \App::$account['account_level'];
$techlock = get_config('system','techlevel_lock');
$tpl = get_markup_template("settings_account.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("settings_account"),
@@ -113,8 +100,6 @@ class Account {
'$origpass' => array('origpass', t('Current Password'), ' ',''),
'$password1'=> array('npassword', t('Enter New Password'), '', ''),
'$password2'=> array('confirm', t('Confirm New Password'), '', t('Leave password fields blank unless changing')),
'$techlevel' => [ 'techlevel', t('Your technical skill level'), $def_techlevel, t('Used to provide a member experience and additional features consistent with your comfort level'), $techlevels ],
'$techlock' => $techlock,
'$submit' => t('Submit'),
'$email' => array('email', t('Email Address:'), $email, ''),
'$removeme' => t('Remove Account'),

View File

@@ -0,0 +1,47 @@
<?php
namespace Zotlabs\Module\Settings;
class Calendar {
function post() {
$module = substr(strrchr(strtolower(static::class), '\\'), 1);
check_form_security_token_redirectOnErr('/settings/' . $module, 'settings_' . $module);
$features = get_module_features($module);
process_module_features_post(local_channel(), $features, $_POST);
build_sync_packet();
if($_POST['rpath'])
goaway($_POST['rpath']);
return;
}
function get() {
$module = substr(strrchr(strtolower(static::class), '\\'), 1);
$features = get_module_features($module);
$rpath = (($_GET['rpath']) ? $_GET['rpath'] : '');
$tpl = get_markup_template("settings_module.tpl");
$o .= replace_macros($tpl, array(
'$rpath' => $rpath,
'$action_url' => 'settings/' . $module,
'$form_security_token' => get_form_security_token('settings_' . $module),
'$title' => t('CalDAV Settings'),
'$features' => process_module_features_get(local_channel(), $features),
'$submit' => t('Submit')
));
return $o;
}
}

View File

@@ -2,6 +2,8 @@
namespace Zotlabs\Module\Settings;
use Zotlabs\Lib\Apps;
require_once('include/selectors.php');
@@ -63,7 +65,7 @@ class Channel {
}
$hide_presence = 1 - (intval($role_permissions['online']));
if($role_permissions['default_collection']) {
$r = q("select hash from groups where uid = %d and gname = '%s' limit 1",
$r = q("select hash from pgrp where uid = %d and gname = '%s' limit 1",
intval(local_channel()),
dbesc( t('Friends') )
);
@@ -71,7 +73,7 @@ class Channel {
require_once('include/group.php');
group_add(local_channel(), t('Friends'));
group_add_member(local_channel(),t('Friends'),$channel['channel_hash']);
$r = q("select hash from groups where uid = %d and gname = '%s' limit 1",
$r = q("select hash from pgrp where uid = %d and gname = '%s' limit 1",
intval(local_channel()),
dbesc( t('Friends') )
);
@@ -133,8 +135,6 @@ class Channel {
$photo_path = ((x($_POST,'photo_path')) ? escape_tags(trim($_POST['photo_path'])) : '');
$attach_path = ((x($_POST,'attach_path')) ? escape_tags(trim($_POST['attach_path'])) : '');
$channel_menu = ((x($_POST['channel_menu'])) ? htmlspecialchars_decode(trim($_POST['channel_menu']),ENT_QUOTES) : '');
$expire_items = ((x($_POST,'expire_items')) ? intval($_POST['expire_items']) : 0);
$expire_starred = ((x($_POST,'expire_starred')) ? intval($_POST['expire_starred']) : 0);
$expire_photos = ((x($_POST,'expire_photos'))? intval($_POST['expire_photos']) : 0);
@@ -154,10 +154,7 @@ class Channel {
$adult = (($_POST['adult'] == 1) ? 1 : 0);
$defpermcat = ((x($_POST,'defpermcat')) ? notags(trim($_POST['defpermcat'])) : 'default');
$cal_first_day = (((x($_POST,'first_day')) && (intval($_POST['first_day']) == 1)) ? 1: 0);
$mailhost = ((array_key_exists('mailhost',$_POST)) ? notags(trim($_POST['mailhost'])) : '');
$profile_assign = ((x($_POST,'profile_assign')) ? notags(trim($_POST['profile_assign'])) : '');
$pageflags = $channel['channel_pageflags'];
$existing_adult = (($pageflags & PAGE_ADULT) ? 1 : 0);
@@ -245,16 +242,13 @@ class Channel {
set_pconfig(local_channel(),'system','post_joingroup', $post_joingroup);
set_pconfig(local_channel(),'system','post_profilechange', $post_profilechange);
set_pconfig(local_channel(),'system','blocktags',$blocktags);
set_pconfig(local_channel(),'system','channel_menu',$channel_menu);
set_pconfig(local_channel(),'system','vnotify',$vnotify);
set_pconfig(local_channel(),'system','always_show_in_notices',$always_show_in_notices);
set_pconfig(local_channel(),'system','evdays',$evdays);
set_pconfig(local_channel(),'system','photo_path',$photo_path);
set_pconfig(local_channel(),'system','attach_path',$attach_path);
set_pconfig(local_channel(),'system','cal_first_day',$cal_first_day);
set_pconfig(local_channel(),'system','default_permcat',$defpermcat);
set_pconfig(local_channel(),'system','email_notify_host',$mailhost);
set_pconfig(local_channel(),'system','profile_assign',$profile_assign);
set_pconfig(local_channel(),'system','autoperms',$autoperms);
$r = q("update channel set channel_name = '%s', channel_pageflags = %d, channel_timezone = '%s', channel_location = '%s', channel_notifyflags = %d, channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d $set_perms where channel_id = %d",
@@ -434,7 +428,7 @@ class Channel {
'$nickname' => (($intl_nickname === $webbie) ? $webbie : $intl_nickname . '&nbsp;(' . $webbie . ')'),
'$subdir' => $subdir,
'$davdesc' => t('Your files/photos are accessible via WebDAV at'),
'$davpath' => ((get_account_techlevel() > 3) ? z_root() . '/dav/' . $nickname : ''),
'$davpath' => z_root() . '/dav/' . $nickname,
'$basepath' => \App::get_hostname()
));
@@ -460,18 +454,6 @@ class Channel {
require_once('include/group.php');
$group_select = mini_group_select(local_channel(),$channel['channel_default_group']);
require_once('include/menu.php');
$m1 = menu_list(local_channel());
$menu = false;
if($m1) {
$menu = array();
$current = get_pconfig(local_channel(),'system','channel_menu');
$menu[] = array('name' => '', 'selected' => ((! $current) ? true : false));
foreach($m1 as $m) {
$menu[] = array('name' => htmlspecialchars($m['menu_name'],ENT_COMPAT,'UTF-8'), 'selected' => (($m['menu_name'] === $current) ? ' selected="selected" ' : false));
}
}
$evdays = get_pconfig(local_channel(),'system','evdays');
if(! $evdays)
$evdays = 3;
@@ -492,18 +474,13 @@ class Channel {
$permissions_set = (($permissions_role != 'custom') ? true : false);
$perm_roles = \Zotlabs\Access\PermissionRoles::roles();
if((get_account_techlevel() < 4) && $permissions_role !== 'custom')
unset($perm_roles[t('Other')]);
$vnotify = get_pconfig(local_channel(),'system','vnotify');
$always_show_in_notices = get_pconfig(local_channel(),'system','always_show_in_notices');
if($vnotify === false)
$vnotify = (-1);
$plugin = [ 'basic' => '', 'security' => '', 'notify' => '', 'misc' => '' ];
$plugin = [ 'basic' => '', 'security' => '', 'notify' => '' ];
call_hooks('channel_settings',$plugin);
$disable_discover_tab = intval(get_config('system','disable_discover_tab',1)) == 1;
@@ -548,8 +525,6 @@ class Channel {
'$permissions' => t('Default Privacy Group'),
'$permdesc' => t("\x28click to open/close\x29"),
'$aclselect' => populate_acl($perm_defaults, false, \Zotlabs\Lib\PermissionDescription::fromDescription(t('Use my default audience setting for the type of object published'))),
'$profseltxt' => t('Profile to assign new connections'),
'$profselect' => ((feature_enabled(local_channel(),'multi_profiles')) ? contact_profile_assign(get_pconfig(local_channel(),'system','profile_assign','')) : ''),
'$allow_cid' => acl2json($perm_defaults['allow_cid']),
'$allow_gid' => acl2json($perm_defaults['allow_gid']),
@@ -558,8 +533,8 @@ class Channel {
'$suggestme' => $suggestme,
'$group_select' => $group_select,
'$role' => array('permissions_role' , t('Channel role and privacy'), $permissions_role, '', $perm_roles),
'$defpermcat' => [ 'defpermcat', t('Default Permissions Group'), $default_permcat, '', $permcats ],
'$permcat_enable' => feature_enabled(local_channel(),'permcats'),
'$defpermcat' => [ 'defpermcat', t('Default permissions category'), $default_permcat, '', $permcats ],
'$permcat_enable' => Apps::system_app_installed(local_channel(), 'Permission Categories'),
'$profile_in_dir' => $profile_in_dir,
'$hide_friends' => $hide_friends,
'$hide_wall' => $hide_wall,
@@ -587,7 +562,7 @@ class Channel {
'$lbl_vnot' => t('Show visual notifications including:'),
'$vnotify1' => array('vnotify1', t('Unseen grid activity'), ($vnotify & VNOTIFY_NETWORK), VNOTIFY_NETWORK, '', $yes_no),
'$vnotify1' => array('vnotify1', t('Unseen stream activity'), ($vnotify & VNOTIFY_NETWORK), VNOTIFY_NETWORK, '', $yes_no),
'$vnotify2' => array('vnotify2', t('Unseen channel activity'), ($vnotify & VNOTIFY_CHANNEL), VNOTIFY_CHANNEL, '', $yes_no),
'$vnotify3' => array('vnotify3', t('Unseen private messages'), ($vnotify & VNOTIFY_MAIL), VNOTIFY_MAIL, t('Recommended'), $yes_no),
'$vnotify4' => array('vnotify4', t('Upcoming events'), ($vnotify & VNOTIFY_EVENT), VNOTIFY_EVENT, '', $yes_no),
@@ -599,7 +574,7 @@ class Channel {
'$vnotify10' => array('vnotify10', t('New connections'), ($vnotify & VNOTIFY_INTRO), VNOTIFY_INTRO, t('Recommended'), $yes_no),
'$vnotify11' => ((is_site_admin()) ? array('vnotify11', t('System Registrations'), ($vnotify & VNOTIFY_REGISTER), VNOTIFY_REGISTER, '', $yes_no) : array()),
'$vnotify12' => array('vnotify12', t('Unseen shared files'), ($vnotify & VNOTIFY_FILES), VNOTIFY_FILES, '', $yes_no),
'$vnotify13' => (($disable_discover_tab && !$site_firehose) ? array() : array('vnotify13', t('Unseen public activity'), ($vnotify & VNOTIFY_PUBS), VNOTIFY_PUBS, '', $yes_no)),
'$vnotify13' => ((($disable_discover_tab && !$site_firehose) || !Apps::system_app_installed(local_channel(), 'Public Stream')) ? array() : array('vnotify13', t('Unseen public stream activity'), ($vnotify & VNOTIFY_PUBS), VNOTIFY_PUBS, '', $yes_no)),
'$vnotify14' => array('vnotify14', t('Unseen likes and dislikes'), ($vnotify & VNOTIFY_LIKE), VNOTIFY_LIKE, '', $yes_no),
'$vnotify15' => array('vnotify15', t('Unseen forum posts'), ($vnotify & VNOTIFY_FORUMS), VNOTIFY_FORUMS, '', $yes_no),
'$mailhost' => [ 'mailhost', t('Email notification hub (hostname)'), get_pconfig(local_channel(),'system','email_notify_host',\App::get_hostname()), sprintf( t('If your channel is mirrored to multiple hubs, set this to your preferred location. This will prevent duplicate email notifications. Example: %s'),\App::get_hostname()) ],
@@ -609,7 +584,6 @@ class Channel {
'$basic_addon' => $plugin['basic'],
'$sec_addon' => $plugin['security'],
'$notify_addon' => $plugin['notify'],
'$misc_addon' => $plugin['misc'],
'$h_advn' => t('Advanced Account/Page Type Settings'),
'$h_descadvn' => t('Change the behaviour of this account for special situations'),
@@ -617,12 +591,8 @@ class Channel {
'$lbl_misc' => t('Miscellaneous Settings'),
'$photo_path' => array('photo_path', t('Default photo upload folder'), get_pconfig(local_channel(),'system','photo_path'), t('%Y - current year, %m - current month')),
'$attach_path' => array('attach_path', t('Default file upload folder'), get_pconfig(local_channel(),'system','attach_path'), t('%Y - current year, %m - current month')),
'$menus' => $menu,
'$menu_desc' => t('Personal menu to display in your channel pages'),
'$removeme' => t('Remove Channel'),
'$removechannel' => t('Remove this channel.'),
'$firefoxshare' => t('Firefox Share $Projectname provider'),
'$cal_first_day' => array('first_day', t('Start calendar week on Monday'), ((get_pconfig(local_channel(),'system','cal_first_day')) ? 1 : ''), '', $yes_no),
));
call_hooks('settings_form',$o);

View File

@@ -0,0 +1,95 @@
<?php
namespace Zotlabs\Module\Settings;
require_once('include/menu.php');
class Channel_home {
function post() {
$module = substr(strrchr(strtolower(static::class), '\\'), 1);
check_form_security_token_redirectOnErr('/settings/' . $module, 'settings_' . $module);
$features = get_module_features($module);
process_module_features_post(local_channel(), $features, $_POST);
$channel_divmore_height = ((x($_POST,'channel_divmore_height')) ? intval($_POST['channel_divmore_height']) : 400);
if($channel_divmore_height < 50)
$channel_divmore_height = 50;
set_pconfig(local_channel(),'system','channel_divmore_height', $channel_divmore_height);
$channel_menu = ((x($_POST['channel_menu'])) ? htmlspecialchars_decode(trim($_POST['channel_menu']),ENT_QUOTES) : '');
set_pconfig(local_channel(),'system','channel_menu',$channel_menu);
build_sync_packet();
if($_POST['rpath'])
goaway($_POST['rpath']);
return;
}
function get() {
$module = substr(strrchr(strtolower(static::class), '\\'), 1);
$features = get_module_features($module);
$rpath = (($_GET['rpath']) ? $_GET['rpath'] : '');
$channel_divmore_height = [
'channel_divmore_height',
t('Max height of content (in pixels)'),
((get_pconfig(local_channel(),'system','channel_divmore_height')) ? get_pconfig(local_channel(),'system','channel_divmore_height') : 400),
t('Click to expand content exceeding this height')
];
$menus = menu_list(local_channel());
if($menus) {
$current = get_pconfig(local_channel(),'system','channel_menu');
$menu[] = '';
foreach($menus as $m) {
$menu[$m['menu_name']] = htmlspecialchars($m['menu_name'],ENT_COMPAT,'UTF-8');
}
$menu_select = [
'channel_menu',
t('Personal menu to display in your channel pages'),
$current,
'',
$menu
];
}
$extra_settings_html = replace_macros(get_markup_template('field_input.tpl'),
[
'$field' => $channel_divmore_height
]
);
if($menu) {
$extra_settings_html .= replace_macros(get_markup_template('field_select.tpl'),
[
'$field' => $menu_select
]
);
}
$tpl = get_markup_template("settings_module.tpl");
$o .= replace_macros($tpl, array(
'$rpath' => $rpath,
'$action_url' => 'settings/' . $module,
'$form_security_token' => get_form_security_token('settings_' . $module),
'$title' => t('Channel Home Settings'),
'$features' => process_module_features_get(local_channel(), $features),
'$extra_settings_html' => $extra_settings_html,
'$submit' => t('Submit')
));
return $o;
}
}

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