Compare commits

...

No commits in common. "2.38" and "master" have entirely different histories.
2.38 ... master

1863 changed files with 12527 additions and 266645 deletions

24
.gitignore vendored Executable file → Normal file
View file

@ -1,20 +1,8 @@
favicon.*
.htconfig.php
\#*
include/jquery-1.4.2.min.js
*.log
*.out
*.version*
.htaccess
.htconfig.php
#*
favicon.*
home.html
addon
*~
#ignore documentation, it should be newly built
doc/api
#ignore config files from eclipse, we don't want IDE files in our repository
.project
.buildpath
.externalToolBuilders
.settings
tests/coverage.html
/vendor
/nbproject/private/

0
.gitmodules vendored
View file

2
.htaccess → .htaccess-dist Executable file → Normal file
View file

@ -1,4 +1,4 @@
#Options -Indexes
Options -Indexes
AddType application/x-java-archive .jar
AddType audio/ogg .oga

View file

@ -1,224 +0,0 @@
Friendica Installation
We've tried very hard to ensure that Friendica will run on commodity hosting
platforms - such as those used to host Wordpress blogs and Drupal websites.
But be aware that Friendica is more than a simple web application. It is a
complex communications system which more closely resembles an email server
than a web server. For reliability and performance, messages are delivered in
the background and are queued for later delivery when sites are down. This
kind of functionality requires a bit more of the host system than the typical
blog. Not every PHP/MySQL hosting provider will be able to support Friendica.
Many will. But please review the requirements and confirm these with your
hosting provider prior to installation.
Before you begin: Choose a domain name or subdomain name for your server.
Put some thought into this - because changing it is currently not-supported.
Things will break, and some of your friends may have difficulty communicating
with you. We plan to address this limitation in a future release. Also decide
if you wish to connect with members of the Diaspora network, as this will
impact the installation requirements.
Decide if you will use SSL and obtain an SSL cert. Communications with the
Diaspora network MAY require both SSL AND an SSL cert signed by a CA which is
recognised by the major browsers. Friendica will work with self-signed certs
but Diaspora communication may not. For best results, install your cert PRIOR
to installing Friendica and when visiting your site for the initial
installation in step 5, please use the https: link. (Use the http: or non-SSL
link if your cert is self-signed).
1. Requirements
- Apache with mod-rewrite enabled and "Options All" so you can use a
local .htaccess file
- PHP 5.2+. The later the better. PHP 5.3 is required for communications
with the Diaspora network and improved security.
- PHP *command line* access with register_argc_argv set to true in the
php.ini file [or see 'poormancron' in section 8]
- curl, gd (with at least jpeg support), mysql, mbstring, mcrypt, and openssl extensions
- some form of email server or email gateway such that PHP mail() works
- Mysql 5.x
- ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks
(Windows) [Note: other options are presented in Section 8 of this document]
- Installation into a top-level domain or sub-domain (without a
directory/path component in the URL) is preferred. This is REQUIRED if
you wish to communicate with the Diaspora network.
2. Unpack the Friendica files into the root of your web server document area.
- If you copy the directory tree to your webserver, make sure
that you also copy .htaccess - as "dot" files are often hidden
and aren't normally copied.
3. Create an empty database and note the access details (hostname, username,
password, database name).
4. If you know in advance that it will be impossible for the web server to
write or create files in your web directory, create an empty file called
.htconfig.php and make it writable by the web server.
5. Visit your website with a web browser and follow the instructions. Please
note any error messages and correct these before continuing. If you are using
SSL with a known signature authority (recommended), use the https: link to your
website. If you are using a self-signed cert or no cert, use the http: link.
6. *If* the automated installation fails for any reason, check the following:
- ".htconfig.php" exists
If not, edit htconfig.php and change system settings. Rename
to .htconfig.php
- Database is populated.
If not, import the contents of "database.sql" with phpmyadmin
or mysql command line
7. At this point visit your website again, and register your personal account.
Registration errors should all be recoverable automatically.
If you get any *critical* failure at this point, it generally indicates the
database was not installed correctly. You might wish to move/rename
.htconfig.php to another name and empty (called 'dropping') the database
tables, so that you can start fresh.
****************************************************************************
****************************************************************************
******** THIS NEXT STEP IS IMPORTANT!!!! ***********
****************************************************************************
****************************************************************************
8. 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. Example:
cd /base/directory; /path/to/php include/poller.php
Change "/base/directory", and "/path/to/php" as appropriate for your situation.
If you are using a Linux server, run "crontab -e" and add a line like the
one shown, substituting for your unique paths and settings:
*/10 * * * * cd /home/myname/mywebsite; /usr/bin/php include/poller.php
You can generally find the location of PHP by executing "which php". If you
have troubles with this section please contact your hosting provider for
assistance. Friendica will not work correctly if you cannot perform this step.
You should also be sure that $a->config['php_path'] is set correctly, it should
look like (changing it to the correct PHP location)
$a->config['php_path'] = '/usr/local/php53/bin/php'
Alternative: You may be able to use the 'poormancron' plugin to perform this
step if you are using a recent Friendica release. 'poormancron' may result in
perfomance and memory issues and is only suitable for small sites with one or
two users and a handful of contacts. To do this, edit the file
".htconfig.php" and look for a line describing your plugins. On a fresh
installation, it will look like
$a->config['system']['addon'] = 'js_upload';
This indicates the "js_upload" addon module is enabled. You may add additional
addons/plugins using this same line in the configuration file. Change it to
read
$a->config['system']['addon'] = 'js_upload,poormancron';
and save your changes.
#####################################################################
If things don't work...
#####################################################################
#####################################################################
- If you get the message
"System is currently unavailable. Please try again later"
#####################################################################
Check your database settings. It usually means your database could not
be opened or accessed. If the database resides on the same machine, check that
the database server name is "localhost".
#####################################################################
- 500 Internal Error
#####################################################################
This could be the result of one of our Apache directives not being
supported by your version of Apache. Examine your apache server logs.
You might remove the line "Options -Indexes" from the .htaccess file if
you are using a Windows server as this has been known to cause problems.
Also check your file permissions. Your website and all contents must generally
be world-readable.
It is likely that your web server reported the source of the problem in
its error log files. Please review these system error logs to determine what
caused the problem. Often this will need to be resolved with your hosting
provider or (if self-hosted) your web server configuration.
#####################################################################
- 400 and 4xx "File not found" errors
#####################################################################
First check your file permissions. Your website and all contents must
generally be world-readable.
Ensure that mod-rewite is installed and working, and that your
.htaccess file is being used. To verify the latter, create a file test.out
containing the word "test" in the top directory of Friendica, make it world
readable and point your web browser to
http://yoursitenamehere.com/test.out
This file should be blocked. You should get a permission denied message.
If you see the word "test" your Apache configuration is not allowing
your .htaccess file to be used (there are rules in this file to block access
to any file with .out at the end, as these are typically used for system logs).
Make certain the .htaccess file exists and is readable by everybody, then
look for the existence of "AllowOverride None" in the Apache server
configuration for your site. This will need to be changed to
"AllowOverride All".
If you do not see the word "test", your .htaccess is working, but it is
likely that mod-rewrite is not installed in your web server or is not working.
On most flavour of Linux,
% a2enmod rewrite
% /etc/init.d/apache2 restart
Consult your hosting provider, experts on your particular Linux
distribution or (if Windows) the provider of your Apache server software if
you need to change either of these and can not figure out how. There is
a lot of help available on the web. Google "mod-rewrite" along with the
name of your operating system distribution or Apache package (if using
Windows).
#####################################################################
- If you are unable to write the file .htconfig.php during installation
due to permissions issues:
#####################################################################
create an empty file with that name and give it world-write permission.
For Linux:
% touch .htconfig.php
% chmod 777 .htconfig.php
Retry the installation. As soon as the database has been created,
******* this is important *********
% chmod 755 .htconfig.php

20
LICENSE
View file

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

2
Makefile Normal file
View file

@ -0,0 +1,2 @@
test:
cd tests && phpunit --coverage-html=coverage.html && x-www-browser ./coverage.html/index.html

4
README
View file

@ -1,4 +0,0 @@
Friendica Social Communications Server
======================================
Welcome to the free social web.

142
README.md Normal file
View file

@ -0,0 +1,142 @@
# Decentralized Friendica Directory
## Installing
### 1. Copy configuration
Copy the `htconfig.php` to `.htconfig.php` and enter the database credentials.
### 2. Initialize the database
Create a database with a username and a password.
Then import ````dfrndir.sql```` to it.
mysql -u YOURDBUSER -p YOURDBNAME < dfrnlr.sql
### 3. Create an autoloader with composer
Make sure you have [composer](https://getcomposer.org/download/) installed globally, or rewrite the command to use a `.phar`.
```sh
composer dump-autoload
```
### 4. Set up the cronjobs.
Example cronjob using `www-data` user.
```
*/30 * * * * www-data cd /var/www/friendica-directory; php include/cron_maintain.php
*/5 * * * * www-data cd /var/www/friendica-directory; php include/cron_sync.php
```
### 5. Copy .htaccess-dist to .htaccess and make local modifications
## How syncing works
The new syncing features include: pushing and pulling.
### Pushing
Submissions you receive can be submitted to other directories using a push target.
You do this by creating an entry in the sync-targets table with the push bit set to `1`.
Also, you must enable pushing in your `.htconfig` settings.
The next time `include/cron_sync.php` is run from your cronjob, the queued items will be submitted to your push targets.
### Pulling
For pulling to work, the target server must enable pulling.
This makes the `/sync/pull/all` and `/sync/pull/since/[when]` methods work on that server.
Next you can add an entry in the sync-targets table with the pull bit set to `1`.
Also, you must enable pulling in your `.htconfig` settings.
The next time `include/cron_sync.php` is run from your cronjob, the pulling sources will be checked.
New items will be queued in your pull queue.
The queue will be gradually cleared based on your `syncing.max_pull_items` settings.
You can check the backlog of this queue at the `/admin` page.
**Note**: If you set the bit for pulling or pushing in the MySQL console, it won't be visible in a `SELECT` query.
MySQL will however inform you about changed rows after `UPDATE` queries.
## How submissions are processed
1. The /submit endpoint takes a `?url=` parameter.
This parameter is an encoded URL, the original ASCII is treated as binary and base16 encoded.
This URL should be a profile location, such as `https://fc.oscp.info/profile/admin`.
This URL will be checked in the database for existing accounts.
This check includes a normalization, http vs https is ignored as well as www. prefixes.
2. If noscrape is supported by the site, this will be used instead of a scrape request.
In this case `https://fc.oscp.info/noscrape/admin`.
If noscrape fails or is not supported, the url provided (as is) will be scraped for meta information.
* `<meta name="dfrn-global-visibility" content="true" />`
* `<meta name="friendica.community" content="true" />`
or `<meta name="friendika.community" content="true" />`
* `<meta name="keywords" content="these,are,your,public,tags" />`
* `<link rel="dfrn-*" href="https://fc.oscp.info/*" />`
any dfrn-* prefixed link and it's href attribute.
* `.vcard .fn` as `fn`
* `.vcard .title` as `pdesc`
* `.vcard .photo` as `photo`
* `.vcard .key` as `key`
* `.vcard .locality` as `locality`
* `.vcard .region` as `region`
* `.vcard .postal-code` as `postal-code`
* `.vcard .country-name` as `country-name`
3. If the `dfrn-global-visibility` value is set to false. Any existing records will be deleted.
And the process exits here.
4. A submission is IGNORED when at least the following data could not be scraped.
* `key` the public key from the hCard.
* `dfrn-request` required for the DFRN protocol.
* `dfrn-confirm` required for the DFRN protocol.
* `dfrn-notify` required for the DFRN protocol.
* `dfrn-poll` required for the DFRN protocol.
5. If the profile existed in the database and the profile is not explicitly set to
public using the `dfrn-global-visibility` meta tag. It will be deleted.
6. If the profile existed in the database and the profile lacks either an `fn` or `photo`
attribute, it will be deleted.
7. The profile is now inserted/updated based on the found information.
Notable database fields are:
* `homepage` the originally (decoded) `?url=` parameter.
* `nurl` the normalized URL created to remove http vs https and www vs non-www urls.
* `created` the creation date and time in UTC (now if the entry did not exist yet).
* `updated` the current date and time in UTC.
8. If an insert has occurred, the URL will now be used to check for duplicates.
The highest insert ID will be kept, anything else deleted.
9. If provided, your public tags are now split by ` ` (space character) and stored in the tags table.
This uses your normalized URL as unique key for your profile.
10. The `photo` provided will be downloaded and resized to 80x80, regardless of source size.
11. Should there somehow have been an error at this point such as that there is no profile ID known.
Everything will get deleted based on the original `?url=` parameter.
## Note about search
The Directory uses MySQL fulltext capabilities to index profiles and offer a search feature.
However, the default minimum word size MySQL will index is 4, which ignores words like `PHP` and `USA`.
To index words smaller than 4 characters, you will have to edit your my.cnf/my.ini file to include this:
````
[mysqld]
ft_min_word_len = 3
````
Then restart your MySQL server.
If you already had data in your profile table, you will need to rebuild the index by executing the following query:
````
REPAIR TABLE `profile` QUICK;
````

43
Vagrantfile vendored Normal file
View file

@ -0,0 +1,43 @@
server_ip = "192.168.33.10"
server_memory = "384" # MB
server_timezone = "UTC"
public_folder = "/vagrant"
Vagrant.configure(2) do |config|
# Set server to Ubuntu 14.04
config.vm.box = "ubuntu/trusty64"
# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
# Create a hostname, don't forget to put it to the `hosts` file
# This will point to the server's default virtual host
# TO DO: Make this work with virtualhost along-side xip.io URL
config.vm.hostname = "friendica.dev"
# Create a static IP
config.vm.network :private_network, ip: server_ip
# Share a folder between host and guest
config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", owner: "www-data", group: "vagrant"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
vb.memory = server_memory
end
# Enable provisioning with a shell script.
config.vm.provision "shell", path: "./util/vagrant_provision.sh"
# run: "always"
# run: "once"
end

299
assets/css/awesome/font-awesome.min.css vendored Normal file
View file

@ -0,0 +1,299 @@
/*!
* Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License
)
*/@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eo
t?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('e
mbedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('wof
f2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fon
ts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesom
e-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font
-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwes
ome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-mo
z-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.3333
3333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-si
ze:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-
align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none
}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2
.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.f
a-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pu
ll-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.p
ull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear
;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s inf
inite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin
{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform
:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transfor
m:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);tran
sform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.Bas
icImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);
transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.
BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180
deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Micr
osoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rota
te(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTra
nsform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1)
;-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:prog
id:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform
:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate
-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .f
a-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;wid
th:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2
x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height
:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{cont
ent:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.
fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:b
efore{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:
"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-
th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{co
ntent:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d
"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"
}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear
:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-ho
me:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{c
ontent:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f01
9"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{c
ontent:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content
:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:b
efore{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{conten
t:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}
.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa
-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:
before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\
f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-pr
int:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{con
tent:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.
fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-
align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-al
ign-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-li
st:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.
fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-pho
to:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:befor
e{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{conten
t:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:be
fore{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-
o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:bef
ore{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before
{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c
"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-fo
rward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:b
efore{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:
before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:b
efore{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:b
efore{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle
:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o
:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before
{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{co
ntent:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:
"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:befo
re{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"
\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-
exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-le
af:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content
:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation
-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:b
efore{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{conte
nt:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f07
7"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.f
a-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-fol
der-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h
:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f0
80"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content
:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}
.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f
086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f
088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa
-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-
thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-s
ign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-squar
e:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{co
ntent:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f09
6"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"
}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{co
ntent:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c
"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-
o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{con
tent:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{cont
ent:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:
"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{cont
ent:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:be
fore{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:befo
re{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\
f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa
-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f
0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"
\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{conte
nt:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:befo
re{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-squar
e:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{c
ontent:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f
0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0c
d"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:b
efore{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:
before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-
plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:befo
re{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{con
tent:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"
\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,
.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{cont
ent:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0
e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-
gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:
"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e
6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"
\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before
{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{cont
ent:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{co
ntent:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:
"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.f
a-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text
-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:b
efore{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{con
tent:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0
fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.
fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{conten
t:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:befor
e{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{c
ontent:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content
:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.f
a-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{conten
t:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f1
0d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.f
a-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"
\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"
}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa
-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:bef
ore{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{cont
ent:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{conten
t:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-al
l:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.f
a-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.
fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:b
efore,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128
"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-sup
erscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:
before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:be
fore{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:befo
re{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:b
efore{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{conten
t:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-righ
t:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevro
n-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:b
efore{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{co
ntent:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:
"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f1
43"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa
-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.
fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-che
ck-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-ex
ternal-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d
"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-d
own:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{con
tent:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f
152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f15
4"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:bef
ore{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{
content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158
"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:befor
e{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"
\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{cont
ent:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:befo
re{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-
desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down
:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:be
fore{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{cont
ent:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"
\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\
f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbu
cket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumb
lr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arro
w-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-
arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.f
a-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:be
fore{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{conten
t:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"
}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:be
fore{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-s
un-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before
{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.f
a-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:b
efore{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle
-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.
fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-cir
cle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-squ
are:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195
"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f1
97"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}
.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-insti
tution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-b
oard:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"
\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-r
eddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3
"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.f
a-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-pip
er-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:befor
e{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f
1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-pa
w:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{conten
t:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.f
a-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-ste
am-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobi
le:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:
"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-d
eviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-datab
ase:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o
:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpo
int-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.
fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:
before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"
\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-
code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before
{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-li
fe-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{con
tent:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:b
efore{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-sq
uare:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:befor
e{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content
:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa
-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{c
ontent:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circ
le-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:b
efore{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{co
ntent:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{conten
t:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:b
efore{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{cont
ent:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1
e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-w
ifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:befo
re{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{c
ontent:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{c
ontent:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"
\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6
"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-c
opyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:bef
ore{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:bef
ore{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{c
ontent:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"
\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\
f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.f
a-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:be
fore{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:
before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-bu
ysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-da
shcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:be
fore{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{c
ontent:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{conten
t:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{conten
t:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa
-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-st
reet-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:
before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{conten
t:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{cont
ent:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{conte
nt:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:
"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{conten
t:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content
:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f2
32"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-u
ser-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"
}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:
before{content:"\f239"}.fa-medium:before{content:"\f23a"}

453
assets/css/style.css Normal file
View file

@ -0,0 +1,453 @@
* {
box-sizing: border-box;
}
html,body {
margin: 0;
padding: 0;
}
html {
font-family: 'Open Sans', sans-serif;
font-weight: 300;
font-size: 100%;
}
a {color: inherit;}
p {
margin: 0 0 1em 0;
}
.mobile {
display: none !important;
}
#top-bar {
background: #f5f5f5;
padding: 8px 14px;
position: fixed;
z-index: 1;
top: 0;
height: 55px;
width: 100%;
font-weight: 300;
border-bottom: 1px solid #ddd;
display: flex;
justify-content: space-between;
}
#top-bar-spacer {
width: 100%;
height: 55px;
}
#top-bar .header {
display: inline-block;
font-size: 16px;
font-weight: 300;
line-height: 19px;
background: url('/images/friendica.svg') top left no-repeat;
background-size: 14px;
padding-left: 18px;
margin: 0;
white-space: nowrap;
}
#top-bar .search-form {
display: inline-block;
}
#top-bar .search-wrapper {
background: #fff;
}
nav#links {
line-height: 39px;
white-space: nowrap;
}
nav#links a {
display: inline-block;
margin: 0 4px;
padding: 0 5px;
}
.sub-menu-outer {
background: #eee;
line-height: 45px;
height: 45px;
border-bottom: 1px solid #ddd;
}
.sub-menu-outer .sub-menu-inner {
width: 500px;
margin: auto;
}
.sub-menu-inner .option {
padding: 9px 6px;
margin: 0 5px;
}
.sub-menu-inner .option.active {
border-bottom: 2px solid #f00;
}
.homepage-wrapper {
width: 500px;
margin: auto;
text-align: center;
}
.search-results,
.directory-results {
margin-bottom: 25px;
}
.directory-results {
display: flex;
flex-flow: row;
}
.directory-results > aside {
flex: 1 6 20%;
order: 1;
padding: 0 1em;
}
.directory-results > section {
flex: 3 1 80%;
order: 2;
}
.homepage-wrapper {
margin: 120px auto;
}
.homepage-wrapper .header {
font-size: 68px;
font-weight: 100;
line-height: 0.9em;
background: url('/images/friendica.svg') top left no-repeat;
background-size: 61px;
margin-left: 40px;
}
.homepage-wrapper .about {
text-align: justify;
line-height: 1.5em;
color: #555;
}
.homepage-wrapper .profiles {
margin-top: 3em;
}
.profiles {
padding: 0 10px;
column-width: 400px;
}
.profiles > figure {
display: inline-block;
cursor: pointer;
}
.sites {
max-width: 600px;
margin: 0 auto;
}
nav#links a,
.sub-menu-outer a {
text-decoration: none;
}
.search-results .intro {
text-align: justify;
}
.site,
.profile {
width: 100%;
text-decoration: none;
color: #000;
padding: 2px;
outline: none;
margin: 5px 0;
display: inline;
background-color: rgba(0, 0, 0, .01);
border-radius: 23px .5em 23px .5em;
}
.site {
padding: 14px 2px;
margin: 20px 0;
border-bottom: 1px dashed #ccc;
}
.profile.selected,
.profile: focus,
.profile: hover {
padding: 1px;
border: 1px solid #ccc;
}
.site .site-info,
.site .site-supports,
.profile .profile-photo,
.profile .profile-info {
display: table-cell;
vertical-align: top;
text-align: left;
}
.site .site-supports {
text-align: right;
padding: 8px;
}
.profile .profile-photo {
float: left;
margin: 8px;
border-radius: 15px;
border: 1px solid #ddd;
}
.site .site-info,
.profile .profile-info {
padding: 8px;
width: 100%;
}
.site .site-info strong,
.profile .profile-info strong {
font-weight: 600;
}
.site .site-info .fa,
.profile .profile-info .fa {
line-height: 1.1em;
color: #999;
}
.site .site-info .url,
.profile .profile-info .url {
font-size: 80%;
margin-bottom: 3px;
color: #555;
/** @see https: //css-tricks.com/snippets/css/prevent-long-urls-from-breaking-out-of-container/ */
overflow-wrap: break-word;
word-wrap: break-word;
-ms-word-break: break-all;
word-break: break-all;
word-break: break-word;
-ms-hyphens: auto;
-moz-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
.profile .profile-info .description {
margin-bottom: .5em;
}
.search-wrapper {
position: relative;
display: inline-block;
width: 500px;
background: #f5f5f5;
border: 1px solid #ddd;
border-radius: 8px;
height: 38px;
line-height: 22px;
}
.search-wrapper .search-field {
line-height: 22px;
display: block;
border: none;
outline: none;
background: none;
padding: 8px 12px;
padding-right: 117px;
width: 100%;
}
.search-wrapper .reset {
position: absolute;
top: 0;
right: 65px;
height: 25px;
width: 25px;
margin: 6px;
padding: 0;
line-height: 1;
font-size: 12px;
color: #555;
background: #eee;
border: 1px solid #ddd;
border-radius: 20px;
font-family: 'FontAwesome';
font-weight: 100;
line-height: 25px;
text-decoration: none;
}
.search-wrapper .search {
border: none;
border-left: 1px solid #ddd;
color: #555;
background: #eee;
position: absolute;
top: 0;
right: 0;
height: 36px;
width: 65px;
border-radius: 0 8px 8px 0;
}
.health {font-size: 120%; vertical-align: bottom;}
.health.very-bad { color: #f99; }
.health.bad { color: #f1ba7a; }
.health.neutral { color: #e6e782; }
.health.ok { color: #bef273; }
.health.good { color: #7cf273; }
.health.perfect { color: #33ff80; }
.btn {
border: 1px solid #ddd;
color: #555;
background: #eee;
border-radius: 8px 8px;
height: 36px;
line-height: 34px;
min-width: 80px;
padding: 0 10px;
text-decoration: none;
display: inline-block;
}
/* smaller than tablet in portrait */
@media screen and (max-width: 880px) {
body {
overflow-x: hidden;
}
.mobile {
display: inherit !important;
}
#top-bar .header {
overflow: hidden;
width: 0px;
padding-left: 28px;
height: 28px;
background-size: 28px;
}
#top-bar .search-form {
display: block;
width: 100%;
padding: 0 35px;
margin: 0;
}
.homepage-wrapper,
.search-wrapper {
width: 100%;
max-width: 500px;
}
.homepage-wrapper .search-wrapper {
width: 100%;
}
.homepage-wrapper {
margin: 90px auto;
}
.search-results,
.sub-menu-outer .sub-menu-inner {
width: 95%;
max-width: 500px;
}
.hamburger {
padding: 8px;
font-size: 22px;
line-height: 22px;
cursor: pointer;
}
nav#links {
position: absolute;
width: 100%;
top: 54px;
right: 0;
padding-bottom: 5px;
}
nav#links .viewport {
position: absolute;
z-index: 1;
left: 100%;
width: 100%;
transition: left ease 200ms;
background: #fff;
padding: 20px 0;
box-shadow: 1px 3px 3px rgba(0,0,0,0.2);
font-size: 150%;
text-align: center;
}
nav#links.open .viewport {
left: 0%;
}
#top-bar nav#links .viewport {
background: #f5f5f5;
}
nav#links h3 {
margin: 0;
display: block;
line-height: 2em;
}
nav#links a {
display: block;
line-height: 2.5em;
margin: 4px 0;
}
.profile,
.profile .profile-info {
overflow-wrap: break-word;
word-wrap: break-word;
overflow: hidden;
}
.directory-results {
flex-flow: column;
}
.directory-results > aside {
order: 2;
}
.directory-results > section {
order: 1;
}
}
/* The moment the header starts getting squashed */
@media screen and (max-width: 520px) {
.homepage-wrapper {
margin: 30px auto;
}
.homepage-wrapper .header {
font-size: 40px;
background-size: 36px;
display: inline-block;
margin-left: 18px;
width: 275px;
}
}
/* close to mobile in portrait */
@media screen and (max-width: 400px) {
.profile .profile-photo {
width: 60px;
border-radius: 11.25px;
margin: 8px 4px;
}
.profile .profile-info .url {
display: none;
}
}

7
js/ajaxupload.js → assets/js/ajaxupload.js Executable file → Normal file
View file

@ -163,7 +163,6 @@
height : from.offsetHeight + 'px'
});
to.title = from.title;
}
/**
@ -384,9 +383,7 @@
// in Internet Explorer
'direction' : 'ltr',
//Max zIndex supported by Opera 9.0-9.2
'zIndex': 2147483583,
'cursor' : 'pointer'
'zIndex': 2147483583
});
// Make sure that element opacity exists.
@ -692,4 +689,4 @@
this._createInput();
}
};
})();
})();

4
assets/js/jquery/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

30
assets/js/main.js Normal file
View file

@ -0,0 +1,30 @@
jQuery(function($){
//Mobile menu, hamburger button.
$('body').on('click', '.hamburger', function(e){
e.preventDefault();
$('nav#links').toggleClass('open');
});
// Show/hide the reset link if the search field is populated/empty
function updateResetButton() {
if ($('.search-field').val()) {
$('.reset').show();
} else {
$('.reset').hide();
}
}
$('body').on('keyup', '.search-field', updateResetButton)
updateResetButton();
// Makes the entire profile card clickable...
$('body').on('click', '.profile', function(event) {
window.open(event.currentTarget.dataset.href, '_blank');
});
// ...while keeping inner a tags clickable
$('body').on('click', '.profile a', function(event) {
event.stopPropagation();
})
});

15
assets/js/raphael/g_line.min.js vendored Normal file
View file

@ -0,0 +1,15 @@
/*!
* g.Raphael 0.51 - Charting library, based on Raphaël
*
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
*/
(function(){function S(h,o){for(var p=h.length/o,m=0,k=p,b=0,i=[];m<h.length;)k--,0>k?(b+=h[m]*(1+k),i.push(b/p),b=h[m++]*-k,k+=p):b+=1*h[m++];return i}function E(h,o,p,m,k,b,i,c){var F,f,u,w;function J(a){for(var s=[],e=0,G=b.length;e<G;e++)s=s.concat(b[e]);s.sort(function(a,e){return a-e});for(var c=[],g=[],e=0,G=s.length;e<G;e++)s[e]!=s[e-1]&&c.push(s[e])&&g.push(o+d+(s[e]-v)*A);for(var s=c,G=s.length,l=a||h.set(),e=0;e<G;e++){var c=g[e]-(g[e]-(g[e-1]||o))/2,f=((g[e+1]||o+m)-g[e])/2+(g[e]-(g[e-
1]||o))/2,j;a?j={}:l.push(j=h.rect(c-1,p,Math.max(f+1,1),k).attr({stroke:"none",fill:"#000",opacity:0}));j.values=[];j.symbols=h.set();j.y=[];j.x=g[e];j.axis=s[e];for(var f=0,r=i.length;f<r;f++)for(var c=b[f]||b[0],n=0,u=c.length;n<u;n++)c[n]==s[e]&&(j.values.push(i[f][n]),j.y.push(p+k-d-(i[f][n]-y)*H),j.symbols.push(q.symbols[f][n]));a&&a.call(j)}!a&&(t=l)}function N(a){for(var g=a||h.set(),e,c=0,j=i.length;c<j;c++)for(var f=0,m=i[c].length;f<m;f++){var l=o+d+((b[c]||b[0])[f]-v)*A,n=o+d+((b[c]||
b[0])[f?f-1:1]-v)*A,r=p+k-d-(i[c][f]-y)*H;a?e={}:g.push(e=h.circle(l,r,Math.abs(n-l)/2).attr({stroke:"#000",fill:"#000",opacity:1}));e.x=l;e.y=r;e.value=i[c][f];e.line=q.lines[c];e.shade=q.shades[c];e.symbol=q.symbols[c][f];e.symbols=q.symbols[c];e.axis=(b[c]||b[0])[f];a&&a.call(e)}!a&&(C=g)}c=c||{};h.raphael.is(b[0],"array")||(b=[b]);h.raphael.is(i[0],"array")||(i=[i]);for(var d=c.gutter||10,l=Math.max(b[0].length,i[0].length),O=c.symbol||"",P=c.colors||this.colors,t=null,C=null,q=h.set(),g=[],a=
0,n=i.length;a<n;a++)l=Math.max(l,i[a].length);for(var K=h.set(),a=0,n=i.length;a<n;a++)c.shade&&K.push(h.path().attr({stroke:"none",fill:P[a],opacity:c.nostroke?1:0.3})),i[a].length>m-2*d&&(i[a]=S(i[a],m-2*d),l=m-2*d),b[a]&&b[a].length>m-2*d&&(b[a]=S(b[a],m-2*d));var g=Array.prototype.concat.apply([],b),l=Array.prototype.concat.apply([],i),g=this.snapEnds(Math.min.apply(Math,g),Math.max.apply(Math,g),b[0].length-1),v=g.from,g=g.to,l=this.snapEnds(Math.min.apply(Math,l),Math.max.apply(Math,l),i[0].length-
1),y=l.from,a=l.to,A=(m-2*d)/(g-v||1),H=(k-2*d)/(a-y||1),l=h.set();c.axis&&(n=(c.axis+"").split(/[,\s]+/),+n[0]&&l.push(this.axis(o+d,p+d,m-2*d,v,g,c.axisxstep||Math.floor((m-2*d)/20),2,h)),+n[1]&&l.push(this.axis(o+m-d,p+k-d,k-2*d,y,a,c.axisystep||Math.floor((k-2*d)/20),3,h)),+n[2]&&l.push(this.axis(o+d,p+k-d,m-2*d,v,g,c.axisxstep||Math.floor((m-2*d)/20),0,h)),+n[3]&&l.push(this.axis(o+d,p+k-d,k-2*d,y,a,c.axisystep||Math.floor((k-2*d)/20),1,h)));for(var Q=h.set(),R=h.set(),E,a=0,n=i.length;a<n;a++){c.nostroke||
Q.push(E=h.path().attr({stroke:P[a],"stroke-width":c.width||2,"stroke-linejoin":"round","stroke-linecap":"round","stroke-dasharray":c.dash||""}));for(var D=Raphael.is(O,"array")?O[a]:O,I=h.set(),g=[],j=0,T=i[a].length;j<T;j++){var x=o+d+((b[a]||b[0])[j]-v)*A,z=p+k-d-(i[a][j]-y)*H;(Raphael.is(D,"array")?D[j]:D)&&I.push(h[Raphael.is(D,"array")?D[j]:D](x,z,3*(c.width||2)).attr({fill:P[a],stroke:"none"}));if(c.smooth){if(j&&j!=T-1){f=o+d+((b[a]||b[0])[j-1]-v)*A;var L=p+k-d-(i[a][j-1]-y)*H;u=x;w=z;var r=
o+d+((b[a]||b[0])[j+1]-v)*A,B=p+k-d-(i[a][j+1]-y)*H,M=(u-f)/2;F=(r-u)/2;f=Math.atan((u-f)/Math.abs(w-L));r=Math.atan((r-u)/Math.abs(w-B));f=L<w?Math.PI-f:f;r=B<w?Math.PI-r:r;B=Math.PI/2-(f+r)%(2*Math.PI)/2;L=M*Math.sin(B+f);f=M*Math.cos(B+f);M=F*Math.sin(B+r);r=F*Math.cos(B+r);F=u-L;f=w+f;u+=M;w+=r;g=g.concat([F,f,x,z,u,w])}j||(g=["M",x,z,"C",x,z])}else g=g.concat([j?"L":"M",x,z])}c.smooth&&(g=g.concat([x,z,x,z]));R.push(I);c.shade&&K[a].attr({path:g.concat(["L",x,p+k-d,"L",o+d+((b[a]||b[0])[0]-v)*
A,p+k-d,"z"]).join(",")});!c.nostroke&&E.attr({path:g.join(",")})}q.push(Q,K,R,l,t,C);q.lines=Q;q.shades=K;q.symbols=R;q.axis=l;q.hoverColumn=function(a,c){!t&&J();t.mouseover(a).mouseout(c);return this};q.clickColumn=function(a){!t&&J();t.click(a);return this};q.hrefColumn=function(a){var c=h.raphael.is(arguments[0],"array")?arguments[0]:arguments;if(!(arguments.length-1)&&typeof a=="object")for(var e in a)for(var b=0,d=t.length;b<d;b++)t[b].axis==e&&t[b].attr("href",a[e]);!t&&J();b=0;for(d=c.length;b<
d;b++)t[b]&&t[b].attr("href",c[b]);return this};q.hover=function(a,b){!C&&N();C.mouseover(a).mouseout(b);return this};q.click=function(a){!C&&N();C.click(a);return this};q.each=function(a){N(a);return this};q.eachColumn=function(a){J(a);return this};return q}var I=function(){};I.prototype=Raphael.g;E.prototype=new I;Raphael.fn.linechart=function(h,o,p,m,k,b,i){return new E(this,h,o,p,m,k,b,i)}})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

10
bin/console Executable file
View file

@ -0,0 +1,10 @@
#!/bin/bash
dir=$(cd "${0%[/\\]*}" > /dev/null; pwd)
if [[ -d /proc/cygdrive && $(which php) == $(readlink -n /proc/cygdrive)/* ]]; then
# We are in Cgywin using Windows php, so the path must be translated
dir=$(cygpath -m "$dir");
fi
php "${dir}/console.php" "$@"

4
bin/console.bat Normal file
View file

@ -0,0 +1,4 @@
@echo OFF
:: in case DelayedExpansion is on and a path contains !
setlocal DISABLEDELAYEDEXPANSION
php "%~dp0console.php" %*

6
bin/console.php Normal file
View file

@ -0,0 +1,6 @@
#!/usr/bin/env php
<?php
include_once dirname(__DIR__) . '/boot.php';
(new Friendica\Directory\Core\Console($argv))->execute();

1638
boot.php Executable file → Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,38 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="friendica" default="test">
<!-- =================================== -->
<!-- Target: test -->
<!-- this target runs all test files -->
<!-- =================================== -->
<target name="test">
<!-- there are no tests by now, so, nothing to do -->
</target>
<!-- ===================================================== -->
<!-- Target: clean-doc -->
<!-- this target removes documentation from a previous run -->
<!-- ===================================================== -->
<target name="doc-clean">
<echo msg="Removing old documentation..." />
<delete dir="./doc/api/" />
<echo msg="Generate documentation directory..." />
<mkdir dir="./doc/api/" />
</target>
<!-- ====================================== -->
<!-- Target: doc -->
<!-- this target builds all documentation -->
<!-- ====================================== -->
<target name="doc" depends="doc-clean">
<echo msg="Building documentation..." />
<docblox title="Friendica API" destdir="./doc/api">
<fileset dir=".">
<include name="**/*.php" />
</fileset>
</docblox>
</target>
</project>

15
composer.json Normal file
View file

@ -0,0 +1,15 @@
{
"name": "friendica/dir",
"description": "The internet is our social network",
"license": "AGPL3",
"autoload": {
"psr-4": {
"Friendica\\Directory\\": "src"
}
},
"require": {
"php": ">=5.3",
"mrpetovan/net_ping": "^1.0",
"asika/simple-console": "^1.0"
}
}

171
composer.lock generated Normal file
View file

@ -0,0 +1,171 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "92a5912148dfd08b1bc438eace6cede9",
"packages": [
{
"name": "asika/simple-console",
"version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/asika32764/php-simple-console.git",
"reference": "0b624c1a999849dc6481a47182e58d593bf65068"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/asika32764/php-simple-console/zipball/0b624c1a999849dc6481a47182e58d593bf65068",
"reference": "0b624c1a999849dc6481a47182e58d593bf65068",
"shasum": ""
},
"type": "library",
"autoload": {
"psr-4": {
"Asika\\SimpleConsole\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Simon Asika",
"email": "asika32764@gmail.com"
}
],
"description": "One file console framework to help you write build scripts.",
"time": "2018-03-08T12:05:40+00:00"
},
{
"name": "mrpetovan/net_ping",
"version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/MrPetovan/Net_Ping.git",
"reference": "cb82b6f068012cec757c7ac93f79c5af2a3f8255"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MrPetovan/Net_Ping/zipball/cb82b6f068012cec757c7ac93f79c5af2a3f8255",
"reference": "cb82b6f068012cec757c7ac93f79c5af2a3f8255",
"shasum": ""
},
"require": {
"pear/pear_exception": "*"
},
"require-dev": {
"phpunit/phpunit": "*"
},
"type": "library",
"autoload": {
"psr-0": {
"Net": "./"
}
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
"./"
],
"license": [
"PHP-3.01"
],
"authors": [
{
"name": "Craig Constantine",
"email": "cconstantine@php.net",
"role": "Lead"
},
{
"name": "Martin Jansen",
"email": "mj@php.net",
"role": "Developer"
},
{
"name": "Jan Lehnardt",
"email": "jan@php.net",
"role": "Developer"
},
{
"name": "Thomas V.V.Cox",
"email": "cox@php.net",
"role": "Developer"
},
{
"name": "Hypolite Petovan",
"email": "hypolite@mrpetovan.com",
"role": "Maintainer"
}
],
"description": "More info available on: http://pear.php.net/package/Net_Ping",
"time": "2018-11-08T12:14:54+00:00"
},
{
"name": "pear/pear_exception",
"version": "v1.0.0",
"source": {
"type": "git",
"url": "https://github.com/pear/PEAR_Exception.git",
"reference": "8c18719fdae000b690e3912be401c76e406dd13b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pear/PEAR_Exception/zipball/8c18719fdae000b690e3912be401c76e406dd13b",
"reference": "8c18719fdae000b690e3912be401c76e406dd13b",
"shasum": ""
},
"require": {
"php": ">=4.4.0"
},
"require-dev": {
"phpunit/phpunit": "*"
},
"type": "class",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-0": {
"PEAR": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"include-path": [
"."
],
"license": [
"BSD-2-Clause"
],
"authors": [
{
"name": "Helgi Thormar",
"email": "dufuz@php.net"
},
{
"name": "Greg Beaver",
"email": "cellog@php.net"
}
],
"description": "The PEAR Exception base class.",
"homepage": "https://github.com/pear/PEAR_Exception",
"keywords": [
"exception"
],
"time": "2015-02-10T20:07:52+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">=5.3"
},
"platform-dev": []
}

View file

@ -1,860 +0,0 @@
-- phpMyAdmin SQL Dump
-- version 2.11.9.4
-- http://www.phpmyadmin.net
--
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
--
-- --------------------------------------------------------
--
-- Table structure for table `challenge`
--
CREATE TABLE IF NOT EXISTS `challenge` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`challenge` char(255) NOT NULL,
`dfrn-id` char(255) NOT NULL,
`expire` int(11) NOT NULL,
`type` char(255) NOT NULL,
`last_update` char(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `config` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`cat` char(255) NOT NULL,
`k` char(255) NOT NULL,
`v` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Table structure for table `contact`
--
CREATE TABLE IF NOT EXISTS `contact` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL COMMENT 'owner uid',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`self` tinyint(1) NOT NULL DEFAULT '0',
`remote_self` tinyint(1) NOT NULL DEFAULT '0',
`rel` tinyint(1) NOT NULL DEFAULT '0',
`duplex` tinyint(1) NOT NULL DEFAULT '0',
`network` char(255) NOT NULL,
`name` char(255) NOT NULL,
`nick` char(255) NOT NULL,
`attag` char(255) NOT NULL,
`photo` text NOT NULL,
`thumb` text NOT NULL,
`micro` text NOT NULL,
`site-pubkey` text NOT NULL,
`issued-id` char(255) NOT NULL,
`dfrn-id` char(255) NOT NULL,
`url` char(255) NOT NULL,
`nurl` char(255) NOT NULL,
`addr` char(255) NOT NULL,
`alias` char(255) NOT NULL,
`pubkey` text NOT NULL,
`prvkey` text NOT NULL,
`batch` char(255) NOT NULL,
`request` text NOT NULL,
`notify` text NOT NULL,
`poll` text NOT NULL,
`confirm` text NOT NULL,
`poco` text NOT NULL,
`aes_allow` tinyint(1) NOT NULL DEFAULT '0',
`ret-aes` tinyint(1) NOT NULL DEFAULT '0',
`usehub` tinyint(1) NOT NULL DEFAULT '0',
`subhub` tinyint(1) NOT NULL DEFAULT '0',
`hub-verify` char(255) NOT NULL,
`last-update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`success_update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`name-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`uri-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`avatar-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`term-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`priority` tinyint(3) NOT NULL,
`blocked` tinyint(1) NOT NULL DEFAULT '1',
`readonly` tinyint(1) NOT NULL DEFAULT '0',
`writable` tinyint(1) NOT NULL DEFAULT '0',
`hidden` tinyint(1) NOT NULL DEFAULT '0',
`pending` tinyint(1) NOT NULL DEFAULT '1',
`rating` tinyint(1) NOT NULL DEFAULT '0',
`reason` text NOT NULL,
`closeness` tinyint(2) NOT NULL DEFAULT '99',
`info` mediumtext NOT NULL,
`profile-id` int(11) NOT NULL DEFAULT '0',
`bdyear` CHAR( 4 ) NOT NULL COMMENT 'birthday notify flag',
`bd` date NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `self` (`self`),
KEY `network` (`network`),
KEY `name` (`name`),
KEY `nick` (`nick`),
KEY `attag` (`attag`),
KEY `url` (`url`),
KEY `nurl` (`nurl`),
KEY `addr` (`addr`),
KEY `batch` (`batch`),
KEY `issued-id` (`issued-id`),
KEY `dfrn-id` (`dfrn-id`),
KEY `blocked` (`blocked`),
KEY `readonly` (`readonly`),
KEY `hidden` (`hidden`),
KEY `pending` (`pending`),
KEY `closeness` (`closeness`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `group`
--
CREATE TABLE IF NOT EXISTS `group` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL,
`visible` tinyint(1) NOT NULL DEFAULT '0',
`deleted` tinyint(1) NOT NULL DEFAULT '0',
`name` char(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `group_member`
--
CREATE TABLE IF NOT EXISTS `group_member` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL,
`gid` int(10) unsigned NOT NULL,
`contact-id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `intro`
--
CREATE TABLE IF NOT EXISTS `intro` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL,
`fid` int(11) NOT NULL DEFAULT '0',
`contact-id` int(11) NOT NULL,
`knowyou` tinyint(1) NOT NULL,
`duplex` tinyint(1) NOT NULL DEFAULT '0',
`note` text NOT NULL,
`hash` char(255) NOT NULL,
`datetime` datetime NOT NULL,
`blocked` tinyint(1) NOT NULL DEFAULT '1',
`ignore` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `item`
--
CREATE TABLE IF NOT EXISTS `item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`guid` char(64) NOT NULL,
`uri` char(255) NOT NULL,
`uid` int(10) unsigned NOT NULL DEFAULT '0',
`contact-id` int(10) unsigned NOT NULL DEFAULT '0',
`type` char(255) NOT NULL,
`wall` tinyint(1) NOT NULL DEFAULT '0',
`gravity` tinyint(1) NOT NULL DEFAULT '0',
`parent` int(10) unsigned NOT NULL DEFAULT '0',
`parent-uri` char(255) NOT NULL,
`extid` char(255) NOT NULL,
`thr-parent` char(255) NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`commented` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`received` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`owner-name` char(255) NOT NULL,
`owner-link` char(255) NOT NULL,
`owner-avatar` char(255) NOT NULL,
`author-name` char(255) NOT NULL,
`author-link` char(255) NOT NULL,
`author-avatar` char(255) NOT NULL,
`title` char(255) NOT NULL,
`body` mediumtext NOT NULL,
`app` char(255) NOT NULL,
`verb` char(255) NOT NULL,
`object-type` char(255) NOT NULL,
`object` text NOT NULL,
`target-type` char(255) NOT NULL,
`target` text NOT NULL,
`postopts` text NOT NULL,
`plink` char(255) NOT NULL,
`resource-id` char(255) NOT NULL,
`event-id` int(10) unsigned NOT NULL,
`tag` mediumtext NOT NULL,
`attach` mediumtext NOT NULL,
`inform` mediumtext NOT NULL,
`file` mediumtext NOT NULL,
`location` char(255) NOT NULL,
`coord` char(255) NOT NULL,
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
`private` tinyint(1) NOT NULL DEFAULT '0',
`pubmail` tinyint(1) NOT NULL DEFAULT '0',
`moderated` tinyint(1) NOT NULL DEFAULT '0',
`visible` tinyint(1) NOT NULL DEFAULT '0',
`spam` tinyint(1) NOT NULL DEFAULT '0',
`starred` tinyint(1) NOT NULL DEFAULT '0',
`bookmark` tinyint(1) NOT NULL DEFAULT '0',
`unseen` tinyint(1) NOT NULL DEFAULT '1',
`deleted` tinyint(1) NOT NULL DEFAULT '0',
`origin` tinyint(1) NOT NULL DEFAULT '0',
`forum_mode` tinyint(1) NOT NULL DEFAULT '0',
`last-child` tinyint(1) unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `guid` (`guid`),
KEY `uri` (`uri`),
KEY `uid` (`uid`),
KEY `contact-id` (`contact-id`),
KEY `type` (`type`),
KEY `parent` (`parent`),
KEY `parent-uri` (`parent-uri`),
KEY `extid` (`extid`),
KEY `created` (`created`),
KEY `edited` (`edited`),
KEY `received` (`received`),
KEY `moderated` (`moderated`),
KEY `visible` (`visible`),
KEY `spam` (`spam`),
KEY `starred` (`starred`),
KEY `bookmark` (`bookmark`),
KEY `deleted` (`deleted`),
KEY `origin` (`origin`),
KEY `forum_mode` (`forum_mode`),
KEY `last-child` (`last-child`),
KEY `unseen` (`unseen`),
KEY `wall` (`wall`),
KEY `author-name` (`author-name`),
KEY `author-link` (`author-link`),
FULLTEXT KEY `title` (`title`),
FULLTEXT KEY `body` (`body`),
FULLTEXT KEY `tag` (`tag`),
FULLTEXT KEY `file` (`file`),
FULLTEXT KEY `allow_cid` (`allow_cid`),
FULLTEXT KEY `allow_gid` (`allow_gid`),
FULLTEXT KEY `deny_cid` (`deny_cid`),
FULLTEXT KEY `deny_gid` (`deny_gid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `mail`
--
CREATE TABLE IF NOT EXISTS `mail` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL,
`guid` char(64) NOT NULL,
`from-name` char(255) NOT NULL,
`from-photo` char(255) NOT NULL,
`from-url` char(255) NOT NULL,
`contact-id` char(255) NOT NULL,
`convid` int(10) unsigned NOT NULL,
`title` char(255) NOT NULL,
`body` mediumtext NOT NULL,
`seen` tinyint(1) NOT NULL,
`reply` tinyint(1) NOT NULL DEFAULT '0',
`replied` tinyint(1) NOT NULL,
`uri` char(255) NOT NULL,
`parent-uri` char(255) NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `guid` (`guid`),
KEY `convid` (`convid`),
KEY `reply` (`reply`),
KEY `uri` (`uri`),
KEY `parent-uri` (`parent-uri`),
KEY `created` (`created`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `photo`
--
CREATE TABLE IF NOT EXISTS `photo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL,
`contact-id` int(10) unsigned NOT NULL,
`guid` char(64) NOT NULL,
`resource-id` char(255) NOT NULL,
`created` datetime NOT NULL,
`edited` datetime NOT NULL,
`title` char(255) NOT NULL,
`desc` text NOT NULL,
`album` char(255) NOT NULL,
`filename` char(255) NOT NULL,
`height` smallint(6) NOT NULL,
`width` smallint(6) NOT NULL,
`data` mediumblob NOT NULL,
`scale` tinyint(3) NOT NULL,
`profile` tinyint(1) NOT NULL DEFAULT '0',
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `resource-id` (`resource-id`),
KEY `album` (`album`),
KEY `scale` (`scale`),
KEY `profile` (`profile`),
KEY `guid` (`guid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `profile`
--
CREATE TABLE IF NOT EXISTS `profile` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`profile-name` char(255) NOT NULL,
`is-default` tinyint(1) NOT NULL DEFAULT '0',
`hide-friends` tinyint(1) NOT NULL DEFAULT '0',
`name` char(255) NOT NULL,
`pdesc` char(255) NOT NULL,
`dob` char(32) NOT NULL DEFAULT '0000-00-00',
`address` char(255) NOT NULL,
`locality` char(255) NOT NULL,
`region` char(255) NOT NULL,
`postal-code` char(32) NOT NULL,
`country-name` char(255) NOT NULL,
`gender` char(32) NOT NULL,
`marital` char(255) NOT NULL,
`showwith` tinyint(1) NOT NULL DEFAULT '0',
`with` text NOT NULL,
`sexual` char(255) NOT NULL,
`politic` char(255) NOT NULL,
`religion` char(255) NOT NULL,
`pub_keywords` text NOT NULL,
`prv_keywords` text NOT NULL,
`about` text NOT NULL,
`summary` char(255) NOT NULL,
`music` text NOT NULL,
`book` text NOT NULL,
`tv` text NOT NULL,
`film` text NOT NULL,
`interest` text NOT NULL,
`romance` text NOT NULL,
`work` text NOT NULL,
`education` text NOT NULL,
`contact` text NOT NULL,
`homepage` char(255) NOT NULL,
`photo` char(255) NOT NULL,
`thumb` char(255) NOT NULL,
`publish` tinyint(1) NOT NULL DEFAULT '0',
`net-publish` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
FULLTEXT KEY `pub_keywords` (`pub_keywords`),
FULLTEXT KEY `prv_keywords` (`prv_keywords`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `profile_check`
--
CREATE TABLE IF NOT EXISTS `profile_check` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL,
`cid` int(10) unsigned NOT NULL,
`dfrn_id` char(255) NOT NULL,
`sec` char(255) NOT NULL,
`expire` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `session`
--
CREATE TABLE IF NOT EXISTS `session` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`sid` char(255) NOT NULL,
`data` text NOT NULL,
`expire` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `sid` (`sid`),
KEY `expire` (`expire`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `user`
--
CREATE TABLE IF NOT EXISTS `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`guid` char(16) NOT NULL,
`username` char(255) NOT NULL,
`password` char(255) NOT NULL,
`nickname` char(255) NOT NULL,
`email` char(255) NOT NULL,
`openid` char(255) NOT NULL,
`timezone` char(128) NOT NULL,
`language` char(32) NOT NULL DEFAULT 'en',
`register_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`login_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`default-location` char(255) NOT NULL,
`allow_location` tinyint(1) NOT NULL DEFAULT '0',
`theme` char(255) NOT NULL,
`pubkey` text NOT NULL,
`prvkey` text NOT NULL,
`spubkey` text NOT NULL,
`sprvkey` text NOT NULL,
`verified` tinyint(1) unsigned NOT NULL DEFAULT '0',
`blocked` tinyint(1) unsigned NOT NULL DEFAULT '0',
`blockwall` tinyint(1) unsigned NOT NULL DEFAULT '0',
`hidewall` tinyint(1) unsigned NOT NULL DEFAULT '0',
`blocktags` tinyint(1) unsigned NOT NULL DEFAULT '0',
`notify-flags` int(11) unsigned NOT NULL DEFAULT '65535',
`page-flags` int(11) unsigned NOT NULL DEFAULT '0',
`prvnets` tinyint(1) NOT NULL DEFAULT '0',
`pwdreset` char(255) NOT NULL,
`maxreq` int(11) NOT NULL DEFAULT '10',
`expire` int(11) unsigned NOT NULL DEFAULT '0',
`account_expired` tinyint( 1 ) NOT NULL DEFAULT '0',
`account_expires_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`expire_notification_sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
`openidserver` text NOT NULL,
PRIMARY KEY (`uid`),
KEY `nickname` (`nickname`),
KEY `account_expired` (`account_expired`),
KEY `hidewall` (`hidewall`),
KEY `blockwall` (`blockwall`),
KEY `blocked` (`blocked`),
KEY `verified` (`verified`),
KEY `login_date` (`login_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `register` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`hash` CHAR( 255 ) NOT NULL ,
`created` DATETIME NOT NULL ,
`uid` INT(11) UNSIGNED NOT NULL,
`password` CHAR(255) NOT NULL,
`language` CHAR(16) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `clients` (
`client_id` VARCHAR( 20 ) NOT NULL ,
`pw` VARCHAR( 20 ) NOT NULL ,
`redirect_uri` VARCHAR( 200 ) NOT NULL ,
`name` VARCHAR( 128 ) NULL DEFAULT NULL,
`icon` VARCHAR( 255 ) NULL DEFAULT NULL,
`uid` INT NOT NULL DEFAULT 0,
PRIMARY KEY ( `client_id` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `tokens` (
`id` VARCHAR( 40 ) NOT NULL ,
`secret` VARCHAR( 40 ) NOT NULL ,
`client_id` VARCHAR( 20 ) NOT NULL ,
`expires` INT NOT NULL ,
`scope` VARCHAR( 200 ) NOT NULL ,
`uid` INT NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `auth_codes` (
`id` VARCHAR( 40 ) NOT NULL ,
`client_id` VARCHAR( 20 ) NOT NULL ,
`redirect_uri` VARCHAR( 200 ) NOT NULL ,
`expires` INT NOT NULL ,
`scope` VARCHAR( 250 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `queue` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`cid` INT NOT NULL ,
`network` CHAR( 32 ) NOT NULL,
`created` DATETIME NOT NULL ,
`last` DATETIME NOT NULL ,
`content` MEDIUMTEXT NOT NULL,
`batch` TINYINT( 1 ) NOT NULL DEFAULT '0',
INDEX ( `cid` ),
INDEX ( `created` ),
INDEX ( `last` ),
INDEX ( `network` ),
INDEX ( `batch` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `pconfig` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL DEFAULT '0',
`cat` CHAR( 255 ) NOT NULL ,
`k` CHAR( 255 ) NOT NULL ,
`v` MEDIUMTEXT NOT NULL
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `hook` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`hook` CHAR( 255 ) NOT NULL ,
`file` CHAR( 255 ) NOT NULL ,
`function` CHAR( 255 ) NOT NULL
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `addon` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` CHAR( 255 ) NOT NULL ,
`version` CHAR( 255 ) NOT NULL ,
`installed` TINYINT( 1 ) NOT NULL DEFAULT '0' ,
`timestamp` BIGINT NOT NULL DEFAULT '0' ,
`plugin_admin` TINYINT( 1 ) NOT NULL DEFAULT '0'
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `event` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL ,
`cid` INT NOT NULL ,
`uri` CHAR( 255 ) NOT NULL,
`created` DATETIME NOT NULL ,
`edited` DATETIME NOT NULL ,
`start` DATETIME NOT NULL ,
`finish` DATETIME NOT NULL ,
`desc` TEXT NOT NULL ,
`location` TEXT NOT NULL ,
`type` CHAR( 255 ) NOT NULL ,
`nofinish` TINYINT( 1 ) NOT NULL DEFAULT '0',
`adjust` TINYINT( 1 ) NOT NULL DEFAULT '1',
`allow_cid` MEDIUMTEXT NOT NULL ,
`allow_gid` MEDIUMTEXT NOT NULL ,
`deny_cid` MEDIUMTEXT NOT NULL ,
`deny_gid` MEDIUMTEXT NOT NULL
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `cache` (
`k` CHAR( 255 ) NOT NULL PRIMARY KEY ,
`v` TEXT NOT NULL,
`updated` DATETIME NOT NULL
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fcontact` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`url` CHAR( 255 ) NOT NULL ,
`name` CHAR( 255 ) NOT NULL ,
`photo` CHAR( 255 ) NOT NULL ,
`request` CHAR( 255 ) NOT NULL,
`nick` CHAR( 255 ) NOT NULL ,
`addr` CHAR( 255 ) NOT NULL ,
`batch` CHAR( 255) NOT NULL,
`notify` CHAR( 255 ) NOT NULL ,
`poll` CHAR( 255 ) NOT NULL ,
`confirm` CHAR( 255 ) NOT NULL ,
`priority` TINYINT( 1 ) NOT NULL ,
`network` CHAR( 32 ) NOT NULL ,
`alias` CHAR( 255 ) NOT NULL ,
`pubkey` TEXT NOT NULL ,
`updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
INDEX ( `addr` ),
INDEX ( `network` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `ffinder` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT UNSIGNED NOT NULL ,
`cid` INT UNSIGNED NOT NULL ,
`fid` INT UNSIGNED NOT NULL
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fsuggest` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL ,
`cid` INT NOT NULL ,
`name` CHAR( 255 ) NOT NULL ,
`url` CHAR( 255 ) NOT NULL ,
`request` CHAR( 255 ) NOT NULL,
`photo` CHAR( 255 ) NOT NULL ,
`note` TEXT NOT NULL ,
`created` DATETIME NOT NULL
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `mailacct` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL,
`server` CHAR( 255 ) NOT NULL ,
`port` INT NOT NULL,
`ssltype` CHAR( 16 ) NOT NULL,
`mailbox` CHAR( 255 ) NOT NULL,
`user` CHAR( 255 ) NOT NULL ,
`pass` TEXT NOT NULL ,
`action` INT NOT NULL ,
`movetofolder` CHAR(255) NOT NULL ,
`pubmail` TINYINT(1) NOT NULL DEFAULT '0',
`last_check` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `attach` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL ,
`hash` CHAR(64) NOT NULL,
`filename` CHAR(255) NOT NULL,
`filetype` CHAR( 64 ) NOT NULL ,
`filesize` INT NOT NULL ,
`data` LONGBLOB NOT NULL ,
`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`edited` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`allow_cid` MEDIUMTEXT NOT NULL ,
`allow_gid` MEDIUMTEXT NOT NULL ,
`deny_cid` MEDIUMTEXT NOT NULL ,
`deny_gid` MEDIUMTEXT NOT NULL
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `guid` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`guid` CHAR( 64 ) NOT NULL ,
INDEX ( `guid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `sign` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`iid` INT UNSIGNED NOT NULL ,
`signed_text` MEDIUMTEXT NOT NULL ,
`signature` TEXT NOT NULL ,
`signer` CHAR( 255 ) NOT NULL ,
INDEX ( `iid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `deliverq` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`cmd` CHAR( 32 ) NOT NULL ,
`item` INT NOT NULL ,
`contact` INT NOT NULL
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `search` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL ,
`term` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
INDEX ( `uid` ),
INDEX ( `term` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fserver` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`server` CHAR( 255 ) NOT NULL ,
`posturl` CHAR( 255 ) NOT NULL ,
`key` TEXT NOT NULL,
INDEX ( `server` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `gcontact` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` CHAR( 255 ) NOT NULL ,
`url` CHAR( 255 ) NOT NULL ,
`nurl` CHAR( 255 ) NOT NULL ,
`photo` CHAR( 255 ) NOT NULL,
`connect` CHAR( 255 ) NOT NULL,
INDEX ( `nurl` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `glink` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`cid` INT NOT NULL ,
`uid` INT NOT NULL ,
`gcid` INT NOT NULL,
`updated` DATETIME NOT NULL,
INDEX ( `cid` ),
INDEX ( `uid` ),
INDEX ( `gcid` ),
INDEX ( `updated` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `gcign` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL ,
`gcid` INT NOT NULL,
INDEX ( `uid` ),
INDEX ( `gcid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `conv` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`guid` CHAR( 64 ) NOT NULL ,
`recips` MEDIUMTEXT NOT NULL ,
`uid` INT NOT NULL,
`creator` CHAR( 255 ) NOT NULL ,
`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`subject` MEDIUMTEXT NOT NULL,
INDEX ( `created` ),
INDEX ( `updated` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `notify` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`hash` CHAR( 64 ) NOT NULL,
`type` INT( 11 ) NOT NULL ,
`name` CHAR( 255 ) NOT NULL ,
`url` CHAR( 255 ) NOT NULL ,
`photo` CHAR( 255 ) NOT NULL ,
`date` DATETIME NOT NULL ,
`msg` MEDIUMTEXT NOT NULL ,
`uid` INT NOT NULL ,
`link` CHAR( 255 ) NOT NULL ,
`parent` INT( 11 ) NOT NULL,
`seen` TINYINT( 1 ) NOT NULL DEFAULT '0',
`verb` CHAR( 255 ) NOT NULL,
`otype` CHAR( 16 ) NOT NULL,
INDEX ( `hash` ),
INDEX ( `type` ),
INDEX ( `uid` ),
INDEX ( `link` ),
INDEX ( `parent` ),
INDEX ( `seen` ),
INDEX ( `date` ),
INDEX ( `otype` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `item_id` (
`iid` INT NOT NULL ,
`uid` INT NOT NULL ,
`face` CHAR( 255 ) NOT NULL ,
`dspr` CHAR( 255 ) NOT NULL ,
`twit` CHAR( 255 ) NOT NULL ,
`stat` CHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `iid` ),
INDEX ( `uid` ),
INDEX ( `face` ),
INDEX ( `dspr` ),
INDEX ( `twit` ),
INDEX ( `stat` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `manage` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL ,
`mid` INT NOT NULL,
INDEX ( `uid` ),
INDEX ( `mid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `poll_result` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`poll_id` INT NOT NULL ,
`choice` INT NOT NULL ,
INDEX ( `poll_id` ),
INDEX ( `choice` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `poll` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL ,
`q0` MEDIUMTEXT NOT NULL ,
`q1` MEDIUMTEXT NOT NULL ,
`q2` MEDIUMTEXT NOT NULL ,
`q3` MEDIUMTEXT NOT NULL ,
`q4` MEDIUMTEXT NOT NULL ,
`q5` MEDIUMTEXT NOT NULL ,
`q6` MEDIUMTEXT NOT NULL ,
`q7` MEDIUMTEXT NOT NULL ,
`q8` MEDIUMTEXT NOT NULL ,
`q9` MEDIUMTEXT NOT NULL ,
INDEX ( `uid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
--
-- Table structure for table `notify-threads`
--
-- notify-id: notify.id of the first notification of this thread
-- master-parent-item: item.id of the parent item
-- parent-item: item.id of the imediate parent (only for multi-thread)
-- not used yet.
-- receiver-uid: user.uid of the receiver of this notification.
--
-- If we query for a master-parent-item and receiver-uid...
-- * Returns 1 item: this is not the parent notification,
-- so just "follow" the thread (references to this notification)
-- * Returns no item: this is the first notification related to
-- this parent item. So, create the record and use the message-id
-- header.
CREATE TABLE IF NOT EXISTS `notify-threads` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`notify-id` INT NOT NULL,
`master-parent-item` INT( 10 ) unsigned NOT NULL DEFAULT '0',
`parent-item` INT( 10 ) unsigned NOT NULL DEFAULT '0',
`receiver-uid` INT NOT NULL,
INDEX ( `master-parent-item` ),
INDEX ( `receiver-uid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `spam` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL,
`spam` INT NOT NULL DEFAULT '0',
`ham` INT NOT NULL DEFAULT '0',
`term` CHAR(255) NOT NULL,
`date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
INDEX ( `uid` ),
INDEX ( `spam` ),
INDEX ( `ham` ),
INDEX ( `term` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;

261
dfrndir.sql Normal file
View file

@ -0,0 +1,261 @@
-- Generation Time: Apr 21, 2017 at 03:58 AM
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
--
--
-- --------------------------------------------------------
--
-- Table structure for table `flag`
--
CREATE TABLE IF NOT EXISTS `flag` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL,
`reason` int(11) NOT NULL,
`total` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `photo`
--
CREATE TABLE IF NOT EXISTS `photo` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`profile-id` int(11) NOT NULL,
`data` mediumblob NOT NULL,
`score` float NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2516 DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `profile`
--
CREATE TABLE IF NOT EXISTS `profile` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(255) NOT NULL,
`nurl` char(255) NOT NULL,
`comm` tinyint(1) NOT NULL DEFAULT '0',
`pdesc` char(255) NOT NULL,
`locality` char(255) NOT NULL,
`region` char(255) NOT NULL,
`postal-code` char(32) NOT NULL,
`country-name` char(255) NOT NULL,
`homepage` char(255) NOT NULL,
`photo` char(255) NOT NULL,
`tags` longtext NOT NULL,
`available` tinyint(1) NOT NULL DEFAULT '1',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`censored` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `name` (`name`(250)),
KEY `nurl` (`nurl`(250)),
KEY `comm` (`comm`),
KEY `pdesc` (`pdesc`(250)),
KEY `locality` (`locality`(250)),
KEY `region` (`region`(250)),
KEY `country-name` (`country-name`(250)),
KEY `homepage` (`homepage`(250))
) ENGINE=MyISAM AUTO_INCREMENT=2518 DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `session`
--
CREATE TABLE IF NOT EXISTS `session` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`sid` char(255) NOT NULL,
`data` mediumtext NOT NULL,
`expire` int(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
KEY `sid` (`sid`(250)),
KEY `expire` (`expire`)
) ENGINE=MyISAM AUTO_INCREMENT=22917 DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `site`
--
CREATE TABLE IF NOT EXISTS `site` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(255) NOT NULL,
`url` char(255) NOT NULL,
`version` char(16) NOT NULL,
`plugins` mediumtext NOT NULL,
`reg_policy` char(32) NOT NULL,
`info` mediumtext NOT NULL,
`admin_name` char(255) NOT NULL,
`admin_profile` char(255) NOT NULL,
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `site-health`
--
CREATE TABLE IF NOT EXISTS `site-health` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`base_url` varchar(255) NOT NULL,
`effective_base_url` varchar(255) DEFAULT NULL,
`health_score` int(11) NOT NULL DEFAULT '0',
`no_scrape_url` varchar(255) DEFAULT NULL,
`dt_first_noticed` datetime NOT NULL,
`dt_last_seen` datetime DEFAULT NULL,
`dt_last_probed` datetime DEFAULT NULL,
`dt_last_heartbeat` datetime DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`version` varchar(255) DEFAULT NULL,
`addons` mediumtext,
`reg_policy` char(32) DEFAULT NULL,
`info` mediumtext,
`admin_name` varchar(255) DEFAULT NULL,
`admin_profile` varchar(255) DEFAULT NULL,
`ssl_state` bit(1) DEFAULT NULL,
`ssl_grade` varchar(3) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `base_url` (`base_url`(250)),
KEY `health_score` (`health_score`),
KEY `dt_last_seen` (`dt_last_seen`)
) ENGINE=MyISAM AUTO_INCREMENT=10035 DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `site-probe`
--
CREATE TABLE IF NOT EXISTS `site-probe` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`site_health_id` int(10) UNSIGNED NOT NULL,
`dt_performed` datetime NOT NULL,
`request_time` int(10) UNSIGNED NOT NULL,
`avg_ping` int(11) DEFAULT NULL,
`speed_score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `site_health_id` (`site_health_id`),
KEY `dt_performed` (`dt_performed`)
) ENGINE=MyISAM AUTO_INCREMENT=28987 DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `site-scrape`
--
CREATE TABLE IF NOT EXISTS `site-scrape` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`site_health_id` int(10) UNSIGNED NOT NULL,
`dt_performed` datetime NOT NULL,
`request_time` int(10) UNSIGNED NOT NULL,
`scrape_time` int(10) UNSIGNED NOT NULL,
`photo_time` int(10) UNSIGNED NOT NULL,
`total_time` int(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
KEY `site_health_id` (`site_health_id`),
KEY `dt_performed` (`dt_performed`)
) ENGINE=MyISAM AUTO_INCREMENT=177675 DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `sync-pull-queue`
--
CREATE TABLE IF NOT EXISTS `sync-pull-queue` (
`url` varchar(255) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `sync-push-queue`
--
CREATE TABLE IF NOT EXISTS `sync-push-queue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(255) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `sync-targets`
--
CREATE TABLE IF NOT EXISTS `sync-targets` (
`base_url` varchar(255) CHARACTER SET utf8 NOT NULL,
`pull` bit(1) NOT NULL DEFAULT b'0',
`push` bit(1) NOT NULL DEFAULT b'1',
`dt_last_pull` bigint(20) UNSIGNED DEFAULT NULL,
PRIMARY KEY (`base_url`),
KEY `push` (`push`),
KEY `pull` (`pull`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `sync-timestamps`
--
CREATE TABLE IF NOT EXISTS `sync-timestamps` (
`url` varchar(255) NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`url`),
KEY `modified` (`modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `tag`
--
CREATE TABLE IF NOT EXISTS `tag` (
`term` varchar(50) NOT NULL,
`profile_id` int(11) NOT NULL,
PRIMARY KEY (`term`,`profile_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
--
-- Table structure for table `user`
--
CREATE TABLE IF NOT EXISTS `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`email` char(255) NOT NULL,
`password` char(255) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `profile`
--
ALTER TABLE `profile` ADD FULLTEXT KEY `tags` (`tags`);
ALTER TABLE `profile` ADD FULLTEXT KEY `profile-ft` (`name`,`pdesc`,`homepage`,`locality`,`region`,`country-name`,`tags`);

View file

@ -1,75 +0,0 @@
Account Basics
==============
* [Home](help)
**Registration**
Not all Friendica sites allow open registration. If registration is allowed, you will see a "Register" link immediately below the login prompts on the site home page. Following this link will take you to the site registration page. The strength of our network is that lots of different sites are all completely compatible with each other. If the site you're visting doesn't allow registration, or you think you might prefer another one, you can find a <a href ="http://dir.friendica.com/siteinfo">list of public servers here</a>, and find one that meets your needs.
If you'd like to have your own server, you can do that too. Visit <a href = "http://friendica.com/download">the Friendica website</a> to download the code with setup instructions. It's a very simple install process that anybody experienced in hosting websites, or with basic Linux experience can handle easily.
*OpenID*
The first field on the Registration page is for an OpenID address. If you do not have an OpenID address or do not wish to use OpenID, leave this field blank. If you have an OpenID account elsewhere and wish to use it, enter the address into this field and click 'Register'. Friendica will attempt to extract as much information as possible from your OpenID provider and return to this page with those items already filled in.
*Your Full Name*
Please provide your full name **as you would like it to be displayed on this system**. Most people use their real name for this, but you're under no obligation to do so yourself.
*Email Address*
Please provide a valid email address. Your email address is **never** published. We need this to send you account information and your login details. You may also occasionally receive notifications of incoming messages or items requiring your attention, but you have the ability to completely disable these from your Settings page once you have logged in. This doesn't have to be your primary email address, but it does need to be a real email address. You can't get your initial password, or reset a lost password later without it. This is the only bit of personal information that has to be accurate.
*Nickname*
A nickname is used to generate web addresses for many of your personal pages, and is also treated like an email address when establishing communications with others. Due to the way that the nickname is used, it has some limitations. It must contain only US-ASCII text characters and numbers, and must also start with a text character. It also must be unique on this system. This is used in many places to identify your account, and once set - cannot be changed.
*Directory Publishing*
The Registration form also allows you to choose whether or not to list your account in the online directory. This is like a "phone book" and you may choose to be unlisted. We recommend that you select 'Yes' so that other people (friends, family, etc.) will be able to find you. If you choose 'No', you will essentially be invisible and have few opportunities for interaction. Whichever you choose, this can be changed any time from your Settings page after you login.
*Register*
Once you have provided the necessary details, click the 'Register' button. An email will be sent to you providing your account login details. Please watch your email (including spam folders) for your registration details and initial password.
**Login Page**
On the 'Login' page, please enter your login information that was provided during registration. You may use either your nickname or email address as a Login Name.
If you use your account to manage multiple '[Pages](help/Pages)' and these all have the same email address, please enter the nickname for the account you wish to manage.
*If* your account has been OpenID enabled, you may use your OpenID address as a login name and leave the password blank. You will be redirected to your OpenID provider to complete your authorisation.
Otherwise, enter your password. This will have been initially provided in your registration email message. Your password is case-sensitive, so please check your 'Caps Lock' key if you are having difficulty logging in.
**Changing Your Password**
After your first login, please visit the 'Settings' page from the top menu bar and change your password to something that you will remember.
**Getting Started**
A ['Tips for New Members'](newmember) link will show up on your home page for two weeks to provide some important Getting Started information.
**Retrieving Personal Data**
You can export a copy of your personal data in XML format from the "Export personal data" link at the top of your settings page.
**See Also**
* [Profiles](help/Profiles)
* [Groups and Privacy](help/Groups-and-Privacy)
* [Remove Account](help/Remove-Account)

View file

@ -1,31 +0,0 @@
Bugs and Issues
===============
* [Home](help)
If your server has a support page, you should report any bugs/issues you encounter there first. Reporting to your support page before reporting to the developers makes their job easier, as they don't have to deal with bug reports that might not have anything to do with them, and that helps us get new features faster.
If you're a technical user, or your site doesn't have a support page, you'll need to use the <a href = "http://bugs.friendica.com/">Bug Tracker</a>. Please perform a search to see if there's already an open bug that matches yours before submitting anything.
Try to provide as much information as you can about the bug, including the **full** text of any error messages or notices, and any steps required to replicate the problem in as much detail as possible. It's generally better to provide too much information than not enough.
<a href = "http://www.chiark.greenend.org.uk/~sgtatham/bugs.html">See this article</a> to learn more about submitting **good** bug reports.
**Bug Sponsorship**
If you find a bug, and it is caused by a problem in main branch (ie, is not specific to our site), you may sponsor it.
The bug/issue database allows you to sponsor issues. This provides an incentive for developers to work on your issue. This isn't necessary - we don't like bugs and will try to fix them. This has more importance for future development projects and feature requests.
Bug sponsorship works on the honour system. If you agree to pay $10 to fix a bug, when the fix has been checked in and verified you should send a paypal payment to the developer assigned to the bug. Don't ever think you can get away with not paying a developer for work performed. Some of these guys could hack into your credit card account if you make them mad.
At the present time, one has to be approved as a "developer" to be able to assign themselves to a sponsored bug. This requires the developer to have some history fixing Friendica bugs. This is for everybody's assurance that the bug fix will work well with Friendica. If you wish to become approved as a developer, work on and check in some non-sponsored issues or your own projects and we will move you up the ladder.
If you truly feel you have the solution to a sponsored bug but aren't an approved developer, you risk a sponsored developer assigning the bug to themselves before you check it in, but if they haven't done so - include a short note with your pull request. Assuming that it meets our code standards, we'll see that you get credit.
If you sponsor a project at greater than a $50 level, you may be requested by the developer for payment up front before work has begun (typically half). Again this is on the honour system - and is mostly to avoid payment issues and disagreements later. You should also expect to see some progress updates or demonstrations if the work takes more than a week or two. If the work is not completed within a reasonable time (as decided by those involved), you are entitled to get your money back.
Friendica is not involved in these transactions. It is purely a personal agreement between sponsors and developers. If there are any issues, the parties will need to work it out between themselves. We're just providing some guidelines to help avoid potential problems.

View file

@ -1,67 +0,0 @@
Connectors
==========
* [Home](help)
Connectors allow you to connect with external social networks and services. Connectors are only required for posting to existing accounts on Facebook, Twitter, and StatusNet. There is also a connector for accessing your email INBOX.
If the following network connectors are installed on your system, select the following links to visit the appropriate settings page and configure them for your account:
* [Facebook](/settings/addon)
* [Twitter](/settings/addon)
* [StatusNet](/settings/addon)
* [Email](/settings)
Instructions For Connecting To People On Specific Services
==========================================================
**Friendica**
You may connect by providing your Identity Address on the 'Connect' page of any Friendica member. You may also put their Identity Address into the Connect box on your [Contacts](contacts) page.
**Diaspora**
Add the Diaspora 'handle' to the 'Connect/Follow' text box on your [Contacts](contacts) page.
**Identi.ca/StatusNet/GNU-Social**
These are described as the "federated social web" or OStatus contacts.
Please note that there are **no** privacy provisions on the OStatus network. Any message which is delivered to **any** OStatus member is visible to anybody in the world and will negate any privacy settings that you have in effect. These messages will also turn up in public searches.
Since OStatus communications do not use authentication, if you select the profile privacy option to hide your profile and messages from unknown viewers, OStatus members will **not** be able to receive your communications.
To connect with an OStatus member insert their profile URL or Identity address into the Connect box on your [Contacts](contacts) page.
The StatusNet connector may be used if you wish posts to appear on an OStatus site using an existing OStatus account.
It is not necessary to do this, as you may 'follow' OStatus members from Friendica and they may follow you (by placing their own Identity Address into your 'Connect' page).
**Blogger, Wordpress, RSS feeds, arbitrary web pages**
Put the URL into the Connect box on your [Contacts](contacts) page. You will not be able to reply to these contacts.
This will allow you to _connect_ with millions of pages on the internet. All that we require to do this is that the page use a discoverable feed using either the RSS or Atom syndication format, and which provides an author name and a site image in a form which we can extract.
**Twitter**
To follow a Twitter member, put the URL of the Twitter member's main page into the Connect box on your [Contacts](contacts) page. To reply, you must have the Twitter connector installed, and reply using your own status editor. Begin the message with @twitterperson replacing with the Twitter username.
**Email**
Configure the email connector from your [Settings](settings) page. Once this has been done, you may enter an email addres to connect with using the Connect box on your [Contacts](contacts) page. They must be the sender of a message which is currently in your INBOX for the connect to succeed. You may include email contacts in private conversations.
**Facebook**
The Facebook connector is a plugin/addon which allows you to interact with friends on Facebook from within Friendica. If enabled, your Facebook friend list will be imported, and you will see and be able to respond to Facebook posts. Facebook members may also be added to private conversation groups. You will not be able to connect with individual Facebook accounts - but will have your entire friend list imported and updated if new friends are added.
Assuming the Facebook plugin/addon has been installed on your system, it can be enabled by going to your [Plugin Settings](settings/addon) page, and then select "Facebook Connector Settings" on that page. This will only appear if the Facebook plugin/addon has been installed. Follow the instruction to install or remove the Facebook connector.
You may also choose whether your public postings are posted to Facebook by default. You may toggle this setting at any time from the Permissions settings of the status post editor (click the lock icon). This setting has no effect on private conversations - which will always be delivered to Facebook friends who are included in the permissions.
(Note: At this time, Facebook contacts will not be able to view any private photos. This will be resolved in a future release. Facebook contacts may however see any public photos you have uploaded.)

View file

@ -1,22 +0,0 @@
Friendica Developer Guide
Here is how you can join us.
First, get yourself a working git package on the system where you will be
doing development.
Create your own github account.
You may fork/clone the Friendica repository from [https://github.com/friendica/friendica.git](https://github.com/friendica/friendica.git).
Follow the instructions provided here: [http://help.github.com/fork-a-repo/](http://help.github.com/fork-a-repo/)
to create and use your own tracking fork on github
Then go to your github page and create a "Pull request" when you are ready
to notify us to merge your work.
**Important**
Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Friendica developer to review the code.

View file

@ -1,53 +0,0 @@
Groups and Privacy
==================
* [Home](help)
Groups are merely collections of friends. But Friendica uses these to unlock some very powerful features.
To create a group, visit your Friendica "Contacts" page and select "Create a new group". Give the group a name.
This brings you to a page where you can select the group members.
You will have two boxes on this page. The top box is the roster of current group members. Below that is another box containing all of your friends who are *not* members of the group.
If you click on a photo of a person who isn't in the group, they will be put into the group. If you click on a photo of a person who is in the group, they will be removed from it.
Once you have created a group, you may use it in any access control list. This is the little lock icon beneath the status update box on your home page. If you click this you can select who can see and who can *not* see the post you are about to make. These can be individual people or groups.
On your "Network" page you will find posts and conversation from everybody in your network. You may select an individual group on this page to show conversations pertaining only to members of that group.
But wait, there's more...
If you look carefully when visiting a group from your Network page, the lock icon under the status update box has an exclamation mark next to it. This is meant to draw attention to that lock. Click the lock. You will see that since you are only viewing a certain group of people, your status updates while on that screen default to only being seen by that same group of people. This is how you keep your future employers from seeing what you write to your drinking buddies. You can over-ride this setting, but this makes it easy to separate your conversations into different friend circles.
These private conversations work best when your friends are Friendica members. We know who else can see the conversations - nobody, *unless* your friends cut and paste the messages and send them to others.
This is a trust issue you need to be aware of. No software in the world can prevent your friends from leaking your confidential and trusted communications. Only a wise choice of friends.
But it isn't as clear cut when dealing with status.net, identi.ca and other network providers. You are encouraged to be **very** cautious when other network members are in a group because it's entirely possible for your private messages to end up in a public newsfeed. If you look at the Contact Edit page for any person, we will tell you whether or not they are members of an insecure network where you should exercise caution.
On your "Settings" page, you may create a set of default permissions which apply to every post that you create.
Once you have created a post, you can not change the permissions assigned. Within seconds it has been delivered to lots of people - and perhaps everybody it was addressed to. If you mistakenly created a message and wish you could take it back, the best you can do is to delete it. We will send out a delete notification to everybody who received the message - and this should wipe out the message with the same speed it was initially propagated. In most cases it will be completely wiped from the Internet - in under a minute. Again, this applies to Friendica networks. Once a message spreads to other networks, it may not be removed quickly and in some cases it may not be removed at all.
In case you haven't yet figured this out, we are encouraging you to encourage your friends to use Friendica - because all these privacy features work much better within a privacy-aware network. Many of the other social networks Friendica can connect to have no privacy controls.
Profiles, Privacy, and Photos
=============================
The decentralised nature of Friendica (many websites exchanging information rather than one website which controls everything) has some implications with privacy as it relates to people on other sites. There are things you should be aware of, so you can decide best how to interact privately.
Sharing photos privately is a problem. We can only share them __privately__ with Friendica members. In order to share with other people, we need to prove who they are. We can prove the identity of Friendica members, as we have a mechanism to do so. Your friends on other networks will be blocked from viewing these private photos because we cannot prove that they should be allowed to see them.
Our developers are working on solutions to allow access to your friends - no matter what network they are on. However we take privacy seriously and don't behave like some networks that __pretend__ your photos are private, but make them available to others without proof of identity.
Your profile and "wall" may also be visited by your friends from other networks, and you can block access to these by web visitors that Friendica doesn't know. Be aware that this could include some of your friends on other networks.
This may produce undesired results when posting a long status message to (for instance) Twitter and even Facebook. When Friendica sends a post to these networks which exceeds the service length limit, we truncate it and provide a link to the original. The original is a link back to your Friendica profile. As Friendica cannot prove who they are, it may not be possible for these people to view your post in full.
For people in this situation we would recommend providing a "Twitter-length" summary, with more detail for friends that can see the post in full.
Blocking your profile or entire Friendica site from unknown web visitors also has serious implications for communicating with StatusNet/identi.ca members. These networks communicate with others via public protocols that are not authenticated. In order to view your posts, these networks have to access them as an "unknown web visitor". If we allowed this, it would mean anybody could in fact see your posts, and you've instructed Friendica not to allow this. So be aware that the act of blocking your profile to unknown visitors also has the effect of blocking outbound communication with public networks (such as identi.ca) and feed readers such as Google Reader.

View file

@ -1,36 +0,0 @@
Friendica Documentation and Resources
=====================================
**Contents**
* [Account Basics](help/Account-Basics)
* [Profiles](help/Profiles)
* [Connectors](help/Connectors)
* [Making Friends](help/Making-Friends)
* [Groups and Privacy](help/Groups-and-Privacy)
* [Tags and Mentions](help/Tags-and-Mentions)
* [Pages](help/Pages)
* [Remove Account](help/Remove-Account)
* [Bugs and Issues](help/Bugs-and-Issues)
**Technical Documentation**
* [Install](help/Install)
* [Settings](help/Settings)
* [Plugins](help/Plugins)
* [Installing Connectors (Facebook/Twitter/StatusNet)](help/Installing-Connectors)
* [Message Flow](help/Message-Flow)
* [Developers](help/Developers)
**External Resources**
* [Main Website](http://friendica.com)
* [Forums](http://groups.google.com/group/friendica)
* [Developer Forums](http://groups.google.com/group/friendica-dev)
**About**
* [Site/Version Info](friendica)

View file

@ -1,111 +0,0 @@
Friendica Installation
We've tried very hard to ensure that Friendica will run on commodity hosting platforms - such as those used to host Wordpress blogs and Drupal websites. But be aware that Friendica is more than a simple web application. It is a complex communications system which more closely resembles an email server than a web server. For reliability and performance, messages are delivered in the background and are queued for later delivery when sites are down. This kind of functionality requires a bit more of the host system than the typical blog. Not every PHP/MySQL hosting provider will be able to support Friendica. Many will. But **please** review the requirements and confirm these with your hosting provider prior to installation.
Also if you encounter installation issues, please let us know via the forums at http://groups.google.com/group/friendica or file an issue at http://bugs.friendica.com . Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future. Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
Before you begin: Choose a domain name or subdomain name for your server. Put some thought into this - because changing it after installation is currently not-supported. Things will break, and some of your friends may have difficulty communicating with you. We plan to address this limitation in a future release.
1. Requirements
- Apache with mod-rewrite enabled and "Options All" so you can use a
local .htaccess file
- PHP 5.2+. The later the better. You'll need 5.3 for encryption of key exchange conversations. On a Windows environment, 5.2+ might not work as the function dns_get_record() is only available with version 5.3.
- PHP *command line* access with register_argc_argv set to true in the
php.ini file
- curl, gd, mysql, and openssl extensions
- some form of email server or email gateway such that PHP mail() works
- mcrypt (optional; used for server-to-server message encryption)
- Mysql 5.x
- ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks
(Windows) [Note: other options are presented in Section 7 of this document]
- Installation into a top-level domain or sub-domain (without a
directory/path component in the URL) is preferred. Directory paths will
not be as convenient to use and have not been thoroughly tested.
[Dreamhost.com offers all of the necessary hosting features at a
reasonable price. If your hosting provider doesn't allow Unix shell access,
you might have trouble getting everything to work.]
2. Unpack the Friendica files into the root of your web server document area.
- If you are able to do so, we recommend using git to clone the source repository rather than to use a packaged tar or zip file. This makes the software much easier to update. The Linux command to clone the repository into a directory "mywebsite" would be
`git clone https://github.com/friendica/friendica.git mywebsite`
- and then you can pick up the latest changes at any time with
`git pull`
- For installing addons
- First you should be **on** your website folder
`cd mywebsite`
- Then you should clone the addon repository (separtely)
`git clone https://github.com/friendica/friendica-addons.git addon`
- For keeping the addon tree updated, you should be on you addon tree and issue a git pull
`cd mywebsite/addon`
`git pull`
- If you copy the directory tree to your webserver, make sure
that you also copy .htaccess - as "dot" files are often hidden
and aren't normally copied.
3. Create an empty database and note the access details (hostname, username, password, database name).
4. Visit your website with a web browser and follow the instructions. Please note any error messages and correct these before continuing.
5. *If* the automated installation fails for any reason, check the following:
- ".htconfig.php" exists ... If not, edit htconfig.php and change system settings. Rename
to .htconfig.php
- Database is populated. ... If not, import the contents of "database.sql" with phpmyadmin
or mysql command line
6. At this point visit your website again, and register your personal account.
Registration errors should all be recoverable automatically.
If you get any *critical* failure at this point, it generally indicates the
database was not installed correctly. You might wish to move/rename
.htconfig.php to another name and empty (called 'dropping') the database
tables, so that you can start fresh.
7. Set up a cron job or scheduled task to run the poller once every 5-10
minutes in order to perform background processing. Example:
`cd /base/directory; /path/to/php include/poller.php`
Change "/base/directory", and "/path/to/php" as appropriate for your situation.
If you are using a Linux server, run "crontab -e" and add a line like the
one shown, substituting for your unique paths and settings:
`*/10 * * * * cd /home/myname/mywebsite; /usr/bin/php include/poller.php`
You can generally find the location of PHP by executing "which php". If you
have troubles with this section please contact your hosting provider for
assistance. Friendica will not work correctly if you cannot perform this step.
Alternative: You may be able to use the 'poormancron' plugin to perform this step
if you are using a recent Friendica release. To do this, edit the file ".htconfig.php"
and look for a line describing your plugins. On a fresh installation, it will look like
`$a->config['system']['addon'] = 'js_upload';`
This indicates the "js_upload" addon module is enabled. You may add additional
addons/plugins using this same line in the configuration file. Change it to read
`$a->config['system']['addon'] = 'js_upload,poormancron';`
and save your changes.

View file

@ -1,135 +0,0 @@
Installing Connectors (Facebook/Twitter/StatusNet)
==================================================
* [Home](help)
Friendica uses plugins to provide connectivity to some networks, such as Facebook and Twitter.
There is also a plugin to post through to an existing account on a Status.Net service. You do not require this to communicate with Status.Net members from Friendica - only if you wish to post to an existing account.
All three of these plugins require an account on the target network. In addition you (or typically the server administrator) will need to obtain an API key to provide authenticated access to your Friendica server.
**Site Configuration**
Plugins must be installed by the site administrator before they can be used. This is accomplished through the site administration panel.
Each of the connectors also requires an "API key" from the service you wish to connect with. Some plugins allow you to enter this information in the site administration pages, while others may require you to edit your configuration file (.htconfig.php). The method for obtaining these keys varies greatly - but almost always requires an existing account on the target service. Once installed, these API keys can usually be shared by all site members.
The details of configuring each service follows (much of this information comes directly from the plugin source files):
**Twitter Plugin for Friendica**
* Author: Tobias Diekershoff
* tobias.diekershoff@gmx.net
* License:3-clause BSD license
Configuration:
To use this plugin you need a OAuth Consumer key pair (key & secret)
you can get it from Twitter at https://twitter.com/apps
Register your Friendica site as "Client" application with "Read & Write" access.
We do not need "Twitter as login". When you've registered the app you get the
OAuth Consumer key and secret pair for your application/site.
Add this key pair to your global .htconfig.php
```
$a->config['twitter']['consumerkey'] = 'your consumer_key here';
$a->config['twitter']['consumersecret'] = 'your consumer_secret here';
```
After this, your user can configure their Twitter account settings
from "Settings -> Connector Settings".
Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin
**StatusNet Plugin for Friendica**
* Author: Tobias Diekershoff
* tobias.diekershoff@gmx.net
* License:3-clause BSD license
Configuration
When the addon is activated the user has to aquire the following in order to connect to the StatusNet account of choice.
* The base URL for the StatusNet API, for identi.ca this is https://identi.ca/api/
* OAuth Consumer key & secret
To get the OAuth Consumer key pair the user has to
(a) ask her Friendica admin if a pair already exists or
(b) has to register the Friendica server as a client application on the StatusNet server.
This can be done from the account settings under "Settings -> Connections -> Register an OAuth client application -> Register a new application" on the StatusNet server.
During the registration of the OAuth client remember the following:
* Application names must be unique on the StatusNet site, so we recommend a Name of 'friendica-nnnn', replace 'nnnn' with a random number or your website name.
* there is no callback url
* register a desktop client
* with read & write access
* the Source URL should be the URL of your Friendica server
After the required credentials for the application are stored in the configuration you have to actually connect your Friendica account with StatusNet. This is done from the Settings -> Connector Settings page. Follow the Sign in with StatusNet button, allow access and then copy the security code into the box provided. Friendica will then try to acquire the final OAuth credentials from the API.
If successful the addon settings will allow you to select to post your public messages to your StatusNet account (have a look behind the little lock symbol beneath the status "editor" on your Home or Network pages).
Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/StatusNet_Plugin
**Installing the Friendica/Facebook connector**
* register an API key for your site from developer.facebook.com
This requires a Facebook account, and may require additional authentication in the form of credit card or mobile phone verification.
a. We'd be very happy if you include "Friendica" in the application name
to increase name recognition. The Friendica icons are also present
in the images directory and may be uploaded as a Facebook app icon.
Use images/friendica-16.jpg for the Icon and images/friendica-128.jpg for the Logo.
b. The url should be your site URL with a trailing slash.
You **may** be required to provide a privacy and/or terms of service URL.
c. Set the following values in your .htconfig.php file
```
$a->config['facebook']['appid'] = 'xxxxxxxxxxx';
$a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx';
```
Replace with the settings Facebook gives you.
d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set Site URL
to yoursubdomain.yourdomain.com. Set Site Domain to your yourdomain.com.
On Friendica, visit the Facebook Settings section of the "Settings->Connector Settings" page. And click 'Install Facebook Connector'.
This will ask you to login to Facebook and grant permission to the
plugin to do its stuff. Allow it to do so.
You're done. To turn it off visit the Connector Settings page again and
'Remove Facebook posting'.
Videos and embeds will not be posted if there is no other content. Links
and images will be converted to a format suitable for the Facebook API and
long posts truncated - with a link to view the full post.
Facebook contacts will also not be able to view "private" photos, as they are not able to authenticate to your site to establish identity. We will address this in a future release.

View file

@ -1,59 +0,0 @@
Making Friends
==============
* [Home](help)
Friendship in Friendica can take on a great many different meanings. But let's keep it simple, you want to be friends with somebody. How do you do it?
The easiest thing to do is to join the <a href = "http://kakste.com/profile/newhere">New Here</a> group. This group is especially for people new to the Friendica network. Simply connect to the group, post to the wall, and make new friends. You don't even have to like us - comment on a few of our posts, and other people will start to add you too.
The next thing you can do is look at the Directory. The directory is split up into two parts. If you click the directory button, you will be presented with a list of all members (who chose to be listed) on your server. You'll also see a link to the Global Directory. If you click through to the global directory, you will be presented with a list of everybody who chose to be listed across all instances of Friendica. You will also see a "Show Community Forums" link, which will direct you to Groups, Forums and Fanpages. You connect to people, groups and forums in the same way, except groups and forums will automatically accept your introduction request, whereas a human will approve you manually.
To connect with other Friendica user
Visit their profile. Just beneath their profile picture will be the word 'Connect' (we're assuming this is an English language profile).
Click that. It will take you to a "Connect" form.
This is going to ask you for your Identity Address. This is necessary so that this person's website can find yours.
What do you put in the box?
If your Friendica site is called "demo.friendica.com" and your username/nickname on that site is "bob", you would put in "bob@demo.friendica.com".
Notice this looks just like an email address. It was meant to be that way. It's easy for people to remember.
You *could* also put in the URL of your "home" page, such as "http://demo.friendica.com/profile/bob", but the email-style address is certainly easier.
When you've submitted the connection page, it will take you back to your own site where you must then login (if necessary) and verify the connection request on *your* site. Once you've done this, the two websites can communicate with each other to complete the process (after your new friend has approved the request).
If you already know somebody's Identity Address, you can enter it in the "connect" box on your "Contacts" page. This will take you through a similar process.
**Alternate Networks**
You can also use your Identity Address or other people's Identity Addresses to become friends across networks. The list of possible networks is growing all the time. If you know (for instance) "bob" on identi.ca (a Status.Net site) you could put bob@identi.ca into your Contact page and become friends across networks. (Or you can put in the URL to Bob's identi.ca page if you wish). You can also be "partial" friends with somebody on Google Buzz by putting in their gmail address. Google Buzz does not yet support all the protocols we need for direct messaging, but you should be able to follow status updates from within Friendica. You can do the same for Twitter accounts and Diaspora accounts. In fact you can "follow" most anybody or any website that produces a syndication feed (RSS/Atom,etc.). If we can find an information stream and a name to attach to the contact, we'll try to connect with them.
If you have supplied your mailbox connection information on your Settings page, you can enter the email address of anybody that has sent you a message recently and have their email messages show up in your social stream. You can also reply to them from within Friendica.
People can also become friends with you from other networks. If a friend of yours has an identi.ca account, they can become friends with you by putting your Friendica Identity Address into their identi.ca subscription dialog box. A similar mechanism is available for Diaspora members, by putting your iendtity address into their search bar.
Note: Some versions of StatusNet software may require the full URL to your profile and may not work with the identity address.
When somebody requests friendship you will receive a notification. You will need to approve this before the friendship is complete.
Some networks allow people to send you messages without being friends and without your approval. Friendica does not allow this by default, as it would open a gateway for spam.
When you receive a friendship notification from another Friendica member, you will have the option of allowing them as a "fan" or as a "friend". If they are a fan, they can see what you have to say, including private communications that you send to them, but not vice versa. As a friend, you can both communicate with each other.
Diaspora uses a different terminology, and you are given the option of allowing them to "share with you", or being full friends.
Once you have become friends, if you find the person constantly sends you spam or worthless information, you can "Ignore" them - without breaking off the friendship or even alerting them to the fact that you aren't interested in anything they are saying. In many ways they are like a "fan" - but they don't know this. They think they are a friend.
You can also "block" a person. This completely blocks communications with that person. They may still be able to see your public posts, as can anybody in the world, but they cannot communicate with you directly.
You can also delete a friend no matter what the friendship status - which complete removes everything relating to that person from your website.

View file

@ -1,54 +0,0 @@
Friendica Message Flow
This page attempts to document some of the details of how messages get from one person to another in the Friendica network. There are multiple paths, using multiple protocols and message formats.
Those attempting to understand these message flows should become familiar with (at the minimum) the DFRN protocol document (http://dfrn.org/dfrn.pdf) and the message passing elements of the OStatus stack (salmon and Pubsubhubbub).
Most message passing involves the file include/items.php, which has functions for several feed-related import/export activities.
When a message is posted, all immediate deliveries to all networks are made using include/notifier.php, which chooses how (and to whom) to deliver the message. This file also invokes the local side of all deliveries including DFRN-notify.
mod/dfrn_notify.php handles the remote side of DFRN-notify.
Local feeds are generated by mod/dfrn_poll.php - which also handles the remote side of DFRN-poll protocol.
Salmon notifications arrive via mod/salmon.php.
Push (pubsubhubbub) feeds arrive via mod/pubsub.php
DFRN-poll feed imports arrive via include/poller.php as a scheduled task, this implements the local side of the DFRN-poll protocol.
Scenario #1. Bob posts a public status message
This is a public message with no conversation members so no private transport is used. There are two paths it can take - as a bbcode path to DFRN clients, and converted to HTML with the server's PuSH (pubsubhubbub) hubs notified. When a PuSH hub is operational, dfrn-poll clients prefer to receive their information through the PuSH channel. They will fall back on a daily poll in case the hub has delivery issues (this is quite common when using the default Google reference hub). If there is no specified hub or hubs, DFRN clients will poll at a configurable (per-contact) rate at up to 5-minute intervals. Feeds retrieved via dfrn-poll are bbcode and may also contain private conversations which the poller has permissions to see.
Scenario #2. Jack replies to Bob's public message. Jack is on the Friendica/DFRN network.
Jack uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation using dfrn-notify. PuSH hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).
Scenario #3. Mary replies to Bob's public message. Mary is on the Friendica/DFRN network.
Mary uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation (excluding himself, the conversation is now sent to both Jack and Mary). Messages are sent using dfrn-notify. Push hubs are also notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).
Scenario #4. William replies to Bob's public message. William is on the OStatus network.
William uses salmon to notify Bob of the reply. Content is html embedded in salmon magic envelope. Bob then creates a feed of the conversation and sends it to all Friendica participants involved in the conversation using dfrn-notify (excluding himself, the conversation is sent to both Jack and Mary). Push hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).
Scenario #5. Bob posts a private message to Mary and Jack.
Message is delivered immediately to Mary and Jack using dfrn_notify. Public hubs are not notified. Requeueing is attempted in case of timeout. Replies follow the same flow as the public replies except that hubs are not notified and message is never made available in the public feed. The entire conversation is also made available to Mary and Jack (and nobody else) through their dfrn-poll personalised feed.

View file

@ -1,36 +0,0 @@
Pages
=====
* [Home](help)
Friendica also lets you create forum and/or celebrity pages.
Every page in Friendica has a nickname and these must all be unique. This applies to all pages, whether they are normal profiles or forum pages.
Therefore the first thing you need to do to create a new page is to register a new account for the page. Please note that the site administrator can restrict and/or regulate the registration of new accounts.
If you create a second account on a system and use the same email address or OpenID account as an existing account, you will no longer be able to use the email address (or OpenID) to login to the account. You should login using the account nickname instead.
On the new account, visit the 'Settings' page. Towards the end of the page are "Advanced Page Settings". Typically you would use "Normal Account" for a normal personal account. This is the default selection. Group pages provide the ability for people to become friends/fans of the page without requiring approval.
The exact setting you would use depends on how you wish to interact with people who join the page. The "Soapbox" setting let's the page owner control all communications. Everything you post will go out to the page members, but there will be no opportunity for interaction. This setting would typically be used for announcements or corporate communications.
The most common setting is the "Community Account". This creates a group page where all members can freely interact.
The "Automatic Friend Account" is typically used for personal profile pages where you wish to automatically approve any friendship/connection requests.
**Managing Multiple Pages**
We recommend that you create group pages with the same email address and password as your normal account. If you do this, you will find a new "Manage" tab on the menu bar which lets you toggle identities easily and manage your pages. You are not required to do this, but the alternative is to logout and log back into the other account to manage alternate pages - and this could get cumbersome if you manage several different pages/identities.
You may also appoint a delegate to manage your page. Do this by visiting the [Delegation Setup Page](delegate). This will provide you with a list of contacts on this system under "Potential Delegates". Selecting one or more persons will give them access to manage your page. They will be able to edit contacts, profiles, and all content for this account/page. Please use this facility wisely. Delegated managers will not be able to alter basic account settings such as passwords or page types and/or remove the account.
**Posting to Community Pages**
If you are a member of a community page/forum, you may post to the page by including an @-tag in the post mentioning the forum. For example @bicycle would send my post to all members of the group "bicycle" in addition to the normal recipients. If your post is private you must also explicitly include the group in the post permissions (to allow the forum "contact" to see the post) **and** mention it in a tag (which redistributes the post to the forum members).
You may also post to a community page/forum by posting a "wall-to-wall" post using secure cross-site authentication.
Comments which are relayed to community pages will be relayed back to the original post creator. Mentioning the forum/group with an @-tag in a comment does not relay the message, as distribution is controlled entirely by the original post creator.

View file

@ -1,352 +0,0 @@
**Friendica Addon/Plugin development**
Please see the sample addon 'randplace' for a working example of using some of these features. The facebook addon provides an example of integrating both "addon" and "module" functionality. Addons work by intercepting event hooks - which must be registered. Modules work by intercepting specific page requests (by URL path).
Plugin names cannot contain spaces or other punctuation and are used as filenames and function names. You may supply a "friendly" name within the comment block. Each addon must contain both an install and an uninstall function based on the addon/plugin name. For instance "plugin1name_install()". These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your plugin will require. The install and uninstall functions will also be called (i.e. re-installed) if the plugin changes after installation - therefore your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for "setup" amd "remove".
Plugins should contain a comment block with the four following parameters:
/*
* Name: My Great Plugin
* Description: This is what my plugin does. It's really cool
* Version: 1.0
* Author: John Q. Public <john@myfriendicasite.com>
*/
Register your plugin hooks during installation.
register_hook($hookname, $file, $function);
$hookname is a string and corresponds to a known Friendica hook.
$file is a pathname relative to the top-level Friendica directory. This *should* be 'addon/plugin_name/plugin_name.php' in most cases.
$function is a string and is the name of the function which will be executed when the hook is called.
Your hook callback functions will be called with at least one and possibly two arguments
function myhook_function(&$a, &$b) {
}
If you wish to make changes to the calling data, you must declare them as
reference variables (with '&') during function declaration.
$a is the Friendica 'App' class - which contains a wealth of information
about the current state of Friendica, such as which module has been called,
configuration info, the page contents at the point the hook was invoked, profile
and user information, etc. It is recommeded you call this '$a' to match its usage
elsewhere.
$b can be called anything you like. This is information which is specific to the hook
currently being processed, and generally contains information that is being immediately
processed or acted on that you can use, display, or alter. Remember to declare it with
'&' if you wish to alter it.
**Modules**
Plugins/addons may also act as "modules" and intercept all page requests for a given URL path. In order for a plugin to act as a module it needs to define a function "plugin_name_module()" which takes no arguments and need not do anything.
If this function exists, you will now receive all page requests for "http://my.web.site/plugin_name" - with any number of URL components as additional arguments. These are parsed into an array $a->argv, with a corresponding $a->argc indicating the number of URL components. So http://my.web.site/plugin/arg1/arg2 would look for a module named "plugin" and pass its module functions the $a App structure (which is available to many components). This will include:
$a->argc = 3
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
Your module functions will often contain the function plugin_name_content(&$a), which defines and returns the page body content. They may also contain plugin_name_post(&$a) which is called before the _content function and typically handles the results of POST forms. You may also have plugin_name_init(&$a) which is called very early on and often does module initialisation.
**Current hooks:**
**'authenticate'** - called when a user attempts to login.
$b is an array
'username' => the supplied username
'password' => the supplied password
'authenticated' => set this to non-zero to authenticate the user.
'user_record' => successful authentication must also return a valid user record from the database
**'logged_in'** - called after a user has successfully logged in.
$b contains the $a->user array
**'display_item'** - called when formatting a post for display.
$b is an array
'item' => The item (array) details pulled from the database
'output' => the (string) HTML representation of this item prior to adding it to the page
**'post_local'** - called when a status post or comment is entered on the local system
$b is the item array of the information to be stored in the database
{Please note: body contents are bbcode - not HTML)
**'post_local_end'** - called when a local status post or comment has been stored on the local system
$b is the item array of the information which has just been stored in the database
{Please note: body contents are bbcode - not HTML)
**'post_remote'** - called when receiving a post from another source. This may also be used to post local activity or system generated messages.
$b is the item array of information to be stored in the database and the item
body is bbcode.
**'settings_form'** - called when generating the HTML for the user Settings page
$b is the (string) HTML of the settings page before the final '</form>' tag.
**'settings_post'** - called when the Settings pages are submitted.
$b is the $_POST array
**'plugin_settings'** - called when generating the HTML for the addon settings page
$b is the (string) HTML of the addon settings page before the final '</form>' tag.
**'plugin_settings_post'** - called when the Addon Settings pages are submitted.
$b is the $_POST array
**'profile_post'** - called when posting a profile page.
$b is the $_POST array
**'profile_edit'** - called prior to output of profile edit page
$b is array
'profile' => profile (array) record from the database
'entry' => the (string) HTML of the generated entry
**'profile_advanced'** - called when the HTML is generated for the 'Advanced profile', corresponding to the 'Profile' tab within a person's profile page.
$b is the (string) HTML representation of the generated profile
(The profile array details are in $a->profile)
**'directory_item'** - called from the Directory page when formatting an item for display
$b is an array
'contact' => contact (array) record for the person from the database
'entry' => the (string) HTML of the generated entry
**'profile_sidebar_enter'** - called prior to generating the sidebar "short" profile for a page
$b is (array) the person's profile array
**'profile_sidebar'** - called when generating the sidebar "short" profile for a page
$b is an array
'profile' => profile (array) record for the person from the database
'entry' => the (string) HTML of the generated entry
**'contact_block_end'** - called when formatting the block of contacts/friends on a profile sidebar has completed
$b is an array
'contacts' => array of contacts
'output' => the (string) generated HTML of the contact block
**'bbcode'** - called during conversion of bbcode to html
$b is (string) converted text
**'html2bbcode'** - called during conversion of html to bbcode (e.g. remote message posting)
$b is (string) converted text
**'page_header'** - called after building the page navigation section
$b is (string) HTML of nav region
**'personal_xrd'** - called prior to output of personal XRD file.
$b is an array
'user' => the user record for the person
'xml' => the complete XML to be output
**'home_content'** - called prior to output home page content, shown to unlogged users
$b is (string) HTML of section region
**'contact_edit'** - called when editing contact details on an individual from the Contacts page
$b is (array)
'contact' => contact record (array) of target contact
'output' => the (string) generated HTML of the contact edit page
**'contact_edit_post'** - called when posting the contact edit page
$b is the $_POST array
**'init_1'** - called just after DB has been opened and before session start
$b is not used or passed
**'page_end'** - called after HTML content functions have completed
$b is (string) HTML of content div
A complete list of all hook callbacks with file locations (generated 14-Feb-2012): Please see the source for details of any hooks not documented above.
boot.php: call_hooks('login_hook',$o);
boot.php: call_hooks('profile_sidebar_enter', $profile);
boot.php: call_hooks('profile_sidebar', $arr);
boot.php: call_hooks("proc_run", $arr);
include/contact_selectors.php: call_hooks('network_to_name', $nets);
include/api.php: call_hooks('logged_in', $a->user);
include/api.php: call_hooks('logged_in', $a->user);
include/queue.php: call_hooks('queue_predeliver', $a, $r);
include/queue.php: call_hooks('queue_deliver', $a, $params);
include/text.php: call_hooks('contact_block_end', $arr);
include/text.php: call_hooks('smilie', $s);
include/text.php: call_hooks('prepare_body_init', $item);
include/text.php: call_hooks('prepare_body', $prep_arr);
include/text.php: call_hooks('prepare_body_final', $prep_arr);
include/nav.php: call_hooks('page_header', $a->page['nav']);
include/auth.php: call_hooks('authenticate', $addon_auth);
include/bbcode.php: call_hooks('bbcode',$Text);
include/oauth.php: call_hooks('logged_in', $a->user);
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
include/acl_selectors.php: call_hooks('contact_select_options', $x);
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
include/notifier.php: call_hooks('notifier_normal',$target_item);
include/notifier.php: call_hooks('notifier_end',$target_item);
include/items.php: call_hooks('atom_feed', $atom);
include/items.php: call_hooks('atom_feed_end', $atom);
include/items.php: call_hooks('atom_feed_end', $atom);
include/items.php: call_hooks('parse_atom', $arr);
include/items.php: call_hooks('post_remote',$arr);
include/items.php: call_hooks('atom_author', $o);
include/items.php: call_hooks('atom_entry', $o);
include/bb2diaspora.php: call_hooks('bb2diaspora',$Text);
include/cronhooks.php: call_hooks('cron', $d);
include/security.php: call_hooks('logged_in', $a->user);
include/html2bbcode.php: call_hooks('html2bbcode', $text);
include/Contact.php: call_hooks('remove_user',$r[0]);
include/Contact.php: call_hooks('contact_photo_menu', $args);
include/conversation.php: call_hooks('conversation_start',$cb);
include/conversation.php: call_hooks('render_location',$locate);
include/conversation.php: call_hooks('display_item', $arr);
include/conversation.php: call_hooks('render_location',$locate);
include/conversation.php: call_hooks('display_item', $arr);
include/conversation.php: call_hooks('item_photo_menu', $args);
include/conversation.php: call_hooks('jot_tool', $jotplugins);
include/conversation.php: call_hooks('jot_networks', $jotnets);
include/plugin.php:if(! function_exists('call_hooks')) {
include/plugin.php:function call_hooks($name, &$data = null) {
index.php: call_hooks('init_1');
index.php:call_hooks('app_menu', $arr);
index.php:call_hooks('page_end', $a->page['content']);
mod/photos.php: call_hooks('photo_post_init', $_POST);
mod/photos.php: call_hooks('photo_post_file',$ret);
mod/photos.php: call_hooks('photo_post_end',$foo);
mod/photos.php: call_hooks('photo_post_end',$foo);
mod/photos.php: call_hooks('photo_post_end',$foo);
mod/photos.php: call_hooks('photo_post_end',intval($item_id));
mod/photos.php: call_hooks('photo_upload_form',$ret);
mod/friendica.php: call_hooks('about_hook', $o);
mod/editpost.php: call_hooks('jot_tool', $jotplugins);
mod/editpost.php: call_hooks('jot_networks', $jotnets);
mod/parse_url.php: call_hooks('parse_link', $arr);
mod/home.php: call_hooks('home_init',$ret);
mod/home.php: call_hooks("home_content",$o);
mod/contacts.php: call_hooks('contact_edit_post', $_POST);
mod/contacts.php: call_hooks('contact_edit', $arr);
mod/settings.php: call_hooks('plugin_settings_post', $_POST);
mod/settings.php: call_hooks('connector_settings_post', $_POST);
mod/settings.php: call_hooks('settings_post', $_POST);
mod/settings.php: call_hooks('plugin_settings', $settings_addons);
mod/settings.php: call_hooks('connector_settings', $settings_connectors);
mod/settings.php: call_hooks('settings_form',$o);
mod/register.php: call_hooks('register_account', $newuid);
mod/like.php: call_hooks('post_local_end', $arr);
mod/xrd.php: call_hooks('personal_xrd', $arr);
mod/item.php: call_hooks('post_local_start', $_REQUEST);
mod/item.php: call_hooks('post_local',$datarray);
mod/item.php: call_hooks('post_local_end', $datarray);
mod/profile.php: call_hooks('profile_advanced',$o);
mod/profiles.php: call_hooks('profile_post', $_POST);
mod/profiles.php: call_hooks('profile_edit', $arr);
mod/tagger.php: call_hooks('post_local_end', $arr);
mod/cb.php: call_hooks('cb_init');
mod/cb.php: call_hooks('cb_post', $_POST);
mod/cb.php: call_hooks('cb_afterpost');
mod/cb.php: call_hooks('cb_content', $o);
mod/directory.php: call_hooks('directory_item', $arr);

View file

@ -1,51 +0,0 @@
Profiles
========
* [Home](help)
Friendica has unlimited profiles. You may use different profiles to show different "sides of yourself" to different audiences.
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...
* Your real name
* A photo of **you**
* Your location on the planet, at least to a country level.
Without this basic information, you could get very lonely here. Most people (even your best friends) will not try and connect with somebody that has a fake name or doesn't contain a real photo.
In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some "Public Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like.
Your default or public profile is also shown to contacts on other networks, since they do not have the ability to view your private profiles. Only members of the Friendica network can see alternate/private profiles.
To create an alternate profile, select "Profiles" from the menu of your Friendica site. You may edit an existing profile, change the profile photo, 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 assign a profile to specific persons, select the person from your "Contacts" page and click the pencil "Edit" icon. You will find a dropdown box listing the various profiles available. If this box is not selectable, the person is not in a supported network and cannot be assigned a specific profile.
Once a profile has been selected, when the person views your profile from one of the "magic profile links" on their site, they will see the private profile you have assigned. If they are not logged into their site or view your profile from elsewhere, they will see your public profile.
A magic profile link is indicated by a special cursor when hovering over a contact's name or photo. Currently this cursor is a hand next to a small padlock. These magic cursors indicate that by following the link, you are able to access special areas of the other person's pages which are only available to friends and may not be available to the general public.
You may also discover that (assuming you have the proper permissions) you may be able to post directly on the other person's profile (often called a "wall-to-wall" post). You may also be able to comment directly on posts from while visiting the other person's profile page.
There are two settings which allow you to publish your profile to a directory and ensure that it can be found by others. You can change these through settings on the "Settings" page. One setting allows you to publish your profile in the site directory of this Friendica server. Another option (this may have been disabled by the site creator) allows you to publish your profile in the "Global Directory". This is a mega directory which contains people from many other Friendica installations world-wide.
If you do not wish to be visible to any of these sites, you may leave your profile unpublished.
Although you may have multiple profiles, you only have one profile photo. This is intentional. In early tests we experimented with different photos for each profile and found it was very confusing for people. They might see a different picture depending on what website they visited or what conversation they were in, and often alerted them to the fact that other people might be able to see different profiles of you than they could see.
(But you can use the rich-text information boxes within a profile such as "Tell us about yourself" and link other photos onto the page.)
**Keywords and Directory Search**
On the site Directory page, you may search for people with published profiles who are on this site. The search is typically for your nickname or part of your full name. However this search will also match against other profile fields - such as gender, location, "about", work, and education. You may also include "Keywords" in your default profile - which may be used to search for common interests with other members. You have two sets of keywords available - public and private. Private keywords are *not* visible to anybody. You could use these keywords to locate people who share membership in secret societies, or that share a love of fishing (for example) - without making this information visible on your public profile. Public keywords are used in the friend suggestion tool and although they aren't readily visible, they may be seen by viewing the HTML of your profile page.
Directory searches are also able to use "boolean" logic so that you can search for "+lesbian +Florida" and find those who's sexual preference (or keywords) contain the world "lesbian" and that live in Florida. See the section on "Topical Tags" on the [Tags-and-Mentions](help/Tags-and-Mentions) page for more information on performing boolean searches.
On your Contacts page is a link to "Find People with Shared Interests" (unless your site administrator has disabled the global directory). This will combine both your public and private keywords, and find people in the global directory who have matching and/or similar keywords. (Your private keywords are not identified or stored on the global directory). The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance. You may discover that you are the first person on the list - because you are very likely the most relevant match for your keywords in the directory.

View file

@ -1,24 +0,0 @@
Remove Account
==============
* [Home](help)
We don't like to see people leave Friendica, but if you need to remove your account, you should visit the URL
http://sitename/removeme
with your web browser. You will need to be logged in at the time.
You will be asked for your password to confirm the request. If this matches your stored password, your account will immediately be removed. Unlike some social networks we do **not** hold onto it for a grace period in case you change your mind. Your user details, your conversations, your photos, your friends - everything; will be removed immediately and you will be logged out.
When we expire posts we send notifications out to Friendica to remove the posts. Diaspora doesn't have a bulk delete so this step is skipped on that network - and hopefully it will be obvious that deletion doesn't work on any other networks. If you manually delete a post or a range of posts we send individual delete notifications to Friendica and Diaspora for each deleted post.
Diaspora often loses these.
If you delete a post but somebody else has starred it, it is still removed. Your wishes take priority.
When you remove your account we physically remove all your posts and your profile and user data, etc. immediately.
In order to send out a bulk remove we would need to keep your account around to do this, as we would need to prove to your friends who it is that is submitting the request. We can't do this if you don't have an account.
Your friends may still see your posts if your account is gone, but there is no public place within Friendica where they can be viewed. If you had friends on Diaspora, your public posts may stick around and be visible to others from that network.

View file

@ -1,237 +0,0 @@
Here are some of the built-in features which don't have an exposed interface or are otherwise undocumented. Configuration settings are stored in the file ".htconfig.php". Edit this file with a text editor to make the desired changes. Several system settings are already documented in that file and will not be covered here.
**Hot Keys**
Friendica traps the following keyboard events:
* [Pause] - Pauses "Ajax" update activity. This is the process that provides updates without reloading the page. You may wish to pause it to reduce network usage and/or as a debugging aid for javascript developers. A pause indicator will appear at the lower right hand corner of the page. Hit the [pause] key once again to resume.
* [F8] - Displays a language selector
**Birthday Notifications**
Birthday events are published on your Home page for any friends having a birthday in the coming 6 days. In order for your birthday to be discoverable by all of your friends, you must set your birthday (at least the month and day) in your default profile. You are not required to provide the year.
**Configuration settings**
**Language**
System Setting
Please see util/README for information on creating language translations.
Config:
```
$a->config['system']['language'] = 'name';
```
**System Theme**
System Setting
Choose a named theme to be the default system theme (which may be over-ridden by user profiles). Default theme is "default".
Config:
```
$a->config['system']['theme'] = 'theme-name';
```
**Verify SSL Certitificates**
Security setting
By default Friendica allows SSL communication between websites that have "self-signed" SSL certificates. For the widest compatibility with browsers and other networks we do not recommend using self-signed certificates, but we will not prevent you from using them. SSL encrypts all the data transmitted between sites (and to your browser) and this allows you to have completely encrypted communications, and also protect your login session from hijacking. Self-signed certificates can be generated for free, without paying top-dollar for a website SSL certificate - however these aren't looked upon favourably in the security community because they can be subject to so-called "man-in-the-middle" attacks. If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites.
Config:
```
$a->config['system']['verifyssl'] = true;
```
**Allowed Friend Domains**
Corporate/Edu enhancement
Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. (Wildcard support on Windows platforms requires PHP5.3). By default, any (valid) domain may establish friendships with this site.
Config:
```
$a->config['system']['allowed_sites'] = "sitea.com, *siteb.com";
```
**Allowed Email Domains**
Corporate/Edu enhancement
Comma separated list of domains which are allowed in email addresses for registrations to this site. This can lockout those who are not part of this organisation from registering here. Wildcards are accepted. (Wildcard support on Windows platforms requires PHP5.3). By default, any (valid) email address is allowed in registrations.
Config:
```
$a->config['system']['allowed_email'] = "sitea.com, *siteb.com";
```
**Block Public**
Corporate/Edu enhancement
Set to true to block public access to all otherwise public personal pages on this site unless you are currently logged in. This blocks the viewing of profiles, friends, photos, the site directory and search pages to unauthorised persons. A side effect is that entries from this site will not appear in the global directory. We recommend specifically disabling that also (setting is described elsewhere on this page). Note: this is specifically for sites that desire to be "standalone" and do not wish to be connected to any other Friendica sites. Unauthorised persons will also not be able to request friendship with site members. Default is false. Available in version 2.2 or greater.
Config:
```
$a->config['system']['block_public'] = true;
```
**Force Publish**
Corporate/Edu enhancement
By default, each user can choose on their Settings page whether or not to have their profile published in the site directory. This setting forces all
profiles on this site to be listed in the site directory and there is no option provided to the user to change it. Default is false.
Config:
```
$a->config['system']['publish_all'] = true;
```
**Global Directory**
Corporate/Edu enhancement
This configures the URL to update the global directory, and is supplied in the default configuration. The undocumented part is that if this is not set, the global directory is completely unavailable to the application. This allows a private community to be completely isolated from the global mistpark network.
```
$a->config['system']['directory_submit_url'] = 'http://dir.friendica.com/submit';
```
**Proxy Configuration Settings**
If your site uses a proxy to connect to the internet, you may use these settings to communicate with the outside world (the outside world still needs to be able to see your website, or this will not be very useful).
Config:
```
$a->config['system']['proxy'] = "http://proxyserver.domain:port";
$a->config['system']['proxyuser'] = "username:password";
```
**Network Timeout**
How long to wait on a network communication before timing out. Value is in seconds. Default is 60 seconds. Set to 0 for unlimited (not recommended).
Config:
```
$a->config['system']['curl_timeout'] = 60;
```
**Banner/Logo**
Set the content for the site banner. Default is the Friendica logo and name. You may wish to provide HTML/CSS to style and/or position this content, as it may not be themed by default.
Config:
```
$a->config['system']['banner'] = '<span id="logo-text">My Great Website</span>';
```
**Maximum Image Size**
Maximum size in bytes of uploaded images. Default is 0, which means no limits.
Config:
```
$a->config['system']['maximagesize'] = 1000000;
```
**UTF-8 Regular Expressions**
During registrations, full names are checked using UTF-8 regular expressions. This requires PHP to have been compiled with a special setting to allow UTF-8 expressions. If you are completely unable to register accounts, set no_utf to true. Default is false (meaning UTF8 regular expressions are supported and working).
Config:
```
$a->config['system']['no_utf'] = true;
```
**Check Full Names**
You may find a lot of spammers trying to register on your site. During testing we discovered that since these registrations were automatic, the "Full Name" field was often set to just an account name with no space between first and last name. If you would like to support people with only one name as their full name, you may change this setting to true. Default is false.
Config:
```
$a->config['system']['no_regfullname'] = true;
```
**Gravatars**
During registration, we will try to automatically find a user photo for you on the web using the gravatar service. You may turn this off by setting 'no_gravatar' to true. Default is false.
Config:
```
$a->config['system']['no_gravatar'] = true;
```
**OpenID**
By default, OpenID may be used for both registration and logins. If you do not wish to make OpenID facilities available on your system (at all), set 'no_openid' to true. Default is false.
Config:
```
$a->config['system']['no_openid'] = true;
```
**Multiple Registrations**
The ability to create "Pages" requires a person to register more than once. Your site configuration can block registration (or require approval to register). By default logged in users can register additional accounts for use as pages. These will still require approval if REGISTER_APPROVE is selected. You may prohibit logged in users from creating additional accounts by setting 'block_extended_register' to true. Default is false.
Config:
```
$a->config['system']['block_extended_register'] = true;
```
**Developer Settings**
Most useful when debugging protocol exchanges and tracking down other communications issues.
Config:
```
$a->config['system']['debugging'] = true;
$a->config['system']['logfile'] = 'logfile.out';
$a->config['system']['loglevel'] = LOGGER_DEBUG;
```
Turns on detailed debugging logs which will be stored in 'logfile.out' (which must be writeable by the webserver). LOGGER_DEBUG will show a good deal of information about system activity but will not include detailed data. You may also select LOGGER_ALL but due to the volume of information we recommend only enabling this when you are tracking down a specific problem. Other log levels are possible but are not being used at the present time.
**PHP error logging**
Use the following settings to redirect PHP errors to a file.
Config:
```
error_reporting(E_ERROR | E_WARNING | E_PARSE );
ini_set('error_log','php.out');
ini_set('log_errors','1');
ini_set('display_errors', '0');
```
This will put all PHP errors in the file php.out (which must be writeable by the webserver). Undeclared variables are occasionally referenced in the program and therefore we do not recommend using E_NOTICE or E_ALL. The vast majority of issues reported at these levels are completely harmless. Please report to the developers any errors you encounter in the logs using the recommended settings above. They generally indicate issues which need to be resolved.
If you encounter a blank (white) page when using the application, view the PHP logs - as this almost always indicates an error has occurred.

View file

@ -1,36 +0,0 @@
Tags and Mentions
=================
* [Home](help)
Like many other modern social networks, Friendica uses a special notation inside messages to indicate "tags" or contextual links to other entities.
**Mentions**
People are tagged by preceding their name with the @ character.
The following are various ways of indicating a person:
* @mike - indicates a known contact in your social circle whose nickname is "mike"
* @mike_macgirvin - indicates a known contact in your social circle whose full name is "Mike Macgirvin". Note that spaces cannot be used inside tags.
* @mike+151 - this form is used by the drop-down tag completion tool. It indicates the contact whose nickname is mike and whose contact identifier number is 151. The drop-down tool may be used to resolve people with duplicate nicknames.
* @mike@macgirvin.com - indicates the Identity Address of a person on a different network, or one that is *not* in your social circle. This is called a "remote mention" and can only be an email-style locator, not a web URL.
Unless their system blocks unsolicited "mentions", the person tagged will likely receive a "Mention" post/activity or become a direct participant in the conversation in the case of public posts. Please note that Friendica blocks incoming "mentions" from people with no relationship to you. This is a spam prevention measure.
Remote mentions are delivered using the OStatus protocol. This protocol is used by Friendica and StatusNet and several other systems, but is not currently implemented in Diaspora.
Friendica makes no distinction between people and groups for the purpose of tagging. (Some other networks use !group to indicate a group.)
**Topical Tags**
Topical tags are indicated by preceding the tag name with the # character. This will create a link in the post to a generalised site search for the term provided. For example, #cars will provide a search link for all posts mentioning 'cars' on your site. Topical tags are generally a minimum of three characters in length. Shorter search terms are not likely to yield any search results, although this depends on the database configuration. The same rules apply as with names that spaces within tags are represented by the underscore character. It is therefore not possible to create a tag whose target contains an underscore.
Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numerica hashtag, please add some descriptive text such as #2012-elections.

View file

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<docblox>
<parser>
<target>data/output</target>
</parser>
<transformer>
<target>data/output</target>
</transformer>
<files>
<directory>.</directory>
</files>
</docblox>

14
example.php Normal file
View file

@ -0,0 +1,14 @@
<?php
//Add the auto loader. This makes sure that we can find the files we need for a class.
require_once('vendor/autoload.php');
//This says, we want Hello to mean Friendica\Directory\Example\Hello.
//It's a shortcut.
use Friendica\Directory\Example\Hello;
//Here we use the shortcut and create a new Hello object.
$instance = new Hello();
//Let the Hello object call
echo $instance->sayHello();

112
htconfig.php Executable file → Normal file
View file

@ -1,81 +1,91 @@
<?php
// If automatic system installation fails:
/**
* This is the default config file. Copy it to ".htconfig.php" and make your
* local changes there.
*/
// Copy or rename this file to .htconfig.php
// Why .htconfig.php? Because it contains sensitive information which could
// give somebody complete control of your database. Apache's default
// configuration denies access to and refuses to serve any file beginning
// with .ht
// Then set the following for your MySQL installation
$db_host = 'your.mysqlhost.com';
$db_user = 'mysqlusername';
$db_pass = 'mysqlpassword';
$db_data = 'mysqldatabasename';
//MySQL host.
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'root';
$db_data = 'friendica_dir';
// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
// It can be changed later and only applies to timestamps for anonymous viewers.
$default_timezone = 'America/Los_Angeles';
$default_timezone = 'Europe/Amsterdam';
// What is your site name?
$a->config['sitename'] = "EXPERIMENTAL Friendica public directory";
$a->config['sitename'] = "Friendica Social Network";
//Statistic display settings.
$a->config['stats'] = array(
// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
// Be certain to create your own personal account before setting
// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
// the registration page. REGISTER_APPROVE requires you set 'admin_email'
// to the email address of an already registered person who can authorise
// and/or approve/deny the request.
//For site health, the max age for which to display data.
'maxDataAge' => 3600*24*30*4 //120 days = ~4 months
// In order to perform system administration via the admin panel, admin_email
// must precisely match the email address of the person logged in.
);
$a->config['register_policy'] = REGISTER_OPEN;
$a->config['register_text'] = '';
$a->config['admin_email'] = '';
//Settings related to the syncing feature.
$a->config['syncing'] = array(
// Maximum size of an imported message, 0 is unlimited
//Pulling may be quite intensive at first when it has to do a full sync and your directory is empty.
//This timeout should be shorter than your cronjob interval. Preferably with a little breathing room.
'timeout' => 3*60, //3 minutes
$a->config['max_import_size'] = 200000;
//Push new submits to the `sync-target` entries?
'enable_pushing' => true,
// maximum size of uploaded photos
//Maximum amount of items per batch per target to push to other sync-targets.
//For example: 3 targets x20 items = 60 requests.
'max_push_items' => 10,
$a->config['system']['maximagesize'] = 800000;
//Pull updates from the `sync-target` entries?
'enable_pulling' => true,
// Location of PHP command line processor
//This is your normal amount of threads for pulling.
//With regular intervals, there's no need to give this a high value.
//But when your server is brand new, you may want to keep this high for the first day or two.
'pulling_threads' => 25,
$a->config['php_path'] = 'php';
//How many items should we crawl per sync?
'max_pull_items' => 250
// You shouldn't need to change anything else.
// Location of global directory submission page.
);
$a->config['system']['directory_submit_url'] = 'http://dir.friendika.com/submit';
$a->config['system']['directory_search_url'] = 'http://dir.friendika.com/directory?search=';
//Things related to site-health monitoring.
$a->config['site-health'] = array(
// PuSH - aka pubsubhubbub URL. This makes delivery of public posts as fast as private posts
//Wait for at least ... before probing a site again.
//The longer this value, the more "stable" site-healths will be over time.
//Note: If a bad (negative) health site submits something, a probe will be performed regardless.
'min_probe_delay' => 24*3600, // 1 day
$a->config['system']['huburl'] = 'http://pubsubhubbub.appspot.com';
//Probes get a simple /friendica/json file from the server.
//Feel free to set this timeout to a very tight value.
'probe_timeout' => 5, // seconds
// Server-to-server private message encryption (RINO) is allowed by default.
// Encryption will only be provided if this setting is true and the
// PHP mcrypt extension is installed on both systems
//Imports should be fast. Feel free to prioritize healthy sites.
'skip_import_threshold' => -20
$a->config['system']['rino_encrypt'] = true;
);
// allowed themes (change this from admin panel after installation)
//Things related to the maintenance cronjob.
$a->config['maintenance'] = array(
$a->config['system']['allowed_themes'] = 'dispy,quattro,testbubble,vier,darkbubble,darkzero,duepuntozero,greenzero,purplezero,quattro-green,slackr,diabook';
//This is to prevent I/O blocking. Will cost you some RAM overhead though.
//A good server should handle much more than this default, so you can tweak this.
'threads' => 10,
// default system theme
//Limit the amount of scrapes per execution of the maintainer.
//This will depend a lot on the frequency with which you call the maintainer.
//If you have 10 threads and 80 max_scrapes, that means each thread will handle 8 scrapes.
'max_scrapes' => 80,
$a->config['system']['theme'] = 'duepuntozero';
//Wait for at least ... before scraping a profile again.
'min_scrape_delay' => 3*24*3600, // 3 days
//At which health value should we start removing profiles?
'remove_profile_health_threshold' => -60
// By default allow pseudonyms
$a->config['system']['no_regfullname'] = true;
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 559 B

0
images/b_block.gif Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 83 B

After

Width:  |  Height:  |  Size: 83 B

0
images/b_drop.gif Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 138 B

After

Width:  |  Height:  |  Size: 138 B

0
images/b_drop.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 311 B

After

Width:  |  Height:  |  Size: 311 B

0
images/b_drophide.gif Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 111 B

After

Width:  |  Height:  |  Size: 111 B

0
images/b_dropshow.gif Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 138 B

After

Width:  |  Height:  |  Size: 138 B

0
images/b_edit.gif Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 311 B

After

Width:  |  Height:  |  Size: 311 B

0
images/b_edit.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 451 B

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

BIN
images/blue_flag_16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,003 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 853 B

0
images/camera-icon.gif Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 1,015 B

After

Width:  |  Height:  |  Size: 1,015 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 B

BIN
images/default-profile-sm.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 B

After

Width:  |  Height:  |  Size: 325 B

BIN
images/default-profile.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 469 B

BIN
images/dfrn.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 B

BIN
images/dislike.gif Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 B

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

BIN
images/friendica-128.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

0
images/friendica-128.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

0
images/friendica-16.jpg Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 659 B

After

Width:  |  Height:  |  Size: 659 B

0
images/friendica-16.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 756 B

After

Width:  |  Height:  |  Size: 756 B

0
images/friendica-1600.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 280 KiB

BIN
images/friendica-256.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 16 KiB

0
images/friendica-256.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

0
images/friendica-32.jpg Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
images/friendica-32.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

0
images/friendica-48.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

0
images/friendica-64.jpg Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

0
images/friendica-64.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

0
images/friendica-96.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

199
images/friendica.svg Executable file → Normal file
View file

@ -8,116 +8,75 @@
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg2"
version="1.1"
inkscape:version="0.48.0 r9654"
sodipodi:docname="friendica.svg"
inkscape:export-filename="/home/meta/Documents/My random images/friendica.png"
inkscape:export-xdpi="80.552788"
inkscape:export-ydpi="80.552788">
width="100"
height="100"
id="svg2">
<defs
id="defs4">
<linearGradient
id="highlightgradient">
<stop
id="stop3833"
offset="0"
style="stop-color:#ffffff;stop-opacity:0.74374998;" />
style="stop-color:#ffffff;stop-opacity:0.74374998"
offset="0" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3829" />
id="stop3829"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="shadowgradient">
<stop
id="stop3833-5"
offset="0"
style="stop-color:#000000;stop-opacity:0.5;" />
style="stop-color:#000000;stop-opacity:0.5"
offset="0" />
<stop
style="stop-color:#818080;stop-opacity:0;"
offset="1"
id="stop3829-9" />
id="stop3829-9"
style="stop-color:#818080;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#highlightgradient"
id="linearGradient4011"
x1="44.948269"
y1="0"
x2="54.103466"
y2="46.797421"
id="linearGradient4011"
xlink:href="#highlightgradient"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(1,0.54545455)" />
<linearGradient
inkscape:collect="always"
xlink:href="#shadowgradient"
id="linearGradient4021"
x1="52.016712"
y1="96"
x2="42.867535"
y2="41.837971"
id="linearGradient4021"
xlink:href="#shadowgradient"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.5,0,48)" />
<filter
inkscape:collect="always"
id="filter4055"
x="-0.03"
width="1.06"
x="-0.029999999"
y="-0.12"
height="1.24">
width="1.0599999"
height="1.24"
color-interpolation-filters="sRGB"
id="filter4055">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="1.2"
id="feGaussianBlur4057" />
id="feGaussianBlur4057"
stdDeviation="1.2" />
</filter>
<filter
inkscape:collect="always"
id="filter4059"
x="-0.029877551"
width="1.0597551"
y="-0.122"
height="1.244">
width="1.0597551"
height="1.244"
color-interpolation-filters="sRGB"
id="filter4059">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="1.22"
id="feGaussianBlur4061" />
id="feGaussianBlur4061"
stdDeviation="1.22" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.9132799"
inkscape:cx="53.033009"
inkscape:cy="2.8284271"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
width="256px"
inkscape:snap-global="true"
inkscape:window-width="1680"
inkscape:window-height="1010"
inkscape:window-x="194"
inkscape:window-y="0"
inkscape:window-maximized="0">
<inkscape:grid
type="xygrid"
id="grid2985"
empspacing="3"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="2px"
spacingy="2px" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
@ -126,115 +85,101 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Colors"
inkscape:groupmode="layer"
transform="translate(0,-952.3622)"
id="layer1"
transform="translate(0,-956.3622)"
style="display:inline">
<path
style="fill:#ffc019;fill-opacity:1;stroke:none"
d="M 16,0 C 7.0091019,0.04308252 0,7.0521845 0,16 0,16 0,57.499123 0,80 0,89.120146 7.0091019,96 16,96 L 32,96 32,70 64,70 63.916016,46.068359 32,46.236328 32,26 64,26 64,0 C 64,0 24,0 16,0 z"
transform="translate(0,956.3622)"
d="m 18,954.3622 c -8.9908981,0.0431 -16,7.05218 -16,16 0,0 0,41.4991 0,64 0,9.1201 7.0091019,16 16,16 l 16,0 0,-26 32,0 -0.08398,-23.9316 -31.91602,0.1679 0,-20.2363 32,0 0,-26 c 0,0 -40,0 -48,0 z"
id="rect2993"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccsccccccccc" />
style="fill:#ffc019;fill-opacity:1;stroke:none" />
<path
style="fill:#1872a2;fill-opacity:1;stroke:none"
d="m 80,1052.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
d="m 82,1050.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
id="rect2993-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccsccccccccc" />
style="fill:#1872a2;fill-opacity:1;stroke:none" />
</g>
<g
style="display:inline"
inkscape:label="Lines as original logo"
transform="translate(0,4)"
id="g3997"
inkscape:groupmode="layer">
style="display:inline">
<path
sodipodi:nodetypes="cccccccc"
inkscape:connector-curvature="0"
d="m 66,-2 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
id="path3999"
d="m 64,0 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<rect
ry="16"
rx="16"
y="0"
x="0"
height="96"
width="96"
height="96"
rx="16"
ry="16"
x="2"
y="-2"
id="rect4001"
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
<g
inkscape:groupmode="layer"
transform="translate(0,4)"
id="layer3"
inkscape:label="Lines with center break"
style="display:none">
<path
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"
id="path3926"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" />
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<rect
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3928"
width="96"
height="96"
rx="16"
ry="16"
x="0"
y="0"
rx="16"
ry="16" />
id="rect3928"
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
<g
inkscape:groupmode="layer"
transform="translate(0,4)"
id="layer2"
inkscape:label="Effects"
style="display:inline">
<rect
style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none"
id="rect3823"
width="96"
height="48.04369"
x="-3.1086245e-15"
y="1.8024861e-14"
rx="15.214664"
ry="15.215644"
rx="15.214664" />
x="2"
y="-2"
id="rect3823"
style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none" />
<rect
style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none"
id="rect3823-8"
width="96"
height="47.86721"
x="1.5376101e-14"
y="-96"
ry="15.159752"
rx="15.214664"
transform="scale(1,-1)" />
ry="15.159752"
x="2"
y="-94"
transform="scale(1,-1)"
id="rect3823-8"
style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none" />
<rect
style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)"
id="rect4003"
width="98"
height="24"
x="0"
y="0"
rx="15.214664"
ry="8.2994423"
transform="matrix(1.0296115,0,0,1.1963836,-2.901924,-4.7132067)" />
x="0"
y="0"
transform="matrix(1.0296115,0,0,1.1963836,-0.901924,-6.713207)"
id="rect4003"
style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)" />
<rect
style="opacity:0.56746030000000003;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)"
id="rect4013"
width="96"
height="24"
x="0"
y="72"
rx="14.008356"
ry="12"
transform="matrix(0.9768331,0,0,0.91974646,1.1649641,8.098115)" />
x="0"
y="72"
transform="matrix(0.9768331,0,0,0.91974646,3.1649641,6.098115)"
id="rect4013"
style="opacity:0.5674603;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
images/friendika-128.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
images/friendika-128.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
images/friendika-16.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

0
images/friendika-16.jpg Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 659 B

After

Width:  |  Height:  |  Size: 659 B

BIN
images/friendika-16.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 756 B

After

Width:  |  Height:  |  Size: 699 B

0
images/friendika-1600.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 280 KiB

BIN
images/friendika-256.jpg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 16 KiB

BIN
images/friendika-256.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

0
images/friendika-32.jpg Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
images/friendika-32.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

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