Friendica Global Directory (please note that this is a clone of the repository at github, issues are handled there)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hypolite Petovan abda067ca1
Merge pull request #61 from Quix0r/cleanups/use-app-class
5 months ago
assets Put the server list on a single fixed-width column 1 year ago
bin Set CHMOD 777 for Shell script. 5 months ago
images [ImgBot] optimizes images 11 months ago
include Some cleanups: - "use" should be executed before any other line (except strict mode line) - "import" App class before use it - sure braces with "new" operator as this invokes the constructor 5 months ago
js Rewrite: 2 years ago
library Merge branch 'master' into feature/redesign-prototype 2 years ago
mod Fix PHP Notices 1 year ago
src Some cleanups: - "use" should be executed before any other line (except strict mode line) - "import" App class before use it - sure braces with "new" operator as this invokes the constructor 5 months ago
tests This is an example of autoloading classes and including unit tests. 4 years ago
util Add console commands 1 year ago
view [ImgBot] optimizes images 11 months ago
.gitignore Let's have .htaccess not being committed 1 year ago
.htaccess-dist Let's have .htaccess not being committed 1 year ago
Makefile This is an example of autoloading classes and including unit tests. 4 years ago
README.md Let's have .htaccess not being committed 1 year ago
Vagrantfile Vagrant > 1.5 needs an additional parameter 1 year ago
boot.php Fix cron_maintain 1 year ago
composer.json Remove obsolete repositories key from composer.json 7 months ago
composer.lock Bump mrpetovan/net_ping to version 1.1.1 7 months ago
dfrndir.sql Prevent infinite push loop between multiple directories 1 year ago
example.php Switched to composer generated autoloader. 4 years ago
htconfig.php Merge branch 'feature/redesign-prototype' of https://github.com/tugelbend/dir into feature/redesign-prototype 2 years ago
index.php Some cleanups: - "use" should be executed before any other line (except strict mode line) - "import" App class before use it - sure braces with "new" operator as this invokes the constructor 5 months ago
maintenance.html Fix deprecated constant MYSQL_ASSOC 1 year ago

README.md

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 installed globally, or rewrite the command to use a .phar.

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;