diff options
author | Mario Vavti <mario@mariovavti.com> | 2018-06-25 14:29:32 +0200 |
---|---|---|
committer | Mario Vavti <mario@mariovavti.com> | 2018-06-25 14:29:32 +0200 |
commit | 62610b5ec0bfe5edffc073eb06c609f33464d34f (patch) | |
tree | 7e9c0255eadcb88c0d4146de669bdf74835915ea | |
parent | 259417815820d85deadaf90f6c0ed003880f373f (diff) | |
parent | 07f004342848c633c8108f97238eff2c8eb1658b (diff) | |
download | volse-hubzilla-62610b5ec0bfe5edffc073eb06c609f33464d34f.tar.gz volse-hubzilla-62610b5ec0bfe5edffc073eb06c609f33464d34f.tar.bz2 volse-hubzilla-62610b5ec0bfe5edffc073eb06c609f33464d34f.zip |
Merge branch 'dev' of https://framagit.org/hubzilla/core into dev
54 files changed, 2447 insertions, 3015 deletions
diff --git a/Zotlabs/Module/Magic.php b/Zotlabs/Module/Magic.php index 4b3a223ba..25c318f30 100644 --- a/Zotlabs/Module/Magic.php +++ b/Zotlabs/Module/Magic.php @@ -19,7 +19,11 @@ class Magic extends \Zotlabs\Web\Controller { $rev = ((x($_REQUEST,'rev')) ? intval($_REQUEST['rev']) : 0); $owa = ((x($_REQUEST,'owa')) ? intval($_REQUEST['owa']) : 0); $delegate = ((x($_REQUEST,'delegate')) ? $_REQUEST['delegate'] : ''); - + + // Apache(?) appears to perform an htmlentities() operation on this variable + + $dest = html_entity_decode($dest); + $parsed = parse_url($dest); if(! $parsed) { if($test) { @@ -139,6 +143,9 @@ class Magic extends \Zotlabs\Web\Controller { if($owa) { + $dest = strip_zids($dest); + $dest = strip_query_param($dest,'f'); + $headers = []; $headers['Accept'] = 'application/x-zot+json' ; $headers['X-Open-Web-Auth'] = random_string(); diff --git a/Zotlabs/Module/Sources.php b/Zotlabs/Module/Sources.php index a180d9b6e..91e2efa60 100644 --- a/Zotlabs/Module/Sources.php +++ b/Zotlabs/Module/Sources.php @@ -12,12 +12,13 @@ class Sources extends \Zotlabs\Web\Controller { return ''; $source = intval($_REQUEST['source']); - $xchan = $_REQUEST['xchan']; + $xchan = escape_tags($_REQUEST['xchan']); $abook = intval($_REQUEST['abook']); - $words = $_REQUEST['words']; + $words = escape_tags($_REQUEST['words']); + $resend = intval($_REQUEST['resend']); $frequency = $_REQUEST['frequency']; - $name = $_REQUEST['name']; - $tags = $_REQUEST['tags']; + $name = escape_tags($_REQUEST['name']); + $tags = escape_tags($_REQUEST['tags']); $channel = \App::get_channel(); @@ -38,6 +39,8 @@ class Sources extends \Zotlabs\Web\Controller { return; } + set_abconfig(local_channel(),$xchan, 'system','rself',$resend); + if(! $source) { $r = q("insert into source ( src_channel_id, src_channel_xchan, src_xchan, src_patt, src_tag ) values ( %d, '%s', '%s', '%s', '%s' ) ", @@ -69,7 +72,7 @@ class Sources extends \Zotlabs\Web\Controller { } - function get() { + function get() { if(! local_channel()) { notice( t('Permission denied.') . EOL); return ''; @@ -110,7 +113,7 @@ class Sources extends \Zotlabs\Web\Controller { '$words' => array( 'words', t('Only import content with these words (one per line)'),'',t('Leave blank to import all public content')), '$name' => array( 'name', t('Channel Name'), '', ''), '$tags' => array('tags', t('Add the following categories to posts imported from this source (comma separated)'),'',t('Optional')), - + '$resend' => [ 'resend', t('Resend posts with this channel as author'), 0, t('Copyrights may apply'), [ t('No'), t('Yes') ]], '$submit' => t('Submit') )); return $o; @@ -145,6 +148,8 @@ class Sources extends \Zotlabs\Web\Controller { '$xchan' => $r[0]['src_xchan'], '$abook' => $x[0]['abook_id'], '$tags' => array('tags', t('Add the following categories to posts imported from this source (comma separated)'),$r[0]['src_tag'],t('Optional')), + '$resend' => [ 'resend', t('Resend posts with this channel as author'), get_abconfig(local_channel(), $r[0]['xchan_hash'],'system','rself'), t('Copyrights may apply'), [ t('No'), t('Yes') ]], + '$name' => array( 'name', t('Channel Name'), $r[0]['xchan_name'], ''), '$submit' => t('Submit') )); diff --git a/Zotlabs/Storage/Directory.php b/Zotlabs/Storage/Directory.php index 73548fda0..642af6300 100644 --- a/Zotlabs/Storage/Directory.php +++ b/Zotlabs/Storage/Directory.php @@ -722,14 +722,13 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota, DAV\IMo function ChannelList(&$auth) { $ret = array(); - $r = q("SELECT channel_id, channel_address FROM channel WHERE channel_removed = 0 - AND channel_system = 0 AND (channel_pageflags & %d) = 0", + $r = q("SELECT channel_id, channel_address, profile.publish FROM channel left join profile on profile.uid = channel.channel_id WHERE channel_removed = 0 AND channel_system = 0 AND (channel_pageflags & %d) = 0", intval(PAGE_HIDDEN) ); if ($r) { foreach ($r as $rr) { - if (perm_is_allowed($rr['channel_id'], $auth->observer, 'view_storage')) { + if (perm_is_allowed($rr['channel_id'], $auth->observer, 'view_storage') && $rr['publish']) { logger('found channel: /cloud/' . $rr['channel_address'], LOGGER_DATA); // @todo can't we drop '/cloud'? It gets stripped off anyway in RedDirectory $ret[] = new Directory('/cloud/' . $rr['channel_address'], $auth); diff --git a/doc/admin/administrator_guide.md b/doc/admin/administrator_guide.md index 34dfa8cad..5f1d40428 100644 --- a/doc/admin/administrator_guide.md +++ b/doc/admin/administrator_guide.md @@ -331,16 +331,6 @@ empty: util/config system directory_server "" -### Upgrading from RedMatrix to $Projectname - -#### How to migrate an individual channel from RedMatrix to $Projectname - -1. Clone the channel by opening an account on a $Projectname hub and performing a basic import (not content) from the original RedMatrix hub. Give your new clone time to sync connections and settings. -1. Export individual channel content from your RedMatrix hub to a set of JSON text files using the red.hub/uexport tool. Do this in monthly increments if necessary. -1. Import the JSON data files sequentially in chronological order into the $Projectname clone using the new.hub/import_items tool. -1. Inform your Friendica and Diaspora contacts that your channel moves. They need to reconnect to your new address. -1. After successful import (check!) delete your channel on the old RedMatrix Server. -1. On the $Projectname server visit new.hub/locs and upgrade to your channel to a primary one. And when the old Redmatrix server is still listed delete them here as well. Press "Sync" to inform all other server in the grid. ### Administration diff --git a/doc/api/api_functions.bb b/doc/api/api_functions.bb index e6cde3dc6..fe7cb11ba 100644 --- a/doc/api/api_functions.bb +++ b/doc/api/api_functions.bb @@ -1,133 +1,133 @@ -[b]Red Twitter API[/b]
-
-The "basic" Red web API is based on the Twitter API, as this provides instant compatibility with a huge number of third-party clients and applications without requiring any code changes on their part. It is also a super-set of the StatusNet version of the Twitter API, as this also has existing wide support.
-
-Red has a lot more capability that isn't exposed in the Twitter interfaces or where we are forced to "dumb-down" the API functions to work with the primitive Twitter/StatusNet communications and privacy model. So we plan to extend the Twitter API in ways that will allow Red-specific clients to make full use of Red features without being crippled.
-
-A dedicated Red API is also being developed to work with native data structures and permissions and which do not require translating to different privacy and permission models and storage formats. This will be described in other documents. The prefix for all of the native endpoints is 'api/red'.
-
-Red provides multiple channels accesible via the same login account. With Red, any API function which requires authentication will accept a parameter &channel={channel_nickname} - and will select that channel and make it current before executing the API command. By default, the default channel associated with an account is selected.
-
-Red also provides an extended permission model. In the absence of any Red specific API calls to set permissions, they will be set to the default permissions settings which are associated with the current channel.
-
-Red will probably never be able to support the Twitter 'api/friendships' functions fully because Red is not a social network and has no concept of "friendships" - it only recognises permissions to do stuff (or not do stuff as the case may be).
-
-Legend: T= Twitter, S= StatusNet, F= Friendica, R= Red, ()=Not yet working, J= JSON only (XML formats deprecated)
-
-Twitter API compatible functions:
-
- api/account/verify_credentials T,S,F,R
- api/statuses/update T,S,F,R
- api/users/show T,S,F,R
- api/statuses/home_timeline T,S,F,R
- api/statuses/friends_timeline T,S,F,R
- api/statuses/public_timeline T,S,F,R
- api/statuses/show T,S,F,R
- api/statuses/retweet T,S,F,R
- api/statuses/destroy T,S,F,(R)
- api/statuses/mentions T,S,F,(R)
- api/statuses/replies T,S,F,(R)
- api/statuses/user_timeline T,S,F,(R)
- api/favorites T,S,F,R
- api/account/rate_limit_status T,S,F,R
- api/help/test T,S,F,R
- api/statuses/friends T,S,F,R
- api/statuses/followers T,S,F,R
- api/friends/ids T,S,F,R
- api/followers/ids T,S,F,R
- api/direct_messages/new T,S,F,R
- api/direct_messages/conversation T,S,F,R
- api/direct_messages/all T,S,F,R
- api/direct_messages/sent T,S,F,R
- api/direct_messages T,S,F,R
- api/oauth/request_token T,S,F,R
- api/oauth/access_token T,S,F,R
- api/favorites T,S,R
- api/favorites/create T,S,R
- api/favorites/destroy T,S,R
-
-Twitter API functions supported by StatusNet but not currently by Friendica or Red
-
- api/statuses/retweets_of_me T,S
- api/friendships/create T,S
- api/friendships/destroy T,S
- api/friendships/exists T,S
- api/friendships/show T,S
- api/account/update_location T,S
- api/account/update_profile_background_image T,S
- api/account/update_profile_image T,S
- api/blocks/create T,S
- api/blocks/destroy T,S
-
-Twitter API functions not currently supported by StatusNet
-
- api/statuses/retweeted_to_me T
- api/statuses/retweeted_by_me T
- api/direct_messages/destroy T
- api/account/end_session T,(R)
- api/account/update_delivery_device T
- api/notifications/follow T
- api/notifications/leave T
- api/blocks/exists T
- api/blocks/blocking T
- api/lists T
-
-Statusnet compatible extensions to the Twitter API supported in both Friendica and Red
-
- api/statusnet/version S,F,R
- api/statusnet/config S,F,R
-
-Friendica API extensions to the Twitter API supported in both Friendica and Red
-
- api/statuses/mediap F,R
-
-Red specific API extensions to the Twitter API not supported in Friendica
-
- api/account/logout R
- api/export/basic R,J
- api/friendica/config R
- api/red/config R
- api/friendica/version R
-
- api/red/version R
-
- api/red/channel/export/basic R,J
- api/red/channel/stream R,J (currently post only)
- api/red/albums R,J
- api/red/photos R,J (option album=xxxx)
-
-Red proposed API extensions to the Twitter API
-
- api/statuses/edit (R),J
- api/statuses/permissions (R),J
- api/statuses/permissions/update (R),J
- api/statuses/ids (R),J # search for existing message_id before importing a foreign post
- api/files/show (R),J
- api/files/destroy (R),J
- api/files/update (R),J
- api/files/permissions (R),J
- api/files/permissions/update (R),J
- api/pages/show (R),J
- api/pages/destroy (R),J
- api/pages/update (R),J
- api/pages/permissions (R),J
- api/pages/permissions/update (R),J
- api/events/show (R),J
- api/events/update (R),J
- api/events/permissions (R),J
- api/events/permissions/update (R),J
- api/events/destroy (R),J
- api/photos/show (R),J
- api/photos/update (R),J
- api/photos/permissions (R),J
- api/photos/permissions/update (R),J
- api/albums/destroy (R),J
- api/albums/show (R),J
- api/albums/update (R),J
- api/albums/permissions (R),J
- api/albums/permissions/update (R),J
- api/albums/destroy (R),J
- api/friends/permissions (R),J
-
-#include doc/macros/main_footer.bb;
-
+[b]Red Twitter API[/b] + +The "basic" Red web API is based on the Twitter API, as this provides instant compatibility with a huge number of third-party clients and applications without requiring any code changes on their part. It is also a super-set of the StatusNet version of the Twitter API, as this also has existing wide support. + +Red has a lot more capability that isn't exposed in the Twitter interfaces or where we are forced to "dumb-down" the API functions to work with the primitive Twitter/StatusNet communications and privacy model. So we plan to extend the Twitter API in ways that will allow Red-specific clients to make full use of Red features without being crippled. + +A dedicated Red API is also being developed to work with native data structures and permissions and which do not require translating to different privacy and permission models and storage formats. This will be described in other documents. The prefix for all of the native endpoints is 'api/red'. + +Red provides multiple channels accesible via the same login account. With Red, any API function which requires authentication will accept a parameter &channel={channel_nickname} - and will select that channel and make it current before executing the API command. By default, the default channel associated with an account is selected. + +Red also provides an extended permission model. In the absence of any Red specific API calls to set permissions, they will be set to the default permissions settings which are associated with the current channel. + +Red will probably never be able to support the Twitter 'api/friendships' functions fully because Red is not a social network and has no concept of "friendships" - it only recognises permissions to do stuff (or not do stuff as the case may be). + +Legend: T= Twitter, S= StatusNet, F= Friendica, R= Red, ()=Not yet working, J= JSON only (XML formats deprecated) + +Twitter API compatible functions: + + api/account/verify_credentials T,S,F,R + api/statuses/update T,S,F,R + api/users/show T,S,F,R + api/statuses/home_timeline T,S,F,R + api/statuses/friends_timeline T,S,F,R + api/statuses/public_timeline T,S,F,R + api/statuses/show T,S,F,R + api/statuses/retweet T,S,F,R + api/statuses/destroy T,S,F,(R) + api/statuses/mentions T,S,F,(R) + api/statuses/replies T,S,F,(R) + api/statuses/user_timeline T,S,F,(R) + api/favorites T,S,F,R + api/account/rate_limit_status T,S,F,R + api/help/test T,S,F,R + api/statuses/friends T,S,F,R + api/statuses/followers T,S,F,R + api/friends/ids T,S,F,R + api/followers/ids T,S,F,R + api/direct_messages/new T,S,F,R + api/direct_messages/conversation T,S,F,R + api/direct_messages/all T,S,F,R + api/direct_messages/sent T,S,F,R + api/direct_messages T,S,F,R + api/oauth/request_token T,S,F,R + api/oauth/access_token T,S,F,R + api/favorites T,S,R + api/favorites/create T,S,R + api/favorites/destroy T,S,R + +Twitter API functions supported by StatusNet but not currently by Friendica or Red + + api/statuses/retweets_of_me T,S + api/friendships/create T,S + api/friendships/destroy T,S + api/friendships/exists T,S + api/friendships/show T,S + api/account/update_location T,S + api/account/update_profile_background_image T,S + api/account/update_profile_image T,S + api/blocks/create T,S + api/blocks/destroy T,S + +Twitter API functions not currently supported by StatusNet + + api/statuses/retweeted_to_me T + api/statuses/retweeted_by_me T + api/direct_messages/destroy T + api/account/end_session T,(R) + api/account/update_delivery_device T + api/notifications/follow T + api/notifications/leave T + api/blocks/exists T + api/blocks/blocking T + api/lists T + +Statusnet compatible extensions to the Twitter API supported in both Friendica and Red + + api/statusnet/version S,F,R + api/statusnet/config S,F,R + +Friendica API extensions to the Twitter API supported in both Friendica and Red + + api/statuses/mediap F,R + +Red specific API extensions to the Twitter API not supported in Friendica + + api/account/logout R + api/export/basic R,J + api/friendica/config R + api/red/config R + api/friendica/version R + + api/red/version R + + api/red/channel/export/basic R,J + api/red/channel/stream R,J (currently post only) + api/red/albums R,J + api/red/photos R,J (option album=xxxx) + +Red proposed API extensions to the Twitter API + + api/statuses/edit (R),J + api/statuses/permissions (R),J + api/statuses/permissions/update (R),J + api/statuses/ids (R),J # search for existing message_id before importing a foreign post + api/files/show (R),J + api/files/destroy (R),J + api/files/update (R),J + api/files/permissions (R),J + api/files/permissions/update (R),J + api/pages/show (R),J + api/pages/destroy (R),J + api/pages/update (R),J + api/pages/permissions (R),J + api/pages/permissions/update (R),J + api/events/show (R),J + api/events/update (R),J + api/events/permissions (R),J + api/events/permissions/update (R),J + api/events/destroy (R),J + api/photos/show (R),J + api/photos/update (R),J + api/photos/permissions (R),J + api/photos/permissions/update (R),J + api/albums/destroy (R),J + api/albums/show (R),J + api/albums/update (R),J + api/albums/permissions (R),J + api/albums/permissions/update (R),J + api/albums/destroy (R),J + api/friends/permissions (R),J + +#include doc/macros/main_footer.bb; + diff --git a/doc/ca/profiles.bb b/doc/ca/profiles.bb index 513bf5fed..5aa04e706 100644 --- a/doc/ca/profiles.bb +++ b/doc/ca/profiles.bb @@ -1,37 +1,37 @@ -[b]Profiles[/b]
-
-$Projectname has unlimited profiles. You may use different profiles to show different "sides of yourself" to different audiences. This is different to having different channels. Different channels allow for completely different sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded "sides" of each channel. For example, your default public profile might say "Hello, I'm Fred, and I like laughing". You may show your close friends a profile that adds "and I also enjoy dwarf tossing".
-
-You always have a profile known as your "default" or "public" profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile.
-
-That said, if you want other friends to be able to find you, it helps to have the following information in your public profile...
-
-[ul][*]Your real name or at least a nickname everybody knows
-[*]A photo of you
-[*]Your location on the planet, at least to a country level.[/ul]
-
-In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some "Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like.
-
-To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings > Additional Features[/zrl] and enable "Multiple Profiles" there, otherwise you won't have the ability to use more than just your default profile.
-
-Then select "Edit Profiles" from the menu of your $Projectname site. You may edit an existing profile, change the profile photo, add things to a profile or create a new profile. You may also create a "clone" of an existing profile if you only wish to change a few items but don't wish to enter all the information again. To do that, click on the profile you want to clone and choose "Clone this profile" there.
-
-In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on "Edit visibility" next to the profile in question (only available for the profiles that are not your default profile) and then click on user images to add them to or remove them from the group of people who can see this profile.
-
-Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile.
-
-There is a setting which allows you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the "Settings" page.
-
-If you do not wish to be found be people unless you give them your channel address, you may leave your profile unpublished.
-
-[b]Keywords and Directory Search[/b]
-
-On the directory page, you may search for people with published profiles. Currently, only the name field and the keywords are searched. You may also include such keywords in your default profile - which may be used to search for common interests with other members. Keywords are used in the channel suggestion tool and although they aren't visible in the directory, they are shown if people visit your profile page.
-
-On your Connnections page and in the directory there is a link to "Suggestions" or "Channel Suggestions", respectively. This will find channels who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance.
-
-See Also
-
-[zrl=[baseurl]/help/AdvancedSearch]Advanced Searching[/zrl]
-
-#include doc/macros/main_footer.bb;
+[b]Profiles[/b] + +$Projectname has unlimited profiles. You may use different profiles to show different "sides of yourself" to different audiences. This is different to having different channels. Different channels allow for completely different sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded "sides" of each channel. For example, your default public profile might say "Hello, I'm Fred, and I like laughing". You may show your close friends a profile that adds "and I also enjoy dwarf tossing". + +You always have a profile known as your "default" or "public" profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile. + +That said, if you want other friends to be able to find you, it helps to have the following information in your public profile... + +[ul][*]Your real name or at least a nickname everybody knows +[*]A photo of you +[*]Your location on the planet, at least to a country level.[/ul] + +In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some "Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like. + +To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings > Additional Features[/zrl] and enable "Multiple Profiles" there, otherwise you won't have the ability to use more than just your default profile. + +Then select "Edit Profiles" from the menu of your $Projectname site. You may edit an existing profile, change the profile photo, add things to a profile or create a new profile. You may also create a "clone" of an existing profile if you only wish to change a few items but don't wish to enter all the information again. To do that, click on the profile you want to clone and choose "Clone this profile" there. + +In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on "Edit visibility" next to the profile in question (only available for the profiles that are not your default profile) and then click on user images to add them to or remove them from the group of people who can see this profile. + +Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile. + +There is a setting which allows you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the "Settings" page. + +If you do not wish to be found be people unless you give them your channel address, you may leave your profile unpublished. + +[b]Keywords and Directory Search[/b] + +On the directory page, you may search for people with published profiles. Currently, only the name field and the keywords are searched. You may also include such keywords in your default profile - which may be used to search for common interests with other members. Keywords are used in the channel suggestion tool and although they aren't visible in the directory, they are shown if people visit your profile page. + +On your Connnections page and in the directory there is a link to "Suggestions" or "Channel Suggestions", respectively. This will find channels who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance. + +See Also + +[zrl=[baseurl]/help/AdvancedSearch]Advanced Searching[/zrl] + +#include doc/macros/main_footer.bb; diff --git a/doc/campaign.bb b/doc/campaign.bb index 677abf8c0..dddc614f9 100644 --- a/doc/campaign.bb +++ b/doc/campaign.bb @@ -1,237 +1,237 @@ -[b]Initial Indiegg pitch[/b]
-
-[b][color= grey][size=20]What have we done, and what we hope to achieve[/size][/color][/b]
-
-[b][color= grey][size=18]Single-click sign on, nomadic identity, censorship-resistance, privacy, self-hosting[/size][/color][/b]
-
-We started $Projectname project by asking ourselves a few questions:
-
-- Imagine if it was possible to just access the content of different web sites, without the need to enter usernames and passwords for every site. Such a feature would permit Single-Click user identification: the ability to access sites simply by clicking on links to remote sites.
-Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.
-
-We liked this idea and went ahead with coding it immediately. Today, single-click sign is in alpha state. It needs more love, which means a solid three months of full-time development efforts.
-
-- Think of your Facebook, Twitter, WordPress, or any other website where you currently have an account. Now imagine being able to clone your account, to make an exact duplicate of it (with all of your friends, posts and settings), then export your cloned account into another server that is part of this communication network. After you're done, both of your accounts are synced from the time they were cloned. It doesn't matter where you log in (at your original location, or where you imported your clone). You see the same content, the same friends, posts, and account settings.
-At that point, it is more appropriate to call your account an identity that is nomadic (it is not tied to one home, unless you choose to do so!).
-It's 2013, our online presence no longer has to be tied to a single server, domain name or IP address. We should be able to clone and import our identities to other servers. In such a network, it should only matter who you are, not where you are.
-
-We're very intrigued by the possibilities nomadic identities open up for freedom, censorship-resistance, and identity resilience. Consider the following scenarios:
-
- -- Should a repressive government or corporation decide to delete your account, your cloned identity lives on, because it is located on another server, across the world, which is part of the same communication network. You can't be silenced!
-
- -- What if there is a server meltdown, and your identity goes off line. No problem, you log into your clone and all is good.
-
- -- Your server administrator can no longer afford to keep paying to support a free service (a labor love and principle, which all of us have participating in as system administrators of Friendica sites!). She notifies you that you must clone your account before the shutoff date. Rather than loose all your friends, and start from scratch by creating a new identity somewhere, you clone and move to another server.
-We feel this is especially helpful for the free web, where administrators of FOSS community sites are often faced with difficult financial decisions. Since many of them rely on donations, sometimes servers have to be taken offline, when costs become prohibitive for the brave DIY souls running those server. Nomadic identities should relieve some of the pressures associated with such situations.
-
-At the same time, we are also thinking of solutions that would make it possible for people running Red hubs to be financially sustainable. To that end, we're starting to implement service classes in our code, which would allow administrators to structure paid levels of service, if they choose to do so.
-
-Today, nomadic identity is currently in alpha state. It also needs more love, which means a solid three months of full-time development efforts.
-
-- Imagine a social network that is censorship-resistant, and privacy-respecting by design. It is not controlled by one mega-corporation, and where users cannot be easily censored by oppressive governments. So, in addition to nomadic identities, we are talking about decentralization, open source, freely software, that can run on any hardware that supports a database and a modern web browser. And we mean "any hardware", from a self-hosted $35 Raspberry Pi, to the very latest Intel Xeon and AMD Bulldozer-powered server behemoths.
-
-We've realized that privacy requires full control over content. We should be able to delete, backup and download all of our content, as well as associated account/identity information. To this end, we have already implemented the initial version of account export and backup.
-
-Concerned about pages and pages of posts from months and years past? The solution should be simple: visit your settings page, specify that all content older than 7 days, with the exception of starred posts, should be automatically deleted. Done, the clutter is gone! (Consider also the privacy and anti-mass surveillance implications of this feature. PRISM disclosures have hinted that three-letter spying agencies around the world are recording all internet traffic and storing it for a few days at a time. We feel that automatic post expiration becomes a rather useful feature in this context, and implementing it is one of our near future priorities.)
-
-[b][color= grey][size=18]The Affinity Slider and Access Control Lists[/size][/color][/b]
-
-- What if the permissions and access control lists that help secure modern operating systems were extended into a communication network that lived on the internet? This means somebody could log into this network from their home site, and with the simple click of a few buttons dynamically sort who can have access to their online content on a very fine level: from restricting others from seeing your latest blog post, to sharing your bookmarks with the world.
-
-We've coded the initial version of such a new feature. It is called the "Affinity Slider", and in our very-alpha user interface it looks like this.
-[img]https://friendicared.net/photo/b07b0262e3146325508b81a9d1ae4a1e-0.png[/img]
-
-{INSERT SCREENSHOT OF A MATRIX PAGE}
-
-Think of it as an easy way to filter content that you see, based on the degree of "closeness" to you. Move the slider to Friends, and only content coming from contacts you've tagged as friends is displayed on your home page. Uncluttering thousands of contacts, friends, RSS feeds, and other content should be a basic feature of modern communication on the web, but not at the expense of ease of use.
-
-In addition to the Affinity Slider, we also have the ACL (Access Control List). Say you want to share something with only 5 of your contacts (a blog, two friends from college, and two forums). You click on the padlock, choose the recipients, and that's it. Only those identities will recieve their posts. Furthermore, the post will be encrypted via PKI (pulic key encryption) to help maintain privacy. In the age of PRISM, we don't know all the details on what's safe out there, but we still think that privacy by design should be automatically present, invisible to the user, and easy to use.
-Attaching permissions to any data that lives on this network, potentially solves a great many headaches, while achieving simplicity in communication.
-
-Think of it this way: the internet is nothing, but a bunch of permissions and a folder of data. You, the user controls the permissions and thus the data that is relevant to you.
-
-[b][color= grey][size=20]The Matrix is Born![/size][/color][/b]
-
-After asking and striving to answer a number of such questions, we realized that we were imagining a general purpose communication network with a number of unique, and potentially game-changing, features. We called it $Projectname and started thinking of it as an over-lay on top of the internet as it exists today; an operating system re-invented as a communication network, with its own permissions, access control lists, protocol, connectors to others services, and open-ended possibilities via its API. The sum of the matrix is greater than it's parts. We're not building website, but a way for websites to link together and grow into something that is unique and ever-changing, with autonomy and privacy.
-
-It's a lot of work, for anyone. So far, we've got a team of a handful of volunteers, code geeks, brave early adopters, system administrators and other good people, willing to give the project a shot. We're motivated by our commitment to a free web, where privacy is built-in, and corporations don't have a stranglehold on our daily communication.
-
-We need your help to finish it and release it to the world!
-
-[b][color= grey][size=20]What have we written so far[/size][/color][/b]
-
-As of the today, $Projectname is in developer preview (alpha) state. It is not ready for everyday use, but some of the initial set of core features are implemented (again, in alpha state). These include:
-
-- Zot, the protocol powering the matrix
-- Single-signon logins.
-- Nomadic identities
-- Basic content manipulation: creation, deletion, rudimentary handling of photos, and media files
-- A bare-bones outline of the API and user documentation.
-
-
-[b][color= grey][size=20]Our TO-DO List[/size][/color][/b]
-
-However, in addition to finishing and polishing the above, there are a number of features that have to implemented to make $Projectname ready for daily use. If we meet our fundraising goal, we hope to dive into the following road map, by order of priority:
-
-- A professionally designed user interface (UI), interface that is adaptive to any user level, from end users who want to use the Matrix as a social network, to tinkerers who will put together a customized blog using Comanche, to hackers who will develop and extend the matrix using a built-in code editor, that hooks to the API and the git.
-
-- Comanche, our new markup language, similar to BBCode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. You can read more about it on our github wiki: https://github.com/friendica/red/wiki/Comanche
-
-- A unique help system that lives in the matrix, but is not based on the principles of a search engine. We have some interesting ideas about decentralizing help documentation, without going down the road of distributed search engines. Here's a hint: We shouldn't be searching at all, we should just be filtering what's already there in new, and cunning ways.
-
-- An appropriate logo, along with professionally done documentation system, both for our API, as well as users.
-
-- WordPress-like single button software upgrades
-
-- A built-in development environment, using an integrated web-based code editor such as Ace9
-
-[b][color= grey][size=20]What will the money be used for[/size][/color][/b]
-
-If we raise our targeted amount of funds, we plan to use it as follows:
-
-1) Fund 6 months {OR WHATEVER} of full time work for our current core developers, Mike, Thomas, and Tobias {ANYONE ELSE?]
-
-2) Pay a professional web developer to design an kick ass reference theme, along with a project logo.
-
-3) {WHAT ELSE?}
-
-[b][color= grey][size=20]Deadlines[/size][/color][/b]
-
-[b]March, 2014: $Projectname Beta with the following features[/b]
-
-- {LIST FEATURES}
-
-[b][color= grey][size=20]Who We Are[/size][/color][/b]
-
-Mike: {FILL IN BIO, reference Friendica, etc.}
-
-Thomas: {bio blurb}
-
-Tobias: {bio blurb}
-
-Arto: {documentation, etc.}
-
-{WHO ELSE? WE NEED A TEAM, AT LEAST 3-4 PEOPLE}
-
-[b][color= grey][size=20]What Do I Get as a Supporter?[/size][/color][/b]
-
-Our ability to reach 1.0 stable release depends on your generosity and support. We appreciate your help, regardless of the amount! Here's what we're thinking as far as different contribution levels go:
-
-[b]$1: {CATCHY TAGLINE}[/b]
-
-We'll list your name on our initial supporters list, a Hall of Fame of the matrix!
-
-[b]$5:[/b]
-
-[b]$10: [/b]
-
-[b]$16: [/b]
-
-You get one of your $Projectname t-shirts, as well as our undying gratitude.
-
-[b]$32: [/b]
-
-[b]$64 [/b]
-
-[b]128 [/b]
-
-[b]$256: [/b]
-
-[b]$512: [/b]
-
-[b]$1024 [/b]
-
-[b]$2048[/b]
-
-Each contributor at this level gets their own $Projectname virtual private server, installed, hosted and supported by us for a period of 1 year.
-
-[b][color= grey][size=20]Why are we so excited about $Projectname?[/size][/color][/b]
-
-{SOMETHING ABOUT THE POTENTIAL IMPACT OF RED, ITS INNOVATIONS, ETC>
-
-[b][color= grey][size=20]Other Ways to Help[/size][/color][/b]
-
-We're a handful of volunteers, and we understand that not everyone can contribute by donating money. There are many other ways you can in getting the Matrix to version 1.0!
-
-First, you can checkout our source code on github: https://framagit.org/hubzilla/core/
-
-Maybe you can dive in and help us out with some development.
-
-Second, you can install the current developer preview on a server and start compiling bug reports.
-
-Third, register at one of the public alpha Red hubs, and get a feel for what Red is trying to do!
-
-Perhaps you're good at writing and documenting stuff. Grab an account at one of the public alphas and give us a hand.
-
-[b][color= grey][size=20]Frequently Asked Questions[/size][/color][/b]
-
-[b]1. Is Red a social network?[/b]
-
-$Projectname is not a social network. We're thinking of it as a general purpose communication network, with sharing, and public/private communications built into the matrix.
-
-[b]2. What is the difference between Red and Friendica?[/b]
-
-What's the difference between a passport, and a postcard?
-
-Friendica is really, really good at sending postcards. It can do all sorts of things with postcards. It can send them to your friends. It can send them to people you don't know. It can put them in an envelope and send them privately. It can run them through a photocopier and plaster them all over the internet. It can even take postcards in one language and convert them to many others so your friends who speak a different language can read them.
-
-What Friendica can't do, is wave a postcard at somebody and expect them to believe that holding this postcard prove you are who you say you are. Sure, if you've been sending somebody postcards, they might accept that it is you in the picture, but somebody who has never heard of you will not accept ownership of a postcard as proof of identity.
-
-$Projectname offers a passport.
-
-You can still use it to send postcards. At the same time, when you wave your passport at somebody, they do accept it as proof of identity. No longer do you need to register at every single site you use. You already have an account - it's just not necessarily at our site - so we'll ask to see your passport instead.
-
-Once you've proven your identity, a Red hub lets you use our services, as though you'd registered with directly, and we'd verified your credentials as would have happened in the olden days. These resources can, of course, be anything at all.
-
-[b]2. Why did you choose PHP, instead of Ruby or Python?[/b]
-
-The reference implementation is in PHP. We chose PHP, because it is available everywhere, and is easily configurable. We understand the debates between proponents and opponents of PHP, Ruby and Python. Nothing prevents implementations of Zot and the matrix in those languages. In fact, people on the matrix have already started developing a version of Red in Python [SOURCE?], and there is talk about future implementations in C (aiming for blazing native performance) and Java. It's free and open source, so we feel it's only a matter of time, once Red is initially completed.
-
-[b]4. Other than PHP, what other technology does Red use?[/b]
-
-We use MySQL as our database (this include any forks such as, MariaDB or Percona), and any modern webserver (Apache, nginx, etc.).
-
-[b]5. How is the Affinity Slider different from Mozilla's Persona?[/b]
-{COMPLETE}
-
-[b]6. Does $Projectname use encryption? Details please![/b]
-
-Yes, we do our best to use free and open source encryption libraries to help achieve privacy from general, mass surveillance.
-
-Communication between web browsers and Red hubs is encrypted using SSL certificates.
-
-Private communication on the matrix is protected by AES symmetric encryption, which is itself protected by RSA PKI (public key encryption). By default, we use AES-256-CBC, and our RSA keys are set to 4096-bits.
-
-For more info on our initial implementation of encrypted communication, check out our source code at Github: https://github.com/friendica/red/blob/master/include/crypto.php
-
-[b]7. What do you mean by decentralization? [/b]
-
-
-[b]8. Can I build my own website with in $Projectname?[/b]
-
-Yes. The short explanation: We've got this spiffy idea we're calling "Comanche", which will allow non-programmers to build complete custom websites, and any such website will be able to connect to any other website or channel in the matrix. The goal of Comanche is to hide the technical complexities of communicating in the matrix, while encouraging people to use their creativity and put together their own unique presence on the matrix.
-
-The longer explanation: Comanche is a markup language, similar to bbcode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Description Language file (".pdl", pronounced "puddle") to create these pages. Bbcode is not a requirement; an XML PDL file could also be used. The tag delimiters would be different. Usage is the same.
-
-Additional information is available on our Github project wiki: https://github.com/friendica/red/wiki/Comanche
-
-Comanche is another one of our priorities for the next six months.
-
-[b]9. Where can I see some technical description of Zot?[/b]
-
-Our github wiki contains a number of high-level and technical descriptions of Zot, Comanche, and Red in general: https://github.com/friendica/red/wiki
-
-[b]10. What happens if you raise more than {TARGETED NUMBER}?[/b]
-
-Raising more than our initial goal of funds, will speed up our development efforts. More developers will be able to take time off from other jobs, and concentrate efforts on finishing Red.
-
-[b]11 Can I make a contribution via Bitcoin?[/b]
-
-{YES/NO}
-
-[b]12. I have additional Questions[/]
-
-Awesome. We'd be more than happy to chat. You can find us {HERE}
-
-#include doc/macros/main_footer.bb;
-
+[b]Initial Indiegg pitch[/b] + +[b][color= grey][size=20]What have we done, and what we hope to achieve[/size][/color][/b] + +[b][color= grey][size=18]Single-click sign on, nomadic identity, censorship-resistance, privacy, self-hosting[/size][/color][/b] + +We started $Projectname project by asking ourselves a few questions: + +- Imagine if it was possible to just access the content of different web sites, without the need to enter usernames and passwords for every site. Such a feature would permit Single-Click user identification: the ability to access sites simply by clicking on links to remote sites. +Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online. + +We liked this idea and went ahead with coding it immediately. Today, single-click sign is in alpha state. It needs more love, which means a solid three months of full-time development efforts. + +- Think of your Facebook, Twitter, WordPress, or any other website where you currently have an account. Now imagine being able to clone your account, to make an exact duplicate of it (with all of your friends, posts and settings), then export your cloned account into another server that is part of this communication network. After you're done, both of your accounts are synced from the time they were cloned. It doesn't matter where you log in (at your original location, or where you imported your clone). You see the same content, the same friends, posts, and account settings. +At that point, it is more appropriate to call your account an identity that is nomadic (it is not tied to one home, unless you choose to do so!). +It's 2013, our online presence no longer has to be tied to a single server, domain name or IP address. We should be able to clone and import our identities to other servers. In such a network, it should only matter who you are, not where you are. + +We're very intrigued by the possibilities nomadic identities open up for freedom, censorship-resistance, and identity resilience. Consider the following scenarios: + + -- Should a repressive government or corporation decide to delete your account, your cloned identity lives on, because it is located on another server, across the world, which is part of the same communication network. You can't be silenced! + + -- What if there is a server meltdown, and your identity goes off line. No problem, you log into your clone and all is good. + + -- Your server administrator can no longer afford to keep paying to support a free service (a labor love and principle, which all of us have participating in as system administrators of Friendica sites!). She notifies you that you must clone your account before the shutoff date. Rather than loose all your friends, and start from scratch by creating a new identity somewhere, you clone and move to another server. +We feel this is especially helpful for the free web, where administrators of FOSS community sites are often faced with difficult financial decisions. Since many of them rely on donations, sometimes servers have to be taken offline, when costs become prohibitive for the brave DIY souls running those server. Nomadic identities should relieve some of the pressures associated with such situations. + +At the same time, we are also thinking of solutions that would make it possible for people running Red hubs to be financially sustainable. To that end, we're starting to implement service classes in our code, which would allow administrators to structure paid levels of service, if they choose to do so. + +Today, nomadic identity is currently in alpha state. It also needs more love, which means a solid three months of full-time development efforts. + +- Imagine a social network that is censorship-resistant, and privacy-respecting by design. It is not controlled by one mega-corporation, and where users cannot be easily censored by oppressive governments. So, in addition to nomadic identities, we are talking about decentralization, open source, freely software, that can run on any hardware that supports a database and a modern web browser. And we mean "any hardware", from a self-hosted $35 Raspberry Pi, to the very latest Intel Xeon and AMD Bulldozer-powered server behemoths. + +We've realized that privacy requires full control over content. We should be able to delete, backup and download all of our content, as well as associated account/identity information. To this end, we have already implemented the initial version of account export and backup. + +Concerned about pages and pages of posts from months and years past? The solution should be simple: visit your settings page, specify that all content older than 7 days, with the exception of starred posts, should be automatically deleted. Done, the clutter is gone! (Consider also the privacy and anti-mass surveillance implications of this feature. PRISM disclosures have hinted that three-letter spying agencies around the world are recording all internet traffic and storing it for a few days at a time. We feel that automatic post expiration becomes a rather useful feature in this context, and implementing it is one of our near future priorities.) + +[b][color= grey][size=18]The Affinity Slider and Access Control Lists[/size][/color][/b] + +- What if the permissions and access control lists that help secure modern operating systems were extended into a communication network that lived on the internet? This means somebody could log into this network from their home site, and with the simple click of a few buttons dynamically sort who can have access to their online content on a very fine level: from restricting others from seeing your latest blog post, to sharing your bookmarks with the world. + +We've coded the initial version of such a new feature. It is called the "Affinity Slider", and in our very-alpha user interface it looks like this. +[img]https://friendicared.net/photo/b07b0262e3146325508b81a9d1ae4a1e-0.png[/img] + +{INSERT SCREENSHOT OF A MATRIX PAGE} + +Think of it as an easy way to filter content that you see, based on the degree of "closeness" to you. Move the slider to Friends, and only content coming from contacts you've tagged as friends is displayed on your home page. Uncluttering thousands of contacts, friends, RSS feeds, and other content should be a basic feature of modern communication on the web, but not at the expense of ease of use. + +In addition to the Affinity Slider, we also have the ACL (Access Control List). Say you want to share something with only 5 of your contacts (a blog, two friends from college, and two forums). You click on the padlock, choose the recipients, and that's it. Only those identities will recieve their posts. Furthermore, the post will be encrypted via PKI (pulic key encryption) to help maintain privacy. In the age of PRISM, we don't know all the details on what's safe out there, but we still think that privacy by design should be automatically present, invisible to the user, and easy to use. +Attaching permissions to any data that lives on this network, potentially solves a great many headaches, while achieving simplicity in communication. + +Think of it this way: the internet is nothing, but a bunch of permissions and a folder of data. You, the user controls the permissions and thus the data that is relevant to you. + +[b][color= grey][size=20]The Matrix is Born![/size][/color][/b] + +After asking and striving to answer a number of such questions, we realized that we were imagining a general purpose communication network with a number of unique, and potentially game-changing, features. We called it $Projectname and started thinking of it as an over-lay on top of the internet as it exists today; an operating system re-invented as a communication network, with its own permissions, access control lists, protocol, connectors to others services, and open-ended possibilities via its API. The sum of the matrix is greater than it's parts. We're not building website, but a way for websites to link together and grow into something that is unique and ever-changing, with autonomy and privacy. + +It's a lot of work, for anyone. So far, we've got a team of a handful of volunteers, code geeks, brave early adopters, system administrators and other good people, willing to give the project a shot. We're motivated by our commitment to a free web, where privacy is built-in, and corporations don't have a stranglehold on our daily communication. + +We need your help to finish it and release it to the world! + +[b][color= grey][size=20]What have we written so far[/size][/color][/b] + +As of the today, $Projectname is in developer preview (alpha) state. It is not ready for everyday use, but some of the initial set of core features are implemented (again, in alpha state). These include: + +- Zot, the protocol powering the matrix +- Single-signon logins. +- Nomadic identities +- Basic content manipulation: creation, deletion, rudimentary handling of photos, and media files +- A bare-bones outline of the API and user documentation. + + +[b][color= grey][size=20]Our TO-DO List[/size][/color][/b] + +However, in addition to finishing and polishing the above, there are a number of features that have to implemented to make $Projectname ready for daily use. If we meet our fundraising goal, we hope to dive into the following road map, by order of priority: + +- A professionally designed user interface (UI), interface that is adaptive to any user level, from end users who want to use the Matrix as a social network, to tinkerers who will put together a customized blog using Comanche, to hackers who will develop and extend the matrix using a built-in code editor, that hooks to the API and the git. + +- Comanche, our new markup language, similar to BBCode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. You can read more about it on our github wiki: https://github.com/friendica/red/wiki/Comanche + +- A unique help system that lives in the matrix, but is not based on the principles of a search engine. We have some interesting ideas about decentralizing help documentation, without going down the road of distributed search engines. Here's a hint: We shouldn't be searching at all, we should just be filtering what's already there in new, and cunning ways. + +- An appropriate logo, along with professionally done documentation system, both for our API, as well as users. + +- WordPress-like single button software upgrades + +- A built-in development environment, using an integrated web-based code editor such as Ace9 + +[b][color= grey][size=20]What will the money be used for[/size][/color][/b] + +If we raise our targeted amount of funds, we plan to use it as follows: + +1) Fund 6 months {OR WHATEVER} of full time work for our current core developers, Mike, Thomas, and Tobias {ANYONE ELSE?] + +2) Pay a professional web developer to design an kick ass reference theme, along with a project logo. + +3) {WHAT ELSE?} + +[b][color= grey][size=20]Deadlines[/size][/color][/b] + +[b]March, 2014: $Projectname Beta with the following features[/b] + +- {LIST FEATURES} + +[b][color= grey][size=20]Who We Are[/size][/color][/b] + +Mike: {FILL IN BIO, reference Friendica, etc.} + +Thomas: {bio blurb} + +Tobias: {bio blurb} + +Arto: {documentation, etc.} + +{WHO ELSE? WE NEED A TEAM, AT LEAST 3-4 PEOPLE} + +[b][color= grey][size=20]What Do I Get as a Supporter?[/size][/color][/b] + +Our ability to reach 1.0 stable release depends on your generosity and support. We appreciate your help, regardless of the amount! Here's what we're thinking as far as different contribution levels go: + +[b]$1: {CATCHY TAGLINE}[/b] + +We'll list your name on our initial supporters list, a Hall of Fame of the matrix! + +[b]$5:[/b] + +[b]$10: [/b] + +[b]$16: [/b] + +You get one of your $Projectname t-shirts, as well as our undying gratitude. + +[b]$32: [/b] + +[b]$64 [/b] + +[b]128 [/b] + +[b]$256: [/b] + +[b]$512: [/b] + +[b]$1024 [/b] + +[b]$2048[/b] + +Each contributor at this level gets their own $Projectname virtual private server, installed, hosted and supported by us for a period of 1 year. + +[b][color= grey][size=20]Why are we so excited about $Projectname?[/size][/color][/b] + +{SOMETHING ABOUT THE POTENTIAL IMPACT OF RED, ITS INNOVATIONS, ETC> + +[b][color= grey][size=20]Other Ways to Help[/size][/color][/b] + +We're a handful of volunteers, and we understand that not everyone can contribute by donating money. There are many other ways you can in getting the Matrix to version 1.0! + +First, you can checkout our source code on github: https://framagit.org/hubzilla/core/ + +Maybe you can dive in and help us out with some development. + +Second, you can install the current developer preview on a server and start compiling bug reports. + +Third, register at one of the public alpha Red hubs, and get a feel for what Red is trying to do! + +Perhaps you're good at writing and documenting stuff. Grab an account at one of the public alphas and give us a hand. + +[b][color= grey][size=20]Frequently Asked Questions[/size][/color][/b] + +[b]1. Is Red a social network?[/b] + +$Projectname is not a social network. We're thinking of it as a general purpose communication network, with sharing, and public/private communications built into the matrix. + +[b]2. What is the difference between Red and Friendica?[/b] + +What's the difference between a passport, and a postcard? + +Friendica is really, really good at sending postcards. It can do all sorts of things with postcards. It can send them to your friends. It can send them to people you don't know. It can put them in an envelope and send them privately. It can run them through a photocopier and plaster them all over the internet. It can even take postcards in one language and convert them to many others so your friends who speak a different language can read them. + +What Friendica can't do, is wave a postcard at somebody and expect them to believe that holding this postcard prove you are who you say you are. Sure, if you've been sending somebody postcards, they might accept that it is you in the picture, but somebody who has never heard of you will not accept ownership of a postcard as proof of identity. + +$Projectname offers a passport. + +You can still use it to send postcards. At the same time, when you wave your passport at somebody, they do accept it as proof of identity. No longer do you need to register at every single site you use. You already have an account - it's just not necessarily at our site - so we'll ask to see your passport instead. + +Once you've proven your identity, a Red hub lets you use our services, as though you'd registered with directly, and we'd verified your credentials as would have happened in the olden days. These resources can, of course, be anything at all. + +[b]2. Why did you choose PHP, instead of Ruby or Python?[/b] + +The reference implementation is in PHP. We chose PHP, because it is available everywhere, and is easily configurable. We understand the debates between proponents and opponents of PHP, Ruby and Python. Nothing prevents implementations of Zot and the matrix in those languages. In fact, people on the matrix have already started developing a version of Red in Python [SOURCE?], and there is talk about future implementations in C (aiming for blazing native performance) and Java. It's free and open source, so we feel it's only a matter of time, once Red is initially completed. + +[b]4. Other than PHP, what other technology does Red use?[/b] + +We use MySQL as our database (this include any forks such as, MariaDB or Percona), and any modern webserver (Apache, nginx, etc.). + +[b]5. How is the Affinity Slider different from Mozilla's Persona?[/b] +{COMPLETE} + +[b]6. Does $Projectname use encryption? Details please![/b] + +Yes, we do our best to use free and open source encryption libraries to help achieve privacy from general, mass surveillance. + +Communication between web browsers and Red hubs is encrypted using SSL certificates. + +Private communication on the matrix is protected by AES symmetric encryption, which is itself protected by RSA PKI (public key encryption). By default, we use AES-256-CBC, and our RSA keys are set to 4096-bits. + +For more info on our initial implementation of encrypted communication, check out our source code at Github: https://github.com/friendica/red/blob/master/include/crypto.php + +[b]7. What do you mean by decentralization? [/b] + + +[b]8. Can I build my own website with in $Projectname?[/b] + +Yes. The short explanation: We've got this spiffy idea we're calling "Comanche", which will allow non-programmers to build complete custom websites, and any such website will be able to connect to any other website or channel in the matrix. The goal of Comanche is to hide the technical complexities of communicating in the matrix, while encouraging people to use their creativity and put together their own unique presence on the matrix. + +The longer explanation: Comanche is a markup language, similar to bbcode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Description Language file (".pdl", pronounced "puddle") to create these pages. Bbcode is not a requirement; an XML PDL file could also be used. The tag delimiters would be different. Usage is the same. + +Additional information is available on our Github project wiki: https://github.com/friendica/red/wiki/Comanche + +Comanche is another one of our priorities for the next six months. + +[b]9. Where can I see some technical description of Zot?[/b] + +Our github wiki contains a number of high-level and technical descriptions of Zot, Comanche, and Red in general: https://github.com/friendica/red/wiki + +[b]10. What happens if you raise more than {TARGETED NUMBER}?[/b] + +Raising more than our initial goal of funds, will speed up our development efforts. More developers will be able to take time off from other jobs, and concentrate efforts on finishing Red. + +[b]11 Can I make a contribution via Bitcoin?[/b] + +{YES/NO} + +[b]12. I have additional Questions[/] + +Awesome. We'd be more than happy to chat. You can find us {HERE} + +#include doc/macros/main_footer.bb; + diff --git a/doc/checking_account_quota_usage.bb b/doc/checking_account_quota_usage.bb index ca7e070ad..7612d03d8 100644 --- a/doc/checking_account_quota_usage.bb +++ b/doc/checking_account_quota_usage.bb @@ -1,20 +1,20 @@ -[b]Checking your account quota usage (service limits usage)[/b]
-
-Your hub might implement service class limits, assigning limits to the total size of file, photo, channels, top-level posts, etc., that can be created by an account holder for a specific service level.
-
-Here's how you can quickly check how much of your assigned quota you're currently using:
-
-[b]Check file storage quota levels[/b]
-Visit the following URL in your browser:
-[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer]
-[observer=0]example.com/filestorage/username[/observer]
-
-[b]Check uploaded photos storage quota levels[/b]
-[observer=1][observer.baseurl]/photos/[observer.webname][/observer]
-[observer=0]example.com/photos/username[/observer]
-
-Example:
-[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer]
-[observer=0]example.com/filestorage/username[/observer]
-
-#include doc/macros/main_footer.bb;
+[b]Checking your account quota usage (service limits usage)[/b] + +Your hub might implement service class limits, assigning limits to the total size of file, photo, channels, top-level posts, etc., that can be created by an account holder for a specific service level. + +Here's how you can quickly check how much of your assigned quota you're currently using: + +[b]Check file storage quota levels[/b] +Visit the following URL in your browser: +[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer] +[observer=0]example.com/filestorage/username[/observer] + +[b]Check uploaded photos storage quota levels[/b] +[observer=1][observer.baseurl]/photos/[observer.webname][/observer] +[observer=0]example.com/photos/username[/observer] + +Example: +[observer=1][observer.baseurl]/filestorage/[observer.webname][/observer] +[observer=0]example.com/filestorage/username[/observer] + +#include doc/macros/main_footer.bb; diff --git a/doc/comanche.bb b/doc/comanche.bb index 4b198d657..faf7e695e 100644 --- a/doc/comanche.bb +++ b/doc/comanche.bb @@ -1,261 +1,261 @@ -[b]Comanche Page Description Language[/b]
-
-Comanche is a markup language similar to bbcode with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Decription Language to create these pages.
-
-Comanche primarily chooses what content will appear in various regions of the page. The various regions have names and these names can change depending on what layout template you choose.
-
-[b]Page Templates[/b]
-Currently there are five layout templates, unless your site provides additional layouts.
-
-[code]
- [b]default[/b]
- The default template defines a "nav" region across the top, "aside" as a fixed width sidebar,
- "content" for the main content region, and "footer" for a page footer.
-
-
- [b]full[/b]
- The full template defines the same as the default template with the exception that there is no "aside" region.
-
-
- [b]choklet[/b]
- The choklet template provides a number of fluid layout styles which can be specified by flavour:
-
- (default flavour) - a two column layout similar to the "default" template, but more fluid
- bannertwo - a two column layout with a banner region, compatible with the "default" template on small displays
- three - three column layout (adds a "right_aside" region to the default template)
- edgestwo - two column layout with fixed side margins
- edgesthree - three column layout with fixed side margins
- full - three column layout with fixed side margins and adds a "header" region beneath the navigation bar
-
- [b]redable[/b] (sic)
- A template for reading longer texts full screen (so without navigation bar). Three columns: aside, content and right_aside.
- For maximum readability it is advised to only use the middle content column.
-
- [b]zen[/b]
- Gives you the freedom to do everything yourself. Just a blank page with a content region.
-
-[/code]
-
-To choose a layout template, use the 'template' tag.
-
-[code]
- [template]full[/template]
-
-[/code]
-
-To choose the "choklet" template with the "three" flavour:
-
-[code]
- [template=three]choklet[/template]
-
-[/code]
-
-The default template will be used if no other template is specified. The template can use any names it desires for content regions. You will be using 'region' tags to decide what content to place in the respective regions.
-
-Three "macros" have been defined for your use.
-[code]
- $htmlhead - replaced with the site head content.
- $nav - replaced with the site navigation bar content.
- $content - replaced with the main page content.
-
-[/code]
-
-By default, $nav is placed in the "nav" page region and $content is placed in the "content" region. You only need to use these macros if you wish to re-arrange where these items appear, either to change the order or to move them to other regions.
-
-
-To select a theme for your page, use the 'theme' tag.
-[code]
- [theme]suckerberg[/theme]
-
-[/code]
-This will select the theme named "suckerberg". By default your channel's preferred theme will be used.
-
-[code]
- [theme=passion]suckerberg[/theme]
-
-[/code]
-This will select the theme named "suckerberg" and select the "passion" schema (theme variant). Alternatively it may be possible to use a condensed theme notation for this.
-
-[code]
- [theme]suckerberg:passion[/theme]
-
-[/code]
-
-The condensed notation isn't part of Comanche itself but is recognised by $Projectname platform as a theme specifier.
-
-[b]Regions[/b]
-Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag.
-
-[code]
- [region=htmlhead]....content goes here....[/region]
- [region=aside]....content goes here....[/region]
- [region=nav]....content goes here....[/region]
- [region=content]....content goes here....[/region]
-
-[/code]
-
-[b]CSS and Javascript[/b]
-We have the possibility to include javascript and css libraries in the htmlhead region. At present we make use of jquery (js), bootstrap (css/js) and foundation (css/js).
-This will overwrite the selected themes htmlhead.
-
-[code]
- [region=htmlhead]
- [css]bootstrap[/css]
- [js]jquery[/js]
- [js]bootstrap[/js]
- [/region]
-
-[/code]
-
-[b]Menus and Blocks[/b]
-Your webpage creation tools allow you to create menus and blocks, in addition to page content. These provide a chunk of existing content to be placed in whatever regions and whatever order you specify. Each of these has a name which you define when the menu or block is created.
-
-[code]
- [menu]mymenu[/menu]
-
-[/code]
-This places the menu called "mymenu" at this location on the page, which must be inside a region.
-
-[code]
- [menu=horizontal]mymenu[/menu]
-
-[/code]
-This places the menu called "mymenu" at this location on the page, which must be inside a region. Additionally it applies the "horizontal" class to the menu. "horizontal" is defined in the redbasic theme. It may or may not be available in other themes.
-
-[code]
- [menu][var=wrap]none[/var]mymenu[/menu]
-
-[/code]
-The variable [var=wrap]none[/var] in a block removes the wrapping div element from the menu.
-
-[code]
- [block]contributors[/block]
-[/code]
-This places a block named "contributors" in this region.
-
-[code]
- [block=someclass]contributors[/block]
-
-[/code]
-This places a block named "contributors" in this region. Additionally it applies the "someclass" class to the block. This replaces the default block classes "bblock widget".
-
-[code]
- [block][var=wrap]none[/var]contributors[/block]
-
-[/code]
-The variable [var=wrap]none[/var] in a block removes the wrapping div element from the block.
-
-[b]Widgets[/b]
-Widgets are executable apps provided by the system which you can place on your page. Some widgets take arguments which allows you to tailor the widget to your purpose. (TODO: list available widgets and arguments). The base system provides
-
-[code]
- profile - widget which duplicates the profile sidebar of your channel page. This widget takes no arguments
- tagcloud - provides a tag cloud of categories
- count - maximum number of category tags to list
-
-[/code]
-
-Widgets and arguments are specified with the 'widget' and 'var' tags.
-[code]
- [widget=recent_visitors][var=count]24[/var][/widget]
-
-[/code]
-
-This loads the "recent_visitors" widget and supplies it with the argument "count" set to "24".
-
-[b]Comments[/b]
-The 'comment' tag is used to delimit comments. These comments will not appear on the rendered page.
-
-[code]
- [comment]This is a comment[/comment]
-
-[/code]
-
-[b]Conditional Execution[/b]
-You can use an 'if' construct to make decisions. These are currently based on system configuration variable or the current observer.
-
-[code]
- [if $config.system.foo]
- ... the configuration variable system.foo evaluates to 'true'.
- [else]
- ... the configuration variable system.foo evaluates to 'false'.
- [/if]
-
- [if $observer]
- ... this content will only be show to authenticated viewers
- [/if]
-
-[/code]
-
- The 'else' clause is optional.
-
- Several tests are supported besides boolean evaluation.
-
-[code]
- [if $config.system.foo == bar]
- ... the configuration variable system.foo is equal to the string 'bar'
- [/if]
- [if $config.system.foo != bar]
- ... the configuration variable system.foo is not equal to the string 'bar'
- [/if]
- [if $config.system.foo {} bar ]
- ... the configuration variable system.foo is a simple array containing a value 'bar'
- [/if]
- [if $config.system.foo {*} bar]
- ... the configuration variable system.foo is a simple array containing a key named 'bar'
- [/if]
-[/code]
-
-[b]Complex Example[/b]
-[code]
- [comment]use an existing page template which provides a banner region plus 3 columns beneath it[/comment]
-
- [template]3-column-with-header[/template]
-
- [comment]Use the "darknight" theme[/comment]
-
- [theme]darkknight[/theme]
-
- [comment]Use the existing site navigation menu[/comment]
-
- [region=nav]$nav[/region]
-
- [region=side]
-
- [comment]Use my chosen menu and a couple of widgets[/comment]
-
- [menu]myfavouritemenu[/menu]
-
- [widget=recent_visitors]
- [var=count]24[/var]
- [var=names_only]1[/var]
- [/widget]
-
- [widget=tagcloud][/widget]
- [block]donate[/block]
-
- [/region]
-
-
-
- [region=middle]
-
- [comment]Show the normal page content[/comment]
-
- $content
-
- [/region]
-
-
-
- [region=right]
-
- [comment]Show my condensed channel "wall" feed and allow interaction if the observer is allowed to interact[/comment]
-
- [widget]channel[/widget]
-
- [/region]
-
-[/code]
-
-#include doc/macros/main_footer.bb;
+[b]Comanche Page Description Language[/b] + +Comanche is a markup language similar to bbcode with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Decription Language to create these pages. + +Comanche primarily chooses what content will appear in various regions of the page. The various regions have names and these names can change depending on what layout template you choose. + +[b]Page Templates[/b] +Currently there are five layout templates, unless your site provides additional layouts. + +[code] + [b]default[/b] + The default template defines a "nav" region across the top, "aside" as a fixed width sidebar, + "content" for the main content region, and "footer" for a page footer. + + + [b]full[/b] + The full template defines the same as the default template with the exception that there is no "aside" region. + + + [b]choklet[/b] + The choklet template provides a number of fluid layout styles which can be specified by flavour: + + (default flavour) - a two column layout similar to the "default" template, but more fluid + bannertwo - a two column layout with a banner region, compatible with the "default" template on small displays + three - three column layout (adds a "right_aside" region to the default template) + edgestwo - two column layout with fixed side margins + edgesthree - three column layout with fixed side margins + full - three column layout with fixed side margins and adds a "header" region beneath the navigation bar + + [b]redable[/b] (sic) + A template for reading longer texts full screen (so without navigation bar). Three columns: aside, content and right_aside. + For maximum readability it is advised to only use the middle content column. + + [b]zen[/b] + Gives you the freedom to do everything yourself. Just a blank page with a content region. + +[/code] + +To choose a layout template, use the 'template' tag. + +[code] + [template]full[/template] + +[/code] + +To choose the "choklet" template with the "three" flavour: + +[code] + [template=three]choklet[/template] + +[/code] + +The default template will be used if no other template is specified. The template can use any names it desires for content regions. You will be using 'region' tags to decide what content to place in the respective regions. + +Three "macros" have been defined for your use. +[code] + $htmlhead - replaced with the site head content. + $nav - replaced with the site navigation bar content. + $content - replaced with the main page content. + +[/code] + +By default, $nav is placed in the "nav" page region and $content is placed in the "content" region. You only need to use these macros if you wish to re-arrange where these items appear, either to change the order or to move them to other regions. + + +To select a theme for your page, use the 'theme' tag. +[code] + [theme]suckerberg[/theme] + +[/code] +This will select the theme named "suckerberg". By default your channel's preferred theme will be used. + +[code] + [theme=passion]suckerberg[/theme] + +[/code] +This will select the theme named "suckerberg" and select the "passion" schema (theme variant). Alternatively it may be possible to use a condensed theme notation for this. + +[code] + [theme]suckerberg:passion[/theme] + +[/code] + +The condensed notation isn't part of Comanche itself but is recognised by $Projectname platform as a theme specifier. + +[b]Regions[/b] +Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag. + +[code] + [region=htmlhead]....content goes here....[/region] + [region=aside]....content goes here....[/region] + [region=nav]....content goes here....[/region] + [region=content]....content goes here....[/region] + +[/code] + +[b]CSS and Javascript[/b] +We have the possibility to include javascript and css libraries in the htmlhead region. At present we make use of jquery (js), bootstrap (css/js) and foundation (css/js). +This will overwrite the selected themes htmlhead. + +[code] + [region=htmlhead] + [css]bootstrap[/css] + [js]jquery[/js] + [js]bootstrap[/js] + [/region] + +[/code] + +[b]Menus and Blocks[/b] +Your webpage creation tools allow you to create menus and blocks, in addition to page content. These provide a chunk of existing content to be placed in whatever regions and whatever order you specify. Each of these has a name which you define when the menu or block is created. + +[code] + [menu]mymenu[/menu] + +[/code] +This places the menu called "mymenu" at this location on the page, which must be inside a region. + +[code] + [menu=horizontal]mymenu[/menu] + +[/code] +This places the menu called "mymenu" at this location on the page, which must be inside a region. Additionally it applies the "horizontal" class to the menu. "horizontal" is defined in the redbasic theme. It may or may not be available in other themes. + +[code] + [menu][var=wrap]none[/var]mymenu[/menu] + +[/code] +The variable [var=wrap]none[/var] in a block removes the wrapping div element from the menu. + +[code] + [block]contributors[/block] +[/code] +This places a block named "contributors" in this region. + +[code] + [block=someclass]contributors[/block] + +[/code] +This places a block named "contributors" in this region. Additionally it applies the "someclass" class to the block. This replaces the default block classes "bblock widget". + +[code] + [block][var=wrap]none[/var]contributors[/block] + +[/code] +The variable [var=wrap]none[/var] in a block removes the wrapping div element from the block. + +[b]Widgets[/b] +Widgets are executable apps provided by the system which you can place on your page. Some widgets take arguments which allows you to tailor the widget to your purpose. (TODO: list available widgets and arguments). The base system provides + +[code] + profile - widget which duplicates the profile sidebar of your channel page. This widget takes no arguments + tagcloud - provides a tag cloud of categories + count - maximum number of category tags to list + +[/code] + +Widgets and arguments are specified with the 'widget' and 'var' tags. +[code] + [widget=recent_visitors][var=count]24[/var][/widget] + +[/code] + +This loads the "recent_visitors" widget and supplies it with the argument "count" set to "24". + +[b]Comments[/b] +The 'comment' tag is used to delimit comments. These comments will not appear on the rendered page. + +[code] + [comment]This is a comment[/comment] + +[/code] + +[b]Conditional Execution[/b] +You can use an 'if' construct to make decisions. These are currently based on system configuration variable or the current observer. + +[code] + [if $config.system.foo] + ... the configuration variable system.foo evaluates to 'true'. + [else] + ... the configuration variable system.foo evaluates to 'false'. + [/if] + + [if $observer] + ... this content will only be show to authenticated viewers + [/if] + +[/code] + + The 'else' clause is optional. + + Several tests are supported besides boolean evaluation. + +[code] + [if $config.system.foo == bar] + ... the configuration variable system.foo is equal to the string 'bar' + [/if] + [if $config.system.foo != bar] + ... the configuration variable system.foo is not equal to the string 'bar' + [/if] + [if $config.system.foo {} bar ] + ... the configuration variable system.foo is a simple array containing a value 'bar' + [/if] + [if $config.system.foo {*} bar] + ... the configuration variable system.foo is a simple array containing a key named 'bar' + [/if] +[/code] + +[b]Complex Example[/b] +[code] + [comment]use an existing page template which provides a banner region plus 3 columns beneath it[/comment] + + [template]3-column-with-header[/template] + + [comment]Use the "darknight" theme[/comment] + + [theme]darkknight[/theme] + + [comment]Use the existing site navigation menu[/comment] + + [region=nav]$nav[/region] + + [region=side] + + [comment]Use my chosen menu and a couple of widgets[/comment] + + [menu]myfavouritemenu[/menu] + + [widget=recent_visitors] + [var=count]24[/var] + [var=names_only]1[/var] + [/widget] + + [widget=tagcloud][/widget] + [block]donate[/block] + + [/region] + + + + [region=middle] + + [comment]Show the normal page content[/comment] + + $content + + [/region] + + + + [region=right] + + [comment]Show my condensed channel "wall" feed and allow interaction if the observer is allowed to interact[/comment] + + [widget]channel[/widget] + + [/region] + +[/code] + +#include doc/macros/main_footer.bb; diff --git a/doc/dev_beginner.bb b/doc/dev_beginner.bb index 3e98c6ec3..4ac69c301 100644 --- a/doc/dev_beginner.bb +++ b/doc/dev_beginner.bb @@ -1,419 +1,419 @@ -[h2]You want to contribute code?[/h2]
-[b]...and don't know how to start to...[/b]
-[list]
-[*] debug the red#matrix (php on the webserver),
-[*] contribute code to the project,
-[*] optionally - do it all from inside a virtual machine
-[/list]
-This manual was tested for Debian (Wheezy) as virtual machine on Lubuntu (Ubuntu 14.0) as host.
-
-Content
-
-[toc]
-
-[h2]Install a Virtual Machine (KVM)[/h2]
-
-[url=https://wiki.debian.org/KVM]Here[/url] the installation guide for Linux Debian.
-The summary:
-[list=1]
-[*] install KVM
-[code]# apt-get install qemu-kvm libvirt-bin[/code]
-[*] add yourself to the group libvirt [code]# adduser <youruser> libvirt[/code]
-[*] install gui to manage virtual machines [code]# apt-get install virt-manager[/code]
-[*] download an operating system to run inside the vm ([url=http://ftp.nl.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/mini.iso]mini.iso[/url])
-[*] start the virt manager
-- create new virtual machine (click on icon)
-- choose your iso image (just downloaded) as installation source
-- optional: configure the new vm: ram, cpu's,...
-- start virtual machine > result: linux debian starts in a new window.
-[*] (optional) avoid network errors after restart of host os
-[code]# virsh net-start default
-# virsh net-autostart default[/code]
-[/list]
-
-
-[h2]Install Apache Webserver[/h2]
-
-Open a terminal and make yourself root
-[code]su -l[/code]
-
-Create the standard group for the Apache webserver
-[code]groupadd www-data[/code]
-might exist already
-
-[code]usermod -a -G www-data www-data[/code]
-
-Check if the system is really up to date
-[code]apt-get update
-apt-get upgrade[/code]
-
-Optional restart services after installation
-[code]reboot[/code]
-
-If you restarted, make yourself root
-[code]su -l[/code]
-
-Install Apache: [code]
-apt-get install apache2 apache2-doc apache2-utils[/code]
-
-Open webbrowser on PC and check [url=localhost]localhost[/url]
-Should show you a page like "It works"
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[h2]Install PHP, MySQL, phpMyAdmin[/h2]
-
-[h3]PHP, MySQL[/h3]
-
-[code]su -l
-apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl php5-mcrypt php5-xdebug
-apt-get install php5-mysql
-apt-get install mysql-server mysql-client[/code]
-enter and note the mysql passwort
-
-Optional since its already enabled during phpmyadmin setup
-[code]
-php5enmod mcrypt
-[/code]
-
-[h3]phpMyAdmin[/h3]
-
-Install php myadmin
-[code]apt-get install phpmyadmin[/code]
-
-Configuring phpmyadmin
-- Select apache2 (hint: use the tab key to select)
-- Configure database for phpmyadmin with dbconfig-common?: Choose Yes
-
-(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-[h3]Enable rewrite[/h3]
-
-The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load
-
-[code]
-root@debian /var/www $ nano /etc/apache2/mods-available/rewrite.load
-[/code]
-
- (You should find the content: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so)
-To enable and load mod_rewrite, do the rest of steps.
-Create a symbolic link in /etc/apache2/mods-enabled
-
-[code]
-cd /var/www
-root@debian /var/www $ a2enmod rewrite
-[/code]
-
-Then open up the following file, and replace every occurrence of "AllowOverride None" with "AllowOverride all".
-
-[code]
-root@debian /var/www $nano /etc/apache2/apache2.conf
-[/code]
-or
-[code]
-root@debian:/var# gedit /etc/apache2/sites-enabled/000-default
-[/code]
-
-Finally, restart Apache2.
-
-[code]
-root@debian /var/www $service apache2 restart
-[/code]
-
-[h3]Test installation[/h3]
-
-[code]cd /var/www[/code]
-
-create a php file to test the php installation[code]nano phpinfo.php[/code]
-
-Insert into the file:
-[code]
-<?php
- phpinfo();
-?>
-[/code]
-(save CTRL+0, ENTER, CTRL+X)
-
-open webbrowser on PC and try #^[url=http://localhost/phpinfo.php]http://localhost/phpinfo.php[/url] (page shows infos on php)
-
-connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf
-[/code]
-- CTRL+V... to the end of the file
-- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code]
-
-restart apache
-[code]/etc/init.d/apache2 restart
-apt-get update
-apt-get upgrade
-reboot[/code]
-
-[b]phpMyAdmin[/b]
-
-open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url]
-
-(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-[h3]Create an empty database... that is later used by the red#matrix[/h3]
-
-
-open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url]
-
-Create an empty database, for example named "red".
-Create a database user, for example "red".
-Grant all rights for the user "red" to the database "red".
-
-Note the access details (hostname, username, password, database name).
-
-
-[h2]Fork the project on github[/h2]
-
-Please follow the instruction in the offiical [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project] documentation[/url] of git.
-It is a good idea to read the whole manual! Git is different to other version control systems in many ways.
-
-Now you should
-[list]
-[*] create an account at github.com
-[*] fork https://framagit.org/hubzilla/core
-[*] fork https://framagit.org/hubzilla/addons
-[/list]
-
-If you not want to use GIT from the command line - there is a usefull Eclipse plugin named ""Eclipse Mylyn to GitHub connector".
-
-
-[h2]Install RED and its Addons[/h2]
-
-[h3]Git at your computer / vm[/h3]
-
-You should have created an account on github and forked the projects befor you procceed.
-
-Delete the directory www
-[code]root@debian:/var# rm -R www/
-[/code]
-
-Install git (and optionally git-gui a client gui)
-[code]apt-get install git git-gui[/code]
-
-[h3]Download red#matri and addons[/h3]
-
-Download the main project red and red-addons
-[code]
-root@debian:/var# git clone https://github.com/yourname/red www
-root@debian:/var# cd www/
-root@debian:/var/www# git clone https://github.com/yourname/red-addons addon
-[/code]
-
-Make this extra folder
-[code]
-root@debian:/var/www# mkdir -p "store/[data]/smarty3"
-[/code]
-
-Create .htconfig.php and make it writable by the webserver
-[code]
-root@debian:/var/www# touch .htconfig.php
-root@debian:/var/www# chmod ou+w .htconfig.php
-[/code]
-
-Make user www-data (webserver) is the owner all the project files
-[code]
-root@debian:/var/www# cd ..
-root@debian:/var# chown -R www-data:www-data www/
-[/code]
-
-Add yourself ("surfer" in this example) to the group www-data. Why? Later you want to modify files in eclipse or in another editor.
-Then make all files writable by the group www-date you are now a member of.
-[code]
-root@debian:/var# cd www/
-root@debian:/var/www# usermod -G www-data surfer
-root@debian:/var# chmod -R g+w www/
-[/code]
-
-Restart the computer (or vm)
-If you are still not able to modify the project files you can check the members of the group www-data with
-[code]
-cat /etc/group
-[/code]
-
-[h3]Register yourself as admin[/h3]
-
-Open http://localhost and init the matrix
-
-Befor you register a first user switch off the registration mails.
-Open /var/www/.htconfig.php
-and make sure "0" is set in this line
-[code]
-App::$config['system']['verify_email'] = 0;
-[/code]
-You should be able to change the file as "yourself" (instead of using root or www-data).
-
-[h3]Cron and the poller[/h3]
-
-Important!
-Run the poller to pick up the recent "public" postings of your friends
-Set up a cron job or scheduled task to run the poller once every 5-10
-minutes to pick up the recent "public" postings of your friends
-
-[code]
-crontab -e
-[/code]
-
-Add
-[code]
-*/10 * * * * cd /var/www/; /usr/bin/php include/poller.php
-[/code]
-
-If you don't know the path to PHP type
-[code]
-whereis php
-[/code]
-
-
-[h2]Debug the server via eclipse[/h2]
-
-[h3]Check the configuration of xdebug[/h3]
-
-You shoud already have installed xdebug in the steps befor
-[code]
-apt-get install php5-xdebug
-[/code]
-
-Configuring Xdebug
-
-Open your terminal and type as root (su -l)
-[code]
-gedit /etc/php5/mods-available/xdebug.ini
-[/code]
-
-if the file is empty try this location
-[code]
-gedit /etc/php5/conf.d/xdebug.ini
-[/code]
-
-That command should open the text editor gedit with the Xdebug configuration file
-At the end of the file content append the following text
-
-xdebug.remote_enable=on
-xdebug.remote_handler=dbgp
-xdebug.remote_host=localhost
-xdebug.remote_port=9000
-
-Save changes and close the editor.
-In you terminal type to restart the web server.
-[code]
-service apache2 restart
-[/code]
-
-
-[h3]Install Eclipse and start debugging[/h3]
-
-Install eclipse.
-Start eclipse with default worspace (or as you like)
-
-Install the PHP plugin
-Menu > Help > Install new software...
-Install "PHP Developnent Tools ..."
-
-Optionally - Install the GitHub connector plugin
-Menu > Help > Install new software...
-Install "Eclipse Mylyn to GitHub connector"
-
-Configure the PHP plugin
-Menu > Window > Preferences...
-> General > Webbrowser > Change to "Use external web browser"
-> PHP > Debug > Debug Settings > PHP Debugger > Change to "XDebug"
-
-Create a new PHP project
-Menu > File > New Project > Choose PHP > "PHP Project"
-> Choose Create project at existing location" and "/var/www"
-
-Start debugging
-Open index.php and "Debug as..."
-Choose as Launch URL: "http://localhost/"
-
-Expected:
-[list]
-[*] The web browser starts
-[*] The debugger will stop at the first php line
-[/list]
-
-
-[h2]Contribute your changes via github[/h2]
-
-[h3]Preparations[/h3]
-
-There is a related page in this docs: [zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl].
-As stated befor it is recommended to read the official documentation [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project]GitHub-Contributing-to-a-Project[/url] of git.
-
-Eclipse has a usefull plugin for GIT: "Eclipse Mylyn to GitHub connector".
-
-Make sure you have set your data
-[code]
-surfer@debian:/var/www$ git config --global user.name "Your Name"
-surfer@debian:/var/www$ git config --global user.email "your@mail.com"
-[/code]
-
-[h3]Your first contribution[/h3]
-
-Create a descriptive topic branch
-[code]
-surfer@debian:/var/www$ git checkout -b dev_beginning
-[/code]
-
-Make sure your local repository is up-to-date with the main project.
-Add the original repository as a remote named “upstream” if not done yet
-[code]
-surfer@debian:/var/www$ git remote add upstream https://framagit.org/hubzilla/core/
-[/code]
-
-Fetch the newest work from that remote
-[code]
-surfer@debian:/var/www$ git fetch upstream
-surfer@debian:/var/www$ git merge upstream/master
-[/code]
-
-Hint: You can list the branches
-[code]
-surfer@debian:/var/www$ git branch -v
-[/code]
-
-Make your changes. In this example it is a new doc file.
-
-Check your modifications
-[code]
-surfer@debian:/var/www$ git status
-[/code]
-
-Add (stage) the new file
-[code]
-surfer@debian:/var/www$ git add doc/dev_beginner.bb
-[/code]
-
-Commit the changes to your local branch. This will open an editor to provide a message.
-[code]
-surfer@debian:/var/www$ git commit -a
-[/code]
-
-Push back up to the same topic branch online
-[code]
-surfer@debian:/var/www$ git push
-[/code]
-
-Now you can go to your (online) account at github and create the pull request.
-
-[h3]Following contributions[/h3]
-
-In case the main devolpers want you to change something.
-Fetch the newest work from the remote upstream/master to be sure you have the latest changes.
-[code]
-surfer@debian:/var/www$ git fetch upstream
-surfer@debian:/var/www$ git merge upstream/master
-[/code]
-Make your changes, test them, commit (to local repository), push (to online repository)
-[code]
-surfer@debian:/var/www$ git status
-surfer@debian:/var/www$ git commit -a -m "added modification of branch"
-surfer@debian:/var/www$ git push
-[/code]
-
-
-#include doc/macros/main_footer.bb;
+[h2]You want to contribute code?[/h2] +[b]...and don't know how to start to...[/b] +[list] +[*] debug the red#matrix (php on the webserver), +[*] contribute code to the project, +[*] optionally - do it all from inside a virtual machine +[/list] +This manual was tested for Debian (Wheezy) as virtual machine on Lubuntu (Ubuntu 14.0) as host. + +Content + +[toc] + +[h2]Install a Virtual Machine (KVM)[/h2] + +[url=https://wiki.debian.org/KVM]Here[/url] the installation guide for Linux Debian. +The summary: +[list=1] +[*] install KVM +[code]# apt-get install qemu-kvm libvirt-bin[/code] +[*] add yourself to the group libvirt [code]# adduser <youruser> libvirt[/code] +[*] install gui to manage virtual machines [code]# apt-get install virt-manager[/code] +[*] download an operating system to run inside the vm ([url=http://ftp.nl.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/mini.iso]mini.iso[/url]) +[*] start the virt manager +- create new virtual machine (click on icon) +- choose your iso image (just downloaded) as installation source +- optional: configure the new vm: ram, cpu's,... +- start virtual machine > result: linux debian starts in a new window. +[*] (optional) avoid network errors after restart of host os +[code]# virsh net-start default +# virsh net-autostart default[/code] +[/list] + + +[h2]Install Apache Webserver[/h2] + +Open a terminal and make yourself root +[code]su -l[/code] + +Create the standard group for the Apache webserver +[code]groupadd www-data[/code] +might exist already + +[code]usermod -a -G www-data www-data[/code] + +Check if the system is really up to date +[code]apt-get update +apt-get upgrade[/code] + +Optional restart services after installation +[code]reboot[/code] + +If you restarted, make yourself root +[code]su -l[/code] + +Install Apache: [code] +apt-get install apache2 apache2-doc apache2-utils[/code] + +Open webbrowser on PC and check [url=localhost]localhost[/url] +Should show you a page like "It works" + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[h2]Install PHP, MySQL, phpMyAdmin[/h2] + +[h3]PHP, MySQL[/h3] + +[code]su -l +apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl php5-mcrypt php5-xdebug +apt-get install php5-mysql +apt-get install mysql-server mysql-client[/code] +enter and note the mysql passwort + +Optional since its already enabled during phpmyadmin setup +[code] +php5enmod mcrypt +[/code] + +[h3]phpMyAdmin[/h3] + +Install php myadmin +[code]apt-get install phpmyadmin[/code] + +Configuring phpmyadmin +- Select apache2 (hint: use the tab key to select) +- Configure database for phpmyadmin with dbconfig-common?: Choose Yes + +(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + +[h3]Enable rewrite[/h3] + +The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load + +[code] +root@debian /var/www $ nano /etc/apache2/mods-available/rewrite.load +[/code] + + (You should find the content: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so) +To enable and load mod_rewrite, do the rest of steps. +Create a symbolic link in /etc/apache2/mods-enabled + +[code] +cd /var/www +root@debian /var/www $ a2enmod rewrite +[/code] + +Then open up the following file, and replace every occurrence of "AllowOverride None" with "AllowOverride all". + +[code] +root@debian /var/www $nano /etc/apache2/apache2.conf +[/code] +or +[code] +root@debian:/var# gedit /etc/apache2/sites-enabled/000-default +[/code] + +Finally, restart Apache2. + +[code] +root@debian /var/www $service apache2 restart +[/code] + +[h3]Test installation[/h3] + +[code]cd /var/www[/code] + +create a php file to test the php installation[code]nano phpinfo.php[/code] + +Insert into the file: +[code] +<?php + phpinfo(); +?> +[/code] +(save CTRL+0, ENTER, CTRL+X) + +open webbrowser on PC and try #^[url=http://localhost/phpinfo.php]http://localhost/phpinfo.php[/url] (page shows infos on php) + +connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf +[/code] +- CTRL+V... to the end of the file +- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code] + +restart apache +[code]/etc/init.d/apache2 restart +apt-get update +apt-get upgrade +reboot[/code] + +[b]phpMyAdmin[/b] + +open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url] + +(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + +[h3]Create an empty database... that is later used by the red#matrix[/h3] + + +open webbrowser on PC and try #^[url=http://localhost/phpmyadmin]http://localhost/phpmyadmin[/url] + +Create an empty database, for example named "red". +Create a database user, for example "red". +Grant all rights for the user "red" to the database "red". + +Note the access details (hostname, username, password, database name). + + +[h2]Fork the project on github[/h2] + +Please follow the instruction in the offiical [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project] documentation[/url] of git. +It is a good idea to read the whole manual! Git is different to other version control systems in many ways. + +Now you should +[list] +[*] create an account at github.com +[*] fork https://framagit.org/hubzilla/core +[*] fork https://framagit.org/hubzilla/addons +[/list] + +If you not want to use GIT from the command line - there is a usefull Eclipse plugin named ""Eclipse Mylyn to GitHub connector". + + +[h2]Install RED and its Addons[/h2] + +[h3]Git at your computer / vm[/h3] + +You should have created an account on github and forked the projects befor you procceed. + +Delete the directory www +[code]root@debian:/var# rm -R www/ +[/code] + +Install git (and optionally git-gui a client gui) +[code]apt-get install git git-gui[/code] + +[h3]Download red#matri and addons[/h3] + +Download the main project red and red-addons +[code] +root@debian:/var# git clone https://github.com/yourname/red www +root@debian:/var# cd www/ +root@debian:/var/www# git clone https://github.com/yourname/red-addons addon +[/code] + +Make this extra folder +[code] +root@debian:/var/www# mkdir -p "store/[data]/smarty3" +[/code] + +Create .htconfig.php and make it writable by the webserver +[code] +root@debian:/var/www# touch .htconfig.php +root@debian:/var/www# chmod ou+w .htconfig.php +[/code] + +Make user www-data (webserver) is the owner all the project files +[code] +root@debian:/var/www# cd .. +root@debian:/var# chown -R www-data:www-data www/ +[/code] + +Add yourself ("surfer" in this example) to the group www-data. Why? Later you want to modify files in eclipse or in another editor. +Then make all files writable by the group www-date you are now a member of. +[code] +root@debian:/var# cd www/ +root@debian:/var/www# usermod -G www-data surfer +root@debian:/var# chmod -R g+w www/ +[/code] + +Restart the computer (or vm) +If you are still not able to modify the project files you can check the members of the group www-data with +[code] +cat /etc/group +[/code] + +[h3]Register yourself as admin[/h3] + +Open http://localhost and init the matrix + +Befor you register a first user switch off the registration mails. +Open /var/www/.htconfig.php +and make sure "0" is set in this line +[code] +App::$config['system']['verify_email'] = 0; +[/code] +You should be able to change the file as "yourself" (instead of using root or www-data). + +[h3]Cron and the poller[/h3] + +Important! +Run the poller to pick up the recent "public" postings of your friends +Set up a cron job or scheduled task to run the poller once every 5-10 +minutes to pick up the recent "public" postings of your friends + +[code] +crontab -e +[/code] + +Add +[code] +*/10 * * * * cd /var/www/; /usr/bin/php include/poller.php +[/code] + +If you don't know the path to PHP type +[code] +whereis php +[/code] + + +[h2]Debug the server via eclipse[/h2] + +[h3]Check the configuration of xdebug[/h3] + +You shoud already have installed xdebug in the steps befor +[code] +apt-get install php5-xdebug +[/code] + +Configuring Xdebug + +Open your terminal and type as root (su -l) +[code] +gedit /etc/php5/mods-available/xdebug.ini +[/code] + +if the file is empty try this location +[code] +gedit /etc/php5/conf.d/xdebug.ini +[/code] + +That command should open the text editor gedit with the Xdebug configuration file +At the end of the file content append the following text + +xdebug.remote_enable=on +xdebug.remote_handler=dbgp +xdebug.remote_host=localhost +xdebug.remote_port=9000 + +Save changes and close the editor. +In you terminal type to restart the web server. +[code] +service apache2 restart +[/code] + + +[h3]Install Eclipse and start debugging[/h3] + +Install eclipse. +Start eclipse with default worspace (or as you like) + +Install the PHP plugin +Menu > Help > Install new software... +Install "PHP Developnent Tools ..." + +Optionally - Install the GitHub connector plugin +Menu > Help > Install new software... +Install "Eclipse Mylyn to GitHub connector" + +Configure the PHP plugin +Menu > Window > Preferences... +> General > Webbrowser > Change to "Use external web browser" +> PHP > Debug > Debug Settings > PHP Debugger > Change to "XDebug" + +Create a new PHP project +Menu > File > New Project > Choose PHP > "PHP Project" +> Choose Create project at existing location" and "/var/www" + +Start debugging +Open index.php and "Debug as..." +Choose as Launch URL: "http://localhost/" + +Expected: +[list] +[*] The web browser starts +[*] The debugger will stop at the first php line +[/list] + + +[h2]Contribute your changes via github[/h2] + +[h3]Preparations[/h3] + +There is a related page in this docs: [zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl]. +As stated befor it is recommended to read the official documentation [url=http://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project]GitHub-Contributing-to-a-Project[/url] of git. + +Eclipse has a usefull plugin for GIT: "Eclipse Mylyn to GitHub connector". + +Make sure you have set your data +[code] +surfer@debian:/var/www$ git config --global user.name "Your Name" +surfer@debian:/var/www$ git config --global user.email "your@mail.com" +[/code] + +[h3]Your first contribution[/h3] + +Create a descriptive topic branch +[code] +surfer@debian:/var/www$ git checkout -b dev_beginning +[/code] + +Make sure your local repository is up-to-date with the main project. +Add the original repository as a remote named “upstream” if not done yet +[code] +surfer@debian:/var/www$ git remote add upstream https://framagit.org/hubzilla/core/ +[/code] + +Fetch the newest work from that remote +[code] +surfer@debian:/var/www$ git fetch upstream +surfer@debian:/var/www$ git merge upstream/master +[/code] + +Hint: You can list the branches +[code] +surfer@debian:/var/www$ git branch -v +[/code] + +Make your changes. In this example it is a new doc file. + +Check your modifications +[code] +surfer@debian:/var/www$ git status +[/code] + +Add (stage) the new file +[code] +surfer@debian:/var/www$ git add doc/dev_beginner.bb +[/code] + +Commit the changes to your local branch. This will open an editor to provide a message. +[code] +surfer@debian:/var/www$ git commit -a +[/code] + +Push back up to the same topic branch online +[code] +surfer@debian:/var/www$ git push +[/code] + +Now you can go to your (online) account at github and create the pull request. + +[h3]Following contributions[/h3] + +In case the main devolpers want you to change something. +Fetch the newest work from the remote upstream/master to be sure you have the latest changes. +[code] +surfer@debian:/var/www$ git fetch upstream +surfer@debian:/var/www$ git merge upstream/master +[/code] +Make your changes, test them, commit (to local repository), push (to online repository) +[code] +surfer@debian:/var/www$ git status +surfer@debian:/var/www$ git commit -a -m "added modification of branch" +surfer@debian:/var/www$ git push +[/code] + + +#include doc/macros/main_footer.bb; diff --git a/doc/developer_function_primer.bb b/doc/developer_function_primer.bb index 183581361..48af9523d 100644 --- a/doc/developer_function_primer.bb +++ b/doc/developer_function_primer.bb @@ -1,43 +1,43 @@ -[b]$Projectname development - some useful basic functions[/b]
-
-[b]get_account_id()[/b]
-
-Returns numeric account_id if authenticated or 0. It is possible to be authenticated and not connected to a channel.
-
-[b]local_channel()[/b]
-
-Returns authenticated numeric channel_id if authenticated and connected to a channel or 0. Sometimes referred to as $uid in the code.
-
-[b]remote_channel()[/b]
-
-Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string.
-
-[b]App::get_observer()[/b]
-
-returns an xchan structure representing the current viewer if authenticated (locally or remotely).
-
-[b]get_config($family,$key), get_pconfig($uid,$family,$key), get_xconfig($xchan_hash,$family,$key)[/b]
-
-Returns the config setting for $family and $key or false if unset.
-
-[b] set_config($family,$key,$value), set_pconfig($uid,$family,$key,$value)[/b]
-
-Sets the value of config setting for $family and $key to $value. Returns $value. The config versions operate on system-wide settings. The pconfig versions get/set the values for a specific integer uid (channel_id). The xconfig version get/sets the value for a specific xchan hash - generally used for remote users.
-
-[b]dbesc()[/b]
-
-Always escape strings being used in DB queries. This function returns the escaped string. Integer DB parameters should all be proven integers by wrapping with intval()
-
-[b]q($sql,$var1...)[/b]
-
-Perform a DB query with the SQL statement $sql. printf style arguments %s and %d are replaced with variable arguments, which should each be appropriately dbesc() or intval(). SELECT queries return an array of results or false if SQL or DB error. Other queries return true if the command was successful or false if it wasn't.
-
-[b]t($string)[/b]
-
-Returns the translated variant of $string for the current language or $string (default 'en' language) if the language is unrecognised or a translated version of the string does not exist.
-
-[b]x($var), $x($array,$key)[/b]
-
-Shorthand test to see if variable $var is set and is not empty. Tests vary by type. Returns false if $var or $key is not set. If variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. -- e.g. x('') or x(0) returns 0;
-
-#include doc/macros/main_footer.bb;
+[b]$Projectname development - some useful basic functions[/b] + +[b]get_account_id()[/b] + +Returns numeric account_id if authenticated or 0. It is possible to be authenticated and not connected to a channel. + +[b]local_channel()[/b] + +Returns authenticated numeric channel_id if authenticated and connected to a channel or 0. Sometimes referred to as $uid in the code. + +[b]remote_channel()[/b] + +Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string. + +[b]App::get_observer()[/b] + +returns an xchan structure representing the current viewer if authenticated (locally or remotely). + +[b]get_config($family,$key), get_pconfig($uid,$family,$key), get_xconfig($xchan_hash,$family,$key)[/b] + +Returns the config setting for $family and $key or false if unset. + +[b] set_config($family,$key,$value), set_pconfig($uid,$family,$key,$value)[/b] + +Sets the value of config setting for $family and $key to $value. Returns $value. The config versions operate on system-wide settings. The pconfig versions get/set the values for a specific integer uid (channel_id). The xconfig version get/sets the value for a specific xchan hash - generally used for remote users. + +[b]dbesc()[/b] + +Always escape strings being used in DB queries. This function returns the escaped string. Integer DB parameters should all be proven integers by wrapping with intval() + +[b]q($sql,$var1...)[/b] + +Perform a DB query with the SQL statement $sql. printf style arguments %s and %d are replaced with variable arguments, which should each be appropriately dbesc() or intval(). SELECT queries return an array of results or false if SQL or DB error. Other queries return true if the command was successful or false if it wasn't. + +[b]t($string)[/b] + +Returns the translated variant of $string for the current language or $string (default 'en' language) if the language is unrecognised or a translated version of the string does not exist. + +[b]x($var), $x($array,$key)[/b] + +Shorthand test to see if variable $var is set and is not empty. Tests vary by type. Returns false if $var or $key is not set. If variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. -- e.g. x('') or x(0) returns 0; + +#include doc/macros/main_footer.bb; @@ -1 +1 @@ -doc/es-es
\ No newline at end of file +es-es
\ No newline at end of file diff --git a/doc/es-es/git_for_non_developers.bb b/doc/es-es/git_for_non_developers.bb index 2599c2f7c..904826f94 100644 --- a/doc/es-es/git_for_non_developers.bb +++ b/doc/es-es/git_for_non_developers.bb @@ -1,78 +1,78 @@ -[b]Git para no desarrolladores[/b]
-
-Así que está manejando una traducción, o está contribuyendo a un tema, y cada vez que hace un pull request tiene que hablar con uno de los desarrolladores antes de que sus cambios puedan ser fusionados?
-
-Lo más probable es que no haya encontrado una forma rápida de explicar cómo mantener las cosas sincronizadas en su lado. Es realmente muy fácil.
-
-Después de crear un fork del repositorio (sólo tiene que hacer clic en "fork" en github), necesita clonar su propia copia.
-
-Por ejemplo, asumiremos que está trabajando en un tema llamado redexample (que no existe).
-
-[code]git clone https://github.com/username/red.git[/code]
-
-Así que está manejando una traducción, o está contribuyendo a un tema, y cada vez que hace un pull request tiene que hablar con uno de los desarrolladores antes de que sus cambios puedan ser fusionados?
-
-Lo más probable es que no haya encontrado una forma rápida de explicar cómo mantener las cosas sincronizadas en su lado. Es realmente muy fácil.
-
-Después de crear un fork del repositorio (sólo tiene que hacer clic en "fork" en github), necesita clonar su propia copia.
-
-Por ejemplo, asumiremos que está trabajando en un tema llamado redexample (que no existe).
-
-Una vez que lo haya hecho, cd en el directorio, y añadir un upstream.
-
-[code]
-cd red
-git remote add upstream https://framagit.org/hubzilla/core/
-[/code]
-
-A partir de ahora, puede realizar cambios en el upstream con el comando
-[code]git fetch upstream[/code]
-
-Antes de que sus cambios puedan fusionarse automáticamente, a menudo necesitará fusionar los cambios anteriores.
-
-[code]
-git merge upstream/master
-[/code]
-
-Siempre debe fusionar upstream antes de subir cualquier cambio, y [i]debe[/i] fusionar upstream con cualquier pull request para que se fusionen automáticamente.
-
-El 99% de las veces, todo irá bien. La única vez que no lo hará es si alguien más ha estado editando los mismos ficheros que usted y, a menudo, sólo si ha estado editando las mismas líneas de los mismos archivos. Si eso sucede, ese sería un buen momento para solicitar ayuda hasta que se acostumbre a manejar sus propios conflictos de fusión.
-
-Entonces sólo necesitas añadir tus cambios [code]git añadir vista/tema/redexample/[/code]
-
-Esto agregará todos los archivos en la vista/tema/redexample y cualquier subdirectorio. Si sus archivos particulares se mezclan a través del código, usted debe agregar uno a la vez. Trata de no hacer git add -a, ya que esto lo agregará todo, incluyendo archivos temporales (mayormente, pero no siempre atrapamos a aquellos con un.gitignore) y cualquier cambio local que tenga, pero que no intente confirmar.
-
-Una vez que haya agregado todos los archivos que ha cambiado, necesita confirmarlos. [code]git commit[/code]
-
-Esto abrirá un editor donde podrá describir los cambios que ha realizado. Guarde este archivo y salga del editor.
-
-Finalmente, suba los cambios en su propio git
-[code]git push[/code]
-
-Y eso es todo, su repo está al día!
-
-Todo lo que necesita hacer ahora es crear la petición pull. Hay dos maneras de hacerlo.
-
-La forma más fácil, si está utilizando Github, es simplemente hacer clic en el botón verde en la parte superior de su propia copia del repositorio, introducir una descripción de los cambios, y hacer clic en `crear pull request'. El repositorio principal, los temas y los complementos tienen su rama principal en Github, por lo que este método se puede utilizar la mayor parte del tiempo.
-
-La mayoría de la gente puede parar aquí.
-
-Algunos proyectos en la ecosfera extendida de RedMatrix no tienen presencia en Github, para un pull request, los pasos son un poco diferentes: usted tendrá que crear su pull request manualmente. Afortunadamente, esto no es
-mucho más difícil.
-
-[code]git request-pull -p <start> <url>[/code]
-
-Start es el nombre de un commit por el que empezar. Esto debe existir en el upstream. Normalmente, sólo querr'a la rama master.
-
-URL es la URL de[i]su[/i] repo.
-
-También se puede especificar <end>. Este valor predeterminado es HEAD.
-
-Ejemplo:
-[código]
-git request-pull master https://ejemplo.com/proyecto
-[/código]
-
-Y simplemente envíe la salida al mantenedor del proyecto.
-
-#include doc/macros/main_footer.bb;
+[b]Git para no desarrolladores[/b] + +Así que está manejando una traducción, o está contribuyendo a un tema, y cada vez que hace un pull request tiene que hablar con uno de los desarrolladores antes de que sus cambios puedan ser fusionados? + +Lo más probable es que no haya encontrado una forma rápida de explicar cómo mantener las cosas sincronizadas en su lado. Es realmente muy fácil. + +Después de crear un fork del repositorio (sólo tiene que hacer clic en "fork" en github), necesita clonar su propia copia. + +Por ejemplo, asumiremos que está trabajando en un tema llamado redexample (que no existe). + +[code]git clone https://github.com/username/red.git[/code] + +Así que está manejando una traducción, o está contribuyendo a un tema, y cada vez que hace un pull request tiene que hablar con uno de los desarrolladores antes de que sus cambios puedan ser fusionados? + +Lo más probable es que no haya encontrado una forma rápida de explicar cómo mantener las cosas sincronizadas en su lado. Es realmente muy fácil. + +Después de crear un fork del repositorio (sólo tiene que hacer clic en "fork" en github), necesita clonar su propia copia. + +Por ejemplo, asumiremos que está trabajando en un tema llamado redexample (que no existe). + +Una vez que lo haya hecho, cd en el directorio, y añadir un upstream. + +[code] +cd red +git remote add upstream https://framagit.org/hubzilla/core/ +[/code] + +A partir de ahora, puede realizar cambios en el upstream con el comando +[code]git fetch upstream[/code] + +Antes de que sus cambios puedan fusionarse automáticamente, a menudo necesitará fusionar los cambios anteriores. + +[code] +git merge upstream/master +[/code] + +Siempre debe fusionar upstream antes de subir cualquier cambio, y [i]debe[/i] fusionar upstream con cualquier pull request para que se fusionen automáticamente. + +El 99% de las veces, todo irá bien. La única vez que no lo hará es si alguien más ha estado editando los mismos ficheros que usted y, a menudo, sólo si ha estado editando las mismas líneas de los mismos archivos. Si eso sucede, ese sería un buen momento para solicitar ayuda hasta que se acostumbre a manejar sus propios conflictos de fusión. + +Entonces sólo necesitas añadir tus cambios [code]git añadir vista/tema/redexample/[/code] + +Esto agregará todos los archivos en la vista/tema/redexample y cualquier subdirectorio. Si sus archivos particulares se mezclan a través del código, usted debe agregar uno a la vez. Trata de no hacer git add -a, ya que esto lo agregará todo, incluyendo archivos temporales (mayormente, pero no siempre atrapamos a aquellos con un.gitignore) y cualquier cambio local que tenga, pero que no intente confirmar. + +Una vez que haya agregado todos los archivos que ha cambiado, necesita confirmarlos. [code]git commit[/code] + +Esto abrirá un editor donde podrá describir los cambios que ha realizado. Guarde este archivo y salga del editor. + +Finalmente, suba los cambios en su propio git +[code]git push[/code] + +Y eso es todo, su repo está al día! + +Todo lo que necesita hacer ahora es crear la petición pull. Hay dos maneras de hacerlo. + +La forma más fácil, si está utilizando Github, es simplemente hacer clic en el botón verde en la parte superior de su propia copia del repositorio, introducir una descripción de los cambios, y hacer clic en `crear pull request'. El repositorio principal, los temas y los complementos tienen su rama principal en Github, por lo que este método se puede utilizar la mayor parte del tiempo. + +La mayoría de la gente puede parar aquí. + +Algunos proyectos en la ecosfera extendida de RedMatrix no tienen presencia en Github, para un pull request, los pasos son un poco diferentes: usted tendrá que crear su pull request manualmente. Afortunadamente, esto no es +mucho más difícil. + +[code]git request-pull -p <start> <url>[/code] + +Start es el nombre de un commit por el que empezar. Esto debe existir en el upstream. Normalmente, sólo querr'a la rama master. + +URL es la URL de[i]su[/i] repo. + +También se puede especificar <end>. Este valor predeterminado es HEAD. + +Ejemplo: +[código] +git request-pull master https://ejemplo.com/proyecto +[/código] + +Y simplemente envíe la salida al mantenedor del proyecto. + +#include doc/macros/main_footer.bb; diff --git a/doc/external-resource-links.bb b/doc/external-resource-links.bb index a679e9381..338db8023 100644 --- a/doc/external-resource-links.bb +++ b/doc/external-resource-links.bb @@ -1,21 +1,21 @@ -[h2]External resource links[/h2]
-[h3]Third-Party Themes[/h3]
-[ul]
-[*][url=https://github.com/omigeot/redstrap3]Redstrap[/url]
-[*][url=https://bitbucket.org/tobiasd/red-clean]Clean[/url]
-[*][url=https://github.com/tonybaldwin/redmatrixthemes/]nubasic[/url]
-[*][url=https://github.com/deadsuperhero/redmatrix-themes]Sean Tilley's themes[/url]
-[/ul]
-[h3]Third-Party addons[/h3]
-[ul]
-[*][url=https://abcentric.net/git/abcjsplugin.git]ABCjs integration - display scores in posts (WIP)[/url]
-[/ul]
-[h3]Related projects[/h3]
-[ul]
-[*][url=https://addons.mozilla.org/en-US/firefox/addon/redshare/]Redshare for Firefox[/url]
-[*][url=https://github.com/cvogeley/red-for-android]Red for Android[/url]
-[*][url=https://github.com/zzottel/feed2red]feed2red.pl (posts Atom/RSS feeds to channel)[/url]
-[*][url=https://wordpress.org/plugins/hubzilla-wp/]WordPress gateway (combine with wppost addon for full features)[/url]
-[/ul]
-
-#include doc/macros/main_footer.bb;
+[h2]External resource links[/h2] +[h3]Third-Party Themes[/h3] +[ul] +[*][url=https://github.com/omigeot/redstrap3]Redstrap[/url] +[*][url=https://bitbucket.org/tobiasd/red-clean]Clean[/url] +[*][url=https://github.com/tonybaldwin/redmatrixthemes/]nubasic[/url] +[*][url=https://github.com/deadsuperhero/redmatrix-themes]Sean Tilley's themes[/url] +[/ul] +[h3]Third-Party addons[/h3] +[ul] +[*][url=https://abcentric.net/git/abcjsplugin.git]ABCjs integration - display scores in posts (WIP)[/url] +[/ul] +[h3]Related projects[/h3] +[ul] +[*][url=https://addons.mozilla.org/en-US/firefox/addon/redshare/]Redshare for Firefox[/url] +[*][url=https://github.com/cvogeley/red-for-android]Red for Android[/url] +[*][url=https://github.com/zzottel/feed2red]feed2red.pl (posts Atom/RSS feeds to channel)[/url] +[*][url=https://wordpress.org/plugins/hubzilla-wp/]WordPress gateway (combine with wppost addon for full features)[/url] +[/ul] + +#include doc/macros/main_footer.bb; diff --git a/doc/extra_features.bb b/doc/extra_features.bb index 0044a06a7..17d85228e 100644 --- a/doc/extra_features.bb +++ b/doc/extra_features.bb @@ -1,98 +1,98 @@ -// multiple of these have been enabled by default. should we note this here somewhere, move it or remove them from this file?
-[b]Features[/b]
-
-The default interface of $Projectname was designed to be uncluttered. There are a huge number of extra features (some of which are extremely useful) which you can turn on and get the most of the application. These are found under the Extra Features link of your Settings page.
-
-[b]Content Expiration[/b]
-
-Remove posts/comments and/or private messages at a future time. An extra button is added to the post editor which asks you for an expiration. Typically this in "yyyy-mm-dd hh:mm" format, but in the English language you have a bit more freedom and can use most any recognisable date reference such as "next Thursday" or "+1 day". At the specified time (give or take approximately ten minutes based on the remote system's checking frequency) the post is removed.
-
-[b]Multiple Profiles[/b]
-
-The ability to create multiple profiles which are visible only to specific persons or groups. Your default profile may be visible to anybody, but secondary profiles can all contain different or additional information and can only be seen by those to whom that profile is assigned.
-
-[b]Web Pages[/b]
-
-Provides the ability to use web page design feaures and create custom webpages from your own content and also to design the pages with page layouts, custom menus, and content blocks.
-
-[b]Private Notes[/b]
-
-On pages where it is available (your matrix page and personal web pages) provide a "widget" to create and store personal reminders and notes.
-
-[b]Extended Identity Sharing[/b]
-
-By default your identity travels with you as you browse the matrix to remote sites - and they know who you are and can show you content that only you can see. With Extended Identity Sharing you can provide this information to any website you visit from within the matrix.
-
-[b]Expert Mode[/b]
-
-This allows you to see some advanced configuration options that would confuse some people or cause support issues. In particular this can give you full control over theme features and colours - so that you can tweak a large number of settings of the display theme to your liking.
-
-[b]Premium Channel[/b]
-
-This allows you to set restrictions and terms on those that connect with your channel. This may be used by celebrities or anybody else who wishes to describe their channel to people who wish to connect with it. In certain cases you may be asked for payment in order to connect.
-
-[b]Post Preview[/b]
-
-Allows previewing posts and comments exactly as they would look on the page before publishing them.
-
-[b]Channel Sources[/b]
-
-Automatically import and re-publish channel content from other channels or feeds. This allows you to create sub-channels and super-channels from content provided elsewhere. The rules are that the content must be public, and the channel owner must give you permission to source their channel.
-
-[b]Even More Encryption[/b]
-
-Private messages are encrypted during transport and storage. In this day and age, this encyption may not be enough if your communications are extremely sensitive. This options lets you provide optional encryption of content "end-to-end" with a shared secret key. How the recipient learns the secret key is completely up to you. You can provide a hint such as "the name of aunt Claire's first dog".
-
-[b]Search by Date[/b]
-
-This provides the ability to select posts by date ranges
-
-[b]Privacy Group Filter[/b]
-
-Enable widget to display stream posts only from selected privacy groups. This also toggles the outbound permissions while you are viewing a group. This is analogous to Google "circles" or Disapora "aspects".
-
-[b]Saved Searches[/b]
-
-Provides a search widget on your matrix page which can save selected search terms for re-use.
-
-[b]Personal Tab[/b]
-
-Enable tab to display only matrix posts that you've interacted with in some way, as an author or a contributor to the conversation.
-
-[b]New Tab[/b]
-
-Enables a tab to display all new matrix activity as a firehose or timeline.
-
-[b]Affinity Tool[/b]
-
-Filter matrix stream activity by the depth of your relationships
-
-[b]Edit Sent Posts[/b]
-
-Edit and correct posts and comments after sending
-
-[b]Tagging[/b]
-
-Ability to tag existing posts, including those written by others.
-
-[b]Post Categories[/b]
-
-Add categories to your channel posts
-
-[b]Saved Folders[/b]
-
-Ability to file posts under folders or tags for later recall
-
-[b]Dislike Posts[/b]
-
-Ability to dislike posts/comments
-
-[b]Star Posts[/b]
-
-Ability to mark special posts with a star indicator
-
-[b]Tag Cloud[/b]
-
-Provide a personal tag cloud on your channel page
-
-#include doc/macros/main_footer.bb;
+// multiple of these have been enabled by default. should we note this here somewhere, move it or remove them from this file? +[b]Features[/b] + +The default interface of $Projectname was designed to be uncluttered. There are a huge number of extra features (some of which are extremely useful) which you can turn on and get the most of the application. These are found under the Extra Features link of your Settings page. + +[b]Content Expiration[/b] + +Remove posts/comments and/or private messages at a future time. An extra button is added to the post editor which asks you for an expiration. Typically this in "yyyy-mm-dd hh:mm" format, but in the English language you have a bit more freedom and can use most any recognisable date reference such as "next Thursday" or "+1 day". At the specified time (give or take approximately ten minutes based on the remote system's checking frequency) the post is removed. + +[b]Multiple Profiles[/b] + +The ability to create multiple profiles which are visible only to specific persons or groups. Your default profile may be visible to anybody, but secondary profiles can all contain different or additional information and can only be seen by those to whom that profile is assigned. + +[b]Web Pages[/b] + +Provides the ability to use web page design feaures and create custom webpages from your own content and also to design the pages with page layouts, custom menus, and content blocks. + +[b]Private Notes[/b] + +On pages where it is available (your matrix page and personal web pages) provide a "widget" to create and store personal reminders and notes. + +[b]Extended Identity Sharing[/b] + +By default your identity travels with you as you browse the matrix to remote sites - and they know who you are and can show you content that only you can see. With Extended Identity Sharing you can provide this information to any website you visit from within the matrix. + +[b]Expert Mode[/b] + +This allows you to see some advanced configuration options that would confuse some people or cause support issues. In particular this can give you full control over theme features and colours - so that you can tweak a large number of settings of the display theme to your liking. + +[b]Premium Channel[/b] + +This allows you to set restrictions and terms on those that connect with your channel. This may be used by celebrities or anybody else who wishes to describe their channel to people who wish to connect with it. In certain cases you may be asked for payment in order to connect. + +[b]Post Preview[/b] + +Allows previewing posts and comments exactly as they would look on the page before publishing them. + +[b]Channel Sources[/b] + +Automatically import and re-publish channel content from other channels or feeds. This allows you to create sub-channels and super-channels from content provided elsewhere. The rules are that the content must be public, and the channel owner must give you permission to source their channel. + +[b]Even More Encryption[/b] + +Private messages are encrypted during transport and storage. In this day and age, this encyption may not be enough if your communications are extremely sensitive. This options lets you provide optional encryption of content "end-to-end" with a shared secret key. How the recipient learns the secret key is completely up to you. You can provide a hint such as "the name of aunt Claire's first dog". + +[b]Search by Date[/b] + +This provides the ability to select posts by date ranges + +[b]Privacy Group Filter[/b] + +Enable widget to display stream posts only from selected privacy groups. This also toggles the outbound permissions while you are viewing a group. This is analogous to Google "circles" or Disapora "aspects". + +[b]Saved Searches[/b] + +Provides a search widget on your matrix page which can save selected search terms for re-use. + +[b]Personal Tab[/b] + +Enable tab to display only matrix posts that you've interacted with in some way, as an author or a contributor to the conversation. + +[b]New Tab[/b] + +Enables a tab to display all new matrix activity as a firehose or timeline. + +[b]Affinity Tool[/b] + +Filter matrix stream activity by the depth of your relationships + +[b]Edit Sent Posts[/b] + +Edit and correct posts and comments after sending + +[b]Tagging[/b] + +Ability to tag existing posts, including those written by others. + +[b]Post Categories[/b] + +Add categories to your channel posts + +[b]Saved Folders[/b] + +Ability to file posts under folders or tags for later recall + +[b]Dislike Posts[/b] + +Ability to dislike posts/comments + +[b]Star Posts[/b] + +Ability to mark special posts with a star indicator + +[b]Tag Cloud[/b] + +Provide a personal tag cloud on your channel page + +#include doc/macros/main_footer.bb; diff --git a/doc/git_for_non_developers.bb b/doc/git_for_non_developers.bb index 54d34fdf5..5fba17439 100644 --- a/doc/git_for_non_developers.bb +++ b/doc/git_for_non_developers.bb @@ -1,71 +1,71 @@ -[b]Git For Non-Developers[/b]
-
-So you're handling a translation, or you're contributing to a theme, and every time you make a pull request you have to talk to one of the developers before your changes can be merged in?
-
-Chances are, you just haven't found a quick how-to explaining how to keep things in sync on your end. It's really very easy.
-
-After you've created a fork of the repo (just click "fork" at github), you need to clone your own copy.
-
-For the sake of examples, we'll assume you're working on a theme called redexample (which does not exist).
-
-[code]git clone https://github.com/username/red.git[/code]
-
-Once you've done that, cd into the directory, and add an upstream.
-
-[code]
-cd red
-git remote add upstream https://framagit.org/hubzilla/core/
-[/code]
-
-From now on, you can pull upstream changes with the command
-[code]git fetch upstream[/code]
-
-Before your changes can be merged automatically, you will often need to merge upstream changes.
-
-[code]
-git merge upstream/master
-[/code]
-
-You should always merge upstream before pushing any changes, and [i]must[/i] merge upstream with any pull requests to make them automatically mergeable.
-
-99% of the time, this will all go well. The only time it won't is if somebody else has been editing the same files as you - and often, only if they have been editing the same lines of the same files. If that happens, that would be a good time to request help until you get the hang of handling your own merge conflicts.
-
-Then you just need to add your changes [code]git add view/theme/redexample/[/code]
-
-This will add all the files in view/theme/redexample and any subdirectories. If your particular files are mixed throughout the code, you should add one at a time. Try not to do git add -a, as this will add everything, including temporary files (we mostly, but not always catch those with a .gitignore) and any local changes you have, but did not intend to commit.
-
-Once you have added all the files you have changed, you need to commit them. [code]git commit[/code]
-
-This will open up an editor where you can describe the changes you have made. Save this file, and exit the editor.
-
-Finally, push the changes to your own git
-[code]git push[/code]
-
-And that's it, your repo is up to date!
-
-All you need to do now is actually create the pull request. There are two ways to do this.
-
-The easy way, if you're using Github is to simply click the green button at the top of your own copy of the repository, enter a description of the changes, and click 'create pull request'. The
-main repository, themes, and addons all have their main branch at Github, so this method can be used most of the time.
-
-Most people can stop here.
-
-Some projects in the extended RedMatrix ecosphere have no Github presence, to pull request these is a bit different - you'll have to create your pull request manually. Fortunately, this isn't
-much harder.
-
-[code]git request-pull -p <start> <url>[/code]
-
-Start is the name of a commit to start at. This must exist upstream. Normally, you just want master.
-
-URL is the URL of [i]your[/i] repo.
-
-One can also specify <end>. This defaults to HEAD.
-
-Example:
-[code]
-git request-pull master https://example.com/project
-[/code]
-
-And simply send the output to the project maintainer.
-
-#include doc/macros/main_footer.bb;
+[b]Git For Non-Developers[/b] + +So you're handling a translation, or you're contributing to a theme, and every time you make a pull request you have to talk to one of the developers before your changes can be merged in? + +Chances are, you just haven't found a quick how-to explaining how to keep things in sync on your end. It's really very easy. + +After you've created a fork of the repo (just click "fork" at github), you need to clone your own copy. + +For the sake of examples, we'll assume you're working on a theme called redexample (which does not exist). + +[code]git clone https://github.com/username/red.git[/code] + +Once you've done that, cd into the directory, and add an upstream. + +[code] +cd red +git remote add upstream https://framagit.org/hubzilla/core/ +[/code] + +From now on, you can pull upstream changes with the command +[code]git fetch upstream[/code] + +Before your changes can be merged automatically, you will often need to merge upstream changes. + +[code] +git merge upstream/master +[/code] + +You should always merge upstream before pushing any changes, and [i]must[/i] merge upstream with any pull requests to make them automatically mergeable. + +99% of the time, this will all go well. The only time it won't is if somebody else has been editing the same files as you - and often, only if they have been editing the same lines of the same files. If that happens, that would be a good time to request help until you get the hang of handling your own merge conflicts. + +Then you just need to add your changes [code]git add view/theme/redexample/[/code] + +This will add all the files in view/theme/redexample and any subdirectories. If your particular files are mixed throughout the code, you should add one at a time. Try not to do git add -a, as this will add everything, including temporary files (we mostly, but not always catch those with a .gitignore) and any local changes you have, but did not intend to commit. + +Once you have added all the files you have changed, you need to commit them. [code]git commit[/code] + +This will open up an editor where you can describe the changes you have made. Save this file, and exit the editor. + +Finally, push the changes to your own git +[code]git push[/code] + +And that's it, your repo is up to date! + +All you need to do now is actually create the pull request. There are two ways to do this. + +The easy way, if you're using Github is to simply click the green button at the top of your own copy of the repository, enter a description of the changes, and click 'create pull request'. The +main repository, themes, and addons all have their main branch at Github, so this method can be used most of the time. + +Most people can stop here. + +Some projects in the extended RedMatrix ecosphere have no Github presence, to pull request these is a bit different - you'll have to create your pull request manually. Fortunately, this isn't +much harder. + +[code]git request-pull -p <start> <url>[/code] + +Start is the name of a commit to start at. This must exist upstream. Normally, you just want master. + +URL is the URL of [i]your[/i] repo. + +One can also specify <end>. This defaults to HEAD. + +Example: +[code] +git request-pull master https://example.com/project +[/code] + +And simply send the output to the project maintainer. + +#include doc/macros/main_footer.bb; diff --git a/doc/intro_for_developers.bb b/doc/intro_for_developers.bb index 99dd8f8f3..6ef7a4d9e 100644 --- a/doc/intro_for_developers.bb +++ b/doc/intro_for_developers.bb @@ -1,113 +1,113 @@ -[b]$Projectname Developer Guide[/b]
-
-[b]File system layout:[/b]
-
-[addon] optional addons/plugins
-
-[boot.php] Every process uses this to bootstrap the application structure
-
-[doc] Help Files
-
-[images] core required images
-
-[include] The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing
-
-[index.php] The front-end controller for web access
-
-[install] Installation and upgrade files and DB schema
-
-[library] Third party modules (must be license compatible)
-
-[mod] Controller modules based on URL pathname (e.g. #^[url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php)
-
-[mod/site/] site-specific mod overrides, excluded from git
-
-[util] translation tools, main English string database and other miscellaneous utilities
-
-[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git)
-
-[view] theming and language files
-
-[view/(css,js,img,php,tpl)] default theme files
-
-[view/(en,it,es ...)] language strings and resources
-
-[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides
-
-[b]The Database:[/b]
-
- [li]abook - contact table, replaces Friendica 'contact'[/li]
- [li]account - service provider account[/li]
- [li]addon - registered plugins[/li]
- [li]app - peronal app data[/li]
- [li]attach - file attachments[/li]
- [li]auth_codes - OAuth usage[/li]
- [li]cache - OEmbed cache[/li]
- [li]channel - replaces Friendica 'user'[/li]
- [li]chat - chat room content[/li]
- [li]chatpresence - channel presence information for chat[/li]
- [li]chatroom - data for the actual chat room[/li]
- [li]clients - OAuth usage[/li]
- [li]config - main configuration storage[/li]
- [li]conv - Diaspora private messages[/li]
- [li]event - Events[/li]
- [li]fcontact - friend suggestion stuff[/li]
- [li]ffinder - friend suggestion stuff[/li]
- [li]fserver - obsolete[/li]
- [li]fsuggest - friend suggestion stuff[/li]
- [li]groups - privacy groups[/li]
- [li]group_member - privacy groups[/li]
- [li]hook - plugin hook registry[/li]
- [li]hubloc - Red location storage, ties a location to an xchan[/li]
- [li]item - posts[/li]
- [li]item_id - other identifiers on other services for posts[/li]
- [li]likes - likes of 'things'[/li]
- [li]mail - private messages[/li]
- [li]menu - channel menu data[/li]
- [li]menu_item - items uses by channel menus[/li]
- [li]notify - notifications[/li]
- [li]notify-threads - need to factor this out and use item thread info on notifications[/li]
- [li]obj - object data for things (x has y)[/li]
- [li]outq - output queue[/li]
- [li]pconfig - personal (per channel) configuration storage[/li]
- [li]photo - photo storage[/li]
- [li]poll - data for polls[/li]
- [li]poll_elm - data for poll elements[/li]
- [li]profdef - custom profile field definitions[/li]
- [li]profext - custom profile field data[/li]
- [li]profile - channel profiles[/li]
- [li]profile_check - DFRN remote auth use, may be obsolete[/li]
- [li]register - registrations requiring admin approval[/li]
- [li]session - web session storage[/li]
- [li]shares - shared item information[/li]
- [li[sign - Diaspora signatures. To be phased out.[/li]
- [li]site - site table to find directory peers[/li]
- [li]source - channel sources data[/li]
- [li]spam - unfinished[/li]
- [li]sys_perms - extensible permissions for the sys channel[/li]
- [li]term - item taxonomy (categories, tags, etc.) table[/li]
- [li]tokens - OAuth usage[/li]
- [li]updates - directory sync updates[/li]
- [li]verify - general purpose verification structure[/li]
- [li]vote - vote data for polls[/li]
- [li]xchan - replaces 'gcontact', list of known channels in the universe[/li]
- [li]xchat - bookmarked chat rooms[/li]
- [li]xconfig - as pconfig but for channels with no local account[/li]
- [li]xlink - "friends of friends" linkages derived from poco[/li]
- [li]xprof - if this hub is a directory server, contains basic public profile info of everybody in the network[/li]
- [li]xtag - if this hub is a directory server, contains tags or interests of everybody in the network[/li]
-
-
-[b]How to theme $Projectname - by Olivier Migeot[/b]
-
-This is a short documentation on what I found while trying to modify $Projectname's appearance.
-
-First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it .
-
-Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init().
-
-At that point, if you need to add javascript or css files, add them to /js or /css, and then "register" them in _init() through head_add_js('file.js') and head_add_css('file.css').
-
-Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.
-
-#include doc/macros/main_footer.bb;
+[b]$Projectname Developer Guide[/b] + +[b]File system layout:[/b] + +[addon] optional addons/plugins + +[boot.php] Every process uses this to bootstrap the application structure + +[doc] Help Files + +[images] core required images + +[include] The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing + +[index.php] The front-end controller for web access + +[install] Installation and upgrade files and DB schema + +[library] Third party modules (must be license compatible) + +[mod] Controller modules based on URL pathname (e.g. #^[url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php) + +[mod/site/] site-specific mod overrides, excluded from git + +[util] translation tools, main English string database and other miscellaneous utilities + +[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git) + +[view] theming and language files + +[view/(css,js,img,php,tpl)] default theme files + +[view/(en,it,es ...)] language strings and resources + +[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides + +[b]The Database:[/b] + + [li]abook - contact table, replaces Friendica 'contact'[/li] + [li]account - service provider account[/li] + [li]addon - registered plugins[/li] + [li]app - peronal app data[/li] + [li]attach - file attachments[/li] + [li]auth_codes - OAuth usage[/li] + [li]cache - OEmbed cache[/li] + [li]channel - replaces Friendica 'user'[/li] + [li]chat - chat room content[/li] + [li]chatpresence - channel presence information for chat[/li] + [li]chatroom - data for the actual chat room[/li] + [li]clients - OAuth usage[/li] + [li]config - main configuration storage[/li] + [li]conv - Diaspora private messages[/li] + [li]event - Events[/li] + [li]fcontact - friend suggestion stuff[/li] + [li]ffinder - friend suggestion stuff[/li] + [li]fserver - obsolete[/li] + [li]fsuggest - friend suggestion stuff[/li] + [li]groups - privacy groups[/li] + [li]group_member - privacy groups[/li] + [li]hook - plugin hook registry[/li] + [li]hubloc - Red location storage, ties a location to an xchan[/li] + [li]item - posts[/li] + [li]item_id - other identifiers on other services for posts[/li] + [li]likes - likes of 'things'[/li] + [li]mail - private messages[/li] + [li]menu - channel menu data[/li] + [li]menu_item - items uses by channel menus[/li] + [li]notify - notifications[/li] + [li]notify-threads - need to factor this out and use item thread info on notifications[/li] + [li]obj - object data for things (x has y)[/li] + [li]outq - output queue[/li] + [li]pconfig - personal (per channel) configuration storage[/li] + [li]photo - photo storage[/li] + [li]poll - data for polls[/li] + [li]poll_elm - data for poll elements[/li] + [li]profdef - custom profile field definitions[/li] + [li]profext - custom profile field data[/li] + [li]profile - channel profiles[/li] + [li]profile_check - DFRN remote auth use, may be obsolete[/li] + [li]register - registrations requiring admin approval[/li] + [li]session - web session storage[/li] + [li]shares - shared item information[/li] + [li[sign - Diaspora signatures. To be phased out.[/li] + [li]site - site table to find directory peers[/li] + [li]source - channel sources data[/li] + [li]spam - unfinished[/li] + [li]sys_perms - extensible permissions for the sys channel[/li] + [li]term - item taxonomy (categories, tags, etc.) table[/li] + [li]tokens - OAuth usage[/li] + [li]updates - directory sync updates[/li] + [li]verify - general purpose verification structure[/li] + [li]vote - vote data for polls[/li] + [li]xchan - replaces 'gcontact', list of known channels in the universe[/li] + [li]xchat - bookmarked chat rooms[/li] + [li]xconfig - as pconfig but for channels with no local account[/li] + [li]xlink - "friends of friends" linkages derived from poco[/li] + [li]xprof - if this hub is a directory server, contains basic public profile info of everybody in the network[/li] + [li]xtag - if this hub is a directory server, contains tags or interests of everybody in the network[/li] + + +[b]How to theme $Projectname - by Olivier Migeot[/b] + +This is a short documentation on what I found while trying to modify $Projectname's appearance. + +First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it . + +Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init(). + +At that point, if you need to add javascript or css files, add them to /js or /css, and then "register" them in _init() through head_add_js('file.js') and head_add_css('file.css'). + +Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory. + +#include doc/macros/main_footer.bb; diff --git a/doc/plugins.bb b/doc/plugins.bb index a320de790..3aecc458f 100644 --- a/doc/plugins.bb +++ b/doc/plugins.bb @@ -1,312 +1,312 @@ -[b]Plugins[/b]
-
-So you want to make $Projectname do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon.
-
-
-In your $Projectname folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it.
-[code]
- mkdir addon
-[/code]
-Then figure out a name for your addon. You probably have at least a vague idea of what you want it to do. For our example I'm going to create a plugin called 'randplace' that provides a somewhat random location for each of your posts. The name of your plugin is used to find the functions we need to access and is part of the function names, so to be safe, use only simple text characters.
-
-Once you've chosen a name, create a directory beneath 'addon' to hold your working file or files.
-[code]
- mkdir addon/randplace
-[/code]
-Now create your plugin file. It needs to have the same name, and it's a PHP script, so using your favourite editor, create the file
-[code]
- addon/randplace/randplace.php
-[/code]
-The very first line of this file needs to be
-[code]
- <?php
-[/code]
-Then we're going to create a comment block to describe the plugin. There's a special format for this. We use /* ... */ comment-style and some tagged lines consisting of
-[code]
- /**
- *
- * Name: Random Place (here you can use better descriptions than you could in the filename)
- * Description: Sample $Projectname plugin, Sets a random place when posting.
- * Version: 1.0
- * Author: Mike Macgirvin <mike@zothub.com>
- *
- */
-[/code]
-These tags will be seen by the site administrator when he/she installs or manages plugins from the admin panel. There can be more than one author. Just add another line starting with 'Author:'.
-
-The typical plugin will have at least the following functions:
-[code]
- pluginname_load()
- pluginname_unload()
-[/code]
-In our case, we'll call them randplace_load() and randplace_unload(), as that is the name of our plugin. These functions are called whenever we wish to either initialise the plugin or remove it from the current webpage. Also if your plugin requires things like altering the database schema before it can run for the very first time, you would likely place these instructions in the functions named
-[code]
- pluginname_install()
- pluginname_uninstall()
-[/code]
-
-Next we'll talk about [b]hooks[/b]. Hooks are places in $Projectname code where we allow plugins to do stuff. There are a [url=[baseurl]/help/hooklist]lot of these[/url], and they each have a name. What we normally do is use the pluginname_load() function to register a "handler function" for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called.
-
-We register hook handlers with the 'Zotlabs\Extend\Hook::register()' function. It typically takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your $Projectname installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now.
-
-[code]
- function randplace_load() {
- Zotlabs\Extend\Hook::register('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-
- Zotlabs\Extend\Hook::register('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- Zotlabs\Extend\Hook::register('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
-
- }
-[/code]
-
-So we're going to catch three events, 'post_local' which is triggered when a post is made on the local system, 'feature_settings' to set some preferences for our plugin, and 'feature_settings_post' to store those settings.
-
-Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments.
-[code]
- function randplace_unload() {
- Zotlabs\Extend\Hook::unregister('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-
- Zotlabs\Extend\Hook::unregister('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
- Zotlabs\Extend\Hook::unregister('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
- }
-[/code]
-
-Hooks are always called with one argument which is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the passed data is a named array of data structures. Please see the "hook reference" (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed.
-
-Let's go ahead and add some code to implement our post_local hook handler.
-[code]
- function randplace_post_hook(&$item) {
-
- /**
- *
- * An item was posted on the local system.
- * We are going to look for specific items:
- * - A status post by a profile owner
- * - The profile owner must have allowed our plugin
- *
- */
-
- logger('randplace invoked');
-
- if(! local_channel()) /* non-zero if this is a logged in user of this system */
- return;
-
- if(local_channel() != $item['uid']) /* Does this person own the post? */
- return;
-
- if(($item['parent']) || (! is_item_normal($item))) {
- /* If the item has a parent, or is not "normal", this is a comment or something else, not a status post. */
- return;
- }
-
- /* Retrieve our personal config setting */
-
- $active = get_pconfig(local_channel(), 'randplace', 'enable');
-
- if(! $active)
- return;
- /**
- *
- * OK, we're allowed to do our stuff.
- * Here's what we are going to do:
- * load the list of timezone names, and use that to generate a list of world cities.
- * Then we'll pick one of those at random and put it in the "location" field for the post.
- *
- */
-
- $cities = array();
- $zones = timezone_identifiers_list();
- foreach($zones as $zone) {
- if((strpos($zone,'/')) && (! stristr($zone,'US/')) && (! stristr($zone,'Etc/')))
- $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1));
- }
-
- if(! count($cities))
- return;
- $city = array_rand($cities,1);
- $item['location'] = $cities[$city];
-
- return;
- }
-[/code]
-
-Now let's add our functions to create and store preference settings.
-[code]
- /**
- *
- * Callback from the settings post function.
- * $post contains the global $_POST array.
- * We will make sure we've got a valid user account
- * and that only our own submit button was clicked
- * and if so set our configuration setting for this person.
- *
- */
-
- function randplace_settings_post($post) {
- if(! local_channel())
- return;
- if($_POST['randplace-submit'])
- set_pconfig(local_channel(),'randplace','enable',intval($_POST['randplace']));
- }
-
-
-
- /**
- *
- * Called from the Feature Setting form.
- * The second argument is a string in this case, the HTML content region of the page.
- * Add our own settings info to the string.
- *
- * For uniformity of settings pages, we use the following convention
- * <div class="settings-block">
- * <h3>title</h3>
- * .... settings html - many elements will be floated...
- * <div class="clear"></div> <!-- generic class which clears all floats -->
- * <input type="submit" name="pluginnname-submit" class="settings-submit" ..... />
- * </div>
- */
-
-
-
- function randplace_settings(&$s) {
-
- if(! local_channel())
- return;
-
- /* Add our stylesheet to the page so we can make our settings look nice */
-
- head_add_css(/addon/randplace/randplace.css');
-
- /* Get the current state of our config variable */
-
- $enabled = get_pconfig(local_channel(),'randplace','enable');
-
- $checked = (($enabled) ? ' checked="checked" ' : '');
-
- /* Add some HTML to the existing form */
-
- $s .= '<div class="settings-block">';
- $s .= '<h3>' . t('Randplace Settings') . '</h3>';
- $s .= '<div id="randplace-enable-wrapper">';
- $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . t('Enable Randplace Plugin') . '</label>';
- $s .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>';
- $s .= '</div><div class="clear"></div>';
-
- /* provide a submit button */
-
- $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
-
- }
-
-[/code]
-
-
-
-[h2]Advanced Plugins[/h2]
-
-Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin.
-
-There are two ways to accomplish this. To create a module object use the following model:
-[code]
-<?php /* file: addon/randplace/Mod_Randplace.php */
-namespace Zotlabs\Module;
-
- // Your module will consist of the name of your addon with an uppercase first character, within the Zotlabs\Module namespace
- // To avoid namespace conflicts with your plugin, the convention we're using is to name the module file Mod_Addonname.php
- // In this case 'Mod_Randplace.php' and then include it from within your main plugin file 'randplace.php' with the line:
- //
- // require_once('addon/randplace/Mod_Randplace.php');
-
- class Randplace extends \Zotlabs\Web\Controller {
- function init() {
- // init method is always called first if it exists
- }
- function post() {
- // the post method is only called if there are $_POST variables present (e.g. the page request method is "post")
- }
- function get() {
- // The get method is used to display normal content on the page
- // whatever this function returns will be displayed in the page body
- }
- }
-[/code]
-
-The other option is to use a procedural interface. The $a argument to these function is obsolete, but must be present.
-The key to this is to create a simple function named pluginname_module() which does nothing. These lines and this interface
-can be used inside your addon file without causing a namespace conflict, as the object method will.
-
-[code]
- function randplace_module() { return; }
-[/code]
-Once this function exists, the URL #^[url=https://yoursite/randplace]https://yoursite/randplace[/url] will access your plugin as a module. Then you can define functions which are called at various points to return or process a structured webpage just like system modules. The typical functions and the order which they are called is
-[code]
- modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml,
- // you should do it here, followed by killme() which will avoid the default action of building a webpage
- modulename_post($a) // Called whenever the page is accessed via the "post" method
- modulename_content($a) // called to generate the central page content. This function should return a string
- // consisting of the central page content.
-[/code]
-Your module functions have access to the URL path as if they were standalone programs in the Unix operating system. For instance if you visit the page
-[code]
- https://yoursite/randplace/something/somewhere/whatever
-[/code]
-we will create an argc/argv list for use by your module functions
-[code]
- $x = argc(); // $x will be 4, the number of path arguments after the sitename
-
- for($x = 0; $x < argc(); $x ++)
- echo $x . ' ' . argv($x);
-
-
- 0 randplace
- 1 something
- 2 somewhere
- 3 whatever
-[/code]
-
-[h3]Using class methods as hook handler functions[/h3]
-
-To register a hook using a class method as a callback, a couple of things need to be considered. The first is that the functions need to be declared static public so that they are available from all contexts, and they need to have a namespace attached because they can be called from within multiple namespaces. You can then register them as strings or arrays (using the PHP internal calling method).
-
-[code]
-<?php
-/*
- * plugin info block goes here
- */
-
-function myplugin_load() {
- Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php','\\Myplugin::foo');
-[b]or[/b]
- Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php',array('\\Myplugin','foo'));
-}
-
-class Myplugin {
-
- public static function foo($params) {
- // handler for 'hook_name'
- }
-}
-[/code]
-
-If you want to keep your plugin hidden from the siteinfo page, simply create a file called '.hidden' in your addon directory
-[code]
- touch addon/<addon name>/.hidden
-[/code]
-
-***Porting Friendica Plugins***
-
-$Projectname uses a similar plugin architecture to the Friendica project. The authentication, identity, and permissions systems are completely different. Many Friendica can be ported reasonably easily by renaming a few functions - and then ensuring that the permissions model is adhered to. The functions which need to be renamed are:
-
-[li] Friendica's pluginname_install() is pluginname_load()[/li]
-
-[li] Friendica's pluginname_uninstall() is pluginname_unload()[/li]
-
-$Projectname has _install and _uninstall functions but these are used differently.
-
-[li] Friendica's "plugin_settings" hook is called "feature_settings"[/li]
-
-[li] Friendica's "plugin_settings_post" hook is called "feature_settings_post"[/li]
-
-Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in $Projectname. Many structured data names (especially DB schema columns) are also quite different.
-
-#include doc/macros/main_footer.bb;
+[b]Plugins[/b] + +So you want to make $Projectname do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon. + + +In your $Projectname folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it. +[code] + mkdir addon +[/code] +Then figure out a name for your addon. You probably have at least a vague idea of what you want it to do. For our example I'm going to create a plugin called 'randplace' that provides a somewhat random location for each of your posts. The name of your plugin is used to find the functions we need to access and is part of the function names, so to be safe, use only simple text characters. + +Once you've chosen a name, create a directory beneath 'addon' to hold your working file or files. +[code] + mkdir addon/randplace +[/code] +Now create your plugin file. It needs to have the same name, and it's a PHP script, so using your favourite editor, create the file +[code] + addon/randplace/randplace.php +[/code] +The very first line of this file needs to be +[code] + <?php +[/code] +Then we're going to create a comment block to describe the plugin. There's a special format for this. We use /* ... */ comment-style and some tagged lines consisting of +[code] + /** + * + * Name: Random Place (here you can use better descriptions than you could in the filename) + * Description: Sample $Projectname plugin, Sets a random place when posting. + * Version: 1.0 + * Author: Mike Macgirvin <mike@zothub.com> + * + */ +[/code] +These tags will be seen by the site administrator when he/she installs or manages plugins from the admin panel. There can be more than one author. Just add another line starting with 'Author:'. + +The typical plugin will have at least the following functions: +[code] + pluginname_load() + pluginname_unload() +[/code] +In our case, we'll call them randplace_load() and randplace_unload(), as that is the name of our plugin. These functions are called whenever we wish to either initialise the plugin or remove it from the current webpage. Also if your plugin requires things like altering the database schema before it can run for the very first time, you would likely place these instructions in the functions named +[code] + pluginname_install() + pluginname_uninstall() +[/code] + +Next we'll talk about [b]hooks[/b]. Hooks are places in $Projectname code where we allow plugins to do stuff. There are a [url=[baseurl]/help/hooklist]lot of these[/url], and they each have a name. What we normally do is use the pluginname_load() function to register a "handler function" for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called. + +We register hook handlers with the 'Zotlabs\Extend\Hook::register()' function. It typically takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your $Projectname installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now. + +[code] + function randplace_load() { + Zotlabs\Extend\Hook::register('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook'); + + Zotlabs\Extend\Hook::register('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings'); + Zotlabs\Extend\Hook::register('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post'); + + } +[/code] + +So we're going to catch three events, 'post_local' which is triggered when a post is made on the local system, 'feature_settings' to set some preferences for our plugin, and 'feature_settings_post' to store those settings. + +Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments. +[code] + function randplace_unload() { + Zotlabs\Extend\Hook::unregister('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook'); + + Zotlabs\Extend\Hook::unregister('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings'); + Zotlabs\Extend\Hook::unregister('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post'); + } +[/code] + +Hooks are always called with one argument which is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the passed data is a named array of data structures. Please see the "hook reference" (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed. + +Let's go ahead and add some code to implement our post_local hook handler. +[code] + function randplace_post_hook(&$item) { + + /** + * + * An item was posted on the local system. + * We are going to look for specific items: + * - A status post by a profile owner + * - The profile owner must have allowed our plugin + * + */ + + logger('randplace invoked'); + + if(! local_channel()) /* non-zero if this is a logged in user of this system */ + return; + + if(local_channel() != $item['uid']) /* Does this person own the post? */ + return; + + if(($item['parent']) || (! is_item_normal($item))) { + /* If the item has a parent, or is not "normal", this is a comment or something else, not a status post. */ + return; + } + + /* Retrieve our personal config setting */ + + $active = get_pconfig(local_channel(), 'randplace', 'enable'); + + if(! $active) + return; + /** + * + * OK, we're allowed to do our stuff. + * Here's what we are going to do: + * load the list of timezone names, and use that to generate a list of world cities. + * Then we'll pick one of those at random and put it in the "location" field for the post. + * + */ + + $cities = array(); + $zones = timezone_identifiers_list(); + foreach($zones as $zone) { + if((strpos($zone,'/')) && (! stristr($zone,'US/')) && (! stristr($zone,'Etc/'))) + $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1)); + } + + if(! count($cities)) + return; + $city = array_rand($cities,1); + $item['location'] = $cities[$city]; + + return; + } +[/code] + +Now let's add our functions to create and store preference settings. +[code] + /** + * + * Callback from the settings post function. + * $post contains the global $_POST array. + * We will make sure we've got a valid user account + * and that only our own submit button was clicked + * and if so set our configuration setting for this person. + * + */ + + function randplace_settings_post($post) { + if(! local_channel()) + return; + if($_POST['randplace-submit']) + set_pconfig(local_channel(),'randplace','enable',intval($_POST['randplace'])); + } + + + + /** + * + * Called from the Feature Setting form. + * The second argument is a string in this case, the HTML content region of the page. + * Add our own settings info to the string. + * + * For uniformity of settings pages, we use the following convention + * <div class="settings-block"> + * <h3>title</h3> + * .... settings html - many elements will be floated... + * <div class="clear"></div> <!-- generic class which clears all floats --> + * <input type="submit" name="pluginnname-submit" class="settings-submit" ..... /> + * </div> + */ + + + + function randplace_settings(&$s) { + + if(! local_channel()) + return; + + /* Add our stylesheet to the page so we can make our settings look nice */ + + head_add_css(/addon/randplace/randplace.css'); + + /* Get the current state of our config variable */ + + $enabled = get_pconfig(local_channel(),'randplace','enable'); + + $checked = (($enabled) ? ' checked="checked" ' : ''); + + /* Add some HTML to the existing form */ + + $s .= '<div class="settings-block">'; + $s .= '<h3>' . t('Randplace Settings') . '</h3>'; + $s .= '<div id="randplace-enable-wrapper">'; + $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . t('Enable Randplace Plugin') . '</label>'; + $s .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>'; + $s .= '</div><div class="clear"></div>'; + + /* provide a submit button */ + + $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>'; + + } + +[/code] + + + +[h2]Advanced Plugins[/h2] + +Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin. + +There are two ways to accomplish this. To create a module object use the following model: +[code] +<?php /* file: addon/randplace/Mod_Randplace.php */ +namespace Zotlabs\Module; + + // Your module will consist of the name of your addon with an uppercase first character, within the Zotlabs\Module namespace + // To avoid namespace conflicts with your plugin, the convention we're using is to name the module file Mod_Addonname.php + // In this case 'Mod_Randplace.php' and then include it from within your main plugin file 'randplace.php' with the line: + // + // require_once('addon/randplace/Mod_Randplace.php'); + + class Randplace extends \Zotlabs\Web\Controller { + function init() { + // init method is always called first if it exists + } + function post() { + // the post method is only called if there are $_POST variables present (e.g. the page request method is "post") + } + function get() { + // The get method is used to display normal content on the page + // whatever this function returns will be displayed in the page body + } + } +[/code] + +The other option is to use a procedural interface. The $a argument to these function is obsolete, but must be present. +The key to this is to create a simple function named pluginname_module() which does nothing. These lines and this interface +can be used inside your addon file without causing a namespace conflict, as the object method will. + +[code] + function randplace_module() { return; } +[/code] +Once this function exists, the URL #^[url=https://yoursite/randplace]https://yoursite/randplace[/url] will access your plugin as a module. Then you can define functions which are called at various points to return or process a structured webpage just like system modules. The typical functions and the order which they are called is +[code] + modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml, + // you should do it here, followed by killme() which will avoid the default action of building a webpage + modulename_post($a) // Called whenever the page is accessed via the "post" method + modulename_content($a) // called to generate the central page content. This function should return a string + // consisting of the central page content. +[/code] +Your module functions have access to the URL path as if they were standalone programs in the Unix operating system. For instance if you visit the page +[code] + https://yoursite/randplace/something/somewhere/whatever +[/code] +we will create an argc/argv list for use by your module functions +[code] + $x = argc(); // $x will be 4, the number of path arguments after the sitename + + for($x = 0; $x < argc(); $x ++) + echo $x . ' ' . argv($x); + + + 0 randplace + 1 something + 2 somewhere + 3 whatever +[/code] + +[h3]Using class methods as hook handler functions[/h3] + +To register a hook using a class method as a callback, a couple of things need to be considered. The first is that the functions need to be declared static public so that they are available from all contexts, and they need to have a namespace attached because they can be called from within multiple namespaces. You can then register them as strings or arrays (using the PHP internal calling method). + +[code] +<?php +/* + * plugin info block goes here + */ + +function myplugin_load() { + Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php','\\Myplugin::foo'); +[b]or[/b] + Zotlabs\Extend\Hook::register('hook_name','addon/myplugin/myplugin.php',array('\\Myplugin','foo')); +} + +class Myplugin { + + public static function foo($params) { + // handler for 'hook_name' + } +} +[/code] + +If you want to keep your plugin hidden from the siteinfo page, simply create a file called '.hidden' in your addon directory +[code] + touch addon/<addon name>/.hidden +[/code] + +***Porting Friendica Plugins*** + +$Projectname uses a similar plugin architecture to the Friendica project. The authentication, identity, and permissions systems are completely different. Many Friendica can be ported reasonably easily by renaming a few functions - and then ensuring that the permissions model is adhered to. The functions which need to be renamed are: + +[li] Friendica's pluginname_install() is pluginname_load()[/li] + +[li] Friendica's pluginname_uninstall() is pluginname_unload()[/li] + +$Projectname has _install and _uninstall functions but these are used differently. + +[li] Friendica's "plugin_settings" hook is called "feature_settings"[/li] + +[li] Friendica's "plugin_settings_post" hook is called "feature_settings_post"[/li] + +Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in $Projectname. Many structured data names (especially DB schema columns) are also quite different. + +#include doc/macros/main_footer.bb; diff --git a/doc/problems-following-an-update.bb b/doc/problems-following-an-update.bb index 2d1fefc5b..7376d6163 100644 --- a/doc/problems-following-an-update.bb +++ b/doc/problems-following-an-update.bb @@ -1,38 +1,38 @@ -[b]Problems Following An Update[/b]
-
-A good 90% of all bugs encountered immediately after updating the code to the latest version are simple cache errors of one sort or another. If you update and find something very obvious is broken - like your matrix page doesn't load, notifications are missing, or comment boxes are missing - the chances are it's not a bug at all. Breaking basic functionality is the kind of thing developers tend to notice.
-
-If this happens to you, there are a few simple steps to take before resorting to the support forums:
-
-[b]Browser Cache[/b]
-
-Symptoms: Menus do not expand, ACL selector does not open, progress indicator does not display (or loops forever), Matrix and channel pages do not load.
-
-Force reload the page. Shift reload, or ctrl+f5. Occasionally, but very, very rarely, you will also need to clear the session data - which is achieved by restarting the browser.
-
-[b]FastCGI[/b]
-
-Symptoms: Incorrect variables. The basic UI mostly works, but displays incorrect content or is missing content entirely.
-
-If you're using php5-fpm, this problem is usually resolved with [code]service php5-fpm restart[/code]
-
-[b]Smarty Cache[/b]
-
-Symptoms:
-
-1) White Screen Of Death. This is most prevalent on the settings and admin pages.
-
-2) Missing icons, tabs, menus or features.
-
-We use the Smarty3 template engine to generate pages. These templates are compiled before they are displayed. Occasionally, a new or modified template will fail to overwrite the old compiled version. To clear the Smarty cache, delete all the files in store/[data]/smarty3/compiled [b]but do not delete the directory itself[/b]. Templates will then be recompiled on their next access.
-
-[b]Theme Issues[/b]
-
-There are many themes for $Projectname. Only Redbasic is officialy supported by the core developers. This applies [i]even if a core developer happens to support an additional theme[/i]. This means new features are only guaranteed to work in Redbasic.
-
-Redbasic uses a few javascript libraries that are done differently, or entirely absent in other themes. This means new features may only work properly in Redbasic. Before reporting an issue, therefore, you should switch to Redbasic to see if it exists there. If the issue goes away, this is not a bug - it's a theme that isn't up to date.
-
-Should you report an issue with the theme developers then? No. Theme developers use their themes. Chances are, they know. Give them two or three days to catch up and [i]then[/i] report the issue if it's still not fixed. There are two workarounds for this situation. Firstly, you can temporarily use Redbasic. Secondly, most themes are open source too - open a pull request and make yourself a friend.
-
-#include doc/macros/troubleshooting_footer.bb;
-
+[b]Problems Following An Update[/b] + +A good 90% of all bugs encountered immediately after updating the code to the latest version are simple cache errors of one sort or another. If you update and find something very obvious is broken - like your matrix page doesn't load, notifications are missing, or comment boxes are missing - the chances are it's not a bug at all. Breaking basic functionality is the kind of thing developers tend to notice. + +If this happens to you, there are a few simple steps to take before resorting to the support forums: + +[b]Browser Cache[/b] + +Symptoms: Menus do not expand, ACL selector does not open, progress indicator does not display (or loops forever), Matrix and channel pages do not load. + +Force reload the page. Shift reload, or ctrl+f5. Occasionally, but very, very rarely, you will also need to clear the session data - which is achieved by restarting the browser. + +[b]FastCGI[/b] + +Symptoms: Incorrect variables. The basic UI mostly works, but displays incorrect content or is missing content entirely. + +If you're using php5-fpm, this problem is usually resolved with [code]service php5-fpm restart[/code] + +[b]Smarty Cache[/b] + +Symptoms: + +1) White Screen Of Death. This is most prevalent on the settings and admin pages. + +2) Missing icons, tabs, menus or features. + +We use the Smarty3 template engine to generate pages. These templates are compiled before they are displayed. Occasionally, a new or modified template will fail to overwrite the old compiled version. To clear the Smarty cache, delete all the files in store/[data]/smarty3/compiled [b]but do not delete the directory itself[/b]. Templates will then be recompiled on their next access. + +[b]Theme Issues[/b] + +There are many themes for $Projectname. Only Redbasic is officialy supported by the core developers. This applies [i]even if a core developer happens to support an additional theme[/i]. This means new features are only guaranteed to work in Redbasic. + +Redbasic uses a few javascript libraries that are done differently, or entirely absent in other themes. This means new features may only work properly in Redbasic. Before reporting an issue, therefore, you should switch to Redbasic to see if it exists there. If the issue goes away, this is not a bug - it's a theme that isn't up to date. + +Should you report an issue with the theme developers then? No. Theme developers use their themes. Chances are, they know. Give them two or three days to catch up and [i]then[/i] report the issue if it's still not fixed. There are two workarounds for this situation. Firstly, you can temporarily use Redbasic. Secondly, most themes are open source too - open a pull request and make yourself a friend. + +#include doc/macros/troubleshooting_footer.bb; + diff --git a/doc/red2pi.bb b/doc/red2pi.bb index 8a056b81b..8ae087fbf 100644 --- a/doc/red2pi.bb +++ b/doc/red2pi.bb @@ -1,342 +1,342 @@ -[b]How to install $Projectname on a Raspberry Pi[/b]
-
-You just bought a Raspberry Pi and want to run the RED Matrix with your own domain name?
-
-Then this page is for you! You will:
-[list=1]
-[*] Install Raspberry OS (Debian Linux) on a Raspberry
-[*] Install Apache Web Server, PHP, MaySQL, phpMyAdmin
-[*] Register a free domain (dynamic DNS) and use it for your hub
-[*] Install $Projectname
-[*] Keep your Raspberry Pi and $Projectname up-to-date
-[*] TODO Setting up SSL
-[*] TODO Running with SSL
-[*] TODO Make the webserver less vulnarable to attacks
-[/list]
-
-[size=large]1. Install Raspberry OS (Debian Linux)[/size]
-
-instructions under [url=http://www.raspberrypi.org/downloads]http://www.raspberrypi.org/downloads[/url]
-This page links to the quick start containing detailed instruction.
-
-[b]Format SD card[/b]
-
-using the program gparted under Linux Mint 15
-
-format as FAT32
-
-[b]Download NOOBS (offline and network install)[/b]
-
-[url=http://downloads.raspberrypi.org/noobs]http://downloads.raspberrypi.org/noobs[/url]
-
-unzip
-
-copy unzipped files to SD card
-
-[b]Install Raspbian as OS on the Rasperry Pi[/b]
-
-connect with keyboard via USB
-
-connect with monitor via HDMI
-
-Insert SD card into Rasperry Pi
-
-Connect with power supply to switch on the Rasperry
-
-choose Raspbian as OS (> installs Raspbian....)
-
-wait for the coniguration program raspi-config (you can later start it by sudo raspi-config)
-
-[b]Configure Raspbian[/b]
-
-in raspi-config > advanced > choose to use ssh (!! You need this to connect to administrate your Pi from your PC !!)
-
-in raspi-config > change the password (of default user "pi" from "raspberry" to your password)
-
-in raspi-config (optional) > Internationalisation options > Change Locale > to de_DE.utf-8 utf-8 (for example)
-
-in raspi-config (optional) > Internationalisation options > Change Timezoe > set your timezone
-
-in raspi-config (optional) > Overlock > medium
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]More[/b]
-
-[code]sudo reboot[/code]
-
-Now its time to connect the Pi to the network.
-[ul]
-[*] pull out keyboard
-[*] pull out monitor
-[*] you even can pull out the power supply (USB)
-[*] plug-in the network cable to the router
-[*] plug-in the power supply again
-[*] wait for a minute or to give the Pi time to boot and start ssh...
-[/ul]
-
-On your PC connect to the Pi to administrate (here update it).
-Open the console on the PC (Window: Start > cmd, Linux: Shell)
-
-Hint: use the router admin tool to find out the IP of your PI[code]ssh pi@192.168.178.37
-sudo apt-get update
-sudo apt-get dist-upgrade[/code]
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-
-[size=large]2. Install Apache Web Server, PHP, MaySQL, phpMyAdmin[/size]
-
-[b]Install Apache Webserver[/b]
-
-[code]sudo bash
-sudo groupadd www-data[/code] might exist already
-
-[code]sudo usermod -a -G www-data www-data
-sudo apt-get update
-sudo reboot[/code]
-
-wait...
-reconnect via ssh, example: [code]ssh pi@192.168.178.37
-sudo apt-get install apache2 apache2-doc apache2-utils[/code]
-
-Open webbrowser on PC and check [url=http://192.168.178.37]http://192.168.178.37[/url]
-Should show you a page like "It works"
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]Install PHP, MaySQL, phpMyAdmin[/b]
-
-[code]sudo bash
-apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl
-apt-get install php5-mysql
-apt-get install mysql-server mysql-client[/code] enter and note the mysql passwort
-
-[code]apt-get install phpmyadmin[/code]
-
-Configuring phpmyadmin
-- Select apache2
-- Configure database for phpmyadmin with dbconfig-common?: Choose Yes
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]Test installation[/b]
-
-[code]cd /var/www[/code]
-
-create a php file to test the php installation[code]sudo nano phpinfo.php[/code]
-
-Insert into the file:[code]
-<?php
- phpinfo();
-?>
-[/code]
-(save CTRL+0, ENTER, CTRL+X)
-
-open webbrowser on PC and try [url=http://192.168.178.37/phpinfo.php]http://192.168.178.37/phpinfo.php[/url] (page shows infos on php)
-
-connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf[/code]
-- CTRL+V... to the end of the file
-- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code]
-
-restart apache[code]/etc/init.d/apache2 restart
-sudo apt-get update
-sudo apt-get upgrade
-sudo reboot[/code]
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]phpMyAdmin[/b]
-
-open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url]
-
-(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
-
-
-[b]Create an empty database... that is later used by RED[/b]
-
-open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url]
-
-Create an empty database
-
-Note the access details (hostname, username, password, database name).
-
-
-[size=large]3. Selfhost[/size]
-
-(Source: #^[url=http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html]http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html[/url])
-
-[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url]
-
-[b]Step 1[/b]
-Register for a Free domain at #^[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url]
-(We will take techhome.homenet.org in this guide)
-
-[b]Step 2[/b]
-
-Logon to FreeDNS (where you just registered) and goto #^[url=http://freedns.afraid.org/dynamic/]http://freedns.afraid.org/dynamic/[/url]
-Right click on "Direct Link" and copy the URL and paste it somewhere.
-You should notice a large and unique alpha-numeric key in the URL, make a note of it as shown below:
-[code]http://freedns.afraid.org/dynamic/update.php?alphanumeric-key[/code]
-
-
-[b]Step 3[/b]
-Install inadyn using the following command:[code]sudo apt-get install inadyn[/code]
-
-[b]Step 4[/b]
-Configure inadyn using the below steps:[code]sudo nano /etc/inadyn.conf[/code]
-And add the following contains in it replacing the actual values:
-[code]
---username [color=red]techhome[/color]
---password [color=red]mypassword[/color]
---update_period 3600
---forced_update_period 14400
---alias [color=red]techhome.homenet.org</b>,[color=red]alphanumeric key[/color]
---background
---dyndns_system default@freedns.afraid.org
---syslog
- [/code]
-
-
-[b]Step 5[/b]
-
-Now, we need to ensure that the DNS updater (Inadyn) runs automatically after every re-boot[code]export EDITOR=gedit && sudo crontab -e[/code]
-Add the following line:[code]@reboot /usr/sbin/inadyn[/code]
-
-
-[b]Step 6[/b]
-
-Reboot system and then run the following command to ensure inadyn is running:[code]
-sudo reboot
-ps -A | grep inadyn
-[/code]
-Now your host is ready and up for accessing from internet...
-You can trying ssh-ing from another computer over the internet
-[code]ssh username@techhome.homenet.org[/code]
-Or, if any web server is running, then simply browse to #^[url=http://techhome.homenet.org]http://techhome.homenet.org[/url]
-Or, you can just ping it to test ping techhome.homenet.org
-To check the logs you can use this:
-[code]more /var/log/messages |grep INADYN[/code]
-
-
-[size=large]4. Install $Projectname[/size]
-
-(Source: [zrl=[baseurl]/help/Install][baseurl]/help/Install[/zrl])
-
-Linux Appache document root is /var/www/
-Two files exist there (created by the steps above): index.html, phpinfo.php
-
-
-[b]Install $Projectname and its Addons[/b]
-
-Cleanup: Remove the directory www/ (Git will not create files and folders in directories that are not empty.) Make sure you are in directory var[code]pi@pi /var $ cd /var[/code]
-
-Remove directory[code]pi@pi /var $ sudo rm -rf www/[/code]
-
-Download the sources of $Projectname from GIT
-[code]pi@pi /var $ sudo git clone https://framagit.org/hubzilla/core.git www[/code]
-
-Download the sources of the addons from GIT
-[code]pi@pi /var/www $ sudo git clone https://framagit.org/hubzilla/addons.git addon[/code]
-
-Make user www-data the owner of the whole web directory (including subdirectories and files)
-(TODO: This step has to be proofed by the next installation.)
-[code]pi@pi /var $ chown -R www-data:www-data /var/www/[/code]
-
-Check if you can update the sources from git[code]
-pi@pi /var $ cd www
-pi@pi /var/www $ git pull
-[/code]
-
-Check if you can update the addons
-[code]pi@pi /var/www $ cd addon/
-pi@pi /var/www/addon $ sudo git pull[/code]
-
-Make sure folder store/[data]/smarty3 exists and is writable by the webserver
-[code]pi@pi /var/www $ sudo chmod ou+w "store/\[data\]/smarty3"[/code]
-
-Create .htconfig.php and is writable by the webserver
-[code]pi@pi /var/www $ sudo touch .htconfig.php
-pi@pi /var/www $ sudo chmod ou+w .htconfig.php[/code]
-
-[b]First start and initial configuration of your RED Matrix hub[/b]
-
-In browser open #^[zrl=http://einervonvielen.mooo.com/]http://einervonvielen.mooo.com/[/zrl]
-(Replace einervonvielen.mooo.com by your domain, see chapter selfhost. Be patient. It takes time.)
-(#^[zrl=http://einervonvielen.mooo.com/index.php?q=setup]http://einervonvielen.mooo.com/index.php?q=setup[/zrl])
-
-There might be errors like the following.
-
-Error: libCURL PHP module required but not installed.
-Solution:
-apt-get install php5-curl
-
-Error: Apache webserver mod-rewrite module is required but not installed.
-Solution
-(Source: [url=http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html]http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html[/url])
-The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load
-- pi@pi /var/www $ nano /etc/apache2/mods-available/rewrite.load
- (You should find the contendt: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so)
-To enable and load mod_rewrite, do the rest of steps.
-Create a symbolic link in /etc/apache2/mods-enabled
-- pi@pi /var/www $ sudo a2enmod rewrite
-Then open up the following file, and replace every occurrence of "AllowOverride None" with "AllowOverride all".
-- pi@pi /var/www $ sudo nano /etc/apache2/sites-available/default
-Finally, restart Apache2.
-- pi@pi /var/www $ sudo service apache2 restart
-
-Error store is writable (not checked)
-Solution:
-(TODO: Make writeable to group www-data only?)
-pi@pi /var/www $ sudo mkdir store
-pi@pi /var/www $ chown -R www-data:www-data /var/www/red/
-pi@pi /var/www $ sudo chmod ou+w view
-
-[b]More[/b]
-
-Set up a cron job to run the poller once every 15 minutes in order to perform background processing.
-- pi@pi /var/www $ which php
-Make sure you are in the document root directory of the webserver
-- pi@pi /var/www $ cd /var/www/
-Try to execute the poller in order to make sure it works
-- pi@pi /var/www $ /usr/bin/php include/poller.php
-Create the cronjob
-- pi@pi /var/www $ crontab -e
-Enter
-- */15 * * * * cd /var/www/; /usr/bin/php include/poller.php
-- Save and exit.
-
-Prevent search engines from indexing your search pages. Why? This can cause heavy resource use.
-
-[code]
-php util/config system block_public_search 1
-[/code]
-
-
-
-[size=large]5. Keep your Raspberry Pi and your $Projectname up-to-date[/size]
-
-Git update every day at 4 am and addons at 5 am every day
-Try if the command is working
-- pi@pi /var/www $ sudo git pull
-Create the cronjob
-- pi@pi /var/www $ crontab -e
-Enter the following to update at 4:01 am every day
-- 01 04 * * * cd /var/www/; sudo git pull
-Enter the following to update the addons at 5:01 am every day
-- 01 05 * * * cd /var/www/addon/; sudo git pull
-Enter the following to update the Raspberry Pi (Raspbian OS = Debian) at 6:01 am every day
-- 01 06 * * * sudo aptitude -y update && sudo aptitude -y safe-upgrade
-Save and exit.
-
-[size=large]6. Running with SSL[/size]
-
-Follow the instructions here:
-[url=https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL]https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL[/url]
-
-#include doc/macros/main_footer.bb;
+[b]How to install $Projectname on a Raspberry Pi[/b] + +You just bought a Raspberry Pi and want to run the RED Matrix with your own domain name? + +Then this page is for you! You will: +[list=1] +[*] Install Raspberry OS (Debian Linux) on a Raspberry +[*] Install Apache Web Server, PHP, MaySQL, phpMyAdmin +[*] Register a free domain (dynamic DNS) and use it for your hub +[*] Install $Projectname +[*] Keep your Raspberry Pi and $Projectname up-to-date +[*] TODO Setting up SSL +[*] TODO Running with SSL +[*] TODO Make the webserver less vulnarable to attacks +[/list] + +[size=large]1. Install Raspberry OS (Debian Linux)[/size] + +instructions under [url=http://www.raspberrypi.org/downloads]http://www.raspberrypi.org/downloads[/url] +This page links to the quick start containing detailed instruction. + +[b]Format SD card[/b] + +using the program gparted under Linux Mint 15 + +format as FAT32 + +[b]Download NOOBS (offline and network install)[/b] + +[url=http://downloads.raspberrypi.org/noobs]http://downloads.raspberrypi.org/noobs[/url] + +unzip + +copy unzipped files to SD card + +[b]Install Raspbian as OS on the Rasperry Pi[/b] + +connect with keyboard via USB + +connect with monitor via HDMI + +Insert SD card into Rasperry Pi + +Connect with power supply to switch on the Rasperry + +choose Raspbian as OS (> installs Raspbian....) + +wait for the coniguration program raspi-config (you can later start it by sudo raspi-config) + +[b]Configure Raspbian[/b] + +in raspi-config > advanced > choose to use ssh (!! You need this to connect to administrate your Pi from your PC !!) + +in raspi-config > change the password (of default user "pi" from "raspberry" to your password) + +in raspi-config (optional) > Internationalisation options > Change Locale > to de_DE.utf-8 utf-8 (for example) + +in raspi-config (optional) > Internationalisation options > Change Timezoe > set your timezone + +in raspi-config (optional) > Overlock > medium + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]More[/b] + +[code]sudo reboot[/code] + +Now its time to connect the Pi to the network. +[ul] +[*] pull out keyboard +[*] pull out monitor +[*] you even can pull out the power supply (USB) +[*] plug-in the network cable to the router +[*] plug-in the power supply again +[*] wait for a minute or to give the Pi time to boot and start ssh... +[/ul] + +On your PC connect to the Pi to administrate (here update it). +Open the console on the PC (Window: Start > cmd, Linux: Shell) + +Hint: use the router admin tool to find out the IP of your PI[code]ssh pi@192.168.178.37 +sudo apt-get update +sudo apt-get dist-upgrade[/code] + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + + +[size=large]2. Install Apache Web Server, PHP, MaySQL, phpMyAdmin[/size] + +[b]Install Apache Webserver[/b] + +[code]sudo bash +sudo groupadd www-data[/code] might exist already + +[code]sudo usermod -a -G www-data www-data +sudo apt-get update +sudo reboot[/code] + +wait... +reconnect via ssh, example: [code]ssh pi@192.168.178.37 +sudo apt-get install apache2 apache2-doc apache2-utils[/code] + +Open webbrowser on PC and check [url=http://192.168.178.37]http://192.168.178.37[/url] +Should show you a page like "It works" + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]Install PHP, MaySQL, phpMyAdmin[/b] + +[code]sudo bash +apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl +apt-get install php5-mysql +apt-get install mysql-server mysql-client[/code] enter and note the mysql passwort + +[code]apt-get install phpmyadmin[/code] + +Configuring phpmyadmin +- Select apache2 +- Configure database for phpmyadmin with dbconfig-common?: Choose Yes + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]Test installation[/b] + +[code]cd /var/www[/code] + +create a php file to test the php installation[code]sudo nano phpinfo.php[/code] + +Insert into the file:[code] +<?php + phpinfo(); +?> +[/code] +(save CTRL+0, ENTER, CTRL+X) + +open webbrowser on PC and try [url=http://192.168.178.37/phpinfo.php]http://192.168.178.37/phpinfo.php[/url] (page shows infos on php) + +connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf[/code] +- CTRL+V... to the end of the file +- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code] + +restart apache[code]/etc/init.d/apache2 restart +sudo apt-get update +sudo apt-get upgrade +sudo reboot[/code] + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]phpMyAdmin[/b] + +open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url] + +(Source [url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url]) + + +[b]Create an empty database... that is later used by RED[/b] + +open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url] + +Create an empty database + +Note the access details (hostname, username, password, database name). + + +[size=large]3. Selfhost[/size] + +(Source: #^[url=http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html]http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html[/url]) + +[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url] + +[b]Step 1[/b] +Register for a Free domain at #^[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url] +(We will take techhome.homenet.org in this guide) + +[b]Step 2[/b] + +Logon to FreeDNS (where you just registered) and goto #^[url=http://freedns.afraid.org/dynamic/]http://freedns.afraid.org/dynamic/[/url] +Right click on "Direct Link" and copy the URL and paste it somewhere. +You should notice a large and unique alpha-numeric key in the URL, make a note of it as shown below: +[code]http://freedns.afraid.org/dynamic/update.php?alphanumeric-key[/code] + + +[b]Step 3[/b] +Install inadyn using the following command:[code]sudo apt-get install inadyn[/code] + +[b]Step 4[/b] +Configure inadyn using the below steps:[code]sudo nano /etc/inadyn.conf[/code] +And add the following contains in it replacing the actual values: +[code] +--username [color=red]techhome[/color] +--password [color=red]mypassword[/color] +--update_period 3600 +--forced_update_period 14400 +--alias [color=red]techhome.homenet.org</b>,[color=red]alphanumeric key[/color] +--background +--dyndns_system default@freedns.afraid.org +--syslog + [/code] + + +[b]Step 5[/b] + +Now, we need to ensure that the DNS updater (Inadyn) runs automatically after every re-boot[code]export EDITOR=gedit && sudo crontab -e[/code] +Add the following line:[code]@reboot /usr/sbin/inadyn[/code] + + +[b]Step 6[/b] + +Reboot system and then run the following command to ensure inadyn is running:[code] +sudo reboot +ps -A | grep inadyn +[/code] +Now your host is ready and up for accessing from internet... +You can trying ssh-ing from another computer over the internet +[code]ssh username@techhome.homenet.org[/code] +Or, if any web server is running, then simply browse to #^[url=http://techhome.homenet.org]http://techhome.homenet.org[/url] +Or, you can just ping it to test ping techhome.homenet.org +To check the logs you can use this: +[code]more /var/log/messages |grep INADYN[/code] + + +[size=large]4. Install $Projectname[/size] + +(Source: [zrl=[baseurl]/help/Install][baseurl]/help/Install[/zrl]) + +Linux Appache document root is /var/www/ +Two files exist there (created by the steps above): index.html, phpinfo.php + + +[b]Install $Projectname and its Addons[/b] + +Cleanup: Remove the directory www/ (Git will not create files and folders in directories that are not empty.) Make sure you are in directory var[code]pi@pi /var $ cd /var[/code] + +Remove directory[code]pi@pi /var $ sudo rm -rf www/[/code] + +Download the sources of $Projectname from GIT +[code]pi@pi /var $ sudo git clone https://framagit.org/hubzilla/core.git www[/code] + +Download the sources of the addons from GIT +[code]pi@pi /var/www $ sudo git clone https://framagit.org/hubzilla/addons.git addon[/code] + +Make user www-data the owner of the whole web directory (including subdirectories and files) +(TODO: This step has to be proofed by the next installation.) +[code]pi@pi /var $ chown -R www-data:www-data /var/www/[/code] + +Check if you can update the sources from git[code] +pi@pi /var $ cd www +pi@pi /var/www $ git pull +[/code] + +Check if you can update the addons +[code]pi@pi /var/www $ cd addon/ +pi@pi /var/www/addon $ sudo git pull[/code] + +Make sure folder store/[data]/smarty3 exists and is writable by the webserver +[code]pi@pi /var/www $ sudo chmod ou+w "store/\[data\]/smarty3"[/code] + +Create .htconfig.php and is writable by the webserver +[code]pi@pi /var/www $ sudo touch .htconfig.php +pi@pi /var/www $ sudo chmod ou+w .htconfig.php[/code] + +[b]First start and initial configuration of your RED Matrix hub[/b] + +In browser open #^[zrl=http://einervonvielen.mooo.com/]http://einervonvielen.mooo.com/[/zrl] +(Replace einervonvielen.mooo.com by your domain, see chapter selfhost. Be patient. It takes time.) +(#^[zrl=http://einervonvielen.mooo.com/index.php?q=setup]http://einervonvielen.mooo.com/index.php?q=setup[/zrl]) + +There might be errors like the following. + +Error: libCURL PHP module required but not installed. +Solution: +apt-get install php5-curl + +Error: Apache webserver mod-rewrite module is required but not installed. +Solution +(Source: [url=http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html]http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html[/url]) +The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load +- pi@pi /var/www $ nano /etc/apache2/mods-available/rewrite.load + (You should find the contendt: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so) +To enable and load mod_rewrite, do the rest of steps. +Create a symbolic link in /etc/apache2/mods-enabled +- pi@pi /var/www $ sudo a2enmod rewrite +Then open up the following file, and replace every occurrence of "AllowOverride None" with "AllowOverride all". +- pi@pi /var/www $ sudo nano /etc/apache2/sites-available/default +Finally, restart Apache2. +- pi@pi /var/www $ sudo service apache2 restart + +Error store is writable (not checked) +Solution: +(TODO: Make writeable to group www-data only?) +pi@pi /var/www $ sudo mkdir store +pi@pi /var/www $ chown -R www-data:www-data /var/www/red/ +pi@pi /var/www $ sudo chmod ou+w view + +[b]More[/b] + +Set up a cron job to run the poller once every 15 minutes in order to perform background processing. +- pi@pi /var/www $ which php +Make sure you are in the document root directory of the webserver +- pi@pi /var/www $ cd /var/www/ +Try to execute the poller in order to make sure it works +- pi@pi /var/www $ /usr/bin/php include/poller.php +Create the cronjob +- pi@pi /var/www $ crontab -e +Enter +- */15 * * * * cd /var/www/; /usr/bin/php include/poller.php +- Save and exit. + +Prevent search engines from indexing your search pages. Why? This can cause heavy resource use. + +[code] +php util/config system block_public_search 1 +[/code] + + + +[size=large]5. Keep your Raspberry Pi and your $Projectname up-to-date[/size] + +Git update every day at 4 am and addons at 5 am every day +Try if the command is working +- pi@pi /var/www $ sudo git pull +Create the cronjob +- pi@pi /var/www $ crontab -e +Enter the following to update at 4:01 am every day +- 01 04 * * * cd /var/www/; sudo git pull +Enter the following to update the addons at 5:01 am every day +- 01 05 * * * cd /var/www/addon/; sudo git pull +Enter the following to update the Raspberry Pi (Raspbian OS = Debian) at 6:01 am every day +- 01 06 * * * sudo aptitude -y update && sudo aptitude -y safe-upgrade +Save and exit. + +[size=large]6. Running with SSL[/size] + +Follow the instructions here: +[url=https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL]https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL[/url] + +#include doc/macros/main_footer.bb; diff --git a/doc/roadmap.bb b/doc/roadmap.bb index 9ef9f146a..dce19848a 100644 --- a/doc/roadmap.bb +++ b/doc/roadmap.bb @@ -1,49 +1,28 @@ +Roadmap -Roadmap for $Projectname V3 -*HZ = Hubzilla repository +Platform + Convert E2EE and select Javascript resources to dynamic loading using jQuery.getScript() [or other methods]. -Crypto - Convert E2EE to dynamic loading (on demand) using jQuery.getScript() [or other methods] to only load encryption libs when you require them. This should also support multiple encryption libraries (e.g. SJCL, others) triggered from the choice of algorithm and remain pluggable. +Webpages -Subscriptions and business models - Build enough into core(/addons) to generate income (or at least try and cover costs) out of the box + Make webpage building easy, with point-n-click selectors to build PDLs - Resolve the "every photo has an item" confusion, perhaps every file should also - but only if we can explain it and separate them conceptually. -Migration tools - Friendica importer - Diaspora importer (channel and connection import done, conversations and photos still in progress and waiting for support from Diaspora) +Events -Webpage design UI improvements - If practical, separate "conversation" sub-themes from overall themes so one can choose different conversation and content layouts within a base theme. - Make webpage building easy, with point-n-click selectors to build PDLs - bring back WYSIWYG, which ideally requires a JS abstraction layer so we can use any editor and change it based on mimetype + Recurring events + Integrate Hubzilla events with CalDAV -Social Networking Federation - Friendica native mode? - Pump.io? - Others? -Lists - Create a list object to contain arbitrary things for system use - Create a list object to contain arbitrary things for personal use +Connections -Events - Recurring events + CardDAV integration with abook and profiles -Zot - Provide a way to sync web resources. This could be built on DAV except for preserving resource naming (guids) instead of filenames. -API extensions - More, more, more. +Issues manager -Evangelism - More documentation. More, more, more. - Libzot + Provide easy(easier) channel move (as opposed to channel copy or clone) -DNS abstraction for V3 - Allow a channel to live in an arbitrary "DNS" namespace, for instance "mike@core.hubzilla". Use our directories and zot to find the actual DNS location via redirection. This could potentially allow hubs to be hidden behind tor or alt-roots and accessible only via the matrix. -
\ No newline at end of file diff --git a/doc/roadmap_hz3.md b/doc/roadmap_hz3.md deleted file mode 100644 index a64fb2d5c..000000000 --- a/doc/roadmap_hz3.md +++ /dev/null @@ -1,27 +0,0 @@ - -Hubzilla III -============ - -Due: December 2017 -Codename: - - -Wishlist: - -- Move CalDAV/CardDAV server to core - -- Integrate Hubzilla events with CalDAV - -- Connection 'roles' allows you to select different permission roles for your connections; such as follower, friend, contributor, etc. - -- CardDAV integration with abook and profiles - -- App tray - -- issues manager - -- wiki cloning - -- provide easy channel move (as opposed to channel copy or clone), which is currently supported only by the basic server role. - -- provide RSA keychange operation; which cannot affect the primary identity (which is based on the channel keys), so add a secondary dynamic key pair which will be used for all other operations and can be upgraded or revoked at any time.
\ No newline at end of file diff --git a/doc/roadmapv4.bb b/doc/roadmapv4.bb deleted file mode 100644 index 419cd8d4c..000000000 --- a/doc/roadmapv4.bb +++ /dev/null @@ -1,29 +0,0 @@ -[h1]Project Roadmap V4[/h1] - -[h2]Hubzilla 2.0 - code name "Universal Thunder"[/h2] - -[h3]Project Core Development[/h3] - -Goals/Highlights: - - -Focus on visual website design tools, widgets, and sharing mechanisms - -[x] App organisation. - -[x] Conversion of core application to a composer format living under the namespace "Zotlabs" - -[x] Conversion of Modules to a more general purpose Controllers layout with DB/memory based -controller routing as opposed to filesystem routing. - -[x] (partial) Conversion of core Zot Protocol to a class library - -[x] Abstraction of nomadic identity so that sending/receiving to/from singleton networks to/from any clone works flawlessly - [b]provided[/b] the clone physically connected to that singleton identity is up. - -[h3]Community Development[/h3] - -[x] CalDAV/CardDAV - -E-Commerce - -Auto Updater
\ No newline at end of file diff --git a/doc/schema_development.bb b/doc/schema_development.bb index 3d4c84e85..10832684a 100644 --- a/doc/schema_development.bb +++ b/doc/schema_development.bb @@ -1,78 +1,78 @@ -[b]Red Development - A Guide To The Schema System[/b]
-
-A schema, in a nutshell, is a collection of settings for a bunch of variables to define
-certain elements of a theme. A schema is loaded as though it were part of config.php
-and has access to all the same information. Importantly, this means it is identity aware,
-and can be used to do some interesting things. One could, for example, restrict options
-by service class, or present different options to different members.
-
-By default, we filter only by whether or not expert mode is enabled. If expert mode is
-enabled, all options are presented to the member. If it is not, only scheme, background
-image, font face, and iconset are available as choices.
-
-A schema is loaded *after* the member's personal settings. Therefore, to allow a member
-to overwrite a particular aspect of a schema you would use the following syntax:
-[code]
- if (! $foo)
- $foo = 'bar';
-[/code]
-However, there are circumstances - particularly with positional elements - where it
-may be desirable (or necessary) to override a member's settings. In this case, the syntax
-is even simpler:
-[code]
- $foo = 'bar';
-[/code]
-Members will not thank you for this, however, so only use it when it is required.
-
-If no personal options are set, and no schema is selected, we will first try to load a schema
-with the file name "default.php". This file should never be included with a theme. If it
-is, merge conflicts will occur as people update their code. Rather, this should be defined
-by administrators on a site by site basis.
-default.php and default.css MUST be symlinks to existing scheme files.
-
-You schema does not need to - and should not - contain all of these values. Only the values
-that differ from the defaults should be listed. This gives you some very powerful options
-with very few lines of code.
-
-Note the options available differ with each theme. The options available with the Redbasic
-theme are as follows:
-
-[li] nav_colour
- The colour of the navigation bar. Options are red, black and silver. Alternatively,
- one can set $nav_bg_1, $nav_bg_2, $nav_bg_3 and $nav_bg_4 to provide gradient and
- hover effects.[/li]
-[li] banner_colour
- The font colour of the banner element. Accepts an RGB or Hex value.[/li]
-[li] bgcolour
- Set the body background colour. Accepts an RGB or Hex value.[/li]
-[li] background_image
- Sets a background image. Accepts a URL or path.[/li]
-[li] item_colour
- Set the background colour of items. Accepts an RGB or Hex value.[/li]
-[li] item_opacity
- Set the opacity of items. Accepts a value from 0.01 to 1[/li]
-[li] toolicon_colour
- Set the colour of tool icons. Accepts an RGB or Hex value.[/li]
-[li] toolicon_activecolour
- Set the colour of active or hovered icon tools.[/li]
-[li] font_size
- Set the size of fonts in items and posts. Accepts px or em.[/li]
-[li] body_font_size
- Sets the size of fonts at the body level. Accepts px or em.[/li]
-[li] font_colour
- Sets the font colour. Accepts an RGB or Hex value.[/li]
-[li] radius
- Set the radius of corners. Accepts a numeral, and is always in px.[/li]
-[li] shadow
- Set the size of shadows shown with inline images. Accepts a numerical
- value. Note shadows are not applied to smileys.[/li]
-[li] converse_width
- Set the maximum width of the content region in px.[/li]
-[li] nav_min_opacity[/li]
-[li] top_photo[/li]
-[li] reply_photo[/li]
-
-If a your_schema_name.css file is found, the content of this file will be attached to the end of style.css.
-This gives the schem developer the possiblity to override any style component.
-
-#include doc/macros/main_footer.bb;
+[b]Red Development - A Guide To The Schema System[/b] + +A schema, in a nutshell, is a collection of settings for a bunch of variables to define +certain elements of a theme. A schema is loaded as though it were part of config.php +and has access to all the same information. Importantly, this means it is identity aware, +and can be used to do some interesting things. One could, for example, restrict options +by service class, or present different options to different members. + +By default, we filter only by whether or not expert mode is enabled. If expert mode is +enabled, all options are presented to the member. If it is not, only scheme, background +image, font face, and iconset are available as choices. + +A schema is loaded *after* the member's personal settings. Therefore, to allow a member +to overwrite a particular aspect of a schema you would use the following syntax: +[code] + if (! $foo) + $foo = 'bar'; +[/code] +However, there are circumstances - particularly with positional elements - where it +may be desirable (or necessary) to override a member's settings. In this case, the syntax +is even simpler: +[code] + $foo = 'bar'; +[/code] +Members will not thank you for this, however, so only use it when it is required. + +If no personal options are set, and no schema is selected, we will first try to load a schema +with the file name "default.php". This file should never be included with a theme. If it +is, merge conflicts will occur as people update their code. Rather, this should be defined +by administrators on a site by site basis. +default.php and default.css MUST be symlinks to existing scheme files. + +You schema does not need to - and should not - contain all of these values. Only the values +that differ from the defaults should be listed. This gives you some very powerful options +with very few lines of code. + +Note the options available differ with each theme. The options available with the Redbasic +theme are as follows: + +[li] nav_colour + The colour of the navigation bar. Options are red, black and silver. Alternatively, + one can set $nav_bg_1, $nav_bg_2, $nav_bg_3 and $nav_bg_4 to provide gradient and + hover effects.[/li] +[li] banner_colour + The font colour of the banner element. Accepts an RGB or Hex value.[/li] +[li] bgcolour + Set the body background colour. Accepts an RGB or Hex value.[/li] +[li] background_image + Sets a background image. Accepts a URL or path.[/li] +[li] item_colour + Set the background colour of items. Accepts an RGB or Hex value.[/li] +[li] item_opacity + Set the opacity of items. Accepts a value from 0.01 to 1[/li] +[li] toolicon_colour + Set the colour of tool icons. Accepts an RGB or Hex value.[/li] +[li] toolicon_activecolour + Set the colour of active or hovered icon tools.[/li] +[li] font_size + Set the size of fonts in items and posts. Accepts px or em.[/li] +[li] body_font_size + Sets the size of fonts at the body level. Accepts px or em.[/li] +[li] font_colour + Sets the font colour. Accepts an RGB or Hex value.[/li] +[li] radius + Set the radius of corners. Accepts a numeral, and is always in px.[/li] +[li] shadow + Set the size of shadows shown with inline images. Accepts a numerical + value. Note shadows are not applied to smileys.[/li] +[li] converse_width + Set the maximum width of the content region in px.[/li] +[li] nav_min_opacity[/li] +[li] top_photo[/li] +[li] reply_photo[/li] + +If a your_schema_name.css file is found, the content of this file will be attached to the end of style.css. +This gives the schem developer the possiblity to override any style component. + +#include doc/macros/main_footer.bb; diff --git a/doc/sv/main.bb b/doc/sv/main.bb index 1c6ad3f63..e304a84cd 100644 --- a/doc/sv/main.bb +++ b/doc/sv/main.bb @@ -1,80 +1,80 @@ -[img][baseurl]/images/hubzilla-banner.png[/img]
-
-[zrl=[baseurl]/help/about][b]Vad är $Projectname?[/b][/zrl]
-$Projectname är en decentraliserad publicerings- och kommunikationsplattform som möjliggör att du behåller kontrollen över dina kommunikationer med hjälp av automatisk kryptering och fininställbar behörighetskontroll. Det är du, och bara du, som beslutar vem som är behörig att ta del av ditt innehåll.
-
-[zrl=[baseurl]/help/features][b]$Projectname funktioner[/b][/zrl]
-$Projectname används redan och bildar ett globalt distribuerad närverk och bevisar* dagligen sin skalbarhet och diversitet i allt från installationer med en kanal till installationer med många användare och många kanaler med en stor mängd innehåll.
-Föreställ dig isolerade familjekommunikationsplatformer, distribuerade nätforum med fildelning, hjälpforum, bloggar och hemsidor. Eller proffesionellt anpassade innehållsleverantörer med kommersiella premium* kanaler och målriktat innehållsstyrning. Vad du än önskar så finns $Projectname för att stödja dig i förverkligande av din kreativitet.
-
-[zrl=[baseurl]/help/what_is_zot][b]Har du Zot? Skaffa det, direkt.[/b][/zrl]
-Zot är en fantastisk ny kommunikationsprotokoll uppfunnit speciellt för $Projectname. Som medlem är du inte längre bunden till en enskild sida eller hub tack vara "nomadiska identiteter". Flytt lätt till en annan server och håll dina kontakter och förbindelser intakta eller klona och kör den samma kanal på flera servrar simultant. I tillfälle av att en av dem stänger ner så går du inte miste om något. Plus när du är loggat in i $Projectname så är det inga flera inloggningar även när du kontakter andra hubbar i nätverket. Zot är det som gör $Projectname till något särskilt värdefullt/som urskiljer $Projectname från mängden.
-
-[h3]Kom igång[/h3]
-[zrl=[baseurl]/help/Privacy]Privacy Policy[/zrl]
-[zrl=[baseurl]/help/registration]Account Registration[/zrl]
-[zrl=[baseurl]/help/accounts_profiles_channels_basics]You at $Projectname: accounts, profiles and channels in short[/zrl]
-[zrl=[baseurl]/help/profiles]Profiles[/zrl]
-[zrl=[baseurl]/help/channels]Channels[/zrl]
-[zrl=[baseurl]/help/sv/roles]Behörighetsförval för kanaler[/zrl]
-[zrl=[baseurl]/help/first-post]Your first posting[/zrl]
-[zrl=[baseurl]/help/connecting_to_channels]Connecting To Other Channels[/zrl]
-[zrl=[baseurl]/help/permissions]Permissions And Encryption: You Are In Control[/zrl]
-[zrl=[baseurl]/help/cloud]Cloud Storage[/zrl]
-[zrl=[baseurl]/help/remove_account]Remove Channel or Account[/zrl]
-
-[h3]Hjälp till medlemmar[/h3]
-[zrl=[baseurl]/help/tags_and_mentions]Tags and Mentions[/zrl]
-[zrl=[baseurl]/help/webpages]Web Pages[/zrl]
-[zrl=[baseurl]/help/bbcode]BBcode reference for posts and comments[/zrl]
-[zrl=[baseurl]/help/checking_account_quota_usage]Checking Account Quota Usage[/zrl]
-[zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl]
-[zrl=[baseurl]/help/AdvancedSearch]Advanced Directory Search[/zrl]
-[zrl=[baseurl]/help/addons]Help With Addons[/zrl]
-[zrl=[baseurl]/help/diaspora_compat]Diaspora Communications Compatibility (Diaspora and Friendica)[/zrl]
-[zrl=[baseurl]/help/faq_members]FAQ For Members[/zrl]
-
-[h3]Hjälp till administratorer[/h3]
-[zrl=[baseurl]/help/install]Install[/zrl]
-[zrl=[baseurl]/help/debian_install]Easy Install on Debian via script[/zrl]
-[zrl=[baseurl]/help/red2pi]Installing Red on the Raspberry Pi[/zrl]
-[zrl=[baseurl]/help/troubleshooting]Troubleshooting Tips[/zrl]
-[zrl=[baseurl]/help/hidden_configs]Tweaking $Projectname's Hidden Configurations[/zrl]
-[zrl=[baseurl]/help/faq_admins]FAQ For Admins[/zrl]
-
-[h3]Teknisk dokumentation[/h3]
-[zrl=[baseurl]/help/Zot---A-High-Level-Overview]A high level overview of Zot[/zrl]
-[zrl=[baseurl]/help/zot]An introduction to Zot[/zrl]
-[zrl=[baseurl]/help/zot_structures]Zot Stuctures[/zrl]
-[zrl=[baseurl]/help/comanche]Comanche Page Descriptions[/zrl]
-[zrl=[baseurl]/help/Creating-Templates]Creating Comanche Templates[/zrl]
-[zrl=[baseurl]/help/Widgets]Core Widgets[/zrl]
-[zrl=[baseurl]/help/plugins]Plugins[/zrl]
-[zrl=[baseurl]/help/doco]Contributing Documentation[/zrl]
-[zrl=[baseurl]/help/DerivedTheme1]Creating Derivative Themes[/zrl]
-[zrl=[baseurl]/help/schema_development]Schemas[/zrl]
-[zrl=[baseurl]/help/Translations]Translations[/zrl]
-[zrl=[baseurl]/help/developers]Developers[/zrl]
-[zrl=[baseurl]/help/intro_for_developers]Intro for Developers[/zrl]
-[zrl=[baseurl]/help/api_functions]API functions[/zrl]
-[zrl=[baseurl]/help/api_posting]Posting to the red# using the API[/zrl]
-[zrl=[baseurl]/help/developer_function_primer]Red Functions 101[/zrl]
-[zrl=[baseurl]/doc/html/]Code Reference (doxygen generated - sets cookies)[/zrl]
-[zrl=[baseurl]/help/to_do_doco]To-Do list for the Red Documentation Project[/zrl]
-[zrl=[baseurl]/help/to_do_code]To-Do list for Developers[/zrl]
-[zrl=[baseurl]/help/roadmap]Version 3 roadmap[/zrl]
-[zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl]
-[zrl=[baseurl]/help/dev_beginner]Sep-for-step manual for beginning developers[/zrl]
-
-[h3]Externa resurser[/h3]
-[zrl=[baseurl]/help/external-resource-links]External Resource Links[/zrl]
-[url=https://github.com/friendica/red]Main Website[/url]
-[url=https://github.com/friendica/red-addons]Addon Website[/url]
-[url=https://zothub.com/channel/one]Development Channel[/url]
-
-[url=[baseurl]/help/credits]$Projectname Credits[/url]
-
-[h3]About This $Projectname Hub[/h3]
-[zrl=[baseurl]/help/TermsOfService]Terms of Service For This Hub[/zrl]
-[zrl=[baseurl]/siteinfo]Hub Information (/siteinfo)[/zrl]
-[zrl=[baseurl]/siteinfo_json]Detailed Technical Hub Information (/siteinfo_json)[/zrl]
+[img][baseurl]/images/hubzilla-banner.png[/img] + +[zrl=[baseurl]/help/about][b]Vad är $Projectname?[/b][/zrl] +$Projectname är en decentraliserad publicerings- och kommunikationsplattform som möjliggör att du behåller kontrollen över dina kommunikationer med hjälp av automatisk kryptering och fininställbar behörighetskontroll. Det är du, och bara du, som beslutar vem som är behörig att ta del av ditt innehåll. + +[zrl=[baseurl]/help/features][b]$Projectname funktioner[/b][/zrl] +$Projectname används redan och bildar ett globalt distribuerad närverk och bevisar* dagligen sin skalbarhet och diversitet i allt från installationer med en kanal till installationer med många användare och många kanaler med en stor mängd innehåll. +Föreställ dig isolerade familjekommunikationsplatformer, distribuerade nätforum med fildelning, hjälpforum, bloggar och hemsidor. Eller proffesionellt anpassade innehållsleverantörer med kommersiella premium* kanaler och målriktat innehållsstyrning. Vad du än önskar så finns $Projectname för att stödja dig i förverkligande av din kreativitet. + +[zrl=[baseurl]/help/what_is_zot][b]Har du Zot? Skaffa det, direkt.[/b][/zrl] +Zot är en fantastisk ny kommunikationsprotokoll uppfunnit speciellt för $Projectname. Som medlem är du inte längre bunden till en enskild sida eller hub tack vara "nomadiska identiteter". Flytt lätt till en annan server och håll dina kontakter och förbindelser intakta eller klona och kör den samma kanal på flera servrar simultant. I tillfälle av att en av dem stänger ner så går du inte miste om något. Plus när du är loggat in i $Projectname så är det inga flera inloggningar även när du kontakter andra hubbar i nätverket. Zot är det som gör $Projectname till något särskilt värdefullt/som urskiljer $Projectname från mängden. + +[h3]Kom igång[/h3] +[zrl=[baseurl]/help/Privacy]Privacy Policy[/zrl] +[zrl=[baseurl]/help/registration]Account Registration[/zrl] +[zrl=[baseurl]/help/accounts_profiles_channels_basics]You at $Projectname: accounts, profiles and channels in short[/zrl] +[zrl=[baseurl]/help/profiles]Profiles[/zrl] +[zrl=[baseurl]/help/channels]Channels[/zrl] +[zrl=[baseurl]/help/sv/roles]Behörighetsförval för kanaler[/zrl] +[zrl=[baseurl]/help/first-post]Your first posting[/zrl] +[zrl=[baseurl]/help/connecting_to_channels]Connecting To Other Channels[/zrl] +[zrl=[baseurl]/help/permissions]Permissions And Encryption: You Are In Control[/zrl] +[zrl=[baseurl]/help/cloud]Cloud Storage[/zrl] +[zrl=[baseurl]/help/remove_account]Remove Channel or Account[/zrl] + +[h3]Hjälp till medlemmar[/h3] +[zrl=[baseurl]/help/tags_and_mentions]Tags and Mentions[/zrl] +[zrl=[baseurl]/help/webpages]Web Pages[/zrl] +[zrl=[baseurl]/help/bbcode]BBcode reference for posts and comments[/zrl] +[zrl=[baseurl]/help/checking_account_quota_usage]Checking Account Quota Usage[/zrl] +[zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl] +[zrl=[baseurl]/help/AdvancedSearch]Advanced Directory Search[/zrl] +[zrl=[baseurl]/help/addons]Help With Addons[/zrl] +[zrl=[baseurl]/help/diaspora_compat]Diaspora Communications Compatibility (Diaspora and Friendica)[/zrl] +[zrl=[baseurl]/help/faq_members]FAQ For Members[/zrl] + +[h3]Hjälp till administratorer[/h3] +[zrl=[baseurl]/help/install]Install[/zrl] +[zrl=[baseurl]/help/debian_install]Easy Install on Debian via script[/zrl] +[zrl=[baseurl]/help/red2pi]Installing Red on the Raspberry Pi[/zrl] +[zrl=[baseurl]/help/troubleshooting]Troubleshooting Tips[/zrl] +[zrl=[baseurl]/help/hidden_configs]Tweaking $Projectname's Hidden Configurations[/zrl] +[zrl=[baseurl]/help/faq_admins]FAQ For Admins[/zrl] + +[h3]Teknisk dokumentation[/h3] +[zrl=[baseurl]/help/Zot---A-High-Level-Overview]A high level overview of Zot[/zrl] +[zrl=[baseurl]/help/zot]An introduction to Zot[/zrl] +[zrl=[baseurl]/help/zot_structures]Zot Stuctures[/zrl] +[zrl=[baseurl]/help/comanche]Comanche Page Descriptions[/zrl] +[zrl=[baseurl]/help/Creating-Templates]Creating Comanche Templates[/zrl] +[zrl=[baseurl]/help/Widgets]Core Widgets[/zrl] +[zrl=[baseurl]/help/plugins]Plugins[/zrl] +[zrl=[baseurl]/help/doco]Contributing Documentation[/zrl] +[zrl=[baseurl]/help/DerivedTheme1]Creating Derivative Themes[/zrl] +[zrl=[baseurl]/help/schema_development]Schemas[/zrl] +[zrl=[baseurl]/help/Translations]Translations[/zrl] +[zrl=[baseurl]/help/developers]Developers[/zrl] +[zrl=[baseurl]/help/intro_for_developers]Intro for Developers[/zrl] +[zrl=[baseurl]/help/api_functions]API functions[/zrl] +[zrl=[baseurl]/help/api_posting]Posting to the red# using the API[/zrl] +[zrl=[baseurl]/help/developer_function_primer]Red Functions 101[/zrl] +[zrl=[baseurl]/doc/html/]Code Reference (doxygen generated - sets cookies)[/zrl] +[zrl=[baseurl]/help/to_do_doco]To-Do list for the Red Documentation Project[/zrl] +[zrl=[baseurl]/help/to_do_code]To-Do list for Developers[/zrl] +[zrl=[baseurl]/help/roadmap]Version 3 roadmap[/zrl] +[zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl] +[zrl=[baseurl]/help/dev_beginner]Sep-for-step manual for beginning developers[/zrl] + +[h3]Externa resurser[/h3] +[zrl=[baseurl]/help/external-resource-links]External Resource Links[/zrl] +[url=https://github.com/friendica/red]Main Website[/url] +[url=https://github.com/friendica/red-addons]Addon Website[/url] +[url=https://zothub.com/channel/one]Development Channel[/url] + +[url=[baseurl]/help/credits]$Projectname Credits[/url] + +[h3]About This $Projectname Hub[/h3] +[zrl=[baseurl]/help/TermsOfService]Terms of Service For This Hub[/zrl] +[zrl=[baseurl]/siteinfo]Hub Information (/siteinfo)[/zrl] +[zrl=[baseurl]/siteinfo_json]Detailed Technical Hub Information (/siteinfo_json)[/zrl] diff --git a/include/connections.php b/include/connections.php index 5a9e31950..20f7c24ff 100644 --- a/include/connections.php +++ b/include/connections.php @@ -373,23 +373,24 @@ function contact_remove($channel_id, $abook_id) { if(intval($abook['abook_self'])) return false; - $r = q("select id from item where (owner_xchan = '%s' or author_xchan = '%s') and uid = %d and item_retained = 0 and item_starred = 0", dbesc($abook['abook_xchan']), dbesc($abook['abook_xchan']), intval($channel_id) ); if($r) { - $r = fetch_post_tags($r,true); - foreach($r as $rr) { - $terms = get_terms_oftype($item['term'],TERM_FILE); - if(! $terms) { - drop_item($rr['id'],false); + $x = q("select uid from term where otype = %d and oid = %d ttype = %d limit 1", + intval(TERM_OBJ_POST), + intval($rr['id']), + intval(TERM_FILE) + ); + if($x) { + continue; } + drop_item($rr['id'],false); } } - q("delete from abook where abook_id = %d and abook_channel = %d", intval($abook['abook_id']), diff --git a/include/items.php b/include/items.php index 54df5d322..8e7a8df34 100755 --- a/include/items.php +++ b/include/items.php @@ -19,9 +19,10 @@ require_once('include/permissions.php'); * * @param array $item * @param[out] boolean $private_envelope + * @param boolean $include_groups * @return array containing the recipients */ -function collect_recipients($item, &$private_envelope) { +function collect_recipients($item, &$private_envelope,$include_groups = true) { require_once('include/group.php'); @@ -34,7 +35,12 @@ function collect_recipients($item, &$private_envelope) { $allow_people = expand_acl($item['allow_cid']); - $allow_groups = expand_groups(expand_acl($item['allow_gid'])); + if($include_groups) { + $allow_groups = expand_groups(expand_acl($item['allow_gid'])); + } + else { + $allow_groups = []; + } $recipients = array_unique(array_merge($allow_people,$allow_groups)); @@ -2948,6 +2954,18 @@ function start_delivery_chain($channel, $item, $item_id, $parent) { } } } + + // This will change the author to the post owner. Useful for RSS feeds which are to be syndicated + // to federated platforms which can't verify the identity of the author. + // This MAY cause you to run afoul of copyright law. + + $rewrite_author = intval(get_abconfig($channel['channel_id'],$item['owner_xchan'],'system','rself')); + if($rewrite_author) { + $item['author_xchan'] = $item['owner_xchan']; + if($item['owner']) { + $item['author'] = $item['owner']; + } + } } // Change this copy of the post to a forum head message and deliver to all the tgroup members @@ -3008,8 +3026,6 @@ function start_delivery_chain($channel, $item, $item_id, $parent) { ); - - if($r) Zotlabs\Daemon\Master::Summon(array('Notifier','tgroup',$item_id)); else { diff --git a/view/nl/hmessages.po b/view/nl/hmessages.po index 5d22d74a5..c98121122 100644 --- a/view/nl/hmessages.po +++ b/view/nl/hmessages.po @@ -8378,7 +8378,7 @@ msgstr "Afleveringsrapport" msgid "%d comment" msgid_plural "%d comments" msgstr[0] "%d reactie" -msgstr[1] "%d reacties getoond" +msgstr[1] "%d reacties" #: ../../Zotlabs/Lib/ThreadItem.php:343 ../../Zotlabs/Lib/ThreadItem.php:344 #, php-format diff --git a/view/nl/hstrings.php b/view/nl/hstrings.php index 07ecb0602..3581950aa 100644 --- a/view/nl/hstrings.php +++ b/view/nl/hstrings.php @@ -1816,7 +1816,7 @@ App::$strings["share"] = "delen"; App::$strings["Delivery Report"] = "Afleveringsrapport"; App::$strings["%d comment"] = array( 0 => "%d reactie", - 1 => "%d reacties getoond", + 1 => "%d reacties", ); App::$strings["View %s's profile - %s"] = "Profiel van %s bekijken - %s"; App::$strings["to"] = "aan"; diff --git a/view/tpl/admin_hubloc.tpl b/view/tpl/admin_hubloc.tpl deleted file mode 100755 index 1bd1f0122..000000000 --- a/view/tpl/admin_hubloc.tpl +++ /dev/null @@ -1,27 +0,0 @@ -<div class="generic-content-wrapper-styled" id='adminpage'> - <h1>{{$title}} - {{$page}}</h1> - - <table id='server'> - <thead> - <tr> - {{foreach $th_hubloc as $th}}<th>{{$th}}</th>{{/foreach}} - </tr> - </thead> - <tbody> - - {{foreach $hubloc as $hub}}<tr> - <td>{{$hub.hubloc_id}}</td><td>{{$hub.hubloc_addr}}</td><td>{{$hub.hubloc_host}}</td><td>{{$hub.hubloc_status}}</td> - <td> - <form action="{{$baseurl}}/admin/hubloc" method="post"> - <input type="hidden" name="hublocid" value="{{$hub.hubloc_id}}"> - <input type='hidden' name='form_security_token' value='{{$form_security_token}}'> - <input type='hidden' name='url' value='{{$hub.hubloc_host}}'> - <input type="submit" name="check" value="check" > - <input type="submit" name="repair" value="repair" ></td> - </form> - </tr>{{/foreach}} - </tbody> - </table> - - -</div> diff --git a/view/tpl/api_config_xml.tpl b/view/tpl/api_config_xml.tpl deleted file mode 100755 index 8c0766c73..000000000 --- a/view/tpl/api_config_xml.tpl +++ /dev/null @@ -1,66 +0,0 @@ -<config> - <site> - <name>{{$config.site.name}}</name> - <server>{{$config.site.server}}</server> - <theme>default</theme> - <path></path> - <logo>{{$config.site.logo}}</logo> - - <fancy>true</fancy> - <language>en</language> - <email>{{$config.site.email}}</email> - <broughtby></broughtby> - <broughtbyurl></broughtbyurl> - <timezone>UTC</timezone> - <closed>{{$config.site.closed}}</closed> - - <inviteonly>false</inviteonly> - <private>{{$config.site.private}}</private> - <textlimit>{{$config.site.textlimit}}</textlimit> - <ssl>{{$config.site.ssl}}</ssl> - <sslserver>{{$config.site.sslserver}}</sslserver> - <shorturllength>30</shorturllength> - -</site> - <license> - <type>cc</type> - <owner></owner> - <url>http://creativecommons.org/licenses/by/3.0/</url> - <title>Creative Commons Attribution 3.0</title> - <image>http://i.creativecommons.org/l/by/3.0/80x15.png</image> - -</license> - <nickname> - <featured></featured> -</nickname> - <profile> - <biolimit></biolimit> -</profile> - <group> - <desclimit></desclimit> -</group> - <notice> - - <contentlimit></contentlimit> -</notice> - <throttle> - <enabled>false</enabled> - <count>20</count> - <timespan>600</timespan> -</throttle> - <xmpp> - - <enabled>false</enabled> - <server>INVALID SERVER</server> - <port>5222</port> - <user>update</user> -</xmpp> - <integration> - <source>StatusNet</source> - -</integration> - <attachments> - <uploads>false</uploads> - <file_quota>0</file_quota> -</attachments> -</config> diff --git a/view/tpl/api_friends_xml.tpl b/view/tpl/api_friends_xml.tpl deleted file mode 100755 index f2a7234d1..000000000 --- a/view/tpl/api_friends_xml.tpl +++ /dev/null @@ -1,5 +0,0 @@ -<users type="array"> - {{foreach $users as $user}} - {{include file="api_user_xml.tpl"}} - {{/foreach}} -</users> diff --git a/view/tpl/api_ratelimit_xml.tpl b/view/tpl/api_ratelimit_xml.tpl deleted file mode 100755 index e4b470a25..000000000 --- a/view/tpl/api_ratelimit_xml.tpl +++ /dev/null @@ -1,6 +0,0 @@ -<hash> - <remaining-hits type="integer">{{$hash.remaining_hits}}</remaining-hits> - <hourly-limit type="integer">{{$hash.hourly_limit}}</hourly-limit> - <reset-time type="datetime">{{$hash.reset_time}}</reset-time> - <reset_time_in_seconds type="integer">{{$hash.resettime_in_seconds}}</reset_time_in_seconds> -</hash> diff --git a/view/tpl/api_status_xml.tpl b/view/tpl/api_status_xml.tpl deleted file mode 100755 index cbb736e22..000000000 --- a/view/tpl/api_status_xml.tpl +++ /dev/null @@ -1,46 +0,0 @@ -<status>{{if $status}} - <created_at>{{$status.created_at}}</created_at> - <id>{{$status.id}}</id> - <text>{{$status.text}}</text> - <source>{{$status.source}}</source> - <truncated>{{$status.truncated}}</truncated> - <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id> - <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id> - <favorited>{{$status.favorited}}</favorited> - <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name> - <geo>{{$status.geo}}</geo> - <coordinates>{{$status.coordinates}}</coordinates> - <place>{{$status.place}}</place> - <contributors>{{$status.contributors}}</contributors> - <user> - <id>{{$status.user.id}}</id> - <name>{{$status.user.name}}</name> - <screen_name>{{$status.user.screen_name}}</screen_name> - <location>{{$status.user.location}}</location> - <description>{{$status.user.description}}</description> - <profile_image_url>{{$status.user.profile_image_url}}</profile_image_url> - <url>{{$status.user.url}}</url> - <protected>{{$status.user.protected}}</protected> - <followers_count>{{$status.user.followers}}</followers_count> - <profile_background_color>{{$status.user.profile_background_color}}</profile_background_color> - <profile_text_color>{{$status.user.profile_text_color}}</profile_text_color> - <profile_link_color>{{$status.user.profile_link_color}}</profile_link_color> - <profile_sidebar_fill_color>{{$status.user.profile_sidebar_fill_color}}</profile_sidebar_fill_color> - <profile_sidebar_border_color>{{$status.user.profile_sidebar_border_color}}</profile_sidebar_border_color> - <friends_count>{{$status.user.friends_count}}</friends_count> - <created_at>{{$status.user.created_at}}</created_at> - <favourites_count>{{$status.user.favourites_count}}</favourites_count> - <utc_offset>{{$status.user.utc_offset}}</utc_offset> - <time_zone>{{$status.user.time_zone}}</time_zone> - <profile_background_image_url>{{$status.user.profile_background_image_url}}</profile_background_image_url> - <profile_background_tile>{{$status.user.profile_background_tile}}</profile_background_tile> - <profile_use_background_image>{{$status.user.profile_use_background_image}}</profile_use_background_image> - <notifications></notifications> - <geo_enabled>{{$status.user.geo_enabled}}</geo_enabled> - <verified>{{$status.user.verified}}</verified> - <following></following> - <statuses_count>{{$status.user.statuses_count}}</statuses_count> - <lang>{{$status.user.lang}}</lang> - <contributors_enabled>{{$status.user.contributors_enabled}}</contributors_enabled> - </user> -{{/if}}</status> diff --git a/view/tpl/api_test_xml.tpl b/view/tpl/api_test_xml.tpl deleted file mode 100755 index 80a541c39..000000000 --- a/view/tpl/api_test_xml.tpl +++ /dev/null @@ -1 +0,0 @@ -<ok>{{$ok}}</ok> diff --git a/view/tpl/api_timeline_atom.tpl b/view/tpl/api_timeline_atom.tpl deleted file mode 100755 index e8bfb689e..000000000 --- a/view/tpl/api_timeline_atom.tpl +++ /dev/null @@ -1,90 +0,0 @@ -<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/"> - <generator uri="http://status.net" version="0.9.7">StatusNet</generator> - <id>{{$rss.self}}</id> - <title>Friendika</title> - <subtitle>Friendika API feed</subtitle> - <logo>{{$rss.logo}}</logo> - <updated>{{$rss.atom_updated}}</updated> - <link type="text/html" rel="alternate" href="{{$rss.alternate}}"/> - <link type="application/atom+xml" rel="self" href="{{$rss.self}}"/> - - - <author> - <activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type> - <uri>{{$user.url}}</uri> - <name>{{$user.name}}</name> - <link rel="alternate" type="text/html" href="{{$user.url}}"/> - <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/> - <georss:point></georss:point> - <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername> - <poco:displayName>{{$user.name}}</poco:displayName> - <poco:urls> - <poco:type>homepage</poco:type> - <poco:value>{{$user.url}}</poco:value> - <poco:primary>true</poco:primary> - </poco:urls> - <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info> - </author> - - <!--Deprecation warning: activity:subject is present only for backward compatibility. It will be removed in the next version of StatusNet.--> - <activity:subject> - <activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type> - <id>{{$user.contact_url}}</id> - <title>{{$user.name}}</title> - <link rel="alternate" type="text/html" href="{{$user.url}}"/> - <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/> - <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/> - <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername> - <poco:displayName>{{$user.name}}</poco:displayName> - <poco:urls> - <poco:type>homepage</poco:type> - <poco:value>{{$user.url}}</poco:value> - <poco:primary>true</poco:primary> - </poco:urls> - <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info> - </activity:subject> - - - {{foreach $statuses as $status}} - <entry> - <activity:obj_type>{{$status.objecttype}}</activity:obj_type> - <id>{{$status.message_id}}</id> - <title>{{$status.text}}</title> - <content type="html">{{$status.statusnet_html}}</content> - <link rel="alternate" type="text/html" href="{{$status.url}}"/> - <activity:verb>{{$status.verb}}</activity:verb> - <published>{{$status.published}}</published> - <updated>{{$status.updated}}</updated> - - <link rel="self" type="application/atom+xml" href="{{$status.self}}"/> - <link rel="edit" type="application/atom+xml" href="{{$status.edit}}"/> - <statusnet:notice_info local_id="{{$status.id}}" source="{{$status.source}}" > - </statusnet:notice_info> - - <author> - <activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type> - <uri>{{$status.user.url}}</uri> - <name>{{$status.user.name}}</name> - <link rel="alternate" type="text/html" href="{{$status.user.url}}"/> - <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$status.user.profile_image_url}}"/> - - <georss:point/> - <poco:preferredUsername>{{$status.user.screen_name}}</poco:preferredUsername> - <poco:displayName>{{$status.user.name}}</poco:displayName> - <poco:address/> - <poco:urls> - <poco:type>homepage</poco:type> - <poco:value>{{$status.user.url}}</poco:value> - <poco:primary>true</poco:primary> - </poco:urls> - </author> - <link rel="ostatus:conversation" type="text/html" href="{{$status.url}}"/> - - </entry> - {{/foreach}} -</feed> diff --git a/view/tpl/api_timeline_rss.tpl b/view/tpl/api_timeline_rss.tpl deleted file mode 100755 index 86c645e99..000000000 --- a/view/tpl/api_timeline_rss.tpl +++ /dev/null @@ -1,26 +0,0 @@ -<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:georss="http://www.georss.org/georss" xmlns:twitter="http://api.twitter.com"> - <channel> - <title>Friendika</title> - <link>{{$rss.alternate}}</link> - <atom:link type="application/rss+xml" rel="self" href="{{$rss.self}}"/> - <description>Friendika timeline</description> - <language>{{$rss.language}}</language> - <ttl>40</ttl> - <image> - <link>{{$user.link}}</link> - <title>{{$user.name}}'s items</title> - <url>{{$user.profile_image_url}}</url> - </image> - -{{foreach $statuses as $status}} - <item> - <title>{{$status.user.name}}: {{$status.text}}</title> - <description>{{$status.text}}</description> - <pubDate>{{$status.created_at}}</pubDate> - <guid>{{$status.url}}</guid> - <link>{{$status.url}}</link> - <twitter:source>{{$status.source}}</twitter:source> - </item> -{{/foreach}} - </channel> -</rss> diff --git a/view/tpl/api_timeline_xml.tpl b/view/tpl/api_timeline_xml.tpl deleted file mode 100755 index f14d73e9c..000000000 --- a/view/tpl/api_timeline_xml.tpl +++ /dev/null @@ -1,20 +0,0 @@ -<statuses type="array" xmlns:statusnet="http://status.net/schema/api/1/"> -{{foreach $statuses as $status}} <status> - <text>{{$status.text}}</text> - <truncated>{{$status.truncated}}</truncated> - <created_at>{{$status.created_at}}</created_at> - <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id> - <source>{{$status.source}}</source> - <id>{{$status.id}}</id> - <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id> - <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name> - <geo>{{$status.geo}}</geo> - <favorited>{{$status.favorited}}</favorited> -{{include file="api_user_xml.tpl" user=$status.user}} <statusnet:html>{{$status.statusnet_html}}</statusnet:html> - <statusnet:conversation_id>{{$status.statusnet_conversation_id}}</statusnet:conversation_id> - <url>{{$status.url}}</url> - <coordinates>{{$status.coordinates}}</coordinates> - <place>{{$status.place}}</place> - <contributors>{{$status.contributors}}</contributors> - </status> -{{/foreach}}</statuses> diff --git a/view/tpl/api_user_xml.tpl b/view/tpl/api_user_xml.tpl deleted file mode 100755 index 3b51992f6..000000000 --- a/view/tpl/api_user_xml.tpl +++ /dev/null @@ -1,46 +0,0 @@ - <user> - <id>{{$user.id}}</id> - <name>{{$user.name}}</name> - <screen_name>{{$user.screen_name}}</screen_name> - <location>{{$user.location}}</location> - <description>{{$user.description}}</description> - <profile_image_url>{{$user.profile_image_url}}</profile_image_url> - <url>{{$user.url}}</url> - <protected>{{$user.protected}}</protected> - <followers_count>{{$user.followers_count}}</followers_count> - <friends_count>{{$user.friends_count}}</friends_count> - <created_at>{{$user.created_at}}</created_at> - <favourites_count>{{$user.favourites_count}}</favourites_count> - <utc_offset>{{$user.utc_offset}}</utc_offset> - <time_zone>{{$user.time_zone}}</time_zone> - <statuses_count>{{$user.statuses_count}}</statuses_count> - <following>{{$user.following}}</following> - <profile_background_color>{{$user.profile_background_color}}</profile_background_color> - <profile_text_color>{{$user.profile_text_color}}</profile_text_color> - <profile_link_color>{{$user.profile_link_color}}</profile_link_color> - <profile_sidebar_fill_color>{{$user.profile_sidebar_fill_color}}</profile_sidebar_fill_color> - <profile_sidebar_border_color>{{$user.profile_sidebar_border_color}}</profile_sidebar_border_color> - <profile_background_image_url>{{$user.profile_background_image_url}}</profile_background_image_url> - <profile_background_tile>{{$user.profile_background_tile}}</profile_background_tile> - <profile_use_background_image>{{$user.profile_use_background_image}}</profile_use_background_image> - <notifications>{{$user.notifications}}</notifications> - <geo_enabled>{{$user.geo_enabled}}</geo_enabled> - <verified>{{$user.verified}}</verified> - <lang>{{$user.lang}}</lang> - <contributors_enabled>{{$user.contributors_enabled}}</contributors_enabled> - <status>{{if $user.status}} - <created_at>{{$user.status.created_at}}</created_at> - <id>{{$user.status.id}}</id> - <text>{{$user.status.text}}</text> - <source>{{$user.status.source}}</source> - <truncated>{{$user.status.truncated}}</truncated> - <in_reply_to_status_id>{{$user.status.in_reply_to_status_id}}</in_reply_to_status_id> - <in_reply_to_user_id>{{$user.status.in_reply_to_user_id}}</in_reply_to_user_id> - <favorited>{{$user.status.favorited}}</favorited> - <in_reply_to_screen_name>{{$user.status.in_reply_to_screen_name}}</in_reply_to_screen_name> - <geo>{{$user.status.geo}}</geo> - <coordinates>{{$user.status.coordinates}}</coordinates> - <place>{{$user.status.place}}</place> - <contributors>{{$user.status.contributors}}</contributors> - {{/if}}</status> - </user> diff --git a/view/tpl/birthdays_reminder.tpl b/view/tpl/birthdays_reminder.tpl deleted file mode 100755 index d0500364a..000000000 --- a/view/tpl/birthdays_reminder.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{if $count}} -<div id="birthday-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('birthday-wrapper');">{{$event_reminders}} ({{$count}})</div> -<div id="birthday-wrapper" style="display: none;" ><div id="birthday-title">{{$event_title}}</div> -<div id="birthday-title-end"></div> -{{foreach $events as $event}} -<div class="birthday-list" id="birthday-{{$event.id}}"></a> <a href="{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div> -{{/foreach}} -</div> -{{/if}} - diff --git a/view/tpl/contact_head.tpl b/view/tpl/contact_head.tpl deleted file mode 100755 index 72e7edbfb..000000000 --- a/view/tpl/contact_head.tpl +++ /dev/null @@ -1,30 +0,0 @@ -<script language="javascript" type="text/javascript" - src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script> - <script language="javascript" type="text/javascript"> - -tinyMCE.init({ - theme : "advanced", - mode : "{{$editselect}}", - elements: "contact-edit-info", - plugins : "bbcode", - theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor", - theme_advanced_buttons2 : "", - theme_advanced_buttons3 : "", - theme_advanced_toolbar_location : "top", - theme_advanced_toolbar_align : "center", - theme_advanced_styles : "blockquote,code", - gecko_spellcheck : true, - entity_encoding : "raw", - add_unload_trigger : false, - remove_linebreaks : false, - force_p_newlines : false, - force_br_newlines : true, - forced_root_block : '', - content_css: "{{$baseurl}}/view/custom_tinymce.css" - - -}); - - -</script> - diff --git a/view/tpl/delegate.tpl b/view/tpl/delegate.tpl deleted file mode 100755 index cbaa8da86..000000000 --- a/view/tpl/delegate.tpl +++ /dev/null @@ -1,57 +0,0 @@ -<h3>{{$header}}</h3> - -<div id="delegate-desc" class="delegate-desc">{{$desc}}</div> - -{{if $managers}} -<h3>{{$head_managers}}</h3> - -{{foreach $managers as $x}} - -<div class="contact-block-div"> -<a class="contact-block-link" href="#" > -<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" /> -</a> -</div> - -{{/foreach}} -<div class="clear"></div> -<hr /> -{{/if}} - - -<h3>{{$head_delegates}}</h3> - -{{if $delegates}} -{{foreach $delegates as $x}} - -<div class="contact-block-div"> -<a class="contact-block-link" href="{{$base}}/delegate/remove/{{$x.uid}}" > -<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" /> -</a> -</div> - -{{/foreach}} -<div class="clear"></div> -{{else}} -{{$none}} -{{/if}} -<hr /> - - -<h3>{{$head_potentials}}</h3> -{{if $potentials}} -{{foreach $potentials as $x}} - -<div class="contact-block-div"> -<a class="contact-block-link" href="{{$base}}/delegate/add/{{$x.uid}}" > -<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" /> -</a> -</div> - -{{/foreach}} -<div class="clear"></div> -{{else}} -{{$none}} -{{/if}} -<hr /> - diff --git a/view/tpl/display-head.tpl b/view/tpl/display-head.tpl deleted file mode 100755 index 913784d98..000000000 --- a/view/tpl/display-head.tpl +++ /dev/null @@ -1,8 +0,0 @@ -<script> -$(document).ready(function() { - $(".comment-edit-wrapper textarea").editor_autocomplete(baseurl+"/acl?f=&n=1"); - // make auto-complete work in more places - $(".wall-item-comment-wrapper textarea").editor_autocomplete(baseurl+"/acl?f=&n=1"); -}); -</script> - diff --git a/view/tpl/events_menu_side.tpl b/view/tpl/events_menu_side.tpl deleted file mode 100755 index b9a9062b1..000000000 --- a/view/tpl/events_menu_side.tpl +++ /dev/null @@ -1,8 +0,0 @@ -<div class="widget"> - <h3>{{$title}}</h3> - <ul class="nav nav-pills nav-stacked"> - <li><a href="#" onclick="changeView('changeView', 'month'); return false;">{{$month}}</a></li> - <li><a href="#" onclick="changeView('changeView', 'agendaWeek'); return false;">{{$week}}</a></li> - <li><a href="#" onclick="changeView('changeView', 'agendaDay'); return false;">{{$day}}</a></li> - </ul> -</div> diff --git a/view/tpl/events_reminder.tpl b/view/tpl/events_reminder.tpl deleted file mode 100755 index fd6a1a5c7..000000000 --- a/view/tpl/events_reminder.tpl +++ /dev/null @@ -1,10 +0,0 @@ -{{if $count}} -<div id="event-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('event-wrapper');">{{$event_reminders}} ({{$count}})</div> -<div id="event-wrapper" style="display: none;" ><div id="event-title">{{$event_title}}</div> -<div id="event-title-end"></div> -{{foreach $events as $event}} -<div class="event-list" id="event-{{$event.id}}"></a> <a href="events/{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div> -{{/foreach}} -</div> -{{/if}} - diff --git a/view/tpl/group_drop.tpl b/view/tpl/group_drop.tpl deleted file mode 100755 index 627debc80..000000000 --- a/view/tpl/group_drop.tpl +++ /dev/null @@ -1,7 +0,0 @@ -<div class="group-delete-wrapper button" id="group-delete-wrapper-{{$id}}" > - <a href="group/drop/{{$id}}?t={{$form_security_token}}" - onclick="return confirmDelete();" - id="group-delete-icon-{{$id}}" - class="group-delete-icon btn btn-outline-secondary" title="{{$delete}}" ><i class="fa fa-trash-o drop-icons"></i></a> -</div> -<div class="group-delete-end"></div> diff --git a/view/tpl/match.tpl b/view/tpl/match.tpl deleted file mode 100755 index a5ebb043c..000000000 --- a/view/tpl/match.tpl +++ /dev/null @@ -1,16 +0,0 @@ -<div class="profile-match-wrapper"> - <div class="profile-match-photo"> - <a href="{{$url}}"> - <img src="{{$photo}}" alt="{{$name}}" title="{{$name}}[{{$tags}}]" /> - </a> - </div> - <div class="profile-match-break"></div> - <div class="profile-match-name"> - <a href="{{$url}}" title="{{$name}}[{{$tags}}]">{{$name}}</a> - </div> - <div class="profile-match-end"></div> - {{if $connlnk}} - <div class="profile-match-connect"><a href="{{$connlnk}}" title="{{$conntxt}}"><i class="fa fa-plus connect-icon"></i> {{$conntxt}}</a></div> - {{/if}} - -</div> diff --git a/view/tpl/safesearch.tpl b/view/tpl/safesearch.tpl deleted file mode 100644 index 58ce22741..000000000 --- a/view/tpl/safesearch.tpl +++ /dev/null @@ -1,6 +0,0 @@ -<div id="directory_safemode" class="widget"> -<h3>{{$safemode}}</h3> -<ul class="nav nav-pills nav-stacked"> - <li><a href="toggle_safesearch">{{$toggle}}</a></li> -</ul> -</div> diff --git a/view/tpl/select_timezone.tpl b/view/tpl/select_timezone.tpl deleted file mode 100644 index 2820a54f4..000000000 --- a/view/tpl/select_timezone.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{{* TODO: Make id configurabel *}} -<select id='timezone_select' name='timezone'> -{{foreach $continents as $continent => $cities}} -<optgroup label="{{$continent}}"> -{{foreach $cities as $city => $value}} -<option value='{{$value}}' {{if $value == $selected}}selected='selected'{{/if}}>{{$city}}</option> -{{/foreach}} -</optgroup> -{{/foreach}} -</select> - diff --git a/view/tpl/settings_connectors.tpl b/view/tpl/settings_connectors.tpl deleted file mode 100755 index 8bea9ca63..000000000 --- a/view/tpl/settings_connectors.tpl +++ /dev/null @@ -1,10 +0,0 @@ -<div class="generic-content-wrapper-styled"> -<h1>{{$title}}</h1> - -<form action="settings/connectors" method="post" autocomplete="off"> -<input type='hidden' name='form_security_token' value='{{$form_security_token}}'> - -{{$settings_connectors}} - -</form> -</div> diff --git a/view/tpl/sources_edit.tpl b/view/tpl/sources_edit.tpl index 61f6e8cb0..094440ee7 100644 --- a/view/tpl/sources_edit.tpl +++ b/view/tpl/sources_edit.tpl @@ -8,6 +8,7 @@ <input type="hidden" id="id_abook" name="abook" value="{{$abook}}" /> {{include file="field_input.tpl" field=$name}} {{include file="field_input.tpl" field=$tags}} +{{include file="field_checkbox.tpl" field=$resend}} {{include file="field_textarea.tpl" field=$words}} <div class="sources-submit-wrapper" > diff --git a/view/tpl/sources_new.tpl b/view/tpl/sources_new.tpl index bbc22df84..7cda9998d 100644 --- a/view/tpl/sources_new.tpl +++ b/view/tpl/sources_new.tpl @@ -7,6 +7,7 @@ <input type="hidden" id="id_abook" name="abook" value="{{$abook}}" /> {{include file="field_input.tpl" field=$name}} {{include file="field_input.tpl" field=$tags}} +{{include file="field_checkbox.tpl" field=$resend}} {{include file="field_textarea.tpl" field=$words}} <div class="sources-submit-wrapper" > diff --git a/view/tpl/toggle_mobile_footer.tpl b/view/tpl/toggle_mobile_footer.tpl deleted file mode 100755 index 82c0197ba..000000000 --- a/view/tpl/toggle_mobile_footer.tpl +++ /dev/null @@ -1,2 +0,0 @@ -<a id="toggle_mobile_link" href="{{$toggle_link}}">{{$toggle_text}}</a> - diff --git a/view/tpl/write_pages.tpl b/view/tpl/write_pages.tpl deleted file mode 100644 index 53146ee30..000000000 --- a/view/tpl/write_pages.tpl +++ /dev/null @@ -1,3 +0,0 @@ -<div id="write-pages" class="bigwidget"> -<span id="wp-new"><a href="{{$newurl}}">{{$new}}</a></span> <span id="wp-edit"><a href="{{$editurl}}">{{$edit}}</a></span> -</div> |