Compare commits

...

1423 Commits
1.12 ... 2.2

Author SHA1 Message Date
Mario Vavti
bc2b948f1f Merge branch 2.2RC 2017-03-08 09:39:46 +01:00
Mario Vavti
ff9442474d version 2.2 and changelog 2017-03-08 09:28:58 +01:00
zotlabs
92996e550c allow post_activity_item to be passed an empty ACL without resetting to channel default 2017-03-06 21:02:50 -08:00
zotlabs
c3c4254882 add public_policy to the nwiki container also. This should not affect the recent bug as presented, but is being added for consistency. 2017-03-06 18:01:18 -08:00
zotlabs
751c4c3169 correct fix for wiki anonymous read issue (items_permissions_sql checks item.public_policy which was set for posts, not wikis) 2017-03-06 15:35:17 -08:00
jeroenpraat
f783d594cc Big 2.2 string update Dutch 2017-03-06 22:50:52 +01:00
Mario Vavti
6e32be7e43 allow unauthenticated access to public wiki pages 2017-03-06 22:32:44 +01:00
Mario Vavti
4471c45fb7 do not collapse long nsfw content 2017-03-06 11:53:06 +01:00
Mario Vavti
a165303602 update changelog 2017-03-04 17:04:30 +01:00
Mario Vavti
7251ce6e17 we need item edited for wiki page history, not item created 2017-03-04 16:57:26 +01:00
Mario Vavti
a894456550 fix badge position for narrow navbar 2017-03-03 10:04:57 +01:00
Mario Vavti
1eba847e99 provide info if there are no sche,es available 2017-03-02 12:52:09 +01:00
Mario Vavti
729d52f10a reset schema value after we empty and repopulate it. second half of fix for #624 2017-03-02 11:39:14 +01:00
Mario Vavti
79e8e4599e reset schema value after we empty and repopulate it. first half of fix for #624 2017-03-02 11:39:01 +01:00
Mario Vavti
ba5cfd8b25 setting top position of contextual-help in schemes does not work with narrow navbar setting. schema css is always called last. 2017-03-02 11:38:47 +01:00
Mario Vavti
288905c361 add title to connect button 2017-03-01 11:39:51 +01:00
Mario Vavti
3071f3b71c minor template fixes 2017-03-01 11:37:40 +01:00
Mario Vavti
07d443a159 missing css class 2017-02-28 13:24:09 +01:00
zotlabs
1acfe53f74 Merge branch '2.2RC' of https://github.com/redmatrix/hubzilla into 2.2RC_merge 2017-02-27 14:55:34 -08:00
zotlabs
265eb2b440 document the filesize limitations on uploading via /cloud, fix non-functional anchor 2017-02-27 14:55:17 -08:00
Mario Vavti
69e145a630 fix js issue in markdown mimetype wikis if content contains quotes 2017-02-27 13:52:51 +01:00
Mario Vavti
1a28720c56 update changelog 2017-02-27 11:42:25 +01:00
Mario Vavti
805cae7b31 whitespace 2017-02-27 11:12:35 +01:00
Mario Vavti
1070f3ed6b missing clear 2017-02-27 10:55:25 +01:00
Mario Vavti
2467698045 do not mess up schemas 2017-02-27 10:45:31 +01:00
Mario Vavti
b6c4e6a6d0 lower version requirement to 2.2RC 2017-02-27 10:18:05 +01:00
Mario Vavti
8e3e90ddd2 set minversion and maxversion for themes in view/theme/themename/php/theme.php instead of separate file. 2017-02-27 10:16:04 +01:00
Mario Vavti
8a69a5c3c7 add a minversion to the theme and fallback to default if requirement is not met. mark incompatible themes in the theme selector 2017-02-26 21:22:19 +01:00
zotlabs
e819727b09 send sync packet on profile photo permissions change 2017-02-25 15:04:59 -08:00
zotlabs
4b1f87050f Merge branch '2.2RC' of https://github.com/redmatrix/hubzilla into 2.2RC_merge 2017-02-25 13:57:08 -08:00
zotlabs
919de44a71 escape tags on viewsrc output in case it is not text/bbcode. 2017-02-25 13:56:52 -08:00
Mario Vavti
d59095c2e6 bump version 2017-02-25 21:34:19 +01:00
Mario Vavti
65e18f5b8f use chanlink_url() in directory since the xchan might not yet be available on our server 2017-02-24 10:07:14 +01:00
zotlabs
e9243e9660 minor edits 2017-02-23 11:33:13 -08:00
zotlabs
59645f51a9 Merge branch '2.2RC' of https://github.com/redmatrix/hubzilla into 2.2RC_merge 2017-02-23 11:31:52 -08:00
Mario Vavti
dd3e530a63 update changelog 2017-02-23 14:53:09 +01:00
Mario Vavti
3e2e60fb86 update changelog 2017-02-23 14:51:09 +01:00
Mario Vavti
9bab858fd1 move collapsed login and register buttons to the left 2017-02-23 12:32:27 +01:00
Mario Vavti
0ef8c5bda8 move collapsed login and register buttons to the left 2017-02-23 12:31:41 +01:00
Mario Vavti
d4be96cd03 yet one more place to use chanlink_hash() instead of chanlink_url() 2017-02-23 12:25:16 +01:00
Mario Vavti
3d0c6700db yet one more place to use chanlink_hash() instead of chanlink_url() 2017-02-23 12:24:42 +01:00
Mario Vavti
5012baba15 one more place to use chanlink_hash() instead of chanlink_url() 2017-02-23 11:41:03 +01:00
Mario Vavti
41c67fa345 more places to use chanlink_hash() instead of chanlink_url() for profile_link 2017-02-23 10:36:00 +01:00
Mario Vavti
c75852455b use chanlink_hash() instead of chanlink_url() for $profile_link 2017-02-23 09:53:24 +01:00
zotlabs
27fa15e95d Merge pull request #685 from phellmes/dev
Update DE translation strings
2017-02-23 12:11:09 +11:00
phellmes
175e222927 Update DE translation strings 2017-02-22 14:50:28 +01:00
Mario Vavti
55924f5c5b apps improvements 2017-02-22 11:22:43 +01:00
zotlabs
956f0043fc change text back to 'add apps' 2017-02-21 23:16:05 -08:00
zotlabs
70cdbe4816 Merge pull request #684 from anaqreon/dev
Change Add Apps to Manage Apps and support translation.
2017-02-22 18:14:30 +11:00
zotlabs
6644dc4861 use head_add_link() for feed discovery 2017-02-21 18:58:51 -08:00
Andrew Manning
3e144baacd Change Add Apps to Manage Apps and support translation. 2017-02-21 20:32:13 -05:00
zotlabs
bbacfbdd6a display page not updating after comment 2017-02-21 15:24:39 -08:00
Mario Vavti
cbc0e5b934 do not lock out channels with only read perms from all post actions. we check read/write permissions for each command later in the process 2017-02-21 14:52:42 +01:00
Mario Vavti
81d556d32e wrong permission 2017-02-21 10:34:40 +01:00
zotlabs
5ad5a0fa07 detect no acl 2017-02-20 23:13:27 -08:00
zotlabs
e54ba7ecbc fix find_folder_hash_by_path() which was not safe against multiple attach structures with the same filename but in different directories 2017-02-20 23:03:48 -08:00
zotlabs
1c1d1f1185 update fr translation 2017-02-20 18:46:51 -08:00
zotlabs
bc1812840a don't search on empty filename - we shouldn't find it. The reason why this change is being made is because we actually did find it due to a development glitch 2017-02-20 15:06:17 -08:00
zotlabs
74def75ca3 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-02-20 14:14:26 -08:00
Mario Vavti
924b353e5a width must be 100% here 2017-02-20 23:09:21 +01:00
zotlabs
31618a4310 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-02-20 14:07:42 -08:00
zotlabs
21e3481810 wiki page permissions issue 2017-02-20 14:07:22 -08:00
Mario Vavti
d7ba2c7168 if we slide to left aside make the overlay darker and leave aside as is 2017-02-20 14:02:39 +01:00
zotlabs
6f811fd7f9 bug in adding main.js as a js source 2017-02-19 17:04:37 -08:00
zotlabs
573846707c fix several places where head_add_(css|js) functions have been used incorrectly. It appears that mistakes were made going back a long time and propagated. Here's the way it should work:
- if there is no preceding / character, we look for the file within all the appropriate theme directories.
- otherwise the file should have a preceding /, which means use this path relative to the hubzilla basedir
- files beginning with // are considered to be schemeless URLs.

Therefore 'foo.css' means find the best theme-able representation of foo.css.
'/library/foo.css' means only use the version of foo.css that is in /library.
2017-02-19 16:50:41 -08:00
zotlabs
02e487f306 this icon also appears to require the fixed-width attribute 2017-02-19 14:14:58 -08:00
zotlabs
73b28b5d94 change primary directory per request 2017-02-18 12:40:43 -08:00
zotlabs
2a7ec29cd1 string update 2017-02-17 12:32:02 -08:00
Mario Vavti
d4f8a8dedd add the generic-icons-nav class 2017-02-17 18:32:18 +01:00
Mario Vavti
f23c380cae add register button for collapsed state 2017-02-17 16:31:36 +01:00
Mario Vavti
7151467db7 fixed width icons for item dropdown 2017-02-17 16:08:18 +01:00
Mario Vavti
16a8416495 css fixes and rename link to full docs to help since its app is also called help 2017-02-17 15:07:20 +01:00
zotlabs
5db3b71c6a strip possible quotes from attribute_contains() haystacks 2017-02-15 11:35:36 -08:00
zotlabs
8897c5763a typo 2017-02-15 10:55:53 -08:00
zotlabs
07d92796d2 provide HTTP header parser which honours continuation lines and despite the fact that continuation lines have been deprecated - as they still exist in the wild. 2017-02-14 20:57:14 -08:00
zotlabs
1f39c16d99 util/pconfig - don't enumerate empty arrays, mod_acl - add more comments 2017-02-13 17:51:39 -08:00
zotlabs
c8aeb5b160 Merge pull request #676 from anaqreon/doco
Doco
2017-02-14 12:51:01 +11:00
Andrew Manning
69b08a2062 Merge remote-tracking branch 'upstream/dev' into doco 2017-02-13 20:38:11 -05:00
Andrew Manning
05fd5eb8be Integrated more content and deleted the original locations where applicable. 2017-02-13 20:37:58 -05:00
zotlabs
8ed0913df6 Merge pull request #675 from mjfriaza/dev
Updated the Spanish translation
2017-02-14 06:44:16 +11:00
Manuel Jiménez Friaza
d85bcb2e37 Fix 'settings/channel' page in Spanish contextual help 2017-02-13 15:48:06 +01:00
Manuel Jiménez Friaza
09e5732f8a Updated the Spanish contextual help 2017-02-13 15:24:54 +01:00
Manuel Jiménez Friaza
d7fcf31be5 Updated the Spanish translation 2017-02-13 13:56:17 +01:00
zotlabs
f63aaa5429 be consistent with the name 2017-02-12 18:42:43 -08:00
zotlabs
321241da02 add default permcat to channel settings form 2017-02-12 18:40:26 -08:00
zotlabs
7c72886b1b Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-02-12 17:40:45 -08:00
zotlabs
2a52592292 testing and bug fixes virtual profile groups 2017-02-12 17:40:18 -08:00
zotlabs
ccdfbc721f Create virtual privacy groups for private profile member lists 2017-02-12 15:56:33 -08:00
Andrew Manning
a3436aea02 Some more work converting api_zot to bbcode. This page needs some serious formatting work. 2017-02-12 14:27:09 -05:00
Mario Vavti
f62b2fc114 css fix 2017-02-12 20:06:09 +01:00
Andrew Manning
baf612bd59 Reformat code of conduct for developers and integrate. 2017-02-12 13:59:17 -05:00
Andrew Manning
f3490440b4 Deleting original help content pages that have been integrated into the new doco 2017-02-12 07:38:43 -05:00
zotlabs
5cc1c30d7f Merge pull request #671 from anaqreon/webimport
Fix webpage element import tool
2017-02-12 18:10:09 +11:00
Andrew Manning
0017de46e4 remove logger lines 2017-02-11 20:54:09 -05:00
Andrew Manning
1cd1328b0c Merge remote-tracking branch 'upstream/dev' into webimport 2017-02-11 20:52:17 -05:00
Andrew Manning
8ff9ad7636 Webpage import tool works again after setting iconfig properly and following the Impel class function example. More testing is needed. 2017-02-11 20:52:06 -05:00
zotlabs
1ba1c5b44e Merge pull request #670 from anaqreon/doco
Scroll to doco links with anchor references when there is a ?zid parameter
2017-02-12 07:47:06 +11:00
Andrew Manning
7db55d8db2 Update Zot protocol link 2017-02-11 14:46:24 -05:00
Andrew Manning
e058b19f53 Scroll to doco links with anchor references when there is a ?zid parameter. 2017-02-11 14:40:04 -05:00
Mario Vavti
bc3605a502 whitespace 2017-02-10 10:50:16 +01:00
Mario Vavti
ce4daad431 do not use modal-sm class 2017-02-10 10:02:48 +01:00
Mario Vavti
0360d42d30 add a login button for collapsed state and refine login modal 2017-02-10 10:01:43 +01:00
zotlabs
1fb37f93cc more permissions optimisations 2017-02-09 19:52:13 -08:00
zotlabs
fce33402e7 use profile_store_lowlevel() when creating additional profiles 2017-02-09 17:40:56 -08:00
zotlabs
abadd0bd34 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-02-09 17:31:31 -08:00
zotlabs
16f27d0004 more work on permcats and consolidating calls that try to discover connect permissions, also create lowlevel store functions for abook and profile - since these currently may have issues with sql strict mode. 2017-02-09 17:29:24 -08:00
Mario Vavti
242eede258 wrap resizing in document ready function 2017-02-09 12:01:55 +01:00
zotlabs
8dc349caac minor theming and whitespace 2017-02-08 19:47:34 -08:00
zotlabs
91819bfc2d bringer - all basic functionality is implemented 2017-02-08 17:21:32 -08:00
zotlabs
6ee691e019 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-02-08 11:29:45 -08:00
zotlabs
28f0833237 fix immediate issue with multiple login forms until I can figure out an elegant way to "popup" the modal login form already on the page. We still may need this fix for the actual login module which should always be callable and present a login form even if the nav is completely borked. 2017-02-08 11:24:21 -08:00
Mario Vavti
eb415fd869 better detection of when to show the feature button and document nav mode for app_render() 2017-02-08 11:17:09 +01:00
Mario Vavti
ace0a1cb75 do not show feature button if the app is shared. css fixes 2017-02-08 10:56:03 +01:00
zotlabs
6ceaea8478 open permission tab by default - when you're creating permission categories 2017-02-07 21:03:14 -08:00
zotlabs
30659aef50 initial permcat creation ability, in /settings/permcats; functional permcat creation for testing but still needs a lot of UX work before promoting the ability 2017-02-07 20:29:03 -08:00
zotlabs
46d0e23e7b atokens - we only need one permission column 2017-02-07 19:49:15 -08:00
zotlabs
2d3e20d96e move permcat initialisation to zlib 2017-02-07 17:51:56 -08:00
zotlabs
723b51c931 provide a few system defined permcats; will require a permission editor page to define new (personal) ones. 2017-02-07 17:17:38 -08:00
zotlabs
a6160e3026 move permcat library functions to Zlib 2017-02-07 16:43:00 -08:00
zotlabs
ecca69442d Merge branch 'abroles' into dev 2017-02-07 16:15:15 -08:00
zotlabs
b2bae867d0 more background work for permcat support 2017-02-07 16:08:27 -08:00
zotlabs
cfe843b870 nits 2017-02-07 14:02:13 -08:00
Mario Vavti
1cef3f15d5 sort the apps 2017-02-07 22:32:25 +01:00
Mario Vavti
1bb56309a6 default to manual conversation updates 2017-02-07 20:45:13 +01:00
zotlabs
6468b7a914 update readme; probably not finished with this yet so feel free to make suggestions 2017-02-06 15:28:50 -08:00
zotlabs
6a083e8452 bring back view links for all notification types (esp: network, channel) for easy access 2017-02-06 14:32:50 -08:00
zotlabs
27cac334e1 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-02-06 14:12:43 -08:00
zotlabs
947478ca76 don't add zid to app links if they're on this system and we're logged in already. This messes up the null arg detection in mod_network. 2017-02-06 14:10:54 -08:00
Mario Vavti
c75357faa3 also take care of the collapsed state apps 2017-02-06 20:36:26 +01:00
Mario Vavti
e9a27393b8 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2017-02-06 20:30:24 +01:00
Mario Vavti
5d12c56510 only check for mode 2017-02-06 20:30:02 +01:00
zotlabs
00cfc4be44 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-02-06 11:14:59 -08:00
Mario Vavti
70edcabca1 move icon stuff back to app_render() and send navapps through app_render() 2017-02-06 20:10:10 +01:00
Mario Vavti
dce5e8d0cc fix wiki and chat .apd 2017-02-06 14:50:23 +01:00
Mario Vavti
59baf34170 make sure we do not remove other categories on app un-feature 2017-02-06 14:37:33 +01:00
Mario Vavti
5aa1146fe9 minor fixes 2017-02-06 13:58:49 +01:00
Mario Vavti
8059260c18 import system apps on initial load 2017-02-06 13:45:46 +01:00
Mario Vavti
91bc8d473f update templates 2017-02-06 13:30:56 +01:00
Mario Vavti
3d4f2d146e add profile app 2017-02-06 13:19:14 +01:00
Mario Vavti
ce61a64bd2 remove profile app 2017-02-06 13:17:58 +01:00
Mario Vavti
e2a498c8ca update apps 2017-02-06 13:17:02 +01:00
Mario Vavti
758e7b92eb update apps 2017-02-06 13:16:33 +01:00
Mario Vavti
cf4cdffcc1 parse icons in get_system_apps() 2017-02-06 10:49:42 +01:00
Mario Vavti
e70c87ed41 merge dev 2017-02-06 10:08:05 +01:00
zotlabs
d8472cc9f5 import - get rid of 'step system', we should be able to process any import file at any time. 2017-02-05 20:46:11 -08:00
zotlabs
56a08f0d17 make channel move an option (in addition to cloning) 2017-02-05 20:26:06 -08:00
zotlabs
eb3685f537 remove per-page login css (home, login); add support for alternative markdown mention format 2017-02-05 18:47:35 -08:00
zotlabs
201a6b8742 nav_login element width was page dependent. Put this in theme css 2017-02-05 14:55:46 -08:00
zotlabs
e2ee4ae024 better theming of rmagic page 2017-02-05 14:45:28 -08:00
zotlabs
23e3e2c504 Merge pull request #665 from einervonvielen/introduced_dehydrated
The script letsencrypt.sh was replaced by dehydrated.
2017-02-06 06:50:26 +11:00
zotlabs
ab698305bf Merge pull request #666 from einervonvielen/dehydrated_for_dev
The script letsencrypt.sh was replaced by dehydrated.
2017-02-06 06:50:02 +11:00
Einer von Vielen
143ae2b788 The script letsencrypt.sh was replaced by dehydrated. 2017-02-05 19:36:23 +01:00
Einer von Vielen
baf50ea84a The script letsencrypt.sh was replaced by dehydrated. 2017-02-05 19:14:37 +01:00
zotlabs
73845e01ed cleanup 2017-02-04 14:58:13 -08:00
Mario Vavti
178e3d5bc8 allow featuring of apps in /apps and update some more apd files 2017-02-04 18:36:50 +01:00
Mario Vavti
a94254a375 merge dev 2017-02-04 16:17:52 +01:00
zotlabs
fc4083346e more work on nav-modal 2017-02-03 15:31:01 -08:00
zotlabs
f79a11cbf7 trying nav-login as modal 2017-02-03 13:47:29 -08:00
Mario Vavti
edc0a7ef91 update some apps and refine navapps.tpl 2017-02-03 15:24:21 +01:00
Mario Vavti
dce9a70ff5 check for app-icons in app_list() instead of app_render() 2017-02-03 12:12:05 +01:00
Mario Vavti
631a8278d3 do not hide button - just gray it out 2017-02-03 11:21:06 +01:00
zotlabs
bae37c8e6f string update 2017-02-03 02:12:30 -08:00
Mario Vavti
a5c1685ea0 hide notifications button if there are none 2017-02-03 11:00:35 +01:00
Mario Vavti
d0a0051d85 use openClose() for nav-login 2017-02-03 09:35:35 +01:00
Mario Vavti
8e4960f31d use openClose() for nav-login 2017-02-03 09:33:09 +01:00
Mario Vavti
dd2a5e6b28 Merge branch 'dev' into wip-app-bin 2017-02-03 09:24:09 +01:00
zotlabs
7e1e9ac94a rename bb2diaspora.php to markdown.php 2017-02-02 19:12:48 -08:00
zotlabs
29daf1ecee unused since 2012 2017-02-02 18:16:44 -08:00
zotlabs
c62df39ce3 move firefox social api configuration to plugin 2017-02-02 17:23:58 -08:00
zotlabs
a91e7cbe8d move rsd service to twitter_api plugin 2017-02-02 15:25:35 -08:00
zotlabs
159f02ba07 build_pagehead hook added 2017-02-02 14:52:14 -08:00
zotlabs
2daafe80a5 move opensearch to plugins 2017-02-02 14:49:51 -08:00
Mario Vavti
028b2a655d whitespace cleanup 2017-02-02 20:39:06 +01:00
Mario Vavti
fd52cefe09 provide separate collased menus for apps and notifications 2017-02-02 20:10:35 +01:00
Mario Vavti
0e0dee43ab Merge branch 'dev' into wip-app-bin 2017-02-02 14:27:13 +01:00
Mario Vavti
e2ee565f05 cherry-pick nav-login changes 2017-02-02 14:24:19 +01:00
Mario Vavti
63e06578c4 use bootstrap dropdown for login 2017-02-02 14:19:23 +01:00
Mario Vavti
a1f03015ec move channel manager up in the menu 2017-02-02 11:35:42 +01:00
Mario Vavti
8220a6584c remove apps from usermenu 2017-02-02 11:19:06 +01:00
Mario Vavti
d4b51c491f do not use style in template 2017-02-02 10:59:20 +01:00
Mario Vavti
3f66d9f8cd do not use data-toggle on the badge and use fixed with for icons 2017-02-02 10:54:44 +01:00
Mario Vavti
852073fc68 dropdown menus should be restricted in height in normal view but not in collapsed view 2017-02-02 10:33:23 +01:00
Mario Vavti
17082cda3c remove badge hover effect 2017-02-02 10:15:05 +01:00
Mario Vavti
7ffa98118f really fix badge positions 2017-02-02 10:12:56 +01:00
Mario Vavti
c3bada3c32 resolve merge conflict 2017-02-02 09:38:07 +01:00
zotlabs
23303391e0 move dreamhost hack to plugin 2017-02-01 22:45:03 -08:00
zotlabs
8ac8acc49c drug dealers have users 2017-02-01 18:18:41 -08:00
zotlabs
94290102b6 tested extensible permissions by adding wiki permissions. Discovered a couple of issues that needed attention in the process. 2017-02-01 18:05:02 -08:00
zotlabs
f94c244b9f Merge pull request #664 from anaqreon/doco
Doco updates
2017-02-02 12:52:09 +11:00
Andrew Manning
ec823196e0 Remove old tags and mentions doco pages 2017-02-01 20:47:03 -05:00
Andrew Manning
957647bf06 Remove dead links 2017-02-01 20:43:47 -05:00
Andrew Manning
df5524979d Integrate tags and mentions page doco into member guide. Fix bug when loading page with section link. Change URL when scrolling to stay current with viewed section to facilitate easy help page link sharing. 2017-02-01 20:39:27 -05:00
Andrew Manning
0ae3e50bd4 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2017-02-01 20:07:38 -05:00
zotlabs
db710cd2df fix a few style issues with nav login panel 2017-02-01 14:45:52 -08:00
Andrew Manning
61407ad6c8 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2017-02-01 17:08:46 -05:00
Mario Vavti
2e0180ba55 Merge branch 'dev' into wip-app-bin 2017-02-01 22:36:25 +01:00
Mario Vavti
d476b7477b fix notifications badge positioning and rendering of submenus in collapsed mode 2017-02-01 22:24:37 +01:00
zotlabs
ec037abf92 bookmarks missing from tags and mentions doc 2017-02-01 11:29:18 -08:00
Mario Vavti
1a56045b42 nav dropdown-menu overrides 2017-02-01 13:08:41 +01:00
Mario Vavti
bf820beb79 remove experimental_app_bin config conditional 2017-02-01 12:59:56 +01:00
Mario Vavti
cde7a3f66c more work on app-bin 2017-02-01 12:52:19 +01:00
zotlabs
4f99d641c5 superfluous whitespace cleanup 2017-01-31 17:32:52 -08:00
zotlabs
f4aca35a88 move diaspora account import to the diaspora plugin 2017-01-31 16:01:47 -08:00
zotlabs
732065bf13 channel export - use a selected list of functional data categories to export; this allows one to export single data sets instead of always exporting everything we know about 2017-01-31 15:28:25 -08:00
Andrew Manning
d3d540a28b Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2017-01-31 17:36:42 -05:00
Mario Vavti
a6cbebe03c hide featured app category in the app category widget 2017-01-31 12:53:33 +01:00
Mario Vavti
e1b54b6843 fix typos 2017-01-31 09:43:58 +01:00
zotlabs
aadbd5a92d Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-30 15:05:10 -08:00
zotlabs
7b065365e0 consolidate hubloc storage 2017-01-30 15:01:22 -08:00
Mario Vavti
d0827dbb3c provide a feature/unfeature app button 2017-01-30 15:17:46 +01:00
Andrew Manning
fab103524a Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2017-01-30 06:03:53 -05:00
zotlabs
15be542e56 Merge pull request #662 from anaqreon/affinity-settings
Affinity settings
2017-01-30 18:04:53 +11:00
zotlabs
eebea70019 queue optimisations for sites that have lingered in the queue for more than a couple of days. 2017-01-29 17:16:06 -08:00
Andrew Manning
b58d56826b Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2017-01-29 20:02:34 -05:00
Andrew Manning
e770768b79 Link to Guest Access Tokens doco in context help. 2017-01-29 20:02:31 -05:00
Andrew Manning
17011a7637 Remove unrelated chatroom panel stuff that was included accidentally 2017-01-29 19:56:19 -05:00
Andrew Manning
f891860408 Merge remote-tracking branch 'upstream/dev' into affinity-settings 2017-01-29 19:53:41 -05:00
Andrew Manning
3424c7dc87 Add affinity slider tool settings for min and max defaults in settings/featured 2017-01-29 19:53:29 -05:00
zotlabs
dbf7ff9791 no quotes on dbutcnow() output 2017-01-29 16:33:30 -08:00
zotlabs
9addcfe827 finish remaining places where xchan_store_lowlevel needs to be used 2017-01-29 15:25:24 -08:00
zotlabs
d5d67708ac Alter the queue so that each queue item stores the scheduled time of the next delivery. This keeps the query for
queued items simple. We no longer group by posturl; as the queue update function will only keep one item per destination
scheduled for shorter term processing. Others (multiple queued items for a single destination) will be scheduled for
delivery far into the future and only delivered if the hub responds to the "active" or short term queue item.
2017-01-29 14:45:25 -08:00
zotlabs
5aa0017e91 provide lowlevel xchan storage function to ensure that all non-null rows are initialised 2017-01-28 15:01:19 -08:00
zotlabs
f90d5f3dc8 string update 2017-01-27 12:13:30 -08:00
Mario Vavti
8b5793e629 more work on app-bin 2017-01-27 17:51:49 +01:00
Mario Vavti
de668f5999 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2017-01-27 14:00:43 +01:00
Mario Vavti
606463114b add icons and links to appman and apps edit to app-bin 2017-01-27 14:00:27 +01:00
Andrew Manning
40242ff7dc Merge remote-tracking branch 'upstream/dev' into addon-repo-gui 2017-01-27 07:21:52 -05:00
Andrew Manning
e411c7e8b3 Improve context help with screenshot and replace "addon" with "plugin". 2017-01-27 07:21:23 -05:00
zotlabs
80e1130bb5 Merge pull request #655 from anaqreon/addon-repo-gui
Addon repo management GUI
2017-01-27 13:27:36 +11:00
Andrew Manning
d9a5b11c9a Fixed numerous bugs with the addon repo management GUI. Only show Manage Repos button if webserver has write permission on extend/addon/. 2017-01-26 21:20:15 -05:00
zotlabs
22839e48d0 better handling of html special chars in wiki and wikipage names 2017-01-26 15:16:41 -08:00
Mario Vavti
f7f39cf6c0 missing single quote in query 2017-01-26 14:50:52 +01:00
Mario Vavti
54826808cf minor cleanup 2017-01-26 12:23:59 +01:00
Mario Vavti
b30e799847 query for item_hidden is not needed anymore 2017-01-26 11:43:21 +01:00
Mario Vavti
b4aaa1953c fix wiki list template 2017-01-26 11:24:15 +01:00
Mario Vavti
d64dcd298e haystack/needle mixup 2017-01-26 11:03:41 +01:00
Mario Vavti
02e8058c50 fix renaming of wiki pages 2017-01-26 10:46:44 +01:00
zotlabs
93057fae8c missing quote in nav template 2017-01-25 21:43:55 -08:00
zotlabs
5bc6941b57 resolve the linked item delete issue by declaring what types of linked items cannot be deleted 2017-01-25 14:40:04 -08:00
zotlabs
45dbd31d28 only allow wiki owner to delete pages 2017-01-25 12:21:52 -08:00
zotlabs
45a9eca792 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-25 11:47:51 -08:00
zotlabs
b43064ce6e roll minor version 2017-01-25 11:46:59 -08:00
zotlabs
660c658c85 initialise item['postopts'] for mysql >= 5.7 2017-01-25 11:46:33 -08:00
zotlabs
7804ae6a78 initialise item['postopts'] for mysql >= 5.7 2017-01-25 11:43:54 -08:00
zotlabs
c916906716 Merge pull request #653 from git-marijus/dev
fixes for wiki create/delete page
2017-01-26 06:37:35 +11:00
Mario Vavti
1db57c498d fixes for wiki create/delete page 2017-01-25 19:41:47 +01:00
zotlabs
54f7cd5302 typo 2017-01-24 20:17:05 -08:00
zotlabs
9e70d54300 always sync parent wiki when syncing pages, just in case the original wiki creation wasn't synced. 2017-01-24 20:14:58 -08:00
zotlabs
7465ca269b Merge branch 'master' of https://github.com/redmatrix/hubzilla into master_merge 2017-01-24 19:44:55 -08:00
zotlabs
508157f07f block well-known from oembed 2017-01-24 19:44:45 -08:00
zotlabs
33aa373b3f minor 2017-01-24 19:44:24 -08:00
zotlabs
d96a7bc1fa block well-known from oembed 2017-01-24 18:33:41 -08:00
zotlabs
dad8397763 initial selections for extensible permission categories ("permcats") 2017-01-24 16:00:58 -08:00
Mario Vavti
e26295b6fa do not show location row on small viewports. 2017-01-24 10:26:50 +01:00
Mario Vavti
c8239c739d do not show location row on small viewports. 2017-01-24 10:25:31 +01:00
zotlabs
6c4f7caba1 nav-login - basic, crude theming 2017-01-23 16:51:23 -08:00
zotlabs
cb47354a4f put login form into the nav bar. Proof of concept - needs a bit of UI tweaks. 2017-01-23 16:31:40 -08:00
zotlabs
61588a4b77 add observer.language to the doco 2017-01-23 15:42:41 -08:00
zotlabs
142dd0053a Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-23 11:37:18 -08:00
zotlabs
0d9e12737a remnant code that checked for version to see if an app was installed. We do that differently now. 2017-01-23 11:36:28 -08:00
Mario Vavti
dfafa81bfe give apps a bit more horizontal space 2017-01-23 17:10:52 +01:00
Hubzilla
cda284424f synced wikis should be relocated 2017-01-22 18:56:14 -08:00
Hubzilla
610699d3c4 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-22 18:53:13 -08:00
Hubzilla
17f1d39fcf basic support for clone syncing of wikis and wiki pages 2017-01-22 18:48:45 -08:00
zotlabs
85766126e3 Merge pull request #650 from mjfriaza/dev
Translation of the new strings into the Spanish version
2017-01-23 12:07:16 +11:00
Hubzilla
3bafa05ad1 force app icons to fixed width 2017-01-22 16:09:55 -08:00
Hubzilla
1627297143 use icons for app photos. 2017-01-22 15:17:37 -08:00
Mario Vavti
951376852c some work on app_bin - just to get it going 2017-01-22 13:45:34 +01:00
Manuel Jiménez Friaza
4d3647066f Translation of the new strings into the Spanish version 2017-01-22 12:13:28 +01:00
Mario Vavti
9e509aa25b $a is deprecated 2017-01-22 10:21:01 +01:00
Mario Vavti
d2226c0e9b whitespace cleanup 2017-01-22 10:20:39 +01:00
Hubzilla
1d65bc6382 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-21 15:24:09 -08:00
Hubzilla
b513662b52 remove the channel introduction on the system notifications page. "Hubzilla, George commented on your status 20 minutes ago". We need the channel introduction (in this case "Hubzilla," in emails for situations where one person controls a lot of channels. We don't need it on the web notification summary; where you're only viewing notifications for a single given channel. 2017-01-21 15:20:59 -08:00
Mario Vavti
8794106e85 add observer.language to autocomplete and return a default value for observer 2017-01-21 23:28:57 +01:00
Mario Vavti
88caa14030 fix text highlighter for PHP version 7.1 2017-01-21 21:04:36 +01:00
Hubzilla
bb233a9872 add bbcode language conditionals to wiki 2017-01-20 15:42:15 -08:00
Hubzilla
9acd3ebd42 observer.language!={something} for completeness 2017-01-20 15:30:08 -08:00
Hubzilla
0368b6730f language aware content 2017-01-20 13:36:37 -08:00
Hubzilla
ece1dd1d7e js errors with raw message-id, string update 2017-01-20 12:03:46 -08:00
Hubzilla
f57926d9ec Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-19 15:40:28 -08:00
Hubzilla
96f196febd add gen_link_id() function to selectively encode/decode the message-id component of /display/ links for message-ids that contain troublesome characters 2017-01-19 15:37:30 -08:00
Mario Vavti
4295b1945e we need channel_id here not the whole channel 2017-01-19 10:02:26 +01:00
Hubzilla
5ce96b9b95 more urlencoding of message-ids which are used in links 2017-01-18 19:36:06 -08:00
Hubzilla
7dfadfea4a urlencode the message-id component of generated /display/ links; in most cases this will be a no-op, unless the message-id is a url of some kind from a different provider. 2017-01-18 18:45:17 -08:00
Hubzilla
d4e58e94f6 native wiki updates 2017-01-18 18:18:37 -08:00
Hubzilla
6e504b7bc9 nwiki updates 2017-01-18 17:45:27 -08:00
zotlabs
7f944515de more work on native wiki - revert now works; still remaining: diff, delete-page, rename-page and export wiki. 2017-01-17 23:39:28 -08:00
zotlabs
b6595a44d1 native wiki stuff 2017-01-17 17:41:19 -08:00
zotlabs
335d9af8dc daemon_addon hook - lets plugins create custom background processes. 2017-01-17 00:14:47 -08:00
zotlabs
8478ecc675 Merge pull request #645 from git-marijus/dev
do not choke if photo_factory() returns null
2017-01-16 18:31:09 +11:00
zotlabs
e5662dc893 vcard export from profile 2017-01-15 21:23:43 -08:00
zotlabs
0ef2cd8719 array pointer in wrong place 2017-01-15 19:55:59 -08:00
zotlabs
c32bc9dda4 more integration of vcard and profiles 2017-01-15 19:51:14 -08:00
zotlabs
d7080defd3 Still trying to make the documentation link just a wee bit more obvious. 2017-01-15 16:08:51 -08:00
zotlabs
b20cce1408 attach_delete() - remove photo resources even if the attach table row wasn't found. 2017-01-15 15:24:51 -08:00
Mario Vavti
9682c48b5b min version bump 2017-01-15 13:53:56 +01:00
git-marijus
6a242f0d08 Merge pull request #646 from anaqreon/doco
Make master doco current with dev doco
2017-01-15 13:50:18 +01:00
Andrew Manning
b1f3ccc6ee pull in some CSS 2017-01-15 07:27:48 -05:00
Mario Vavti
a36d74dad5 do not choke if photo_factory() returns null 2017-01-15 13:23:28 +01:00
Andrew Manning
128d47430d pull latest doco from dev branch 2017-01-15 07:22:19 -05:00
zotlabs
e843d27f8c Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-13 13:23:21 -08:00
zotlabs
4f1e4ffa70 several minor app nits 2017-01-13 13:22:36 -08:00
zotlabs
7249eebc75 string update 2017-01-13 04:12:21 -08:00
Mario Vavti
8ea0b2051a another try on preventing double scrollbars when a modal is larger than the viewport 2017-01-13 13:04:30 +01:00
Mario Vavti
c8678ba5a9 evert "prevent double scrollbar when we have a modal larger than the viewport"
This reverts commit 2ace4c57d0.
2017-01-13 12:53:45 +01:00
Mario Vavti
2ace4c57d0 prevent double scrollbar when we have a modal larger than the viewport 2017-01-13 11:24:34 +01:00
Mario Vavti
8ef84e2aa7 possibly improve the album list query and save the result in App::$data 2017-01-13 11:22:50 +01:00
zotlabs
bb0f3afb71 default cover photo support. 2017-01-12 18:52:29 -08:00
zotlabs
9fb8661eef missing protect_sprintf which is the source of issue #642 - if a mention search contains % it will result in an SQL vsprintf error 2017-01-12 13:05:36 -08:00
Mario Vavti
91b81d6a2c fullscreen in album-view is disfunctional atm 2017-01-12 15:29:49 +01:00
Mario Vavti
88ac326caf we should actually check for existance of a given album at this place. this query can probably be more simple though 2017-01-12 12:32:31 +01:00
Mario Vavti
bdd420a08e Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2017-01-11 22:16:19 +01:00
Mario Vavti
76daa03df0 comment out redundant querys 2017-01-11 22:16:02 +01:00
zotlabs
62ad4dd109 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-11 12:32:19 -08:00
zotlabs
41dc40dd84 expires lost during edit 2017-01-11 12:31:55 -08:00
Mario Vavti
2fc47cc52b fix embedimage if an albumname contains quotes 2017-01-11 10:59:46 +01:00
zotlabs
9ad44a2060 btlogger trace file logging not working as desired. 2017-01-10 17:37:41 -08:00
zotlabs
5092cb75f4 normalise feed id 2017-01-10 14:25:11 -08:00
zotlabs
f2f6a05342 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-10 11:22:32 -08:00
zotlabs
52441dd754 add gravizot.de to directory server fallbacks 2017-01-10 11:21:51 -08:00
Mario Vavti
38dd1c342a font awesome 4.7.0 2017-01-10 10:19:22 +01:00
Mario Vavti
0f89db3b46 /connedit do not show vcard and section selector if not yet approved. whitespace cleanup 2017-01-10 10:15:48 +01:00
zotlabs
120afb30c1 obj_type on edit activity was wrong 2017-01-09 22:12:44 -08:00
zotlabs
47bc573de5 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-09 14:38:49 -08:00
zotlabs
a6272fcf76 channel move stuff (disabled currently because not yet complete) 2017-01-09 14:37:56 -08:00
Mario Vavti
b8f0e565f5 implement a menu to select a section to be open by default 2017-01-09 12:03:32 +01:00
zotlabs
83c9753507 Merge pull request #640 from mjfriaza/dev
Updated the Spanish translation
2017-01-09 08:37:20 +11:00
zotlabs
91e0733e8e Comanche: add greater/less than (plus greater/less than or equal) conditionals 2017-01-07 16:14:04 -08:00
zotlabs
dd97d84c19 Comanche conditionals - provide a conditional "~=" form for testing 'contains' (case independent substring match). Also add $request the request uri) to the supported variables. 2017-01-07 15:58:01 -08:00
zotlabs
b2a4075e12 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-07 13:58:29 -08:00
zotlabs
96e668a5b9 add enclosures and categories to atom feed 2017-01-07 13:29:32 -08:00
zotlabs
c9f4184126 allow the atom_entry hook to change the results 2017-01-07 12:47:19 -08:00
zotlabs
6f1209ea49 typo 2017-01-07 04:51:44 -08:00
zotlabs
89f0ecf25d update the atom_entry hook 2017-01-07 04:04:11 -08:00
Manuel Jiménez Friaza
eca70d81c8 Updated the Spanish translation 2017-01-07 12:26:54 +01:00
Mario Vavti
639966622f min version bump 2017-01-07 10:09:45 +01:00
Mario Vavti
be7e249630 fix main width if right aside is hidden 2017-01-07 10:07:50 +01:00
Mario Vavti
d1493e6b70 fix main width if right aside is hidden 2017-01-07 10:07:05 +01:00
zotlabs
fb059bfdc3 more feedutils cleanup 2017-01-06 20:20:49 -08:00
zotlabs
a3c45d47e6 add the ostatus:conversation element which is now more or less required by GNU-Social to work around some short-comings of the OStatus delivery model when it comes to conversational message grouping. If this element isn't there, message replies will not get grouped with the parent specified in thr:in-reply-to, which exists to group conversations together. The reasoning being that due to the point-to-point delivery model, a reply could arrive on one site which does not have a copy of the parent specified by thr:in-reply-to. Hence further replies arriving on this site are grouped with the first arrived comment as the parent. Since this project doesn't allow comments which don't have top-level parents, we can just set it to the parent-mid and save being forced to create a new database structure for orphan children acting as parents. 2017-01-06 13:42:45 -08:00
zotlabs
6db2561eda preserve the original message-id coming from feeds - we will have to escape them properly before calling mod_display. 2017-01-06 13:25:57 -08:00
zotlabs
ba2d0fae0e Merge branch 'dev' into gnusoc 2017-01-06 12:24:26 -08:00
zotlabs
7f9e91f1c7 strings 2017-01-06 12:19:41 -08:00
zotlabs
2312302dea setup: check disabled functions more precisely than using a string match 2017-01-05 14:17:56 -08:00
zotlabs
dfede52048 ical import/export - provide mechanism to preserve original source formatting across zot based systems. 2017-01-05 13:55:04 -08:00
zotlabs
a87d12f167 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-05 12:19:14 -08:00
zotlabs
ec18c3770b issue #639, voting setting is lost after post is edited (also the disabling of comments) 2017-01-05 12:17:36 -08:00
Mario Vavti
3e0ea9727f same fix for mobile view 2017-01-05 17:55:25 +01:00
Mario Vavti
e64378f94f same fix for mobile view 2017-01-05 17:54:44 +01:00
Mario Vavti
888a7aa6b2 another min version bump 2017-01-05 17:43:24 +01:00
Mario Vavti
9cf2f424ad fix an issue with sticky_kit where input fields and textareas would blur on recalc. auto resize the notes textarea since if it sticks to the bottom it can not be properly resized 2017-01-05 17:42:30 +01:00
Mario Vavti
a1b35fb7d1 fix an issue with sticky_kit where input fields and textareas would blur on recalc. auto resize the notes textarea since if it sticks to the bottom it can not be properly resized 2017-01-05 17:40:45 +01:00
zotlabs
982b596fa4 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2017-01-04 15:29:14 -08:00
zotlabs
1ce8168d72 some gnusoc fixes 2017-01-04 11:47:08 -08:00
Mario Vavti
93ce2728b7 css fix 2017-01-04 16:40:11 +01:00
Mario Vavti
0364bf4913 css fix 2017-01-04 16:39:14 +01:00
Mario Vavti
48813c55d5 bump min version 2017-01-04 15:52:59 +01:00
Mario Vavti
a9a35ccb6b trigger sticky_kit:recalc if the size of left_aside_wrapper changes 2017-01-04 15:50:17 +01:00
Mario Vavti
4d5c20ce17 fix expand-aside button hiding if aside is empty 2017-01-04 15:50:13 +01:00
zotlabs
ced84a2b01 zot protocol doco updates 2017-01-03 12:59:05 -08:00
jeroenpraat
6a0055f69f Fixing some schemas 2017-01-03 21:07:49 +01:00
Mario Vavti
07b299abd2 trigger sticky_kit:recalc if the size of left_aside_wrapper changes 2017-01-03 17:56:40 +01:00
zotlabs
ae563e2b1c fix chat member list when one or members are connected via access tokens 2017-01-02 23:35:40 -08:00
zotlabs
1ceca4ae19 set 'adjust for viewer timezone' as the default for new events. 2017-01-02 14:13:02 -08:00
git-marijus
fa611b3616 Merge pull request #637 from anaqreon/dev
Guest access tokens
2017-01-02 20:08:51 +01:00
Andrew Manning
bc0d4f28ef Merge remote-tracking branch 'upstream/dev' into dev 2017-01-02 07:56:23 -05:00
zotlabs
369a29ac90 new roadmap 2017-01-01 22:33:18 -08:00
zotlabs
b88a735e54 feature: allow event creation in other timezones than your own. 2017-01-01 19:51:44 -08:00
zotlabs
dca4de80fd Merge branch 'pcard' into dev 2017-01-01 14:16:15 -08:00
zotlabs
bead3e6095 profile vcard - generate vcard on profile update 2017-01-01 14:15:07 -08:00
zotlabs
1436b075bf issue #636 - some localised (e.g. Italian) strings have single quotes which throw JS errors when used in single quoted template constructs. 2017-01-01 13:46:20 -08:00
zotlabs
9831b358f8 profile vcard - preliminary work 2017-01-01 13:29:27 -08:00
Andrew Manning
7b11e634aa Merge remote-tracking branch 'upstream/dev' into dev 2017-01-01 14:28:21 -05:00
Andrew Manning
dce5c7e249 Add guest access token section to member guide with screenshot of settings 2017-01-01 14:28:13 -05:00
Andrew Manning
7f60ab49b2 Merge pull request #634 from anaqreon/dev
I'm going to go ahead and merge this. It should be easy to revert undesired changes.
2017-01-01 08:06:30 -05:00
Andrew Manning
d1d3dcf1a0 Deleted old versions that have been integrated. Integrated and slightly revised Comanche doco. 2017-01-01 08:00:43 -05:00
Andrew Manning
ce87a0c1d3 Merge remote-tracking branch 'upstream/dev' into dev 2017-01-01 07:41:36 -05:00
zotlabs
75067524ae Merge branch 'master' of https://github.com/redmatrix/hubzilla into master_merge 2016-12-31 16:03:52 -08:00
zotlabs
1cd779459b better fix for #629 #635 based on ownership/authorship rather than message flags which could be forged 2016-12-31 16:03:41 -08:00
zotlabs
e2eb0b2eac better fix for #629 #635 based on ownership/authorship rather than message flags which could be forged 2016-12-31 15:56:45 -08:00
zotlabs
709bcedbed Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-31 13:39:40 -08:00
zotlabs
444e938e2d issues #629, #635 - edited post arriving from downstream source was not being rejected 2016-12-31 13:38:19 -08:00
Mario Vavti
9820baf82e fix expand-aside button hiding if aside is empty 2016-12-31 12:55:10 +01:00
Mario Vavti
7f2c7cacd3 bump min version 2016-12-31 09:44:27 +01:00
Mario Vavti
62a911a57e prevent eventual double scrollbar 2016-12-31 09:44:16 +01:00
Mario Vavti
fcd34e41ca css fixes and get rid of a javascript workaround 2016-12-31 09:44:09 +01:00
zotlabs
ba8a5ac82b peoplefind widget should honour directory option settings (such as this site only). 2016-12-30 13:31:59 -08:00
zotlabs
e5a6c0a94d Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-30 13:12:56 -08:00
zotlabs
a9c8d4a216 peoplefind widget should honour directory option settings (such as this site only). 2016-12-30 13:09:35 -08:00
Mario Vavti
6c7da13cd3 prevent eventual double scrollbar 2016-12-30 20:50:12 +01:00
Andrew Manning
2ba23ebb13 Reorganized and revised Zot Protocol content. Deleted some of the old pages that have been refactored. 2016-12-30 09:10:26 -05:00
Mario Vavti
74d69bdedc Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-12-30 13:35:59 +01:00
Mario Vavti
8a074dedb6 css fixes and get rid of a javascript workaround 2016-12-30 13:35:43 +01:00
zotlabs
3dd4bf9955 move api version call back to core 2016-12-30 02:48:42 -08:00
zotlabs
2e2254371a move api version call back to core 2016-12-30 02:45:16 -08:00
zotlabs
693f7366a2 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-30 02:36:24 -08:00
zotlabs
b673c804be profile clone issue with dev 2016-12-30 02:34:26 -08:00
zotlabs
03a1086ba3 logger typos 2016-12-30 02:32:53 -08:00
zotlabs
e8a2ad4315 logger typos 2016-12-30 02:31:53 -08:00
Mario Vavti
c9cbd2f4f6 update fullcalendar to version 3.1 2016-12-30 10:18:05 +01:00
zotlabs
90a99fc221 Merge pull request #633 from anaqreon/dev
Doco
2016-12-29 14:52:01 +11:00
Andrew Manning
a649c3b72e Merge remote-tracking branch 'upstream/dev' into dev 2016-12-28 19:41:09 -05:00
Andrew Manning
caec5d81eb Split Zot protocol and API into two pages. Revise text to add detail and improve presentation. 2016-12-28 19:40:53 -05:00
zotlabs
e4ec976a1f Merge pull request #632 from anaqreon/dev
Zot structures doco integrated into the Zot page.
2016-12-29 07:13:53 +11:00
Andrew Manning
13768fdb9b Zot structures doco integrated into the Zot page. Added nowrap option to [code] BBcode tag. 2016-12-28 14:58:25 -05:00
zotlabs
46e4bd5fe0 Merge pull request #631 from anaqreon/dev
Add webpage doco to Member guide. Add nav menu highlighting when scro…
2016-12-28 12:03:59 +11:00
Andrew Manning
95683c6239 Add webpage doco to Member guide. Add nav menu highlighting when scrolling past content 2016-12-27 19:57:53 -05:00
zotlabs
db9ea66069 Merge branch 'master' of https://github.com/redmatrix/hubzilla into master_merge 2016-12-27 15:28:52 -08:00
zotlabs
ef02464e3c issue with HTML in code blocks in markdown in wiki 2016-12-27 15:28:42 -08:00
zotlabs
d29bd4b054 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-27 15:27:38 -08:00
zotlabs
17b7042a25 issue with HTML in code blocks in markdown in wiki 2016-12-27 15:26:47 -08:00
Andrew Manning
75afb37987 Merge pull request #630 from anaqreon/dev
BBcode reference page is essentially complete.
2016-12-27 07:37:13 -05:00
Andrew Manning
528a66fc97 Revert parseIdentityAwareHTML() 2016-12-27 07:35:33 -05:00
Andrew Manning
b245311a7e Revert parseIdentityAwareHTML() 2016-12-27 07:34:47 -05:00
Andrew Manning
4b2ef39648 BBcode reference page is essentially complete. There is still room for improvement. 2016-12-27 07:32:39 -05:00
zotlabs
286c3eafe3 minor cleanup 2016-12-26 14:17:40 -08:00
zotlabs
3bb6c667db Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-26 13:11:54 -08:00
zotlabs
b530d1d449 perform input validation on xchan_store and re-enable the post method of the xchan api endpoint. 2016-12-26 13:10:24 -08:00
zotlabs
fdbb5b67a8 Merge pull request #628 from anaqreon/dev
Doco revisions
2016-12-27 07:29:57 +11:00
Andrew Manning
67f09fb1d6 Almost completed reconstruction of bbcode reference page 2016-12-26 14:59:18 -05:00
Andrew Manning
1a5dd5c87c Updated markup language support doco. Modified parseIdentityAwareHTML BBcode parsing to support the BBcode reference which is now in /help/member/bbcode.html. Add Bootstrap classes to tables for BBcode tables that have the border=0 or border=1 options set. 2016-12-26 08:58:40 -05:00
Andrew Manning
c2a189ab18 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-12-26 06:52:56 -05:00
zotlabs
56219f9f61 create first webpage as 'home' if none exist. 2016-12-25 14:40:50 -08:00
zotlabs
c38e7ee3e3 show webpages link to visitors if a 'home' page exists. This means the nav menu must be used to edit pages. 2016-12-25 14:26:27 -08:00
Andrew Manning
5e490ed8b7 Fix broken link 2016-12-25 12:59:34 -05:00
zotlabs
9f9b1d3ce6 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-24 15:02:03 -08:00
zotlabs
35ed9b9b72 issue with post signatures if posted from api and logged in locally with a different identity. 2016-12-24 15:00:37 -08:00
Mario Vavti
c2830c4a98 Hubzilla 2.0 2016-12-23 10:18:30 +01:00
Mario Vavti
3b9b03cf86 Merge branch '2.0RC' 2016-12-23 10:09:46 +01:00
Mario Vavti
ef39c1e94b update changelog 2016-12-23 10:08:01 +01:00
Mario Vavti
4ab2d46113 update changelog 2016-12-23 10:07:12 +01:00
zotlabs
1e53528363 Merge pull request #627 from anaqreon/dev
Merging proposed changes to 2.0RC for doco revisions
2016-12-23 15:35:12 +11:00
zotlabs
b46a8344d3 Merge pull request #626 from anaqreon/2.0RC-doco
Continuing to revise and rearrange content for clarity and reduced redundancy.
2016-12-23 15:35:04 +11:00
Andrew Manning
5d8334d7f4 Merging proposed changes to 2.0RC for doco revisions 2016-12-22 21:49:16 -05:00
Andrew Manning
c9a6e0155b Merge remote-tracking branch 'upstream/2.0RC' into 2.0RC-doco 2016-12-22 21:42:23 -05:00
Andrew Manning
7a9fab8f57 Continuing to revise and rearrange content for clarity and reduced redundancy. 2016-12-22 21:40:59 -05:00
Mario Vavti
4bcc1f5adb move style info into css file 2016-12-22 15:20:31 +01:00
Mario Vavti
3629468d47 move style info into css file 2016-12-22 15:20:02 +01:00
Mario Vavti
d7f65ca125 another check 2016-12-22 15:01:57 +01:00
Mario Vavti
c5d6f58988 another check 2016-12-22 15:01:29 +01:00
Mario Vavti
a7a3ce7245 a cleaner way to work around browser bugs 2016-12-22 14:55:36 +01:00
Mario Vavti
6cb527a937 a cleaner way to work around browser bugs 2016-12-22 14:55:05 +01:00
Mario Vavti
007ba2bee4 more robust crossbrowser support 2016-12-22 11:54:39 +01:00
Mario Vavti
2ce6d47519 more robust crossbrowser support 2016-12-22 11:54:04 +01:00
zotlabs
f2bfdfdedd provide separate logging (if configured) for btlogger which is used to catch really subtle issues which don't always leave an audit trail. Similar to dbfail.out, the file btlogger.out (if it exists and is write-able) will only log these unusual situations with backtraces so we can find the culprits. 2016-12-21 23:35:54 -08:00
zotlabs
9d49faca61 update util/hz to use zot api instead of the (now optional) twitter api 2016-12-21 16:44:33 -08:00
zotlabs
bb85e139f1 more vcard work 2016-12-21 15:03:33 -08:00
Andrew Manning
c87d025902 Forgot to complete the thought 2016-12-21 16:28:45 -05:00
Andrew Manning
c37b8f7f9d Merge remote-tracking branch 'upstream/2.0RC' into 2.0RC-doco 2016-12-21 15:00:17 -05:00
Andrew Manning
1ee5dba9b3 Separating Hubzilla project info from the initial About Hubzilla page. Heavily revised content. 2016-12-21 15:00:04 -05:00
Mario Vavti
e8be8139cb css fixes 2016-12-21 12:56:23 +01:00
Mario Vavti
fcc92299eb css fixes 2016-12-21 12:55:49 +01:00
Mario Vavti
0c23cd62db fix a glitch in sticky-kit and comment out alt_pager() in widget_conversations since it will not work there 2016-12-21 11:53:20 +01:00
Mario Vavti
04472bd730 fix a glitch in sticky-kit and comment out alt_pager() in widget_conversations since it will not work there 2016-12-21 11:51:24 +01:00
Mario Vavti
c1f1d4e2ce update changelog 2016-12-21 10:16:07 +01:00
Mario Vavti
e91a4bebed update changelog 2016-12-21 10:15:14 +01:00
zotlabs
3d811a17fe provide call button on connections list if mobile|tablet and a phone number exists 2016-12-20 23:26:31 -08:00
zotlabs
f3ec818a66 abook_vcard cleanup 2016-12-20 20:37:06 -08:00
zotlabs
a270ca5101 allow update of fn and initial setting from channel name 2016-12-20 19:31:50 -08:00
zotlabs
493aa9f20d progress on abook_vcard 2016-12-20 18:43:20 -08:00
zotlabs
6ff462abf3 more abook_vcard 2016-12-20 17:19:53 -08:00
zotlabs
4103344e48 abook_vcard first commit 2016-12-20 16:45:12 -08:00
zotlabs
193705a08a Merge branch '2.0RC' of https://github.com/redmatrix/hubzilla into 2.0RC_merge 2016-12-20 15:12:22 -08:00
Manuel Jiménez Friaza
b59230067f Translated new strings into Spanish version 2016-12-20 15:11:13 -08:00
Mario Vavti
7b7fa5f77b turns out we do need this in certain situations 2016-12-20 14:53:58 +01:00
Mario Vavti
27b4c17f06 turns out we do need this in certain situations 2016-12-20 14:53:21 +01:00
Mario Vavti
6491e30a80 some changes to heading sizes to make some sense in the doco (this will undergo some refinement in the next release cycle when we possibly upgrade to bootstrap 4) and get rid of the accordion for now. 2016-12-20 11:38:39 +01:00
Mario Vavti
4d478a3306 some changes to heading sizes to make some sense in the doco (this will undergo some refinement in the next release cycle when we possibly upgrade to bootstrap 4) and get rid of the accordion for now. 2016-12-20 11:37:57 +01:00
Andrew Manning
90dfa2ccaf More heading work and some content rearrangement. 2016-12-19 19:35:36 -08:00
Andrew Manning
c968d11943 Move headings down to start at H3 at Mario's direction 2016-12-19 19:35:19 -08:00
zotlabs
e0918816fb Merge pull request #622 from mjfriaza/dev
Translated new strings into Spanish version
2016-12-20 14:32:01 +11:00
zotlabs
66e84b68fc Merge pull request #623 from anaqreon/2.0RC-doco
Headings restructuring and some content rearrangement
2016-12-20 14:31:22 +11:00
Andrew Manning
3d18f1447e More heading work and some content rearrangement. 2016-12-19 22:20:45 -05:00
Andrew Manning
d4ab74b25e Move headings down to start at H3 at Mario's direction 2016-12-19 22:12:08 -05:00
zotlabs
d2cc7df7db allow tel: links on mobile devices 2016-12-19 18:59:40 -08:00
zotlabs
231b70b987 call zidify_links() when formatting bbcode for internal consumption 2016-12-19 16:06:49 -08:00
zotlabs
1798ebd395 improve oembed cache security 2016-12-19 15:38:42 -08:00
zotlabs
b1f4ea6206 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-19 14:35:44 -08:00
zotlabs
350627988e zidify private mail 2016-12-19 14:35:13 -08:00
Mario Vavti
87248c9f47 fix contextualHelpFocus() to work wit sticky aside 2016-12-19 20:37:48 +01:00
Mario Vavti
3fe616b8fe Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-12-19 20:36:56 +01:00
Mario Vavti
a12b2c8d33 fix contextualHelpFocus() to work wit sticky aside 2016-12-19 20:36:40 +01:00
jeroenpraat
468fb3c77a Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-12-19 16:52:17 +01:00
jeroenpraat
3a4bd27333 Update NL strings 2016-12-19 16:51:30 +01:00
jeroenpraat
ac9974fd64 Update NL strings 2016-12-19 16:50:52 +01:00
Mario Vavti
1e1b51bc1c make sticky aside available for small screens. we had to get rid of the transition effect for this to work reliably 2016-12-19 12:47:55 +01:00
Mario Vavti
127772e1b4 this is not needed 2016-12-19 12:47:44 +01:00
Mario Vavti
3ad3d3037f make sticky aside available for small screens. we had to get rid of the transition effect for this to work reliably 2016-12-19 12:46:36 +01:00
Mario Vavti
9c5f2de4ec this is not needed 2016-12-19 09:48:01 +01:00
zotlabs
59772ef772 Merge branch '2.0RC' of https://github.com/redmatrix/hubzilla into 2.0RC_merge 2016-12-18 22:34:25 -08:00
zotlabs
96260ba26d deprecate bb_iframe 2016-12-18 22:34:02 -08:00
zotlabs
ca2e2f5f45 deprecate bb_iframe 2016-12-18 22:33:23 -08:00
zotlabs
92f3d863fa re-factor item_photo_menu - there is some room for future development, currently it was made compatible with minimal template changes 2016-12-18 16:26:00 -08:00
Manuel Jiménez Friaza
5970df0606 Translated new strings into Spanish version 2016-12-17 13:20:04 +01:00
zotlabs
e1819a874f use darkorange. 2016-12-16 22:47:25 -08:00
zotlabs
0c665e11f1 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-16 19:57:49 -08:00
zotlabs
827d4c5fb0 use lock colour to indicate that permissions have been set by the software to something you might not expect rather than an exclamation mark. This may not be the best colour in this page context, but it serves the intended purpose. Perhaps orange might be less intrusive and still convey the desired information. 2016-12-16 19:54:07 -08:00
zotlabs
e46fcc2893 string update 2016-12-16 19:52:19 -08:00
Mario Vavti
ae8129f1fd display inline instead of floating 2016-12-16 22:56:11 +01:00
Mario Vavti
6eed7eb540 display inline instead of floating 2016-12-16 22:50:19 +01:00
Mario Vavti
7c86f11167 retrigger after fullscreen 2016-12-16 16:24:44 +01:00
Mario Vavti
dc34bf18bb retrigger after fullscreen 2016-12-16 16:24:17 +01:00
Mario Vavti
6bde70d60a move the sticky-kit^Cquery plugin to /lib and see if we want this for the whole app 2016-12-16 16:14:56 +01:00
Mario Vavti
b8370cffb9 move the sticky-kit^Cquery plugin to /lib and see if we want this for the whole app 2016-12-16 16:14:01 +01:00
Mario Vavti
b863447c2b Merge branch '2.0RC' of https://github.com/redmatrix/hubzilla into 2.0RC 2016-12-16 11:50:30 +01:00
Mario Vavti
7403f9f870 some fixes for doco nav 2016-12-16 11:50:16 +01:00
Mario Vavti
5252211c92 some fixes for doco nav 2016-12-16 11:49:27 +01:00
zotlabs
1d63654662 there are occasional sites which use different capitalisation of Content-Type; which is rare, but completely legal. 2016-12-15 18:08:23 -08:00
zotlabs
f83fc2e35c there are occasional sites which use different capitalisation of Content-Type; which is rare, but completely legal. 2016-12-15 18:06:49 -08:00
zotlabs
6cf17c7bcc use array_shift - it's cleaner 2016-12-15 16:41:01 -08:00
zotlabs
19d7cfd66b Merge branch '2.0RC' of https://github.com/redmatrix/hubzilla into 2.0RC_merge 2016-12-15 16:04:29 -08:00
zotlabs
a89772652d z_fetch_url incorrect variable 2016-12-15 16:04:07 -08:00
zotlabs
95485a0da2 z_fetch_url incorrect variable 2016-12-15 16:02:52 -08:00
zotlabs
f67acc82cf html2plain warnings 2016-12-15 13:45:27 -08:00
Mario Vavti
e2f1ce7758 note widget: whitespace and resize the textarea to reveal full content 2016-12-15 14:50:26 +01:00
Mario Vavti
4744e50244 note widget: whitespace and resize the textarea to reveal full content 2016-12-15 14:49:14 +01:00
Mario Vavti
61f105da6f reworked doco navigation 2016-12-15 12:26:35 +01:00
Mario Vavti
273ab304b9 reworked doco navigation 2016-12-15 12:25:59 +01:00
Mario Vavti
1d3af68f29 more wiki cleanup 2016-12-15 10:57:00 +01:00
Mario Vavti
2a2a4b96c7 more wiki cleanup 2016-12-15 10:56:16 +01:00
zotlabs
b630a01131 Merge pull request #600 from toppoint/dev
Configuring email notifications per channel
2016-12-15 15:56:52 +11:00
zotlabs
e70dbec6b9 postgres is picky about this stuff 2016-12-14 20:55:26 -08:00
ilu33
f25189fc74 Drop on switch for notifications 2016-12-15 05:55:23 +01:00
zotlabs
00fc66d8e8 postgres is picky about this stuff 2016-12-14 20:51:10 -08:00
ilu33
97f17374f2 Missing single quotes 2016-12-15 05:47:02 +01:00
xxx
f16b19faf3 Merge branch 'dev' of https://github.com/toppoint/hubzilla into dev 2016-12-15 04:59:54 +01:00
ilu33
4ce16e9e91 Configuring email notifications per channel 2016-12-15 04:56:34 +01:00
zotlabs
be4bbd7b9b SQL error with app categories 2016-12-14 19:12:55 -08:00
zotlabs
bae28965ab issue #446 apps usability - disable app if attached to a plugin that is uninstalled, allow system apps to be soft deleted and undeleted from the edit pane. 2016-12-14 19:11:01 -08:00
zotlabs
9daa97f279 Merge branch '2.0RC' of https://github.com/redmatrix/hubzilla into 2.0RC_merge 2016-12-14 14:33:03 -08:00
zotlabs
4094c47e29 markdown regex 2016-12-14 14:28:59 -08:00
zotlabs
63efbdffe6 markdown regex 2016-12-14 14:27:00 -08:00
Mario Vavti
a7af6d8a3c fix regex 2016-12-14 13:18:02 +01:00
Mario Vavti
ee1fe95ee5 fix regex 2016-12-14 13:17:33 +01:00
Mario Vavti
f79c619065 wiki: do not show revert buttons if we do not have write perms and minor cleanup 2016-12-14 11:56:42 +01:00
Mario Vavti
028935a318 wiki: do not show revert buttons if we do not have write perms and minor cleanup 2016-12-14 11:55:52 +01:00
Mario Vavti
62353191e8 fix btn-group rendering 2016-12-14 09:57:22 +01:00
zotlabs
cbffd32d8e use absolute namespace in case this gets moved 2016-12-13 20:05:36 -08:00
zotlabs
0394a3e939 tag and mention handling in private mail (which required refactoring the bbcode cleanup stuff in mod_item) 2016-12-13 20:01:38 -08:00
zotlabs
8e400e9e40 update hook doco 2016-12-13 18:47:07 -08:00
zotlabs
66a53c6d3c add plugin hook to zot_best_algorithm() 2016-12-13 18:43:47 -08:00
zotlabs
f111c5c325 mail preview (basic functionality) 2016-12-13 17:30:02 -08:00
zotlabs
c4a9b61da6 restructuring include/message for mail preview 2016-12-13 16:34:08 -08:00
zotlabs
a65ebbb319 Merge branch '2.0RC' of https://github.com/redmatrix/hubzilla into 2.0RC_merge 2016-12-13 15:16:27 -08:00
jeroenpraat
bc78cf8a87 update dutch strings 2016-12-13 15:16:19 -08:00
zotlabs
23823811e9 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-13 15:15:37 -08:00
jeroenpraat
2bcc41c851 update dutch strings 2016-12-13 23:45:01 +01:00
jeroenpraat
dce03a36d0 update dutch strings 2016-12-13 23:37:03 +01:00
Mario Vavti
b24b3d21e1 dropdown position fixes 2016-12-13 11:24:29 +01:00
Mario Vavti
556e507f68 dropdown position fixes 2016-12-13 11:24:03 +01:00
Mario Vavti
29bf6e5d32 bring lockview to wikilist 2016-12-13 11:15:05 +01:00
Mario Vavti
0927af40c3 bring lockview to wikilist 2016-12-13 11:14:22 +01:00
Mario Vavti
c434d98365 do not increase opacity to more than 1 2016-12-13 10:24:30 +01:00
Mario Vavti
0979f11cc3 do not increase opacity to more than 1 2016-12-13 10:23:56 +01:00
Mario Vavti
68bdd26426 simplify wikilist widget 2016-12-13 10:09:56 +01:00
Mario Vavti
342c4384e4 simplify wikilist widget 2016-12-13 10:09:26 +01:00
Andrew Manning
73a41b16be Make region_1 table of contents "unsticky" when width is less than 768px for better mobile support. 2016-12-13 09:28:49 +01:00
git-marijus
e00062ea8f Merge pull request #619 from anaqreon/dev
Make region_1 table of contents "unsticky" when width is less than
2016-12-13 09:27:15 +01:00
zotlabs
ca44ce5f8c document the stream_item hook before I forget 2016-12-12 20:28:13 -08:00
Andrew Manning
812ac259e2 Make region_1 table of contents "unsticky" when width is less than 768px for better mobile support. 2016-12-12 20:10:50 -05:00
zotlabs
b8da386e55 Merge branch '2.0RC' of https://github.com/redmatrix/hubzilla into 2.0RC_merge 2016-12-12 11:47:19 -08:00
zotlabs
3c0358c9cf clarifications of some of the descriptions 2016-12-12 11:40:29 -08:00
Mario Vavti
c9aca2a13d bump version 2016-12-12 14:42:08 +01:00
Mario Vavti
ed9362a98c version 2.0RC 2016-12-12 14:39:48 +01:00
Mario Vavti
6b86d834a9 update changelog 2016-12-12 14:34:21 +01:00
Mario Vavti
a2c5e30011 wiki: indicate saved state for bbcode type 2016-12-12 13:09:27 +01:00
zotlabs
e06647b54e some preliminary work for email notification of likes - potentially destabilising so disabled until after next release 2016-12-11 17:54:03 -08:00
zotlabs
0f7d36cfa0 move the rest of superblock out of core 2016-12-11 16:27:43 -08:00
zotlabs
9e27559bdb clone sync missing for some item delete operations 2016-12-11 14:39:06 -08:00
Mario Vavti
0a21ffbfec show doc section heading in titlebar 2016-12-11 21:43:27 +01:00
zotlabs
542e487b69 This needs a bit more word-smithing to be concise and also accurate; but I need to think about it some more. 2016-12-10 13:14:56 -08:00
zotlabs
bfc6d95a7e drug dealers have users 2016-12-10 13:09:47 -08:00
Mario Vavti
65a26958f7 fix embed-image for fullscreen mode and some adjustments for /help 2016-12-10 21:33:29 +01:00
Mario Vavti
2dfb4d0c17 fix typo and do not do anything on resize if not fullscreen 2016-12-10 17:35:05 +01:00
Mario Vavti
368ad332a0 even more wiki fullscreen optimisation 2016-12-10 17:17:11 +01:00
Mario Vavti
bde32eb7df more wiki fullscreen optimisation 2016-12-10 15:51:55 +01:00
Mario Vavti
dc64556902 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-12-10 15:08:54 +01:00
Mario Vavti
0315077daf wiki fullscreen optimisation 2016-12-10 15:08:49 +01:00
git-marijus
7237bacec0 Merge pull request #617 from anaqreon/doco
Only display h1 headings in sticky side nav. Toggle display of detail…
2016-12-10 15:06:10 +01:00
git-marijus
9bf8e89192 Merge pull request #618 from phellmes/dev
Update DE translation strings
2016-12-10 15:05:17 +01:00
phellmes
5fa6b07e1b Update DE translation strings 2016-12-10 13:49:08 +01:00
Andrew Manning
6668fe02aa Only display h1 headings in sticky side nav. Toggle display of detailed TOC at top of page. Introduce return to top button for small screens. 2016-12-09 22:18:23 -05:00
zotlabs
82d09c288d bring back a few of the doc edits from overlapping checkins 2016-12-09 13:29:41 -08:00
zotlabs
8029f56d1c router error reporting 2016-12-09 12:38:53 -08:00
zotlabs
0a6916e1b9 superblock issue + string update 2016-12-09 00:49:55 -08:00
zotlabs
e419a034b7 Merge pull request #616 from anaqreon/doco
Doco updates
2016-12-09 13:46:07 +11:00
Andrew Manning
cafa5217ed Condense sticky nav TOC to h1 only. Add deep TOC to top of each page. Adjust developer guide headings. 2016-12-08 21:41:04 -05:00
Andrew Manning
bc16a1bcc4 Merge remote-tracking branch 'upstream/dev' into doco 2016-12-08 21:16:49 -05:00
Andrew Manning
f5737a6354 Add hub snapshot tool page to admin section 2016-12-08 21:16:30 -05:00
Andrew Manning
2865ad5281 Replace Hubzilla with $Projectname more. Revise code block side-scroll 2016-12-08 21:12:05 -05:00
zotlabs
33d75ad7b0 Report the WebDAV endpoint on the settings page (under the reddress) if the account techlevel suggests the viewer isn't going to run away screaming and have epileptic seizures when they see the term 'WebDAV'. 2016-12-08 18:06:31 -08:00
zotlabs
1a3222d357 Merge pull request #615 from anaqreon/doco
Doco sprint
2016-12-09 12:37:07 +11:00
Andrew Manning
5a17f86f1a Merge remote-tracking branch 'upstream/dev' into doco 2016-12-08 20:34:21 -05:00
Andrew Manning
c989a94916 Convert consolidated pages back to BBcode and Markdown where possible 2016-12-08 20:33:03 -05:00
zotlabs
8b57add891 don't alter received/changed timestamps when editing 2016-12-08 16:18:40 -08:00
zotlabs
5833bb3bd4 only update the 'changed' timestamp for recent item_store events 2016-12-08 11:16:23 -08:00
Andrew Manning
d17abedc7d Convert about sections back to bbcode, update some formatting. 2016-12-07 22:25:50 -05:00
zotlabs
b407074281 always check api_user 2016-12-07 19:04:24 -08:00
zotlabs
c4d6189b55 api_albums 2016-12-07 18:41:59 -08:00
zotlabs
07706b41f4 document the api filedata call 2016-12-07 15:22:26 -08:00
zotlabs
346a48d4c2 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-07 11:45:08 -08:00
zotlabs
77db84b4c8 doc updates 2016-12-07 11:44:35 -08:00
zotlabs
b90b9bb472 Merge pull request #614 from mjfriaza/dev
Translated new strings into es_ES
2016-12-08 06:06:20 +11:00
Manuel Jiménez Friaza
d019187895 Updated the Spanish translation 2016-12-07 10:08:02 +01:00
zotlabs
b3963456c0 attach_list_files bugfix 2016-12-06 21:11:39 -08:00
zotlabs
bccf371aa9 link from index 2016-12-06 20:36:14 -08:00
zotlabs
641e9ff508 api files improvements/fixes and documentation 2016-12-06 20:34:23 -08:00
zotlabs
abb045e1ff Merge pull request #612 from anaqreon/dev
Doco merge
2016-12-07 10:12:02 +11:00
Andrew Manning
ae97afd806 Prepare for dev pull request 2016-12-06 17:19:27 -05:00
Andrew Manning
c09ee7d714 Remove local CSS that overrides the redbasic theme. 2016-12-06 17:15:20 -05:00
Andrew Manning
4047e871e5 Merge remote-tracking branch 'upstream/dev' into doco 2016-12-06 06:24:59 -05:00
zotlabs
4c1701ca77 Providing more frequent string updates at the moment 2016-12-05 19:23:04 -08:00
Andrew Manning
8ba5cbc2b9 Merge remote-tracking branch 'upstream/dev' into doco 2016-12-05 20:16:19 -05:00
zotlabs
fbf13dde21 minor changes to config api and markdown_to_bb 2016-12-05 14:50:34 -08:00
zotlabs
bdd713413a typo 2016-12-04 20:24:55 -08:00
zotlabs
e896592261 minor optimisation to reduce code duplication 2016-12-04 17:48:31 -08:00
zotlabs
d9312dbefb setup: a bit more text cleanup 2016-12-04 17:27:29 -08:00
zotlabs
5cb638bd41 setup: we actually don't require proc_open any more, so remove that check. 2016-12-04 17:23:45 -08:00
zotlabs
df23ef36c7 api_zot: implement /api/z/1.0/network/stream and fix /api/z/1.0/channel/stream 2016-12-04 17:07:25 -08:00
zotlabs
e1ffacbe32 text syntax 2016-12-04 15:23:55 -08:00
zotlabs
6d9fe04aa8 setup changes to check for shell_exec and exec functions 2016-12-04 15:19:58 -08:00
zotlabs
16e48a859c Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-04 11:43:27 -08:00
zotlabs
6346c00527 bugfix for api group_members 2016-12-04 11:42:40 -08:00
Mario Vavti
3f6fe4f2be translateable string 2016-12-04 15:10:54 +01:00
Mario Vavti
bb7680dc51 implement content type in wiki list 2016-12-04 15:07:03 +01:00
Mario Vavti
161572b292 leave toc title for the author 2016-12-04 14:31:45 +01:00
Andrew Manning
3b3da24823 Merge remote-tracking branch 'upstream/dev' into doco 2016-12-04 08:08:22 -05:00
Andrew Manning
1f91c2fe12 Remove borders and box-shadow with CSS without removing the classes from help.tpl. 2016-12-04 08:07:58 -05:00
Mario Vavti
b98fbcce0c Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-12-04 12:51:39 +01:00
Mario Vavti
b12d4c03cb fixes for toc bbcode and bbcode wiki toc 2016-12-04 12:51:23 +01:00
zotlabs
bd4bdab81c more zot api documentation 2016-12-04 02:53:17 -08:00
zotlabs
792527d456 mod_item: better exception handling for api use 2016-12-03 13:31:56 -08:00
zotlabs
1a103662e9 correct the doco 2016-12-03 13:17:30 -08:00
zotlabs
25ea754502 item_store: parent wasn't being returned in api call 2016-12-03 13:16:04 -08:00
zotlabs
3152d039a5 Merge pull request #609 from mjfriaza/dev
Updated the Spanish version
2016-12-04 07:46:48 +11:00
zotlabs
a33a5771ed Merge pull request #608 from redmatrix/jeroenpraat-patch-1
Fix full screen for embedded videos
2016-12-04 07:46:31 +11:00
zotlabs
5bedf3618d put all the api related stuff in the api folder 2016-12-03 12:29:51 -08:00
Andrew Manning
153cd0a205 Remove classes from the doco content region to simplify the appearance. Instead of loading /doc/main.bb, redirect to /doc/about/about_hubzilla/. These edits are minimal for demo purposes and not the proper way to do it. 2016-12-03 15:17:31 -05:00
zotlabs
f5f1b9602a rename api endpoint yet again. item/store appears to be blacklisted in some hosting environments. 2016-12-03 12:08:58 -08:00
Manuel Jiménez Friaza
7347b72010 Updated the Spanish translation 2016-12-03 12:49:56 +01:00
Jeroen van Riet Paap
5aeb8305fc Fix full screen for embedded videos 2016-12-03 11:47:10 +01:00
zotlabs
53c950b235 api xchan doc 2016-12-03 00:02:06 -08:00
zotlabs
8e6ff32c97 more api work for item/store and doco 2016-12-02 23:09:25 -08:00
zotlabs
23acd2738b edits 2016-12-02 22:53:56 -08:00
zotlabs
6bcc039e01 initial doco for the item/store api call 2016-12-02 22:51:08 -08:00
zotlabs
e776e79c1e api function item/new renamed to item/store as that more closely reflects its purpose. It can also be used to store an edit of an existing item. I believe this is a reasonably safe change at this time as I don't believe there is any software currently making use of this call - instead using the Twitter API which is now a plugin.
Also some work to make the install documentation agnostic to project name variations. This is not yet complete.
2016-12-02 21:54:50 -08:00
zotlabs
e2660eaad3 fix the forum widget for forums with custom perms 2016-12-02 12:15:18 -08:00
zotlabs
5b6e731f37 string update 2016-12-02 11:29:50 -08:00
Mario Vavti
ce0ba8edbd fix embed image for text/bbcode 2016-12-02 12:27:59 +01:00
zotlabs
ec97464007 fallback directory servers need to be in the same realm 2016-12-01 20:03:23 -08:00
zotlabs
1ff6e4db9d upgraded zotlabs.com to https 2016-12-01 19:53:34 -08:00
zotlabs
59aae20aea bb_highlight: if somebody enters an unsupported language for code syntax highlighting (like fortran or cobol or whatever) use 'php' instead of returning a completely unformatted code block. This choice was somewhat arbitrary. It could be difficult to analyse the intention which could be literally anything and provide the closest match. 2016-12-01 19:04:29 -08:00
zotlabs
97f9dedaa6 sql error in fetch conversation 2016-12-01 18:21:36 -08:00
zotlabs
7f730b81ff trim both key and iv on other ciphers 2016-12-01 18:14:20 -08:00
zotlabs
e793fc9973 trim iv in STD_encapsulate 2016-12-01 18:12:18 -08:00
zotlabs
73876e5774 versioning for permission additions to ensure we're using the same set of files 2016-12-01 16:40:49 -08:00
zotlabs
97e70d62bf extensible perms: the really, really hard part - figuring out what to do about people with custom permissions so as to set sane defaults. 2016-12-01 15:52:54 -08:00
zotlabs
47a356ff52 compatible_project: we are only concerned with the default realm 2016-12-01 14:45:24 -08:00
zotlabs
4e6a9fb202 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-01 14:16:46 -08:00
zotlabs
141b8495e2 allow plugins to cancel item_store() and item_store_update() 2016-12-01 14:15:34 -08:00
Mario Vavti
de503bf5c4 use highlight in ac-list for hl bbcode 2016-12-01 15:06:39 +01:00
Mario Vavti
c94fbe5eeb Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-12-01 14:38:21 +01:00
Mario Vavti
523f7652f2 whitespace fixes 2016-12-01 14:38:04 +01:00
zotlabs
6c5795b519 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-12-01 02:51:27 -08:00
zotlabs
6552ccc477 issue #607 parens not recognised inside urls 2016-12-01 02:44:01 -08:00
Mario Vavti
adb9f31803 more wiki cleanup 2016-12-01 11:38:49 +01:00
Mario Vavti
d7f655dfc5 wiki cleanup - wip. please watch out for eventual regressions 2016-12-01 11:24:35 +01:00
zotlabs
83a4999dbe issue #606, postgres binary data handling under PDO and HHVM when passed null 2016-11-30 19:45:46 -08:00
zotlabs
abf1d7da23 Merge pull request #605 from anaqreon/doco
Another iteration of documentation
2016-12-01 14:30:23 +11:00
Andrew Manning
dfaf116449 Add resources and links. Fix bug where table of contents was not generated if URL had a sectionspecified like /help/blah#anchor 2016-11-30 22:24:44 -05:00
Andrew Manning
41362e2b6e Reverted governance to previous version accidentally clobbered. Removed history page. Added credits. 2016-11-30 22:14:42 -05:00
Andrew Manning
731b6ebfa7 Added some vertical offset to headings so that the table of contents links do not hide the heading under the navbar. Added the About this Hub content 2016-11-30 21:57:00 -05:00
Andrew Manning
3f838e1dbc Merge remote-tracking branch 'upstream/dev' into doco 2016-11-30 21:22:51 -05:00
zotlabs
c845eed114 advanced crypto restricted by server role 2016-11-30 16:36:33 -08:00
zotlabs
5b09829959 zot 1.2 2016-11-30 16:22:31 -08:00
zotlabs
2e5a993f88 pubsites: don't list dead sites 2016-11-30 11:24:38 -08:00
Mario Vavti
1fe1194ef4 do not call purify_html() at this place 2016-11-30 15:13:06 +01:00
Mario Vavti
19d0919451 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-11-30 13:31:08 +01:00
Mario Vavti
afffbb6487 go live with wiki mimetypes - you can now choose if a wiki will contain markdown or bb-code markup 2016-11-30 13:30:50 +01:00
zotlabs
4964a1519b Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-30 02:20:11 -08:00
Mario Vavti
53e4b55ea3 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-11-30 10:57:04 +01:00
zotlabs
9b3c00e0b6 pubsites: don't list dead sites 2016-11-30 01:16:44 -08:00
zotlabs
7b31e5918e provide role on siteinfo page 2016-11-29 19:51:42 -08:00
Andrew Manning
50a8ba8c18 Merge remote-tracking branch 'upstream/dev' into doco 2016-11-29 22:13:24 -05:00
Andrew Manning
b32bce9be2 Major changes to accordion nav menu. Table of contents auto-generated below the loaded page. Removed manual TOCs from individual pages. TOC uses jQuery plugin Sticky to remain visible when it would scroll out of view. 2016-11-29 22:08:19 -05:00
zotlabs
8c87f32b38 This isn't the most elegant solution as it requires a bit of arcane knowledge, but provide a way to step through connections with a specific tab/panel open in the connection editor. It does not close the default panel, but merely opens the one specified by a &section= URL parameter (closing the default panel would require a major refactoring of the default panel logic). Valid choices for section currently are affinity, filter, and perms. This tab/panel selection should persist across form posting and 'prev/next'. 2016-11-29 18:41:34 -08:00
zotlabs
0cf6c6c132 wrong link 2016-11-29 17:00:37 -08:00
zotlabs
d757dd4e17 provide a fresh new look and cleaner layout and more relevant information to siteinfo 2016-11-29 15:47:38 -08:00
zotlabs
175ae58563 highlight 2016-11-29 14:27:55 -08:00
Mario Vavti
f32f7d2308 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-11-29 13:38:59 +01:00
Andrew Manning
36acd34874 Toggle section folder icon between open and closed when selected. A bug prevents it from working properly the first time a section is opened. 2016-11-29 07:37:21 -05:00
zotlabs
3ed6d82367 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-29 02:57:58 -08:00
zotlabs
793047919d missed this from the earlier checkin 2016-11-29 02:57:29 -08:00
Mario Vavti
6a786342f9 rename function 2016-11-29 10:46:04 +01:00
Mario Vavti
d184b3fa86 more work on wiki mimetypes 2016-11-29 10:33:46 +01:00
Mario Vavti
91e97468a0 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-11-29 10:13:47 +01:00
zotlabs
4a9317db6e roll standard version to ensure that dba_pdo is the default and make this a dependency for the cdav plugin 2016-11-28 14:46:42 -08:00
zotlabs
b66aeea384 minor re-arrange 2016-11-28 14:00:34 -08:00
zotlabs
90f3cc7328 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-28 11:19:20 -08:00
Mario Vavti
f9b732482d some basic work for implementing mimetypes for wikis 2016-11-28 15:24:49 +01:00
Andrew Manning
924f796eb8 Merge remote-tracking branch 'upstream/dev' into doco 2016-11-28 06:36:52 -07:00
Andrew Manning
2528f35f00 Autoscroll page table of contents near top of side nav menu if on large screens, but set position to static on small screens to fix display bug 2016-11-28 06:36:19 -07:00
git-marijus
683a09781a Merge pull request #602 from anaqreon/doco
Update context help content and context page element focus feature.
2016-11-28 13:44:41 +01:00
Mario Vavti
d8774cda8e minor cleanup and remove more double encoding 2016-11-28 11:54:36 +01:00
Mario Vavti
1ce4eda0b9 wiki: move delete page functionality to the widget 2016-11-28 11:29:10 +01:00
Andrew Manning
5bcb373c00 Use the jquery.toc.js library to auto-generate a table of contents for the loaded page under the side nav menu 2016-11-27 21:25:38 -07:00
Andrew Manning
678239424a Integrating lots of member guide content 2016-11-27 16:46:24 -07:00
Andrew Manning
369dc295b1 Add some identity-aware parsing to HTML content using parseIdentityAwareHTML() 2016-11-27 14:48:06 -07:00
Andrew Manning
7470b1180e Add ability to include page assets in documentation pages such as images. Updated Personal Channel tutorial to use local images using this new capability. 2016-11-27 13:43:07 -07:00
Andrew Manning
99a4bb63c7 Added Tutorials section with a Personal Channel tutorial 2016-11-27 12:52:35 -07:00
Andrew Manning
713a34c68e Restructured main table of contents to link to fewer pages with more content. The admin, dev, and member guides are single pages each having a table of contents at the top that is represented in condensed form in the main navigation sidebar. Section links are used to navigate between content sections for simplicity and fewer page loads. 2016-11-27 08:34:23 -07:00
Andrew Manning
165a6d34b2 Update webpages and wiki context help 2016-11-26 20:48:05 -07:00
Andrew Manning
d96ab7c867 Update wiki context help. Modify context page element focus feature to do nothing if the target DOM element is not found. 2016-11-26 20:29:53 -07:00
zotlabs
7de4f1d96f connedit prev/next: sort in the db. 2016-11-26 14:28:36 -08:00
Mario Vavti
68fd1c28b0 rearrange buttons 2016-11-25 11:47:39 +01:00
git-marijus
e7a4aeca6f Merge pull request #601 from anaqreon/wiki
Wiki: Make a git commit when a new page is created
2016-11-25 11:08:44 +01:00
Andrew Manning
86002a2f7b Make a git commit when a new page is created, recording who created the page. 2016-11-24 18:24:15 -05:00
zotlabs
08a4bbb7d0 prev-next navigation for mod_connedit 2016-11-24 15:08:31 -08:00
ilu33
ae4cf98458 Configuring email notifications per channel 2016-11-24 04:32:23 +01:00
Mario Vavti
1596391a2e missing semicolon 2016-11-23 14:03:16 +01:00
Mario Vavti
0ff24b6f21 whitespace and minor fixes 2016-11-23 13:49:24 +01:00
Mario Vavti
6cf8ca5e43 whitespace and minor fixes 2016-11-23 13:38:27 +01:00
git-marijus
4bb6b5a547 Merge pull request #599 from anaqreon/wiki
Wiki save button
2016-11-23 12:42:05 +01:00
Andrew Manning
f14ef10e48 Toggle save button depending on editor changes and return to editor instead of history pane after saving 2016-11-23 06:22:50 -05:00
Mario Vavti
f76046b612 silence headers already sent warning. issue #596 2016-11-23 10:28:37 +01:00
Mario Vavti
69e1f6e4ba whitespace and coding style 2016-11-23 09:47:10 +01:00
Mario Vavti
2fce010f30 whitespace cleanup 2016-11-23 09:41:10 +01:00
zotlabs
5ba8749a38 finish removing self 2016-11-22 20:35:29 -08:00
zotlabs
5c5d45f52b missing plugins in zot-info 2016-11-22 16:33:00 -08:00
zotlabs
a6d47ca772 notification issue 2016-11-22 14:24:38 -08:00
zotlabs
11b4d98f37 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-22 14:18:58 -08:00
zotlabs
6e016c439c db update required for Zot2 2016-11-22 14:15:33 -08:00
Mario Vavti
d1af4a5582 do not use nested section-content-wrapper class 2016-11-22 15:33:10 +01:00
Mario Vavti
9b5e6a1f7a use plural since we can have more than one wiki 2016-11-22 15:27:26 +01:00
Mario Vavti
060982adb4 display wiki list on wiki landing page. 2016-11-22 11:30:04 +01:00
zotlabs
bc95b2fc77 wrong function 2016-11-21 14:38:02 -08:00
zotlabs
f926915e56 zot: specify crypto method 2016-11-20 21:18:38 -08:00
zotlabs
69123590fb Merge pull request #595 from git-marijus/dev
move the remote user homebutton to the user menu. this way everything…
2016-11-21 06:31:07 +11:00
git-marijus
66a35e973c Merge pull request #593 from mjfriaza/dev
Updated ES-ES: better revision of some plugins
2016-11-20 15:42:07 +01:00
Mario Vavti
9d1443bbfe move the remote user homebutton to the user menu. this way everything remote user related is in one place. 2016-11-20 15:38:36 +01:00
Mario Vavti
f4f3769225 fix #594 2016-11-20 14:15:13 +01:00
Manuel Jiménez Friaza
38543ad202 Updated ES-ES: better revision of some plugins 2016-11-20 10:21:47 +01:00
zotlabs
dda2ea8fed Do not render maps for Diaspora destinations. 2016-11-19 14:16:38 -08:00
zotlabs
2293f9dad6 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-19 13:16:55 -08:00
zotlabs
abb3341030 redmatrix is no longer considered a supported platform and will not be listed in pubsites as of 2.x 2016-11-19 13:15:29 -08:00
zotlabs
81e51dcafd Merge pull request #592 from mjfriaza/dev
Updated the Spanish translation and fixed a grammatical concordance error at file connedit in Spanish contextual help
2016-11-19 22:48:14 +11:00
Manuel Jiménez Friaza
e84e2c7258 Fixed a grammatical concordance error at file connedit in Spanish contextual help 2016-11-19 11:32:25 +01:00
Manuel Jiménez Friaza
d9b46587fe Updated the Spanish translation 2016-11-19 11:18:51 +01:00
zotlabs
36322acb6d string update 2016-11-18 23:43:33 -08:00
zotlabs
12b39feba3 Merge pull request #591 from anaqreon/wiki-gui
Wiki UI improvements
2016-11-19 17:48:02 +11:00
Andrew Manning
16281c626b Hide all content if no wiki is selected except for a message saying to choose one. 2016-11-18 22:10:55 -05:00
Andrew Manning
d24e867603 Move page list back out to the side menu, but with the new page form below the new page button like the new wiki form. Disable text editing if viewer lacks edit permission, and change the tab label to Source instead of Edit in that case. 2016-11-18 21:55:29 -05:00
Andrew Manning
d5c14a513d Wiki pages display in tab to the left of the edit pane tab. Home is always first in the list. 2016-11-18 21:25:40 -05:00
Andrew Manning
f9b836027d Merge branch 'dev' into wiki-gui 2016-11-18 18:51:02 -05:00
Mario Vavti
3147b7c62b revert simple checkbox 2016-11-18 14:15:01 +01:00
Mario Vavti
0ceb75ea09 add a simple checkbox template for use in widgets 2016-11-18 13:55:48 +01:00
Andrew Manning
3cb138ea41 move commit message and save button into edit pane. Change page list tab label to Pages and move current page name back to section header. 2016-11-18 06:04:00 -05:00
Andrew Manning
9016ba0d61 Remove page widget completely. Render the page list in a tab alongside History Edit and renamed View tabs. Move new page form below new page button within this page list tab. 2016-11-17 20:38:07 -05:00
zotlabs
3b6248cb64 dba_pdo: return false on q() DB error like the old driver did 2016-11-17 15:15:34 -08:00
zotlabs
5a71984b38 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-17 11:01:38 -08:00
zotlabs
1274889931 issue #588, change 'Bug Report' app to 'Report Bug' 2016-11-17 11:00:34 -08:00
zotlabs
ed7e715812 Merge pull request #590 from encyclomundi/dev
Minor Change: add Guest Access Token permission option.
2016-11-18 05:54:46 +11:00
Your Name
4d12af8396 added member OpenID member URL 2016-11-17 06:01:40 -08:00
Your Name
6f45fb6e14 added Guest Access Token 2016-11-17 05:57:09 -08:00
Your Name
9de15616a5 Added observer.webname 2016-11-17 05:42:45 -08:00
Your Name
5c0ef950cc Minor Change: add Guest Access Token permission option. 2016-11-17 05:23:51 -08:00
Mario Vavti
0b0e0f8f43 wiki list fixes 2016-11-17 14:17:26 +01:00
git-marijus
a444c860a4 Merge pull request #589 from anaqreon/wiki-gui
Active wiki highlighting, move wiki edit panel into wiki list
2016-11-17 12:42:30 +01:00
Andrew Manning
20db8bbe2e Highlight active wiki in list in preparation for removing active wiki name from content section header to make room for page list viewer 2016-11-17 05:58:26 -05:00
Andrew Manning
154923ca7d Merge remote-tracking branch 'upstream/dev' into wiki-gui 2016-11-17 05:33:09 -05:00
Mario Vavti
a34d636366 remove redundant comma 2016-11-17 11:30:11 +01:00
Mario Vavti
89ad259050 configure ace with setOptions, get rid of redundant scrollbars 2016-11-17 11:11:11 +01:00
Andrew Manning
db1ae80877 Hide edit dialog if new wiki dialog opens 2016-11-16 20:46:30 -05:00
Andrew Manning
7aa712a481 Create wiki edit dialogs directly underneath the wiki name in the wiki list 2016-11-16 20:38:06 -05:00
Andrew Manning
748c894450 Move new wiki dialog directly underneath new wiki button in wiki list widget 2016-11-16 20:16:46 -05:00
zotlabs
0e8b13841a Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-16 14:15:42 -08:00
zotlabs
d284b8e0a0 roll minor version (master) 2016-11-16 14:14:30 -08:00
zotlabs
4ce1cccc4a export issue 2016-11-16 14:13:58 -08:00
zotlabs
91c803ff65 use item from DB for return value 2016-11-16 14:13:10 -08:00
zotlabs
7a17ee9f8c export issue 2016-11-16 14:10:57 -08:00
Mario Vavti
1ad8f20bce only turn [] and [x] into checkboxes if it is found inside a checklist 2016-11-16 20:49:58 +01:00
Mario Vavti
de421d02ef remove print margin and set wrap mode to free 2016-11-16 14:57:18 +01:00
Mario Vavti
da390ff573 remove redundant function call 2016-11-16 14:28:36 +01:00
Mario Vavti
14cfa90d63 use modal-lg instead of width 80% 2016-11-16 14:17:10 +01:00
Mario Vavti
90a97ae35f minor wiki changes 2016-11-16 13:14:46 +01:00
zotlabs
501bd814c3 wiki: simplify permission model, reduce duplicate calls to get the same channel info and permissions, return the owner permissions with the normal permission check (keeping all permission fetching in one place), rename the 'channel' variable to 'owner' in several places to identify this channel role more clearly as to the way it is being used in this module, update the deprecated call to proc_run (include/notifier) and make several notice messages translatable. 2016-11-15 18:43:26 -08:00
zotlabs
0f5a166cce still a bit of wiki permission weirdness, this should catch the major ones 2016-11-15 02:12:30 -08:00
zotlabs
d59f450819 use same icon with rest of app 2016-11-15 00:53:13 -08:00
zotlabs
e0a702df76 wiki: permissions issues, untranslated strings in templates and some minor changes to provide a consistent UI with the rest of the app. 2016-11-15 00:50:31 -08:00
zotlabs
e990a35a91 xchan_fetch() returns a simplified structure 2016-11-14 21:06:58 -08:00
zotlabs
3e286f4f19 update api perm_allowed to return all perms if no perm specified 2016-11-14 20:59:10 -08:00
zotlabs
e0a83b4b94 API: add GET /api/z/1.0/perm_allowed 2016-11-14 20:50:55 -08:00
zotlabs
b9728a96ce API: add GET /api/z/1.0/abconfig 2016-11-14 20:30:28 -08:00
zotlabs
537510f081 Merge pull request #585 from anaqreon/wiki
Wiki
2016-11-15 12:52:48 +11:00
zotlabs
dc411ca889 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-14 17:49:03 -08:00
zotlabs
9055d0910c API: add GET api/z/1.0/abook 2016-11-14 17:47:44 -08:00
Andrew Manning
1985502894 Merge remote-tracking branch 'upstream/dev' into wiki 2016-11-14 20:47:38 -05:00
Andrew Manning
c3e3c32bdc Moved delete wiki button into new edit wiki form, opened by edit wiki icon in wiki list 2016-11-14 20:45:04 -05:00
Andrew Manning
f5ad1dfbc5 Moved new wiki and new page buttons to widgets 2016-11-14 19:58:43 -05:00
zotlabs
9eab9512a3 Merge pull request #584 from phellmes/dev
Update DE translation strings
2016-11-15 10:06:53 +11:00
zotlabs
078db2dd80 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-14 14:03:04 -08:00
zotlabs
a3796f9baa SECURITY: public calendar leaks connection information (birthdays) when view_contacts is not allowed 2016-11-14 14:01:53 -08:00
zotlabs
bdc279a49b Merge branch 'master' of https://github.com/redmatrix/hubzilla into master_merge 2016-11-14 13:57:33 -08:00
zotlabs
544330345b SECURITY: public calendar leaks connection information (birthdays) when view_contacts is not allowed 2016-11-14 13:55:31 -08:00
phellmes
4bf1d0373d Update DE translation strings 2016-11-14 13:14:33 +01:00
Mario Vavti
192df273cc show wiki controls only to owner and whitespace fixes 2016-11-14 12:01:16 +01:00
zotlabs
cf5c803fe0 api: allow group member list to use a group name or id 2016-11-13 23:28:03 -08:00
zotlabs
3c302bae5a move all the zid related stuff to one file 2016-11-13 20:22:01 -08:00
zotlabs
103cd2b7a1 provide 'per-page' caching for is_matrix_url() results to reduce duplicate queries 2016-11-13 16:12:36 -08:00
zotlabs
7763643f2e zidify wiki content 2016-11-13 15:06:16 -08:00
zotlabs
61d2bed019 Merge pull request #583 from anaqreon/wiki
Move focus to Ace editor when switching to editor tab
2016-11-13 12:18:48 +11:00
Andrew Manning
52cbbed6a0 Merge remote-tracking branch 'upstream/dev' into wiki 2016-11-12 19:38:24 -05:00
Andrew Manning
4b624ab5da Bring Ace editor into focus when Edit tab is clicked to allow immediate text entry. 2016-11-12 19:34:42 -05:00
zotlabs
640d15dba5 don't send notification for posts/comments on old conversations that were refetched after having expired. We'll accomplish this by limiting notifications to items posted within the last month. 2016-11-12 14:09:33 -08:00
zotlabs
69509f2a2a Merge pull request #582 from anaqreon/wiki
Revised wiki controls
2016-11-13 07:28:40 +11:00
Andrew Manning
da5b9d5c74 Removed wiki list dropdown menus, moving the download and delete icons to beside the open wiki link. 2016-11-12 15:24:22 -05:00
Andrew Manning
af11525338 Moved save to bottom. Created Wiki Tools dropdown to be consistent, moved page tools in there as well as new page and new wiki 2016-11-12 14:42:21 -05:00
Andrew Manning
98b71bc63a Move save button to tab bar 2016-11-12 11:40:56 -05:00
Andrew Manning
271244bb36 Wiki control dropdown menu improvement 2016-11-12 08:06:18 -05:00
zotlabs
ebef7d6348 attach_rename: flaw in duplicate filename detection resulted in filename(1)(1)(1).ext 2016-11-10 20:27:18 -08:00
zotlabs
20497f1be3 Some minor tweaks to zotsh.py, document that it needs the twitter_api plugin on the first hop since we no longer provide the twitter api by default 2016-11-10 15:59:49 -08:00
zotlabs
74947d1c1c deprecate/remove get_channel_by_nick() which is just a less generalised variant of channelx_by_nick() 2016-11-08 18:15:57 -08:00
zotlabs
db3d230ad9 more api work 2016-11-08 17:47:56 -08:00
zotlabs
fabf278633 more api re-org 2016-11-08 16:55:29 -08:00
zotlabs
743cfa13fd a bit more background work to support private mail preview 2016-11-08 16:25:36 -08:00
zotlabs
127ed1b188 typo when consolidating icons 2016-11-08 15:33:15 -08:00
zotlabs
b80674bf2e move twitter api to addon; there's still a bit of cleanup remaining, mostly dealing with abstracting the authentication calls and separating out the twitter authentication structure from the zot api. 2016-11-08 14:54:55 -08:00
zotlabs
f74f7d543e use a single icon 2016-11-08 11:29:42 -08:00
zotlabs
72caf2ef9d let's use the bar-chart icon for voting to make the look consistent with the event attendance button and hint at its function 2016-11-07 19:10:35 -08:00
zotlabs
5ef05d3a63 distinguish the buttons for voting and attendance by adding a calendar icon to the button used for attendance 2016-11-07 19:00:22 -08:00
zotlabs
26aaa62048 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-07 18:30:47 -08:00
zotlabs
c427fe94da cleanup and re-organise the voting and attendance buttons 2016-11-07 18:29:38 -08:00
Mario Vavti
7cd7837e08 reverse logic 2016-11-07 23:24:07 +01:00
zotlabs
66f7437965 Merge pull request #580 from zzottel/dev
fix a fatal error with incorrect DB object access
2016-11-08 05:39:49 +11:00
zottel
cb32640f70 fix a fatal error with incorrect DB object access 2016-11-07 12:19:03 +01:00
zotlabs
66c07a8b33 reorganise emoticons 2016-11-06 20:31:37 -08:00
zotlabs
b326ab78b3 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-11-05 03:33:35 -07:00
zotlabs
8811ca9e9e provide /locs link on settings page if there is more than one hubloc for this channnel *that isn't deleted*. 2016-11-05 03:31:50 -07:00
Mario Vavti
471d88c1d2 some fixes for the recent changes in the personal menu dropdown 2016-11-04 21:29:23 +01:00
zotlabs
4a738024cc Merge pull request #579 from anaqreon/ui
Collapse navbar-collapse-1 if avatar menu is clicked.
2016-11-04 12:10:08 +11:00
Andrew Manning
8ac32cf4d6 Collapse navbar-collapse-1 if avatar menu is clicked. 2016-11-03 21:01:18 -04:00
zotlabs
b541351a0a ignore flags to dns_get_record() and look for anything 2016-11-02 23:37:57 -07:00
zotlabs
92f5a2b6a6 issue #409 - use item_notshown for file activities to prevent display but allow transmitting to other sites. We currently allow file acitivies with item_hidden to be transmitted as a special case but eventually we want to remove the special case and disallow items with item_hidden from being propagated. 2016-11-02 21:17:18 -07:00
zotlabs
ae092efb49 provide merged usermenu div for all server roles 2016-11-02 20:22:48 -07:00
zotlabs
94065fde33 issue #576 - duplicate events shown 2016-11-02 19:26:02 -07:00
zotlabs
aab7bc5282 silence a minor warning 2016-11-02 18:48:23 -07:00
zotlabs
9e2ccbd2a7 convert manual page updates to a display setting instead of a feature 2016-11-02 18:40:50 -07:00
zotlabs
6a6494d947 if connecting to a channel that is already pending, undo the pending and set connect permissions accordingly. issue #577 - this will mostly affect channels that were connected out of band, but will also auto-friend somebody that has already connected to you, if you reciprocate prior to seeing and/or acting on the pending connection notice. 2016-11-02 17:27:18 -07:00
zotlabs
cb9e944de1 remove debugging 2016-11-02 17:01:44 -07:00
zotlabs
1f92c594c8 issue #575, when 'nofinish' is set on an event, invalid date was generated/stored 2016-11-02 17:00:29 -07:00
zotlabs
f91031bd65 allow your own likes/comments to be updated when in static update mode 2016-11-02 15:48:29 -07:00
git-marijus
5d3e04216d Merge pull request #574 from zotlabs/static_update
feature: static page update as opposed to live update of conversation…
2016-11-02 16:12:05 +01:00
zotlabs
055d55b71b retry liveupdate up to 10 times if we receive incomplete/truncated html data. 2016-11-01 21:39:49 -07:00
zotlabs
ca948d66a9 feature: static page update as opposed to live update of conversations on the page. Changes will be queued until the page is reloaded. There may or may not be notifications of pending activity updates depending on your notification preferences. Endless scrolling (append) is still performed either way. This only affects changed and new/unseen items being inserted into the page. 2016-11-01 20:21:39 -07:00
zotlabs
fa8cb40af0 Merge pull request #573 from phellmes/dev
update DE translation strings
2016-11-02 12:15:17 +11:00
zotlabs
b13fb1cca9 command line connect utility.
Usage: util/connect uid|nick channel

uid|nick must be a local channel. The target channel can be any channel. If a nick is supplied as a target it is assumed to refer to a channel on the localhost unless @host is provided. RSS feeds and remote networks can also be connected, assuming the appropriate protocols are already enabled for the local channel. If the target channel is a non-forum on the local system and you wish bi-directional communication to be enabled you will probably need to use a second connnect command with the source and target reversed.

Examples:

	util/connect bob marketing

	Connects bob to the marketing channel

	util/connect marketing bob

	Connects the marketing channel to bob.

	util/connect 6 channelone@macgirvin.com

	Connects the channel with channel_id 6 to the Channel One public forum.

	util/connect bob https://mysite.foo/feed.rss

	Connects bob to an RSS feed if RSS feeds are allowed as connections on this site

	util/connect bob jb@diasp.org

	Connects bob to a diaspora account on diap.org (both the site and Bob's channel must previously have the Diaspora Protocol enabled).
2016-11-01 15:27:34 -07:00
phellmes
01b8ed97ed update DE translation strings 2016-11-01 16:38:16 +01:00
zotlabs
863ee9e6dd bbcode event formatting issue 2016-10-31 21:48:00 -07:00
zotlabs
4ebd604ca9 provide plugin restrictions based on config settings 2016-10-31 18:54:04 -07:00
zotlabs
581ef6e18d string update 2016-10-30 12:34:00 -07:00
zotlabs
321a32050b improve the check in 9b42bc860 2016-10-30 12:33:30 -07:00
Mario Vavti
db6a207afe Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-10-30 15:54:46 +01:00
Mario Vavti
9b42bc860d possible fix for https://zothub.de/display/2d4996dd629504851d 2016-10-30 15:54:06 +01:00
Mario Vavti
6174aa01e0 add embed bbcode to the autocomplete list 2016-10-30 13:43:47 +01:00
Mario Vavti
fb7692cf9c fix https://zothub.de/display/9d9078d212862c5f58 2016-10-30 13:36:34 +01:00
Mario Vavti
9279840860 fix https://zothub.de/display/9d9078d212862c5f58 2016-10-30 13:34:47 +01:00
zotlabs
9c05f37c0f update setup and install documents for PDO and the freebsd issue with
dns_get_record()
2016-10-27 19:02:27 -07:00
zotlabs
b5c72611b4 change log string on pdo log messages 2016-10-27 15:21:40 -07:00
zotlabs
2b3b5d2c8a Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-26 21:52:53 -07:00
zotlabs
d46fe20986 modernise chanview, which has a renewed purpose - to provide a connect link to foreign network members. The iframe no longer works due to content security policies, and people hated this with a passion anyway; so just provide a URL to visit. 2016-10-26 21:50:30 -07:00
zotlabs
9e46409517 Merge pull request #570 from fsteinel/issue-NEW
sql: limit 1 for UPDATE and DELETE is not supported …
2016-10-27 12:38:46 +11:00
zotlabs
d42da529ec zot_finger from navbar people search looping 2016-10-26 18:35:10 -07:00
Florian Steinel
c1c96e01fa sql: limit 1 for UPDATE and DELETE is not supported by the SQL standard and postgresql
(see: https://www.postgresql.org/message-id/flat/1291109101.26137.35.camel%40pcd12478 )
2016-10-27 02:41:32 +02:00
zotlabs
aee2742951 when inserting a link, if the url begins with '!' ignore oembed and do everytthing old school. 2016-10-26 16:44:54 -07:00
zotlabs
c3af36d33b the logic is much too complicated for the notifier. Let plugins know if they are going upstream or downstream with a simple binary variable. 2016-10-26 02:46:14 -07:00
zotlabs
3885aa1e8c allow .htpreconfig.php to be loaded if you can't install without special settings or require PHP logging
at that time; it is ignored during normal use.
2016-10-26 00:17:23 -07:00
zotlabs
33b1c57092 For z_dns_check() use config values from memory and ignore DB - as this function can be called in the early stages of Setup when we first try to connect to the database. 2016-10-25 23:32:24 -07:00
zotlabs
441d3bf1ed make the edited header stand out slightly 2016-10-25 20:46:57 -07:00
zotlabs
bd83936e5d send "hidden" edit activities to networks which don't support edits themselves 2016-10-25 20:43:24 -07:00
zotlabs
88a68b941f put all dns checking into one function, allow it to be ignored 2016-10-25 18:27:32 -07:00
zotlabs
084b41fc2c first cut at edit activities 2016-10-25 16:21:56 -07:00
zotlabs
7b713e2576 pdo - fetch assoc only 2016-10-25 16:15:39 -07:00
zotlabs
25982f0475 set port if non-zero (instead of non-null) 2016-10-24 18:55:11 -07:00
zotlabs
2d2ac98b3d Merge pull request #559 from zotlabs/pdo
Pdo DB driver
2016-10-25 11:48:22 +11:00
zotlabs
f1fc201862 not null violation in mail 2016-10-24 17:14:06 -07:00
zotlabs
681f45943b some more places which require dbescbin and dbunescbin 2016-10-24 00:36:38 -07:00
zotlabs
5dc8c54b8d found it... 2016-10-23 21:35:06 -07:00
zotlabs
20194bed42 this seems to work, but there are unanswered questions and is still undergoing investigation. It appears that the data stored with os_content = 1 is not being escaped in all circumstances or the scaled image data is being escaped twice. 2016-10-23 21:27:10 -07:00
zotlabs
06bbf494bb profile photo issue on postgres 2016-10-23 20:01:39 -07:00
zotlabs
21b919a76b correct encoding 2016-10-23 19:04:42 -07:00
zotlabs
39f0707201 fetch bytea as stream 2016-10-23 17:53:34 -07:00
zotlabs
8d52a278a9 Merge branch 'dev' into pdo 2016-10-23 17:49:15 -07:00
zotlabs
5fbba27d17 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-23 17:48:33 -07:00
zotlabs
5c891bcfb5 need to perform dbunescbin on stored filenames as well as binary data - this is a no-op under mysql but could provide unpredictable data under postgres 2016-10-23 17:46:29 -07:00
zotlabs
547c700764 misplaced parens 2016-10-23 17:23:53 -07:00
zotlabs
d30892ea60 pdo hacks 2016-10-23 17:05:08 -07:00
zotlabs
0b5d550780 Merge pull request #565 from anaqreon/wiki-download
Add wiki download button to export the selected wiki repo to a zip file
2016-10-23 07:28:38 +11:00
zotlabs
ac5ad0b9ce Merge pull request #562 from fsteinel/issue-561
add column display_path to inserts into attachment, as this column is…
2016-10-23 07:27:48 +11:00
zotlabs
823c0ebb47 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-22 13:22:01 -07:00
zotlabs
8fc87411fa php warning, $uplink didn't have a default 2016-10-22 13:20:51 -07:00
Mario Vavti
5fb173149a provide lockstate for events and remove obsolete code 2016-10-22 20:44:41 +02:00
Andrew Manning
02cf7274d2 Add wiki download button to export the selected wiki repo to a zip file 2016-10-22 08:52:26 -04:00
Florian Steinel
43de0e7f16 until we've settled on what they should be, set os_path and display_path to an emtpy string 2016-10-22 08:17:26 +02:00
Florian Steinel
f84530c285 attach_mkdir use $os_path and $display_path initilized to an empty string 2016-10-22 08:07:27 +02:00
zotlabs
6bf92979a2 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-21 21:44:37 -07:00
zotlabs
c5dcac4dbb issue #564 2016-10-21 21:44:15 -07:00
zotlabs
bb1b6c906d Merge pull request #563 from ilu33/dev
Postgres complaining again ...
2016-10-22 15:07:08 +11:00
zotlabs
aa9fef7778 squash timezone adjusted birthdays into a single day in the calendar, by lying and telling the js calendar that the end date/time is unknown 2016-10-21 20:56:01 -07:00
ilu33
351f21c89f Postgres complaining again ...
```sql
UPDATE abook SET abook_profile = (SELECT profile_guid AS FROM profile WHERE is_default = 1 AND uid = 13 LIMIT 1) WHERE abook_profile = '' AND abook_channel = 13 ; returned false
ERROR:  syntax error at or near "profile"
LINE 1: ... SET abook_profile = (SELECT profile_guid AS FROM profile WH...
                                                             ^
```
2016-10-22 05:52:29 +02:00
Florian Steinel
ca97130a29 add column display_path to inserts into attachment, as this column is a not null column
Conflicts:
	Zotlabs/Storage/Directory.php
	include/attach.php

amend 54def92bcf75c08cd8dec3921e5ef26f23d85ffc display_path
2016-10-22 05:07:06 +02:00
zotlabs
9fea44cbc3 better fix for navbar channel autocomplete, refrain from search until a minimum of 3 chars entered. 2 typically gives way too many results and usually low quality results. 2016-10-21 18:15:44 -07:00
zotlabs
5e761a1068 full revert, that wasn't working at all. Not sure why. 2016-10-21 14:27:29 -07:00
zotlabs
afff751ff1 partial revert 2016-10-21 14:23:49 -07:00
zotlabs
222186d5f7 fine tune the navbar people autocomplete, as the check for minimum length wasn't taking into consideration the initial tag character, and one char search provides way too many results. The autocomplete cache doesn't search again but just searches through its cache. This means as you type more chars, if the answer wasn't included in the very first search (one char), it won't be returned. This may need further tweaking as the network grows. 2016-10-21 14:15:29 -07:00
zotlabs
632ad7d7f9 string update 2016-10-21 13:50:00 -07:00
zotlabs
331412ddff remove more corporate code - https url conversion for youtube is now handled by std_embeds plugin 2016-10-20 17:53:15 -07:00
zotlabs
04ac04e0ad allow a dsn override to the database via the server argument. This could be used to allow unix domain sockets and other unusual configurations. 2016-10-20 17:04:43 -07:00
zotlabs
29340152b6 pdo - cleanup 2016-10-20 16:21:15 -07:00
zotlabs
8a34f7ca7b Merge branch 'dev' into pdo 2016-10-20 16:14:01 -07:00
zotlabs
e2e3b81f32 more pdo tweaks 2016-10-20 16:13:06 -07:00
zotlabs
b4b5eb5bab pdo testing 2016-10-20 15:45:48 -07:00
zotlabs
edde785219 Merge pull request #558 from dawnbreak/dev
[BUGFIX] for fromStandalonePermission().
2016-10-21 06:15:03 +11:00
Klaus Weidenbach
b71e148cea [BUGFIX] for fromStandalonePermission().
Not sure if this method is used anywhere, but it should not have worked
correctly. This should correct it.
Add a unit test for this class.
2016-10-20 20:22:39 +02:00
zotlabs
0d939b5ab0 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-20 00:33:23 -07:00
zotlabs
b983cf8b5f Merge pull request #556 from dawnbreak/QA_testing
[TASK] Fix travis' phpunit execution.
2016-10-20 18:33:03 +11:00
zotlabs
81f3a5cf94 discover tab showing on network page using fresh site with no settings (it is disabled by default, but the admin setting has not yet been committed to disk). 2016-10-19 21:50:26 -07:00
zotlabs
3726b546d5 use pdo for postgres also 2016-10-19 19:24:12 -07:00
zotlabs
2702b82bc3 pdo fixes 2016-10-19 17:23:06 -07:00
zotlabs
aee4f8d2fe pdo changes first cut 2016-10-19 16:58:26 -07:00
zotlabs
c79c1b3913 Merge branch 'dev' into pdo 2016-10-19 16:31:35 -07:00
Klaus Weidenbach
3da72c1ff1 [TASK] Fix travis' phpunit execution.
Removed php5.4 and php5.5 from test matrix, as they are not compatible
with new phpunit releases and have reached EOL anyway.
2016-10-19 21:22:28 +02:00
zotlabs
b926a4c67e when translating like activities, we're distinguishing comments from posts by mid and parent_mid; neither if which are present in the stored activity object 2016-10-18 21:42:54 -07:00
zotlabs
29320f8aad remove requirement that imported profile photos be in the profile photos album 2016-10-18 18:37:58 -07:00
zotlabs
2a59f45a3b Change the behaviour of 'use existing photo for profile'. For a channel with one profile, works just as it did previously. For multiple profiles, go back to the "upload form" but with a pre-existing file selected so that the correct profile can be selected. The text on this page and the resulting form are changed to remove the 'upload' text and file selection; but falls through to cropping in either case. 2016-10-18 18:30:50 -07:00
zotlabs
2db7b2d948 change event behaviour - share by default. 2016-10-18 16:46:09 -07:00
zotlabs
d55fcd055d Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-18 16:29:36 -07:00
zotlabs
9e3032e919 more fixes to addons doc, include project addons in string extraction for translations, fix the string extractor which was looking in the old places for version info 2016-10-18 16:26:54 -07:00
zotlabs
c2e2994403 Merge pull request #555 from dawnbreak/QA_testing
[TASK] Restructure tests/ folder.
2016-10-19 09:53:59 +11:00
Klaus Weidenbach
b92e3ca3ee [TASK] Restructure tests/ folder.
Move unit tests to tests/unit/. Get the old still working UnitTests
into a working state again.
Updated composer.json with required-dev packages.
Create a new folder tests/acceptance for Behat functional/acceptance
testing. Add a first Feature draft of a Behat functional test for
local login.
2016-10-19 00:46:41 +02:00
zotlabs
2abea94f8e bring the addons list up to date 2016-10-18 15:22:38 -07:00
zotlabs
fcc648ecfd script to update the autoloader static files 2016-10-18 14:58:20 -07:00
zotlabs
2e1046220a Merge pull request #554 from dawnbreak/composer-light
[FEATURE] Add config and use composer autoloader.
2016-10-19 06:37:39 +11:00
Mario Vavti
a532bd9cf1 bugfix release 1.14.2 2016-10-18 21:02:10 +02:00
zotlabs
f2d1f1efd6 issue #553 - negative birthday from directory. This may not completely fix it and may take a profile update to register the change; but it's a start; specifically we need to store 0000-00-00 in the xprof table of the directory server if that's what we get over the wire. Birthday fields are string and are not subject to SQL strict_mode on dates. We want these to be the string '0000-00-00' if not set to a valid date. 2016-10-18 20:55:24 +02:00
Klaus Weidenbach
745515b11f [FEATURE] Add config and use composer autoloader.
We use composer already to install SabreDAV. Include config
composer.(json|lock) to install and manage more dependencies
in future.
Also provide PSR-4 autoloading for our namespaced classes, e.g.
"Zotlabs\". To regenerate autoloader maps use:
$ composer install --optimize-autoloader --no-dev

We could also remove the whole vendor/ folder from our repository, but
that would need changes in deployment and how to install hubs and needs
more discussion first.
2016-10-18 18:11:41 +02:00
zotlabs
a7fd4e96f1 issue #549, ACL has 'public' selected even when restrictive ACL is being used. 2016-10-17 23:39:53 -07:00
zotlabs
17091bd38c add get_photo hook to go along with get_profile_photo hook. This allows a plugin to over-ride the permissions for cover photos or insert a different photo in place of that requested 2016-10-17 22:09:41 -07:00
zotlabs
437aa168d1 array_key_exists warning on PConfig::Delete() 2016-10-17 21:03:34 -07:00
zotlabs
f31ef3420d issue #549, ACL has 'public' selected even when restrictive ACL is being used. 2016-10-17 20:52:02 -07:00
zotlabs
b37184ae57 issue #553 - negative birthday from directory. This may not completely fix it and may take a profile update to register the change; but it's a start; specifically we need to store 0000-00-00 in the xprof table of the directory server if that's what we get over the wire. Birthday fields are string and are not subject to SQL strict_mode on dates. We want these to be the string '0000-00-00' if not set to a valid date. 2016-10-17 18:42:06 -07:00
zotlabs
716a83d1f7 some pdo work 2016-10-17 16:12:32 -07:00
zotlabs
6c7972470b if we have to go through this contortion every time we change a DB column from unsigned to signed... 2016-10-17 16:10:32 -07:00
zotlabs
40ce6724a9 "alter table alter" has completely different rules between postgres and mysql 2016-10-17 15:13:58 -07:00
zotlabs
e46e3027fa rename diaspora2bb() to markdown_to_bb() to reflect that is has a more generic use 2016-10-16 16:48:33 -07:00
zotlabs
5ea46444e9 issue #550 2016-10-16 00:29:51 -07:00
zotlabs
47bfb681c0 add new hook doc 2016-10-14 14:27:21 -07:00
zotlabs
3f7f5f9429 remove corporate codes from diaspora2bb, add plugin hook markdown_to_bb 2016-10-14 14:22:01 -07:00
zotlabs
a9cae7c9bd roll std_version 2016-10-14 14:05:11 -07:00
zotlabs
ebd92d736a permissions issue 2016-10-14 13:20:48 -07:00
zotlabs
96b7bfb32c remove logging 2016-10-14 13:19:42 -07:00
zotlabs
5d9cf6a6d7 remove logging 2016-10-14 13:17:53 -07:00
zotlabs
47db3452f4 permissions issue 2016-10-14 13:16:33 -07:00
zotlabs
40e03a05be Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-13 21:06:26 -07:00
zotlabs
bd70e6ae6d try to filter any path information from leaking through to zot_finger; and log the url wherever called to track down where it might be called with a malformed webbie or complete path instead of hostname. 2016-10-13 21:01:54 -07:00
zotlabs
b9eb74a705 Merge pull request #547 from dawnbreak/docu
[TASK] Update Doxyfile and fix Doxygen errors.
2016-10-14 12:55:01 +11:00
zotlabs
daaefed61b provide text log results of email success/failure rather than 1 and 0. 2016-10-13 16:47:45 -07:00
Klaus Weidenbach
7b41839ea8 [TASK] Update Doxyfile and fix Doxygen errors.
Updated Doxyfile to include new folders.
Add a list for @hooks tags.
Fixed some parsing problems for Doxygen.
2016-10-13 11:27:23 +02:00
zotlabs
6532972e61 additional array checking 2016-10-13 00:30:41 -07:00
zotlabs
48026efddf consolidate duplicated code for creating table entries from an array 2016-10-12 22:12:58 -07:00
zotlabs
e314510005 minor 2016-10-12 20:41:59 -07:00
zotlabs
facc6ee6b3 allow hooks to have negative priority 2016-10-12 20:04:19 -07:00
zotlabs
9a2f86e9ad remove special handling of lookalike '@ char from attach path 2016-10-12 18:23:59 -07:00
zotlabs
513b8959f5 Merge pull request #545 from dawnbreak/atfix
Comment and code about UTF-8 @-sign do not match.
2016-10-13 12:21:27 +11:00
zotlabs
8a00b62cba caught one typo from the last checkin 2016-10-12 18:17:34 -07:00
zotlabs
9bb847bb07 remove the rest of the backticks from sql queries; replace with TQUOT const which is driver dependent 2016-10-12 18:15:12 -07:00
zotlabs
40bfce463d add the twitter API 1.1 code points 2016-10-12 17:00:50 -07:00
zotlabs
fc7d29edd3 some more api work 2016-10-12 15:31:14 -07:00
zotlabs
4f7d14dfb2 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-12 15:30:43 -07:00
zotlabs
cfc61a69ef bbcode: remove the inserted <br /> between list elements due to linefeeds in the textarea. 2016-10-12 15:25:48 -07:00
Mario Vavti
ce0f98989c Release version 1.14 2016-10-12 12:23:34 +02:00
Mario Vavti
cf547be1d6 Merge branch '1.14RC' 2016-10-12 12:13:44 +02:00
Mario Vavti
745ac240d7 update changelog 2016-10-12 11:27:23 +02:00
Mario Vavti
16da1a4e81 update changelog 2016-10-12 11:23:27 +02:00
Mario Vavti
73d67bb16a fix connected time not shown on ajax loaded connections 2016-10-12 11:00:33 +02:00
Mario Vavti
050c0752f9 fix connected time not shown on ajax loaded connections 2016-10-12 10:59:19 +02:00
zotlabs
ae62d30811 more api work, mostly bringing the file up to speed with the project coding style guidelines 2016-10-11 21:43:37 -07:00
zotlabs
f59a0192b4 more api work 2016-10-11 21:09:26 -07:00
zotlabs
f56b4773cb When importing a channel from another server, try to auto-discover the best available api path. 2016-10-11 20:53:13 -07:00
zotlabs
1a4a8f1ef7 more api cleanup 2016-10-11 18:37:47 -07:00
zotlabs
03aacc35b3 start on the API re-write 2016-10-11 16:13:52 -07:00
Klaus Weidenbach
d5cd6f9a51 Comment and code about UTF-8 @-sign do not match.
Changed code according to comment:
First AT is now full-width AT U+FF20.
Do we also need to replace small AT U+FE6B?
2016-10-11 11:48:16 +02:00
Mario Vavti
205bc96827 make diaspora w2w appear as a quote to make a little bit more clear what is happening 2016-10-11 10:30:49 +02:00
zotlabs
2bd61aed7a spaghetti 2016-10-11 10:19:32 +02:00
Mario Vavti
6706bed676 make diaspora w2w appear as a quote to make a little bit more clear what is happening 2016-10-11 10:17:38 +02:00
zotlabs
81e704648f api issues 2016-10-10 23:25:01 -07:00
zotlabs
c4debca11d api issues 2016-10-10 23:24:30 -07:00
zotlabs
e75b0cb743 Merge branch '1.14RC' of https://github.com/redmatrix/hubzilla into 1.14RC_merge 2016-10-10 22:47:19 -07:00
zotlabs
29617737ca Merge branch 'master' of https://github.com/redmatrix/hubzilla into master_merge 2016-10-10 22:46:43 -07:00
zotlabs
26cc73118a don't expire posts before 2001 2016-10-10 22:46:24 -07:00
zotlabs
47e91e0660 don't expire posts before 2001 2016-10-10 22:45:01 -07:00
zotlabs
c6eecb06d5 don't expire posts before 2001 2016-10-10 22:44:11 -07:00
zotlabs
896b46d18e spaghetti 2016-10-10 15:04:57 -07:00
Mario Vavti
18ef8ea271 changelog and version 1.14RC1 2016-10-10 20:16:15 +02:00
Mario Vavti
ad26eec9f2 bump micro version 2016-10-10 14:41:06 +02:00
Mario Vavti
3b422406a9 hotfix for readmore.js 2016-10-10 14:38:45 +02:00
Mario Vavti
78c63c480a another fix to readmore.js and update patch file 2016-10-10 14:28:52 +02:00
Mario Vavti
79a068e92b another fix to readmore.js and update patch file 2016-10-10 14:27:49 +02:00
Mario Vavti
717a532c09 fix readmorejs collapsing on scrolldirection change in mobile browsers 2016-10-10 13:43:29 +02:00
Mario Vavti
b2cc2e6765 fix readmorejs collapsing on scrolldirection change in mobile browsers 2016-10-10 13:30:05 +02:00
zotlabs
af13e5fa4a since the snap module runs without permissions controls, verify the logged in channel matches the requested cloud path 2016-10-09 21:36:55 -07:00
zotlabs
8eac8132e3 snap dav module is currently read-only. error out on any request methods which can alter data. 2016-10-09 21:28:24 -07:00
zotlabs
50f579d301 Provide better explanation of server_roles in the config template 2016-10-09 21:01:41 -07:00
zotlabs
02c72e59fa provide a DAV module which accesses the raw data storage for a channel. Together with an export data function in the API this allows a client process to create true backups of the cloud storage and importable cloud mirrors with all the metadata intact. The import function will need to be modified slightly to obtain the file contents from a plugin or API call; since it currently tries to fetch it from the source hub. 2016-10-09 20:49:40 -07:00
zotlabs
e7233c0c94 more backquotes - this should take care of most except for the array import queries 2016-10-09 16:31:04 -07:00
zotlabs
2bdf135cbc remove more backquotes 2016-10-09 16:13:49 -07:00
zotlabs
134b9fc466 don't show diaspora protocol info in the hcard if the diaspora protocol is not installed. This really needs to be moved to the plugin but this was a quick fix. 2016-10-08 15:30:06 -07:00
zotlabs
10863a5949 add oauth2/oidc lib 2016-10-07 14:11:24 -07:00
redmatrix
bf02e04283 merge usermenu and caret when using pro 2016-10-06 17:41:52 -07:00
redmatrix
49fd53ee67 try naked embed before submission instead of at render time 2016-10-06 16:00:41 -07:00
redmatrix
48f70e55aa try naked embed before submission instead of at render time 2016-10-06 15:59:27 -07:00
redmatrix
3250d75320 new hook bbcode_filter 2016-10-05 17:37:18 -07:00
redmatrix
1ad4d26f31 Merge branch '1.14RC' of https://github.com/redmatrix/hubzilla into 1.14RC_merge 2016-10-05 17:28:12 -07:00
redmatrix
87ee48bd84 update hook documentation 2016-10-05 17:27:02 -07:00
redmatrix
24f9bb41df Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-05 17:26:19 -07:00
redmatrix
2a02b6de44 update hook documentation 2016-10-05 17:25:49 -07:00
redmatrix
21a0498a30 new hook bbcode_filter 2016-10-05 17:21:32 -07:00
jeroenpraat
411d7aa6c4 Updating strings for it, nl and es.. 2016-10-05 22:29:57 +02:00
jeroenpraat
d0e9b4ce9f Updating strings for it, nl and es. 2016-10-05 22:18:50 +02:00
Mario Vavti
50c5f8c389 bugfixrelease fullcalendar-3.0.1 2016-10-05 20:41:18 +02:00
Mario Vavti
619c79df27 bugfixrelease fullcalendar-3.0.1 2016-10-05 20:39:50 +02:00
redmatrix
246b2c0d1b remove leftover rating fragment 2016-10-04 19:47:46 -07:00
redmatrix
55c67c7870 remove obscured @ hack 2016-10-04 19:37:16 -07:00
redmatrix
26ea11c44f Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-10-04 15:33:39 -07:00
redmatrix
de1825e54b remove leftover rating fragment 2016-10-04 15:33:14 -07:00
Mario Vavti
e259503933 feature_enabled() only takes two arguments 2016-10-04 21:12:03 +02:00
Mario Vavti
c089d30915 feature_enabled() only takes two arguments 2016-10-04 21:11:11 +02:00
redmatrix
4e07b4c0e8 even more backslashes 2016-10-03 22:01:14 -07:00
redmatrix
ce6e81c682 more backticks 2016-10-03 21:48:53 -07:00
redmatrix
c44acb3575 allow delivery report for not just the author, but also if you're the owner and it's on your wall. 2016-10-03 20:50:13 -07:00
redmatrix
bad5057a74 start removing db backticks 2016-10-03 19:47:36 -07:00
redmatrix
4b91d4b5c3 wrong resource (attach_change_permissions()) 2016-10-03 17:24:21 -07:00
redmatrix
fe7b7773ba wrong resource (attach_change_permissions()) 2016-10-03 17:23:43 -07:00
redmatrix
cef1aa6d1b add some more stuff to admin/account_edit (service class, language, and techlevel if appropriate). Fix en-au and en-gb so they are listed as languages, and move language selector stuff to include/language.php instead of include/text.php; new file Zotlabs/Lib/Techlevels.php so we only need to write the selection array once. 2016-10-03 17:16:24 -07:00
redmatrix
2aa8979522 Merge branch '1.14RC' of https://github.com/redmatrix/hubzilla into 1.14RC_merge 2016-10-03 16:01:52 -07:00
redmatrix
e93fdefd72 return the email_sent status 2016-10-03 16:01:43 -07:00
redmatrix
5b10db6f91 return the email_sent status 2016-10-03 15:58:54 -07:00
Mario Vavti
5dc9de41eb update changelog 2016-10-03 12:04:07 +02:00
Mario Vavti
76c2de38ff update changelog 2016-10-03 12:00:46 +02:00
Mario Vavti
5cd4e340eb another missing backslash 2016-10-02 10:48:02 +02:00
Mario Vavti
816802774d another missing backslash 2016-10-02 10:47:25 +02:00
Mario Vavti
541e40f29c missing backslash 2016-10-02 10:36:56 +02:00
Mario Vavti
b7559c1df6 missing backslash 2016-10-02 10:36:04 +02:00
redmatrix
1af56b1025 sync cloud storage permission changes (issue #538 continued) 2016-10-02 10:05:42 +02:00
Mario Vavti
27d5b9cfd0 update changelog 2016-10-02 10:05:23 +02:00
Mario Vavti
bbf3d960b2 update changelog 2016-10-02 10:04:08 +02:00
redmatrix
e1df151d9b sync cloud storage permission changes (issue #538 continued) 2016-10-01 16:01:22 -07:00
redmatrix
a2ccfc1e50 update version 2016-10-01 15:48:18 -07:00
redmatrix
771d87781e roll version 2016-10-01 15:47:03 -07:00
redmatrix
883828c6cc change hook name and return results 2016-10-01 15:15:14 -07:00
redmatrix
fa94644bcf Unify the various mail sending instance to enotify::send() and z_mail(). Both take the same arguments. z_mail() is text only, enotify::send() provides html and text. Both are pluggable using the enotfy_send hook. 2016-10-01 03:06:01 -07:00
redmatrix
ad309f1036 provide ability for admin to change account password 2016-09-30 15:42:14 -07:00
redmatrix
56b12f6555 issue #538 continued 2016-09-30 13:00:15 -07:00
redmatrix
e48323775d add another hook 2016-09-29 22:28:23 -07:00
redmatrix
0f10fc8458 issue #127 2016-09-29 19:33:08 -07:00
redmatrix
2c1cd99738 issue #170 2016-09-29 19:26:58 -07:00
redmatrix
07df5833be more tag filtering in setup 2016-09-29 19:17:09 -07:00
redmatrix
2728cdaf23 change notify param 2016-09-29 17:54:11 -07:00
redmatrix
4117ada2fd Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-29 16:20:47 -07:00
redmatrix
3727bea29a issue #538 continued 2016-09-29 16:20:26 -07:00
zotlabs
c410ffd10b Merge pull request #540 from dawnbreak/zotdav
[TASK] Replace deprecated Sabre functions.
2016-09-30 09:02:00 +10:00
Klaus Weidenbach
bb5b19c2fb [TASK] Replace deprecated Sabre functions.
Replaced some deprecated functions from Sabre's URLUtil class.
2016-09-29 20:28:47 +02:00
Mario Vavti
b0dbb6708e std_version bump due to js and css changes 2016-09-29 12:06:40 +02:00
Mario Vavti
5d2cf3d23c omit autoscrolling to toplevel items 2016-09-29 11:55:41 +02:00
Mario Vavti
3c9809bfe6 highlight the displayed mid and css fixes 2016-09-29 11:28:27 +02:00
Mario Vavti
c530b4fb97 fixes for make scroll to mid work properly with collapsed threads: unhide the hidden items before scrolling to it, slideDown() is to slow - we must use show() here) 2016-09-29 11:07:53 +02:00
redmatrix
fcd7dc8744 some additions to changelog 2016-09-29 00:42:28 -07:00
redmatrix
f9f1b16e76 first cut at experimental techlevels feature spec. This spec is very likely to change. 2016-09-28 22:05:01 -07:00
redmatrix
fe3e4bd0ec dusting the old grammars 2016-09-28 20:57:13 -07:00
redmatrix
5b6c2c32bf Bring the saved search feature in line with the spec, and publish the feature spec. 2016-09-28 20:55:15 -07:00
redmatrix
245c2d4eed issue #519 continued 2016-09-28 18:37:05 -07:00
redmatrix
095e2bf0b3 file clone sync issue, 1. channel permission import had no uid, 2. mod_getfile was sending attach['data'] instead of attach['content'] 2016-09-28 16:51:47 -07:00
Mario Vavti
ffee413d2d fix dbescdate() 2016-09-28 12:43:02 +02:00
redmatrix
80b655fa7e Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-28 02:44:42 -07:00
redmatrix
db95e6eba5 issue #537 - angle bracket characters in DB password not recognised 2016-09-28 02:43:50 -07:00
redmatrix
dab3495751 check datatype to be sure 2016-09-28 02:16:05 -07:00
Mario Vavti
f0e8c9ead9 fix wrong array key for profile photo resloution 2016-09-28 11:13:30 +02:00
Mario Vavti
d92e9f38f8 fix with update with /channel?f=&mid=hash issue #461 2016-09-28 11:04:02 +02:00
redmatrix
71632ac2d2 issue #536, path to nginx and lighttpd config scripts was wrong 2016-09-27 22:04:52 -07:00
redmatrix
68d9d1cec2 updated changelog 2016-09-27 20:37:12 -07:00
redmatrix
eff2e6c795 make the fetching of the default profile photo hookable, and document the hook 2016-09-27 18:11:04 -07:00
redmatrix
3bf0a27e45 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-27 17:39:05 -07:00
Mario Vavti
68cb4baeb3 do not scroll items behind the navbar 2016-09-27 14:11:55 +02:00
Mario Vavti
c28ba24525 remove logging 2016-09-27 14:00:49 +02:00
Mario Vavti
fc18bea4bd catch js error if the notification mid is for e.g. a like and class .item_123def... does not exist 2016-09-27 14:00:04 +02:00
Mario Vavti
01842a563d more changelog 2016-09-27 10:17:17 +02:00
redmatrix
44a2cc872c apply the same fix to our own DB as we did for hubzilla master and redmatrix. 2016-09-26 19:28:04 -07:00
redmatrix
ac6c43b5fb translate null_date on all db fields 2016-09-26 18:59:01 -07:00
redmatrix
4663278f52 Merge branch 'nulldate' into dev 2016-09-26 18:17:38 -07:00
redmatrix
cacdac16aa next wave of nulldate fixes 2016-09-26 18:16:43 -07:00
redmatrix
5716556766 allow a site to over-ride the help table-of-contents files 2016-09-26 16:34:53 -07:00
redmatrix
cccffc77cd Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-26 16:20:52 -07:00
redmatrix
eae9774cb6 missing categories in preview mode 2016-09-26 16:20:36 -07:00
Mario Vavti
8bf03d21cd catch js error if there are no collapsed comments 2016-09-26 11:26:13 +02:00
Mario Vavti
62229d0a49 use color #337AB7 instead aof bold and 120% for ivoted class 2016-09-26 10:48:42 +02:00
redmatrix
6586b97a54 remove the now useless url fragments from notification links 2016-09-25 23:12:45 -07:00
redmatrix
7e59c70a9f autoscroll to target post/comment when in single-thread mode; don't interfere with other modes; replaces using a named anchor with a url fragment to reach a particular place in the conversation when content is loaded with ajax. 2016-09-25 23:09:08 -07:00
redmatrix
bba7fe24e9 subtle indicator of your own response verb activity 2016-09-25 20:34:36 -07:00
redmatrix
fb9544badd null_date conversion; phase 1 2016-09-25 17:06:13 -07:00
redmatrix
bfc2552841 more infrastructure for notification auto-scroll to comment 2016-09-24 20:10:20 -07:00
redmatrix
39dc4fc992 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-24 16:40:36 -07:00
redmatrix
14e2a5cc39 also allow notification scroll on conversation page notifications (network and home), though we may also need some js to open comments for the thread holding the fragment (as well as the scrollto js). 2016-09-24 16:25:04 -07:00
redmatrix
c04c57ea0f the rest of the backend for supporting scroll-to-comment from notifications. We still need an ajax handler as fragments are evaluated before content is loaded. 2016-09-24 16:20:25 -07:00
Mario Vavti
8333d41dbd fix issue #528 2016-09-24 19:02:37 +02:00
redmatrix
dca4db9d4d convert oembed tools to use json arrays rather than json objects 2016-09-24 05:15:06 -07:00
redmatrix
4650458157 add server_roles document to aid people in making informed choices 2016-09-24 02:30:12 -07:00
redmatrix
ce41710a7c issue #531 - util/config and postgres 2016-09-23 18:52:14 -07:00
redmatrix
97d472380f attach sql issue 2016-09-23 01:16:59 -07:00
redmatrix
9ab6029280 issue #527 2016-09-22 17:15:12 -07:00
redmatrix
7b90b0dfd9 issue #526 2016-09-22 17:08:16 -07:00
redmatrix
24ddc8e026 issue #523 2016-09-22 17:00:32 -07:00
redmatrix
9981cbb72c issue #519 continued 2016-09-22 16:58:29 -07:00
redmatrix
be6c4019f6 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-22 16:52:37 -07:00
redmatrix
8b8712c15b issue #524 2016-09-22 16:52:25 -07:00
git-marijus
4ffa408420 Merge pull request #529 from phellmes/dev
Update DE translation strings
2016-09-22 18:56:27 +02:00
Wave
c7ffe606a6 Merge pull request #530 from wave72/dev
Updated Italian strings
2016-09-22 17:24:42 +02:00
Wave72
26138ac46d Updated Italian strings 2016-09-22 17:22:03 +02:00
phellmes
ed457ac694 Update DE translation strings 2016-09-22 13:45:49 +02:00
Mario Vavti
56aa568124 objects with id=share_container seem to be blacklisted in various security browser plugins. rename it to distr_container. also remove some superfluous js 2016-09-22 11:07:21 +02:00
Mario Vavti
73c781a0cf add bootstrap .css.map files 2016-09-22 09:52:11 +02:00
Mario Vavti
3edbb564fc fix #525 2016-09-22 09:43:11 +02:00
redmatrix
4e85bc66b8 function to check for different values of NULL_DATE for backward compatibility 2016-09-21 17:16:54 -07:00
redmatrix
d1c9701ccf issue #522 - replace && with AND in sql query. 2016-09-21 16:01:17 -07:00
redmatrix
ec5cc08fab issue #521, add 'map' extension to files served natively by nginx without using the project controller 2016-09-21 15:47:18 -07:00
redmatrix
b5d093e5ca finish the channel_reddress() conversion 2016-09-21 15:28:37 -07:00
redmatrix
10a52977f8 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-21 13:26:02 -07:00
redmatrix
c43eccf591 zot discovery wasn't returning in all cases (after discovering zot), which means that it could fall through and also discover other protocols and create xchans for them. 2016-09-21 13:24:16 -07:00
Mario Vavti
d9dc7f0f38 typo 2016-09-21 00:58:10 +02:00
redmatrix
4511f8855b issue #516 2016-09-20 15:53:30 -07:00
redmatrix
007836f514 issue #519 2016-09-20 15:38:11 -07:00
redmatrix
83dd1c7be2 issue #520 2016-09-20 15:34:35 -07:00
redmatrix
8ed9d915ad Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-20 15:27:52 -07:00
redmatrix
f812866665 issue #515 2016-09-20 15:27:36 -07:00
Mario Vavti
fde46ca78c Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-09-20 15:21:21 +02:00
Mario Vavti
ab59479a0c narrow navbar css fixes 2016-09-20 15:19:13 +02:00
redmatrix
299c46f118 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-20 06:14:40 -07:00
redmatrix
73bd65ead5 don't offer a settings/features link for techlevel 0 (basic or pro:0) even if there are level 0 features/categories. The definition of level 0 is "don't confuse me with options". 2016-09-20 06:05:20 -07:00
Mario Vavti
4b691703fe remove redundant loop 2016-09-20 13:39:26 +02:00
Mario Vavti
85bf025adc update changelog 2016-09-20 13:31:54 +02:00
redmatrix
8fd8ddcbc1 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-19 14:46:54 -07:00
redmatrix
0011b8fd48 probable fix for #509 - errant comment notifications provided on delayed (duplicate delivery) top level posts which are probably coming from clones 2016-09-19 14:42:56 -07:00
Mario Vavti
0cba82ce9c if a feature category array has no items unset it 2016-09-19 15:09:19 +02:00
Mario Vavti
eb7db62a64 erge branch 'dev' of https://github.com/redmatrix/hubzilla into dev
Merge erforderlich ist, insbesondere wenn es einen aktualisierten
2016-09-19 13:36:14 +02:00
Mario Vavti
8d0a0674c6 fix issue #517 2016-09-19 13:35:36 +02:00
redmatrix
6c4f9f324b pro: filter features by techlevel 2016-09-19 04:08:27 -07:00
redmatrix
2863c35ab5 a couple more namespace issues with exception handlers 2016-09-18 17:51:40 -07:00
redmatrix
44d945cd08 couple of minor issues with dba namespace during install and enotify::format referencing an unknown variable 2016-09-18 17:35:11 -07:00
redmatrix
0754da58da some changes merged from wrong branch... new function channel_reddress() instead of hardwired generation and which fixes case-sensitivity; allow dot notation in config and pconfig utils, updated string file 2016-09-17 14:51:57 -07:00
Mario Vavti
31df7af61f do not show hidden channels in /randprof issue #513 2016-09-15 10:36:46 +02:00
Mario Vavti
f55636bcb5 fix #514 2016-09-15 10:20:04 +02:00
Mario Vavti
1fd8c7ac42 fix #512 2016-09-15 10:15:02 +02:00
Mario Vavti
b0f9cd3022 add new locale file 2016-09-14 22:51:39 +02:00
Mario Vavti
0add06380f upgrade fullcalendar to version 3 2016-09-14 22:51:00 +02:00
Mario Vavti
81624a601a fix settings/account 2016-09-12 15:03:51 +02:00
redmatrix
045cd48687 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-09 21:31:14 -07:00
redmatrix
56f66ce001 issue #511, postgres schema issues 2016-09-09 21:30:24 -07:00
redmatrix
7121d8e427 issue #511, postgres schema issues 2016-09-09 21:25:57 -07:00
Mario Vavti
57dc362d5d whitelist button tag in htmlpurifier 2016-09-09 14:29:20 +02:00
Wave
661558dafc Merge pull request #510 from wave72/dev
Updated Italian strings
2016-09-09 12:32:32 +02:00
Wave72
6467ce1a97 Updated Italian strings 2016-09-09 12:26:41 +02:00
Mario Vavti
5680a88c59 version bump due to js caching issue 2016-09-09 10:01:25 +02:00
Mario Vavti
04a76371fc update justifiedGallery 3.6.1 -> 3.6.3 2016-09-09 09:58:18 +02:00
redmatrix
a90a0874b8 fix for old style version specifiers 2016-09-08 22:56:51 -07:00
redmatrix
2d83ea86dc more get rid of illegal offset in include/conversation 2016-09-08 22:33:39 -07:00
redmatrix
956dab69b4 illegal offset errors in include/conversation:status_editor() when no permissions array is passed 2016-09-08 22:20:45 -07:00
redmatrix
abaf752a9b comanche: simple test issue 2016-09-08 16:54:22 -07:00
redmatrix
d63cfb41f1 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-08 13:26:19 -07:00
redmatrix
9cfd0dd9d8 fix bookmarks in dev 2016-09-08 13:24:09 -07:00
Mario Vavti
1e8fec9385 add more foundation data- attributes 2016-09-08 11:22:58 +02:00
Mario Vavti
35f1055739 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-09-08 09:52:35 +02:00
Mario Vavti
98d5ae91f5 patch foundation-6.2.3 to work with jquery-3.1 2016-09-08 09:52:22 +02:00
redmatrix
83b89b9576 pro: provide settings for techlevel and techlevel_lock on admin/site page 2016-09-08 00:50:53 -07:00
redmatrix
4c89f5d397 pro: better handling of system techlevel settings.
system.techlevel = initial techlevel for all new accounts
system.techlevel_lock = if 1, account techlevel cannot be changed

this allows accounts to exist with alternate techlevels than a locked default, but they need to be set by the administrator. By default with no config settings, everybody starts at 0 but can set their own level.
2016-09-07 21:02:57 -07:00
redmatrix
c2f83639d4 provide version info in /pubsites 2016-09-07 17:36:45 -07:00
redmatrix
77e865fc8e pubsites: we still need to filter really really old redmatrix sites. These will not provide a pleasant experience. We probably should add version to the table. 2016-09-07 13:45:52 -07:00
redmatrix
1fa7e2994a Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-07 13:41:14 -07:00
redmatrix
0d7eb186d1 Remove the platform check in pubsites, since we're reporting it now. Folks can decide for themselves. 2016-09-07 13:40:07 -07:00
Mario Vavti
b6115d3c56 missing file 2016-09-07 12:58:25 +02:00
Mario Vavti
628187db16 upgrade foundation to version 6.2.3 2016-09-07 12:57:52 +02:00
redmatrix
de03f7f9ce photo move to another album - resurrected from a temporary branch where the work had gotten lost 2016-09-06 23:13:55 -07:00
redmatrix
6e149a2dd3 turn Settings page into sub-modules 2016-09-06 20:10:56 -07:00
redmatrix
884bb60c7d document the SubModule class and provide an option to change where the submodule name is located in the url path 2016-09-06 16:40:38 -07:00
redmatrix
57033bb599 custom/expert permissions bug 2016-09-06 16:18:06 -07:00
redmatrix
005186bf4a custom/expert permissions bug 2016-09-06 16:15:45 -07:00
redmatrix
95d24f1d30 final cleanup on submodules 2016-09-05 21:08:40 -07:00
redmatrix
dbb4ccbcc0 move the rest of mod_admin to sub modules 2016-09-05 21:00:00 -07:00
redmatrix
ed213c4d6d move admin/plugins::post to submodule and get rid of absolute paths 2016-09-05 19:50:55 -07:00
redmatrix
abb7695624 move admin/security to submodule 2016-09-05 19:10:12 -07:00
redmatrix
2cadda657c superfluous backslash 2016-09-05 18:16:29 -07:00
redmatrix
bedc7b7b69 use SubModule class for generalising submodules, move back to the zotlabs/module hierarchy 2016-09-05 18:11:00 -07:00
redmatrix
d7d46def9d Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-05 17:10:31 -07:00
redmatrix
1639f5b83d add links to zcards #500 ; also provide drag/drop highlighting of comment regions when a link is being dragged over them 2016-09-05 17:08:48 -07:00
Mario Vavti
2226d708ba bump STD_VERSION due to possible js chaching issue with new jotnets implementation 2016-09-05 10:36:28 +02:00
Mario Vavti
ba33c51b8c json_decode() should return an array instead of an object at this place 2016-09-05 10:31:19 +02:00
redmatrix
aaa7d6a0ec begin to organise the admin module into independent sub-modules. The same needs to happen with the API module. Using admin/plugins->get() as the first test case 2016-09-04 22:42:13 -07:00
redmatrix
483952eb78 remove chatroom suggestions for the time being, until somebody decides it's worth fixing and rolls up their sleeves and does it. See the notes. There's a lot of useful technology involved and some valid use cases so we won't throw the code away. There's a lot of stuff in here worth saving. We just need to spend a bit more time working through the nitty-gritty bits. 2016-09-04 21:09:00 -07:00
redmatrix
5fa43c41eb minor revision 2016-09-04 21:02:32 -07:00
redmatrix
00fb997995 And the next chapter begins... 2016-09-04 20:55:51 -07:00
redmatrix
c10acb1fb0 add the table of contents files 2016-09-04 18:37:14 -07:00
redmatrix
ecb44ad572 sidebar table of contents for help hierarchies; note that these should probably be html due to extraneous linefeeds you might find in bbcode or markdown 2016-09-04 18:35:06 -07:00
redmatrix
a3171cd429 incutio xmlrpc library uses old-style (php4) constructors which have been deprecated for some time. They should still work on 7.0, but it's only a matter of time before they go away. 2016-09-04 16:38:35 -07:00
Mario Vavti
2b2f1f2746 fix register link if logged in 2016-09-04 10:29:33 +02:00
redmatrix
5a1887ed17 move doc file parsing and rendering from the module level to the help library so that it can be re-used by widgets 2016-09-04 00:50:35 -07:00
redmatrix
0998a108ea wrong operator 2016-09-03 19:43:11 -07:00
redmatrix
8b17a6ddd1 don't send purge_all notification to self. 2016-09-03 17:32:48 -07:00
redmatrix
a7eae1031c update diaspora compatibility list, and also remove private mail 'unsend' (recall) from techlevel 0 which includes the basic server configuration. It's one less cross network compatibility issue that basic members will have to be aware of and one less complication for entry-level 'pro' members. 2016-09-03 16:33:48 -07:00
Mario Vavti
df91b489c4 revert moving home button to first position. instead move register and login buttons to the end of the list. 2016-09-03 09:15:55 +02:00
redmatrix
f17eb946f6 pro: add system techlevel to new accounts 2016-09-02 16:14:33 -07:00
redmatrix
904881e207 pro: allow admin to set a site techlevel and optionally lock it. 2016-09-02 16:08:30 -07:00
Mario Vavti
b00d084243 show home icon in first position in nav, provide register link also if register policy is set to approve and whitespace cleanup 2016-09-02 15:05:19 +02:00
redmatrix
75c1e7a193 missed the namespace 2016-09-02 02:34:33 -07:00
redmatrix
5897ed896a empty schema 2016-09-02 02:06:05 -07:00
redmatrix
47dd1da6fb put theme config into its own namespace 2016-09-01 22:20:08 -07:00
redmatrix
b3efdf2109 turn theme configuration into a class object 2016-09-01 22:10:56 -07:00
redmatrix
e5c077243c check that the advanced_theming feature is enabled before the pdledit module can be accessed. 2016-09-01 20:35:52 -07:00
redmatrix
af87038150 separate the 'expert' feature into 'advanced_theming' and 'advanced_dirsearch'. Hide both features unless techlevel > 3. 2016-09-01 19:01:02 -07:00
redmatrix
720f1d7123 actively set all the theme options on the display settings page based on the current theme selection 2016-09-01 17:09:58 -07:00
redmatrix
678148b9aa more work on theme select backend 2016-09-01 13:48:11 -07:00
redmatrix
549943fb10 provide json module to load theme specific settings so we can auto-fill the display settings page with schemas and theme settings whenever somebody makes a different theme selection 2016-09-01 13:19:08 -07:00
redmatrix
2940f9591b Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-09-01 12:45:13 -07:00
redmatrix
2ebb8851f6 theme preview - that was easy; plus a bit more tweaking of the saved search widget to try and get the sucker to auto submit 2016-09-01 12:42:47 -07:00
Mario Vavti
24192ff1ef introduce checklist BBcode for checklists 2016-09-01 13:57:45 +02:00
redmatrix
6adb180911 even though there is now a sitesearch widget, remove it from the search page pdl since we can just use the navbar and it offers more modes. 2016-08-31 22:04:45 -07:00
redmatrix
fa8febbb31 some issues with saved search - tags and connection searches weren't being saved. 2016-08-31 21:57:08 -07:00
redmatrix
8ba1bf02a4 document that include/permissions is being deprecated but may still be needed. 2016-08-31 20:29:32 -07:00
redmatrix
4bdb028499 Hubzilla pro: Don't offer 'custom/expert' permissions below a techlevel of 4; but any existing expert mode members are grandfathered in. 2016-08-31 19:55:45 -07:00
redmatrix
d18a8e849e Do not allow PERMS_PUBLIC as a choice for writable permission limits. Change text of buttons in expert mode for consistency with usage ('Channel Permission Limits' and 'Default Access Control List (ACL)'). 2016-08-31 19:22:47 -07:00
redmatrix
c3fdd00aa4 allow public comments (sort of - see the notes) 2016-08-31 18:39:50 -07:00
redmatrix
13c7fe46cd Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-31 17:51:23 -07:00
redmatrix
ea0be8ea1a provide techlevels in the pro server role. Should have no visible effect on other roles. 2016-08-31 17:49:22 -07:00
jeroenpraat
38ea71c6c9 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-08-31 13:17:34 +02:00
jeroenpraat
37ad734cea Dutch and Spanish string update 2016-08-31 13:17:23 +02:00
Mario Vavti
e9462ba145 resolve merge conflict 2016-08-31 09:41:07 +02:00
Mario Vavti
2b9322fc7d provide a possibility to create checklists in bbcode [x] creates a checked checkbox, [] creates an unchecked checkbox 2016-08-31 09:38:47 +02:00
redmatrix
b775a1aa0e The 'save to folder' modal dialog looked like crap. Now it only looks like dung. 2016-08-30 21:43:33 -07:00
redmatrix
bf3a409569 only check permissions on normal photos and force cover photos as well as profile photos to be public. As a side effect 'thing' photos will also be considered public. 2016-08-30 20:54:54 -07:00
redmatrix
68f6baf938 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-30 20:22:33 -07:00
redmatrix
5994fadebb version and release policy guide 2016-08-30 20:22:05 -07:00
zotlabs
c6c4c53c8b Merge pull request #507 from anaqreon/export
Imported webpage elements update existing elements properly. AllowCode…
2016-08-31 12:22:46 +10:00
Andrew Manning
16b7df3717 Imported webpage elements update existing elements properly. AllowCode permission is checked correctly and issues error on import if denied. 2016-08-30 22:11:14 -04:00
redmatrix
9bd8384a57 first cut at project governance doc 2016-08-30 18:40:37 -07:00
redmatrix
85d8300421 increase timeout on oembed remote fetches. This is a balancing act. Too short and many sites won't show up. Too long and you could be watching a spinner anxiously waiting for the page to load even if your own site is blindingly fast. 2016-08-30 17:23:14 -07:00
redmatrix
d03c66c924 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-30 13:36:01 -07:00
zotlabs
b485d09847 Merge pull request #506 from anaqreon/website-export
Website export
2016-08-31 06:32:54 +10:00
Andrew Manning
ad5c93d673 Merge remote-tracking branch 'upstream/dev' into website-export 2016-08-30 06:14:22 -04:00
Wave
202b757bc4 Merge pull request #505 from wave72/dev
Updated Italian strings
2016-08-30 10:32:52 +02:00
Wave72
603e64154d Updated Italian strings 2016-08-30 10:29:59 +02:00
redmatrix
52b80711f6 remove duplicated include 2016-08-29 21:21:09 -07:00
redmatrix
aec67e6be2 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-29 19:15:22 -07:00
redmatrix
8b6230726f add authors to post distribution; case insensitive sort apps 2016-08-29 18:06:39 -07:00
Mario Vavti
4050ff7c1f make lock switching actually work with multiple acl forms 2016-08-29 12:48:16 +02:00
redmatrix
6b4cfe4f18 Before throwing a 'smarty3 dir does not exist' fatal error, try and create it. We did try and create it during install, but the template processor is initalised long before we get to that code (and throws that ugly error). 2016-08-28 22:24:27 -07:00
redmatrix
810d9fefd9 create smarty dir before any templates can be initialised 2016-08-28 22:18:51 -07:00
redmatrix
fb13e69b8e supercedes pull request #503 2016-08-28 21:48:17 -07:00
redmatrix
689f232243 move allowed email domains to admin->security page 2016-08-28 19:36:14 -07:00
redmatrix
f16b6406eb Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-28 16:19:10 -07:00
redmatrix
760427fc43 fix aconfig 2016-08-28 16:18:31 -07:00
redmatrix
8931adc048 fix aconfig 2016-08-28 16:17:58 -07:00
Andrew Manning
b752acdeef Merge pull request #502 from anaqreon/docfix
Remove definite article before $Projectname in docs
2016-08-28 08:01:37 -04:00
Andrew Manning
ba224f382d Remove definite article before $Projectname in docs 2016-08-28 06:59:26 -04:00
redmatrix
f2ff6f394b minor (non-technical) corrections in the plugin doc 2016-08-27 19:43:55 -07:00
zotlabs
391d7fed52 Merge pull request #501 from anaqreon/doc-search
Display text around the searched query in documentation search
2016-08-28 12:32:32 +10:00
Andrew Manning
07e28a9757 Display text around the searched query in documentation search 2016-08-27 21:26:16 -04:00
Andrew Manning
b05474fc30 Merge remote-tracking branch 'upstream/dev' into website-export 2016-08-27 18:58:10 -04:00
redmatrix
47bd97b55d doc search broken 2016-08-27 15:31:26 -07:00
redmatrix
381b1a066d doc search broken 2016-08-27 15:30:46 -07:00
Andrew Manning
69ca279101 Merge remote-tracking branch 'upstream/dev' into website-export 2016-08-27 14:14:28 -04:00
redmatrix
de1e39add9 Merge branch 'master' of https://github.com/redmatrix/hubzilla into master_merge 2016-08-27 05:07:23 -07:00
redmatrix
ebd3b965fc vsprintf error on sql query 2016-08-27 05:07:07 -07:00
redmatrix
40b2e24c6d vsprintf error on sql query 2016-08-27 05:06:12 -07:00
Andrew Manning
ddfc5209d3 Merge remote-tracking branch 'upstream/dev' into website-export. Added attach_move() to include/attach.php. 2016-08-27 06:52:01 -04:00
redmatrix
aea2fa1629 issue #186 ...different check for pubforum with expert permissions 2016-08-26 16:02:04 -07:00
redmatrix
8e243edd20 add a couple of useful observer constructs to support identity aware pages 2016-08-26 14:43:58 -07:00
redmatrix
a8b42fc21e Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-26 14:00:45 -07:00
redmatrix
86dd67f57d comanche: generalise the conditional variable usage and add $observer as a test. Update comanche doco to reflect recent changes. 2016-08-26 13:58:37 -07:00
Manuel Jiménez Friaza
97d7a523a0 Add new page connedit to Spanish context help 2016-08-26 20:45:11 +02:00
git-marijus
1d455c21d4 Merge pull request #499 from mjfriaza/master
Add new page 'connedit' to Spanish context help & fixed a string in Spanish translation
2016-08-26 19:58:00 +02:00
Mario Vavti
8f631d0693 contact-block needs a class clear div at the end to not mess with following widgets and whitespace 2016-08-26 19:52:21 +02:00
Mario Vavti
002c203913 contact-block needs a class clear div at the end to not mess with following widgets and whitespace 2016-08-26 19:51:39 +02:00
redmatrix
8a2b96c2f9 - implemented but untested: duplicate detection for photo 'move to another folder'
- weekly string update
2016-08-26 01:37:46 -07:00
redmatrix
c6b9eb7855 update doco 2016-08-25 18:49:45 -07:00
redmatrix
38ea8bee93 ratings are gone. They can be enabled, but there is no UI for doing so at this time; and will likely only be available in a 'pro' configuration once the new implementation details have been hashed out. This appears to require a mechanism for rebuttal before it can again be opened to the public. There are also some synchronisation issues to contend with; as ratings are currently only distributed to active directory servers. There is no reliable mechanism for a new directory server to fetch existing ratings. 2016-08-25 17:43:07 -07:00
redmatrix
a969f18137 move premium channel to 'pro' since that's the only configuration where it works reliably. 2016-08-25 17:09:19 -07:00
Manuel Jiménez Friaza
0381102c27 Fixed a string in the Spanish translation 2016-08-25 12:20:53 +02:00
Manuel Jiménez Friaza
e81dccb14e Fixed a string in the Spanish translation 2016-08-25 12:20:22 +02:00
Manuel Jiménez Friaza
5c3e6307b4 Add new page connedit to Spanish context help 2016-08-25 12:14:10 +02:00
redmatrix
8d94402d25 attach_move() function created to relocate files or photos to different directories in the cloud area and photo albums without deleting and recreating (which would create a new resource_id and invalidate any existing links). 2016-08-24 22:41:54 -07:00
redmatrix
35d12b9e59 provide context help for the connedit page 2016-08-24 21:16:58 -07:00
redmatrix
a81da0ec34 off by one pixel 2016-08-24 20:06:44 -07:00
redmatrix
f1fbcd7c02 some more complex test scenarios for comanche conditionals: equals x, not equals x, in_array, and array_key_exists 2016-08-24 17:42:59 -07:00
Mario Vavti
5c32f42fe9 do not return false since it could prevent clicking also when not appropriate. 2016-08-24 22:58:02 +02:00
Mario Vavti
a780252552 remove the onclick action 2016-08-24 22:47:33 +02:00
Mario Vavti
798b80e486 do not remove cover photo after scrolling it up. mimik an scroll edge if scrolling up again before scrolling into the cover photo again. 2016-08-24 22:40:15 +02:00
Mario Vavti
aa0384bcec Revert "revert cover photo changes"
This reverts commit 4c840d70a4.
2016-08-24 22:39:30 +02:00
redmatrix
dd654b9766 provide a mechanism for global template values (macro replacements that are available to all templates). There's a strong likelihood this list will increase but we may wish to actively prevent it from mushrooming out of control. 2016-08-24 13:11:01 -07:00
redmatrix
4c840d70a4 revert cover photo changes 2016-08-24 12:56:45 -07:00
redmatrix
238621ee92 allow changing the server role - as well as configuring any of the three options during installation 2016-08-23 23:00:24 -07:00
redmatrix
206054678b cover photo: adjustments to display the entire photo on manual scrollback (padding added for nav height) 2016-08-23 20:10:56 -07:00
redmatrix
a5035dee74 several cover photo widget enhancements:
- allow a click anywhere on the page to cause the photo to autoscroll
- provide a logic flag to autoscroll only once
- allow manual scroll back to see the cover photo afterward (tricky to handle the nav menu here)
- on scroll back, the nav remains fixed at the top and the top pixels of the cover photo are covered (this was an acceptable tradeoff to gain the ability to see the photo again without causing unpredictable behaviour of the nav)
- some positioning details in small screen width mode caused jot to be off screen due to insufficient top padding; a manual padding was also added as something still wasn't right even after adding the nav height
- very minor nit: if screen size is reduced below 755 and then upsized again, the cover photo will not be redisplayed
2016-08-23 19:13:46 -07:00
redmatrix
d3369384d1 include port in pdo url when host is 'localhost' 2016-08-23 18:18:05 -07:00
Andrew Manning
420aa4bc44 Merge remote-tracking branch 'upstream/dev' into website-export 2016-08-23 06:57:10 -04:00
Andrew Manning
305e0538d2 Website export to cloud files works. Created new recursive copy function in attach.php. 2016-08-23 06:55:26 -04:00
redmatrix
1e6a491400 change default server role 2016-08-22 19:45:21 -07:00
redmatrix
38ca3bac40 optional server role compatibility checks for plugins 2016-08-22 17:41:41 -07:00
redmatrix
e967bc9c45 public forum fallback checking (when custom/expert permissions are applied) was looking at owner rather than observer perms 2016-08-22 17:04:13 -07:00
redmatrix
d6d21cb5f6 doco updates 2016-08-22 16:46:44 -07:00
redmatrix
d177cf94da server role management, part 1 2016-08-22 16:21:07 -07:00
redmatrix
a3e0e67953 remove references to tinymce which were causing console errors 2016-08-21 19:40:11 -07:00
redmatrix
7045b920ef make zid() do the right things when confronted with url fragments 2016-08-21 17:38:36 -07:00
redmatrix
9a057623d6 Merge branch 'git-marijus-dev' into dev 2016-08-21 16:34:42 -07:00
redmatrix
b6a545b4a2 Merge branch 'dev' of https://github.com/git-marijus/hubzilla into git-marijus-dev 2016-08-21 16:33:59 -07:00
redmatrix
4d34d9c032 issue #496 2016-08-21 16:26:30 -07:00
Mario Vavti
4f62d7a78f move jotnets to jot and some cleanup (mostly whitespace) 2016-08-21 15:43:03 +02:00
Andrew Manning
d39cf23b2f Visual improvements to the export element table 2016-08-21 06:53:19 -04:00
Andrew Manning
1c61e316b4 Block export and re-import works. Fixed bug where layout content was not being imported properly. 2016-08-20 21:08:15 -04:00
Andrew Manning
2d42d58738 Layouts list and are selectable for export to the zip file 2016-08-20 16:05:27 -04:00
Andrew Manning
80ed05d45d Export of pages and their layouts to a zip file works. Bug on importing the exported zip file for pages. 2016-08-20 15:22:30 -04:00
redmatrix
4cf172d46f Merge branch 'zp' into dev 2016-08-19 17:39:08 -07:00
redmatrix
d1fa63b389 string update 2016-08-19 17:13:34 -07:00
redmatrix
9fe4bae52f block backdoor delivery of bulk imported items 2016-08-19 17:12:48 -07:00
Andrew Manning
cf93d9c3b4 Merge remote-tracking branch 'upstream/dev' into website-export 2016-08-19 19:34:04 -04:00
Andrew Manning
40a7d38210 Pages populate the available-to-export list. New checkbox class for smaller boxes. 2016-08-19 19:32:52 -04:00
redmatrix
e4244c0cac remove insecure repository warning. 2016-08-18 17:22:54 -07:00
redmatrix
3c88f3e6ee Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-17 19:45:00 -07:00
redmatrix
fa98f4c55d import anomaly 2016-08-17 19:44:24 -07:00
Andrew Manning
f2e87a204d Progress implementing zip file export 2016-08-17 21:25:50 -04:00
Andrew Manning
c98b91f514 Stash changes for merge with dev 2016-08-17 18:19:36 -04:00
hubzilla
7939588702 Merge pull request #492 from wave72/dev
Updated Italian strings
2016-08-17 18:28:27 +10:00
Wave72
99c4d932bf Updated Italian strings 2016-08-17 10:25:42 +02:00
redmatrix
537401cf27 don't set session theme unless logged in. 2016-08-16 22:15:51 -07:00
redmatrix
b2eede891a Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-16 19:01:20 -07:00
redmatrix
a2873c18ca get rid of ugly code construct 2016-08-16 19:00:38 -07:00
hubzilla
70d38fe5b3 Merge pull request #491 from mjfriaza/dev
Add Spanish context help settings/features page
2016-08-17 09:12:02 +10:00
Manuel Jiménez Friaza
f15456f4ab Add Spanish context help settings/features page 2016-08-16 13:06:51 +02:00
Mario Vavti
9fc4246e1d Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev 2016-08-16 08:05:53 +02:00
Mario Vavti
291b0edbe0 rename limited -> custom 2016-08-16 08:05:46 +02:00
Mario Vavti
452c4d13b0 remove unneeded function 2016-08-16 07:54:24 +02:00
redmatrix
70150718c5 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-15 22:46:06 -07:00
redmatrix
8a89cfb158 move schema settings into the display settings main so we can set theme:schema theme selectors in settings 2016-08-15 22:45:07 -07:00
Mario Vavti
86d2daf473 only check settings-form for dirty state and remove redundant javascript 2016-08-16 07:41:06 +02:00
redmatrix
7fc254a81c Use double quotes for strings passed via templates to javascript. Some translated strings have unescaped single quotes. 2016-08-15 17:18:42 -07:00
hubzilla
752bb169ed Merge pull request #487 from git-marijus/dev
implement groups in the acl select.
2016-08-16 06:59:52 +10:00
Mario Vavti
4b101c2240 provide group options serverside and minor cleanup 2016-08-15 22:54:07 +02:00
redmatrix
4facae674d fix attached photo/file permissions on clones 2016-08-15 13:18:25 -07:00
redmatrix
39005634c6 Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge 2016-08-15 13:18:05 -07:00
hubzilla
2e452f5b27 Merge pull request #488 from einervonvielen/dev_homeinstall_merge_master-dev
Merge dev with last changes of homeinstall script in master
2016-08-16 06:17:44 +10:00
Einer von Vielen
9e9e0ebb1c Merge dev with last changes of homeinstall script in master 2016-08-15 20:12:00 +02:00
Mario Vavti
dd8d20f089 implement groups in the acl select. please notice that selecting *custom selection* now sets an empty (public) acl. it was set to self before... 2016-08-15 18:52:27 +02:00
redmatrix
8cbffdf0b4 s/$rr/$rv/ 2016-08-14 22:44:25 -07:00
redmatrix
000861da0d event_store_event hook 2016-08-14 18:22:18 -07:00
hubzilla
7ae097ef6b Merge pull request #484 from anaqreon/settings-context
Context help for settings/features page
2016-08-15 06:32:30 +10:00
Andrew Manning
6868403383 Context help for settings/features page 2016-08-14 13:34:52 -04:00
hubzilla
d1cb925b59 Merge pull request #482 from anaqreon/nocomment
Added an optional post editor button to toggle comments
2016-08-14 21:24:24 +10:00
Andrew Manning
229cc2ac43 Change text for submenu on small screens to be static toggle statement 2016-08-14 06:55:02 -04:00
Andrew Manning
cb9ac6dd34 Replace hardcoded button title in javascript to translatable text 2016-08-14 06:46:48 -04:00
Andrew Manning
2e7f4c1870 Added a disable comments setting to the "Additional features" settings with a corresponding post editor toggle button 2016-08-14 06:41:12 -04:00
Mario Vavti
993b182f81 fix javascript error if not logged in 2016-08-14 12:12:37 +02:00
Mario Vavti
82d61f194a update bootstrap 3.3.5 > 3.3.7 2016-08-14 11:49:40 +02:00
Mario Vavti
541d0dce90 btn/dropdown rendering issue 2016-08-14 11:31:00 +02:00
Mario Vavti
6f0ac133cc remove js debugging 2016-08-13 22:27:53 +02:00
Mario Vavti
1b90e851f9 fix #480, enable bbcode autocomplete for photo comments and remove some redundant javascript 2016-08-13 22:17:47 +02:00
redmatrix
165f442d70 pending flag not being reset when using autoperms from custom role 2016-08-12 18:17:39 -07:00
redmatrix
5365e9b3a5 string update 2016-08-12 14:45:16 -07:00
hubzilla
2aa1450ab2 Merge pull request #479 from git-marijus/dev
possible quickfix for multi-acl not honoring jotnets
2016-08-13 07:37:45 +10:00
zottel
dc3cc655db fix auto-connect setting 2016-08-12 23:27:03 +02:00
zottel
e4bdc92834 Merge remote-tracking branch 'upstream/dev' into dev 2016-08-12 20:43:05 +02:00
Mario Vavti
87a74a44d3 possible quickfix for multi-acl not honoring jotnets 2016-08-12 17:40:22 +02:00
redmatrix
ebbe18a426 better method of dealing with api versions 2016-08-11 20:09:38 -07:00
redmatrix
6bc5dd75bd more cleanup of api 2016-08-11 19:42:44 -07:00
redmatrix
0257d660ad move error processing back inside the function 2016-08-11 18:09:48 -07:00
redmatrix
c63deda71a embed filter adjustments 2016-08-11 17:33:28 -07:00
redmatrix
3ba4b2c1c1 A bit of api cleanup. Don't get excited. This is like a 0.005% cleanup but you have to start somewhere. 2016-08-11 17:02:52 -07:00
redmatrix
e985436b3b forum detection was off for forums with custom perms 2016-08-10 20:49:51 -07:00
redmatrix
a8a3812890 optimise Onepoll so it doesn't try and fetch posts for a channel that we've not given permission to send us their stream and posts. Currently the posts are fetched, processed, and ultimately discarded. Since we know they are going to be discarded, there's not much point fetching them in the first place. 2016-08-10 20:01:52 -07:00
redmatrix
6c672d2575 initialise jot editor if it is used as a file drop target and isn't yet opened. 2016-08-10 19:38:20 -07:00
redmatrix
99c5aca78b update CHANGELOG for 1.12 2016-08-10 17:36:10 -07:00
redmatrix
b587bdf863 new version 2016-08-10 16:57:14 -07:00
zottel
8706cbe1c4 Merge remote-tracking branch 'upstream/dev' into dev 2016-08-10 13:49:48 +02:00
zottel
6ba142fd33 Merge remote-tracking branch 'upstream/dev' into dev 2016-08-05 09:17:00 +02:00
zottel
dd83f6f356 Merge remote-tracking branch 'upstream/dev' into dev 2016-08-02 10:56:47 +02:00
zottel
55eda16b61 Merge remote-tracking branch 'upstream/dev' into dev 2016-08-01 14:07:18 +02:00
zottel
b5ea20ac86 Merge remote-tracking branch 'upstream/dev' into dev 2016-07-31 02:14:33 +02:00
zottel
e5a3179468 Merge remote-tracking branch 'upstream/dev' into dev 2016-07-27 09:31:20 +02:00
zottel
11b97af250 Merge remote-tracking branch 'upstream/dev' into dev 2016-07-26 08:43:28 +02:00
zottel
dcf2c07f29 Merge remote-tracking branch 'upstream/dev' into dev 2016-07-25 13:38:12 +02:00
zottel
ed82cb108f Merge remote-tracking branch 'upstream/dev' into dev 2016-07-22 20:16:49 +02:00
zottel
43def0873e Merge remote-tracking branch 'upstream/dev' into dev 2016-07-20 14:53:58 +02:00
zottel
8bbe2569dc Merge remote-tracking branch 'upstream/dev' into dev 2016-07-18 11:53:23 +02:00
zottel
a2461d9816 Merge remote-tracking branch 'upstream/dev' into dev 2016-07-14 20:49:26 +02:00
zottel
ecc06aad24 Merge remote-tracking branch 'upstream/dev' into dev 2016-07-11 10:33:51 +02:00
zottel
806ca4c842 Merge remote-tracking branch 'upstream/dev' into dev 2016-07-08 09:10:52 +02:00
zottel
95e45bbeac Merge remote-tracking branch 'upstream/dev' into dev 2016-07-06 08:55:26 +02:00
zottel
b41357e2a1 Merge remote-tracking branch 'upstream/dev' into dev 2016-06-30 15:51:36 +02:00
zottel
0406e3a7dd Merge remote-tracking branch 'upstream/dev' into dev 2016-06-25 00:59:46 +02:00
zottel
e25bd28b73 Merge remote-tracking branch 'upstream/dev' into dev 2016-06-16 10:24:24 +02:00
zottel
a83f13269f Merge remote-tracking branch 'upstream/dev' into dev 2016-06-13 09:51:47 +02:00
zottel
376ad1f024 Merge remote-tracking branch 'upstream/dev' into dev 2016-06-09 18:01:02 +02:00
zottel
04518702d2 Merge remote-tracking branch 'upstream/dev' into dev 2016-06-07 12:59:39 +02:00
zottel
d5f72165fd Merge remote-tracking branch 'upstream/dev' into dev 2016-06-05 02:21:46 +02:00
zottel
f89b7ac9e1 Merge remote-tracking branch 'upstream/dev' into dev 2016-06-05 01:48:27 +02:00
zottel
6cd348f155 Merge remote-tracking branch 'upstream/dev' into dev 2016-06-05 00:21:06 +02:00
zottel
d20fb3a31b Merge remote-tracking branch 'upstream/dev' into dev 2016-06-04 20:45:59 +02:00
zottel
1f5529752f Merge remote-tracking branch 'upstream/dev' into dev 2016-06-01 16:28:44 +02:00
zottel
4e01956b33 Merge remote-tracking branch 'upstream/dev' into dev 2016-05-23 20:19:50 +02:00
zottel
2f7d40d8db Merge remote-tracking branch 'upstream/dev' into dev 2016-05-20 07:46:22 +02:00
zottel
3eca1c3696 Merge remote-tracking branch 'upstream/dev' into dev 2016-05-19 08:44:59 +02:00
zottel
dc78ab1c77 Merge remote-tracking branch 'upstream/dev' into dev 2016-05-17 07:56:39 +02:00
zottel
710d6ebd49 Merge remote-tracking branch 'upstream/dev' into dev 2016-05-12 12:25:10 +02:00
zottel
89c65de863 Merge remote-tracking branch 'upstream/dev' into dev 2016-05-09 08:01:00 +02:00
zottel
0314624aeb Merge remote-tracking branch 'upstream/dev' into dev 2016-05-05 20:47:15 +02:00
zottel
8088185a43 Merge remote-tracking branch 'upstream/dev' into dev 2016-05-03 15:14:13 +02:00
zottel
e0e76ce82c Merge remote-tracking branch 'upstream/dev' into dev 2016-05-02 11:02:03 +02:00
zottel
0788d37c60 Merge remote-tracking branch 'upstream/dev' into dev 2016-04-29 08:37:51 +02:00
zottel
776b7074ea Merge remote-tracking branch 'upstream/master' into dev 2016-04-29 08:34:14 +02:00
1385 changed files with 246471 additions and 85516 deletions

14
.gitignore vendored
View File

@@ -60,11 +60,13 @@ nbproject/
.idea/
# composer files (at the moment composer is not officially supported and only used to add SabreDAV, we should add these)
composer.*
# When we include composer we should exclude vendor/
## composer
# locally installed composer binary
composer.phar
# vendor/ is managed by composer, no need to include in our repository
# requires new deployment and needs discussion first
#vendor/
# Exclude at least some vendor test files, examples, etc.
vendor/sabre/*/tests/
# Exclude at least some vendor test files, examples, etc. so far
vendor/**/tests/
vendor/**/Test/
vendor/sabre/*/examples/

View File

@@ -491,7 +491,7 @@ END
print_info "letsenrypt exists already (nothing downloaded > no certificate created and registered)"
return 0
fi
git clone https://github.com/lukas2511/letsencrypt.sh $le_dir
git clone https://github.com/lukas2511/dehydrated $le_dir
cd $le_dir
# create config file for letsencrypt.sh
echo "WELLKNOWN=$le_dir" > $le_dir/config.sh
@@ -511,9 +511,9 @@ END
then
die "Failed to load $url_http"
fi
# run letsencrypt.sh
# run script dehydrated
#
./letsencrypt.sh --cron --config $le_dir/config.sh
./dehydrated --cron --config $le_dir/config.sh
}
function configure_apache_for_https {
@@ -730,8 +730,8 @@ echo "#" >> /var/www/$hubzilladaily
echo "echo \" \"" >> /var/www/$hubzilladaily
echo "echo \"+++ \$(date) +++\"" >> /var/www/$hubzilladaily
echo "echo \" \"" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - renew certificat...\"" >> /var/www/$hubzilladaily
echo "bash $le_dir/letsencrypt.sh --cron --config $le_dir/config.sh" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - renew certificate...\"" >> /var/www/$hubzilladaily
echo "bash $le_dir/dehydrated --cron --config $le_dir/config.sh" >> /var/www/$hubzilladaily
echo "#" >> /var/www/$hubzilladaily
echo "# stop hubzilla" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - stoping apache and mysql...\"" >> /var/www/$hubzilladaily
@@ -798,7 +798,7 @@ echo "echo \"\$(date) - db size...\"" >> /var/www/$hubzilladaily
echo "du -h /var/cache/rsnapshot/ | grep mysql/hubzilla" >> /var/www/$hubzilladaily
echo "#" >> /var/www/$hubzilladaily
echo "# update" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - updating letsencrypt.sh...\"" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - updating dehydrated...\"" >> /var/www/$hubzilladaily
echo "git -C /var/www/letsencrypt/ pull" >> /var/www/$hubzilladaily
echo "echo \"\$(date) - updating hubhilla core...\"" >> /var/www/$hubzilladaily
echo "git -C /var/www/html/ pull" >> /var/www/$hubzilladaily

View File

@@ -5,10 +5,6 @@ language: php
php:
# using major version aliases
# aliased to a recent 5.4.x version
- 5.4
# aliased to a recent 5.5.x version
- 5.5
# aliased to a recent 5.6.x version
- 5.6
# aliased to a recent 7.x version
@@ -27,7 +23,6 @@ matrix:
# - php: hhvm
# env: DB=pgsql # PDO driver for pgsql is unsupported by HHVM (3rd party install for support)
allow_failures:
- php: 7.0
- php: hhvm
# execute any number of scripts before the test run, custom env's are available as variables
@@ -36,11 +31,14 @@ matrix:
# - if [[ "$DB" == "pgsql" ]]; then psql -c "create database hello_world_test;" -U postgres; fi
# - if [[ "$DB" == "mysql" ]]; then mysql -e "create database IF NOT EXISTS hello_world_test;" -uroot; fi
install:
- composer require phpunit/phpunit
# omitting "script:" will default to phpunit
# use the $DB env variable to determine the phpunit.xml to use
script: phpunit tests/*php
script: vendor/bin/phpunit tests/unit/
# configure notifications (email, IRC, campfire etc)
notifications:
# irc: "irc.freenode.org#yourfavouriteroomfortravis"
# a plugin/script to post to a hubzilla channel would be neat here
# a plugin/script to post to a hubzilla channel would be neat here

273
CHANGELOG
View File

@@ -1,3 +1,276 @@
Hubzilla 2.2 (2017-03-08)
- Don't collapse long nsfw content if nsfw plugin is already collapsing it
- Provide version compatibility check for themes (minversion, maxversion)
- Use chanlink_hash() instead of chanlink_url() where appropriate
- Use head_add_link() for feed discovery
- Provide HTTP header parser which honours continuation lines
- Numerous doco improvements
- Implement virtual privacy groups from restricted profile access list
- Implement permission roles
- Implement app-tray
- Default to manual conversation updates
- Implement channel move for all server roles
- Implement nav login modal
- Rename bb2diaspora.php to markdown.php
- Remove obsolete module 'match'
- Move firefox social api configuration to plugin
- Move rsd service to twitter_api plugin
- Add build_pagehead hook
- Move opensearch to plugins
- Move dreamhost hack to plugin
- Add wiki permissions
- Introduce hubloc_store_lowlevel() and xchan_store_lowlevel()
- Move diaspora account import to the diaspora plugin
- Allow export of single data sets instead of always exporting everything we know about in channel export
- Queue optimisations for sites that have lingered in the queue for more than a couple of days
- Add affinity slider tool settings for min and max defaults in settings/featured
- Provide lowlevel xchan storage function to ensure that all non-null rows are initialised
- Implement native wiki
- Block well-known from oembed
- Implement observer.language bbcode and observer.language comanche conditional
- Implement daemon_addon hook to let plugins create custom background processes
- Implement profile vcards
- Implement connection vcards
- Implement 'click to call' in address book
- Default cover photo
- Remove fullscreen functionality in photo album view
- Update fontawesome lib to version 4.7.0
- Implement a menu to select a section to be open by default in connedit
- Improve comanche conditionals
- Add enclosures and categories to atom feed parsing
- Allow the atom_entry hook to change the results
- Set 'adjust for viewer timezone' as the default for new events
- Allow event creation in other timezones than your own
- Update fullcalendar lib to version 3.1
- Move api version call back to core
- Create first webpage as 'home' if none exist
- Show webpages link to visitors if a 'home' page exists
Bugfixes
- Fix schema not saved if session theme != selected theme and schema select display issue
- Fix no acl not detected in post_activity_item()
- Fix find_folder_hash_by_path() was not safe against multiple attach structures with the same filename but in different directories
- Fix don't search on empty filename - we shouldn't find it. The reason why this change is being made is because we actually did find it due to a development glitch
- Fix several places where head_add_(css|js) functions have been used incorrectly.
- Fix webpage import tool
- Fix numerous bugs with the addon repo management GUI
- Fix attach_delete() to remove photo resources even if the attach table row wasn't found
- Fix choking if photo_factory() returns null
- Fix embedimage if an albumname contains quotes
- Fix chat member list when one or more members are connected via access tokens
- Fix issue #636 - some localised (e.g. Italian) strings have single quotes which throw JS errors when used in single quoted template constructs
- Fix issues #629 and #635 - edited post arriving from downstream source was not being rejected
- Fix peoplefind widget not honouring directory option settings
- Fix issue with HTML in code blocks in markdown in wiki
- Fix issue with post signatures if posted from api and logged in locally with a different identity
Plugins/Addon
- Add experimental webmention plugin
- NSFW: Use button instead of text link
- Diaspora: gracefully handle multiple photos per post
- Diaspora: change profile photo permission call
- Logrotate: don't throw an error if another server process renamed the logfile before we got to it
- Chess: the channel owner must be one of the players, so only require selecting one connection for an opponent
- Move firefox social api configuration to plugin from core
- Move rsd service to twitter_api plugin from core
- Move opensearch to plugins from core
- Move dreamhost hack to plugin from
- Move diaspora account import to addon from core
- Reflect hubloc store changes in plugins
- Reflect xchan store changes in plugins
- Rendezvous: Fixed marker creation bug
- Rendezvous: Center on marker if specified in URL, and update browser address bar with shareable link when selecting markers on the map
- Rendezvous: Set default value of 0 for priximity alert when making new markers
- Move gitwiki to plugins from core which has been replaced by native wiki
- Openclipatar: reflect changes to files and photos which were unified in core some time ago
- Reintroduce gnusocial plugin after security/functionality review
- Twitter_api: hubzilla core issue 638 - unsupported message-id field not available in all twitter api functions
- Superblock: update to reflect core changes
- Rendezvous: implement static marker proximity alert
- Phpmailer: security update
Hubzilla 2.0 (2016-12-23)
- Deprecate bb_iframe
- Note widget: resize the textarea to reveal full content
- Implement fixed left aside
- Implement lockview for wikilist
- Simplify wikilist widget
- Router error reporting
- Setup changes to check for shell_exec and exec functions
- Extensible permissions upgrade handling for channels with custom permission roles
- Allow plugins to cancel item_store() and item_store_update()
- ZOT version 1.2 provides negotiation of cryptographic algorithms
- Provide a fresh new look and cleaner layout and more relevant information to siteinfo
- Introduce highlight bbcode [hl]
- Implement wiki mimetypes markdown or bbcode
- Doc pages refactoring
- Update webpages and wiki context help
- Make a git commit when a new wiki page is created
- Prev-next navigation for mod_connedit to ease bulk connection edits
- Move the remote user homebutton to the user menu
- Do not render maps/locations for Diaspora destinations
- Provide 'per-page' caching for is_matrix_url() results to reduce duplicate queries
- Don't send notification for posts/comments on old conversations that were refetched after having expired
- Numerous wiki UI improvements
- Move twitter api to addon
- Cleanup and re-organise the voting and attendance buttons
- Reorganise emoticons
- Collapse navbar-collapse-1 if avatar menu is clicked.
- New display setting: static page update as opposed to live update
- Command line administrative channel connect utility
- Modernise chanview
- Implement edit activities to share post/comment edits with protocols which do not support them (e.g. Diaspora)
- Wiki export
- Numerous postgres compatibility fixes
- Remove requirement that imported profile photos be in the profile photos album
- Change event behaviour - share by default.
- Use PDO database driver exclusively (deprecate drivers that are separately maintained)
- Zot API re-write and extended
Bugfixes
- Fix z_fetch_url() incorrect variable
- Fix SQL error with app categories
- Fix do not show revert buttons if we do not have write perms
- Fix dropdown positions
- Fix do not increase opacity to more than 1
- Fix clone sync missing for some item delete operations
- Fix embed-image for fullscreen mode
- Fix attach_list_files()
- Fix full screen for embedded videos
- Fix the forum widget for forums with custom perms
- Fix issue #607 parens not recognised inside urls
- Fix pubsites: don't list dead sites
- Fix issue #596 silence headers already sent warning
- Fix missing plugins in zot-info
- Fix notification issue
- Fix issue #594 like of thing appears as profile owner like
- Fix export issue
- Fix checklist bbcode - only turn [] and [x] into checkboxes if it is found inside a checklist
- Fix wiki permissions issues
- Fix public calendar leaks connection information (birthdays) when view_contacts is not allowed
- Fix attach_rename: flaw in duplicate filename detection resulted in filename(1)(1)(1).ext
- Fix a fatal error with incorrect DB object access
- Provide /locs link on settings page if there is more than one hubloc for this channnel *that isn't deleted*.
- Fix issue #577 if connecting to a channel that is already pending, undo the pending and set connect permissions accordingly
- Fix issue #575, when 'nofinish' is set on an event, invalid date was generated/stored
- Fix bbcode event formatting issue
- Fix zot_finger from navbar people search looping
- Fix fromStandalonePermission()
Plugins
- GNU Social: removed from addons for security reasons - it might be re-implemented once it is properly reviewed
- Diaspora: missing item author when diaspora public comment received from relay
- Superblock: refactoring
- New addon: tripleaes for pro
- Cdav: "if not exists" only supported starting with postgresql v. 9.5 debian stable has 9.4
- Rendezvous: added markers and members export tool at /rendezvous/[group_id]/export/{markers,members}
- Twitter: move twitter api to addon
- New addon: b2tbtn (back to top button)
- Diaspora: import public diaspora messages to sys if applicable
- Diaspora: try and handle singletons better and simplify the associated notifier decisions
- Rendezvous: add proximity alert feature to members to issue notification when member is within a specified distance.
- New addon: diaspora_reconnect to refriend diaspora/friendica connections from a clone or channel move
- Diaspora: change the logic for deciding between upstream and downstream message flow for notifier plugins
- Rendezvous: prompt member to share their location by activating the GPS control using a tooltip and pulsing visibility
- statistics_json: fix nodeinfo
- Rendezvous: restored the lost gps-icon.png and corrected the OpenStreetMap tile server URL to avoid insecure content warnings
- Rendezvous: use observer name if available
- std_embeds: missing backslash
- Diaspora: postgres fixes issue #31
- Rendezvous: added marker list with centering buttons and popup open.
- Rendezvous: added control to see list of members sharing their location, with buttons to pan the map to center them
- Diaspora: system level diaspora toggle
- Rendezvous: added control that displays members.
- Diaspora: rename diaspora2bb() to markdown_to_bb() in core
- Hubwall: remove illegal unescaped angle chars
- Rendezvous: Add control to delete member if not updated in over 14 minutes
Hubzilla 1.14 (2016-10-13)
- New hook bbcode_filter
- Unify the various mail sending instance to enotify::send() and z_mail()
- Provide ability for admin to change account password
- Replace deprecated Sabre functions
- Add plugin hook for 'get_profile_photo'
- Convert NULL_DATE to a legal date for compatibility with MySQL strict mode
- Allow a site to over-ride the help table-of-contents files
- Autoscroll to target post/comment when in single-thread mode
- Indicator for own response verb activity
- Add server role documentation
- Pro: remove 'Additional Features' link for techlevel 0
- Upgrade fullcalendar library to version 3
- Whitelist button tag in htmlpurifier
- Upgrade justifiedGallery library to version 3.6.3
- Pubsites improvements
- Upgrade foundation library to version 6.2.3
- Ability to move photos to another album
- Submodules for settings page
- Submodules for admin page
- Remove chatroom suggestions
- Revamped and improved theme select backend
- Theme preview
- Implement techlevels for pro server role
- BBcode checklist
- Improve save to folder modal dialog
- Case insensitive sort apps
- Add authors to post distribution
- Redirect to plugin page after enabling to show configuration settings if applicable
- Move allowed email domains to admin->security page
- Display text around the searched query in documentation search
- Comanche observer conditionals
- Remove ratings
- Context help for /connedit
- Provide configurable sidebar table-of-contents indexes for different levels of the help hierarchy
- Comanche conditionals
- Cover photo enhancements (does not disappear after initial scrolldown)
- Website import/export
- Server roles (basic, standard and pro)
Bugfixes
- Fix connected time not shown on ajax loaded connections
- API issues
- Fix readmore.js collapsing on scrolldirection change in some mobile browsers
- Personalize Server Emails
- Audio player doesn't automatically show for m4a files
- Fix ajax page update with /channel?f=&mid=hash
- Angle bracket characters in DB password not recognised
- Regression: files/photos were not synchronising to channel clones properly
- Missing categories in preview mode
- attach_store() sql issue
- Rename id share_container to distr_container - share_container seem to be blacklisted in various security browser plugins
- Add 'map' extension to files served natively by nginx without using the project controller
- Zot discovery wasn't returning in all cases (after discovering zot)
- Do not show hidden channels in /randprof
- Numerous postgres fixes
- Illegal offset errors in include/conversation:status_editor() when no permissions array is passed
- Patch foundation-6.2.3 to work with jquery-3.1
- Custom/expert permissions bug
- Mail: return array instead of object
- Don't send purge_all notification to self
- Saved search: tags and connection searches weren't being saved
- Do not allow PERMS_PUBLIC as a choice for writable permission limits
- Force cover photos as well as profile photos to be public. As a side effect 'thing' photos will also be considered public
- Make lock switching actually work with multiple acl forms
- Create smarty dir before any templates can be initialised
- Fix aconfig
- Broken doc search
- Public forum check with custom/expert permissions
Plugins
- Standard Embed: update to convert old corporate bbcodes
- Cdav security: fix rw permission check
- Cdav: add partial support for recurring events in the browser client (editing/creating is not implemented)
- New plugin phpmailer: use phpmailer class instead of php's built-in mail() function
- Diaspora: third party on other network comment issue
- Diaspora: comment fix (hubzilla originated comment with plugin activated by comment author not making it to Diaspora)
- Cdav: provide calendar list view
- Diaspora: allow comments on public diaspora posts which were imported by subscribing to public tags.
- Wppost: add blog_id parameter for WordPress MU sites such as WordPress.com
- Wppost: don't log the password in normal mode
- Hubwall: provide choice of sender addresses, the real admin email, postmaster, or noreply.
- Chord: General cleanup of chord app
- Chord: Update chord binary for modern linux systems
- Start grouping addons by server_role
Hubzilla 1.12
- extensible permissions so you can create a new permission rule such as "can write to my wiki" or "can see me naked".
- guest access tokens can do anything you let them, including create posts and administer your channel

View File

@@ -1,4 +1,4 @@
Copyright (c) 2010-2016 the Hubzilla Community
Copyright (c) 2010-2017 the Hubzilla Community
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy

View File

@@ -3,60 +3,27 @@
Hubzilla - Community Server
===========================
Groupware re-imagined and re-invented.
--------------------------------------
Connect and link decentralised web communities.
-----------------------------------------------
<p align="center" markdown="1">
<em><a href="https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt">Installing Hubzilla</a></em>
</p>
**What are Hubz?**
Hubz are independent general-purpose websites that not only connect with their associated members and viewers, but also connect together to exchange personal communications and other information with each other.
This allows hub members on any hub to securely and privately share anything; with anybody, on any hub - anywhere; or share stuff publicly with anybody on the internet if desired.
**What is Hubzilla?**
**Hubzilla** is the server software which makes this possible. It is a sophisticated and unique combination of an open source content management system and a decentralised identity, communications, and permissions framework and protocol suite, built using common webserver technology (PHP/MySQL/Apache and popular variants). The end result is a level of systems integration, privacy control, and communications features that you wouldn't think are possible in either a content management system or a decentralised communications network. It also brings a new level of cooperation and privacy to the web and introduces the concept of personally owned "single sign-on" to web services across the entire internet.
Hubzilla is a general purpose communication server integrated with a web publishing system and a decentralised permission system. If this sounds like a bunch of technical mumbo-jumbo to you, just think of it as an independent platform for sharing stuff online.
Hubzilla hubz are
Hubzilla contains some social network bits, some cloud storage bits, some blog and forum bits, and some content management bits. These are all integrated within a common privacy framework - and it is all decentralised.
* decentralised
* inherently social
* optionally inter-networked with other hubz
* privacy-enabled (privacy exclusions work across the entire internet to any registered identity on any compatible hubz)
Everything you publish or share can be restricted to those channels and people you wish to share them with; and these permissions work completely invisibly - even with channels on different servers or other communications services.
Possible website applications include
Migration and live backups of your connections, settings, and everything you publish are built-in, so you never need worry about server failure.
* decentralised social networking nodes
* personal cloud storage
* file dropboxes
* managing organisational communications and activities
* collaboration and community decision-making
* small business websites
* public and private media/file libraries
* blogs
* event promotion
* feed aggregation and republishing
* forums
* dating websites
* pretty much anything you can do on a traditional blog or community website, but that you could do better if you could easily connect it with other websites or privately share things across website boundaries.
Hubzilla is completely decentralised and open source, for you modify or adapt to your needs and desires. Plugins, themes, and numerous configuration options extend the overall capabilities to do anything you can imagine.
<p align="center" markdown="1">
<em><a href="https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt">Installing Hubzilla</a></em>
</p>
**Who Are We and What Are Our Principles?**
The Hubzilla community is powered by passionate volunteers creating an open source **commons** of decentralised services which are highly integrated and can rival the feature set of centralised providers. We are open to sponsorship and donations to cover expenses and compensate for our time and energy, however the project core is basically non-profit and is not designed for the purpose of commercial gain or exploitation.
Some sites may include monetisation strategies such as subscriptions and *freemium* models where members pay for resources they consume beyond a basic level. The project community supports such monetisation initiatives (nobody should be forced to pay "out of pocket" to provide a service to others), but we maintain the **commons** to provide open and free access of the software to all.
The software is not designed for data collection of its members or providing advertising. We don't have a need or desire for these things and feel that software built around these goals is poorly designed and represents compromised principles and ethics.
As a project, we are inclusive of all beliefs and cultures and do what we are able to provide an environment that is free from hostility and harrassment. Whether or not we succeed in this endaevour requires constant vigilance and help from all members of the community, working together to build an inter-networking tool with amazing potential.
**Who Are We?**
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](https://travis-ci.org/redmatrix/hubzilla.svg)](https://travis-ci.org/redmatrix/hubzilla)

View File

@@ -7,6 +7,9 @@ use Zotlabs\Lib as Zlib;
class PermissionRoles {
static public function version() {
return 2;
}
static function role_perms($role) {
@@ -22,7 +25,7 @@ class PermissionRoles {
$ret['online'] = true;
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'send_stream', 'post_wall', 'post_comments',
'view_pages', 'view_wiki', 'send_stream', 'post_wall', 'post_comments',
'post_mail', 'chat', 'post_like', 'republish' ];
$ret['limits'] = PermissionLimits::Std_Limits();
@@ -35,7 +38,7 @@ class PermissionRoles {
$ret['online'] = true;
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'send_stream', 'post_wall', 'post_comments',
'view_pages', 'view_wiki', 'send_stream', 'post_wall', 'post_comments',
'post_mail', 'chat', 'post_like' ];
$ret['limits'] = PermissionLimits::Std_Limits();
@@ -49,7 +52,7 @@ class PermissionRoles {
$ret['online'] = false;
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'send_stream', 'post_wall', 'post_comments',
'view_pages', 'view_wiki', 'send_stream', 'post_wall', 'post_comments',
'post_mail', 'post_like' ];
$ret['limits'] = PermissionLimits::Std_Limits();
$ret['limits']['view_contacts'] = PERMS_SPECIFIC;
@@ -64,7 +67,7 @@ class PermissionRoles {
$ret['online'] = false;
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'post_wall', 'post_comments', 'tag_deliver',
'view_pages', 'view_wiki', 'post_wall', 'post_comments', 'tag_deliver',
'post_mail', 'post_like' , 'republish', 'chat' ];
$ret['limits'] = PermissionLimits::Std_Limits();
@@ -77,7 +80,7 @@ class PermissionRoles {
$ret['online'] = false;
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'post_wall', 'post_comments', 'tag_deliver',
'view_pages', 'view_wiki', 'post_wall', 'post_comments', 'tag_deliver',
'post_mail', 'post_like' , 'chat' ];
$ret['limits'] = PermissionLimits::Std_Limits();
@@ -92,7 +95,7 @@ class PermissionRoles {
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'post_wall', 'post_comments',
'view_pages', 'view_wiki', 'post_wall', 'post_comments',
'post_mail', 'post_like' , 'chat' ];
$ret['limits'] = PermissionLimits::Std_Limits();
@@ -100,6 +103,7 @@ class PermissionRoles {
$ret['limits']['view_contacts'] = PERMS_SPECIFIC;
$ret['limits']['view_storage'] = PERMS_SPECIFIC;
$ret['limits']['view_pages'] = PERMS_SPECIFIC;
$ret['limits']['view_wiki'] = PERMS_SPECIFIC;
break;
@@ -111,7 +115,7 @@ class PermissionRoles {
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'send_stream', 'post_wall', 'post_comments',
'view_pages', 'view_wiki', 'send_stream', 'post_wall', 'post_comments',
'post_mail', 'post_like' , 'republish' ];
$ret['limits'] = PermissionLimits::Std_Limits();
@@ -125,7 +129,7 @@ class PermissionRoles {
$ret['online'] = false;
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'send_stream', 'post_wall', 'post_comments',
'view_pages', 'view_wiki', 'send_stream', 'post_wall', 'post_comments',
'post_mail', 'post_like' , 'republish' ];
$ret['limits'] = PermissionLimits::Std_Limits();
@@ -140,7 +144,7 @@ class PermissionRoles {
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'post_like' , 'republish' ];
'view_pages', 'view_wiki', 'post_like' , 'republish' ];
$ret['limits'] = PermissionLimits::Std_Limits();
@@ -154,12 +158,13 @@ class PermissionRoles {
$ret['perms_connect'] = [
'view_stream', 'view_profile', 'view_contacts', 'view_storage',
'view_pages', 'write_storage', 'write_pages', 'post_wall', 'post_comments', 'tag_deliver',
'post_mail', 'post_like' , 'republish', 'chat' ];
'view_pages', 'view_wiki', 'write_storage', 'write_pages', 'post_wall', 'post_comments', 'tag_deliver',
'post_mail', 'post_like' , 'republish', 'chat', 'write_wiki' ];
$ret['limits'] = PermissionLimits::Std_Limits();
break;
case 'custom':
default:
break;
}
@@ -174,7 +179,68 @@ class PermissionRoles {
return $ret;
}
static public function new_custom_perms($uid,$perm,$abooks) {
// set permissionlimits for this permission here, for example:
// if($perm === 'mynewperm')
// \Zotlabs\Access\PermissionLimits::Set($uid,$perm,1);
if($perm === 'view_wiki')
\Zotlabs\Access\PermissionLimits::Set($uid,$perm,PERMS_PUBLIC);
if($perm === 'write_wiki')
\Zotlabs\Access\PermissionLimits::Set($uid,$perm,PERMS_SPECIFIC);
// set autoperms here if applicable
// choices are to set to 0, 1, or the value of an existing perm
if(get_pconfig($uid,'system','autoperms')) {
$c = channelx_by_n($uid);
$value = 0;
// if($perm === 'mynewperm')
// $value = get_abconfig($uid,$c['channel_hash'],'autoperms','someexistingperm');
if($perm === 'view_wiki')
$value = get_abconfig($uid,$c['channel_hash'],'autoperms','view_pages');
if($perm === 'write_wiki')
$value = get_abconfig($uid,$c['channel_hash'],'autoperms','write_pages');
if($c) {
set_abconfig($uid,$c['channel_hash'],'autoperms',$perm,$value);
}
}
// now set something for all existing connections.
if($abooks) {
foreach($abooks as $ab) {
switch($perm) {
// case 'mynewperm':
// choices are to set to 1, set to 0, or clone an existing perm
// set_abconfig($uid,$ab['abook_xchan'],'my_perms',$perm,
// intval(get_abconfig($uid,$ab['abook_xchan'],'my_perms','someexistingperm')));
case 'view_wiki':
set_abconfig($uid,$ab['abook_xchan'],'my_perms',$perm,
intval(get_abconfig($uid,$ab['abook_xchan'],'my_perms','view_pages')));
case 'write_wiki':
set_abconfig($uid,$ab['abook_xchan'],'my_perms',$perm,
intval(get_abconfig($uid,$ab['abook_xchan'],'my_perms','write_pages')));
default:
break;
}
}
}
}
static public function roles() {
@@ -210,6 +276,4 @@ class PermissionRoles {
return $roles;
}
}

View File

@@ -10,9 +10,20 @@ class Permissions {
/**
* Extensible permissions.
* To add new permissions, add to the list of $perms below, with a simple description.
*
* Also visit PermissionRoles.php and add to the $ret['perms_connect'] property for any role
* if this permission should be granted to new connections.
*
* Next look at PermissionRoles::new_custom_perms() and provide a handler for updating custom
* permission roles. You will want to set a default PermissionLimit for each channel and also
* provide a sane default for any existing connections. You may or may not wish to provide a
* default auto permission. If in doubt, leave this alone as custom permissions by definition
* are the responsibility of the channel owner to manage. You just don't want to create any
* suprises or break things so you have an opportunity to provide sane settings.
*
* Update the version here and in PermissionRoles
*
*
* Permissions with 'view' in the name are considered read permissions. Anything
* else requires authentication. Read permission limits are PERMS_PUBLIC and anything else
* is given PERMS_SPECIFIC.
@@ -23,6 +34,11 @@ class Permissions {
*
*/
static public function version() {
// This must match the version in PermissionRoles.php before permission updates can run.
return 2;
}
static public function Perms($filter = '') {
@@ -34,7 +50,9 @@ class Permissions {
'view_storage' => t('Can view my file storage and photos'),
'write_storage' => t('Can upload/modify my file storage and photos'),
'view_pages' => t('Can view my channel webpages'),
'view_wiki' => t('Can view my wiki pages'),
'write_pages' => t('Can create/edit my channel webpages'),
'write_wiki' => t('Can write to my wiki pages'),
'post_wall' => t('Can post on my channel (wall) page'),
'post_comments' => t('Can comment on or like my posts'),
'post_mail' => t('Can send me private mail messages'),
@@ -76,6 +94,10 @@ class Permissions {
// Undeclared permissions are set to 0
static public function FilledPerms($arr) {
if(is_null($arr)) {
btlogger('FilledPerms: null');
}
$everything = self::Perms();
$ret = [];
foreach($everything as $k => $v) {
@@ -88,6 +110,17 @@ class Permissions {
}
static public function OPerms($arr) {
$ret = [];
if($arr) {
foreach($arr as $k => $v) {
$ret[] = [ 'name' => $k, 'value' => $v ];
}
}
return $ret;
}
static public function FilledAutoperms($channel_id) {
if(! intval(get_pconfig($channel_id,'system','autoperms')))
return false;
@@ -98,7 +131,7 @@ class Permissions {
);
if($r) {
foreach($r as $rr) {
$arr[$rr['k']] = $arr[$rr['v']];
$arr[$rr['k']] = intval($rr['v']);
}
}
return $arr;
@@ -113,4 +146,76 @@ class Permissions {
}
return true;
}
static public function connect_perms($channel_id) {
$my_perms = [];
$permcat = null;
$automatic = 0;
// If a default permcat exists, use that
$pc = ((feature_enabled($channel_id,'permcats')) ? get_pconfig($channel_id,'system','default_permcat') : 'default');
if(! in_array($pc, [ '','default' ])) {
$pcp = new Zlib\Permcat($channel_id);
$permcat = $pcp->fetch($pc);
if($permcat && $permcat['perms']) {
foreach($permcat['perms'] as $p) {
$my_perms[$p['name']] = $p['value'];
}
}
}
// look up the permission role to see if it specified auto-connect
// and if there was no permcat or a default permcat, set the perms
// from the role
$role = get_pconfig($channel_id,'system','permissions_role');
if($role) {
$xx = PermissionRoles::role_perms($role);
if($xx['perms_auto'])
$automatic = 1;
if((! $my_perms) && ($xx['perms_connect'])) {
$default_perms = $xx['perms_connect'];
$my_perms = Permissions::FilledPerms($default_perms);
}
}
// If we reached this point without having any permission information,
// it is likely a custom permissions role. First see if there are any
// automatic permissions.
if(! $my_perms) {
$m = Permissions::FilledAutoperms($channel_id);
if($m) {
$automatic = 1;
$my_perms = $m;
}
}
// If we reached this point with no permissions, the channel is using
// custom perms but they are not automatic. They will be stored in abconfig with
// the channel's channel_hash (the 'self' connection).
if(! $my_perms) {
$r = q("select channel_hash from channel where channel_id = %d",
intval($channel_id)
);
if($r) {
$x = q("select * from abconfig where chan = %d and xchan = '%s' and cat = 'my_perms'",
intval($channel_id),
dbesc($r[0]['channel_hash'])
);
if($x) {
foreach($x as $xv) {
$my_perms[$xv['k']] = intval($xv['v']);
}
}
}
}
return ( [ 'perms' => $my_perms, 'automatic' => $automatic ] );
}
}

14
Zotlabs/Daemon/Addon.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
namespace Zotlabs\Daemon;
require_once('include/zot.php');
class Addon {
static public function run($argc,$argv) {
call_hooks('daemon_addon',$argv);
}
}

View File

@@ -3,7 +3,6 @@
namespace Zotlabs\Daemon;
require_once('include/zot.php');
require_once('include/hubloc.php');
class Checksites {

View File

@@ -43,16 +43,15 @@ class Cron {
// expire any expired mail
q("delete from mail where expires != '%s' and expires < %s ",
q("delete from mail where expires > '%s' and expires < %s ",
dbesc(NULL_DATE),
db_utcnow()
);
// expire any expired items
$r = q("select id from item where expires != '%s' and expires < %s
$r = q("select id from item where expires > '2001-01-01 00:00:00' and expires < %s
and item_deleted = 0 ",
dbesc(NULL_DATE),
db_utcnow()
);
if($r) {
@@ -64,7 +63,7 @@ class Cron {
// delete expired access tokens
$r = q("select atoken_id from atoken where atoken_expires != '%s' && atoken_expires < %s",
$r = q("select atoken_id from atoken where atoken_expires > '%s' and atoken_expires < %s",
dbesc(NULL_DATE),
db_utcnow()
);

View File

@@ -76,7 +76,6 @@ class Cron_daily {
Master::Summon(array('Expire'));
Master::Summon(array('Cli_suggest'));
require_once('include/hubloc.php');
remove_obsolete_hublocs();
call_hooks('cron_daily',datetime_convert());

View File

@@ -17,7 +17,6 @@ class Cron_weekly {
z_check_cert();
require_once('include/hubloc.php');
prune_hub_reinstalls();
mark_orphan_hubsxchans();

View File

@@ -58,7 +58,7 @@ class Externals {
}
if($url) {
if($r[0]['site_pull'] !== NULL_DATE)
if($r[0]['site_pull'] > NULL_DATE)
$mindate = urlencode(datetime_convert('','',$r[0]['site_pull'] . ' - 1 day'));
else {
$days = get_config('externals','since_days');

View File

@@ -24,8 +24,7 @@ class Master {
static public function Release($argc,$argv) {
cli_startup();
logger('Master: release: ' . print_r($argv,true), LOGGER_ALL,LOG_DEBUG);
require_once('Zotlabs/Daemon/' . $argv[0] . '.php');
$cls = '\\Zotlabs\\Daemon\\' . $argv[0];
$cls::run($argc,$argv);
}
}
}

View File

@@ -4,6 +4,7 @@ namespace Zotlabs\Daemon;
require_once('include/queue_fn.php');
require_once('include/html2plain.php');
require_once('include/conversation.php');
/*
* This file was at one time responsible for doing all deliveries, but this caused
@@ -120,7 +121,7 @@ class Notifier {
$normal_mode = false;
$mail = true;
$private = true;
$message = q("SELECT * FROM `mail` WHERE `id` = %d LIMIT 1",
$message = q("SELECT * FROM mail WHERE id = %d LIMIT 1",
intval($item_id)
);
if(! $message) {
@@ -238,7 +239,7 @@ class Notifier {
$channel = $s[0];
$uid = $item_id;
$recipients = array();
$r = q("select abook_xchan from abook where abook_channel = %d",
$r = q("select abook_xchan from abook where abook_channel = %d and abook_self = 0",
intval($item_id)
);
if($r) {
@@ -371,12 +372,13 @@ class Notifier {
if(! $encoded_item['flags'])
$encoded_item['flags'] = array();
$encoded_item['flags'][] = 'relay';
$upstream = true;
}
else {
logger('notifier: normal distribution', LOGGER_DEBUG);
if($cmd === 'relay')
logger('notifier: owner relay');
$upstream = false;
// if our parent is a tag_delivery recipient, uplink to the original author causing
// a delivery fork.
@@ -445,6 +447,7 @@ class Notifier {
$narr = array(
'channel' => $channel,
'upstream' => $upstream,
'env_recips' => $env_recips,
'packet_recips' => $packet_recips,
'recipients' => $recipients,
@@ -488,7 +491,7 @@ class Notifier {
// Now we have collected recipients (except for external mentions, FIXME)
// Let's reduce this to a set of hubs.
$r = q("select * from hubloc where hubloc_hash in (" . implode(',',$recipients) . ")
$r = q("select hubloc.*, site.site_crypto from hubloc left join site on site_url = hubloc_url where hubloc_hash in (" . implode(',',$recipients) . ")
and hubloc_error = 0 and hubloc_deleted = 0"
);
@@ -546,6 +549,7 @@ class Notifier {
$narr = array(
'channel' => $channel,
'upstream' => $upstream,
'env_recips' => $env_recips,
'packet_recips' => $packet_recips,
'recipients' => $recipients,
@@ -599,8 +603,8 @@ class Notifier {
$packet = zot_build_packet($channel,$packet_type,(($packet_recips) ? $packet_recips : null));
}
elseif($packet_type === 'request') {
$packet = zot_build_packet($channel,$packet_type,$env_recips,$hub['hubloc_sitekey'],$hash,
array('message_id' => $request_message_id)
$packet = zot_build_packet($channel,$packet_type,$env_recips,$hub['hubloc_sitekey'],$hub['site_crypto'],
$hash, array('message_id' => $request_message_id)
);
}
@@ -614,7 +618,7 @@ class Notifier {
));
}
else {
$packet = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash);
$packet = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
queue_insert(array(
'hash' => $hash,
'account_id' => $target_item['aid'],

View File

@@ -54,7 +54,7 @@ class Onepoll {
logger("onepoll: poll: ({$contact['id']}) IMPORTER: {$importer['xchan_name']}, CONTACT: {$contact['xchan_name']}");
$last_update = ((($contact['abook_updated'] === $contact['abook_created']) || ($contact['abook_updated'] === NULL_DATE))
$last_update = ((($contact['abook_updated'] === $contact['abook_created']) || ($contact['abook_updated'] <= NULL_DATE))
? datetime_convert('UTC','UTC','now - 7 days')
: datetime_convert('UTC','UTC',$contact['abook_updated'] . ' - 2 days')
);
@@ -102,11 +102,20 @@ class Onepoll {
$fetch_feed = true;
$x = null;
// They haven't given us permission to see their stream
$can_view_stream = intval(get_abconfig($importer_uid,$contact['abook_xchan'],'their_perms','view_stream'));
if(! $can_view_stream)
$fetch_feed = false;
// we haven't given them permission to send us their stream
$can_send_stream = intval(get_abconfig($importer_uid,$contact['abook_xchan'],'my_perms','send_stream'));
if(! $can_send_stream)
$fetch_feed = false;
if($fetch_feed) {
$feedurl = str_replace('/poco/','/zotfeed/',$contact['xchan_connurl']);

View File

@@ -117,7 +117,7 @@ class Poller {
// if we've never connected with them, start the mark for death countdown from now
if($c == NULL_DATE) {
if($c <= NULL_DATE) {
$r = q("update abook set abook_connected = '%s' where abook_id = %d",
dbesc(datetime_convert()),
intval($contact['abook_id'])
@@ -171,7 +171,7 @@ class Poller {
}
if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) {
$r = q("SELECT u.ud_addr, u.ud_id, u.ud_last FROM updates AS u INNER JOIN (SELECT ud_addr, max(ud_id) AS ud_id FROM updates WHERE ( ud_flags & %d ) = 0 AND ud_addr != '' AND ( ud_last = '%s' OR ud_last > %s - INTERVAL %s ) GROUP BY ud_addr) AS s ON s.ud_id = u.ud_id ",
$r = q("SELECT u.ud_addr, u.ud_id, u.ud_last FROM updates AS u INNER JOIN (SELECT ud_addr, max(ud_id) AS ud_id FROM updates WHERE ( ud_flags & %d ) = 0 AND ud_addr != '' AND ( ud_last <= '%s' OR ud_last > %s - INTERVAL %s ) GROUP BY ud_addr) AS s ON s.ud_id = u.ud_id ",
intval(UPDATE_FLAGS_UPDATED),
dbesc(NULL_DATE),
db_utcnow(), db_quoteinterval('7 DAY')
@@ -182,7 +182,7 @@ class Poller {
// If they didn't respond when we attempted before, back off to once a day
// After 7 days we won't bother anymore
if($rr['ud_last'] != NULL_DATE)
if($rr['ud_last'] > NULL_DATE)
if($rr['ud_last'] > datetime_convert('UTC','UTC', 'now - 1 day'))
continue;
Master::Summon(array('Onedirsync',$rr['ud_id']));

View File

@@ -61,30 +61,15 @@ class Queue {
// the site is permanently down, there's no reason to attempt delivery at all, or at most not more than once
// or twice a day.
// FIXME: can we sort postgres on outq_priority and maintain the 'distinct' ?
// The order by max(outq_priority) might be a dodgy query because of the group by.
// The desired result is to return a sequence in the order most likely to be delivered in this run.
// If a hub has already been sitting in the queue for a few days, they should be delivered last;
// hence every failure should drop them further down the priority list.
if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
$prefix = 'DISTINCT ON (outq_posturl)';
$suffix = 'ORDER BY outq_posturl';
} else {
$prefix = '';
$suffix = 'GROUP BY outq_posturl ORDER BY max(outq_priority)';
}
$r = q("SELECT $prefix * FROM outq WHERE outq_delivered = 0 and (( outq_created > %s - INTERVAL %s and outq_updated < %s - INTERVAL %s ) OR ( outq_updated < %s - INTERVAL %s )) $suffix",
db_utcnow(), db_quoteinterval('12 HOUR'),
db_utcnow(), db_quoteinterval('15 MINUTE'),
db_utcnow(), db_quoteinterval('1 HOUR')
$r = q("SELECT * FROM outq WHERE outq_delivered = 0 and outq_scheduled < %s ",
db_utcnow()
);
}
if(! $r)
return;
foreach($r as $rr) {
queue_deliver($rr);
foreach($r as $rv) {
queue_deliver($rv);
}
}
}

View File

@@ -77,7 +77,7 @@ class Ratenotif {
continue;
$hash = random_string();
$n = zot_build_packet($channel,'notify',null,null,$hash);
$n = zot_build_packet($channel,'notify',null,null,'',$hash);
queue_insert(array(
'hash' => $hash,

View File

@@ -10,7 +10,7 @@ class Hook {
$function = serialize($function);
}
$r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `fn` = '%s' and priority = %d and hook_version = %d LIMIT 1",
$r = q("SELECT * FROM hook WHERE hook = '%s' AND file = '%s' AND fn = '%s' and priority = %d and hook_version = %d LIMIT 1",
dbesc($hook),
dbesc($file),
dbesc($function),
@@ -23,13 +23,13 @@ class Hook {
// To aid in upgrade and transition, remove old settings for any registered hooks that match in all respects except
// for priority or hook_version
$r = q("DELETE FROM `hook` where `hook` = '%s' and `file` = '%s' and `fn` = '%s'",
$r = q("DELETE FROM hook where hook = '%s' and file = '%s' and fn = '%s'",
dbesc($hook),
dbesc($file),
dbesc($function)
);
$r = q("INSERT INTO `hook` (`hook`, `file`, `fn`, `priority`, `hook_version`) VALUES ( '%s', '%s', '%s', %d, %d )",
$r = q("INSERT INTO hook (hook, file, fn, priority, hook_version) VALUES ( '%s', '%s', '%s', %d, %d )",
dbesc($hook),
dbesc($file),
dbesc($function),
@@ -44,7 +44,7 @@ class Hook {
if(is_array($function)) {
$function = serialize($function);
}
$r = q("DELETE FROM hook WHERE hook = '%s' AND `file` = '%s' AND `fn` = '%s' and priority = %d and hook_version = %d",
$r = q("DELETE FROM hook WHERE hook = '%s' AND file = '%s' AND fn = '%s' and priority = %d and hook_version = %d",
dbesc($hook),
dbesc($file),
dbesc($function),
@@ -60,7 +60,7 @@ class Hook {
static public function unregister_by_file($file) {
$r = q("DELETE FROM hook WHERE `file` = '%s' ",
$r = q("DELETE FROM hook WHERE file = '%s' ",
dbesc($file)
);

View File

@@ -10,12 +10,12 @@ class AConfig {
return XConfig::Load('a_' . $account_id);
}
static public function Get($account_id,$family,$key) {
return XConfig::Get('a_' . $account_id,$family,$key);
static public function Get($account_id,$family,$key,$default = false) {
return XConfig::Get('a_' . $account_id,$family,$key, $default);
}
static public function Set($account_id,$family,$key,$value) {
return XConfig::Get('a_' . $account_id,$family,$key,$value);
return XConfig::Set('a_' . $account_id,$family,$key,$value);
}
static public function Delete($account_id,$family,$key) {

View File

@@ -16,7 +16,7 @@ class AbConfig {
}
static public function Get($chan,$xhash,$family,$key) {
static public function Get($chan,$xhash,$family,$key, $default = false) {
$r = q("select * from abconfig where chan = %d and xchan = '%s' and cat = '%s' and k = '%s' limit 1",
intval($chan),
dbesc($xhash),
@@ -26,7 +26,7 @@ class AbConfig {
if($r) {
return ((preg_match('|^a:[0-9]+:{.*}$|s', $r[0]['v'])) ? unserialize($r[0]['v']) : $r[0]['v']);
}
return false;
return $default;
}

View File

@@ -0,0 +1,24 @@
<?php
namespace Zotlabs\Lib;
class Api_router {
static private $routes = array();
static function register($path,$fn,$auth_required) {
self::$routes[$path] = [ 'func' => $fn, 'auth' => $auth_required ];
}
static function find($path) {
if(array_key_exists($path,self::$routes))
return self::$routes[$path];
return null;
}
static function dbg() {
return self::$routes;
}
}

View File

@@ -38,6 +38,7 @@ class Apps {
if(plugin_is_installed($plugin)) {
$x = self::parse_app_description($f,$translate);
if($x) {
$x['plugin'] = $plugin;
$ret[] = $x;
}
}
@@ -54,7 +55,6 @@ class Apps {
return;
$apps = self::get_system_apps(false);
self::$installed_system_apps = q("select * from app where app_system = 1 and app_channel = %d",
intval(local_channel())
);
@@ -68,7 +68,7 @@ class Apps {
if($id !== true) {
// if we already installed this app, but it changed, preserve any categories we created
$s = '';
$r = q("select * from term where otype = %d and oid = d",
$r = q("select * from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($id)
);
@@ -102,17 +102,19 @@ class Apps {
foreach(self::$installed_system_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']);
}
}
}
return $notfound;
}
static public function app_name_compare($a,$b) {
return strcmp($a['name'],$b['name']);
return strcasecmp($a['name'],$b['name']);
}
@@ -144,8 +146,11 @@ class Apps {
$ret['type'] = 'system';
foreach($ret as $k => $v) {
if(strpos($v,'http') === 0)
$ret[$k] = zid($v);
if(strpos($v,'http') === 0) {
if(! (local_channel() && strpos($v,z_root()) === 0)) {
$ret[$k] = zid($v);
}
}
}
if(array_key_exists('desc',$ret))
@@ -157,6 +162,8 @@ class Apps {
if(array_key_exists('version',$ret))
$ret['version'] = str_replace(array('\'','"'),array('&#39;','&dquot;'),$ret['version']);
if(array_key_exists('categories',$ret))
$ret['categories'] = str_replace(array('\'','"'),array('&#39;','&dquot;'),$ret['categories']);
if(array_key_exists('requires',$ret)) {
$requires = explode(',',$ret['requires']);
@@ -203,7 +210,7 @@ class Apps {
static public function translate_system_apps(&$arr) {
$apps = array(
'Site Admin' => t('Site Admin'),
'Bug Report' => t('Bug Report'),
'Report Bug' => t('Report Bug'),
'View Bookmarks' => t('View Bookmarks'),
'My Chatrooms' => t('My Chatrooms'),
'Connections' => t('Connections'),
@@ -238,9 +245,9 @@ class Apps {
'Profile Photo' => t('Profile Photo')
);
if(array_key_exists($arr['name'],$apps))
if(array_key_exists($arr['name'],$apps)) {
$arr['name'] = $apps[$arr['name']];
}
}
@@ -255,6 +262,7 @@ class Apps {
* list: normal mode for viewing an app on the app page
* no buttons are shown
* edit: viewing the app page in editing mode provides a delete button
* nav: render apps for app-bin
*/
$installed = false;
@@ -267,14 +275,20 @@ class Apps {
self::translate_system_apps($papp);
if(($papp['plugin']) && (! plugin_is_installed($papp['plugin'])))
return '';
$papp['papp'] = self::papp_encode($papp);
if(! strstr($papp['url'],'://'))
$papp['url'] = z_root() . ((strpos($papp['url'],'/') === 0) ? '' : '/') . $papp['url'];
foreach($papp as $k => $v) {
if(strpos($v,'http') === 0 && $k != 'papp')
$papp[$k] = zid($v);
if(strpos($v,'http') === 0 && $k != 'papp') {
if(! (local_channel() && strpos($v,z_root()) === 0)) {
$papp[$k] = zid($v);
}
}
if($k === 'desc')
$papp['desc'] = str_replace(array('\'','"'),array('&#39;','&dquot;'),$papp['desc']);
@@ -332,14 +346,23 @@ class Apps {
}
$install_action = (($installed) ? t('Update') : t('Install'));
$icon = ((strpos($papp['photo'],'icon:') === 0) ? substr($papp['photo'],5) : '');
return replace_macros(get_markup_template('app.tpl'),array(
'$app' => $papp,
'$icon' => $icon,
'$hosturl' => $hosturl,
'$purchase' => (($papp['page'] && (! $installed)) ? t('Purchase') : ''),
'$install' => (($hosturl && $mode == 'view') ? $install_action : ''),
'$edit' => ((local_channel() && $installed && $mode == 'edit') ? t('Edit') : ''),
'$delete' => ((local_channel() && $installed && $mode == 'edit') ? t('Delete') : '')
'$delete' => ((local_channel() && $installed && $mode == 'edit') ? t('Delete') : ''),
'$undelete' => ((local_channel() && $installed && $mode == 'edit') ? t('Undelete') : ''),
'$deleted' => $papp['deleted'],
'$feature' => (($papp['embed']) ? false : true),
'$featured' => ((strpos($papp['categories'], 'nav_featured_app') === false) ? false : true),
'$navapps' => (($mode == 'nav') ? true : false),
'$add' => t('Add to app-tray'),
'$remove' => t('Remove from app-tray')
));
}
@@ -359,7 +382,7 @@ class Apps {
if($r) {
if(! $r[0]['app_system']) {
if($app['categories'] && (! $app['term'])) {
$r[0]['term'] = q("select * from term where otype = %d and oid = d",
$r[0]['term'] = q("select * from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($r[0]['id'])
);
@@ -382,36 +405,82 @@ class Apps {
intval($uid)
);
if($x) {
$x[0]['app_deleted'] = 1;
q("delete from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($x[0]['id'])
);
if($x[0]['app_system']) {
$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_deleted'])) {
$x[0]['app_deleted'] = 1;
q("delete from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($x[0]['id'])
);
if($x[0]['app_system']) {
$r = q("update app set app_deleted = 1 where app_id = '%s' and app_channel = %d",
dbesc($app['guid']),
intval($uid)
);
}
else {
$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));
}
}
else {
$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));
self::app_undestroy($uid,$app);
}
}
}
}
static public function app_undestroy($uid,$app) {
// undelete a system app
if($uid && $app['guid']) {
$x = q("select * from app where app_id = '%s' and app_channel = %d limit 1",
dbesc($app['guid']),
intval($uid)
);
if($x) {
if($x[0]['app_system']) {
$r = q("update app set app_deleted = 0 where app_id = '%s' and app_channel = %d",
dbesc($app['guid']),
intval($uid)
);
}
}
}
}
static public function app_feature($uid,$app) {
$r = q("select id from app where app_id = '%s' and app_channel = %d limit 1",
dbesc($app['guid']),
intval($uid)
);
$x = q("select * from term where otype = %d and oid = %d and term = 'nav_featured_app' limit 1",
intval(TERM_OBJ_APP),
intval($r[0]['id'])
);
if($x) {
q("delete from term where otype = %d and oid = %d and term = 'nav_featured_app'",
intval(TERM_OBJ_APP),
intval($x[0]['oid'])
);
}
else {
store_item_tag($uid,$r[0]['id'],TERM_OBJ_APP,TERM_CATEGORY,'nav_featured_app',escape_tags(z_root() . '/apps/?f=&cat=nav_featured_app'));
}
}
static public function app_installed($uid,$app) {
$r = q("select id from app where app_id = '%s' and app_version = '%s' and app_channel = %d limit 1",
$r = q("select id from app where app_id = '%s' and app_channel = %d limit 1",
dbesc((array_key_exists('guid',$app)) ? $app['guid'] : ''),
dbesc((array_key_exists('version',$app)) ? $app['version'] : ''),
intval($uid)
);
return(($r) ? true : false);
@@ -421,7 +490,7 @@ class Apps {
static public function app_list($uid, $deleted = false, $cat = '') {
if($deleted)
$sql_extra = " and app_deleted = 1 ";
$sql_extra = "";
else
$sql_extra = " and app_deleted = 0 ";
@@ -445,6 +514,7 @@ class Apps {
$r = q("select * from app where app_channel = %d $sql_extra order by app_name asc",
intval($uid)
);
if($r) {
for($x = 0; $x < count($r); $x ++) {
if(! $r[$x]['app_system'])
@@ -455,6 +525,7 @@ class Apps {
);
}
}
return($r);
}
@@ -467,7 +538,7 @@ class Apps {
static public function app_store($arr) {
// logger('app_store: ' . print_r($arr,true));
//logger('app_store: ' . print_r($arr,true));
$darray = array();
$ret = array('success' => false);
@@ -478,7 +549,7 @@ class Apps {
if((! $darray['app_url']) || (! $darray['app_channel']))
return $ret;
if($arr['photo'] && ! strstr($arr['photo'],z_root())) {
if($arr['photo'] && (strpos($arr['photo'],'icon:') !== 0) && (! strstr($arr['photo'],z_root()))) {
$x = import_xchan_photo($arr['photo'],get_observer_hash(),true);
$arr['photo'] = $x[1];
}
@@ -494,13 +565,14 @@ class Apps {
$darray['app_addr'] = ((x($arr,'addr')) ? escape_tags($arr['addr']) : '');
$darray['app_price'] = ((x($arr,'price')) ? escape_tags($arr['price']) : '');
$darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : '');
$darray['app_plugin'] = ((x($arr,'plugin')) ? escape_tags($arr['plugin']) : '');
$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);
$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_deleted ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %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 ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', %d )",
dbesc($darray['app_id']),
dbesc($darray['app_sig']),
dbesc($darray['app_author']),
@@ -517,6 +589,7 @@ class Apps {
dbesc($created),
dbesc($created),
intval($darray['app_system']),
dbesc($darray['app_plugin']),
intval($darray['app_deleted'])
);
if($r) {
@@ -545,6 +618,7 @@ class Apps {
static public function app_update($arr) {
//logger('app_update: ' . print_r($arr,true));
$darray = array();
$ret = array('success' => false);
@@ -555,7 +629,7 @@ class Apps {
if((! $darray['app_url']) || (! $darray['app_channel']) || (! $darray['app_id']))
return $ret;
if($arr['photo'] && ! strstr($arr['photo'],z_root())) {
if($arr['photo'] && (strpos($arr['photo'],'icon:') !== 0) && (! strstr($arr['photo'],z_root()))) {
$x = import_xchan_photo($arr['photo'],get_observer_hash(),true);
$arr['photo'] = $x[1];
}
@@ -569,13 +643,14 @@ class Apps {
$darray['app_addr'] = ((x($arr,'addr')) ? escape_tags($arr['addr']) : '');
$darray['app_price'] = ((x($arr,'price')) ? escape_tags($arr['price']) : '');
$darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : '');
$darray['app_plugin'] = ((x($arr,'plugin')) ? escape_tags($arr['plugin']) : '');
$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);
$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_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 where app_id = '%s' and app_channel = %d",
dbesc($darray['app_sig']),
dbesc($darray['app_author']),
dbesc($darray['app_name']),
@@ -589,6 +664,7 @@ class Apps {
dbesc($darray['app_requires']),
dbesc($edited),
intval($darray['app_system']),
dbesc($darray['app_plugin']),
intval($darray['app_deleted']),
dbesc($darray['app_id']),
intval($darray['app_channel'])
@@ -655,6 +731,9 @@ class Apps {
if($app['app_photo'])
$ret['photo'] = $app['app_photo'];
if($app['app_icon'])
$ret['icon'] = $app['app_icon'];
if($app['app_version'])
$ret['version'] = $app['app_version'];
@@ -673,6 +752,9 @@ class Apps {
if($app['app_system'])
$ret['system'] = $app['app_system'];
if($app['app_plugin'])
$ret['plugin'] = $app['app_plugin'];
if($app['app_deleted'])
$ret['deleted'] = $app['app_deleted'];
@@ -690,6 +772,8 @@ class Apps {
if(! $embed)
return $ret;
$ret['embed'] = true;
if(array_key_exists('categories',$ret))
unset($ret['categories']);

View File

@@ -98,13 +98,13 @@ class Config {
* @return mixed Return value or false on error or if not set
*/
static public function Get($family,$key) {
static public function Get($family,$key,$default = false) {
if((! array_key_exists($family, \App::$config)) || (! array_key_exists('config_loaded', \App::$config[$family])))
self::Load($family);
if(array_key_exists('config_loaded', \App::$config[$family])) {
if(! array_key_exists($key, \App::$config[$family])) {
return false;
return $default;
}
return ((! is_array(\App::$config[$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$family][$key]))
? unserialize(\App::$config[$family][$key])
@@ -112,7 +112,7 @@ class Config {
);
}
return false;
return $default;
}
/**

View File

@@ -70,7 +70,19 @@ class Enotify {
$hostname = substr($hostname,0,strpos($hostname,':'));
// Do not translate 'noreply' as it must be a legal 7-bit email address
$sender_email = 'noreply' . '@' . $hostname;
$reply_email = get_config('system','reply_address');
if(! $reply_email)
$reply_email = 'noreply' . '@' . $hostname;
$sender_email = get_config('system','from_email');
if(! $sender_email)
$sender_email = 'Administrator' . '@' . \App::get_hostname();
$sender_name = get_config('system','from_email_name');
if(! $sender_name)
$sender_name = \Zotlabs\Lib\System::get_site_name();
$additional_mail_header = "";
@@ -90,6 +102,10 @@ class Enotify {
$title = $params['item']['title'];
$body = $params['item']['body'];
}
if($params['item']['created'] < datetime_convert('UTC','UTC','now - 1 month')) {
logger('notification invoked for an old item which may have been refetched.',LOGGER_DEBUG,LOG_INFO);
return;
}
}
else {
$title = $body = '';
@@ -101,7 +117,7 @@ class Enotify {
if ($params['type'] == NOTIFY_MAIL) {
logger('notification: mail');
$subject = sprintf( t('[Hubzilla:Notify] New mail received at %s'),$sitename);
$subject = sprintf( t('[$Projectname:Notify] New mail received at %s'),$sitename);
$preamble = sprintf( t('%1$s, %2$s sent you a new private message at %3$s.'),$recip['channel_name'], $sender['xchan_name'],$sitename);
$epreamble = sprintf( t('%1$s sent you %2$s.'),'[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]', '[zrl=$itemlink]' . t('a private message') . '[/zrl]');
@@ -116,10 +132,13 @@ class Enotify {
$itemlink = $params['link'];
// ignore like/unlike activity on posts - they probably require a sepearate notification preference
// ignore like/unlike activity on posts - they probably require a separate notification preference
if (array_key_exists('item',$params) && (! visible_activity($params['item'])))
if (array_key_exists('item',$params) && (! visible_activity($params['item']))) {
logger('notification: not a visible activity. Ignoring.');
pop_lang();
return;
}
$parent_mid = $params['parent_mid'];
@@ -189,7 +208,7 @@ class Enotify {
// Before this we have the name of the replier on the subject rendering
// differents subjects for messages on the same thread.
$subject = sprintf( t('[Hubzilla:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
$subject = sprintf( t('[$Projectname:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
$preamble = sprintf( t('%1$s, %2$s commented on an item/conversation you have been following.'), $recip['channel_name'], $sender['xchan_name']);
$epreamble = $dest_str;
@@ -198,8 +217,87 @@ class Enotify {
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
}
if ($params['type'] == NOTIFY_LIKE) {
// logger("notification: params = " . print_r($params, true), LOGGER_DEBUG);
$itemlink = $params['link'];
// ignore like/unlike activity on posts - they probably require a separate notification preference
if (array_key_exists('item',$params) && (! activity_match($params['item']['verb'],ACTIVITY_LIKE))) {
logger('notification: not a like activity. Ignoring.');
pop_lang();
return;
}
$parent_mid = $params['parent_mid'];
// Check to see if there was already a notify for this post.
// If so don't create a second notification
$p = null;
$p = q("select id from notify where link = '%s' and uid = %d limit 1",
dbesc($params['link']),
intval($recip['channel_id'])
);
if ($p) {
logger('notification: like already notified');
pop_lang();
return;
}
// if it's a post figure out who's post it is.
$p = null;
if($params['otype'] === 'item' && $parent_mid) {
$p = q("select * from item where mid = '%s' and uid = %d limit 1",
dbesc($parent_mid),
intval($recip['channel_id'])
);
}
xchan_query($p);
$item_post_type = item_post_type($p[0]);
// $private = $p[0]['item_private'];
$parent_id = $p[0]['id'];
$parent_item = $p[0];
// "your post"
if($p[0]['owner']['xchan_name'] == $p[0]['author']['xchan_name'] && intval($p[0]['item_wall']))
$dest_str = sprintf(t('%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]'),
$recip['channel_name'],
'[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
$itemlink,
$item_post_type);
else {
pop_lang();
return;
}
// Some mail softwares relies on subject field for threading.
// So, we cannot have different subjects for notifications of the same thread.
// Before this we have the name of the replier on the subject rendering
// differents subjects for messages on the same thread.
$subject = sprintf( t('[$Projectname:Notify] Like received to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
$preamble = sprintf( t('%1$s, %2$s liked an item/conversation you created.'), $recip['channel_name'], $sender['xchan_name']);
$epreamble = $dest_str;
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
}
if($params['type'] == NOTIFY_WALL) {
$subject = sprintf( t('[Hubzilla:Notify] %s posted to your profile wall') , $sender['xchan_name']);
$subject = sprintf( t('[$Projectname:Notify] %s posted to your profile wall') , $sender['xchan_name']);
$preamble = sprintf( t('%1$s, %2$s posted to your profile wall at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename);
@@ -227,7 +325,7 @@ class Enotify {
return;
}
$subject = sprintf( t('[Hubzilla:Notify] %s tagged you') , $sender['xchan_name']);
$subject = sprintf( t('[$Projectname:Notify] %s tagged you') , $sender['xchan_name']);
$preamble = sprintf( t('%1$s, %2$s tagged you at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename);
$epreamble = sprintf( t('%1$s, %2$s [zrl=%3$s]tagged you[/zrl].') ,
$recip['channel_name'],
@@ -241,7 +339,7 @@ class Enotify {
}
if ($params['type'] == NOTIFY_POKE) {
$subject = sprintf( t('[Hubzilla:Notify] %1$s poked you') , $sender['xchan_name']);
$subject = sprintf( t('[$Projectname:Notify] %1$s poked you') , $sender['xchan_name']);
$preamble = sprintf( t('%1$s, %2$s poked you at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename);
$epreamble = sprintf( t('%1$s, %2$s [zrl=%2$s]poked you[/zrl].') ,
$recip['channel_name'],
@@ -259,7 +357,7 @@ class Enotify {
}
if ($params['type'] == NOTIFY_TAGSHARE) {
$subject = sprintf( t('[Hubzilla:Notify] %s tagged your post') , $sender['xchan_name']);
$subject = sprintf( t('[$Projectname:Notify] %s tagged your post') , $sender['xchan_name']);
$preamble = sprintf( t('%1$s, %2$s tagged your post at %3$s') , $recip['channel_name'],$sender['xchan_name'], $sitename);
$epreamble = sprintf( t('%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]') ,
$recip['channel_name'],
@@ -273,7 +371,7 @@ class Enotify {
}
if ($params['type'] == NOTIFY_INTRO) {
$subject = sprintf( t('[Hubzilla:Notify] Introduction received'));
$subject = sprintf( t('[$Projectname:Notify] Introduction received'));
$preamble = sprintf( t('%1$s, you\'ve received an new connection request from \'%2$s\' at %3$s'), $recip['channel_name'], $sender['xchan_name'], $sitename);
$epreamble = sprintf( t('%1$s, you\'ve received [zrl=%2$s]a new connection request[/zrl] from %3$s.'),
$recip['channel_name'],
@@ -288,7 +386,7 @@ class Enotify {
}
if ($params['type'] == NOTIFY_SUGGEST) {
$subject = sprintf( t('[Hubzilla:Notify] Friend suggestion received'));
$subject = sprintf( t('[$Projectname:Notify] Friend suggestion received'));
$preamble = sprintf( t('%1$s, you\'ve received a friend suggestion from \'%2$s\' at %3$s'), $recip['channel_name'], $sender['xchan_name'], $sitename);
$epreamble = sprintf( t('%1$s, you\'ve received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from %4$s.'),
$recip['channel_name'],
@@ -346,7 +444,7 @@ class Enotify {
do {
$dups = false;
$hash = random_string();
$r = q("SELECT `id` FROM `notify` WHERE `hash` = '%s' LIMIT 1",
$r = q("SELECT id FROM notify WHERE hash = '%s' LIMIT 1",
dbesc($hash));
if ($r)
$dups = true;
@@ -386,8 +484,11 @@ class Enotify {
// Mark some notifications as seen right away
// Note! The notification have to be created, because they are used to send emails
// So easiest solution to hide them from Notices is to mark them as seen right away.
// Another option would be to not add them to the DB, and change how emails are handled (probably would be better that way)
// Another option would be to not add them to the DB, and change how emails are handled
// (probably would be better that way)
$always_show_in_notices = get_pconfig($recip['channel_id'],'system','always_show_in_notices');
if (!$always_show_in_notices) {
if (($params['type'] == NOTIFY_WALL) || ($params['type'] == NOTIFY_MAIL) || ($params['type'] == NOTIFY_INTRO)) {
$seen = 1;
@@ -459,7 +560,7 @@ class Enotify {
// use $_SESSION['zid_override'] to force zid() to use
// the recipient address instead of the current observer
$_SESSION['zid_override'] = $recip['channel_address'] . '@' . \App::get_hostname();
$_SESSION['zid_override'] = channel_reddress($recip);
$_SESSION['zrl_override'] = z_root() . '/channel/' . $recip['channel_address'];
$textversion = zidify_links($textversion);
@@ -515,7 +616,7 @@ class Enotify {
$private_activity = true;
case NOTIFY_MAIL:
$datarray['textversion'] = $datarray['htmlversion'] = $datarray['title'] = '';
$datarray['subject'] = preg_replace('/' . preg_quote(t('[Hubzilla:Notify]')) . '/','$0*',$datarray['subject']);
$datarray['subject'] = preg_replace('/' . preg_quote(t('[$Projectname:Notify]')) . '/','$0*',$datarray['subject']);
break;
default:
break;
@@ -577,7 +678,7 @@ class Enotify {
self::send(array(
'fromName' => $sender_name,
'fromEmail' => $sender_email,
'replyTo' => $sender_email,
'replyTo' => $reply_email,
'toEmail' => $recip['account_email'],
'messageSubject' => $datarray['subject'],
'htmlVersion' => $email_html_body,
@@ -606,6 +707,16 @@ class Enotify {
*/
static public function send($params) {
$params['sent'] = false;
$params['result'] = false;
call_hooks('email_send', $params);
if($params['sent']) {
logger("notification: enotify::send (addon) returns " . (($params['result']) ? 'success' : 'failure'), LOGGER_DEBUG);
return $params['result'];
}
$fromName = email_header_encode(html_entity_decode($params['fromName'],ENT_QUOTES,'UTF-8'),'UTF-8');
$messageSubject = email_header_encode(html_entity_decode($params['messageSubject'],ENT_QUOTES,'UTF-8'),'UTF-8');
@@ -645,7 +756,8 @@ class Enotify {
$multipartMessageBody, // message body
$messageHeader // message headers
);
logger("notification: enotify::send returns " . $res, LOGGER_DEBUG);
logger("notification: enotify::send returns " . (($res) ? 'success' : 'failure'), LOGGER_DEBUG);
return $res;
}
static public function format($item) {
@@ -654,12 +766,12 @@ class Enotify {
require_once('include/conversation.php');
// Call localize_item with the "brief" flag to get a one line status for activities.
// Call localize_item to get a one line status for activities.
// This should set $item['localized'] to indicate we have a brief summary.
localize_item($item);
if($item_localize) {
if($item['localize']) {
$itemem_text = $item['localize'];
}
else {
@@ -671,7 +783,7 @@ class Enotify {
// convert this logic into a json array just like the system notifications
return array(
'notify_link' => $item['llink'],
'notify_link' => $item['llink'],
'name' => $item['author']['xchan_name'],
'url' => $item['author']['xchan_url'],
'photo' => $item['author']['xchan_photo_s'],

View File

@@ -0,0 +1,57 @@
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace Zotlabs\Lib;
/**
* Description of ExtendedZip
*
* @author andrew
*/
class ExtendedZip extends \ZipArchive {
// Member function to add a whole file system subtree to the archive
public function addTree($dirname, $localname = '') {
if ($localname)
$this->addEmptyDir($localname);
$this->_addTree($dirname, $localname);
}
// Internal function, to recurse
protected function _addTree($dirname, $localname) {
$dir = opendir($dirname);
while ($filename = readdir($dir)) {
// Discard . and ..
if ($filename == '.' || $filename == '..')
continue;
// Proceed according to type
$path = $dirname . '/' . $filename;
$localpath = $localname ? ($localname . '/' . $filename) : $filename;
if (is_dir($path)) {
// Directory: add & recurse
$this->addEmptyDir($localpath);
$this->_addTree($path, $localpath);
}
else if (is_file($path)) {
// File: just add
$this->addFile($path, $localpath);
}
}
closedir($dir);
}
// Helper function
public static function zipTree($dirname, $zipFilename, $flags = 0, $localname = '') {
$zip = new self();
$zip->open($zipFilename, $flags);
$zip->addTree($dirname, $localname);
$zip->close();
}
}

View File

@@ -10,7 +10,7 @@ class IConfig {
return;
}
static public function Get(&$item, $family, $key) {
static public function Get(&$item, $family, $key, $default = false) {
$is_item = false;
@@ -28,7 +28,7 @@ class IConfig {
$iid = $item;
if(! $iid)
return false;
return $default;
if(is_array($item) && array_key_exists('iconfig',$item) && is_array($item['iconfig'])) {
foreach($item['iconfig'] as $c) {
@@ -48,7 +48,7 @@ class IConfig {
$item['iconfig'][] = $r[0];
return $r[0]['v'];
}
return false;
return $default;
}

210
Zotlabs/Lib/NativeWiki.php Normal file
View File

@@ -0,0 +1,210 @@
<?php
namespace Zotlabs\Lib;
define ( 'NWIKI_ITEM_RESOURCE_TYPE', 'nwiki' );
class NativeWiki {
static public function listwikis($channel, $observer_hash) {
$sql_extra = item_permissions_sql($channel['channel_id'], $observer_hash);
$wikis = q("SELECT * FROM item
WHERE resource_type = '%s' AND mid = parent_mid AND uid = %d AND item_deleted = 0 $sql_extra",
dbesc(NWIKI_ITEM_RESOURCE_TYPE),
intval($channel['channel_id'])
);
if($wikis) {
foreach($wikis as &$w) {
$w['rawName'] = get_iconfig($w, 'wiki', 'rawName');
$w['htmlName'] = escape_tags($w['rawName']);
$w['urlName'] = urlencode(urlencode($w['rawName']));
$w['mimeType'] = get_iconfig($w, 'wiki', 'mimeType');
$w['lock'] = (($w['item_private'] || $w['allow_cid'] || $w['allow_gid'] || $w['deny_cid'] || $w['deny_gid']) ? true : false);
}
}
// TODO: query db for wikis the observer can access. Return with two lists, for read and write access
return array('wikis' => $wikis);
}
function create_wiki($channel, $observer_hash, $wiki, $acl) {
// Generate unique resource_id using the same method as item_message_id()
do {
$dups = false;
$resource_id = random_string();
$r = q("SELECT mid FROM item WHERE resource_id = '%s' AND resource_type = '%s' AND uid = %d LIMIT 1",
dbesc($resource_id),
dbesc(NWIKI_ITEM_RESOURCE_TYPE),
intval($channel['channel_id'])
);
if($r)
$dups = true;
} while($dups == true);
$ac = $acl->get();
$mid = item_message_id();
$arr = array(); // Initialize the array of parameters for the post
$item_hidden = ((intval($wiki['postVisible']) === 0) ? 1 : 0);
$wiki_url = z_root() . '/wiki/' . $channel['channel_address'] . '/' . $wiki['urlName'];
$arr['aid'] = $channel['channel_account_id'];
$arr['uid'] = $channel['channel_id'];
$arr['mid'] = $mid;
$arr['parent_mid'] = $mid;
$arr['item_hidden'] = $item_hidden;
$arr['resource_type'] = NWIKI_ITEM_RESOURCE_TYPE;
$arr['resource_id'] = $resource_id;
$arr['owner_xchan'] = $channel['channel_hash'];
$arr['author_xchan'] = $observer_hash;
$arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . urlencode($arr['mid']);
$arr['llink'] = $arr['plink'];
$arr['title'] = $wiki['htmlName']; // name of new wiki;
$arr['allow_cid'] = $ac['allow_cid'];
$arr['allow_gid'] = $ac['allow_gid'];
$arr['deny_cid'] = $ac['deny_cid'];
$arr['deny_gid'] = $ac['deny_gid'];
$arr['item_wall'] = 1;
$arr['item_origin'] = 1;
$arr['item_thread_top'] = 1;
$arr['item_private'] = intval($acl->is_private());
$arr['verb'] = ACTIVITY_CREATE;
$arr['obj_type'] = ACTIVITY_OBJ_WIKI;
$arr['body'] = '[table][tr][td][h1]New Wiki[/h1][/td][/tr][tr][td][zrl=' . $wiki_url . ']' . $wiki['htmlName'] . '[/zrl][/td][/tr][/table]';
$arr['public_policy'] = map_scope(\Zotlabs\Access\PermissionLimits::Get($channel['channel_id'],'view_wiki'),true);
// Save the wiki name information using iconfig. This is shareable.
if(! set_iconfig($arr, 'wiki', 'rawName', $wiki['rawName'], true)) {
return array('item' => null, 'success' => false);
}
if(! set_iconfig($arr, 'wiki', 'mimeType', $wiki['mimeType'], true)) {
return array('item' => null, 'success' => false);
}
$post = item_store($arr);
$item_id = $post['item_id'];
if($item_id) {
\Zotlabs\Daemon\Master::Summon(array('Notifier', 'activity', $item_id));
return array('item' => $post['item'], 'item_id' => $item_id, 'success' => true);
}
else {
return array('item' => null, 'success' => false);
}
}
static public function sync_a_wiki_item($uid,$id,$resource_id) {
$r = q("SELECT * from item WHERE uid = %d AND ( id = %d OR ( resource_type = '%s' and resource_id = %d )) ",
intval($uid),
intval($id),
dbesc(NWIKI_ITEM_RESOURCE_TYPE),
intval($resource_id)
);
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
build_sync_packet($uid,array('wiki' => array(encode_item($sync_item[0],true))));
}
}
function delete_wiki($channel_id,$observer_hash,$resource_id) {
$w = self::get_wiki($channel_id,$observer_hash,$resource_id);
$item = $w['wiki'];
if(! $item) {
return array('item' => null, 'success' => false);
}
else {
$drop = drop_item($item['id'], false, DROPITEM_NORMAL, true);
}
info( t('Wiki files deleted successfully'));
return array('item' => $item, 'item_id' => $item['id'], 'success' => (($drop === 1) ? true : false));
}
static public function get_wiki($channel_id, $observer_hash, $resource_id) {
$sql_extra = item_permissions_sql($channel_id,$observer_hash);
$item = q("SELECT * FROM item WHERE uid = %d AND resource_type = '%s' AND resource_id = '%s' AND item_deleted = 0
$sql_extra limit 1",
intval($channel_id),
dbesc(NWIKI_ITEM_RESOURCE_TYPE),
dbesc($resource_id)
);
if(! $item) {
return array('wiki' => null);
}
else {
$w = $item[0]; // wiki item table record
// Get wiki metadata
$rawName = get_iconfig($w, 'wiki', 'rawName');
$mimeType = get_iconfig($w, 'wiki', 'mimeType');
return array(
'wiki' => $w,
'rawName' => $rawName,
'htmlName' => escape_tags($rawName),
'urlName' => urlencode(urlencode($rawName)),
'mimeType' => $mimeType
);
}
}
static public function exists_by_name($uid, $urlName) {
$sql_extra = item_permissions_sql($uid);
$item = q("SELECT item.id, resource_id FROM item left join iconfig on iconfig.iid = item.id
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)),
intval($uid)
);
if($item) {
return array('id' => $item[0]['id'], 'resource_id' => $item[0]['resource_id']);
}
else {
return array('id' => null, 'resource_id' => null);
}
}
static public function get_permissions($resource_id, $owner_id, $observer_hash) {
// TODO: For now, only the owner can edit
$sql_extra = item_permissions_sql($owner_id, $observer_hash);
if(local_channel() && local_channel() == $owner_id) {
return [ 'read' => true, 'write' => true, 'success' => true ];
}
$r = q("SELECT * FROM item WHERE uid = %d and resource_type = '%s' AND resource_id = '%s' $sql_extra LIMIT 1",
intval($owner_id),
dbesc(NWIKI_ITEM_RESOURCE_TYPE),
dbesc($resource_id)
);
if(! $r) {
return array('read' => false, 'write' => false, 'success' => true);
}
else {
// TODO: Create a new permission setting for wiki analogous to webpages. Until
// then, use webpage permissions
$write = perm_is_allowed($owner_id, $observer_hash,'write_wiki');
return array('read' => true, 'write' => $write, 'success' => true);
}
}
}

View File

@@ -0,0 +1,664 @@
<?php
namespace Zotlabs\Lib;
use \Zotlabs\Lib as Zlib;
class NativeWikiPage {
static public function page_list($channel_id,$observer_hash, $resource_id) {
// TODO: Create item table records for pages so that metadata like title can be applied
$w = Zlib\NativeWiki::get_wiki($channel_id,$observer_hash,$resource_id);
$pages[] = [
'resource_id' => '',
'title' => 'Home',
'url' => 'Home',
'link_id' => 'id_wiki_home_0'
];
$sql_extra = item_permissions_sql($channel_id,$observer_hash);
$r = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' and uid = %d and item_deleted = 0
$sql_extra group by mid",
dbesc($resource_id),
intval($channel_id)
);
if($r) {
$items = fetch_post_tags($r,true);
foreach($items as $page_item) {
$title = get_iconfig($page_item['id'],'nwikipage','pagetitle',t('(No Title)'));
if(urldecode($title) !== 'Home') {
$pages[] = [
'resource_id' => $resource_id,
'title' => escape_tags($title),
'url' => urlencode(urlencode($title)),
'link_id' => 'id_' . substr($resource_id, 0, 10) . '_' . $page_item['id']
];
}
}
}
return array('pages' => $pages, 'wiki' => $w);
}
static public function create_page($channel_id, $observer_hash, $name, $resource_id) {
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (! $w['wiki']) {
return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
}
// create an empty activity
$arr = [];
$arr['uid'] = $channel_id;
$arr['author_xchan'] = $observer_hash;
$arr['resource_type'] = 'nwikipage';
$arr['resource_id'] = $resource_id;
$arr['allow_cid'] = $w['wiki']['allow_cid'];
$arr['allow_gid'] = $w['wiki']['allow_gid'];
$arr['deny_cid'] = $w['wiki']['deny_cid'];
$arr['deny_gid'] = $w['wiki']['deny_gid'];
$arr['public_policy'] = map_scope(\Zotlabs\Access\PermissionLimits::Get($channel_id,'view_wiki'),true);
// We may wish to change this some day.
$arr['item_unpublished'] = 1;
set_iconfig($arr,'nwikipage','pagetitle',(($name) ? $name : t('(No Title)')),true);
$p = post_activity_item($arr, false, false);
if($p['item_id']) {
$page = [
'rawName' => $name,
'htmlName' => escape_tags($name),
'urlName' => urlencode($name),
];
return array('page' => $page, 'item_id' => $p['item_id'], 'item' => $p['activity'], 'wiki' => $w, 'message' => '', 'success' => true);
}
return [ 'success' => false, 'message' => t('Wiki page create failed.') ];
}
static public function rename_page($arr) {
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
$pageNewName = ((array_key_exists('pageNewName',$arr)) ? $arr['pageNewName'] : '');
$resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if(! $w['wiki']) {
return array('message' => t('Wiki not found.'), 'success' => false);
}
$ic = q("select * from iconfig left join item on iconfig.iid = item.id
where uid = %d and cat = 'nwikipage' and k = 'pagetitle' and v = '%s'",
intval($channel_id),
dbesc($pageNewName)
);
if($ic) {
return [ 'success' => false, 'message' => t('Destination name already exists') ];
}
$ids = [];
$ic = q("select *, item.id as item_id from iconfig left join item on iconfig.iid = item.id
where uid = %d and cat = 'nwikipage' and k = 'pagetitle' and v = '%s'",
intval($channel_id),
dbesc($pageUrlName)
);
if($ic) {
foreach($ic as $c) {
set_iconfig($c['item_id'],'nwikipage','pagetitle',$pageNewName);
}
$page = [
'rawName' => $pageNewName,
'htmlName' => escape_tags($pageNewName),
'urlName' => urlencode(escape_tags($pageNewName))
];
return [ 'success' => true, 'page' => $page ];
}
return [ 'success' => false, 'item_id' => $c['item_id'], 'message' => t('Page not found') ];
}
static public function get_page_content($arr) {
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
$resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? intval($arr['channel_id']) : 0);
$revision = ((array_key_exists('revision',$arr)) ? intval($arr['revision']) : (-1));
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (! $w['wiki']) {
return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
}
$item = self::load_page($arr);
if($item) {
$content = $item['body'];
return [
'content' => json_encode($content),
'mimeType' => $w['mimeType'],
'message' => '',
'success' => true
];
}
return array('content' => null, 'message' => t('Error reading page content'), 'success' => false);
}
static public function page_history($arr) {
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
$resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
return array('history' => null, 'message' => 'Error reading wiki', 'success' => false);
}
$items = self::load_page_history($arr);
$history = [];
if($items) {
$processed = 0;
foreach($items as $item) {
if($processed > 1000)
break;
$processed ++;
$history[] = [
'revision' => $item['revision'],
'date' => datetime_convert('UTC',date_default_timezone_get(),$item['edited']),
'name' => $item['author']['xchan_name'],
'title' => get_iconfig($item,'nwikipage','commit_msg')
];
}
return [ 'success' => true, 'history' => $history ];
}
return [ 'success' => false ];
}
static public function load_page($arr) {
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
$resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
$revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : (-1));
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (! $w['wiki']) {
return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
}
$ids = '';
$ic = q("select * from iconfig left join item on iconfig.iid = item.id where uid = %d and cat = 'nwikipage' and k = 'pagetitle' and v = '%s'",
intval($channel_id),
dbesc($pageUrlName)
);
if($ic) {
foreach($ic as $c) {
if($ids)
$ids .= ',';
$ids .= intval($c['iid']);
}
}
$sql_extra = item_permissions_sql($channel_id,$observer_hash);
if($revision == (-1))
$sql_extra .= " order by revision desc ";
elseif($revision)
$sql_extra .= " and revision = " . intval($revision) . " ";
$r = null;
if($ids) {
$r = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' and uid = %d and id in ( $ids ) $sql_extra limit 1",
dbesc($resource_id),
intval($channel_id)
);
if($r) {
$items = fetch_post_tags($r,true);
return $items[0];
}
}
return null;
}
static public function load_page_history($arr) {
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
$resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
$revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : (-1));
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (! $w['wiki']) {
return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
}
$ids = '';
$ic = q("select * from iconfig left join item on iconfig.iid = item.id where uid = %d and cat = 'nwikipage' and k = 'pagetitle' and v = '%s'",
intval($channel_id),
dbesc($pageUrlName)
);
if($ic) {
foreach($ic as $c) {
if($ids)
$ids .= ',';
$ids .= intval($c['iid']);
}
}
$sql_extra = item_permissions_sql($channel_id,$observer_hash);
$sql_extra .= " order by revision desc ";
$r = null;
if($ids) {
$r = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' and uid = %d and id in ( $ids ) and item_deleted = 0 $sql_extra",
dbesc($resource_id),
intval($channel_id)
);
if($r) {
xchan_query($r);
$items = fetch_post_tags($r,true);
return $items;
}
}
return null;
}
static public function prepare_content($s) {
$text = preg_replace_callback('{
(?:\n\n|\A\n?)
( # $1 = the code block -- one or more lines, starting with a space/tab
(?>
[ ]{'.'4'.'} # Lines must start with a tab or a tab-width of spaces
.*\n+
)+
)
((?=^[ ]{0,'.'4'.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
}xm',
'self::nwiki_prepare_content_callback', $s);
return $text;
}
static public function nwiki_prepare_content_callback($matches) {
$codeblock = $matches[1];
$codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES, UTF8, false);
return "\n\n" . $codeblock ;
}
static public function save_page($arr) {
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
$content = ((array_key_exists('content',$arr)) ? purify_html(Zlib\NativeWikiPage::prepare_content($arr['content'])) : '');
$resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
$revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : 0);
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
return array('message' => t('Error reading wiki'), 'success' => false);
}
// fetch the most recently saved revision.
$item = self::load_page($arr);
if(! $item) {
return array('message' => t('Page not found'), 'success' => false);
}
// change just the fields we need to change to create a revision;
unset($item['id']);
unset($item['author']);
$item['parent'] = 0;
$item['body'] = $content;
$item['author_xchan'] = $observer_hash;
$item['revision'] = (($arr['revision']) ? intval($arr['revision']) + 1 : intval($item['revision']) + 1);
$item['edited'] = datetime_convert();
if($item['iconfig'] && is_array($item['iconfig']) && count($item['iconfig'])) {
for($x = 0; $x < count($item['iconfig']); $x ++) {
unset($item['iconfig'][$x]['id']);
unset($item['iconfig'][$x]['iid']);
}
}
$ret = item_store($item, false, false);
if($ret['item_id'])
return array('message' => '', 'item_id' => $ret['item_id'], 'filename' => $filename, 'success' => true);
else
return array('message' => t('Page update failed.'), 'success' => false);
}
static public function delete_page($arr) {
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
$resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if(! $w['wiki']) {
return [ 'success' => false, 'message' => t('Error reading wiki') ];
}
$ids = [];
$ic = q("select * from iconfig left join item on iconfig.iid = item.id
where uid = %d and cat = 'nwikipage' and k = 'pagetitle' and v = '%s'",
intval($channel_id),
dbesc($pageUrlName)
);
if($ic) {
foreach($ic as $c) {
$ids[] = intval($c['iid']);
}
}
if($ids) {
drop_items($ids);
return [ 'success' => true ];
}
return [ 'success' => false, 'message' => t('Nothing deleted') ];
}
static public function revert_page($arr) {
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
$resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$commitHash = ((array_key_exists('commitHash',$arr)) ? $arr['commitHash'] : null);
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
if (! $commitHash) {
return array('content' => $content, 'message' => 'No commit was provided', 'success' => false);
}
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
return array('content' => $content, 'message' => 'Error reading wiki', 'success' => false);
}
$x = $arr;
if(intval($commitHash) > 0) {
unset($x['commitHash']);
$x['revision'] = intval($commitHash) - 1;
$loaded = self::load_page($x);
if($loaded) {
$content = $loaded['body'];
return [ 'content' => $content, 'success' => true ];
}
return [ 'content' => $content, 'success' => false ];
}
}
static public function compare_page($arr) {
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
$resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$currentCommit = ((array_key_exists('currentCommit',$arr)) ? $arr['currentCommit'] : (-1));
$compareCommit = ((array_key_exists('compareCommit',$arr)) ? $arr['compareCommit'] : 0);
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
return array('message' => t('Error reading wiki'), 'success' => false);
}
$x = $arr;
$x['revision'] = (-1);
$currpage = self::load_page($x);
if($currpage)
$currentContent = $currpage['body'];
$x['revision'] = $compareCommit;
$comppage = self::load_page($x);
if($comppage)
$compareContent = $comppage['body'];
if($currpage && $comppage) {
require_once('library/class.Diff.php');
$diff = \Diff::toTable(\Diff::compare($currentContent, $compareContent));
return [ 'success' => true, 'diff' => $diff ];
}
return [ 'success' => false, 'message' => t('Compare: object not found.') ];
}
static public function commit($arr) {
$commit_msg = ((array_key_exists('commit_msg', $arr)) ? $arr['commit_msg'] : t('Page updated'));
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
$pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : t('Untitled'));
if(array_key_exists('resource_id', $arr)) {
$resource_id = $arr['resource_id'];
}
else {
return array('message' => t('Wiki resource_id required for git commit'), 'success' => false);
}
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (! $w['wiki']) {
return array('message' => t('Error reading wiki'), 'success' => false);
}
$page = self::load_page($arr);
if($page) {
set_iconfig($page['id'],'nwikipage','commit_msg',escape_tags($commit_msg),true);
return [ 'success' => true, 'item_id' => $page['id'], 'page' => $page ];
}
return [ 'success' => false, 'message' => t('Page not found.') ];
}
static public function convert_links($s, $wikiURL) {
if (strpos($s,'[[') !== false) {
preg_match_all("/\[\[(.*?)\]\]/", $s, $match);
$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)));
$pages[] = $m;
}
$idx = 0;
while(strpos($s,'[[') !== false) {
$replace = '<a href="'.$wikiURL.'/'.$pageURLs[$idx].'">'.$pages[$idx].'</a>';
$s = preg_replace("/\[\[(.*?)\]\]/", $replace, $s, 1);
$idx++;
}
}
return $s;
}
/**
* Replace the instances of the string [toc] with a list element that will be populated by
* a table of contents by the JavaScript library
* @param string $s
* @return string
*/
static public function generate_toc($s) {
if (strpos($s,'[toc]') !== false) {
//$toc_md = wiki_toc($s); // Generate Markdown-formatted list prior to HTML render
$toc_md = '<ul id="wiki-toc"></ul>'; // use the available jQuery plugin http://ndabas.github.io/toc/
$s = preg_replace("/\[toc\]/", $toc_md, $s, -1);
}
return $s;
}
/**
* Converts a select set of bbcode tags. Much of the code is copied from include/bbcode.php
* @param string $s
* @return string
*/
static public function bbcode($s) {
$s = str_replace(array('[baseurl]', '[sitename]'), array(z_root(), get_config('system', 'sitename')), $s);
$s = preg_replace_callback("/\[observer\.language\=(.*?)\](.*?)\[\/observer\]/ism",'oblanguage_callback', $s);
$s = preg_replace_callback("/\[observer\.language\!\=(.*?)\](.*?)\[\/observer\]/ism",'oblanguage_necallback', $s);
$observer = \App::get_observer();
if ($observer) {
$s1 = '<span class="bb_observer" title="' . t('Different viewers will see this text differently') . '">';
$s2 = '</span>';
$obsBaseURL = $observer['xchan_connurl'];
$obsBaseURL = preg_replace("/\/poco\/.*$/", '', $obsBaseURL);
$s = str_replace('[observer.baseurl]', $obsBaseURL, $s);
$s = str_replace('[observer.url]', $observer['xchan_url'], $s);
$s = str_replace('[observer.name]', $s1 . $observer['xchan_name'] . $s2, $s);
$s = str_replace('[observer.address]', $s1 . $observer['xchan_addr'] . $s2, $s);
$s = str_replace('[observer.webname]', substr($observer['xchan_addr'], 0, strpos($observer['xchan_addr'], '@')), $s);
$s = str_replace('[observer.photo]', '', $s);
}
else {
$s = str_replace('[observer.baseurl]', '', $s);
$s = str_replace('[observer.url]', '', $s);
$s = str_replace('[observer.name]', '', $s);
$s = str_replace('[observer.address]', '', $s);
$s = str_replace('[observer.webname]', '', $s);
$s = str_replace('[observer.photo]', '', $s);
}
return $s;
}
static public function get_file_ext($arr) {
if($arr['mimeType'] == 'text/bbcode')
return '.bb';
else
return '.md';
}
// This function is derived from
// http://stackoverflow.com/questions/32068537/generate-table-of-contents-from-markdown-in-php
static public function toc($content) {
// ensure using only "\n" as line-break
$source = str_replace(["\r\n", "\r"], "\n", $content);
// look for markdown TOC items
preg_match_all(
'/^(?:=|-|#).*$/m',
$source,
$matches,
PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE
);
// preprocess: iterate matched lines to create an array of items
// where each item is an array(level, text)
$file_size = strlen($source);
foreach ($matches[0] as $item) {
$found_mark = substr($item[0], 0, 1);
if ($found_mark == '#') {
// text is the found item
$item_text = $item[0];
$item_level = strrpos($item_text, '#') + 1;
$item_text = substr($item_text, $item_level);
} else {
// text is the previous line (empty if <hr>)
$item_offset = $item[1];
$prev_line_offset = strrpos($source, "\n", -($file_size - $item_offset + 2));
$item_text =
substr($source, $prev_line_offset, $item_offset - $prev_line_offset - 1);
$item_text = trim($item_text);
$item_level = $found_mark == '=' ? 1 : 2;
}
if (!trim($item_text) OR strpos($item_text, '|') !== FALSE) {
// item is an horizontal separator or a table header, don't mind
continue;
}
$raw_toc[] = ['level' => $item_level, 'text' => trim($item_text)];
}
$o = '';
foreach($raw_toc as $t) {
$level = intval($t['level']);
$text = $t['text'];
switch ($level) {
case 1:
$li = '* ';
break;
case 2:
$li = ' * ';
break;
case 3:
$li = ' * ';
break;
case 4:
$li = ' * ';
break;
default:
$li = '* ';
break;
}
$o .= $li . $text . "\n";
}
return $o;
}
}

View File

@@ -67,16 +67,16 @@ class PConfig {
* @return mixed Stored value or false if it does not exist
*/
static public function Get($uid,$family,$key,$instore = false) {
static public function Get($uid,$family,$key,$default = false) {
if(is_null($uid) || $uid === false)
return false;
return $default;
if(! array_key_exists($uid, \App::$config))
self::Load($uid);
if((! array_key_exists($family, \App::$config[$uid])) || (! array_key_exists($key, \App::$config[$uid][$family])))
return false;
return $default;
return ((! is_array(\App::$config[$uid][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$uid][$family][$key]))
? unserialize(\App::$config[$uid][$family][$key])
@@ -185,13 +185,17 @@ class PConfig {
$ret = false;
if(array_key_exists($key, \App::$config[$uid][$family]))
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]))
unset(\App::$config[$uid][$family][$key]);
$ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s'",
intval($uid),
dbesc($family),
dbesc($key)
);
$ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s'",
intval($uid),
dbesc($family),
dbesc($key)
);
return $ret;
}

146
Zotlabs/Lib/Permcat.php Normal file
View File

@@ -0,0 +1,146 @@
<?php
namespace Zotlabs\Lib;
use \Zotlabs\Access as Zaccess;
class Permcat {
private $permcats = [];
public function __construct($channel_id) {
$perms = [];
// first check role perms for a perms_connect setting
$role = get_pconfig($channel_id,'system','permissions_role');
if($role) {
$x = Zaccess\PermissionRoles::role_perms($role);
if($x['perms_connect']) {
$perms = Zaccess\Permissions::FilledPerms($x['perms_connect']);
}
}
// if no role perms it may be a custom role, see if there any autoperms
if(! $perms) {
$perms = Zaccess\Permissions::FilledAutoPerms($channel_id);
}
// if no autoperms it may be a custom role with manual perms
if(! $perms) {
$r = q("select channel_hash from channel where channel_id = %d",
intval($channel_id)
);
if($r) {
$x = q("select * from abconfig where chan = %d and xchan = '%s' and cat = 'my_perms'",
intval($channel_id),
dbesc($r[0]['channel_hash'])
);
if($x) {
foreach($x as $xv) {
$perms[$xv['k']] = intval($xv['v']);
}
}
}
}
// nothing was found - create a filled permission array where all permissions are 0
if(! $perms) {
$perms = Zaccess\Permissions::FilledPerms([]);
}
$this->permcats[] = [
'name' => 'default',
'localname' => t('default','permcat'),
'perms' => Zaccess\Permissions::Operms($perms),
'system' => 1
];
$p = $this->load_permcats($channel_id);
if($p) {
for($x = 0; $x < count($p); $x++) {
$this->permcats[] = [
'name' => $p[$x][0],
'localname' => $p[$x][1],
'perms' => Zaccess\Permissions::Operms(Zaccess\Permissions::FilledPerms($p[$x][2])),
'system' => intval($p[$x][3])
];
}
}
}
public function listing() {
return $this->permcats;
}
public function fetch($name) {
if($name && $this->permcats) {
foreach($this->permcats as $permcat) {
if(strcasecmp($permcat['name'],$name) === 0) {
return $permcat;
}
}
}
return ['error' => true];
}
public function load_permcats($uid) {
$permcats = [
[ 'follower', t('follower','permcat'),
[ 'view_stream','view_profile','view_contacts','view_storage','view_pages','view_wiki',
'post_like' ], 1
],
[ 'contributor', t('contributor','permcat'),
[ 'view_stream','view_profile','view_contacts','view_storage','view_pages','view_wiki',
'post_wall','post_comments','write_wiki','post_like','tag_deliver','chat' ], 1
],
[ 'publisher', t('publisher','permcat'),
[ 'view_stream','view_profile','view_contacts','view_storage','view_pages',
'write_storage','post_wall','write_pages','write_wiki','post_comments','post_like','tag_deliver',
'chat', 'republish' ], 1
]
];
if($uid) {
$x = q("select * from pconfig where uid = %d and cat = 'permcat'",
intval($uid)
);
if($x) {
foreach($x as $xv) {
$value = ((preg_match('|^a:[0-9]+:{.*}$|s', $xv['v'])) ? unserialize($xv['v']) : $xv['v']);
$permcats[] = [ $xv['k'], $xv['k'], $value, 0 ];
}
}
}
call_hooks('permcats',$permcats);
return $permcats;
}
static public function find_permcat($arr,$name) {
if((! $arr) || (! $name))
return false;
foreach($arr as $p)
if($p['name'] == $name)
return $p['value'];
}
static public function update($channel_id, $name,$permarr) {
PConfig::Set($channel_id,'permcat',$name,$permarr);
}
static public function delete($channel_id,$name) {
PConfig::Delete($channel_id,'permcat',$name);
}
}

View File

@@ -12,22 +12,25 @@ require_once("include/text.php");
* permission settings for an item with an empty ACL.
* i.e the caption, icon, and tooltip for the no-ACL option in the ACL dialog.
*/
class PermissionDescription {
class PermissionDescription {
private $global_perm;
private $channel_perm;
private $fallback_description;
/**
* Constructor is private.
* Use static methods fromGlobalPermission(), fromStandalonePermission(), or fromDescription()
* to create instances.
* Use static methods fromGlobalPermission(), fromStandalonePermission(),
* or fromDescription() to create instances.
*
* @internal
* @param int $global_perm
* @param int $channel_perm
* @param string $description (optional) default empty
*/
private function __construct($global_perm, $channel_perm, $description = '') {
$this->global_perm = $global_perm;
$this->channel_perm = $channel_perm;
$this->fallback_description = ($description == '') ? t('Visible to your default audience') : $description;
}
@@ -43,23 +46,22 @@ class PermissionDescription {
return new PermissionDescription('', 0x80000, $description);
}
/**
* Use this method only if the interpretation of an empty ACL doesn't fall back to a global
* default permission. You should pass one of the constants from boot.php - PERMS_PUBLIC,
* PERMS_NETWORK etc.
*
*
* @param integer $perm - a single enumerated constant permission - PERMS_PUBLIC, PERMS_NETWORK etc.
* @return a new instance of PermissionDescription
*/
public static function fromStandalonePermission($perm) {
$result = new PermissionDescription('', $perm);
$checkPerm = $this->get_permission_description();
if ($checkPerm == $this->fallback_description) {
$checkPerm = $result->get_permission_description();
if($checkPerm == $result->fallback_description) {
$result = null;
logger('null PermissionDescription from unknown standalone permission: ' . $perm ,LOGGER_DEBUG, LOG_ERROR);
logger('null PermissionDescription from unknown standalone permission: ' . $perm, LOGGER_DEBUG, LOG_ERR);
}
return $result;
@@ -67,9 +69,9 @@ class PermissionDescription {
/**
* This is the preferred way to create a PermissionDescription, as it provides the most details.
* Use this method if you know an empty ACL will result in one of the global default permissions
* Use this method if you know an empty ACL will result in one of the global default permissions
* being used, such as channel_r_stream (for which you would pass 'view_stream').
*
*
* @param string $permname - a key for the global perms array from get_perms() in permissions.php,
* e.g. 'view_stream', 'view_profile', etc.
* @return a new instance of PermissionDescription
@@ -80,19 +82,19 @@ class PermissionDescription {
$global_perms = \Zotlabs\Access\Permissions::Perms();
if (array_key_exists($permname, $global_perms)) {
if(array_key_exists($permname, $global_perms)) {
$channelPerm = \Zotlabs\Access\PermissionLimits::Get(\App::$channel['channel_id'],$permname);
$channelPerm = \Zotlabs\Access\PermissionLimits::Get(\App::$channel['channel_id'], $permname);
$result = new PermissionDescription('', $channelPerm);
} else {
// The acl dialog can handle null arguments, but it shouldn't happen
logger('null PermissionDescription from unknown global permission: ' . $permname ,LOGGER_DEBUG, LOG_ERROR);
logger('null PermissionDescription from unknown global permission: ' . $permname, LOGGER_DEBUG, LOG_ERR);
}
return $result;
}
/**
* Gets a localized description of the permission, or a generic message if the permission
* is unknown.
@@ -101,8 +103,7 @@ class PermissionDescription {
*/
public function get_permission_description() {
switch($this->channel_perm) {
switch($this->channel_perm) {
case 0: return t('Only me');
case PERMS_PUBLIC: return t('Public');
case PERMS_NETWORK: return t('Anybody in the $Projectname network');
@@ -117,19 +118,18 @@ class PermissionDescription {
/**
* Returns an icon css class name if an appropriate one is available, e.g. "fa-globe" for Public,
* otherwise returns empty string.
* otherwise returns empty string.
*
* @return string icon css class name (often FontAwesome)
*/
public function get_permission_icon() {
switch($this->channel_perm) {
switch($this->channel_perm) {
case 0:/* only me */ return 'fa-eye-slash';
case PERMS_PUBLIC: return 'fa-globe';
case PERMS_NETWORK: return 'fa-share-alt-square'; // fa-share-alt-square is very similiar to the hubzilla logo, but we should create our own logo class to use
case PERMS_SITE: return 'fa-sitemap';
case PERMS_CONTACTS: return 'fa-group';
case PERMS_SITE: return 'fa-sitemap';
case PERMS_CONTACTS: return 'fa-group';
case PERMS_SPECIFIC: return 'fa-list';
case PERMS_AUTHED: return '';
case PERMS_PENDING: return '';
@@ -137,7 +137,6 @@ class PermissionDescription {
}
}
/**
* Returns a localized description of where the permission came from, if this is known.
* If it's not know, or if the permission is standalone and didn't come from a default
@@ -147,8 +146,7 @@ class PermissionDescription {
*/
public function get_permission_origin_description() {
switch($this->global_perm) {
switch($this->global_perm) {
case PERMS_R_STREAM: return t('This is your default setting for the audience of your normal stream, and posts.');
case PERMS_R_PROFILE: return t('This is your default setting for who can view your default channel profile');
case PERMS_R_ABOOK: return t('This is your default setting for who can view your connections');

View File

@@ -105,7 +105,7 @@ class SuperCurl {
$opts['cookie'] = 'PHPSESSID=' . trim(file_get_contents('store/[data]/cookien_' . $this->magicauth));
$c = channelx_by_n($this->magicauth);
if($c)
$url = zid($this->url,$c['channel_address'] . '@' . \App::get_hostname());
$url = zid($this->url,channel_reddress($c));
}
if($this->custom)
$opts['custom'] = $this->custom;

View File

@@ -32,20 +32,34 @@ class System {
static public function get_notify_icon() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['email_notify_icon_url'])
return \App::$config['system']['email_notify_icon_url'];
return z_root() . '/images/hz-white-32.png';
return z_root() . DEFAULT_NOTIFY_ICON;
}
static public function get_site_icon() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['site_icon_url'])
return \App::$config['system']['site_icon_url'];
return z_root() . '/images/hz-32.png';
return z_root() . DEFAULT_PLATFORM_ICON ;
}
static public function get_project_link() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['project_link'])
return \App::$config['system']['project_link'];
return 'https://hubzilla.org';
}
static public function get_project_srclink() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['project_srclink'])
return \App::$config['system']['project_srclink'];
return 'https://github.com/redmatrix/hubzilla';
}
static public function get_server_role() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['server_role'])
return \App::$config['system']['server_role'];
return 'pro';
return 'standard';
}
static public function get_std_version() {
@@ -54,5 +68,15 @@ class System {
return '0.0.0';
}
static public function compatible_project($p) {
if(get_directory_realm() != DIRECTORY_REALM)
return true;
foreach(['hubzilla','zap'] as $t) {
if(stristr($p,$t))
return true;
}
return false;
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace Zotlabs\Lib;
class Techlevels {
static public function levels() {
$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')
];
return $techlevels;
}
}

View File

@@ -44,7 +44,7 @@ class ThreadItem {
* Only add those that will be displayed
*/
if((! visible_activity($item)) || array_key_exists('author_blocked',$item)) {
if((! visible_activity($item)) || array_key_exists('blocked',$item)) {
continue;
}
@@ -136,7 +136,7 @@ class ThreadItem {
$filer = ((($conv->get_profile_owner() == local_channel()) && (! array_key_exists('real_uid',$item))) ? t("Save to Folder") : false);
$profile_avatar = $item['author']['xchan_photo_m'];
$profile_link = chanlink_url($item['author']['xchan_url']);
$profile_link = chanlink_hash($item['author_xchan']);
$profile_name = $item['author']['xchan_name'];
$location = format_location($item);
@@ -174,6 +174,11 @@ class ThreadItem {
$responses = get_responses($conv_responses,$response_verbs,$this,$item);
$my_responses = [];
foreach($response_verbs as $v) {
$my_responses[$v] = (($conv_responses[$v][$item['mid'] . '-m']) ? 1 : 0);
}
$like_count = ((x($conv_responses['like'],$item['mid'])) ? $conv_responses['like'][$item['mid']] : '');
$like_list = ((x($conv_responses['like'],$item['mid'])) ? $conv_responses['like'][$item['mid'] . '-l'] : '');
if (count($like_list) > MAX_LIKERS) {
@@ -246,10 +251,11 @@ class ThreadItem {
}
$server_role = get_config('system','server_role');
$has_bookmarks = false;
if(is_array($item['term'])) {
foreach($item['term'] as $t) {
if(($server_role != 'basic') && ($t['ttype'] == TERM_BOOKMARK))
if((get_account_techlevel() > 0) && ($t['ttype'] == TERM_BOOKMARK))
$has_bookmarks = true;
}
}
@@ -289,7 +295,7 @@ class ThreadItem {
$owner_address = substr($item['owner']['xchan_addr'],0,strpos($item['owner']['xchan_addr'],'@'));
$viewthread = $item['llink'];
if($conv->get_mode() === 'channel')
$viewthread = z_root() . '/channel/' . $owner_address . '?f=&mid=' . $item['mid'];
$viewthread = z_root() . '/channel/' . $owner_address . '?f=&mid=' . urlencode($item['mid']);
$comment_count_txt = sprintf( tt('%d comment','%d comments',$total_children),$total_children );
$list_unseen_txt = (($unseen_comments) ? sprintf('%d unseen',$unseen_comments) : '');
@@ -329,6 +335,8 @@ class ThreadItem {
'wall' => t('Wall-to-Wall'),
'vwall' => t('via Wall-To-Wall:'),
'profile_url' => $profile_link,
'thread_action_menu' => thread_action_menu($item,$conv->get_mode()),
'thread_author_menu' => thread_author_menu($item,$conv->get_mode()),
'item_photo_menu' => item_photo_menu($item),
'dreport' => $dreport,
'name' => $profile_name,
@@ -343,12 +351,16 @@ class ThreadItem {
'isotime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'c'),
'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
'editedtime' => (($item['edited'] != $item['created']) ? sprintf( t('last edited: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['edited'], 'r')) : ''),
'expiretime' => (($item['expires'] !== NULL_DATE) ? sprintf( t('Expires: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['expires'], 'r')):''),
'expiretime' => (($item['expires'] > NULL_DATE) ? sprintf( t('Expires: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['expires'], 'r')):''),
'lock' => $lock,
'verified' => $verified,
'unverified' => $unverified,
'forged' => $forged,
'location' => $location,
'attend_label' => t('Attend'),
'attend_title' => t('Attendance Options'),
'vote_label' => t('Vote'),
'vote_title' => t('Voting Options'),
'indent' => $indent,
'owner_url' => $this->get_owner_url(),
'owner_photo' => $this->get_owner_photo(),
@@ -380,6 +392,7 @@ class ThreadItem {
'list_unseen_txt' => $list_unseen_txt,
'markseen' => t('Mark all seen'),
'responses' => $responses,
'my_responses' => $my_responses,
'like_count' => $like_count,
'like_list' => $like_list,
'like_list_part' => $like_list_part,
@@ -396,6 +409,7 @@ class ThreadItem {
'comment' => $this->get_comment_box($indent),
'previewing' => ($conv->is_preview() ? ' preview ' : ''),
'wait' => t('Please wait'),
'submid' => str_replace(['+','='], ['',''], base64_encode(substr($item['mid'],0,32))),
'thread_level' => $thread_level
);
@@ -411,6 +425,12 @@ class ThreadItem {
if($visible_comments === false)
$visible_comments = 3;
// needed for scroll to comment from notification but needs more work
// as we do not want to open all comments unless there is actually an #item_xx anchor
// and the url fragment is not sent to the server.
// if(in_array(\App::$module,['display','update_display']))
// $visible_comments = 99999;
if(($this->get_display_mode() === 'normal') && ($nb_children > 0)) {
foreach($children as $child) {
$result['children'][] = $child->get_template_data($conv_responses, $thread_level + 1);
@@ -747,7 +767,7 @@ class ThreadItem {
return;
if($this->is_toplevel() && ($this->get_data_value('author_xchan') != $this->get_data_value('owner_xchan'))) {
$this->owner_url = chanlink_url($this->data['owner']['xchan_url']);
$this->owner_url = chanlink_hash($this->data['owner']['xchan_hash']);
$this->owner_photo = $this->data['owner']['xchan_photo_m'];
$this->owner_name = $this->data['owner']['xchan_name'];
$this->wall_to_wall = true;

View File

@@ -58,7 +58,7 @@ class ThreadStream {
case 'display':
// in this mode we set profile_owner after initialisation (from conversation()) and then
// pull some trickery which allows us to re-invoke this function afterward
// it's an ugly hack so FIXME
// it's an ugly hack so @FIXME
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
break;
case 'page':
@@ -160,9 +160,9 @@ class ThreadStream {
}
elseif(($this->observer) && (! $item->is_commentable())) {
if((array_key_exists('owner',$item->data)) && intval($item->data['owner']['abook_self']))
$item->set_commentable(perm_is_allowed($this->profile_owner,$this->observer['xchan_hash'],'post_comments'));
$item->set_commentable(perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'));
else
$item->set_commentable(can_comment_on_post($this->observer['xchan_hash'],$item->data));
$item->set_commentable(can_comment_on_post($ob_hash,$item->data));
}
}
require_once('include/channel.php');

View File

@@ -59,16 +59,16 @@ class XConfig {
* @return mixed Stored $value or false if it does not exist
*/
static public function Get($xchan, $family, $key) {
static public function Get($xchan, $family, $key, $default = false) {
if(! $xchan)
return false;
return $default;
if(! array_key_exists($xchan, \App::$config))
load_xconfig($xchan);
if((! array_key_exists($family, \App::$config[$xchan])) || (! array_key_exists($key, \App::$config[$xchan][$family])))
return false;
return $default;
return ((! is_array(\App::$config[$xchan][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', \App::$config[$xchan][$family][$key]))
? unserialize(\App::$config[$xchan][$family][$key])

View File

@@ -19,7 +19,7 @@ require_once("include/group.php");
class Acl extends \Zotlabs\Web\Controller {
function init(){
function init() {
// logger('mod_acl: ' . print_r($_REQUEST,true));
@@ -49,7 +49,7 @@ class Acl extends \Zotlabs\Web\Controller {
$extra_channels = (x($_REQUEST,'extra_channels') ? $_REQUEST['extra_channels'] : array());
// The different autocomplete libraries use different names for the search text
// parameter. Internaly we'll use $search to represent the search text no matter
// parameter. Internally we'll use $search to represent the search text no matter
// what request variable it was attached to.
if(array_key_exists('query',$_REQUEST)) {
@@ -66,7 +66,7 @@ class Acl extends \Zotlabs\Web\Controller {
// These queries require permission checking. We'll create a simple array of xchan_hash for those with
// the requisite permissions which we can check against.
$x = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = '%s' and v = 1",
$x = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = '%s' and v = '1'",
intval(local_channel()),
dbesc(($type === 'm') ? 'post_mail' : 'tag_deliver')
);
@@ -77,7 +77,7 @@ class Acl extends \Zotlabs\Web\Controller {
if($search) {
$sql_extra = " AND `name` LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
$sql_extra = " AND groups.gname LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
$sql_extra2 = "AND ( xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'%" . dbesc($search) . ((strpos($search,'@') === false) ? "%@%'" : "%'")) . ") ";
// This horrible mess is needed because position also returns 0 if nothing is found.
@@ -87,8 +87,8 @@ class Acl extends \Zotlabs\Web\Controller {
$order_extra2 = "CASE WHEN xchan_name LIKE "
. protect_sprintf( "'%" . dbesc($search) . "%'" )
. " then POSITION('" . dbesc($search)
. "' IN xchan_name) else position('" . dbesc($search) . "' IN xchan_addr) end, ";
. " then POSITION('" . protect_sprintf(dbesc($search))
. "' IN xchan_name) else position('" . protect_sprintf(dbesc($search)) . "' IN xchan_addr) end, ";
$col = ((strpos($search,'@') !== false) ? 'xchan_addr' : 'xchan_name' );
$sql_extra3 = "AND $col like " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
@@ -103,11 +103,32 @@ class Acl extends \Zotlabs\Web\Controller {
$contacts = array();
if($type == '' || $type == 'g') {
// virtual groups based on private profile viewing ability
$r = q("select id, profile_guid, profile_name from profile where is_default = 0 and uid = %d",
intval(local_channel())
);
if($r) {
foreach($r as $rv) {
$groups[] = array(
"type" => "g",
"photo" => "images/twopeople.png",
"name" => t('Profile','acl') . ' ' . $rv['profile_name'],
"id" => 'vp' . $rv['id'],
"xid" => 'vp.' . $rv['profile_guid'],
"uids" => group_get_profile_members_xchan(local_channel(), $rv['id']),
"link" => ''
);
}
}
// Normal privacy groups
$r = q("SELECT groups.id, groups.hash, groups.gname
FROM groups,group_member
FROM groups, group_member
WHERE groups.deleted = 0 AND groups.uid = %d
AND group_member.gid=groups.id
AND group_member.gid = groups.id
$sql_extra
GROUP BY groups.id
ORDER BY groups.gname
@@ -134,25 +155,34 @@ class Acl extends \Zotlabs\Web\Controller {
}
if($type == '' || $type == 'c') {
$extra_channels_sql = '';
// Only include channels who allow the observer to view their permissions
foreach($extra_channels as $channel) {
if(perm_is_allowed(intval($channel), get_observer_hash(),'view_contacts'))
$extra_channels_sql .= "," . intval($channel);
// Only include channels who allow the observer to view their connections
if($extra_channels) {
foreach($extra_channels as $channel) {
if(perm_is_allowed(intval($channel), get_observer_hash(),'view_contacts')) {
if($extra_channel_sql)
$extra_channels_sql .= ',';
$extra_channels_sql .= intval($channel);
}
}
}
$extra_channels_sql = substr($extra_channels_sql,1); // Remove initial comma
// Getting info from the abook is better for local users because it contains info about permissions
if(local_channel()) {
if($extra_channels_sql != '')
$extra_channels_sql = " OR (abook_channel IN ($extra_channels_sql)) and abook_hidden = 0 ";
// Add atokens belonging to the local channel @TODO restrict by search
$r2 = null;
$r1 = q("select * from atoken where atoken_uid = %d",
intval(local_channel())
);
if($r1) {
require_once('include/security.php');
$r2 = array();
@@ -172,6 +202,7 @@ class Acl extends \Zotlabs\Web\Controller {
}
}
// add connections
$r = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, abook_their_perms, xchan_pubforum, abook_flags, abook_self
FROM abook left join xchan on abook_xchan = xchan_hash

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,84 @@
<?php
namespace Zotlabs\Module\Admin;
class Account_edit {
function post() {
$account_id = $_REQUEST['aid'];
if(! $account_id)
return;
$pass1 = trim($_REQUEST['pass1']);
$pass2 = trim($_REQUEST['pass2']);
if($pass1 && $pass2 && ($pass1 === $pass2)) {
$salt = random_string(32);
$password_encoded = hash('whirlpool', $salt . $pass1);
$r = q("update account set account_salt = '%s', account_password = '%s',
account_password_changed = '%s' where account_id = %d",
dbesc($salt),
dbesc($password_encoded),
dbesc(datetime_convert()),
intval($account_id)
);
if($r)
info( sprintf( t('Password changed for account %d.'), $account_id). EOL);
}
$service_class = trim($_REQUEST['service_class']);
$account_level = intval(trim($_REQUEST['account_level']));
$account_language = trim($_REQUEST['account_language']);
$r = q("update account set account_service_class = '%s', account_level = %d, account_language = '%s'
where account_id = %d",
dbesc($service_class),
intval($account_level),
dbesc($account_language),
intval($account_id)
);
if($r)
info( t('Account settings updated.') . EOL);
goaway(z_root() . '/admin/accounts');
}
function get() {
if(argc() > 2)
$account_id = argv(2);
$x = q("select * from account where account_id = %d limit 1",
intval($account_id)
);
if(! $x) {
notice ( t('Account not found.') . EOL);
return '';
}
$a = replace_macros(get_markup_template('admin_account_edit.tpl'), [
'$account' => $x[0],
'$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'),
]
);
return $a;
}
}

View File

@@ -0,0 +1,205 @@
<?php
namespace Zotlabs\Module\Admin;
class Accounts {
/**
* @brief Handle POST actions on accounts admin page.
*
* This function is called when on the admin user/account page the form was
* submitted to handle multiple operations at once. If one of the icons next
* to an entry are pressed the function admin_page_accounts() will handle this.
*
*/
function post() {
$pending = ( x($_POST, 'pending') ? $_POST['pending'] : array() );
$users = ( x($_POST, 'user') ? $_POST['user'] : array() );
$blocked = ( x($_POST, 'blocked') ? $_POST['blocked'] : array() );
check_form_security_token_redirectOnErr('/admin/accounts', 'admin_accounts');
// change to switch structure?
// account block/unblock button was submitted
if (x($_POST, 'page_users_block')) {
for ($i = 0; $i < count($users); $i++) {
// if account is blocked remove blocked bit-flag, otherwise add blocked bit-flag
$op = ($blocked[$i]) ? '& ~' : '| ';
q("UPDATE account SET account_flags = (account_flags $op%d) WHERE account_id = %d",
intval(ACCOUNT_BLOCKED),
intval($users[$i])
);
}
notice( sprintf( tt("%s account blocked/unblocked", "%s account blocked/unblocked", count($users)), count($users)) );
}
// account delete button was submitted
if (x($_POST, 'page_accounts_delete')) {
foreach ($users as $uid){
account_remove($uid, true, false);
}
notice( sprintf( tt("%s account deleted", "%s accounts deleted", count($users)), count($users)) );
}
// registration approved button was submitted
if (x($_POST, 'page_users_approve')) {
foreach ($pending as $hash) {
account_allow($hash);
}
}
// registration deny button was submitted
if (x($_POST, 'page_users_deny')) {
foreach ($pending as $hash) {
account_deny($hash);
}
}
goaway(z_root() . '/admin/accounts' );
}
/**
* @brief Generate accounts admin page and handle single item operations.
*
* This function generates the accounts/account admin page and handles the actions
* if an icon next to an entry was clicked. If several items were selected and
* the form was submitted it is handled by the function admin_page_accounts_post().
*
* @return string
*/
function get(){
if (argc() > 2) {
$uid = argv(3);
$account = q("SELECT * FROM account WHERE account_id = %d",
intval($uid)
);
if (! $account) {
notice( t('Account not found') . EOL);
goaway(z_root() . '/admin/accounts' );
}
check_form_security_token_redirectOnErr('/admin/accounts', 'admin_accounts', 't');
switch (argv(2)){
case 'delete':
// delete user
account_remove($uid,true,false);
notice( sprintf(t("Account '%s' deleted"), $account[0]['account_email']) . EOL);
break;
case 'block':
q("UPDATE account SET account_flags = ( account_flags | %d ) WHERE account_id = %d",
intval(ACCOUNT_BLOCKED),
intval($uid)
);
notice( sprintf( t("Account '%s' blocked") , $account[0]['account_email']) . EOL);
break;
case 'unblock':
q("UPDATE account SET account_flags = ( account_flags & ~%d ) WHERE account_id = %d",
intval(ACCOUNT_BLOCKED),
intval($uid)
);
notice( sprintf( t("Account '%s' unblocked"), $account[0]['account_email']) . EOL);
break;
}
goaway(z_root() . '/admin/accounts' );
}
/* get pending */
$pending = q("SELECT account.*, register.hash from account left join register on account_id = register.uid where (account_flags & %d )>0 ",
intval(ACCOUNT_PENDING)
);
/* get accounts */
$total = q("SELECT count(*) as total FROM account");
if (count($total)) {
\App::set_pager_total($total[0]['total']);
\App::set_pager_itemspage(100);
}
$serviceclass = (($_REQUEST['class']) ? " and account_service_class = '" . dbesc($_REQUEST['class']) . "' " : '');
$key = (($_REQUEST['key']) ? dbesc($_REQUEST['key']) : 'account_id');
$dir = 'asc';
if(array_key_exists('dir',$_REQUEST))
$dir = ((intval($_REQUEST['dir'])) ? 'asc' : 'desc');
$base = z_root() . '/admin/accounts?f=';
$odir = (($dir === 'asc') ? '0' : '1');
$users = q("SELECT account_id , account_email, account_lastlog, account_created, account_expires, account_service_class, ( account_flags & %d ) > 0 as blocked,
(SELECT %s FROM channel as ch WHERE ch.channel_account_id = ac.account_id and ch.channel_removed = 0 ) as channels FROM account as ac
where true $serviceclass order by $key $dir limit %d offset %d ",
intval(ACCOUNT_BLOCKED),
db_concat('ch.channel_address', ' '),
intval(\App::$pager['itemspage']),
intval(\App::$pager['start'])
);
// function _setup_users($e){
// $accounts = Array(
// t('Normal Account'),
// t('Soapbox Account'),
// t('Community/Celebrity Account'),
// t('Automatic Friend Account')
// );
// $e['page_flags'] = $accounts[$e['page-flags']];
// $e['register_date'] = relative_date($e['register_date']);
// $e['login_date'] = relative_date($e['login_date']);
// $e['lastitem_date'] = relative_date($e['lastitem_date']);
// return $e;
// }
// $users = array_map("_setup_users", $users);
$t = get_markup_template('admin_accounts.tpl');
$o = replace_macros($t, array(
// strings //
'$title' => t('Administration'),
'$page' => t('Accounts'),
'$submit' => t('Submit'),
'$select_all' => t('select all'),
'$h_pending' => t('Registrations waiting for confirm'),
'$th_pending' => array( t('Request date'), t('Email') ),
'$no_pending' => t('No registrations.'),
'$approve' => t('Approve'),
'$deny' => t('Deny'),
'$delete' => t('Delete'),
'$block' => t('Block'),
'$unblock' => t('Unblock'),
'$odir' => $odir,
'$base' => $base,
'$h_users' => t('Accounts'),
'$th_users' => array(
[ t('ID'), 'account_id' ],
[ t('Email'), 'account_email' ],
[ t('All Channels'), 'channels' ],
[ t('Register date'), 'account_created' ],
[ t('Last login'), 'account_lastlog' ],
[ t('Expires'), 'account_expires' ],
[ t('Service Class'), 'account_service_class'] ),
'$confirm_delete_multi' => t('Selected accounts will be deleted!\n\nEverything these accounts had posted on this site will be permanently deleted!\n\nAre you sure?'),
'$confirm_delete' => t('The account {0} will be deleted!\n\nEverything this account has posted on this site will be permanently deleted!\n\nAre you sure?'),
'$form_security_token' => get_form_security_token("admin_accounts"),
// values //
'$baseurl' => z_root(),
'$pending' => $pending,
'$users' => $users,
));
$o .= paginate($a);
return $o;
}
}

View File

@@ -0,0 +1,176 @@
<?php
namespace Zotlabs\Module\Admin;
/**
* @brief Admin Module for Channels.
*
*/
class Channels {
/**
* @brief Handle POST actions on channels admin page.
*
*/
function post() {
$channels = ( x($_POST, 'channel') ? $_POST['channel'] : Array() );
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels');
$xor = db_getfunc('^');
if(x($_POST, 'page_channels_block')) {
foreach($channels as $uid) {
q("UPDATE channel SET channel_pageflags = ( channel_pageflags $xor %d ) where channel_id = %d",
intval(PAGE_CENSORED),
intval( $uid )
);
\Zotlabs\Daemon\Master::Summon(array('Directory', $uid, 'nopush'));
}
notice( sprintf( tt("%s channel censored/uncensored", "%s channels censored/uncensored", count($channels)), count($channels)) );
}
if(x($_POST, 'page_channels_code')) {
foreach($channels as $uid) {
q("UPDATE channel SET channel_pageflags = ( channel_pageflags $xor %d ) where channel_id = %d",
intval(PAGE_ALLOWCODE),
intval( $uid )
);
}
notice( sprintf( tt("%s channel code allowed/disallowed", "%s channels code allowed/disallowed", count($channels)), count($channels)) );
}
if(x($_POST, 'page_channels_delete')) {
foreach($channels as $uid) {
channel_remove($uid, true);
}
notice( sprintf( tt("%s channel deleted", "%s channels deleted", count($channels)), count($channels)) );
}
goaway(z_root() . '/admin/channels' );
}
/**
* @brief Generate channels admin page and handle single item operations.
*
* @return string with parsed HTML
*/
function get() {
if(argc() > 2) {
$uid = argv(3);
$channel = q("SELECT * FROM channel WHERE channel_id = %d",
intval($uid)
);
if(! $channel) {
notice( t('Channel not found') . EOL);
goaway(z_root() . '/admin/channels' );
}
switch(argv(2)) {
case "delete":{
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
// delete channel
channel_remove($uid,true);
notice( sprintf(t("Channel '%s' deleted"), $channel[0]['channel_name']) . EOL);
}; break;
case "block":{
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
$pflags = $channel[0]['channel_pageflags'] ^ PAGE_CENSORED;
q("UPDATE channel SET channel_pageflags = %d where channel_id = %d",
intval($pflags),
intval( $uid )
);
\Zotlabs\Daemon\Master::Summon(array('Directory',$uid,'nopush'));
notice( sprintf( (($pflags & PAGE_CENSORED) ? t("Channel '%s' censored"): t("Channel '%s' uncensored")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
}; break;
case "code":{
check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
$pflags = $channel[0]['channel_pageflags'] ^ PAGE_ALLOWCODE;
q("UPDATE channel SET channel_pageflags = %d where channel_id = %d",
intval($pflags),
intval( $uid )
);
notice( sprintf( (($pflags & PAGE_ALLOWCODE) ? t("Channel '%s' code allowed"): t("Channel '%s' code disallowed")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
}; break;
default:
break;
}
goaway(z_root() . '/admin/channels' );
}
$key = (($_REQUEST['key']) ? dbesc($_REQUEST['key']) : 'channel_id');
$dir = 'asc';
if(array_key_exists('dir',$_REQUEST))
$dir = ((intval($_REQUEST['dir'])) ? 'asc' : 'desc');
$base = z_root() . '/admin/channels?f=';
$odir = (($dir === 'asc') ? '0' : '1');
/* get channels */
$total = q("SELECT count(*) as total FROM channel where channel_removed = 0 and channel_system = 0");
if($total) {
\App::set_pager_total($total[0]['total']);
\App::set_pager_itemspage(100);
}
$channels = q("SELECT * from channel where channel_removed = 0 and channel_system = 0 order by $key $dir limit %d offset %d ",
intval(\App::$pager['itemspage']),
intval(\App::$pager['start'])
);
if($channels) {
for($x = 0; $x < count($channels); $x ++) {
if($channels[$x]['channel_pageflags'] & PAGE_CENSORED)
$channels[$x]['blocked'] = true;
else
$channels[$x]['blocked'] = false;
if($channels[$x]['channel_pageflags'] & PAGE_ALLOWCODE)
$channels[$x]['allowcode'] = true;
else
$channels[$x]['allowcode'] = false;
}
}
$t = get_markup_template('admin_channels.tpl');
$o = replace_macros($t, array(
// strings //
'$title' => t('Administration'),
'$page' => t('Channels'),
'$submit' => t('Submit'),
'$select_all' => t('select all'),
'$delete' => t('Delete'),
'$block' => t('Censor'),
'$unblock' => t('Uncensor'),
'$code' => t('Allow Code'),
'$uncode' => t('Disallow Code'),
'$h_channels' => t('Channel'),
'$base' => $base,
'$odir' => $odir,
'$th_channels' => array(
[ t('UID'), 'channel_id' ],
[ t('Name'), 'channel_name' ],
[ t('Address'), 'channel_address' ]),
'$confirm_delete_multi' => t('Selected channels will be deleted!\n\nEverything that was posted in these channels on this site will be permanently deleted!\n\nAre you sure?'),
'$confirm_delete' => t('The channel {0} will be deleted!\n\nEverything that was posted in this channel on this site will be permanently deleted!\n\nAre you sure?'),
'$form_security_token' => get_form_security_token('admin_channels'),
// values //
'$baseurl' => z_root(),
'$channels' => $channels,
));
$o .= paginate($a);
return $o;
}
}

View File

@@ -0,0 +1,68 @@
<?php
namespace Zotlabs\Module\Admin;
class Dbsync {
function get() {
$o = '';
if(argc() > 3 && intval(argv(3)) && argv(2) === 'mark') {
set_config('database', 'update_r' . intval(argv(3)), 'success');
if(intval(get_config('system','db_version')) <= intval(argv(3)))
set_config('system','db_version',intval(argv(3)) + 1);
info( t('Update has been marked successful') . EOL);
goaway(z_root() . '/admin/dbsync');
}
if(argc() > 2 && intval(argv(2))) {
require_once('install/update.php');
$func = 'update_r' . intval(argv(2));
if(function_exists($func)) {
$retval = $func();
if($retval === UPDATE_FAILED) {
$o .= sprintf( t('Executing %s failed. Check system logs.'), $func);
}
elseif($retval === UPDATE_SUCCESS) {
$o .= sprintf( t('Update %s was successfully applied.'), $func);
set_config('database',$func, 'success');
}
else
$o .= sprintf( t('Update %s did not return a status. Unknown if it succeeded.'), $func);
}
else
$o .= sprintf( t('Update function %s could not be found.'), $func);
return $o;
}
$failed = array();
$r = q("select * from config where cat = 'database' ");
if(count($r)) {
foreach($r as $rr) {
$upd = intval(substr($rr['k'],8));
if($rr['v'] === 'success')
continue;
$failed[] = $upd;
}
}
if(! count($failed))
return '<div class="generic-content-wrapper-styled"><h3>' . t('No failed updates.') . '</h3></div>';
$o = replace_macros(get_markup_template('failed_updates.tpl'),array(
'$base' => z_root(),
'$banner' => t('Failed Updates'),
'$desc' => '',
'$mark' => t('Mark success (if update was manually applied)'),
'$apply' => t('Attempt to execute this update step automatically'),
'$failed' => $failed
));
return $o;
}
}

View File

@@ -0,0 +1,74 @@
<?php
namespace Zotlabs\Module\Admin;
class Features {
function post() {
check_form_security_token_redirectOnErr('/admin/features', 'admin_manage_features');
logger('postvars: ' . print_r($_POST,true));
$arr = array();
$features = get_features(false);
foreach($features as $fname => $fdata) {
foreach(array_slice($fdata,1) as $f) {
$feature = $f[0];
if(array_key_exists('feature_' . $feature,$_POST))
$val = intval($_POST['feature_' . $feature]);
else
$val = 0;
set_config('feature',$feature,$val);
if(array_key_exists('featurelock_' . $feature,$_POST))
set_config('feature_lock',$feature,$val);
else
del_config('feature_lock',$feature);
}
}
goaway(z_root() . '/admin/features' );
}
function get() {
if((argc() > 1) && (argv(1) === 'features')) {
$arr = array();
$features = get_features(false);
foreach($features as $fname => $fdata) {
$arr[$fname] = array();
$arr[$fname][0] = $fdata[0];
foreach(array_slice($fdata,1) as $f) {
$set = get_config('feature',$f[0]);
if($set === false)
$set = $f[3];
$arr[$fname][1][] = array(
array('feature_' .$f[0],$f[1],$set,$f[2],array(t('Off'),t('On'))),
array('featurelock_' .$f[0],sprintf( t('Lock feature %s'),$f[1]),(($f[4] !== false) ? 1 : 0),'',array(t('Off'),t('On')))
);
}
}
$tpl = get_markup_template("admin_settings_features.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("admin_manage_features"),
'$title' => t('Manage Additional Features'),
'$features' => $arr,
'$submit' => t('Submit'),
));
return $o;
}
}
}

View File

@@ -0,0 +1,101 @@
<?php
namespace Zotlabs\Module\Admin;
class Logs {
/**
* @brief POST handler for logs admin page.
*
*/
function post() {
if (x($_POST, 'page_logs')) {
check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
$logfile = ((x($_POST,'logfile')) ? notags(trim($_POST['logfile'])) : '');
$debugging = ((x($_POST,'debugging')) ? true : false);
$loglevel = ((x($_POST,'loglevel')) ? intval(trim($_POST['loglevel'])) : 0);
set_config('system','logfile', $logfile);
set_config('system','debugging', $debugging);
set_config('system','loglevel', $loglevel);
}
info( t('Log settings updated.') );
goaway(z_root() . '/admin/logs' );
}
/**
* @brief Logs admin page.
*
* @return string
*/
function get() {
$log_choices = Array(
LOGGER_NORMAL => 'Normal',
LOGGER_TRACE => 'Trace',
LOGGER_DEBUG => 'Debug',
LOGGER_DATA => 'Data',
LOGGER_ALL => 'All'
);
$t = get_markup_template('admin_logs.tpl');
$f = get_config('system', 'logfile');
$data = '';
if(!file_exists($f)) {
$data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is
readable.");
}
else {
$fp = fopen($f, 'r');
if(!$fp) {
$data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
}
else {
$fstat = fstat($fp);
$size = $fstat['size'];
if($size != 0)
{
if($size > 5000000 || $size < 0)
$size = 5000000;
$seek = fseek($fp,0-$size,SEEK_END);
if($seek === 0) {
$data = escape_tags(fread($fp,$size));
while(! feof($fp))
$data .= escape_tags(fread($fp,4096));
}
}
fclose($fp);
}
}
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Logs'),
'$submit' => t('Submit'),
'$clear' => t('Clear'),
'$data' => $data,
'$baseurl' => z_root(),
'$logname' => get_config('system','logfile'),
// name, label, value, help string, extra data...
'$debugging' => array('debugging', t("Debugging"),get_config('system','debugging'), ""),
'$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your top-level webserver directory.")),
'$loglevel' => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
'$form_security_token' => get_form_security_token('admin_logs'),
));
}
}

View File

@@ -0,0 +1,475 @@
<?php
namespace Zotlabs\Module\Admin;
use \Zotlabs\Storage\GitRepo as GitRepo;
class Plugins {
function post() {
if(argc() > 2 && is_file("addon/" . argv(2) . "/" . argv(2) . ".php")) {
@include_once("addon/" . argv(2) . "/" . argv(2) . ".php");
if(function_exists(argv(2).'_plugin_admin_post')) {
$func = argv(2) . '_plugin_admin_post';
$func($a);
}
goaway(z_root() . '/admin/plugins/' . argv(2) );
}
elseif(argc() > 2) {
switch(argv(2)) {
case 'updaterepo':
if (array_key_exists('repoName', $_REQUEST)) {
$repoName = $_REQUEST['repoName'];
}
else {
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
}
$extendDir = 'store/[data]/git/sys/extend';
$addonDir = $extendDir . '/addon';
if (!file_exists($extendDir)) {
if (!mkdir($extendDir, 0770, true)) {
logger('Error creating extend folder: ' . $extendDir);
json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
}
else {
if (!symlink(realpath('extend/addon'), $addonDir)) {
logger('Error creating symlink to addon folder: ' . $addonDir);
json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
}
}
}
$repoDir = 'store/[data]/git/sys/extend/addon/' . $repoName;
if (!is_dir($repoDir)) {
logger('Repo directory does not exist: ' . $repoDir);
json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false));
}
if (!is_writable($repoDir)) {
logger('Repo directory not writable to web server: ' . $repoDir);
json_return_and_die(array('message' => 'Repo directory not writable to web server.', 'success' => false));
}
$git = new GitRepo('sys', null, false, $repoName, $repoDir);
try {
if ($git->pull()) {
$files = array_diff(scandir($repoDir), array('.', '..'));
foreach ($files as $file) {
if (is_dir($repoDir . '/' . $file) && $file !== '.git') {
$source = '../extend/addon/' . $repoName . '/' . $file;
$target = realpath('addon/') . '/' . $file;
unlink($target);
if (!symlink($source, $target)) {
logger('Error linking addons to /addon');
json_return_and_die(array('message' => 'Error linking addons to /addon', 'success' => false));
}
}
}
json_return_and_die(array('message' => 'Repo updated.', 'success' => true));
} else {
json_return_and_die(array('message' => 'Error updating addon repo.', 'success' => false));
}
} catch (\PHPGit\Exception\GitException $e) {
json_return_and_die(array('message' => 'Error updating addon repo.', 'success' => false));
}
case 'removerepo':
if (array_key_exists('repoName', $_REQUEST)) {
$repoName = $_REQUEST['repoName'];
} else {
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
}
$extendDir = 'store/[data]/git/sys/extend';
$addonDir = $extendDir . '/addon';
if (!file_exists($extendDir)) {
if (!mkdir($extendDir, 0770, true)) {
logger('Error creating extend folder: ' . $extendDir);
json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
} else {
if (!symlink(realpath('extend/addon'), $addonDir)) {
logger('Error creating symlink to addon folder: ' . $addonDir);
json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
}
}
}
$repoDir = 'store/[data]/git/sys/extend/addon/' . $repoName;
if (!is_dir($repoDir)) {
logger('Repo directory does not exist: ' . $repoDir);
json_return_and_die(array('message' => 'Invalid addon repo.', 'success' => false));
}
if (!is_writable($repoDir)) {
logger('Repo directory not writable to web server: ' . $repoDir);
json_return_and_die(array('message' => 'Repo directory not writable to web server.', 'success' => false));
}
// TODO: remove directory and unlink /addon/files
if (rrmdir($repoDir)) {
json_return_and_die(array('message' => 'Repo deleted.', 'success' => true));
} else {
json_return_and_die(array('message' => 'Error deleting addon repo.', 'success' => false));
}
case 'installrepo':
require_once('library/markdown.php');
if (array_key_exists('repoURL', $_REQUEST)) {
require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
$repoURL = $_REQUEST['repoURL'];
$extendDir = 'store/[data]/git/sys/extend';
$addonDir = $extendDir . '/addon';
if (!file_exists($extendDir)) {
if (!mkdir($extendDir, 0770, true)) {
logger('Error creating extend folder: ' . $extendDir);
json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
} else {
if (!symlink(realpath('extend/addon'), $addonDir)) {
logger('Error creating symlink to addon folder: ' . $addonDir);
json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
}
}
}
if (!is_writable($extendDir)) {
logger('Directory not writable to web server: ' . $extendDir);
json_return_and_die(array('message' => 'Directory not writable to web server.', 'success' => false));
}
$repoName = null;
if (array_key_exists('repoName', $_REQUEST) && $_REQUEST['repoName'] !== '') {
$repoName = $_REQUEST['repoName'];
} else {
$repoName = GitRepo::getRepoNameFromURL($repoURL);
}
if (!$repoName) {
logger('Invalid git repo');
json_return_and_die(array('message' => 'Invalid git repo', 'success' => false));
}
$repoDir = $addonDir . '/' . $repoName;
$tempRepoBaseDir = 'store/[data]/git/sys/temp/';
$tempAddonDir = $tempRepoBaseDir . $repoName;
if (!is_writable($addonDir) || !is_writable($tempAddonDir)) {
logger('Temp repo directory or /extend/addon not writable to web server: ' . $tempAddonDir);
json_return_and_die(array('message' => 'Temp repo directory not writable to web server.', 'success' => false));
}
rename($tempAddonDir, $repoDir);
if (!is_writable(realpath('addon/'))) {
logger('/addon directory not writable to web server: ' . $tempAddonDir);
json_return_and_die(array('message' => '/addon directory not writable to web server.', 'success' => false));
}
$files = array_diff(scandir($repoDir), array('.', '..'));
foreach ($files as $file) {
if (is_dir($repoDir . '/' . $file) && $file !== '.git') {
$source = '../extend/addon/' . $repoName . '/' . $file;
$target = realpath('addon/') . '/' . $file;
unlink($target);
if (!symlink($source, $target)) {
logger('Error linking addons to /addon');
json_return_and_die(array('message' => 'Error linking addons to /addon', 'success' => false));
}
}
}
$git = new GitRepo('sys', $repoURL, false, $repoName, $repoDir);
$repo = $git->probeRepo();
json_return_and_die(array('repo' => $repo, 'message' => '', 'success' => true));
}
case 'addrepo':
require_once('library/markdown.php');
if (array_key_exists('repoURL', $_REQUEST)) {
require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
$repoURL = $_REQUEST['repoURL'];
$extendDir = 'store/[data]/git/sys/extend';
$addonDir = $extendDir . '/addon';
$tempAddonDir = realpath('store/[data]') . '/git/sys/temp';
if (!file_exists($extendDir)) {
if (!mkdir($extendDir, 0770, true)) {
logger('Error creating extend folder: ' . $extendDir);
json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
} else {
if (!symlink(realpath('extend/addon'), $addonDir)) {
logger('Error creating symlink to addon folder: ' . $addonDir);
json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
}
}
}
if (!is_dir($tempAddonDir)) {
if (!mkdir($tempAddonDir, 0770, true)) {
logger('Error creating temp plugin repo folder: ' . $tempAddonDir);
json_return_and_die(array('message' => 'Error creating temp plugin repo folder: ' . $tempAddonDir, 'success' => false));
}
}
$repoName = null;
if (array_key_exists('repoName', $_REQUEST) && $_REQUEST['repoName'] !== '') {
$repoName = $_REQUEST['repoName'];
} else {
$repoName = GitRepo::getRepoNameFromURL($repoURL);
}
if (!$repoName) {
logger('Invalid git repo');
json_return_and_die(array('message' => 'Invalid git repo: ' . $repoName, 'success' => false));
}
$repoDir = $tempAddonDir . '/' . $repoName;
if (!is_writable($tempAddonDir)) {
logger('Temporary directory for new addon repo is not writable to web server: ' . $tempAddonDir);
json_return_and_die(array('message' => 'Temporary directory for new addon repo is not writable to web server.', 'success' => false));
}
// clone the repo if new automatically
$git = new GitRepo('sys', $repoURL, true, $repoName, $repoDir);
$remotes = $git->git->remote();
$fetchURL = $remotes['origin']['fetch'];
if ($fetchURL !== $git->url) {
if (rrmdir($repoDir)) {
$git = new GitRepo('sys', $repoURL, true, $repoName, $repoDir);
} else {
json_return_and_die(array('message' => 'Error deleting existing addon repo.', 'success' => false));
}
}
$repo = $git->probeRepo();
$repo['readme'] = $repo['manifest'] = null;
foreach ($git->git->tree('master') as $object) {
if ($object['type'] == 'blob' && (strtolower($object['file']) === 'readme.md' || strtolower($object['file']) === 'readme')) {
$repo['readme'] = Markdown($git->git->cat->blob($object['hash']));
} else if ($object['type'] == 'blob' && strtolower($object['file']) === 'manifest.json') {
$repo['manifest'] = $git->git->cat->blob($object['hash']);
}
}
json_return_and_die(array('repo' => $repo, 'message' => '', 'success' => true));
} else {
json_return_and_die(array('message' => 'No repo URL provided', 'success' => false));
}
break;
default:
break;
}
}
}
function get() {
/*
* Single plugin
*/
if (\App::$argc == 3){
$plugin = \App::$argv[2];
if (!is_file("addon/$plugin/$plugin.php")){
notice( t("Item not found.") );
return '';
}
$enabled = in_array($plugin,\App::$plugins);
$info = get_plugin_info($plugin);
$x = check_plugin_versions($info);
// disable plugins which are installed but incompatible versions
if($enabled && ! $x) {
$enabled = false;
$idz = array_search($plugin, \App::$plugins);
if ($idz !== false) {
unset(\App::$plugins[$idz]);
uninstall_plugin($plugin);
set_config("system","addon", implode(", ",\App::$plugins));
}
}
$info['disabled'] = 1-intval($x);
if (x($_GET,"a") && $_GET['a']=="t"){
check_form_security_token_redirectOnErr('/admin/plugins', 'admin_plugins', 't');
$pinstalled = false;
// Toggle plugin status
$idx = array_search($plugin, \App::$plugins);
if ($idx !== false){
unset(\App::$plugins[$idx]);
uninstall_plugin($plugin);
$pinstalled = false;
info( sprintf( t("Plugin %s disabled."), $plugin ) );
} else {
\App::$plugins[] = $plugin;
install_plugin($plugin);
$pinstalled = true;
info( sprintf( t("Plugin %s enabled."), $plugin ) );
}
set_config("system","addon", implode(", ",\App::$plugins));
if($pinstalled) {
@require_once("addon/$plugin/$plugin.php");
if(function_exists($plugin.'_plugin_admin'))
goaway(z_root() . '/admin/plugins/' . $plugin);
}
goaway(z_root() . '/admin/plugins' );
}
// display plugin details
require_once('library/markdown.php');
if (in_array($plugin, \App::$plugins)){
$status = 'on';
$action = t('Disable');
} else {
$status = 'off';
$action = t('Enable');
}
$readme = null;
if (is_file("addon/$plugin/README.md")){
$readme = file_get_contents("addon/$plugin/README.md");
$readme = Markdown($readme);
} else if (is_file("addon/$plugin/README")){
$readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
}
$admin_form = '';
$r = q("select * from addon where plugin_admin = 1 and aname = '%s' limit 1",
dbesc($plugin)
);
if($r) {
@require_once("addon/$plugin/$plugin.php");
if(function_exists($plugin.'_plugin_admin')) {
$func = $plugin.'_plugin_admin';
$func($a, $admin_form);
}
}
$t = get_markup_template('admin_plugins_details.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Plugins'),
'$toggle' => t('Toggle'),
'$settings' => t('Settings'),
'$baseurl' => z_root(),
'$plugin' => $plugin,
'$status' => $status,
'$action' => $action,
'$info' => $info,
'$str_author' => t('Author: '),
'$str_maintainer' => t('Maintainer: '),
'$str_minversion' => t('Minimum project version: '),
'$str_maxversion' => t('Maximum project version: '),
'$str_minphpversion' => t('Minimum PHP version: '),
'$str_serverroles' => t('Compatible Server Roles: '),
'$str_requires' => t('Requires: '),
'$disabled' => t('Disabled - version incompatibility'),
'$admin_form' => $admin_form,
'$function' => 'plugins',
'$screenshot' => '',
'$readme' => $readme,
'$form_security_token' => get_form_security_token('admin_plugins'),
));
}
/*
* List plugins
*/
$plugins = array();
$files = glob('addon/*/');
if($files) {
foreach($files as $file) {
if (is_dir($file)){
list($tmp, $id) = array_map('trim', explode('/', $file));
$info = get_plugin_info($id);
$enabled = in_array($id,\App::$plugins);
$x = check_plugin_versions($info);
// disable plugins which are installed but incompatible versions
if($enabled && ! $x) {
$enabled = false;
$idz = array_search($id, \App::$plugins);
if ($idz !== false) {
unset(\App::$plugins[$idz]);
uninstall_plugin($id);
set_config("system","addon", implode(", ",\App::$plugins));
}
}
$info['disabled'] = 1-intval($x);
$plugins[] = array( $id, (($enabled)?"on":"off") , $info);
}
}
}
usort($plugins,'self::plugin_sort');
$allowManageRepos = false;
if(is_writable('extend/addon') && is_writable('store/[data]')) {
$allowManageRepos = true;
}
$admin_plugins_add_repo_form= replace_macros(
get_markup_template('admin_plugins_addrepo.tpl'), array(
'$post' => 'admin/plugins/addrepo',
'$desc' => t('Enter the public git repository URL of the plugin repo.'),
'$repoURL' => array('repoURL', t('Plugin repo git URL'), '', ''),
'$repoName' => array('repoName', t('Custom repo name'), '', '', t('(optional)')),
'$submit' => t('Download Plugin Repo')
)
);
$newRepoModalID = random_string(3);
$newRepoModal = replace_macros(
get_markup_template('generic_modal.tpl'), array(
'$id' => $newRepoModalID,
'$title' => t('Install new repo'),
'$ok' => t('Install'),
'$cancel' => t('Cancel')
)
);
$reponames = $this->listAddonRepos();
$addonrepos = [];
foreach($reponames as $repo) {
$addonrepos[] = array('name' => $repo, 'description' => '');
// TODO: Parse repo info to provide more information about repos
}
$t = get_markup_template('admin_plugins.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Plugins'),
'$submit' => t('Submit'),
'$baseurl' => z_root(),
'$function' => 'plugins',
'$plugins' => $plugins,
'$disabled' => t('Disabled - version incompatibility'),
'$form_security_token' => get_form_security_token('admin_plugins'),
'$allowManageRepos' => $allowManageRepos,
'$managerepos' => t('Manage Repos'),
'$installedtitle' => t('Installed Plugin Repositories'),
'$addnewrepotitle' => t('Install a New Plugin Repository'),
'$expandform' => false,
'$form' => $admin_plugins_add_repo_form,
'$newRepoModal' => $newRepoModal,
'$newRepoModalID' => $newRepoModalID,
'$addonrepos' => $addonrepos,
'$repoUpdateButton' => t('Update'),
'$repoBranchButton' => t('Switch branch'),
'$repoRemoveButton' => t('Remove')
));
}
function listAddonRepos() {
$addonrepos = [];
$addonDir = 'extend/addon/';
if(is_dir($addonDir)) {
if ($handle = opendir($addonDir)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
$addonrepos[] = $entry;
}
}
closedir($handle);
}
}
return $addonrepos;
}
static public function plugin_sort($a,$b) {
return(strcmp(strtolower($a[2]['name']),strtolower($b[2]['name'])));
}
}

View File

@@ -0,0 +1,169 @@
<?php
namespace Zotlabs\Module\Admin;
class Profs {
function post() {
if(array_key_exists('basic',$_REQUEST)) {
$arr = explode(',',$_REQUEST['basic']);
for($x = 0; $x < count($arr); $x ++)
if(trim($arr[$x]))
$arr[$x] = trim($arr[$x]);
set_config('system','profile_fields_basic',$arr);
if(array_key_exists('advanced',$_REQUEST)) {
$arr = explode(',',$_REQUEST['advanced']);
for($x = 0; $x < count($arr); $x ++)
if(trim($arr[$x]))
$arr[$x] = trim($arr[$x]);
set_config('system','profile_fields_advanced',$arr);
}
goaway(z_root() . '/admin/profs');
}
if(array_key_exists('field_name',$_REQUEST)) {
if($_REQUEST['id']) {
$r = q("update profdef set field_name = '%s', field_type = '%s', field_desc = '%s' field_help = '%s', field_inputs = '%s' where id = %d",
dbesc($_REQUEST['field_name']),
dbesc($_REQUEST['field_type']),
dbesc($_REQUEST['field_desc']),
dbesc($_REQUEST['field_help']),
dbesc($_REQUEST['field_inputs']),
intval($_REQUEST['id'])
);
}
else {
$r = q("insert into profdef ( field_name, field_type, field_desc, field_help, field_inputs ) values ( '%s' , '%s', '%s', '%s', '%s' )",
dbesc($_REQUEST['field_name']),
dbesc($_REQUEST['field_type']),
dbesc($_REQUEST['field_desc']),
dbesc($_REQUEST['field_help']),
dbesc($_REQUEST['field_inputs'])
);
}
}
// add to chosen array basic or advanced
goaway(z_root() . '/admin/profs');
}
function get() {
if((argc() > 3) && argv(2) == 'drop' && intval(argv(3))) {
$r = q("delete from profdef where id = %d",
intval(argv(3))
);
// remove from allowed fields
goaway(z_root() . '/admin/profs');
}
if((argc() > 2) && argv(2) === 'new') {
return replace_macros(get_markup_template('profdef_edit.tpl'),array(
'$header' => t('New Profile Field'),
'$field_name' => array('field_name',t('Field nickname'),$_REQUEST['field_name'],t('System name of field')),
'$field_type' => array('field_type',t('Input type'),(($_REQUEST['field_type']) ? $_REQUEST['field_type'] : 'text'),''),
'$field_desc' => array('field_desc',t('Field Name'),$_REQUEST['field_desc'],t('Label on profile pages')),
'$field_help' => array('field_help',t('Help text'),$_REQUEST['field_help'],t('Additional info (optional)')),
'$submit' => t('Save')
));
}
if((argc() > 2) && intval(argv(2))) {
$r = q("select * from profdef where id = %d limit 1",
intval(argv(2))
);
if(! $r) {
notice( t('Field definition not found') . EOL);
goaway(z_root() . '/admin/profs');
}
return replace_macros(get_markup_template('profdef_edit.tpl'),array(
'$id' => intval($r[0]['id']),
'$header' => t('Edit Profile Field'),
'$field_name' => array('field_name',t('Field nickname'),$r[0]['field_name'],t('System name of field')),
'$field_type' => array('field_type',t('Input type'),$r[0]['field_type'],''),
'$field_desc' => array('field_desc',t('Field Name'),$r[0]['field_desc'],t('Label on profile pages')),
'$field_help' => array('field_help',t('Help text'),$r[0]['field_help'],t('Additional info (optional)')),
'$submit' => t('Save')
));
}
$basic = '';
$barr = array();
$fields = get_profile_fields_basic();
if(! $fields)
$fields = get_profile_fields_basic(1);
if($fields) {
foreach($fields as $k => $v) {
if($basic)
$basic .= ', ';
$basic .= trim($k);
$barr[] = trim($k);
}
}
$advanced = '';
$fields = get_profile_fields_advanced();
if(! $fields)
$fields = get_profile_fields_advanced(1);
if($fields) {
foreach($fields as $k => $v) {
if(in_array(trim($k),$barr))
continue;
if($advanced)
$advanced .= ', ';
$advanced .= trim($k);
}
}
$all = '';
$fields = get_profile_fields_advanced(1);
if($fields) {
foreach($fields as $k => $v) {
if($all)
$all .= ', ';
$all .= trim($k);
}
}
$r = q("select * from profdef where true");
if($r) {
foreach($r as $rr) {
if($all)
$all .= ', ';
$all .= $rr['field_name'];
}
}
$o = replace_macros(get_markup_template('admin_profiles.tpl'),array(
'$title' => t('Profile Fields'),
'$basic' => array('basic',t('Basic Profile Fields'),$basic,''),
'$advanced' => array('advanced',t('Advanced Profile Fields'),$advanced,t('(In addition to basic fields)')),
'$all' => $all,
'$all_desc' => t('All available fields'),
'$cust_field_desc' => t('Custom Fields'),
'$cust_fields' => $r,
'$edit' => t('Edit'),
'$drop' => t('Delete'),
'$new' => t('Create Custom Field'),
'$submit' => t('Submit')
));
return $o;
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace Zotlabs\Module\Admin;
class Queue {
function get() {
$o = '';
$expert = ((array_key_exists('expert',$_REQUEST)) ? intval($_REQUEST['expert']) : 0);
if($_REQUEST['drophub']) {
hubloc_mark_as_down($_REQUEST['drophub']);
remove_queue_by_posturl($_REQUEST['drophub']);
}
if($_REQUEST['emptyhub']) {
remove_queue_by_posturl($_REQUEST['emptyhub']);
}
$r = q("select count(outq_posturl) as total, max(outq_priority) as priority, outq_posturl from outq
where outq_delivered = 0 group by outq_posturl order by total desc");
for($x = 0; $x < count($r); $x ++) {
$r[$x]['eurl'] = urlencode($r[$x]['outq_posturl']);
$r[$x]['connected'] = datetime_convert('UTC',date_default_timezone_get(),$r[$x]['connected'],'Y-m-d');
}
$o = replace_macros(get_markup_template('admin_queue.tpl'), array(
'$banner' => t('Queue Statistics'),
'$numentries' => t('Total Entries'),
'$priority' => t('Priority'),
'$desturl' => t('Destination URL'),
'$nukehub' => t('Mark hub permanently offline'),
'$empty' => t('Empty queue for this hub'),
'$lastconn' => t('Last known contact'),
'$hasentries' => ((count($r)) ? true : false),
'$entries' => $r,
'$expert' => $expert
));
return $o;
}
}

View File

@@ -0,0 +1,123 @@
<?php
namespace Zotlabs\Module\Admin;
class Security {
function post() {
check_form_security_token_redirectOnErr('/admin/security', 'admin_security');
$allowed_email = ((x($_POST,'allowed_email')) ? notags(trim($_POST['allowed_email'])) : '');
$not_allowed_email = ((x($_POST,'not_allowed_email')) ? notags(trim($_POST['not_allowed_email'])) : '');
set_config('system','allowed_email', $allowed_email);
set_config('system','not_allowed_email', $not_allowed_email);
$block_public = ((x($_POST,'block_public')) ? True : False);
set_config('system','block_public',$block_public);
$ws = $this->trim_array_elems(explode("\n",$_POST['whitelisted_sites']));
set_config('system','whitelisted_sites',$ws);
$bs = $this->trim_array_elems(explode("\n",$_POST['blacklisted_sites']));
set_config('system','blacklisted_sites',$bs);
$wc = $this->trim_array_elems(explode("\n",$_POST['whitelisted_channels']));
set_config('system','whitelisted_channels',$wc);
$bc = $this->trim_array_elems(explode("\n",$_POST['blacklisted_channels']));
set_config('system','blacklisted_channels',$bc);
$embed_sslonly = ((x($_POST,'embed_sslonly')) ? True : False);
set_config('system','embed_sslonly',$embed_sslonly);
$we = $this->trim_array_elems(explode("\n",$_POST['embed_allow']));
set_config('system','embed_allow',$we);
$be = $this->trim_array_elems(explode("\n",$_POST['embed_deny']));
set_config('system','embed_deny',$be);
$ts = ((x($_POST,'transport_security')) ? True : False);
set_config('system','transport_security_header',$ts);
$cs = ((x($_POST,'content_security')) ? True : False);
set_config('system','content_security_policy',$cs);
goaway(z_root() . '/admin/security');
}
function get() {
$whitesites = get_config('system','whitelisted_sites');
$whitesites_str = ((is_array($whitesites)) ? implode($whitesites,"\n") : '');
$blacksites = get_config('system','blacklisted_sites');
$blacksites_str = ((is_array($blacksites)) ? implode($blacksites,"\n") : '');
$whitechannels = get_config('system','whitelisted_channels');
$whitechannels_str = ((is_array($whitechannels)) ? implode($whitechannels,"\n") : '');
$blackchannels = get_config('system','blacklisted_channels');
$blackchannels_str = ((is_array($blackchannels)) ? implode($blackchannels,"\n") : '');
$whiteembeds = get_config('system','embed_allow');
$whiteembeds_str = ((is_array($whiteembeds)) ? implode($whiteembeds,"\n") : '');
$blackembeds = get_config('system','embed_deny');
$blackembeds_str = ((is_array($blackembeds)) ? implode($blackembeds,"\n") : '');
$embed_coop = intval(get_config('system','embed_coop'));
if((! $whiteembeds) && (! $blackembeds)) {
$embedhelp1 = t("By default, unfiltered HTML is allowed in embedded media. This is inherently insecure.");
}
$embedhelp2 = t("The recommended setting is to only allow unfiltered HTML from the following sites:");
$embedhelp3 = t("https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />");
$embedhelp4 = t("All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked.");
$t = get_markup_template('admin_security.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Security'),
'$form_security_token' => get_form_security_token('admin_security'),
'$block_public' => array('block_public', t("Block public"), get_config('system','block_public'), t("Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated.")),
'$transport_security' => array('transport_security', t('Set "Transport Security" HTTP header'),intval(get_config('system','transport_security_header')),''),
'$content_security' => array('content_security', t('Set "Content Security Policy" HTTP header'),intval(get_config('system','content_security_policy')),''),
'$allowed_email' => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")),
'$not_allowed_email' => array('not_allowed_email', t("Not allowed email domains"), get_config('system','not_allowed_email'), t("Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined.")),
'$whitelisted_sites' => array('whitelisted_sites', t('Allow communications only from these sites'), $whitesites_str, t('One site per line. Leave empty to allow communication from anywhere by default')),
'$blacklisted_sites' => array('blacklisted_sites', t('Block communications from these sites'), $blacksites_str, ''),
'$whitelisted_channels' => array('whitelisted_channels', t('Allow communications only from these channels'), $whitechannels_str, t('One channel (hash) per line. Leave empty to allow from any channel by default')),
'$blacklisted_channels' => array('blacklisted_channels', t('Block communications from these channels'), $blackchannels_str, ''),
'$embed_sslonly' => array('embed_sslonly',t('Only allow embeds from secure (SSL) websites and links.'), intval(get_config('system','embed_sslonly')),''),
'$embed_allow' => array('embed_allow', t('Allow unfiltered embedded HTML content only from these domains'), $whiteembeds_str, t('One site per line. By default embedded content is filtered.')),
'$embed_deny' => array('embed_deny', t('Block embedded HTML from these domains'), $blackembeds_str, ''),
// '$embed_coop' => array('embed_coop', t('Cooperative embed security'), $embed_coop, t('Enable to share embed security with other compatible sites/hubs')),
'$submit' => t('Submit')
));
}
function trim_array_elems($arr) {
$narr = array();
if($arr && is_array($arr)) {
for($x = 0; $x < count($arr); $x ++) {
$y = trim($arr[$x]);
if($y)
$narr[] = $y;
}
}
return $narr;
}
}

View File

@@ -0,0 +1,321 @@
<?php
namespace Zotlabs\Module\Admin;
class Site {
/**
* @brief POST handler for Admin Site Page.
*
*/
function post(){
if (!x($_POST, 'page_site')) {
return;
}
check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
$sitename = ((x($_POST,'sitename')) ? notags(trim($_POST['sitename'])) : '');
$server_role = ((x($_POST,'server_role')) ? notags(trim($_POST['server_role'])) : 'standard');
$banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
$admininfo = ((x($_POST,'admininfo')) ? trim($_POST['admininfo']) : false);
$siteinfo = ((x($_POST,'siteinfo')) ? trim($_POST['siteinfo']) : '');
$language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : '');
$theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : '');
$theme_mobile = ((x($_POST,'theme_mobile')) ? notags(trim($_POST['theme_mobile'])) : '');
// $site_channel = ((x($_POST,'site_channel')) ? notags(trim($_POST['site_channel'])) : '');
$maximagesize = ((x($_POST,'maximagesize')) ? intval(trim($_POST['maximagesize'])) : 0);
$register_policy = ((x($_POST,'register_policy')) ? intval(trim($_POST['register_policy'])) : 0);
$access_policy = ((x($_POST,'access_policy')) ? intval(trim($_POST['access_policy'])) : 0);
$invite_only = ((x($_POST,'invite_only')) ? True : False);
$abandon_days = ((x($_POST,'abandon_days')) ? intval(trim($_POST['abandon_days'])) : 0);
$register_text = ((x($_POST,'register_text')) ? notags(trim($_POST['register_text'])) : '');
$frontpage = ((x($_POST,'frontpage')) ? notags(trim($_POST['frontpage'])) : '');
$mirror_frontpage = ((x($_POST,'mirror_frontpage')) ? intval(trim($_POST['mirror_frontpage'])) : 0);
$directory_server = ((x($_POST,'directory_server')) ? trim($_POST['directory_server']) : '');
$allowed_sites = ((x($_POST,'allowed_sites')) ? notags(trim($_POST['allowed_sites'])) : '');
$force_publish = ((x($_POST,'publish_all')) ? True : False);
$disable_discover_tab = ((x($_POST,'disable_discover_tab')) ? False : True);
$login_on_homepage = ((x($_POST,'login_on_homepage')) ? True : False);
$enable_context_help = ((x($_POST,'enable_context_help')) ? True : False);
$global_directory = ((x($_POST,'directory_submit_url')) ? notags(trim($_POST['directory_submit_url'])) : '');
$no_community_page = !((x($_POST,'no_community_page')) ? True : False);
$default_expire_days = ((array_key_exists('default_expire_days',$_POST)) ? intval($_POST['default_expire_days']) : 0);
$verifyssl = ((x($_POST,'verifyssl')) ? True : False);
$proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : '');
$proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : '');
$timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60);
$delivery_interval = ((x($_POST,'delivery_interval'))? intval(trim($_POST['delivery_interval'])) : 0);
$delivery_batch_count = ((x($_POST,'delivery_batch_count') && $_POST['delivery_batch_count'] > 0)? intval(trim($_POST['delivery_batch_count'])) : 1);
$poll_interval = ((x($_POST,'poll_interval')) ? intval(trim($_POST['poll_interval'])) : 0);
$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);
$techlevel = null;
if(array_key_exists('techlevel', $_POST))
$techlevel = intval($_POST['techlevel']);
set_config('system', 'server_role', $server_role);
set_config('system', 'feed_contacts', $feed_contacts);
set_config('system', 'delivery_interval', $delivery_interval);
set_config('system', 'delivery_batch_count', $delivery_batch_count);
set_config('system', 'poll_interval', $poll_interval);
set_config('system', 'maxloadavg', $maxloadavg);
set_config('system', 'frontpage', $frontpage);
set_config('system', 'mirror_frontpage', $mirror_frontpage);
set_config('system', 'sitename', $sitename);
set_config('system', 'login_on_homepage', $login_on_homepage);
set_config('system', 'enable_context_help', $enable_context_help);
set_config('system', 'verify_email', $verify_email);
set_config('system', 'default_expire_days', $default_expire_days);
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);
if ($banner == '') {
del_config('system', 'banner');
} else {
set_config('system', 'banner', $banner);
}
if ($admininfo == ''){
del_config('system', 'admininfo');
} else {
require_once('include/text.php');
linkify_tags($a, $admininfo, local_channel());
set_config('system', 'admininfo', $admininfo);
}
set_config('system','siteinfo',$siteinfo);
set_config('system', 'language', $language);
set_config('system', 'theme', $theme);
if ( $theme_mobile === '---' ) {
del_config('system', 'mobile_theme');
} else {
set_config('system', 'mobile_theme', $theme_mobile);
}
// set_config('system','site_channel', $site_channel);
set_config('system','maximagesize', $maximagesize);
set_config('system','register_policy', $register_policy);
set_config('system','invitation_only', $invite_only);
set_config('system','access_policy', $access_policy);
set_config('system','account_abandon_days', $abandon_days);
set_config('system','register_text', $register_text);
set_config('system','allowed_sites', $allowed_sites);
set_config('system','publish_all', $force_publish);
set_config('system','disable_discover_tab', $disable_discover_tab);
if ($global_directory == '') {
del_config('system', 'directory_submit_url');
} else {
set_config('system', 'directory_submit_url', $global_directory);
}
set_config('system','no_community_page', $no_community_page);
set_config('system','no_utf', $no_utf);
set_config('system','verifyssl', $verifyssl);
set_config('system','proxyuser', $proxyuser);
set_config('system','proxy', $proxy);
set_config('system','curl_timeout', $timeout);
info( t('Site settings updated.') . EOL);
goaway(z_root() . '/admin/site' );
}
/**
* @brief Admin page site.
*
* @return string with HTML
*/
function get() {
/* Installed langs */
$lang_choices = array();
$langs = glob('view/*/hstrings.php');
if(is_array($langs) && count($langs)) {
if(! in_array('view/en/hstrings.php',$langs))
$langs[] = 'view/en/';
asort($langs);
foreach($langs as $l) {
$t = explode("/",$l);
$lang_choices[$t[1]] = $t[1];
}
}
/* Installed themes */
$theme_choices_mobile["---"] = t("Default");
$theme_choices = array();
$files = glob('view/theme/*');
if($files) {
foreach($files as $file) {
$vars = '';
$f = basename($file);
$info = get_theme_info($f);
$compatible = check_plugin_versions($info);
if(!$compatible) {
$theme_choices[$f] = $theme_choices_mobile[$f] = sprintf(t('%s - (Incompatible)'), $f);
continue;
}
if (file_exists($file . '/library'))
continue;
if (file_exists($file . '/mobile'))
$vars = t('mobile');
if (file_exists($file . '/experimental'))
$vars .= t('experimental');
if (file_exists($file . '/unsupported'))
$vars .= t('unsupported');
if ($vars) {
$theme_choices[$f] = $f . ' (' . $vars . ')';
$theme_choices_mobile[$f] = $f . ' (' . $vars . ')';
}
else {
$theme_choices[$f] = $f;
$theme_choices_mobile[$f] = $f;
}
}
}
$dir_choices = null;
$dirmode = get_config('system','directory_mode');
$realm = get_directory_realm();
// directory server should not be set or settable unless we are a directory client
if($dirmode == DIRECTORY_MODE_NORMAL) {
$x = q("select site_url from site where site_flags in (%d,%d) and site_realm = '%s'",
intval(DIRECTORY_MODE_SECONDARY),
intval(DIRECTORY_MODE_PRIMARY),
dbesc($realm)
);
if($x) {
$dir_choices = array();
foreach($x as $xx) {
$dir_choices[$xx['site_url']] = $xx['site_url'];
}
}
}
/* Banner */
$banner = get_config('system', 'banner');
if($banner === false)
$banner = get_config('system','sitename');
$banner = htmlspecialchars($banner);
/* Admin Info */
$admininfo = get_config('system', 'admininfo');
/* Register policy */
$register_choices = Array(
REGISTER_CLOSED => t("No"),
REGISTER_APPROVE => t("Yes - with approval"),
REGISTER_OPEN => t("Yes")
);
/* Acess policy */
$access_choices = Array(
ACCESS_PRIVATE => t("My site is not a public server"),
ACCESS_PAID => t("My site has paid access only"),
ACCESS_FREE => t("My site has free access only"),
ACCESS_TIERED => t("My site offers free accounts with optional paid upgrades")
);
$discover_tab = get_config('system','disable_discover_tab');
// $disable public streams by default
if($discover_tab === false)
$discover_tab = 1;
// now invert the logic for the setting.
$discover_tab = (1 - $discover_tab);
$server_roles = [
'basic' => t('Basic/Minimal Social Networking'),
'standard' => t('Standard Configuration (default)'),
'pro' => t('Professional')
];
$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')
];
$homelogin = get_config('system','login_on_homepage');
$enable_context_help = get_config('system','enable_context_help');
$t = get_markup_template("admin_site.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Site'),
'$submit' => t('Submit'),
'$registration' => t('Registration'),
'$upload' => t('File upload'),
'$corporate' => t('Policies'),
'$advanced' => t('Advanced'),
'$baseurl' => z_root(),
// name, label, value, help string, extra data...
'$sitename' => array('sitename', t("Site name"), htmlspecialchars(get_config('system','sitename'), ENT_QUOTES, 'UTF-8'),''),
'$server_role' => array('server_role', t("Server Configuration/Role"), get_config('system','server_role'),'',$server_roles),
'$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, ""),
'$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")),
'$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
'$theme' => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices),
'$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile_theme'), t("Theme for mobile devices"), $theme_choices_mobile),
// '$site_channel' => array('site_channel', t("Channel to use for this website's static pages"), get_config('system','site_channel'), t("Site Channel")),
'$feed_contacts' => array('feed_contacts', t('Allow Feeds as Connections'),get_config('system','feed_contacts'),t('(Heavy system resource usage)')),
'$maximagesize' => array('maximagesize', t("Maximum image size"), intval(get_config('system','maximagesize')), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")),
'$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.")),
'$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),
'$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.")),
'$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.")),
'$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")),
'$verify_email' => array('verify_email', t("Verify Email Addresses"), get_config('system','verify_email'), t("Check to verify email addresses used in account registration (recommended).")),
'$force_publish' => array('publish_all', t("Force publish"), get_config('system','publish_all'), t("Check to force all profiles on this site to be listed in the site directory.")),
'$disable_discover_tab' => array('disable_discover_tab', t('Import Public Streams'), $discover_tab, t('Import and allow access to public content pulled from other sites. Warning: this content is unmoderated.')),
'$login_on_homepage' => array('login_on_homepage', t("Login on Homepage"),((intval($homelogin) || $homelogin === false) ? 1 : '') , t("Present a login box to visitors on the home page if no other content has been configured.")),
'$enable_context_help' => array('enable_context_help', t("Enable context help"),((intval($enable_context_help) === 1 || $enable_context_help === false) ? 1 : 0) , t("Display contextual help for the current page when the help button is pressed.")),
'$directory_server' => (($dir_choices) ? array('directory_server', t("Directory Server URL"), get_config('system','directory_server'), t("Default directory server"), $dir_choices) : null),
'$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
'$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
'$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")),
'$delivery_interval' => array('delivery_interval', t("Delivery interval"), (x(get_config('system','delivery_interval'))?get_config('system','delivery_interval'):2), t("Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers.")),
'$delivery_batch_count' => array('delivery_batch_count', t('Deliveries per process'),(x(get_config('system','delivery_batch_count'))?get_config('system','delivery_batch_count'):1), t("Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5.")),
'$poll_interval' => array('poll_interval', t("Poll interval"), (x(get_config('system','poll_interval'))?get_config('system','poll_interval'):2), t("Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval.")),
'$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")),
'$default_expire_days' => array('default_expire_days', t('Expiration period in days for imported (grid/network) content'), intval(get_config('system','default_expire_days')), t('0 for no expiration of imported content')),
'$form_security_token' => get_form_security_token("admin_site"),
));
}
}

View File

@@ -0,0 +1,233 @@
<?php
namespace Zotlabs\Module\Admin;
class Themes {
function post() {
$theme = argv(2);
if (is_file("view/theme/$theme/php/config.php")){
require_once("view/theme/$theme/php/config.php");
// fixme add parent theme if derived
if (function_exists("theme_admin_post")){
theme_admin_post($a);
}
}
info(t('Theme settings updated.'));
if(is_ajax())
return;
goaway(z_root() . '/admin/themes/' . $theme );
}
/**
* @brief Themes admin page.
*
* @return string
*/
function get(){
$allowed_themes_str = get_config('system', 'allowed_themes');
$allowed_themes_raw = explode(',', $allowed_themes_str);
$allowed_themes = array();
if(count($allowed_themes_raw))
foreach($allowed_themes_raw as $x)
if(strlen(trim($x)))
$allowed_themes[] = trim($x);
$themes = array();
$files = glob('view/theme/*');
if($files) {
foreach($files as $file) {
$f = basename($file);
$is_experimental = intval(file_exists($file . '/.experimental'));
$is_supported = 1-(intval(file_exists($file . '/.unsupported'))); // Is not used yet
$is_allowed = intval(in_array($f,$allowed_themes));
$themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
}
}
if(! count($themes)) {
notice( t('No themes found.'));
return '';
}
/*
* Single theme
*/
if (\App::$argc == 3){
$theme = \App::$argv[2];
if(! is_dir("view/theme/$theme")){
notice( t("Item not found.") );
return '';
}
if (x($_GET,"a") && $_GET['a']=="t"){
check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
// Toggle theme status
$this->toggle_theme($themes, $theme, $result);
$s = $this->rebuild_theme_table($themes);
if($result)
info( sprintf('Theme %s enabled.', $theme));
else
info( sprintf('Theme %s disabled.', $theme));
set_config('system', 'allowed_themes', $s);
goaway(z_root() . '/admin/themes' );
}
// display theme details
require_once('library/markdown.php');
if ($this->theme_status($themes,$theme)) {
$status="on"; $action= t("Disable");
} else {
$status="off"; $action= t("Enable");
}
$readme=Null;
if (is_file("view/theme/$theme/README.md")){
$readme = file_get_contents("view/theme/$theme/README.md");
$readme = Markdown($readme);
} else if (is_file("view/theme/$theme/README")){
$readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
}
$admin_form = '';
if (is_file("view/theme/$theme/php/config.php")){
require_once("view/theme/$theme/php/config.php");
if(function_exists("theme_admin")){
$admin_form = theme_admin($a);
}
}
$screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
if(! stristr($screenshot[0],$theme))
$screenshot = null;
$t = get_markup_template('admin_plugins_details.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Themes'),
'$toggle' => t('Toggle'),
'$settings' => t('Settings'),
'$baseurl' => z_root(),
'$plugin' => $theme,
'$status' => $status,
'$action' => $action,
'$info' => get_theme_info($theme),
'$function' => 'themes',
'$admin_form' => $admin_form,
'$str_author' => t('Author: '),
'$str_maintainer' => t('Maintainer: '),
'$screenshot' => $screenshot,
'$readme' => $readme,
'$form_security_token' => get_form_security_token('admin_themes'),
));
}
/*
* List themes
*/
$xthemes = array();
if($themes) {
foreach($themes as $th) {
$xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
}
}
$t = get_markup_template('admin_plugins.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Themes'),
'$submit' => t('Submit'),
'$baseurl' => z_root(),
'$function' => 'themes',
'$plugins' => $xthemes,
'$experimental' => t('[Experimental]'),
'$unsupported' => t('[Unsupported]'),
'$form_security_token' => get_form_security_token('admin_themes'),
));
}
/**
* @param array $themes
* @param string $th
* @param int $result
*/
function toggle_theme(&$themes, $th, &$result) {
for($x = 0; $x < count($themes); $x ++) {
if($themes[$x]['name'] === $th) {
if($themes[$x]['allowed']) {
$themes[$x]['allowed'] = 0;
$result = 0;
}
else {
$themes[$x]['allowed'] = 1;
$result = 1;
}
}
}
}
/**
* @param array $themes
* @param string $th
* @return int
*/
function theme_status($themes, $th) {
for($x = 0; $x < count($themes); $x ++) {
if($themes[$x]['name'] === $th) {
if($themes[$x]['allowed']) {
return 1;
}
else {
return 0;
}
}
}
return 0;
}
/**
* @param array $themes
* @return string
*/
function rebuild_theme_table($themes) {
$o = '';
if(count($themes)) {
foreach($themes as $th) {
if($th['allowed']) {
if(strlen($o))
$o .= ',';
$o .= $th['name'];
}
}
}
return $o;
}
}

View File

@@ -3,37 +3,45 @@ namespace Zotlabs\Module;
require_once('include/api.php');
class Api extends \Zotlabs\Web\Controller {
function init() {
zot_api_init();
api_register_func('api/client/register', 'api_client_register', false);
api_register_func('api/oauth/request_token', 'api_oauth_request_token', false);
api_register_func('api/oauth/access_token', 'api_oauth_access_token', false);
$args = [];
call_hooks('api_register',$args);
return;
}
function post() {
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return;
}
if(count(\App::$user) && x(\App::$user,'uid') && \App::$user['uid'] != local_channel()) {
notice( t('Permission denied.') . EOL);
return;
}
}
function get() {
if(\App::$cmd=='api/oauth/authorize'){
function get() {
if(\App::$cmd === 'api/oauth/authorize'){
/*
* api/oauth/authorize interact with the user. return a standard page
*/
\App::$page['template'] = "minimal";
\App::$page['template'] = 'minimal';
// get consumer/client from request token
try {
$request = OAuth1Request::from_request();
} catch(Exception $e) {
}
catch(\Exception $e) {
echo "<pre>"; var_dump($e); killme();
}
@@ -41,17 +49,20 @@ class Api extends \Zotlabs\Web\Controller {
if(x($_POST,'oauth_yes')){
$app = $this->oauth_get_client($request);
if (is_null($app)) return "Invalid request. Unknown token.";
if (is_null($app))
return "Invalid request. Unknown token.";
$consumer = new OAuth1Consumer($app['client_id'], $app['pw'], $app['redirect_uri']);
$verifier = md5($app['secret'].local_channel());
set_config("oauth", $verifier, local_channel());
$verifier = md5($app['secret'] . local_channel());
set_config('oauth', $verifier, local_channel());
if($consumer->callback_url!=null) {
if($consumer->callback_url != null) {
$params = $request->get_parameters();
$glue="?";
if (strstr($consumer->callback_url,$glue)) $glue="?";
$glue = '?';
if(strstr($consumer->callback_url,$glue))
$glue = '?';
goaway($consumer->callback_url . $glue . "oauth_token=" . OAuth1Util::urlencode_rfc3986($params['oauth_token']) . "&oauth_verifier=" . OAuth1Util::urlencode_rfc3986($verifier));
killme();
}
@@ -59,7 +70,7 @@ class Api extends \Zotlabs\Web\Controller {
$tpl = get_markup_template("oauth_authorize_done.tpl");
$o = replace_macros($tpl, array(
'$title' => t('Authorize application connection'),
'$info' => t('Return to your app and insert this Securty Code:'),
'$info' => t('Return to your app and insert this Security Code:'),
'$code' => $verifier,
));
@@ -72,21 +83,18 @@ class Api extends \Zotlabs\Web\Controller {
notice( t('Please login to continue.') . EOL );
return login(false,'api-login',$request->get_parameters());
}
//FKOAuth1::loginUser(4);
$app = $this->oauth_get_client($request);
if (is_null($app)) return "Invalid request. Unknown token.";
if (is_null($app))
return "Invalid request. Unknown token.";
$tpl = get_markup_template('oauth_authorize.tpl');
$o = replace_macros($tpl, array(
'$title' => t('Authorize application connection'),
'$app' => $app,
'$title' => t('Authorize application connection'),
'$app' => $app,
'$authorize' => t('Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?'),
'$yes' => t('Yes'),
'$no' => t('No'),
'$yes' => t('Yes'),
'$no' => t('No'),
));
//echo "<pre>"; var_dump($app); killme();
@@ -94,29 +102,24 @@ class Api extends \Zotlabs\Web\Controller {
return $o;
}
echo api_call($a);
echo api_call();
killme();
}
function oauth_get_client($request){
$params = $request->get_parameters();
$token = $params['oauth_token'];
$token = $params['oauth_token'];
$r = q("SELECT `clients`.*
FROM `clients`, `tokens`
WHERE `clients`.`client_id`=`tokens`.`client_id`
AND `tokens`.`id`='%s' AND `tokens`.`auth_scope`='request'",
dbesc($token));
$r = q("SELECT clients.* FROM clients, tokens WHERE clients.client_id = tokens.client_id
AND tokens.id = '%s' AND tokens.auth_scope = 'request' ",
dbesc($token)
);
if($r)
return $r[0];
if (!count($r))
return null;
return null;
return $r[0];
}
}

View File

@@ -27,6 +27,7 @@ class Appman extends \Zotlabs\Web\Controller {
'price' => escape_tags($_REQUEST['price']),
'requires' => escape_tags($_REQUEST['requires']),
'system' => intval($_REQUEST['system']),
'plugin' => escape_tags($_REQUEST['plugin']),
'sig' => escape_tags($_REQUEST['sig']),
'categories' => escape_tags($_REQUEST['categories'])
);
@@ -35,8 +36,9 @@ class Appman extends \Zotlabs\Web\Controller {
if(Zlib\Apps::app_installed(local_channel(),$arr))
info( t('App installed.') . EOL);
return;
goaway(z_root() . '/apps');
return; //not reached
}
@@ -56,13 +58,18 @@ class Appman extends \Zotlabs\Web\Controller {
if($_POST['delete']) {
Zlib\Apps::app_destroy(local_channel(),$papp);
}
if($_POST['edit']) {
return;
}
if($_POST['feature']) {
Zlib\Apps::app_feature(local_channel(),$papp);
}
if($_SESSION['return_url'])
goaway(z_root() . '/' . $_SESSION['return_url']);
goaway(z_root() . '/apps');
@@ -75,7 +82,7 @@ class Appman extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
return;
}
$channel = \App::get_channel();
$app = null;
$embed = null;
@@ -121,6 +128,7 @@ class Appman extends \Zotlabs\Web\Controller {
'$price' => array('price', t('Price of app'),(($app) ? $app['app_price'] : ''), ''),
'$page' => array('page', t('Location (URL) to purchase app'),(($app) ? $app['app_page'] : ''), ''),
'$system' => (($app) ? intval($app['app_system']) : 0),
'$plugin' => (($app) ? $app['app_plugin'] : ''),
'$requires' => (($app) ? $app['app_requires'] : ''),
'$embed' => $embed,
'$submit' => t('Submit')

View File

@@ -1,7 +1,6 @@
<?php
namespace Zotlabs\Module;
//require_once('include/apps.php');
use \Zotlabs\Lib as Zlib;
@@ -13,16 +12,15 @@ class Apps extends \Zotlabs\Web\Controller {
$mode = 'edit';
else
$mode = 'list';
$_SESSION['return_url'] = \App::$cmd;
$_SESSION['return_url'] = \App::$query_string;
$apps = array();
if(local_channel()) {
Zlib\Apps::import_system_apps();
$syslist = array();
$list = Zlib\Apps::app_list(local_channel(), false, $_GET['cat']);
$list = Zlib\Apps::app_list(local_channel(), (($mode == 'edit') ? true : false), $_GET['cat']);
if($list) {
foreach($list as $x) {
$syslist[] = Zlib\Apps::app_encode($x);
@@ -40,12 +38,15 @@ class Apps extends \Zotlabs\Web\Controller {
foreach($syslist as $app) {
$apps[] = Zlib\Apps::app_render($app,$mode);
}
return replace_macros(get_markup_template('myapps.tpl'), array(
'$sitename' => get_config('system','sitename'),
'$cat' => ((array_key_exists('cat',$_GET) && $_GET['cat']) ? ' - ' . escape_tags($_GET['cat']) : ''),
'$cat' => ((array_key_exists('cat',$_GET) && $_GET['cat']) ? escape_tags($_GET['cat']) : ''),
'$title' => t('Apps'),
'$apps' => $apps,
'$authed' => ((local_channel()) ? true : false),
'$manage' => t('Manage apps'),
'$create' => (($mode == 'edit') ? t('Create new app') : '')
));
}

View File

@@ -14,7 +14,7 @@ class Attach extends \Zotlabs\Web\Controller {
return;
}
$r = attach_by_hash(argv(1),((argc() > 2) ? intval(argv(2)) : 0));
$r = attach_by_hash(argv(1),get_observer_hash(),((argc() > 2) ? intval(argv(2)) : 0));
if(! $r['success']) {
notice( $r['message'] . EOL);

View File

@@ -109,7 +109,7 @@ class Cal extends \Zotlabs\Web\Controller {
/* edit/create form */
if($event_id) {
$r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
$r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($event_id),
intval($channel['channel_id'])
);
@@ -209,6 +209,10 @@ class Cal extends \Zotlabs\Web\Controller {
$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
if(! perm_is_allowed(\App::$profile['uid'],get_observer_hash(),'view_contacts'))
$sql_extra .= " and etype != 'birthday' ";
if (x($_GET,'id')){
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d $sql_extra limit 1",
@@ -224,7 +228,7 @@ class Cal extends \Zotlabs\Web\Controller {
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on event_hash = resource_id
where resource_type = 'event' and event.uid = %d $ignored
where resource_type = 'event' and event.uid = %d and event.uid = item.uid $ignored
AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) $sql_extra ",
intval($channel['channel_id']),
@@ -288,8 +292,8 @@ class Cal extends \Zotlabs\Web\Controller {
$title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
}
$html = format_event_html($rr);
$rr['desc'] = bbcode($rr['desc']);
$rr['location'] = bbcode($rr['location']);
$rr['desc'] = zidify_links(smilies(bbcode($rr['desc'])));
$rr['location'] = zidify_links(smilies(bbcode($rr['location'])));
$events[] = array(
'id'=>$rr['id'],
'hash' => $rr['event_hash'],

View File

@@ -1,6 +1,6 @@
<?php
namespace Zotlabs\Module;
namespace Zotlabs\Module;
require_once('include/contact_widgets.php');
require_once('include/items.php');
@@ -10,6 +10,10 @@ 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 {
function init() {
@@ -34,26 +38,32 @@ class Channel extends \Zotlabs\Web\Controller {
if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
$which = $channel['channel_address'];
$profile = argv(1);
$profile = argv(1);
}
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Posts and comments') . '" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n" ;
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Only posts') . '" href="' . z_root() . '/feed/' . $which . '?top=1" />' . "\r\n" ;
head_add_link( [
'rel' => 'alternate',
'type' => 'application/atom+xml',
'title' => t('Posts and comments'),
'href' => z_root() . '/feed/' . $which
]);
head_add_link( [
'rel' => 'alternate',
'type' => 'application/atom+xml',
'title' => t('Only posts'),
'href' => z_root() . '/feed/' . $which . '?f=&top=1'
]);
// Not yet ready for prime time
// \App::$page['htmlhead'] .= '<link rel="openid.server" href="' . z_root() . '/id/' . $which .'?f=" />' . "\r\n" ;
// \App::$page['htmlhead'] .= '<link rel="openid.delegate" href="' . z_root() . '/channel/' . $which .'" />' . "\r\n" ;
// Run profile_load() here to make sure the theme is set before
// we start loading content
profile_load($which,$profile);
}
function get($update = 0, $load = false) {
if($load)
$_SESSION['loadtime'] = datetime_convert();
@@ -66,12 +76,13 @@ class Channel extends \Zotlabs\Web\Controller {
$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']) : '');
if(observer_prohibited(true)) {
if(observer_prohibited(true)) {
return login();
}
$category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : '');
$hashtags = ((x($_REQUEST,'tag')) ? $_REQUEST['tag'] : '');
$static = ((array_key_exists('static',$_REQUEST)) ? intval($_REQUEST['static']) : 0);
$groups = array();
@@ -108,20 +119,23 @@ class Channel extends \Zotlabs\Web\Controller {
if(! $update) {
$static = channel_manual_conv_update(\App::$profile['profile_uid']);
$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
$o .= common_friends_visitor_widget(\App::$profile['profile_uid']);
if($channel && $is_owner) {
$channel_acl = array(
'allow_cid' => $channel['channel_allow_cid'],
'allow_gid' => $channel['channel_allow_gid'],
'deny_cid' => $channel['channel_deny_cid'],
'allow_cid' => $channel['channel_allow_cid'],
'allow_gid' => $channel['channel_allow_gid'],
'deny_cid' => $channel['channel_deny_cid'],
'deny_gid' => $channel['channel_deny_gid']
);
}
else
$channel_acl = array();
else {
$channel_acl = [ 'allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '' ];
}
if($perms['post_wall']) {
@@ -133,17 +147,18 @@ class Channel extends \Zotlabs\Web\Controller {
'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') : ''),
'permissions' => (($is_owner) ? $channel_acl : ''),
'permissions' => $channel_acl,
'showacl' => (($is_owner) ? 'yes' : ''),
'bang' => '',
'visitor' => (($is_owner || $observer) ? true : false),
'profile_uid' => \App::$profile['profile_uid'],
'editor_autocomplete' => true,
'bbco_autocomplete' => 'bbcode',
'bbcode' => true
);
'bbcode' => true,
'jotnets' => true
);
$o .= status_editor($a,$x);
$o .= status_editor($a,$x);
}
}
@@ -166,23 +181,27 @@ class Channel extends \Zotlabs\Web\Controller {
$simple_update = (($update) ? " AND item_unseen = 1 " : '');
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n";
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($static && $simple_update)
$simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' ";
if(($update) && (! $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 AND item_unseen = 1 $sql_extra limit 1",
AND item_wall = 1 $simple_update $sql_extra limit 1",
dbesc($mid . '%'),
intval(\App::$profile['profile_uid'])
);
}
$_SESSION['loadtime'] = datetime_convert();
}
else {
$r = q("SELECT distinct parent AS `item_id`, created from item
$r = q("SELECT distinct parent AS item_id, created from item
left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids )
WHERE uid = %d $item_normal
AND item_wall = 1 $simple_update
@@ -198,10 +217,10 @@ class Channel extends \Zotlabs\Web\Controller {
else {
if(x($category)) {
$sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
$sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
}
if(x($hashtags)) {
$sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
$sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
}
if($datequery) {
@@ -225,10 +244,9 @@ class Channel extends \Zotlabs\Web\Controller {
if (! $r) {
notice( t('Permission denied.') . EOL);
}
}
}
else {
$r = q("SELECT distinct id AS item_id, created FROM item
$r = q("SELECT distinct id AS item_id, created FROM item
left join abook on item.author_xchan = abook.abook_xchan
WHERE uid = %d $item_normal
AND item_wall = 1 and item_thread_top = 1
@@ -247,11 +265,11 @@ class Channel extends \Zotlabs\Web\Controller {
if($r) {
$parents_str = ids_to_querystr($r,'item_id');
$items = q("SELECT `item`.*, `item`.`id` AS `item_id`
FROM `item`
WHERE `item`.`uid` = %d $item_normal
AND `item`.`parent` IN ( %s )
$items = q("SELECT item.*, item.id AS item_id
FROM item
WHERE item.uid = %d $item_normal
AND item.parent IN ( %s )
$sql_extra ",
intval(\App::$profile['profile_uid']),
dbesc($parents_str)
@@ -267,8 +285,7 @@ class Channel extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
}
}
else {
} else {
$items = array();
}
@@ -282,7 +299,7 @@ class Channel extends \Zotlabs\Web\Controller {
$maxheight = 400;
$o .= '<div id="live-channel"></div>' . "\r\n";
$o .= "<script> var profile_uid = " . \App::$profile['profile_uid']
$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";
@@ -301,6 +318,7 @@ class Channel extends \Zotlabs\Web\Controller {
'$nouveau' => '0',
'$wall' => '1',
'$fh' => '0',
'$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => '',
'$order' => '',
@@ -314,7 +332,6 @@ class Channel extends \Zotlabs\Web\Controller {
'$dbegin' => $datequery2
));
}
$update_unseen = '';
@@ -322,10 +339,10 @@ class Channel extends \Zotlabs\Web\Controller {
if($page_mode === 'list') {
/**
* in "list mode", only mark the parent item and any like activities as "seen".
* in "list mode", only mark the parent item and any like activities as "seen".
* We won't distinguish between comment likes and post likes. The important thing
* is that the number of unseen comments will be accurate. The SQL to separate the
* comment likes could also get somewhat hairy.
* comment likes could also get somewhat hairy.
*/
if($parents_str) {
@@ -348,7 +365,7 @@ class Channel extends \Zotlabs\Web\Controller {
if($checkjs->disabled()) {
$o .= conversation($a,$items,'channel',$update,'traditional');
}
}
else {
$o .= conversation($a,$items,'channel',$update,$page_mode);
}
@@ -359,7 +376,7 @@ class Channel extends \Zotlabs\Web\Controller {
\App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title'];
}
if($mid)
if($mid)
$o .= '<div id="content-complete"></div>';
return $o;

View File

@@ -58,7 +58,9 @@ class Chanview extends \Zotlabs\Web\Controller {
}
logger('mod_chanview: constructed address ' . print_r($matches,true));
}
$r = null;
if($_REQUEST['address']) {
$j = \Zotlabs\Zot\Finger::run($_REQUEST['address'],null);
if($j['success']) {
@@ -66,40 +68,74 @@ class Chanview extends \Zotlabs\Web\Controller {
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
dbesc($_REQUEST['address'])
);
if($r)
if($r) {
\App::$poi = $r[0];
}
}
if(! $r) {
if(discover_by_webbie($_REQUEST['address'])) {
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
dbesc($_REQUEST['address'])
);
if($r) {
\App::$poi = $r[0];
}
}
}
}
}
if(! \App::$poi) {
// We don't know who this is, and we can't figure it out from the URL
// On the plus side, there's a good chance we know somebody else at that
// hub so sending them there with a Zid will probably work anyway.
// We don't know who this is, and we can't figure it out from the URL
// On the plus side, there's a good chance we know somebody else at that
// hub so sending them there with a Zid will probably work anyway.
$url = ($_REQUEST['url']);
if(! $url) {
notice( t('Channel not found.') . EOL);
return;
}
if($observer)
$url = zid($url);
}
$is_zot = false;
if (\App::$poi) {
$url = \App::$poi['xchan_url'];
if($observer)
$url = zid($url);
$url = \App::$poi['xchan_url'];
if(\App::$poi['xchan_network'] === 'zot') {
$is_zot = true;
}
}
// let somebody over-ride the iframed viewport presentation
// or let's just declare this a failed experiment.
// We will load the chanview template if it's a foreign network,
// just so that we can provide a connect button along with a profile
// photo. Chances are we can't load the remote profile into an iframe
// because of cross-domain security headers. So provide a link to
// the remote profile.
// Zot channels will usually have a connect link.
// If it isn't zot, 'pro' members won't be able to use the connect
// button as it is a foreign network so just send them to the remote
// profile.
// if((! local_channel()) || (get_pconfig(local_channel(),'system','chanview_full')))
goaway($url);
// $o = replace_macros(get_markup_template('chanview.tpl'),array(
// '$url' => $url,
// '$full' => t('toggle full screen mode')
// ));
// return $o;
if($is_zot || \Zotlabs\Lib\System::get_server_role() === 'pro') {
if($is_zot && $observer) {
$url = zid($url);
}
goaway($url);
}
else {
$o = replace_macros(get_markup_template('chanview.tpl'),array(
'$url' => $url,
'$full' => t('toggle full screen mode')
));
return $o;
}
}
}

View File

@@ -33,9 +33,7 @@ class Chat extends \Zotlabs\Web\Controller {
$which = $channel['channel_address'];
$profile = argv(1);
}
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
// Run profile_load() here to make sure the theme is set before
// we start loading content

View File

@@ -111,8 +111,22 @@ class Chatsvc extends \Zotlabs\Web\Controller {
intval(\App::$data['chat']['room_id'])
);
if($r) {
foreach($r as $rr) {
switch($rr['cp_status']) {
foreach($r as $rv) {
if(! $rv['xchan_name']) {
$rv['xchan_hash'] = $rv['cp_xchan'];
$rv['xchan_name'] = substr($rv['cp_xchan'],strrpos($rv['cp_xchan'],'.')+1);
$rv['xchan_addr'] = '';
$rv['xchan_network'] = 'unknown';
$rv['xchan_url'] = z_root();
$rv['xchan_hidden'] = 1;
$rv['xchan_photo_mimetype'] = 'image/jpeg';
$rv['xchan_photo_l'] = get_default_profile_photo(300);
$rv['xchan_photo_m'] = get_default_profile_photo(80);
$rv['xchan_photo_s'] = get_default_profile_photo(48);
}
switch($rv['cp_status']) {
case 'away':
$status = t('Away');
$status_class = 'away';
@@ -124,7 +138,7 @@ class Chatsvc extends \Zotlabs\Web\Controller {
break;
}
$inroom[] = array('img' => zid($rr['xchan_photo_m']), 'img_type' => $rr['xchan_photo_mimetype'],'name' => $rr['xchan_name'], 'status' => $status, 'status_class' => $status_class);
$inroom[] = array('img' => zid($rv['xchan_photo_m']), 'img_type' => $rv['xchan_photo_mimetype'],'name' => $rv['xchan_name'], 'status' => $status, 'status_class' => $status_class);
}
}
@@ -143,7 +157,7 @@ class Chatsvc extends \Zotlabs\Web\Controller {
'name' => $rr['xchan_name'],
'isotime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'c'),
'localtime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'r'),
'text' => smilies(bbcode($rr['chat_text'])),
'text' => zidify_links(smilies(bbcode($rr['chat_text']))),
'self' => ((get_observer_hash() == $rr['chat_xchan']) ? 'self' : '')
);
}

View File

@@ -1,7 +1,7 @@
<?php
namespace Zotlabs\Module;
/**
* @file mod/cloud.php
* @file Zotlabs/Module/Cloud.php
* @brief Initialize Hubzilla's cloud (SabreDAV).
*
* Module for accessing the DAV storage area.
@@ -17,34 +17,33 @@ require_once('include/attach.php');
/**
* @brief Fires up the SabreDAV server.
* @brief Cloud Module.
*
* @param App &$a
*/
class Cloud extends \Zotlabs\Web\Controller {
/**
* @brief Fires up the SabreDAV server.
*
*/
function init() {
if (! is_dir('store'))
os_mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
$which = null;
if (argc() > 1)
$which = argv(1);
$profile = 0;
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n";
if ($which)
profile_load( $which, $profile);
$auth = new \Zotlabs\Storage\BasicAuth();
$ob_hash = get_observer_hash();
if ($ob_hash) {
if (local_channel()) {
$channel = \App::get_channel();
@@ -57,40 +56,38 @@ class Cloud extends \Zotlabs\Web\Controller {
}
$auth->observer = $ob_hash;
}
if ($_GET['davguest'])
$_SESSION['davguest'] = true;
$_SERVER['QUERY_STRING'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['QUERY_STRING']);
$_SERVER['QUERY_STRING'] = strip_zids($_SERVER['QUERY_STRING']);
$_SERVER['QUERY_STRING'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['QUERY_STRING']);
$_SERVER['REQUEST_URI'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI'] = strip_zids($_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['REQUEST_URI']);
$rootDirectory = new \Zotlabs\Storage\Directory('/', $auth);
// A SabreDAV server-object
$server = new SDAV\Server($rootDirectory);
// prevent overwriting changes each other with a lock backend
$lockBackend = new SDAV\Locks\Backend\File('store/[data]/locks');
$lockPlugin = new SDAV\Locks\Plugin($lockBackend);
$server->addPlugin($lockPlugin);
$is_readable = false;
// provide a directory view for the cloud in Hubzilla
$browser = new \Zotlabs\Storage\Browser($auth);
$auth->setBrowserPlugin($browser);
$server->addPlugin($browser);
// Experimental QuotaPlugin
// require_once('\Zotlabs\Storage/QuotaPlugin.php');
// $server->addPlugin(new \Zotlabs\Storage\\QuotaPlugin($auth));
ob_start();
// All we need to do now, is to fire up the server
$server->exec();
@@ -99,5 +96,5 @@ class Cloud extends \Zotlabs\Web\Controller {
killme();
}
}

View File

@@ -29,7 +29,7 @@ class Connect extends \Zotlabs\Web\Controller {
profile_load($which,'');
}
function post() {
function post() {
if(! array_key_exists('channel', \App::$data))
return;
@@ -60,13 +60,13 @@ class Connect extends \Zotlabs\Web\Controller {
$observer = \App::get_observer();
if(($observer) && ($_POST['submit'] === t('Continue'))) {
if($observer['xchan_follow'])
$url = sprintf($observer['xchan_follow'],urlencode(\App::$data['channel']['channel_address'] . '@' . \App::get_hostname()));
$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(\App::$data['channel']['channel_address'] . '@' . \App::get_hostname());
$url = $r[0]['hubloc_url'] . '/follow?f=&url=' . urlencode(channel_reddress(\App::$data['channel']));
}
}
if($url)
@@ -78,7 +78,7 @@ class Connect extends \Zotlabs\Web\Controller {
function get() {
function get() {
$edit = ((local_channel() && (local_channel() == \App::$data['channel']['channel_id'])) ? true : false);

View File

@@ -228,10 +228,18 @@ class Connections extends \Zotlabs\Web\Controller {
$contacts = array();
if(count($r)) {
if($r) {
vcard_query($r);
foreach($r as $rr) {
if($rr['xchan_url']) {
if(($rr['vcard']) && is_array($rr['vcard']['tels']) && $rr['vcard']['tels'][0]['nr'])
$phone = ((\App::$is_mobile || \App::$is_tablet) ? $rr['vcard']['tels'][0]['nr'] : '');
else
$phone = '';
$status_str = '';
$status = array(
@@ -261,12 +269,14 @@ class Connections extends \Zotlabs\Web\Controller {
'link' => z_root() . '/connedit/' . $rr['abook_id'],
'deletelink' => z_root() . '/connedit/' . intval($rr['abook_id']) . '/drop',
'delete' => t('Delete'),
'url' => chanlink_url($rr['xchan_url']),
'url' => chanlink_hash($rr['xchan_hash']),
'webbie_label' => t('Channel address'),
'webbie' => $rr['xchan_addr'],
'network_label' => t('Network'),
'network' => network_to_name($rr['xchan_network']),
'public_forum' => ((intval($rr['xchan_pubforum'])) ? true : false),
'call' => t('Call'),
'phone' => $phone,
'status_label' => t('Status'),
'status' => $status_str,
'connected_label' => t('Connected'),

View File

@@ -37,15 +37,17 @@ class Connedit extends \Zotlabs\Web\Controller {
intval(argv(1))
);
if($r) {
\App::$poi = $r[0];
\App::$poi = array_shift($r);
}
}
$channel = \App::get_channel();
if($channel)
head_set_icon($channel['xchan_photo_s']);
}
/* @brief Evaluate posted values and set changes
*
@@ -84,6 +86,12 @@ class Connedit extends \Zotlabs\Web\Controller {
call_hooks('contact_edit_post', $_POST);
$vc = get_abconfig(local_channel(),$orig_record['abook_xchan'],'system','vcard');
$vcard = (($vc) ? \Sabre\VObject\Reader::read($vc) : null);
$serialised_vcard = update_vcard($_REQUEST,$vcard);
if($serialised_vcard)
set_abconfig(local_channel(),$orig_record[0]['abook_xchan'],'system','vcard',$serialised_vcard);
if(intval($orig_record[0]['abook_self'])) {
$autoperms = intval($_POST['autoperms']);
$is_self = true;
@@ -96,7 +104,7 @@ class Connedit extends \Zotlabs\Web\Controller {
$profile_id = $_POST['profile_assign'];
if($profile_id) {
$r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND `uid` = %d LIMIT 1",
$r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND uid = %d LIMIT 1",
dbesc($profile_id),
intval(local_channel())
);
@@ -204,6 +212,7 @@ class Connedit extends \Zotlabs\Web\Controller {
}
if(($_REQUEST['pending']) && intval($orig_record[0]['abook_pending'])) {
$new_friend = true;
// @fixme it won't be common, but when you accept a new connection request
@@ -213,21 +222,13 @@ class Connedit extends \Zotlabs\Web\Controller {
// request. The workaround is to approve the connection, then go back and
// adjust permissions as desired.
$abook_my_perms = get_channel_default_perms(local_channel());
$role = get_pconfig(local_channel(),'system','permissions_role');
if($role) {
$x = \Zotlabs\Access\PermissionRoles::role_perms($role);
if($x['perms_connect']) {
$abook_my_perms = $x['perms_connect'];
$p = \Zotlabs\Access\Permissions::connect_perms(local_channel());
$my_perms = $p['perms'];
if($my_perms) {
foreach($my_perms as $k => $v) {
set_abconfig($channel['channel_id'],$orig_record[0]['abook_xchan'],'my_perms',$k,$v);
}
}
$filled_perms = \Zotlabs\Access\Permissions::FilledPerms($abook_my_perms);
foreach($filled_perms as $k => $v) {
set_abconfig($channel['channel_id'],$orig_record[0]['abook_xchan'],'my_perms',$k,$v);
}
}
$abook_pending = (($new_friend) ? 0 : $orig_record[0]['abook_pending']);
@@ -244,14 +245,6 @@ class Connedit extends \Zotlabs\Web\Controller {
intval(local_channel())
);
if($orig_record[0]['abook_profile'] != $profile_id) {
//Update profile photo permissions
logger('A new profile was assigned - updating profile photos');
profile_photo_set_profile_perms(local_channel(),$profile_id);
}
if($r)
info( t('Connection updated.') . EOL);
else
@@ -365,7 +358,7 @@ class Connedit extends \Zotlabs\Web\Controller {
intval(\App::$poi['abook_id'])
);
if($r) {
\App::$poi = $r[0];
\App::$poi = array_shift($r);
}
$clone = \App::$poi;
@@ -396,6 +389,7 @@ class Connedit extends \Zotlabs\Web\Controller {
return login();
}
$section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
$channel = \App::get_channel();
$my_perms = get_channel_default_perms(local_channel());
$role = get_pconfig(local_channel(),'system','permissions_role');
@@ -448,7 +442,7 @@ class Connedit extends \Zotlabs\Web\Controller {
}
if($cmd === 'resetphoto') {
q("update xchan set xchan_photo_date = '2001-01-01 00:00:00' where xchan_hash = '%s' limit 1",
q("update xchan set xchan_photo_date = '2001-01-01 00:00:00' where xchan_hash = '%s'",
dbesc($orig_record[0]['xchan_hash'])
);
$cmd = 'refresh';
@@ -521,11 +515,12 @@ class Connedit extends \Zotlabs\Web\Controller {
if($cmd === 'drop') {
// FIXME
// We need to send either a purge or a refresh packet to the other side (the channel being unfriended).
// The issue is that the abook DB record _may_ get destroyed when we call contact_remove. As the notifier runs
// in the background there could be a race condition preventing this packet from being sent in all cases.
// PLACEHOLDER
// @FIXME
// We need to send either a purge or a refresh packet to the other side (the channel being unfriended).
// The issue is that the abook DB record _may_ get destroyed when we call contact_remove. As the notifier
// runs in the background there could be a race condition preventing this packet from being sent in all
// cases.
// PLACEHOLDER
contact_remove(local_channel(), $orig_record[0]['abook_id']);
build_sync_packet(0 /* use the current local_channel */,
@@ -545,9 +540,33 @@ class Connedit extends \Zotlabs\Web\Controller {
if(\App::$poi) {
$abook_prev = 0;
$abook_next = 0;
$contact_id = \App::$poi['abook_id'];
$contact = \App::$poi;
$cn = q("SELECT abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and abook_self = 0 order by xchan_name",
intval(local_channel())
);
if($cn) {
$pntotal = count($cn);
for($x = 0; $x < $pntotal; $x ++) {
if($cn[$x]['abook_id'] == $contact_id) {
if($x === 0)
$abook_prev = 0;
else
$abook_prev = $cn[$x - 1]['abook_id'];
if($x === $pntotal)
$abook_next = 0;
else
$abook_next = $cn[$x +1]['abook_id'];
}
}
}
$tools = array(
'view' => array(
@@ -611,23 +630,49 @@ class Connedit extends \Zotlabs\Web\Controller {
),
);
$sections = [];
$sections['perms'] = [
'label' => t('Permissions'),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/?f=&section=perms',
'sel' => '',
'title' => t('Open Individual Permissions section by default'),
];
$self = false;
if(intval($contact['abook_self']))
if(intval($contact['abook_self'])) {
$self = true;
$abook_prev = $abook_next = 0;
}
$vc = get_abconfig(local_channel(),$contact['abook_xchan'],'system','vcard');
$vctmp = (($vc) ? \Sabre\VObject\Reader::read($vc) : null);
$vcard = (($vctmp) ? get_vcard_array($vctmp,$contact['abook_id']) : [] );
if(! $vcard)
$vcard['fn'] = $contact['xchan_name'];
$tpl = get_markup_template("abook_edit.tpl");
if(feature_enabled(local_channel(),'affinity')) {
$sections['affinity'] = [
'label' => t('Affinity'),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/?f=&section=affinity',
'sel' => '',
'title' => t('Open Set Affinity section by default'),
];
$labels = array(
$labels = [
t('Me'),
t('Family'),
t('Friends'),
t('Acquaintances'),
t('All')
);
];
call_hooks('affinity_labels',$labels);
$label_str = '';
@@ -649,6 +694,15 @@ class Connedit extends \Zotlabs\Web\Controller {
'$labels' => $label_str,
));
}
if(feature_enabled(local_channel(),'connfilter')) {
$sections['filter'] = [
'label' => t('Filter'),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/?f=&section=filter',
'sel' => '',
'title' => t('Open Custom Filter section by default'),
];
}
$rating_val = 0;
$rating_text = '';
@@ -663,13 +717,9 @@ class Connedit extends \Zotlabs\Web\Controller {
$rating_text = $xl[0]['xlink_rating_text'];
}
$poco_rating = get_config('system','poco_rating_enable');
$rating_enabled = get_config('system','rating_enabled');
// if unset default to enabled
if($poco_rating === false)
$poco_rating = true;
if($poco_rating) {
if($rating_enabled) {
$rating = replace_macros(get_markup_template('rating_slider.tpl'),array(
'$min' => -10,
'$val' => $rating_val
@@ -728,6 +778,15 @@ class Connedit extends \Zotlabs\Web\Controller {
$perms[] = array('perms_' . $k, $v, ((array_key_exists($k,$their_perms)) ? intval($their_perms[$k]) : ''),$thisperm, 1, (($checkinherited & PERMS_SPECIFIC) ? '' : '1'), '', $checkinherited);
}
$pcat = new \Zotlabs\Lib\Permcat(local_channel());
$pcatlist = $pcat->listing();
$permcats = [];
if($pcatlist) {
foreach($pcatlist as $pc) {
$permcats[$pc['name']] = $pc['localname'];
}
}
$locstr = '';
$locs = q("select hubloc_addr as location from hubloc left join site on hubloc_url = site_url where hubloc_hash = '%s'
@@ -749,11 +808,16 @@ class Connedit extends \Zotlabs\Web\Controller {
else
$locstr = t('none');
$o .= replace_macros($tpl,array(
$o .= replace_macros($tpl, [
'$header' => (($self) ? t('Connection Default Permissions') : sprintf( t('Connection: %s'),$contact['xchan_name'])),
'$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'), '', '',$permcats ],
'$permcat_new' => t('Add permission role'),
'$permcat_enable' => feature_enabled(local_channel(),'permcats'),
'$addr' => $contact['xchan_addr'],
'$section' => $section,
'$sections' => $sections,
'$vcard' => $vcard,
'$addr_text' => t('This connection\'s primary address is'),
'$loc_text' => t('Available locations:'),
'$locstr' => $locstr,
@@ -791,12 +855,42 @@ class Connedit extends \Zotlabs\Web\Controller {
'$permnote_self' => t('Some permissions may be inherited from your channel\'s <a href="settings"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes.'),
'$lastupdtext' => t('Last update:'),
'$last_update' => relative_date($contact['abook_connected']),
'$is_mobile' => ((\App::$is_mobile || \App::$is_tablet) ? true : false),
'$profile_select' => contact_profile_assign($contact['abook_profile']),
'$multiprofs' => $multiprofs,
'$contact_id' => $contact['abook_id'],
'$name' => $contact['xchan_name'],
));
'$abook_prev' => $abook_prev,
'$abook_next' => $abook_next,
'$vcard_label' => t('Details'),
'$displayname' => $displayname,
'$name_label' => t('Name'),
'$org_label' => t('Organisation'),
'$title_label' => t('Title'),
'$tel_label' => t('Phone'),
'$email_label' => t('Email'),
'$impp_label' => t('Instant messenger'),
'$url_label' => t('Website'),
'$adr_label' => t('Address'),
'$note_label' => t('Note'),
'$mobile' => t('Mobile'),
'$home' => t('Home'),
'$work' => t('Work'),
'$other' => t('Other'),
'$add_card' => t('Add Contact'),
'$add_field' => t('Add Field'),
'$create' => t('Create'),
'$update' => t('Update'),
'$delete' => t('Delete'),
'$cancel' => t('Cancel'),
'$po_box' => t('P.O. Box'),
'$extra' => t('Additional'),
'$street' => t('Street'),
'$locality' => t('Locality'),
'$region' => t('Region'),
'$zip_code' => t('ZIP Code'),
'$country' => t('Country')
]);
$arr = array('contact' => $contact,'output' => $o);
@@ -804,9 +898,6 @@ class Connedit extends \Zotlabs\Web\Controller {
return $arr['output'];
}
}
}
}

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 groups WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1",
intval(argv(1)),
intval(local_channel())
);

View File

@@ -88,7 +88,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
if($r) {
$base_image = $r[0];
$base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['content']) : dbunescbin($base_image['content']));
$base_image['content'] = (($r[0]['os_storage']) ? @file_get_contents(dbunescbin($base_image['content'])) : dbunescbin($base_image['content']));
$im = photo_factory($base_image['content'], $base_image['mimetype']);
if($im->is_valid()) {
@@ -309,7 +309,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$havescale = true;
}
$r = q("SELECT `content`, `mimetype`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
$r = q("SELECT content, mimetype, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1",
intval($r[0]['id']),
intval(local_channel())
@@ -320,7 +320,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
}
if(intval($r[0]['os_storage']))
$data = @file_get_contents($r[0]['content']);
$data = @file_get_contents(dbunescbin($r[0]['content']));
else
$data = dbunescbin($r[0]['content']);

View File

@@ -1,31 +1,26 @@
<?php
namespace Zotlabs\Module;
/**
* @file mod/dav.php
* @file Zotlabs/Module/Dav.php
* @brief Initialize Hubzilla's cloud (SabreDAV).
*
* Module for accessing the DAV storage area from a DAV client.
*/
namespace Zotlabs\Module;
use \Sabre\DAV as SDAV;
use \Zotlabs\Storage;
// composer autoloader for SabreDAV
require_once('vendor/autoload.php');
require_once('include/attach.php');
/**
* @brief Fires up the SabreDAV server.
*
* @param App &$a
*/
class Dav extends \Zotlabs\Web\Controller {
/**
* @brief Fires up the SabreDAV server.
*
*/
function init() {
// workaround for HTTP-auth in CGI mode
if (x($_SERVER, 'REDIRECT_REMOTE_USER')) {
$userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6)) ;
@@ -47,16 +42,16 @@ class Dav extends \Zotlabs\Web\Controller {
if (! is_dir('store'))
os_mkdir('store', STORAGE_DEFAULT_PERMISSIONS, false);
if (argc() > 1)
profile_load(argv(1),0);
$auth = new \Zotlabs\Storage\BasicAuth();
$auth->setRealm(ucfirst(\Zotlabs\Lib\System::get_platform_name()) . ' ' . 'WebDAV');
$rootDirectory = new \Zotlabs\Storage\Directory('/', $auth);
// A SabreDAV server-object
$server = new SDAV\Server($rootDirectory);
@@ -68,21 +63,20 @@ class Dav extends \Zotlabs\Web\Controller {
// prevent overwriting changes each other with a lock backend
$lockBackend = new SDAV\Locks\Backend\File('store/[data]/locks');
$lockPlugin = new SDAV\Locks\Plugin($lockBackend);
$server->addPlugin($lockPlugin);
// provide a directory view for the cloud in Hubzilla
$browser = new \Zotlabs\Storage\Browser($auth);
$auth->setBrowserPlugin($browser);
// Experimental QuotaPlugin
// require_once('Zotlabs/Storage/QuotaPlugin.php');
// $server->addPlugin(new \Zotlabs\Storage\QuotaPlugin($auth));
// All we need to do now, is to fire up the server
$server->exec();
killme();
}
}

View File

@@ -1,4 +1,5 @@
<?php
namespace Zotlabs\Module;
require_once('include/socgraph.php');
@@ -67,6 +68,7 @@ class Directory extends \Zotlabs\Web\Controller {
$observer = get_observer_hash();
$globaldir = get_directory_setting($observer, 'globaldir');
// override your personal global search pref if we're doing a navbar search of the directory
if(intval($_REQUEST['navsearch']))
$globaldir = 1;
@@ -84,10 +86,9 @@ class Directory extends \Zotlabs\Web\Controller {
$search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
if(strpos($search,'=') && local_channel() && get_pconfig(local_channel(),'feature','expert'))
if(strpos($search,'=') && local_channel() && feature_enabled(local_channel(), 'advanced_dirsearch'))
$advanced = $search;
$keywords = (($_GET['keywords']) ? $_GET['keywords'] : '');
// Suggest channels if no search terms or keywords are given
@@ -239,7 +240,9 @@ class Directory extends \Zotlabs\Web\Controller {
$page_type = '';
if($rr['total_ratings'])
$rating_enabled = get_config('system','rating_enabled');
if($rr['total_ratings'] && $rating_enabled)
$total_ratings = sprintf( tt("%d rating", "%d ratings", $rr['total_ratings']), $rr['total_ratings']);
else
$total_ratings = '';
@@ -260,10 +263,11 @@ class Directory extends \Zotlabs\Web\Controller {
$hometown = ((x($profile,'hometown') == 1) ? $profile['hometown'] : False);
$about = ((x($profile,'about') == 1) ? bbcode($profile['about']) : False);
$about = ((x($profile,'about') == 1) ? zidify_links(bbcode($profile['about'])) : False);
$keywords = ((x($profile,'keywords')) ? $profile['keywords'] : '');
$out = '';
if($keywords) {
@@ -312,7 +316,7 @@ class Directory extends \Zotlabs\Web\Controller {
'gender' => $gender,
'total_ratings' => $total_ratings,
'viewrate' => true,
'canrate' => ((local_channel()) ? true : false),
'canrate' => (($rating_enabled && local_channel()) ? true : false),
'pdesc' => $pdesc,
'pdesc_label' => t('Description:'),
'marital' => $marital,

View File

@@ -12,7 +12,7 @@ class Dirsearch extends \Zotlabs\Web\Controller {
}
function get() {
function get() {
$ret = array('success' => false);
@@ -185,7 +185,7 @@ class Dirsearch extends \Zotlabs\Web\Controller {
else {
$qlimit = " LIMIT " . intval($perpage) . " OFFSET " . intval($startrec);
if($return_total) {
$r = q("SELECT COUNT(xchan_hash) AS `total` FROM xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and xchan_network = 'zot' and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0 $safesql ");
$r = q("SELECT COUNT(xchan_hash) AS total FROM xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and xchan_network = 'zot' and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0 $safesql ");
if($r) {
$ret['total_items'] = $r[0]['total'];
}
@@ -410,13 +410,13 @@ class Dirsearch extends \Zotlabs\Web\Controller {
$rand = db_getfunc('rand');
$realm = get_directory_realm();
if($realm == DIRECTORY_REALM) {
$r = q("select * from site where site_access != 0 and site_register !=0 and ( site_realm = '%s' or site_realm = '') and site_type = %d order by $rand",
$r = q("select * from site where site_access != 0 and site_register !=0 and ( site_realm = '%s' or site_realm = '') and site_type = %d and site_dead = 0 order by $rand",
dbesc($realm),
intval(SITE_TYPE_ZOT)
);
}
else {
$r = q("select * from site where site_access != 0 and site_register !=0 and site_realm = '%s' and site_type = %d order by $rand",
$r = q("select * from site where site_access != 0 and site_register !=0 and site_realm = '%s' and site_type = %d and site_dead = 0 order by $rand",
dbesc($realm),
intval(SITE_TYPE_ZOT)
);
@@ -448,15 +448,15 @@ class Dirsearch extends \Zotlabs\Web\Controller {
$register = 'closed';
if(strpos($rr['site_url'],'https://') !== false)
$ret['sites'][] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project']);
$ret['sites'][] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project'], 'version' => $rr['site_version']);
else
$insecure[] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project']);
$insecure[] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project'], 'version' => $rr['site_version']);
}
if($insecure) {
$ret['sites'] = array_merge($ret['sites'],$insecure);
}
}
return $ret;
}
}
}

View File

@@ -1,12 +1,17 @@
<?php
namespace Zotlabs\Module;
require_once("include/bbcode.php");
require_once('include/security.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
require_once('include/items.php');
class Display extends \Zotlabs\Web\Controller {
function get($update = 0, $load = false) {
$checkjs = new \Zotlabs\Web\CheckJS(1);
if($load)
@@ -18,30 +23,21 @@ class Display extends \Zotlabs\Web\Controller {
return;
}
require_once("include/bbcode.php");
require_once('include/security.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
require_once('include/items.php');
\App::$page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'), array());
if(argc() > 1 && argv(1) !== 'load')
$item_hash = argv(1);
if($_REQUEST['mid'])
$item_hash = $_REQUEST['mid'];
if(! $item_hash) {
if(! $item_hash) {
\App::$error = 404;
notice( t('Item not found.') . EOL);
return;
}
$observer_is_owner = false;
$updateable = false;
if(local_channel() && (! $update)) {
@@ -73,7 +69,8 @@ class Display extends \Zotlabs\Web\Controller {
'expanded' => true,
'editor_autocomplete' => true,
'bbco_autocomplete' => 'bbcode',
'bbcode' => true
'bbcode' => true,
'jotnets' => true
);
$o = '<div id="jot-popup">';
@@ -92,9 +89,15 @@ class Display extends \Zotlabs\Web\Controller {
// find a copy of the item somewhere
$target_item = null;
if(strpos($item_hash,'b64.') === 0)
$decoded = @base64url_decode(substr($item_hash,4));
if($decoded)
$item_hash = $decoded;
$r = q("select id, uid, mid, parent_mid, item_type, item_deleted from item where mid like '%s' limit 1",
dbesc($item_hash . '%')
dbesc($item_hash . '%'),
dbesc($decoded . '%')
);
if($r) {
@@ -120,6 +123,8 @@ class Display extends \Zotlabs\Web\Controller {
return '';
}
}
$static = ((array_key_exists('static',$_REQUEST)) ? intval($_REQUEST['static']) : 0);
$simple_update = (($update) ? " AND item_unseen = 1 " : '');
@@ -129,10 +134,13 @@ class Display extends \Zotlabs\Web\Controller {
if($load)
$simple_update = '';
if($static && $simple_update)
$simple_update .= " and item_thread_top = 0 and author_xchan = '" . protect_sprintf(get_observer_hash()) . "' ";
if((! $update) && (! $load)) {
$static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 0);
$o .= '<div id="live-display"></div>' . "\r\n";
$o .= "<script> var profile_uid = " . ((intval(local_channel())) ? local_channel() : (-1))
@@ -153,6 +161,7 @@ class Display extends \Zotlabs\Web\Controller {
'$fh' => '0',
'$nouveau' => '0',
'$wall' => '0',
'$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$search' => '',
@@ -173,10 +182,9 @@ class Display extends \Zotlabs\Web\Controller {
$item_normal = item_normal();
$sql_extra = public_permissions_sql($observer_hash);
if(($update && $load) || ($checkjs->disabled())) {
$updateable = false;
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']),intval(\App::$pager['start']));
@@ -186,9 +194,9 @@ 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 * from item
$r = q("SELECT item.id as item_id from item
WHERE uid = %d
and mid = '%s'
$item_normal
@@ -202,6 +210,7 @@ class Display extends \Zotlabs\Web\Controller {
}
}
if($r === null) {
// in case somebody turned off public access to sys channel content using permissions
@@ -211,10 +220,10 @@ class Display extends \Zotlabs\Web\Controller {
$sysid = 0;
$r = q("SELECT * from item
$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 (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
AND item.deny_gid = '' AND item_private = 0 )
and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
OR uid = %d )
$sql_extra )
@@ -234,11 +243,11 @@ 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 * from item
$r = q("SELECT item.parent AS item_id from item
WHERE uid = %d
and mid = '%s'
and parent_mid = '%s'
$item_normal
$simple_update
limit 1",
@@ -249,16 +258,17 @@ class Display extends \Zotlabs\Web\Controller {
$updateable = true;
}
}
if($r === null) {
// in case somebody turned off public access to sys channel content using permissions
// make that content unsearchable by ensuring the owner_xchan can't match
if(! perm_is_allowed($sysid,$observer_hash,'view_stream'))
$sysid = 0;
$r = q("SELECT * 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 )
$r = q("SELECT item.parent AS item_id from item
WHERE parent_mid = '%s'
AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
AND item.deny_gid = '' AND item_private = 0 )
and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
OR uid = %d )
$sql_extra )
@@ -278,11 +288,11 @@ class Display extends \Zotlabs\Web\Controller {
if($r) {
$parents_str = ids_to_querystr($r,'id');
$parents_str = ids_to_querystr($r,'item_id');
if($parents_str) {
$items = q("SELECT `item`.*, `item`.`id` AS `item_id`
FROM `item`
$items = q("SELECT item.*, item.id AS item_id
FROM item
WHERE parent in ( %s ) $item_normal ",
dbesc($parents_str)
);
@@ -308,10 +318,10 @@ class Display extends \Zotlabs\Web\Controller {
if($updateable) {
$x = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 AND uid = %d and parent = %d ",
intval(local_channel()),
intval($r[0]['parent'])
intval($r[0]['item_id'])
);
}
$o .= '<div id="content-complete"></div>';
return $o;
@@ -320,7 +330,7 @@ class Display extends \Zotlabs\Web\Controller {
/*
elseif((! $update) && (! {
$r = q("SELECT `id`, item_flags FROM `item` WHERE `id` = '%s' OR `mid` = '%s' LIMIT 1",
$r = q("SELECT id, item_flags FROM item WHERE id = '%s' OR mid = '%s' LIMIT 1",
dbesc($item_hash),
dbesc($item_hash)
);

View File

@@ -21,10 +21,11 @@ class Dreport extends \Zotlabs\Web\Controller {
$table = 'push';
$mid = ((argc() > 2) ? argv(2) : '');
if($mid) {
$i = q("select id from item where mid = '%s' and author_xchan = '%s' and uid = %d",
$i = q("select id from item where mid = '%s' and uid = %d and ( author_xchan = '%s' or ( owner_xchan = '%s' and item_wall = 1 )) ",
dbesc($mid),
intval($channel['channel_id']),
dbesc($channel['channel_hash']),
intval($channel['channel_id'])
dbesc($channel['channel_hash'])
);
if($i) {
\Zotlabs\Daemon\Master::Summon([ 'Notifier', 'edit_post', $i[0]['id'] ]);
@@ -47,8 +48,9 @@ class Dreport extends \Zotlabs\Web\Controller {
switch($table) {
case 'item':
$i = q("select id from item where mid = '%s' and author_xchan = '%s' ",
$i = q("select id from item where mid = '%s' and ( author_xchan = '%s' or ( owner_xchan = '%s' and item_wall = 1 )) ",
dbesc($mid),
dbesc($channel['channel_hash']),
dbesc($channel['channel_hash'])
);
break;
@@ -74,7 +76,7 @@ class Dreport extends \Zotlabs\Web\Controller {
if(! $r) {
notice( t('no results') . EOL);
return;
// return;
}
for($x = 0; $x < count($r); $x++ ) {

View File

@@ -80,7 +80,7 @@ class Editblock extends \Zotlabs\Web\Controller {
return;
}
$itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
$itm = q("SELECT * FROM item WHERE id = %d and uid = %s LIMIT 1",
intval($post_id),
intval($owner)
);

View File

@@ -91,7 +91,7 @@ class Editlayout extends \Zotlabs\Web\Controller {
return;
}
$itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
$itm = q("SELECT * FROM item WHERE id = %d and uid = %s LIMIT 1",
intval($post_id),
intval($owner)
);

View File

@@ -25,7 +25,7 @@ class Editpost extends \Zotlabs\Web\Controller {
return;
}
$itm = q("SELECT * FROM `item` WHERE `id` = %d AND ( owner_xchan = '%s' OR author_xchan = '%s' ) LIMIT 1",
$itm = q("SELECT * FROM item WHERE id = %d AND ( owner_xchan = '%s' OR author_xchan = '%s' ) LIMIT 1",
intval($post_id),
dbesc(get_observer_hash()),
dbesc(get_observer_hash())
@@ -78,6 +78,7 @@ class Editpost extends \Zotlabs\Web\Controller {
$x = array(
'nickname' => $channel['channel_address'],
'item' => $itm[0],
'editor_autocomplete'=> true,
'bbco_autocomplete'=> 'bbcode',
'return_path' => $_SESSION['return_url'],
@@ -85,6 +86,7 @@ class Editpost extends \Zotlabs\Web\Controller {
'hide_voting' => true,
'hide_future' => true,
'hide_location' => true,
'parent' => (($itm[0]['mid'] === $itm[0]['parent_mid']) ? 0 : $itm[0]['parent']),
'mimetype' => $itm[0]['mimetype'],
'ptyp' => $itm[0]['obj_type'],
'body' => htmlspecialchars_decode(undo_post_tagging($itm[0]['body']),ENT_COMPAT),

View File

@@ -95,7 +95,7 @@ class Editwebpage extends \Zotlabs\Web\Controller {
$sql_extra = item_permissions_sql($owner);
$itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s $sql_extra LIMIT 1",
$itm = q("SELECT * FROM item WHERE id = %d and uid = %s $sql_extra LIMIT 1",
intval($post_id),
intval($owner)
);

View File

@@ -1,99 +1,96 @@
<?php
namespace Zotlabs\Module;
/**
* @brief
*
* This is the POST destination for the embedphotos button
*
*/
*/
class Embedphotos extends \Zotlabs\Web\Controller {
function get() {
}
/**
*
* This is the POST destination for the embedphotos button
*
*/
function post() {
if (argc() > 1 && argv(1) === 'album') {
// API: /embedphotos/album
$name = (x($_POST,'name') ? $_POST['name'] : null );
if (!$name) {
json_return_and_die(array('errormsg' => 'Error retrieving album', 'status' => false));
}
$album = $this->embedphotos_widget_album(array('channel' => \App::get_channel(), 'album' => $name));
json_return_and_die(array('status' => true, 'content' => $album));
}
if (argc() > 1 && argv(1) === 'albumlist') {
// API: /embedphotos/albumlist
$album_list = $this->embedphotos_album_list($a);
json_return_and_die(array('status' => true, 'albumlist' => $album_list));
}
if (argc() > 1 && argv(1) === 'photolink') {
// API: /embedphotos/photolink
$href = (x($_POST,'href') ? $_POST['href'] : null );
if (!$href) {
json_return_and_die(array('errormsg' => 'Error retrieving link ' . $href, 'status' => false));
}
$resource_id = array_pop(explode("/", $href));
$r = q("SELECT obj,body from item where resource_type = 'photo' and resource_id = '%s' limit 1",
dbesc($resource_id)
);
if(!$r) {
json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
}
$obj = json_decode($r[0]['obj'], true);
if(x($obj,'body')) {
$photolink = $obj['body'];
} elseif (x($obj,'bbcode')) {
$photolink = $obj['bbcode'];
} elseif ($r[0]['body'] !== '') {
$photolink = $r[0]['body'];
} else {
json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
}
json_return_and_die(array('status' => true, 'photolink' => $photolink));
}
if (argc() > 1 && argv(1) === 'album') {
// API: /embedphotos/album
$name = (x($_POST,'name') ? $_POST['name'] : null );
if(!$name) {
json_return_and_die(array('errormsg' => 'Error retrieving album', 'status' => false));
}
$album = $this->embedphotos_widget_album(array('channel' => \App::get_channel(), 'album' => $name));
json_return_and_die(array('status' => true, 'content' => $album));
}
if(argc() > 1 && argv(1) === 'albumlist') {
// API: /embedphotos/albumlist
$album_list = $this->embedphotos_album_list($a);
json_return_and_die(array('status' => true, 'albumlist' => $album_list));
}
if(argc() > 1 && argv(1) === 'photolink') {
// API: /embedphotos/photolink
$href = (x($_POST,'href') ? $_POST['href'] : null );
if(!$href) {
json_return_and_die(array('errormsg' => 'Error retrieving link ' . $href, 'status' => false));
}
$resource_id = array_pop(explode("/", $href));
$r = q("SELECT obj from item where resource_type = 'photo' and resource_id = '%s' limit 1",
dbesc($resource_id)
);
if(!$r) {
json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
}
$obj = json_decode($r[0]['obj'], true);
if(x($obj,'body')) {
$photolink = $obj['body'];
} elseif (x($obj,'bbcode')) {
$photolink = $obj['bbcode'];
} else {
json_return_and_die(array('errormsg' => 'Error retrieving resource ' . $resource_id, 'status' => false));
}
json_return_and_die(array('status' => true, 'photolink' => $photolink));
}
}
/**
* Copied from include/widgets.php::widget_album() with a modification to get the profile_uid from
* the input array as in widget_item()
* @param type $name
* @return string
*/
function embedphotos_widget_album($args) {
$channel_id = 0;
if(array_key_exists('channel',$args))
$channel = $args['channel'];
$channel_id = intval($channel['channel_id']);
if(! $channel_id)
$channel_id = \App::$profile_uid;
if(! $channel_id)
return '';
/**
* Copied from include/widgets.php::widget_album() with a modification to get the profile_uid from
* the input array as in widget_item()
*
* @param array $args
* @return string with HTML
*/
function embedphotos_widget_album($args) {
$channel_id = 0;
if(array_key_exists('channel', $args))
$channel = $args['channel'];
$channel_id = intval($channel['channel_id']);
if(! $channel_id)
$channel_id = \App::$profile_uid;
if(! $channel_id)
return '';
$owner_uid = $channel_id;
require_once('include/security.php');
$sql_extra = permissions_sql($channel_id);
require_once('include/security.php');
$sql_extra = permissions_sql($channel_id);
if(! perm_is_allowed($channel_id,get_observer_hash(),'view_storage'))
return '';
if(! perm_is_allowed($channel_id,get_observer_hash(),'view_storage'))
return '';
if($args['album'])
$album = (($args['album'] === '/') ? '' : $args['album'] );
if($args['title'])
$title = $args['title'];
if($args['album'])
$album = $args['album'];
if($args['title'])
$title = $args['title'];
/**
/**
* This may return incorrect permissions if you have multiple directories of the same name.
* It is a limitation of the photo table using a name for a photo album instead of a folder hash
*/
if($album) {
$x = q("select hash from attach where filename = '%s' and uid = %d limit 1",
dbesc($album),
@@ -109,34 +106,33 @@ function embedphotos_widget_album($args) {
$order = 'DESC';
$r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
(SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
(SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
ORDER BY created $order",
intval($owner_uid),
dbesc($album),
intval(PHOTO_NORMAL),
intval(PHOTO_PROFILE)
ORDER BY created $order",
intval($owner_uid),
dbesc($album),
intval(PHOTO_NORMAL),
intval(PHOTO_PROFILE)
);
$photos = array();
if(count($r)) {
$twist = 'rotright';
foreach($r as $rr) {
if($twist == 'rotright')
$twist = 'rotleft';
else
$twist = 'rotright';
$ext = $phototypes[$rr['mimetype']];
$imgalt_e = $rr['filename'];
$desc_e = $rr['description'];
$imagelink = (z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id']
if(count($r)) {
$twist = 'rotright';
foreach($r as $rr) {
if($twist == 'rotright')
$twist = 'rotleft';
else
$twist = 'rotright';
$ext = $phototypes[$rr['mimetype']];
$imgalt_e = $rr['filename'];
$desc_e = $rr['description'];
$imagelink = (z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $rr['resource_id']
. (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''));
$photos[] = array(
$photos[] = array(
'id' => $rr['id'],
'twist' => ' ' . $twist . rand(2,4),
'link' => $imagelink,
@@ -148,8 +144,8 @@ function embedphotos_widget_album($args) {
'hash'=> $rr['resource_id'],
'unknown' => t('Unknown')
);
}
}
}
$tpl = get_markup_template('photo_album.tpl');
$o .= replace_macros($tpl, array(
@@ -165,18 +161,16 @@ function embedphotos_widget_album($args) {
));
return $o;
}
}
function embedphotos_album_list($a) {
$o = '';
require_once('include/photos.php');
$p = photos_albums_list(\App::get_channel(), \App::get_observer());
if ($p['success']) {
return $p['albums'];
} else {
return null;
}
}
function embedphotos_album_list($a) {
require_once('include/photos.php');
$p = photos_albums_list(\App::get_channel(), \App::get_observer());
if($p['success']) {
return $p['albums'];
} else {
return null;
}
}
}

View File

@@ -43,6 +43,10 @@ class Events extends \Zotlabs\Web\Controller {
$adjust = intval($_POST['adjust']);
$nofinish = intval($_POST['nofinish']);
$timezone = ((x($_POST,'timezone_select')) ? notags(trim($_POST['timezone_select'])) : '');
$tz = (($timezone) ? $timezone : date_default_timezone_get());
$categories = escape_tags(trim($_POST['category']));
// only allow editing your own events.
@@ -57,9 +61,6 @@ class Events extends \Zotlabs\Web\Controller {
$start = sprintf('%d-%d-%d %d:%d:0',$startyear,$startmonth,$startday,$starthour,$startminute);
}
if($nofinish) {
$finish = NULL_DATE;
}
if($finish_text) {
$finish = $finish_text;
@@ -67,11 +68,16 @@ class Events extends \Zotlabs\Web\Controller {
else {
$finish = sprintf('%d-%d-%d %d:%d:0',$finishyear,$finishmonth,$finishday,$finishhour,$finishminute);
}
if($nofinish) {
$finish = NULL_DATE;
}
if($adjust) {
$start = datetime_convert(date_default_timezone_get(),'UTC',$start);
$start = datetime_convert($tz,'UTC',$start);
if(! $nofinish)
$finish = datetime_convert(date_default_timezone_get(),'UTC',$finish);
$finish = datetime_convert($tz,'UTC',$finish);
}
else {
$start = datetime_convert('UTC','UTC',$start);
@@ -118,8 +124,10 @@ class Events extends \Zotlabs\Web\Controller {
goaway($onerror_url);
}
$share = ((intval($_POST['share'])) ? intval($_POST['share']) : 0);
// $share = ((intval($_POST['distr'])) ? intval($_POST['distr']) : 0);
$share = 1;
$channel = \App::get_channel();
$acl = new \Zotlabs\Access\AccessList(false);
@@ -207,7 +215,6 @@ class Events extends \Zotlabs\Web\Controller {
$event = event_store_event($datarray);
if($post_tags)
$datarray['term'] = $post_tags;
@@ -336,7 +343,7 @@ class Events extends \Zotlabs\Web\Controller {
/* edit/create form */
if($event_id) {
$r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
$r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($event_id),
intval(local_channel())
);
@@ -371,11 +378,14 @@ class Events extends \Zotlabs\Web\Controller {
$event_xchan = ((x($orig_event)) ? $orig_event['event_xchan'] : $channel['channel_hash']);
$mid = ((x($orig_event)) ? $orig_event['mid'] : '');
if(! x($orig_event))
if(! x($orig_event)) {
$sh_checked = '';
else
$a_checked = ' checked="checked" ';
}
else {
$sh_checked = ((($orig_event['allow_cid'] === '<' . $channel['channel_hash'] . '>' || (! $orig_event['allow_cid'])) && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' );
}
if($orig_event['event_xchan'])
$sh_checked .= ' disabled="disabled" ';
@@ -438,8 +448,6 @@ class Events extends \Zotlabs\Web\Controller {
$permissions = ((x($orig_event)) ? $orig_event : $perm_defaults);
//print_r(acl2json($permissions['allow_gid'])); killme();
$tpl = get_markup_template('event_form.tpl');
$form = replace_macros($tpl,array(
@@ -467,9 +475,6 @@ class Events extends \Zotlabs\Web\Controller {
'$l_text' => (($event_id) ? t('Edit Location') : t('Location')),
'$l_orig' => $l_orig,
'$t_orig' => $t_orig,
'$sh_text' => t('Share this event'),
'$sh_checked' => $sh_checked,
'$share' => array('share', t('Share this event'), $sh_checked, '', array(t('No'),t('Yes'))),
'$preview' => t('Preview'),
'$perms_label' => t('Permission settings'),
// populating the acl dialog was a permission description from view_stream because Cal.php, which
@@ -480,6 +485,10 @@ class Events extends \Zotlabs\Web\Controller {
'$allow_gid' => acl2json($permissions['allow_gid']),
'$deny_cid' => acl2json($permissions['deny_cid']),
'$deny_gid' => acl2json($permissions['deny_gid']),
'$tz_choose' => feature_enabled(local_channel(),'event_tz_select'),
'$timezone' => array('timezone_select' , t('Timezone:'), date_default_timezone_get(), '', get_timezones()),
'$lockstate' => (($acl->is_private()) ? 'lock' : 'unlock'),
'$submit' => t('Submit'),
'$advanced' => t('Advanced Options')
@@ -545,8 +554,8 @@ class Events extends \Zotlabs\Web\Controller {
);
} elseif($export) {
$r = q("SELECT * from event where uid = %d
AND (( `adjust` = 0 AND ( `dtend` >= '%s' or nofinish = 1 ) AND `dtstart` <= '%s' )
OR ( `adjust` = 1 AND ( `dtend` >= '%s' or nofinish = 1 ) AND `dtstart` <= '%s' )) ",
AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) ",
intval(local_channel()),
dbesc($start),
dbesc($finish),
@@ -559,10 +568,10 @@ class Events extends \Zotlabs\Web\Controller {
// There's still an issue if the finish date crosses the end of month.
// Noting this for now - it will need to be fixed here and in Friendica.
// Ultimately the finish date shouldn't be involved in the query.
$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
from event left join item on event_hash = resource_id
where resource_type = 'event' and event.uid = %d $ignored
where resource_type = 'event' and event.uid = %d and event.uid = item.uid $ignored
AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) ",
intval(local_channel()),
@@ -571,7 +580,6 @@ class Events extends \Zotlabs\Web\Controller {
dbesc($adjust_start),
dbesc($adjust_finish)
);
}
$links = array();
@@ -609,6 +617,12 @@ class Events extends \Zotlabs\Web\Controller {
$end = null;
} else {
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtend'], 'c') : datetime_convert('UTC','UTC',$rr['dtend'],'c'));
// give a fake end to birthdays so they get crammed into a
// single day on the calendar
if($rr['etype'] === 'birthday')
$end = null;
}
@@ -620,14 +634,14 @@ class Events extends \Zotlabs\Web\Controller {
$drop = array(z_root().'/events/drop/'.$rr['event_hash'],t('Delete event'),'','');
$title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8'));
$title = strip_tags(html_entity_decode(zidify_links(bbcode($rr['summary'])),ENT_QUOTES,'UTF-8'));
if(! $title) {
list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
$title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
}
$html = format_event_html($rr);
$rr['desc'] = bbcode($rr['desc']);
$rr['location'] = bbcode($rr['location']);
$rr['desc'] = zidify_links(smilies(bbcode($rr['desc'])));
$rr['location'] = zidify_links(smilies(bbcode($rr['location'])));
$events[] = array(
'id'=>$rr['id'],
'hash' => $rr['event_hash'],
@@ -694,7 +708,7 @@ class Events extends \Zotlabs\Web\Controller {
}
if($mode === 'drop' && $event_id) {
$r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
$r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
dbesc($event_id),
intval(local_channel())
);
@@ -702,7 +716,7 @@ class Events extends \Zotlabs\Web\Controller {
$sync_event = $r[0];
if($r) {
$r = q("delete from event where event_hash = '%s' and uid = %d limit 1",
$r = q("delete from event where event_hash = '%s' and uid = %d",
dbesc($event_id),
intval(local_channel())
);

View File

@@ -32,7 +32,7 @@ class Fbrowser extends \Zotlabs\Web\Controller {
$sql_extra2 = " ORDER BY created DESC LIMIT 0, 10";
if (\App::$argc==2){
$albums = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d ",
$albums = q("SELECT distinct(album) AS album FROM photo WHERE uid = %d ",
intval(local_channel())
);
// anon functions only from 5.3.0... meglio tardi che mai..
@@ -43,14 +43,14 @@ class Fbrowser extends \Zotlabs\Web\Controller {
$album = "";
if (\App::$argc==3){
$album = hex2bin(\App::$argv[2]);
$sql_extra = sprintf("AND `album` = '%s' ",dbesc($album));
$sql_extra = sprintf("AND album = '%s' ",dbesc($album));
$sql_extra2 = "";
$path[]=array(z_root() . "/fbrowser/image/" . \App::$argv[2] . "/", $album);
}
$r = q("SELECT `resource_id`, `id`, `filename`, type, min(`imgscale`) AS `hiq`,max(`imgscale`) AS `loq`, `description`
FROM `photo` WHERE `uid` = %d $sql_extra
GROUP BY `resource_id` $sql_extra2",
$r = q("SELECT resource_id, id, filename, type, min(imgscale) AS hiq,max(imgscale) AS loq, description
FROM photo WHERE uid = %d $sql_extra
GROUP BY resource_id $sql_extra2",
intval(local_channel())
);
@@ -70,7 +70,7 @@ class Fbrowser extends \Zotlabs\Web\Controller {
break;
case "file":
if (\App::$argc==2){
$files = q("SELECT id, filename, filetype FROM `attach` WHERE `uid` = %d ",
$files = q("SELECT id, filename, filetype FROM attach WHERE uid = %d ",
intval(local_channel())
);

View File

@@ -1,71 +0,0 @@
<?php
namespace Zotlabs\Module;
class Ffsapi extends \Zotlabs\Web\Controller {
function get() {
$baseurl = z_root();
$name = get_config('system','sitename');
$description = t('Share content from Firefox to $Projectname');
$author = 'Mike Macgirvin';
$homepage = 'http://hubzilla.org';
$activate = t('Activate the Firefox $Projectname provider');
$s = <<< EOT
<script>
var baseurl = '$baseurl';
var data = {
"origin": baseurl,
// currently required
"name": '$name',
"iconURL": baseurl+"/images/hz-16.png",
"icon32URL": baseurl+"/images/hz-32.png",
"icon64URL": baseurl+"/images/hz-64.png",
// at least one of these must be defined
// "workerURL": baseurl+"/worker.js",
// "sidebarURL": baseurl+"/sidebar.htm",
"shareURL": baseurl+"/rpost?f=&url=%{url}",
// status buttons are scheduled for Firefox 26 or 27
//"statusURL": baseurl+"/statusPanel.html",
// social bookmarks are available in Firefox 26
"markURL": baseurl+"/rbmark?f=&url=%{url}&title=%{title}",
// icons should be 32x32 pixels
// "markedIcon": baseurl+"/images/checkbox-checked-32.png",
// "unmarkedIcon": baseurl+"/images/checkbox-unchecked-32.png",
"unmarkedIcon": baseurl+"/images/hz-bookmark-32.png",
// should be available for display purposes
"description": "$description",
"author": "$author",
"homepageURL": "$homepage",
// optional
"version": "1.0"
}
function activate(node) {
var event = new CustomEvent("ActivateSocialFeature");
var jdata = JSON.stringify(data);
node.setAttribute("data-service", JSON.stringify(data));
node.dispatchEvent(event);
}
</script>
<button onclick="activate(this)" title="$activate" class="btn btn-primary">$activate</button>
EOT;
return $s;
}
}

View File

@@ -42,7 +42,7 @@ class Fhublocs extends \Zotlabs\Web\Controller {
if($y)
$primary_address = $y[0]['xchan_addr'];
$hub_address = $rr['channel']['channel_address'] . '@' . \App::get_hostname();
$hub_address = channel_reddress($rr['channel']);
$primary = (($hub_address === $primary_address) ? 1 : 0);
@@ -56,19 +56,21 @@ class Fhublocs extends \Zotlabs\Web\Controller {
// Create a verified hub location pointing to this site.
$h = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_primary, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey, hubloc_network )
values ( '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s' )",
dbesc($rr['channel_guid']),
dbesc($rr['channel_guid_sig']),
dbesc($rr['channel_hash']),
dbesc($rr['channel_address'] . '@' . \App::get_hostname()),
intval($primary),
dbesc(z_root()),
dbesc(base64url_encode(rsa_sign(z_root(),$rr['channel_prvkey']))),
dbesc(\App::get_hostname()),
dbesc(z_root() . '/post'),
dbesc($sitekey),
dbesc('zot')
$h = hubloc_store_lowlevel(
[
'hubloc_guid' => $rr['channel_guid'],
'hubloc_guid_sig' => $rr['channel_guid_sig'],
'hubloc_hash' => $rr['channel_hash'],
'hubloc_addr' => channel_reddress($rr),
'hubloc_network' => 'zot',
'hubloc_primary' => $primary,
'hubloc_url' => z_root(),
'hubloc_url_sig' => base64url_encode(rsa_sign(z_root(),$rr['channel_prvkey'])),
'hubloc_host' => \App::get_hostname(),
'hubloc_callback' => z_root() . '/post',
'hubloc_sitekey' => $sitekey
]
);
if($h)

View File

@@ -12,7 +12,7 @@ class File_upload extends \Zotlabs\Web\Controller {
// logger('file upload: ' . print_r($_REQUEST,true));
$channel = (($_REQUEST['channick']) ? get_channel_by_nick($_REQUEST['channick']) : null);
$channel = (($_REQUEST['channick']) ? channelx_by_nick($_REQUEST['channick']) : null);
if(! $channel) {
logger('channel not found');

View File

@@ -1,7 +1,7 @@
<?php
namespace Zotlabs\Module;
/**
* @file mod/filestorage.php
* @file Zotlabs/Module/Filestorage.php
*
*/
@@ -16,43 +16,43 @@ require_once('include/attach.php');
class Filestorage extends \Zotlabs\Web\Controller {
function post() {
$channel_id = ((x($_POST, 'uid')) ? intval($_POST['uid']) : 0);
if((! $channel_id) || (! local_channel()) || ($channel_id != local_channel())) {
notice( t('Permission denied.') . EOL);
return;
}
$recurse = ((x($_POST, 'recurse')) ? intval($_POST['recurse']) : 0);
$resource = ((x($_POST, 'filehash')) ? notags($_POST['filehash']) : '');
$notify = ((x($_POST, 'notify')) ? intval($_POST['notify']) : 0);
if(! $resource) {
notice(t('Item not found.') . EOL);
return;
}
$channel = \App::get_channel();
$acl = new \Zotlabs\Access\AccessList($channel);
$acl->set_from_array($_REQUEST);
$x = $acl->get();
$cloudPath = get_parent_cloudpath($channel_id, $channel['channel_address'], $resource);
//get the object before permissions change so we can catch eventual former allowed members
$object = get_file_activity_object($channel_id, $resource, $cloudPath);
attach_change_permissions($channel_id, $resource, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], $recurse);
attach_change_permissions($channel_id, $resource, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], $recurse, true);
file_activity($channel_id, $object, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], 'post', $notify);
goaway($cloudPath);
}
function get() {
function get() {
if(argc() > 1)
$which = argv(1);
else {
@@ -60,7 +60,7 @@ class Filestorage extends \Zotlabs\Web\Controller {
\App::$error = 404;
return;
}
$r = q("select * from channel where channel_address = '%s'",
dbesc($which)
);
@@ -68,32 +68,32 @@ class Filestorage extends \Zotlabs\Web\Controller {
$channel = $r[0];
$owner = intval($r[0]['channel_id']);
}
$observer = \App::get_observer();
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
$perms = get_all_perms($owner, $ob_hash);
if(! $perms['view_storage']) {
notice( t('Permission denied.') . EOL);
return;
}
// Since we have ACL'd files in the wild, but don't have ACL here yet, we
// need to return for anyone other than the owner, despite the perms check for now.
$is_owner = (((local_channel()) && ($owner == local_channel())) ? true : false);
if(! $is_owner) {
info( t('Permission Denied.') . EOL );
return;
}
if(argc() > 3 && argv(3) === 'delete') {
if(! $perms['write_storage']) {
notice( t('Permission denied.') . EOL);
return;
}
$file = intval(argv(2));
$r = q("SELECT hash FROM attach WHERE id = %d AND uid = %d LIMIT 1",
dbesc($file),
@@ -103,17 +103,17 @@ class Filestorage extends \Zotlabs\Web\Controller {
notice( t('File not found.') . EOL);
goaway(z_root() . '/cloud/' . $which);
}
$f = $r[0];
$channel = \App::get_channel();
$parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
attach_delete($owner, $f['hash']);
goaway($parentpath);
}
if(argc() > 3 && argv(3) === 'edit') {
require_once('include/acl_selectors.php');
if(! $perms['write_storage']) {
@@ -121,23 +121,23 @@ class Filestorage extends \Zotlabs\Web\Controller {
return;
}
$file = intval(argv(2));
$r = q("select id, uid, folder, filename, revision, flags, is_dir, os_storage, hash, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and uid = %d limit 1",
intval($file),
intval($owner)
);
$f = $r[0];
$channel = \App::get_channel();
$cloudpath = get_cloudpath($f) . (intval($f['is_dir']) ? '?f=&davguest=1' : '');
$parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
$aclselect_e = populate_acl($f, false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage'));
$is_a_dir = (intval($f['is_dir']) ? true : false);
$lockstate = (($f['allow_cid'] || $f['allow_gid'] || $f['deny_cid'] || $f['deny_gid']) ? 'lock' : 'unlock');
$lockstate = (($f['allow_cid'] || $f['allow_gid'] || $f['deny_cid'] || $f['deny_gid']) ? 'lock' : 'unlock');
// Encode path that is used for link so it's a valid URL
// Keep slashes as slashes, otherwise mod_rewrite doesn't work correctly
$encoded_path = str_replace('%2F', '/', rawurlencode($cloudpath));
@@ -167,12 +167,12 @@ class Filestorage extends \Zotlabs\Web\Controller {
'$link_btn_title' => t('Show URL to this file'),
'$notify' => array('notify', t('Notify your contacts about this file'), 0, '', array(t('No'), t('Yes'))),
));
echo $o;
killme();
}
goaway(z_root() . '/cloud/' . $which);
}
}

View File

@@ -20,9 +20,6 @@ class Follow extends \Zotlabs\Web\Controller {
$channel = \App::get_channel();
// Warning: Do not edit the following line. The first symbol is UTF-8 &#65312;
$url = str_replace('@','@',$url);
$result = new_contact($uid,$url,$channel,true,$confirm);
if($result['success'] == false) {

View File

@@ -27,10 +27,12 @@ require_once('include/attach.php');
class Getfile extends \Zotlabs\Web\Controller {
function post() {
logger('post: ' . print_r($_POST,true),LOGGER_DEBUG,LOG_INFO);
$hash = $_POST['hash'];
$time = $_POST['time'];
$sig = $_POST['signature'];
$hash = $_POST['hash'];
$time = $_POST['time'];
$sig = $_POST['signature'];
$resource = $_POST['resource'];
$revision = intval($_POST['revision']);
@@ -38,9 +40,11 @@ class Getfile extends \Zotlabs\Web\Controller {
killme();
$channel = channelx_by_hash($hash);
if((! $channel) || (! $time) || (! $sig))
if((! $channel) || (! $time) || (! $sig)) {
logger('error: missing info');
killme();
}
$slop = intval(get_pconfig($channel['channel_id'],'system','getfile_time_slop'));
if($slop < 1)
@@ -58,16 +62,15 @@ class Getfile extends \Zotlabs\Web\Controller {
logger('verify failed.');
killme();
}
$r = attach_by_hash($resource,$revision);
$r = attach_by_hash($resource,$channel['channel_hash'],$revision);
if(! $r['success']) {
logger('attach_by_hash failed: ' . $r['message']);
notice( $r['message'] . EOL);
return;
}
$unsafe_types = array('text/html','text/css','application/javascript');
if(in_array($r['data']['filetype'],$unsafe_types)) {
@@ -76,10 +79,10 @@ class Getfile extends \Zotlabs\Web\Controller {
else {
header('Content-type: ' . $r['data']['filetype']);
}
header('Content-disposition: attachment; filename="' . $r['data']['filename'] . '"');
if(intval($r['data']['os_storage'])) {
$fname = dbunescbin($r['data']['data']);
$fname = dbunescbin($r['data']['content']);
if(strpos($fname,'store') !== false)
$istream = fopen($fname,'rb');
else
@@ -91,11 +94,9 @@ class Getfile extends \Zotlabs\Web\Controller {
fclose($ostream);
}
}
else
echo dbunescbin($r['data']['data']);
else {
echo dbunescbin($r['data']['content']);
}
killme();
}
}

View File

@@ -34,7 +34,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 groups WHERE id = %d AND uid = %d LIMIT 1",
intval(argv(1)),
intval(local_channel())
);
@@ -48,7 +48,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 groups SET gname = '%s', visible = %d WHERE uid = %d AND id = %d",
dbesc($groupname),
intval($public),
intval(local_channel()),
@@ -101,7 +101,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 groups WHERE id = %d AND uid = %d LIMIT 1",
intval(argv(2)),
intval(local_channel())
);
@@ -133,7 +133,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 groups WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1",
intval(argv(1)),
intval(local_channel())
);
@@ -212,7 +212,7 @@ class Group extends \Zotlabs\Web\Controller {
group_rmv_member(local_channel(),$group['gname'],$member['xchan_hash']);
}
$r = q("SELECT abook.*, xchan.* FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE `abook_channel` = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc",
$r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc",
intval(local_channel())
);

View File

@@ -29,7 +29,20 @@ class Hcard extends \Zotlabs\Web\Controller {
$profile = $r[0]['profile_guid'];
}
\App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
head_add_link( [
'rel' => 'alternate',
'type' => 'application/atom+xml',
'title' => t('Posts and comments'),
'href' => z_root() . '/feed/' . $which
]);
head_add_link( [
'rel' => 'alternate',
'type' => 'application/atom+xml',
'title' => t('Only posts'),
'href' => z_root() . '/feed/' . $which . '?f=&top=1'
]);
if(! $profile) {
$x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",

View File

@@ -1,146 +1,100 @@
<?php
namespace Zotlabs\Module;
require_once('include/help.php');
/**
* You can create local site resources in doc/Site.md and either link to doc/Home.md for the standard resources
* or use our include mechanism to include it on your local page.
*
*@code
* #include doc/Home.md;
*@endcode
*
* The syntax is somewhat strict.
*
* The syntax is somewhat strict.
*/
class Help extends \Zotlabs\Web\Controller {
function get() {
nav_set_selected('help');
if($_REQUEST['search']) {
$o .= '<div id="help-content" class="generic-content-wrapper">';
$o .= '<div class="section-title-wrapper">';
$o .= '<h2>' . t('Documentation Search') . ' - ' . htmlspecialchars($_REQUEST['search']) . '</h2>';
$o .= '</div>';
$o .= '<div class="section-content-wrapper">';
$r = search_doc_files($_REQUEST['search']);
if($r) {
$o .= '<ul class="help-searchlist">';
foreach($r as $rr) {
$dirname = dirname($rr['sid']);
$fname = basename($rr['sid']);
$fname = substr($fname,0,strrpos($fname,'.'));
$path = trim(substr($dirname,4),'/');
$o .= '<li><a href="help/' . (($path) ? $path . '/' : '') . $fname . '" >' . ucwords(str_replace('_',' ',notags($fname))) . '</a><br />' .
str_replace('$Projectname',\Zotlabs\Lib\System::get_platform_name(),substr($rr['text'],0,200)) . '...<br /><br /></li>';
$dirname = dirname($rr['v']);
$fname = basename($rr['v']);
$fname = substr($fname, 0, strrpos($fname, '.'));
$path = trim(substr($dirname, 4), '/');
$o .= '<li><a href="help/' . (($path) ? $path . '/' : '') . $fname . '" >' . ucwords(str_replace('_',' ',notags($fname))) . '</a><br>'
. '<b><i>' . 'help/' . (($path) ? $path . '/' : '') . $fname . '</i></b><br>'
. '...' . str_replace('$Projectname', \Zotlabs\Lib\System::get_platform_name(), $rr['text']) . '...<br><br></li>';
}
$o .= '</ul>';
$o .= '</div>';
$o .= '</div>';
}
return $o;
}
global $lang;
$doctype = 'markdown';
$text = '';
if(argc() > 1) {
$path = '';
for($x = 1; $x < argc(); $x ++) {
if(strlen($path))
$path .= '/';
$path .= argv($x);
}
$title = basename($path);
$text = load_doc_file('doc/' . $path . '.md');
\App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title)));
if(! $text) {
$text = load_doc_file('doc/' . $path . '.bb');
if($text)
$doctype = 'bbcode';
\App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('_',' ',notags($title)));
}
if(! $text) {
$text = load_doc_file('doc/' . $path . '.html');
if($text)
$doctype = 'html';
\App::$page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags($title)));
}
}
if(! $text) {
$text = load_doc_file('doc/Site.md');
\App::$page['title'] = t('Help');
}
if(! $text) {
$doctype = 'bbcode';
$text = load_doc_file('doc/main.bb');
\App::$page['title'] = t('Help');
}
if(! strlen($text)) {
header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . t('Not Found'));
$tpl = get_markup_template("404.tpl");
return replace_macros($tpl, array(
'$message' => t('Page not found.' )
));
}
if($doctype === 'html')
$content = $text;
if($doctype === 'markdown') {
require_once('library/markdown.php');
# escape #include tags
$text = preg_replace('/#include/ism', '%%include', $text);
$content = Markdown($text);
$content = preg_replace('/%%include/ism', '#include', $content);
}
if($doctype === 'bbcode') {
require_once('include/bbcode.php');
$content = bbcode($text);
// bbcode retargets external content to new windows. This content is internal.
$content = str_replace(' target="_blank"','',$content);
}
$content = preg_replace_callback("/#include (.*?)\;/ism", 'self::preg_callback_help_include', $content);
return replace_macros(get_markup_template("help.tpl"), array(
if(argc() > 2 && argv(argc()-2) === 'assets') {
$path = '';
for($x = 1; $x < argc(); $x ++) {
if(strlen($path))
$path .= '/';
$path .= argv($x);
}
$realpath = 'doc/' . $path;
//Set the content-type header as appropriate
$imageInfo = getimagesize($realpath);
switch ($imageInfo[2]) {
case IMAGETYPE_JPEG:
header("Content-Type: image/jpeg");
break;
case IMAGETYPE_GIF:
header("Content-Type: image/gif");
break;
case IMAGETYPE_PNG:
header("Content-Type: image/png");
break;
default:
break;
}
header("Content-Length: " . filesize($realpath));
// dump the picture and stop the script
readfile($realpath);
killme();
}
$headings = [
'about' => t('About'),
'member' => t('Members'),
'admin' => t('Administrators'),
'developer' => t('Developers'),
'tutorials' => t('Tutorials')
];
if(array_key_exists(argv(1), $headings))
$heading = $headings[argv(1)];
$content = get_help_content();
return replace_macros(get_markup_template('help.tpl'), array(
'$title' => t('$Projectname Documentation'),
'$content' => translate_projectname($content)
'$tocHeading' => t('Contents'),
'$content' => $content,
'$heading' => $heading
));
}
private static function preg_callback_help_include($matches) {
if($matches[1]) {
$include = str_replace($matches[0],load_doc_file($matches[1]),$matches[0]);
if(preg_match('/\.bb$/', $matches[1]) || preg_match('/\.txt$/', $matches[1])) {
require_once('include/bbcode.php');
$include = bbcode($include);
$include = str_replace(' target="_blank"','',$include);
}
elseif(preg_match('/\.md$/', $matches[1])) {
require_once('library/markdown.php');
$include = Markdown($include);
}
return $include;
}
}
}

View File

@@ -5,6 +5,7 @@ namespace Zotlabs\Module;
class Hostxrd extends \Zotlabs\Web\Controller {
function init() {
session_write_close();
header('Access-Control-Allow-Origin: *');
header("Content-type: application/xrd+xml");
logger('hostxrd',LOGGER_DEBUG);

View File

@@ -1,4 +1,5 @@
<?php
namespace Zotlabs\Module;
// Import a channel, either by direct file upload or via
@@ -21,33 +22,18 @@ class Import extends \Zotlabs\Web\Controller {
return;
}
$max_identities = account_service_class_fetch($account_id,'total_identities');
$max_friends = account_service_class_fetch($account_id,'total_channels');
$max_feeds = account_service_class_fetch($account_id,'total_feeds');
if($max_identities !== false) {
$r = q("select channel_id from channel where channel_account_id = %d",
intval($account_id)
);
if($r && count($r) > $max_identities) {
notice( sprintf( t('Your service plan only allows %d channels.'), $max_identities) . EOL);
return;
}
}
$data = null;
$seize = ((x($_REQUEST,'make_primary')) ? intval($_REQUEST['make_primary']) : 0);
$import_posts = ((x($_REQUEST,'import_posts')) ? intval($_REQUEST['import_posts']) : 0);
$src = $_FILES['filename']['tmp_name'];
$filename = basename($_FILES['filename']['name']);
$filesize = intval($_FILES['filename']['size']);
$filetype = $_FILES['filename']['type'];
$completed = ((array_key_exists('import_step',$_SESSION)) ? intval($_SESSION['import_step']) : 0);
if($completed)
logger('saved import step: ' . $_SESSION['import_step']);
$max_friends = account_service_class_fetch($account_id,'total_channels');
$max_feeds = account_service_class_fetch($account_id,'total_feeds');
$data = null;
$seize = ((x($_REQUEST,'make_primary')) ? intval($_REQUEST['make_primary']) : 0);
$import_posts = ((x($_REQUEST,'import_posts')) ? intval($_REQUEST['import_posts']) : 0);
$moving = intval($_REQUEST['moving']);
$src = $_FILES['filename']['tmp_name'];
$filename = basename($_FILES['filename']['name']);
$filesize = intval($_FILES['filename']['size']);
$filetype = $_FILES['filename']['type'];
if($src) {
// This is OS specific and could also fail if your tmpdir isn't very large
@@ -77,23 +63,27 @@ class Import extends \Zotlabs\Web\Controller {
$channelname = substr($old_address,0,strpos($old_address,'@'));
$servername = substr($old_address,strpos($old_address,'@')+1);
$scheme = 'https://';
$api_path = '/api/red/channel/export/basic?f=&channel=' . $channelname;
$api_path = probe_api_path($servername);
if(! $api_path) {
notice( t('Unable to download data from old server') . EOL);
return;
}
$api_path .= 'channel/export/basic?f=&channel=' . $channelname;
if($import_posts)
$api_path .= '&posts=1';
$binary = false;
$redirects = 0;
$opts = array('http_auth' => $email . ':' . $password);
$url = $scheme . $servername . $api_path;
$ret = z_fetch_url($url, $binary, $redirects, $opts);
if(! $ret['success'])
$ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts);
if($ret['success'])
$ret = z_fetch_url($api_path, $binary, $redirects, $opts);
if($ret['success']) {
$data = $ret['body'];
else
}
else {
notice( t('Unable to download data from old server') . EOL);
return;
}
}
if(! $data) {
@@ -108,14 +98,12 @@ class Import extends \Zotlabs\Web\Controller {
// print_r($data);
if(array_key_exists('user',$data) && array_key_exists('version',$data)) {
require_once('include/Import/import_diaspora.php');
import_diaspora($data);
return;
if(! array_key_exists('compatibility',$data)) {
call_hooks('import_foreign_channel_data',$data);
if($data['handled'])
return;
}
$moving = false;
if(array_key_exists('compatibility',$data) && array_key_exists('database',$data['compatibility'])) {
$v1 = substr($data['compatibility']['database'],-4);
$v2 = substr(DB_UPDATE_VERSION,-4);
@@ -136,28 +124,26 @@ class Import extends \Zotlabs\Web\Controller {
if(array_key_exists('channel',$data)) {
if($completed < 1) {
$channel = import_channel($data['channel'], $account_id, $seize);
$max_identities = account_service_class_fetch($account_id,'total_identities');
}
else {
$r = q("select * from channel where channel_account_id = %d and channel_guid = '%s' limit 1",
intval($account_id),
dbesc($channel['channel_guid'])
if($max_identities !== false) {
$r = q("select channel_id from channel where channel_account_id = %d",
intval($account_id)
);
if($r)
$channel = $r[0];
}
if(! $channel) {
logger('mod_import: channel not found. ', print_r($channel,true));
notice( t('Cloned channel not found. Import failed.') . EOL);
return;
if($r && count($r) > $max_identities) {
notice( sprintf( t('Your service plan only allows %d channels.'), $max_identities) . EOL);
return;
}
}
$channel = import_channel($data['channel'], $account_id, $seize);
}
else {
$moving = false;
$channel = \App::get_channel();
}
if(! $channel)
$channel = \App::get_channel();
if(! $channel) {
logger('mod_import: channel not found. ', print_r($channel,true));
notice( t('No channel. Import failed.') . EOL);
@@ -165,18 +151,17 @@ class Import extends \Zotlabs\Web\Controller {
}
if($completed < 2) {
if(is_array($data['config'])) {
import_config($channel,$data['config']);
}
logger('import step 2');
$_SESSION['import_step'] = 2;
if(is_array($data['config'])) {
import_config($channel,$data['config']);
}
logger('import step 2');
if($completed < 3) {
if(array_key_exists('channel',$data)) {
if($data['photo']) {
require_once('include/photo/photo_driver.php');
import_channel_photo(base64url_decode($data['photo']['data']),$data['photo']['type'],$account_id,$channel['channel_id']);
@@ -184,41 +169,36 @@ class Import extends \Zotlabs\Web\Controller {
if(is_array($data['profile']))
import_profiles($channel,$data['profile']);
logger('import step 3');
$_SESSION['import_step'] = 3;
}
logger('import step 3');
if($completed < 4) {
if(is_array($data['hubloc']) && (! $moving)) {
import_hublocs($channel,$data['hubloc'],$seize);
}
logger('import step 4');
$_SESSION['import_step'] = 4;
if(is_array($data['hubloc'])) {
import_hublocs($channel,$data['hubloc'],$seize,$moving);
}
if($completed < 5) {
// create new hubloc for the new channel at this site
$r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_network, hubloc_primary,
hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey )
values ( '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s' )",
dbesc($channel['channel_guid']),
dbesc($channel['channel_guid_sig']),
dbesc($channel['channel_hash']),
dbesc($channel['channel_address'] . '@' . \App::get_hostname()),
dbesc('zot'),
intval(($seize) ? 1 : 0),
dbesc(z_root()),
dbesc(base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey']))),
dbesc(\App::get_hostname()),
dbesc(z_root() . '/post'),
dbesc(get_config('system','pubkey'))
logger('import step 4');
// create new hubloc for the new channel at this site
if(array_key_exists('channel',$data)) {
$r = hubloc_store_lowlevel(
[
'hubloc_guid' => $channel['channel_guid'],
'hubloc_guid_sig' => $channel['channel_guid_sig'],
'hubloc_hash' => $channel['channel_hash'],
'hubloc_addr' => channel_reddress($channel),
'hubloc_network' => 'zot',
'hubloc_primary' => (($seize) ? 1 : 0),
'hubloc_url' => z_root(),
'hubloc_url_sig' => base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey'])),
'hubloc_host' => \App::get_hostname(),
'hubloc_callback' => z_root() . '/post',
'hubloc_sitekey' => get_config('system','pubkey'),
'hubloc_updated' => datetime_convert()
]
);
// reset the original primary hubloc if it is being seized
if($seize) {
@@ -227,242 +207,206 @@ class Import extends \Zotlabs\Web\Controller {
dbesc(z_root())
);
}
logger('import step 5');
$_SESSION['import_step'] = 5;
}
logger('import step 5');
if($completed < 6) {
// import xchans and contact photos
// import xchans and contact photos
if($seize) {
if(array_key_exists('channel',$data) && $seize) {
// replace any existing xchan we may have on this site if we're seizing control
// replace any existing xchan we may have on this site if we're seizing control
$r = q("delete from xchan where xchan_hash = '%s'",
dbesc($channel['channel_hash'])
);
$r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_follow, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date, xchan_hidden, xchan_orphan, xchan_censored, xchan_selfcensored, xchan_system, xchan_pubforum, xchan_deleted ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, %d, %d )",
dbesc($channel['channel_hash']),
dbesc($channel['channel_guid']),
dbesc($channel['channel_guid_sig']),
dbesc($channel['channel_pubkey']),
dbesc(z_root() . "/photo/profile/l/" . $channel['channel_id']),
dbesc(z_root() . "/photo/profile/m/" . $channel['channel_id']),
dbesc(z_root() . "/photo/profile/s/" . $channel['channel_id']),
dbesc($channel['channel_address'] . '@' . \App::get_hostname()),
dbesc(z_root() . '/channel/' . $channel['channel_address']),
dbesc(z_root() . '/follow?f=&url=%s'),
dbesc(z_root() . '/poco/' . $channel['channel_address']),
dbesc($channel['channel_name']),
dbesc('zot'),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
0,0,0,0,0,0,0
);
}
logger('import step 6');
$_SESSION['import_step'] = 6;
$r = q("delete from xchan where xchan_hash = '%s'",
dbesc($channel['channel_hash'])
);
$r = xchan_store_lowlevel(
[
'xchan_hash' => $channel['channel_hash'],
'xchan_guid' => $channel['channel_guid'],
'xchan_guid_sig' => $channel['channel_guid_sig'],
'xchan_pubkey' => $channel['channel_pubkey'],
'xchan_photo_l' => z_root() . "/photo/profile/l/" . $channel['channel_id'],
'xchan_photo_m' => z_root() . "/photo/profile/m/" . $channel['channel_id'],
'xchan_photo_s' => z_root() . "/photo/profile/s/" . $channel['channel_id'],
'xchan_addr' => channel_reddress($channel),
'xchan_url' => z_root() . '/channel/' . $channel['channel_address'],
'xchan_connurl' => z_root() . '/poco/' . $channel['channel_address'],
'xchan_follow' => z_root() . '/follow?f=&url=%s',
'xchan_name' => $channel['channel_name'],
'xchan_network' => 'zot',
'xchan_photo_date' => datetime_convert(),
'xchan_name_date' => datetime_convert()
]
);
}
if($completed < 7) {
logger('import step 6');
$xchans = $data['xchan'];
if($xchans) {
foreach($xchans as $xchan) {
$hash = make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_guid_sig']);
if($xchan['xchan_network'] === 'zot' && $hash !== $xchan['xchan_hash']) {
logger('forged xchan: ' . print_r($xchan,true));
continue;
}
$xchans = $data['xchan'];
if($xchans) {
foreach($xchans as $xchan) {
if(! array_key_exists('xchan_hidden',$xchan)) {
$xchan['xchan_hidden'] = (($xchan['xchan_flags'] & 0x0001) ? 1 : 0);
$xchan['xchan_orphan'] = (($xchan['xchan_flags'] & 0x0002) ? 1 : 0);
$xchan['xchan_censored'] = (($xchan['xchan_flags'] & 0x0004) ? 1 : 0);
$xchan['xchan_selfcensored'] = (($xchan['xchan_flags'] & 0x0008) ? 1 : 0);
$xchan['xchan_system'] = (($xchan['xchan_flags'] & 0x0010) ? 1 : 0);
$xchan['xchan_pubforum'] = (($xchan['xchan_flags'] & 0x0020) ? 1 : 0);
$xchan['xchan_deleted'] = (($xchan['xchan_flags'] & 0x1000) ? 1 : 0);
}
$hash = make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_guid_sig']);
if($xchan['xchan_network'] === 'zot' && $hash !== $xchan['xchan_hash']) {
logger('forged xchan: ' . print_r($xchan,true));
continue;
}
$r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
dbesc($xchan['xchan_hash'])
);
if($r)
continue;
dbesc_array($xchan);
$r = dbq("INSERT INTO xchan (`"
. implode("`, `", array_keys($xchan))
. "`) VALUES ('"
. implode("', '", array_values($xchan))
. "')" );
if(! array_key_exists('xchan_hidden',$xchan)) {
$xchan['xchan_hidden'] = (($xchan['xchan_flags'] & 0x0001) ? 1 : 0);
$xchan['xchan_orphan'] = (($xchan['xchan_flags'] & 0x0002) ? 1 : 0);
$xchan['xchan_censored'] = (($xchan['xchan_flags'] & 0x0004) ? 1 : 0);
$xchan['xchan_selfcensored'] = (($xchan['xchan_flags'] & 0x0008) ? 1 : 0);
$xchan['xchan_system'] = (($xchan['xchan_flags'] & 0x0010) ? 1 : 0);
$xchan['xchan_pubforum'] = (($xchan['xchan_flags'] & 0x0020) ? 1 : 0);
$xchan['xchan_deleted'] = (($xchan['xchan_flags'] & 0x1000) ? 1 : 0);
}
$r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
dbesc($xchan['xchan_hash'])
);
if($r)
continue;
create_table_from_array('xchan',$xchan);
require_once('include/photo/photo_driver.php');
$photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']);
if($photos[4])
$photodate = NULL_DATE;
else
$photodate = $xchan['xchan_photo_date'];
require_once('include/photo/photo_driver.php');
$photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']);
if($photos[4])
$photodate = NULL_DATE;
else
$photodate = $xchan['xchan_photo_date'];
$r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s', xchan_photo_date = '%s'
where xchan_hash = '%s'",
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
dbesc($photos[3]),
dbesc($photodate),
dbesc($xchan['xchan_hash'])
);
}
}
logger('import step 7');
$_SESSION['import_step'] = 7;
}
// FIXME - ensure we have an xchan if somebody is trying to pull a fast one
if($completed < 8) {
$friends = 0;
$feeds = 0;
// import contacts
$abooks = $data['abook'];
if($abooks) {
foreach($abooks as $abook) {
$abook_copy = $abook;
$abconfig = null;
if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && count($abook['abconfig']))
$abconfig = $abook['abconfig'];
unset($abook['abook_id']);
unset($abook['abook_rating']);
unset($abook['abook_rating_text']);
unset($abook['abconfig']);
unset($abook['abook_their_perms']);
unset($abook['abook_my_perms']);
$abook['abook_account'] = $account_id;
$abook['abook_channel'] = $channel['channel_id'];
if(! array_key_exists('abook_blocked',$abook)) {
$abook['abook_blocked'] = (($abook['abook_flags'] & 0x0001 ) ? 1 : 0);
$abook['abook_ignored'] = (($abook['abook_flags'] & 0x0002 ) ? 1 : 0);
$abook['abook_hidden'] = (($abook['abook_flags'] & 0x0004 ) ? 1 : 0);
$abook['abook_archived'] = (($abook['abook_flags'] & 0x0008 ) ? 1 : 0);
$abook['abook_pending'] = (($abook['abook_flags'] & 0x0010 ) ? 1 : 0);
$abook['abook_unconnected'] = (($abook['abook_flags'] & 0x0020 ) ? 1 : 0);
$abook['abook_self'] = (($abook['abook_flags'] & 0x0080 ) ? 1 : 0);
$abook['abook_feed'] = (($abook['abook_flags'] & 0x0100 ) ? 1 : 0);
}
if($abook['abook_self']) {
$role = get_pconfig($channel['channel_id'],'system','permissions_role');
if(($role === 'forum') || ($abook['abook_my_perms'] & PERMS_W_TAGWALL)) {
q("update xchan set xchan_pubforum = 1 where xchan_hash = '%s' ",
dbesc($abook['abook_xchan'])
);
}
}
else {
if($max_friends !== false && $friends > $max_friends)
continue;
if($max_feeds !== false && intval($abook['abook_feed']) && ($feeds > $max_feeds))
continue;
}
dbesc_array($abook);
$r = dbq("INSERT INTO abook (`"
. implode("`, `", array_keys($abook))
. "`) VALUES ('"
. implode("', '", array_values($abook))
. "')" );
$friends ++;
if(intval($abook['abook_feed']))
$feeds ++;
translate_abook_perms_inbound($channel,$abook_copy);
if($abconfig) {
// @fixme does not handle sync of del_abconfig
foreach($abconfig as $abc) {
set_abconfig($channel['channel_id'],$abc['xchan'],$abc['cat'],$abc['k'],$abc['v']);
}
}
}
}
logger('import step 8');
$_SESSION['import_step'] = 8;
}
if($completed < 9) {
$groups = $data['group'];
if($groups) {
$saved = array();
foreach($groups as $group) {
$saved[$group['hash']] = array('old' => $group['id']);
if(array_key_exists('name',$group)) {
$group['gname'] = $group['name'];
unset($group['name']);
}
unset($group['id']);
$group['uid'] = $channel['channel_id'];
dbesc_array($group);
$r = dbq("INSERT INTO groups (`"
. implode("`, `", array_keys($group))
. "`) VALUES ('"
. implode("', '", array_values($group))
. "')" );
}
$r = q("select * from `groups` where uid = %d",
intval($channel['channel_id'])
$r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s', xchan_photo_date = '%s' where xchan_hash = '%s'",
dbesc($photos[0]),
dbesc($photos[1]),
dbesc($photos[2]),
dbesc($photos[3]),
dbesc($photodate),
dbesc($xchan['xchan_hash'])
);
if($r) {
foreach($r as $rr) {
$saved[$rr['hash']]['new'] = $rr['id'];
}
logger('import step 7');
}
$friends = 0;
$feeds = 0;
// import contacts
$abooks = $data['abook'];
if($abooks) {
foreach($abooks as $abook) {
$abook_copy = $abook;
$abconfig = null;
if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && count($abook['abconfig']))
$abconfig = $abook['abconfig'];
unset($abook['abook_id']);
unset($abook['abook_rating']);
unset($abook['abook_rating_text']);
unset($abook['abconfig']);
unset($abook['abook_their_perms']);
unset($abook['abook_my_perms']);
$abook['abook_account'] = $account_id;
$abook['abook_channel'] = $channel['channel_id'];
if(! array_key_exists('abook_blocked',$abook)) {
$abook['abook_blocked'] = (($abook['abook_flags'] & 0x0001 ) ? 1 : 0);
$abook['abook_ignored'] = (($abook['abook_flags'] & 0x0002 ) ? 1 : 0);
$abook['abook_hidden'] = (($abook['abook_flags'] & 0x0004 ) ? 1 : 0);
$abook['abook_archived'] = (($abook['abook_flags'] & 0x0008 ) ? 1 : 0);
$abook['abook_pending'] = (($abook['abook_flags'] & 0x0010 ) ? 1 : 0);
$abook['abook_unconnected'] = (($abook['abook_flags'] & 0x0020 ) ? 1 : 0);
$abook['abook_self'] = (($abook['abook_flags'] & 0x0080 ) ? 1 : 0);
$abook['abook_feed'] = (($abook['abook_flags'] & 0x0100 ) ? 1 : 0);
}
if($abook['abook_self']) {
$role = get_pconfig($channel['channel_id'],'system','permissions_role');
if(($role === 'forum') || ($abook['abook_my_perms'] & PERMS_W_TAGWALL)) {
q("update xchan set xchan_pubforum = 1 where xchan_hash = '%s' ",
dbesc($abook['abook_xchan'])
);
}
}
}
else {
if($max_friends !== false && $friends > $max_friends)
continue;
if($max_feeds !== false && intval($abook['abook_feed']) && ($feeds > $max_feeds))
continue;
}
create_table_from_array('abook',$abook);
$friends ++;
if(intval($abook['abook_feed']))
$feeds ++;
translate_abook_perms_inbound($channel,$abook_copy);
$group_members = $data['group_member'];
if($group_members) {
foreach($group_members as $group_member) {
unset($group_member['id']);
$group_member['uid'] = $channel['channel_id'];
foreach($saved as $x) {
if($x['old'] == $group_member['gid'])
$group_member['gid'] = $x['new'];
if($abconfig) {
// @fixme does not handle sync of del_abconfig
foreach($abconfig as $abc) {
set_abconfig($channel['channel_id'],$abc['xchan'],$abc['cat'],$abc['k'],$abc['v']);
}
dbesc_array($group_member);
$r = dbq("INSERT INTO group_member (`"
. implode("`, `", array_keys($group_member))
. "`) VALUES ('"
. implode("', '", array_values($group_member))
. "')" );
}
}
logger('import step 9');
$_SESSION['import_step'] = 9;
logger('import step 8');
}
$groups = $data['group'];
if($groups) {
$saved = array();
foreach($groups as $group) {
$saved[$group['hash']] = array('old' => $group['id']);
if(array_key_exists('name',$group)) {
$group['gname'] = $group['name'];
unset($group['name']);
}
unset($group['id']);
$group['uid'] = $channel['channel_id'];
create_table_from_array('groups',$group);
}
$r = q("select * from groups where uid = %d",
intval($channel['channel_id'])
);
if($r) {
foreach($r as $rr) {
$saved[$rr['hash']]['new'] = $rr['id'];
}
}
}
$group_members = $data['group_member'];
if($group_members) {
foreach($group_members as $group_member) {
unset($group_member['id']);
$group_member['uid'] = $channel['channel_id'];
foreach($saved as $x) {
if($x['old'] == $group_member['gid'])
$group_member['gid'] = $x['new'];
}
create_table_from_array('group_member',$group_member);
}
}
logger('import step 9');
if(is_array($data['obj']))
import_objs($channel,$data['obj']);
@@ -489,6 +433,12 @@ class Import extends \Zotlabs\Web\Controller {
if(is_array($data['menu']))
import_menus($channel,$data['menu']);
if(is_array($data['wiki']))
import_items($channel,$data['wiki'],false,$relocate);
if(is_array($data['webpages']))
import_items($channel,$data['webpages'],false,$relocate);
$addon = array('channel' => $channel,'data' => $data);
call_hooks('import_channel',$addon);
@@ -504,9 +454,6 @@ class Import extends \Zotlabs\Web\Controller {
if(array_key_exists('item_id',$data) && $data['item_id'])
import_item_ids($channel,$data['item_id']);
// FIXME - ensure we have a self entry if somebody is trying to pull a fast one
// send out refresh requests
// notify old server that it may no longer be primary.
@@ -521,7 +468,6 @@ class Import extends \Zotlabs\Web\Controller {
change_channel($channel['channel_id']);
unset($_SESSION['import_step']);
goaway(z_root() . '/network' );
}
@@ -553,7 +499,8 @@ class Import extends \Zotlabs\Web\Controller {
'$label_old_pass' => t('Your old login password'),
'$common' => t('For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media.'),
'$label_import_primary' => t('Make this hub my primary location'),
'$label_import_posts' => t('Import existing posts if possible (experimental - limited by available memory'),
'$label_import_moving' => t('Move this channel (disable all previous locations)'),
'$label_import_posts' => t('Import a few months of posts if possible (limited by available memory'),
'$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'),
'$email' => '',
'$pass' => '',

View File

@@ -59,12 +59,15 @@ class Invite extends \Zotlabs\Web\Controller {
$account = \App::get_account();
$res = mail($recip, sprintf( t('Please join us on $Projectname'), \App::$config['sitename']),
$nmessage,
"From: " . $account['account_email'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
$res = z_mail(
[
'toEmail' => $recip,
'fromName' => ' ',
'fromEmail' => $account['account_email'],
'messageSubject' => t('Please join us on $Projectname'),
'textVersion' => $nmessage,
]
);
if($res) {
$total ++;
@@ -108,7 +111,7 @@ class Invite extends \Zotlabs\Web\Controller {
$invite_code = autoname(8) . rand(1000,9999);
$nmessage = str_replace('$invite_code',$invite_code,$message);
$r = q("INSERT INTO `register` (`hash`,`created`) VALUES ('%s', '%s') ",
$r = q("INSERT INTO register (hash,created) VALUES ('%s', '%s') ",
dbesc($invite_code),
dbesc(datetime_convert())
);

View File

@@ -20,6 +20,9 @@ namespace Zotlabs\Module;
require_once('include/crypto.php');
require_once('include/items.php');
require_once('include/attach.php');
require_once('include/bbcode.php');
require_once('include/security.php');
use \Zotlabs\Lib as Zlib;
@@ -32,9 +35,7 @@ class Item extends \Zotlabs\Web\Controller {
if((! local_channel()) && (! remote_channel()) && (! x($_REQUEST,'commenter')))
return;
require_once('include/security.php');
$uid = local_channel();
$channel = null;
$observer = null;
@@ -81,6 +82,7 @@ class Item extends \Zotlabs\Web\Controller {
$api_source = ((x($_REQUEST,'api_source') && $_REQUEST['api_source']) ? true : false);
$consensus = intval($_REQUEST['consensus']);
$nocomment = intval($_REQUEST['nocomment']);
// 'origin' (if non-zero) indicates that this network is where the message originated,
// for the purpose of relaying comments to other conversation members.
@@ -123,6 +125,8 @@ class Item extends \Zotlabs\Web\Controller {
$ret = $this->item_check_service_class($uid,(($_REQUEST['webpage'] == ITEM_TYPE_WEBPAGE) ? true : false));
if (!$ret['success']) {
notice( t($ret['message']) . EOL) ;
if($api_source)
return ( [ 'success' => false, 'message' => 'service class exception' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -136,6 +140,7 @@ class Item extends \Zotlabs\Web\Controller {
$item_flags = $item_restrict = 0;
$expires = NULL_DATE;
$route = '';
$parent_item = null;
@@ -153,13 +158,13 @@ class Item extends \Zotlabs\Web\Controller {
$obj_type = ACTIVITY_OBJ_COMMENT;
if($parent) {
$r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
$r = q("SELECT * FROM item WHERE id = %d LIMIT 1",
intval($parent)
);
}
elseif($parent_mid && $uid) {
// This is coming from an API source, and we are logged in
$r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
$r = q("SELECT * FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
dbesc($parent_mid),
intval($uid)
);
@@ -169,7 +174,7 @@ class Item extends \Zotlabs\Web\Controller {
$parid = $r[0]['parent'];
$parent_mid = $r[0]['mid'];
if($r[0]['id'] != $r[0]['parent']) {
$r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1",
$r = q("SELECT * FROM item WHERE id = parent AND parent = %d LIMIT 1",
intval($parid)
);
}
@@ -177,6 +182,8 @@ class Item extends \Zotlabs\Web\Controller {
if(($r === false) || (! count($r))) {
notice( t('Unable to locate original post.') . EOL);
if($api_source)
return ( [ 'success' => false, 'message' => 'invalid post id' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -211,6 +218,8 @@ class Item extends \Zotlabs\Web\Controller {
if(! $can_comment) {
notice( t('Permission denied.') . EOL) ;
if($api_source)
return ( [ 'success' => false, 'message' => 'permission denied' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -219,6 +228,8 @@ class Item extends \Zotlabs\Web\Controller {
else {
if(! perm_is_allowed($profile_uid,$observer['xchan_hash'],($webpage) ? 'write_pages' : 'post_wall')) {
notice( t('Permission denied.') . EOL) ;
if($api_source)
return ( [ 'success' => false, 'message' => 'permission denied' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -243,7 +254,7 @@ class Item extends \Zotlabs\Web\Controller {
$iconfig = null;
if($post_id) {
$i = q("SELECT * FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1",
$i = q("SELECT * FROM item WHERE uid = %d AND id = %d LIMIT 1",
intval($profile_uid),
intval($post_id)
);
@@ -273,6 +284,8 @@ class Item extends \Zotlabs\Web\Controller {
if(! $channel) {
logger("mod_item: no channel.");
if($api_source)
return ( [ 'success' => false, 'message' => 'no channel' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -288,6 +301,8 @@ class Item extends \Zotlabs\Web\Controller {
}
else {
logger("mod_item: no owner.");
if($api_source)
return ( [ 'success' => false, 'message' => 'no owner' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -380,6 +395,7 @@ class Item extends \Zotlabs\Web\Controller {
$postopts = $orig_post['postopts'];
$created = $orig_post['created'];
$expires = $orig_post['expires'];
$mid = $orig_post['mid'];
$parent_mid = $orig_post['parent_mid'];
$plink = $orig_post['plink'];
@@ -413,7 +429,9 @@ class Item extends \Zotlabs\Web\Controller {
$body = trim($_REQUEST['body']);
$body .= trim($_REQUEST['attachment']);
$postopts = '';
$allow_empty = ((array_key_exists('allow_empty',$_REQUEST)) ? intval($_REQUEST['allow_empty']) : 0);
$private = intval($acl->is_private() || ($public_policy));
// If this is a comment, set the permissions from the parent.
@@ -426,10 +444,12 @@ class Item extends \Zotlabs\Web\Controller {
$owner_hash = $parent_item['owner_xchan'];
}
if(! strlen($body)) {
if((! $allow_empty) && (! strlen($body))) {
if($preview)
killme();
info( t('Empty post discarded.') . EOL );
if($api_source)
return ( [ 'success' => false, 'message' => 'no content' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -437,7 +457,6 @@ class Item extends \Zotlabs\Web\Controller {
}
$expires = NULL_DATE;
if(feature_enabled($profile_uid,'content_expire')) {
if(x($_REQUEST,'expire')) {
@@ -446,7 +465,8 @@ class Item extends \Zotlabs\Web\Controller {
$expires = NULL_DATE;
}
}
$mimetype = notags(trim($_REQUEST['mimetype']));
if(! $mimetype)
$mimetype = 'text/bbcode';
@@ -470,6 +490,8 @@ class Item extends \Zotlabs\Web\Controller {
}
else {
notice( t('Executable content type not permitted to this channel.') . EOL);
if($api_source)
return ( [ 'success' => false, 'message' => 'forbidden content type' ] );
if(x($_REQUEST,'return'))
goaway(z_root() . "/" . $return_path );
killme();
@@ -501,11 +523,11 @@ class Item extends \Zotlabs\Web\Controller {
// <img src="javascript:alert('hacked');" />
// if($uid && $uid == $profile_uid && feature_enabled($uid,'markdown')) {
// require_once('include/bb2diaspora.php');
// require_once('include/markdown.php');
// $body = escape_tags(trim($body));
// $body = str_replace("\n",'<br />', $body);
// $body = preg_replace_callback('/\[share(.*?)\]/ism','\share_shield',$body);
// $body = diaspora2bb($body,true);
// $body = markdown_to_bb($body,true);
// $body = preg_replace_callback('/\[share(.*?)\]/ism','\share_unshield',$body);
// }
@@ -537,40 +559,8 @@ class Item extends \Zotlabs\Web\Controller {
if($x)
$body .= "\n\n@group+" . $x[0]['abook_id'] . "\n";
}
/**
* fix naked links by passing through a callback to see if this is a hubzilla site
* (already known to us) which will get a zrl, otherwise link with url, add bookmark tag to both.
* First protect any url inside certain bbcode tags so we don't double link it.
*/
$body = preg_replace_callback('/\[code(.*?)\[\/(code)\]/ism','\red_escape_codeblock',$body);
$body = preg_replace_callback('/\[url(.*?)\[\/(url)\]/ism','\red_escape_codeblock',$body);
$body = preg_replace_callback('/\[zrl(.*?)\[\/(zrl)\]/ism','\red_escape_codeblock',$body);
$body = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]+)/ism", '\red_zrl_callback', $body);
$body = preg_replace_callback('/\[\$b64zrl(.*?)\[\/(zrl)\]/ism','\red_unescape_codeblock',$body);
$body = preg_replace_callback('/\[\$b64url(.*?)\[\/(url)\]/ism','\red_unescape_codeblock',$body);
$body = preg_replace_callback('/\[\$b64code(.*?)\[\/(code)\]/ism','\red_unescape_codeblock',$body);
// fix any img tags that should be zmg
$body = preg_replace_callback('/\[img(.*?)\](.*?)\[\/img\]/ism','\red_zrlify_img_callback',$body);
$body = bb_translate_video($body);
/**
* Fold multi-line [code] sequences
*/
$body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body);
$body = scale_external_images($body,false);
$body = cleanup_bbcode($body);
// Look for tags and linkify them
$results = linkify_tags($a, $body, ($uid) ? $uid : $profile_uid);
@@ -625,9 +615,9 @@ class Item extends \Zotlabs\Web\Controller {
*/
if(! $preview) {
$this->fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
$this->fix_attached_file_permissions($channel,$observer['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
fix_attached_file_permissions($channel,$observer['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
}
@@ -707,6 +697,7 @@ class Item extends \Zotlabs\Web\Controller {
$item_wall = (($post_type === 'wall' || $post_type === 'wall-comment') ? 1 : 0);
$item_origin = (($origin) ? 1 : 0);
$item_consensus = (($consensus) ? 1 : 0);
$item_nocomment = (($nocomment) ? 1 : 0);
// determine if this is a wall post
@@ -733,6 +724,8 @@ class Item extends \Zotlabs\Web\Controller {
if(! $mid) {
$mid = (($message_id) ? $message_id : item_message_id());
}
if(! $parent_mid) {
$parent_mid = $mid;
}
@@ -746,78 +739,71 @@ class Item extends \Zotlabs\Web\Controller {
$thr_parent = $mid;
$datarray = array();
$item_thread_top = ((! $parent) ? 1 : 0);
if ((! $plink) && ($item_thread_top)) {
$plink = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $mid;
}
$datarray['aid'] = $channel['channel_account_id'];
$datarray['uid'] = $profile_uid;
$datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']);
$datarray['author_xchan'] = $observer['xchan_hash'];
$datarray['created'] = $created;
$datarray['edited'] = (($orig_post) ? datetime_convert() : $created);
$datarray['expires'] = $expires;
$datarray['commented'] = (($orig_post) ? datetime_convert() : $created);
$datarray['received'] = (($orig_post) ? datetime_convert() : $created);
$datarray['changed'] = (($orig_post) ? datetime_convert() : $created);
$datarray['mid'] = $mid;
$datarray['parent_mid'] = $parent_mid;
$datarray['mimetype'] = $mimetype;
$datarray['title'] = $title;
$datarray['body'] = $body;
$datarray['app'] = $app;
$datarray['location'] = $location;
$datarray['coord'] = $coord;
$datarray['verb'] = $verb;
$datarray['obj_type'] = $obj_type;
$datarray['allow_cid'] = $str_contact_allow;
$datarray['allow_gid'] = $str_group_allow;
$datarray['deny_cid'] = $str_contact_deny;
$datarray['deny_gid'] = $str_group_deny;
$datarray['item_private'] = $private;
$datarray['item_wall'] = $item_wall;
$datarray['attach'] = $attachments;
$datarray['thr_parent'] = $thr_parent;
$datarray['postopts'] = $postopts;
$datarray['item_unseen'] = $item_unseen;
$datarray['item_wall'] = $item_wall;
$datarray['item_origin'] = $item_origin;
$datarray['item_type'] = $webpage;
$datarray['item_thread_top'] = $item_thread_top;
$datarray['item_unseen'] = $item_unseen;
$datarray['item_starred'] = $item_starred;
$datarray['item_uplink'] = $item_uplink;
$datarray['item_consensus'] = $item_consensus;
$datarray['item_notshown'] = $item_notshown;
$datarray['item_nsfw'] = $item_nsfw;
$datarray['item_relay'] = $item_relay;
$datarray['item_mentionsme'] = $item_mentionsme;
$datarray['item_nocomment'] = $item_nocomment;
$datarray['item_obscured'] = $item_obscured;
$datarray['item_verified'] = $item_verified;
$datarray['item_retained'] = $item_retained;
$datarray['item_rss'] = $item_rss;
$datarray['item_deleted'] = $item_deleted;
$datarray['item_hidden'] = $item_hidden;
$datarray['item_unpublished'] = $item_unpublished;
$datarray['item_delayed'] = $item_delayed;
$datarray['item_pending_remove'] = $item_pending_remove;
$datarray['item_blocked'] = $item_blocked;
$datarray['layout_mid'] = $layout_mid;
$datarray['public_policy'] = $public_policy;
$datarray['comment_policy'] = map_scope($comment_policy);
$datarray['term'] = $post_tags;
$datarray['plink'] = $plink;
$datarray['route'] = $route;
$datarray['aid'] = $channel['channel_account_id'];
$datarray['uid'] = $profile_uid;
$datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']);
$datarray['author_xchan'] = $observer['xchan_hash'];
$datarray['created'] = $created;
$datarray['edited'] = (($orig_post) ? datetime_convert() : $created);
$datarray['expires'] = $expires;
$datarray['commented'] = (($orig_post) ? datetime_convert() : $created);
$datarray['received'] = (($orig_post) ? datetime_convert() : $created);
$datarray['changed'] = (($orig_post) ? datetime_convert() : $created);
$datarray['mid'] = $mid;
$datarray['parent_mid'] = $parent_mid;
$datarray['mimetype'] = $mimetype;
$datarray['title'] = $title;
$datarray['body'] = $body;
$datarray['app'] = $app;
$datarray['location'] = $location;
$datarray['coord'] = $coord;
$datarray['verb'] = $verb;
$datarray['obj_type'] = $obj_type;
$datarray['allow_cid'] = $str_contact_allow;
$datarray['allow_gid'] = $str_group_allow;
$datarray['deny_cid'] = $str_contact_deny;
$datarray['deny_gid'] = $str_group_deny;
$datarray['attach'] = $attachments;
$datarray['thr_parent'] = $thr_parent;
$datarray['postopts'] = $postopts;
$datarray['item_unseen'] = intval($item_unseen);
$datarray['item_wall'] = intval($item_wall);
$datarray['item_origin'] = intval($item_origin);
$datarray['item_type'] = $webpage;
$datarray['item_private'] = intval($private);
$datarray['item_thread_top'] = intval($item_thread_top);
$datarray['item_unseen'] = intval($item_unseen);
$datarray['item_starred'] = intval($item_starred);
$datarray['item_uplink'] = intval($item_uplink);
$datarray['item_consensus'] = intval($item_consensus);
$datarray['item_notshown'] = intval($item_notshown);
$datarray['item_nsfw'] = intval($item_nsfw);
$datarray['item_relay'] = intval($item_relay);
$datarray['item_mentionsme'] = intval($item_mentionsme);
$datarray['item_nocomment'] = intval($item_nocomment);
$datarray['item_obscured'] = intval($item_obscured);
$datarray['item_verified'] = intval($item_verified);
$datarray['item_retained'] = intval($item_retained);
$datarray['item_rss'] = intval($item_rss);
$datarray['item_deleted'] = intval($item_deleted);
$datarray['item_hidden'] = intval($item_hidden);
$datarray['item_unpublished'] = intval($item_unpublished);
$datarray['item_delayed'] = intval($item_delayed);
$datarray['item_pending_remove'] = intval($item_pending_remove);
$datarray['item_blocked'] = intval($item_blocked);
$datarray['layout_mid'] = $layout_mid;
$datarray['public_policy'] = $public_policy;
$datarray['comment_policy'] = map_scope($comment_policy);
$datarray['term'] = $post_tags;
$datarray['plink'] = $plink;
$datarray['route'] = $route;
if($iconfig)
$datarray['iconfig'] = $iconfig;
@@ -864,7 +850,8 @@ class Item extends \Zotlabs\Web\Controller {
logger('mod_item: post cancelled by plugin or duplicate suppressed.');
if($return_path)
goaway(z_root() . "/" . $return_path);
if($api_source)
return ( [ 'success' => false, 'message' => 'operation cancelled' ] );
$json = array('cancel' => 1);
$json['reload'] = z_root() . '/' . $_REQUEST['jsreload'];
echo json_encode($json);
@@ -902,6 +889,8 @@ class Item extends \Zotlabs\Web\Controller {
$x = item_store_update($datarray,$execflag);
item_create_edit_activity($x);
if(! $parent) {
$r = q("select * from item where id = %d",
intval($post_id)
@@ -915,6 +904,10 @@ class Item extends \Zotlabs\Web\Controller {
if(! $nopush)
\Zotlabs\Daemon\Master::Summon(array('Notifier', 'edit_post', $post_id));
if($api_source)
return($x);
if((x($_REQUEST,'return')) && strlen($return_path)) {
logger('return: ' . $return_path);
goaway(z_root() . "/" . $return_path );
@@ -927,7 +920,9 @@ class Item extends \Zotlabs\Web\Controller {
$post = item_store($datarray,$execflag);
$post_id = $post['item_id'];
$datarray = $post['item'];
if($post_id) {
logger('mod_item: saved item ' . $post_id);
@@ -942,7 +937,7 @@ class Item extends \Zotlabs\Web\Controller {
'from_xchan' => $datarray['author_xchan'],
'to_xchan' => $datarray['owner_xchan'],
'item' => $datarray,
'link' => z_root() . '/display/' . $datarray['mid'],
'link' => z_root() . '/display/' . gen_link_id($datarray['mid']),
'verb' => ACTIVITY_POST,
'otype' => 'item',
'parent' => $parent,
@@ -960,7 +955,7 @@ class Item extends \Zotlabs\Web\Controller {
'from_xchan' => $datarray['author_xchan'],
'to_xchan' => $datarray['owner_xchan'],
'item' => $datarray,
'link' => z_root() . '/display/' . $datarray['mid'],
'link' => z_root() . '/display/' . gen_link_id($datarray['mid']),
'verb' => ACTIVITY_POST,
'otype' => 'item'
));
@@ -987,8 +982,11 @@ class Item extends \Zotlabs\Web\Controller {
else {
logger('mod_item: unable to retrieve post that was just stored.');
notice( t('System error. Post not saved.') . EOL);
goaway(z_root() . "/" . $return_path );
// NOTREACHED
if($return_path)
goaway(z_root() . "/" . $return_path );
if($api_source)
return ( [ 'success' => false, 'message' => 'system error' ] );
killme();
}
if(($parent) && ($parent != $post_id)) {
@@ -1009,7 +1007,7 @@ class Item extends \Zotlabs\Web\Controller {
}
$datarray['id'] = $post_id;
$datarray['llink'] = z_root() . '/display/' . $channel['channel_address'] . '/' . $post_id;
$datarray['llink'] = z_root() . '/display/' . gen_link_id($datarray['mid']);
call_hooks('post_local_end', $datarray);
@@ -1043,9 +1041,7 @@ class Item extends \Zotlabs\Web\Controller {
if((! local_channel()) && (! remote_channel()))
return;
require_once('include/security.php');
if((argc() == 3) && (argv(1) === 'drop') && intval(argv(2))) {
require_once('include/items.php');
@@ -1081,6 +1077,14 @@ class Item extends \Zotlabs\Web\Controller {
else {
// complex deletion that needs to propagate and be performed in phases
drop_item($i[0]['id'],true,DROPITEM_PHASE1);
$r = q("select * from item where id = %d",
intval($i[0]['id'])
);
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
build_sync_packet($i[0]['uid'],array('item' => array(encode_item($sync_item[0],true))));
}
tag_deliver($i[0]['uid'],$i[0]['id']);
}
}
@@ -1088,138 +1092,6 @@ class Item extends \Zotlabs\Web\Controller {
}
function fix_attached_photo_permissions($uid,$xchan_hash,$body,
$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
if(get_pconfig($uid,'system','force_public_uploads')) {
$str_contact_allow = $str_group_allow = $str_contact_deny = $str_group_deny = '';
}
$match = null;
// match img and zmg image links
if(preg_match_all("/\[[zi]mg(.*?)\](.*?)\[\/[zi]mg\]/",$body,$match)) {
$images = $match[2];
if($images) {
foreach($images as $image) {
if(! stristr($image,z_root() . '/photo/'))
continue;
$image_uri = substr($image,strrpos($image,'/') + 1);
if(strpos($image_uri,'-') !== false)
$image_uri = substr($image_uri,0, strpos($image_uri,'-'));
if(strpos($image_uri,'.') !== false)
$image_uri = substr($image_uri,0, strpos($image_uri,'.'));
if(! strlen($image_uri))
continue;
$srch = '<' . $xchan_hash . '>';
$r = q("select folder from attach where hash = '%s' and uid = %d limit 1",
dbesc($image_uri),
intval($uid)
);
if($r && $r[0]['folder']) {
$f = q("select * from attach where hash = '%s' and is_dir = 1 and uid = %d limit 1",
dbesc($r[0]['folder']),
intval($uid)
);
if(($f) && (($f[0]['allow_cid']) || ($f[0]['allow_gid']) || ($f[0]['deny_cid']) || ($f[0]['deny_gid']))) {
$str_contact_allow = $f[0]['allow_cid'];
$str_group_allow = $f[0]['allow_gid'];
$str_contact_deny = $f[0]['deny_cid'];
$str_group_deny = $f[0]['deny_gid'];
}
}
$r = q("SELECT id FROM photo
WHERE allow_cid = '%s' AND allow_gid = '' AND deny_cid = '' AND deny_gid = ''
AND resource_id = '%s' AND uid = %d LIMIT 1",
dbesc($srch),
dbesc($image_uri),
intval($uid)
);
if($r) {
$r = q("UPDATE photo SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
WHERE resource_id = '%s' AND uid = %d ",
dbesc($str_contact_allow),
dbesc($str_group_allow),
dbesc($str_contact_deny),
dbesc($str_group_deny),
dbesc($image_uri),
intval($uid)
);
// also update the linked item (which is probably invisible)
$r = q("select id from item
WHERE allow_cid = '%s' AND allow_gid = '' AND deny_cid = '' AND deny_gid = ''
AND resource_id = '%s' and resource_type = 'photo' AND uid = %d LIMIT 1",
dbesc($srch),
dbesc($image_uri),
intval($uid)
);
if($r) {
$private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
$r = q("UPDATE item SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
WHERE id = %d AND uid = %d",
dbesc($str_contact_allow),
dbesc($str_group_allow),
dbesc($str_contact_deny),
dbesc($str_group_deny),
intval($private),
intval($r[0]['id']),
intval($uid)
);
}
$r = q("select id from attach where hash = '%s' and uid = %d limit 1",
dbesc($image_uri),
intval($uid)
);
if($r) {
q("update attach SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
WHERE id = %d AND uid = %d",
dbesc($str_contact_allow),
dbesc($str_group_allow),
dbesc($str_contact_deny),
dbesc($str_group_deny),
intval($r[0]['id']),
intval($uid)
);
}
}
}
}
}
}
function fix_attached_file_permissions($channel,$observer_hash,$body,
$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
if(get_pconfig($channel['channel_id'],'system','force_public_uploads')) {
$str_contact_allow = $str_group_allow = $str_contact_deny = $str_group_deny = '';
}
$match = false;
if(preg_match_all("/\[attachment\](.*?)\[\/attachment\]/",$body,$match)) {
$attaches = $match[1];
if($attaches) {
foreach($attaches as $attach) {
$hash = substr($attach,0,strpos($attach,','));
$rev = intval(substr($attach,strpos($attach,',')));
attach_store($channel,$observer_hash,$options = 'update', array(
'hash' => $hash,
'revision' => $rev,
'allow_cid' => $str_contact_allow,
'allow_gid' => $str_group_allow,
'deny_cid' => $str_contact_deny,
'deny_gid' => $str_group_deny
));
}
}
}
}
function item_check_service_class($channel_id,$iswebpage) {
$ret = array('success' => false, 'message' => '');

View File

@@ -226,7 +226,7 @@ class Like extends \Zotlabs\Web\Controller {
$z[0]['deleted'] = 1;
build_sync_packet($ch[0]['channel_id'],array('likes' => $z));
q("delete from likes where id = %d limit 1",
q("delete from likes where id = %d",
intval($z[0]['id'])
);
if($z[0]['i_mid']) {
@@ -447,7 +447,7 @@ class Like extends \Zotlabs\Web\Controller {
$arr['thr_parent'] = $item['mid'];
$ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
$alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
$plink = '[zrl=' . z_root() . '/display/' . $item['mid'] . ']' . $post_type . '[/zrl]';
$plink = '[zrl=' . z_root() . '/display/' . gen_link_id($item['mid']) . ']' . $post_type . '[/zrl]';
$allow_cid = $item['allow_cid'];
$allow_gid = $item['allow_gid'];
$deny_cid = $item['deny_cid'];

View File

@@ -13,7 +13,7 @@ class Linkinfo extends \Zotlabs\Web\Controller {
$text = null;
$str_tags = '';
$process_oembed = true;
$br = "\n";
@@ -22,6 +22,11 @@ class Linkinfo extends \Zotlabs\Web\Controller {
else
$url = trim($_GET['url']);
if(substr($url,0,1) === '!') {
$process_oembed = false;
$url = substr($url,1);
}
$url = strip_zids($url);
if((substr($url,0,1) != '/') && (substr($url,0,4) != 'http'))
@@ -91,10 +96,12 @@ class Linkinfo extends \Zotlabs\Web\Controller {
killme();
}
$x = oembed_process($url);
if($x) {
echo $x;
killme();
if($process_oembed) {
$x = oembed_process($url);
if($x) {
echo $x;
killme();
}
}
if($url && $title && $text) {

View File

@@ -32,10 +32,10 @@ class Lockview extends \Zotlabs\Web\Controller {
if(! $item_id)
killme();
if (!in_array($type, array('item','photo','event', 'menu_item', 'chatroom')))
if (! in_array($type, array('item', 'photo', 'attach', 'event', 'menu_item', 'chatroom')))
killme();
//we have different naming in in menu_item table and chatroom table
// we have different naming in in menu_item table and chatroom table
switch($type) {
case 'menu_item':
$id = 'mitem_id';
@@ -101,8 +101,24 @@ class Lockview extends \Zotlabs\Web\Controller {
stringify_array_elms($deny_groups,true);
stringify_array_elms($deny_users,true);
$profile_groups = [];
if($allowed_groups) {
foreach($allowed_groups as $g) {
if(substr($g,0,4) === '\'vp.') {
$profile_groups[] = '\'' . substr($g,4);
}
}
}
if(count($profile_groups)) {
$r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<li><b>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</b></li>';
}
if(count($allowed_groups)) {
$r = q("SELECT gname FROM `groups` WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<li><b>' . $rr['gname'] . '</b></li>';
@@ -120,8 +136,27 @@ class Lockview extends \Zotlabs\Web\Controller {
}
}
}
$profile_groups = [];
if($deny_groups) {
foreach($deny_groups as $g) {
if(substr($g,0,4) === '\'vp.') {
$profile_groups[] = '\'' . substr($g,4);
}
}
}
if(count($profile_groups)) {
$r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<li><b><strike>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</strike></b></li>';
}
if(count($deny_groups)) {
$r = q("SELECT gname FROM `groups` WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<li><b><strike>' . $rr['gname'] . '</strike></b></li>';

View File

@@ -80,7 +80,7 @@ class Locs extends \Zotlabs\Web\Controller {
function get() {
function get() {
if(! local_channel()) {

View File

@@ -43,18 +43,19 @@ class Lostpass extends \Zotlabs\Web\Controller {
$subject = email_header_encode(sprintf( t('Password reset requested at %s'),get_config('system','sitename')), 'UTF-8');
$res = mail($email, $subject ,
$message,
'From: Administrator@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
$res = z_mail(
[
'toEmail' => $email,
'messageSubject' => sprintf( t('Password reset requested at %s'), get_config('system','sitename')),
'textVersion' => $message,
]
);
goaway(z_root());
}
function get() {
function get() {
if(x($_GET,'verify')) {
@@ -102,20 +103,22 @@ class Lostpass extends \Zotlabs\Web\Controller {
$email_tpl = get_intltext_template("passchanged_eml.tpl");
$message = replace_macros($email_tpl, array(
'$sitename' => \App::$config['sitename'],
'$siteurl' => z_root(),
'$username' => sprintf( t('Site Member (%s)'), $email),
'$email' => $email,
'$new_password' => $new_password,
'$uid' => $newuid ));
$subject = email_header_encode( sprintf( t('Your password has changed at %s'), get_config('system','sitename')), 'UTF-8');
$res = mail($email,$subject,$message,
'From: ' . 'Administrator@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
'$sitename' => \App::$config['sitename'],
'$siteurl' => z_root(),
'$username' => sprintf( t('Site Member (%s)'), $email),
'$email' => $email,
'$new_password' => $new_password,
'$uid' => $newuid )
);
$res = z_mail(
[
'toEmail' => $email,
'messageSubject' => sprintf( t('Your password has changed at %s'), get_config('system','sitename')),
'textVersion' => $message,
]
);
return $o;
}

View File

@@ -140,7 +140,7 @@ class Magic extends \Zotlabs\Web\Controller {
\Zotlabs\Zot\Verify::create('auth',$channel['channel_id'],$token,$x[0]['hubloc_url']);
$target_url = $x[0]['hubloc_callback'] . '/?f=&auth=' . urlencode($channel['channel_address'] . '@' . \App::get_hostname())
$target_url = $x[0]['hubloc_callback'] . '/?f=&auth=' . urlencode(channel_reddress($channel))
. '&sec=' . $token . '&dest=' . urlencode($dest) . '&version=' . ZOT_REVISION;
if($delegate)

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