aboutsummaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/AUTHORS37
-rw-r--r--doc/ChangeLog438
-rw-r--r--doc/INSTALL.txt148
-rw-r--r--doc/LICENSE.txt340
-rw-r--r--doc/README.rst67
-rw-r--r--doc/UPGRADE.txt172
-rw-r--r--doc/allinone.rst31
-rw-r--r--doc/authentication.rst216
-rw-r--r--doc/configuration.rst98
-rw-r--r--doc/developers/TODO.rst104
-rw-r--r--doc/developers/api.rst10
-rw-r--r--doc/developers/debugging.rst24
-rw-r--r--doc/developers/doc-TODO.rst9
-rw-r--r--doc/developers/release-new-version.rst31
-rw-r--r--doc/developers/rules.rst30
-rw-r--r--doc/developers/running-unit-tests.rst31
-rw-r--r--doc/developers/translation.rst47
-rw-r--r--doc/index.rst50
-rw-r--r--doc/ssl-client-certificates.rst181
-rw-r--r--doc/themes.rst58
-rw-r--r--doc/tools.rst44
21 files changed, 2166 insertions, 0 deletions
diff --git a/doc/AUTHORS b/doc/AUTHORS
new file mode 100644
index 0000000..633c49c
--- /dev/null
+++ b/doc/AUTHORS
@@ -0,0 +1,37 @@
+SemanticScuttle developers:
+ Eric Dane <ericdane@users.sourceforge.net>
+ Benjamin Huynh-Kim-Bang <mensonge@users.sourceforge.net>
+ Christian Weiske <cweiske@cweiske.de>
+
+
+SemanticScuttle is a fork of Scuttle.
+ http://sourceforge.net/projects/scuttle/
+
+Scuttle and SemanticScuttle contain code from the following applications:
+
+------------
+GPL Licenced
+------------
+
+phpBB2 (database abstraction layer)
+ http://www.phpbb.com/
+
+php-gettext
+ Danilo Segan <danilo@kvota.net>
+ http://savannah.nongnu.org/projects/php-gettext/
+
+UTF8 Helper Functions
+ Andreas Gohr <andi@splitbrain.org>
+
+XSPF Web Music Player (Flash)
+ http://musicplayer.sourceforge.net/
+
+
+----
+
+Patches were realised by :
+
+* Simple Admin-Interface for deleting unwanted users
+ Idea of the patch from Andreas Jaggi, for details visit:
+ http://sourceforge.net/tracker/index.php?func=detail&aid=1543065&group_id=134378&atid=729862
+ Adaptation by Andreas Keller (aka Arakel) http://akeller.eu for Takuya Misawa.
diff --git a/doc/ChangeLog b/doc/ChangeLog
new file mode 100644
index 0000000..52d3322
--- /dev/null
+++ b/doc/ChangeLog
@@ -0,0 +1,438 @@
+ChangeLog for SemanticScuttle
+=============================
+
+.. contents::
+
+0.98.6 - 2013-XX-XX
+-------------------
+- Fix bug #161: URLs broken on 1&1 server
+
+
+0.98.5 - 2013-03-20
+-------------------
+- Fix bug #109: preserve privacy setting from Delicious export files
+ (Thanks to David Glenck)
+- Fix bug #110: Document solution for "searching slashes"
+- Fix bug #111: Comments in config.php mention \*.inc.php files
+ (José María Mateos [rinze])
+- Fix bug: Do not use eregi functions anymore
+
+
+0.98.4 - 2012-01-21
+-------------------
+- Fix bug #3439729: URLs were escaped too often in bookmark list
+- Fix bug: Subtitle was not escaped
+- Fix bug #3388219: Incorrect URL when cancelling tag2tag-actions
+- Fix bug #3393951: Logo images missing on bookmark page
+- Fix bug #3399815: PHP error in opensearch API in 0.98.3
+- Fix bug #3407728: Can't delete users from admin page
+- Fix bug #3431742: open_basedir problems with /etc/ config files
+- Fix bug #3436624: Wrong URL for Delicious API when importing
+- Fix bug #3463481: RSS feed show warnings in feedvalidator.org
+- Fix bug #3384416: Use URL with protocol in bookmarklet
+- Fix bug: Invalid HTML when website thumbnails are activated
+- Fix bug #3413459: Thumbnails not in one line
+- Fix bug #3468293: Delicious import does not preserve private links
+- Fix bug #3396727: Title of http://lesscss.org/ not loaded
+- Fix bug #3111254: getIdFromUser() always returns an integer now (part 2)
+- Implement request #3403609: fr_CA translation update
+- Implement patch #3476011: PostgreSQL tables can not be initialized
+ (Frédéric Fauberteau [triaxx])
+
+
+0.98.3 - 2011-08-09
+-------------------
+- Fix bug #3388456: Missing scripts/fix-unfiled-tags.php
+
+The script was only missing in the .zip file; the PEAR package
+contained it - thus no 0.98.3 PEAR package.
+
+
+0.98.2 - 2011-08-08
+-------------------
+- Fix bug #3385724: Rename tag ends with XML Parsing Error
+- Fix bug #3386178: "system:unfiled" secret tag does not work
+- Fix bug #3384416: Update documentation to explain HTTP/HTTPS root problem
+- Fix bug #3382126: Linked tags does not work for tags with spaces
+- Fix delicious API help page link
+
+Run ``scripts/fix-unfiled-tags.php`` to fix old bookmarks that miss the
+``system:unfiled`` tags.
+
+
+0.98.1 - 2011-08-01
+-------------------
+- Fix bug #3375635: XML parsing problem in top.inc.php
+- Fix bug #3375428: Forgot to remove some old dojo files
+- Fix bug #3160512: Make SemanticScuttle work with FastCGI
+- Fix bug #3376618: Broken tag completion for private bookmarks
+
+
+0.98.0 - 2011-07-21
+-------------------
+- Switch to jQuery and drop dojo
+- Implement request #2928950: Private keys for RSS feeds (Mark Pemberton)
+- Implement request #3164348: Configurable default privacy (Brett Dee)
+- Implement request #1989987: Theming support
+- Implement request #3054906: Show user's full name instead of nickname
+- Implement patch #3059829: update ``FR_CA`` translation
+- Fix bug #3187177: Wrong URL / Export XML Bookmarks
+- Fix bug #3097187: Using opensearch with two tags does not work in Firefox
+- Fix bug #3251877: French translation JavaScript Bug when editing bookmarks
+- Fix bug #3168521: Title of tag-filtered RSS Feed is broken
+- Fix bug #2853627: Javascript warning
+- Fix bug in ``getTagsForBookmarks()`` that fetched all tags
+- Fix privacy issue when fetching tags of several users
+- Fix Google custom search XML
+- Show error message on mysqli connection errors
+- Update php-gettext library to 1.0.10
+- ``api/posts/add`` respects the "replace" parameter now
+- Only URLs with an allowed protocol may be added to the database
+- Support HTTPS connections when ``$root`` is not configured
+- SQL schema version table to ease future database upgrades
+- Documentation is written with rST (reStructuredText) now
+- Support per-host configuration files
+
+
+0.97.2 - 2011-02-17
+-------------------
+- Fix bug #3178597: Broken link to context in gsearch admin index page
+- Fix bug #3074816: French translation breaks edit javascript
+- Fix bug #3111254: Search in my_watchlist results in error
+- Fix bug #3073215: Updating bookmark time does not work
+- Fix bug #3065284: AjaxVote problem with Webkit browsers
+
+
+0.97.1 - 2010-09-30
+-------------------
+This is a security release! We do highly recommend to update
+your SemanticScuttle installations!
+
+- Fix bug #3077187: Permission problem when deleting bookmarks
+
+
+0.97.0 - 2010-06-09
+-------------------
+- Many SQL optimizations - SemanticScuttle shows bookmarks 4 times faster now
+- New config option to skip "SET NAMES UTF8" call: $dbneedssetnames
+- Do not highlight admin bookmarks when $enableAdminColors is disabled
+- Add russian translation
+- Make HTML export follow the specifications a bit better
+- Fix bug #2953732: faulty error message for duplicate bookmarks
+- Fix bug #2960663: do not send content-type headers twice for ajax/api scripts
+- Fix bug #2976593: fr_FR locale is vietnamese
+
+
+0.96.1 - 2010-02-09
+-------------------
+- Fix bug #2948410: API is broken in 0.96.0
+
+
+0.96.0 - 2010-02-08
+-------------------
+- Fix bug #2843523: ArtViper thumbnail license change
+ reflected by using the javascript backlink
+- Fix bug #2887063: Common tag combination description feels broken
+- Fix bug #2928905: API was broken when no user was logged in
+- Fix bug #2934891: RSS XML was sometimes invalid because
+ special characters did not get escaped.
+- Fix bug #2936833: api fix: shared=no
+ Patch by fnorder@users.sourceforge.net
+- Fix bug #2899515: Bookmarklet broken when site title contains quote
+- Fix several SQL injection possibilities
+- Fix E_NOTICE when calling alltags.php without any parameter
+- Implement part of request #2928950:
+
+ - User adjustable entry count: rss.php?count=20
+ - Fix HTTP content type header for RSS
+ - Add config option to allow sorting by bookmark creation date
+ instead of modification date
+
+ - Implement request #2833793: Export to avahi config files
+ - we support zeroconf networking!
+- Implement request #2934868: Do not display full redirection URL
+ Patch by fnorder@users.sourceforge.net
+- Implement request #2934872: Option to set the "no description"
+ description. Patch by fnorder@users.sourceforge.net
+- Implement request #2830234: Support for external authentication
+ services via PEAR's Auth package
+- Add special header file for shell scripts (header-standalone.php)
+- Fix some problems when using mysqli database driver.
+- Make it easy to have www/ in any location one wants it to have
+- Send HTTP status code 500 when site has not been configured yet.
+
+
+0.95.2 - 2010-01-16
+-------------------
+This is a security release! We do highly recommend to update
+your SemanticScuttle installations!
+
+- Fix several SQL injection possibilities related to tagging
+
+
+0.94.2 - 2010-01-16
+-------------------
+This is a security release! We do highly recommend to update
+your SemanticScuttle installations!
+
+- Fix several SQL injection possibilities related to tagging
+
+
+0.95.1 - 2009-11-16
+-------------------
+- Fix bug: admin tags were not shown because javascript include was broken.
+ Thanks, Jean-Luc!
+
+
+0.95 - 2009-11-10
+-----------------
+- Implement request #2878169: Voting system with two layouts
+- Fix bug #2881886: PHP notice when viewing tags
+- Configuration option to disable registration
+- Implement request #2874049: "Feeling lucky" button
+ just add "?lucky=1" as parameter to search page
+- Hide bookmarks with vote < $threshold from users (not admins)
+- Fix many more unfreed mysql results, but there are still many left
+- Improve documentation of many service methods
+- All unit tests run now
+- Update German translation to 100%
+- Helper scripts for translators and translation documentation
+- Beginning of developer documentation
+- Fix gettext/translation on 64bit systems
+- Fix OpenSearch file
+- Re-add de_AT which is a rather ugly "official-style" german
+ translation. Choose the translation you like most.
+
+
+0.94.1 - 2009-10-29
+-------------------
+This is a security release! We do highly recommend to update
+your SemanticScuttle installations!
+
+- Fix several XSS possibilities
+
+
+0.94 - 2009-10-02
+-----------------
+- Fix bug #2834070: unfreed sql results
+- Fix bug #2834077: .htaccess on virtual masshosted apaches
+- Fix bug #2834097: Errors when using search without terms
+- Fix bug #2834293: E_NOTICE when referer is missing
+- Fix bug #2834118: Undefined variable in search.inc.php when not logged on
+- Fix bug #2847580: short open tag <? in import.php
+- Fix bug #2674961: editAllowed optimization - make less queries for each bookmark
+- Fix bug #2829642: PATH_INFO undefined
+- Fix bug: mysqli did not work at all
+- Fix bug: 404 - api/posts/all not found
+- Fix bug: PATH_INFO used when not needed
+- Fix bug: htmlentities not always escaped
+- Fix bug: Not all pages are valid XHTML
+- Fix bug: Hide welcome message if it is empty
+- Fix bug: allow deleting links between tags when deleting a user.
+- Fix bug: some parse errors
+- Interface fix: put linkedtags box on bookmarks page.
+
+- Implement request #2834111: Detect if cookies are enabled
+- Translation updates
+- Updated German translation (de_DE), removed de_AT
+- New configuration file system
+- Add INSTALL.txt and ChangeLog
+
+
+0.93 - 2009-05-26
+-----------------
+
+
+0.92 - 2009-02-11
+-----------------
+- Database stores data in UTF-8 now, leading to better
+ search results for accented characters
+- Several Internet Explorer bugs fixed
+- clean URLs are back
+- Improved page titles
+
+
+0.91 - 2008-11-14
+-----------------
+- Major Refactoring: add a tag cache improving query processing
+ (knowledge inference on tag relations) [DB modified]
+- Interface fix: allows to remove a tag from the selection into
+ subtitle bar thanks to a \*.
+- New Feature: authorizes anchors with brackets into descriptions
+ of bookmark. For example: "[city]Paris[/city]".
+ This text between anchors will be highlighted when the
+ corresponding bookmark will be displayed.
+- Interface Fix: transforms description field into textarea
+- Interface fix: make longer description field [DB modified]
+- Interface fix: takes dModified field instead of bDatetime one
+ (to sort bookmarks)
+- Interface fix: add link to gsearch/ forlder on normal search
+ page and correct gsearch feature.
+- New Translation: SemanticScuttle is now available in German,
+ formal and gender-neutral version (thanks Elmar H. Beer)
+- New Feature: admin can check urls validity (in his/her admin page)
+- Bug fix: correct ROOT declaration
+- Bug fix: correct DOJO completion in tags edition
+- Interface fix: add tags cloud from all users into add bookmark
+ window (orouk proposition)
+- New Feature: possibility to import a structure of
+ hierarchical tags from a file
+- Minor fix: improve import from Netscape files
+ (now takes tags into account)
+- Interface fix: add an hyperlink from bookmark edition
+ page to collaborative edition of the same bookmark
+- Bug fix: correct admin CSRF vulnerability (thank you Etienne Z.)
+- Major refactoring: transform users row into object, define
+ page parameters (POST and GET) as constants, simplify
+ debugging ... [Config file modified: $debugMode]
+- New feature: Dynamic tree of tags using Dojo toolkit
+ (used by a menu2 sidebar box) [Config file modified: $menu2Tags]
+- Bug fix: prevent from CSRF vulnerabilities on profile page
+ (thank you Etienne Z.)
+- Bug fix: correct AJAX deleting of bookmarks (thank you Ricco)
+
+
+0.90 - 2008-06-05
+-----------------
+The main improvements of this new version are:
+
+- menu tags (tags which are included into the "menu" tag and
+ thus which appear on the main page)
+- connexion with Google Custom Search Engine which allows to
+ use the Google Engine to look into your SemanticScuttle
+ bookmarks (http://www.google.com/coop/cse/).
+
+
+All the changes:
+
+- New feature: add Google Custom Search Engine into
+ gsearch/ folder and looking into all bookmarks [Config modified]
+- Interface design: antispam question is hidden when
+ focussed (Thanks to Lifty)
+- Interface fix: move welcome message to index page
+- Interface fix: displays an error message if the
+ config.inc.php file has not been created
+- Interface design: improve tags presentation, menu box,
+ popup size, redirection after adding a bookmark, RSS link position
+- Interface design: hide searchs with no results into search history box
+- New feature: private descriptions for tags [DB modified]
+- Refactoring: rename sc_tags into sc_bookmarks2tags
+ (and services, codes...) [DB modified]
+- Interface design: shorten too long URLs in the displayed bookmarks
+- Bug fix: correct mutual logins for several installations on the same host
+- New feature: menu box which displays tags included into the
+ special tag "menu" [Config modified]
+- New feature: export URL for Google Custom Search (api/export/gcs)
+- New feature: add admins profile [Config modified: $admin_users]
+- New feature: template sidebar customized in configuration
+ file [Config modified]
+- New feature: export bookmarks into html file for import into
+ browsers (Thanks to warenhaus)
+- Interface design: add export option through API into the profile page
+- Bug fix: del.icio.us bookmarks (in .xml format) import 0K
+- Bug fix: correct authentification for API with CGI
+- Interface fix: correct few links and translations on the about page
+- Interface design: copy description and tags (when creating a
+ bookmark from another one)
+- Feature improvement: make rename tags more consistent
+ (with regards to linked tags)
+- Interface design fix: improve visualisation of structuredtags box
+- Interface design: improve tag2tag link edition (add item in
+ Actions menu and improve tag2tagedit page)
+- New feature: Save search history: what, by who, when, number of
+ results and display "last searches" box [DB & config modified]
+- Bug fix: correct counting result for history page
+- Bug fix: correct counting for unified bookmarks
+- Interface fix: improve visualisation in history if no descriptions
+ for bookmarks
+- Interface design: display number of resources in results
+- Interface design: improve navigation between tags
+ (clickable ">")
+- Bug fix: delete thumbnail when ajax delete
+
+
+0.88 - 2008-03-12
+-----------------
+The main change of this release is the possibility to preview websites
+through thumbnails (thanks to artviper.net).
+
+All the changes:
+
+- Interface design: display SemanticScuttle version number
+ on "about" page
+- Bug fix: allow clean urls thanks to .htaccess
+- New feature: add website preview/thumbnail (based on
+ artviper.net) [Config file modified]
+- Interface fix: add About link for logged users
+- Interface fix: hide "structured box" when no linked tags
+- Interface fix: make more consistent the general navigation between
+ personal and common spaces
+- Interface fix: add a link to last editor profile in common description.
+ Moreover, don't count a change if a user saves with no modifications.
+- Bug fixes: prevent from adding special characters
+ (like " or ') into tags
+- Upgrade: from Scuttle 0.7.2 to SemanticScuttle 0.87.
+
+
+0.87 - 2008-02-14
+-----------------
+This new version brings two major features to SemanticScuttle:
+
+1) You can now create a synonym link between tags.
+ For example, by linking the tags "monument" and "monuments",
+ you can find resources tagged with the first one when you navigate
+ through the second one. More important, this link works with
+ the inclusion link already implemented.
+2) Users can create commune descriptions for tags and bookmarks.
+ In a small community, the idea is to bring gradually people to work
+ together (if they want it). From a research perspective, we explore
+ the bridge between individual actions (easy to do) and collaborative
+ ones (more difficult but more powerful).
+
+All the changes:
+
+- Interface design: allow to access to users' bookmarks from last
+ user sidebox. (Currently, we can just access to their profiles).
+- Interface design: hide multiple URLs repeated into history page
+- Interface design: hide About link for logged users
+- New feature: Collaborative spaces (like wiki) for descriptions
+ of tags and bookmarks
+- Interface fix: improve the creation of structured links
+- New feature: Allow the creation of synonym links between tags
+
+
+0.86 - 2008-01-24
+-----------------
+- Bug fix: correct antispam question feature
+- Interface design: normalize URL when adding
+ (remove final "/")
+- Interface design: group similar URL
+- Interface bug fix: improve linked relations into structured links box
+- Interface bug fix: improve display of structured tags into alltags
+ and populartags page (problem of div size)
+
+
+0.85 - 2008-01-22
+-----------------
+- New feature: Add stats (nb children, nb descendants, depth,
+ nb update) to structured tags
+
+ - Allow to visualize structured tags according to stats
+ - Add admin page to update stats from the existing structured
+ tags in the database
+
+- Translation: improve French translation (add missing translations,
+ transform "labels" into "tags")
+- New feature: List all users in a users page and users block on
+ the front page
+- Interface design: Transform recent bookmarks into last bookmarks
+ on front page (to avoid blank front page)
+- Interface design: Add structured tags in a right box on the front page
+- New feature: Antispam question to register
+- New feature: Allowing a subtitle message, managable in the
+ configuration file.
+- Interface design: Redesign menu (search box, sort buttons, top
+ and right menu)
+- Interface design: Make URLs appear under bookmarks
+- Debug: correcting a problem to log out (bugs from Scuttle).
+
diff --git a/doc/INSTALL.txt b/doc/INSTALL.txt
new file mode 100644
index 0000000..c911740
--- /dev/null
+++ b/doc/INSTALL.txt
@@ -0,0 +1,148 @@
+============================
+SemanticScuttle installation
+============================
+
+.. contents::
+
+Prerequisites
+=============
+To run SemanticScuttle, you need:
+
+- PHP5 with filter functions enabled
+- A web server, for example Apache
+
+
+Standard installation instructions
+==================================
+If you've downloaded a ``SemanticScuttle-x.y.z.zip`` file from SourceForge,
+then this instructions are for you.
+
+1. Create a new MySQL/PostgreSQL database
+2. Import ``data/tables.sql`` into that database, i.e.
+ run ::
+
+ $ mysql -umyusername -p mydatabasename < data/tables.sql
+
+ on the shell.
+
+ If you run PostgreSQL, use ``tables-postgresql.sql``::
+
+ $ psql mydatabasename myusername < data/tables-postgresql.sql
+
+3. Copy ``data/config.php.dist`` to ``data/config.php`` and modify it as
+ necessary. See configuration_ for more information.
+4. Make the cache directory writable by your web server.
+ For example, run ::
+
+ $ chmod 0777 cache
+
+ on the shell.
+5. Set the ``www/`` directory as document root in your web server,
+ restart the web server.
+6. That's all! Visit your SemanticScuttle installation web site now
+ with your browser.
+7. Register a user and add bookmarks.
+
+
+.. _configuration: configuration.html
+
+
+Ugly www directory in URLs
+--------------------------
+In case point 5 of the installation instructions cannot be put into
+practice by you because you are not able to change the web server
+configuration, you are not lost! There is a way to get rid of
+``www/`` in your URL!
+
+Imagine following directory layout: ::
+
+ /home/customer123/
+ www/
+ subdomain1/
+ subdomain2/
+ subdomain3/
+
+Create a SemanticScuttle directory somewhere outside ``www`` if possible
+and put all directories except ``www/`` in there. Move all files and
+directories from ``www/`` into your subdomain directory. Then modify
+``subdomain/www-header.php`` to include the correct file path.
+
+The new directory layout should look that way: ::
+
+ /home/customer123/
+ semanticscuttle/
+ doc/
+ data/
+ src/
+ www/
+ subdomain1/
+ subdomain2/ (this is the semanticscuttle subdomain)
+ about.php
+ admin.php
+ ..
+ www-header.php
+ subdomain3/
+
+Now open www-header.php and replace ::
+
+ require_once '../src/SemanticScuttle/header.php';
+
+with ::
+
+ require_once '../../semanticscuttle/src/SemanticScuttle/header.php';
+
+
+
+PEAR package installation
+=========================
+Apart from the normal installation, you may install the SemanticScuttle PEAR
+package - it gives you the ability to upgrade to the next version with a single
+command, without manually unzipping files.
+
+0. The SemanticScuttle PEAR channel is available at
+ http://semanticscuttle.sourceforge.net/pirum.html
+
+1. Make sure you have the PEAR installer (or Pyrus) available and working.
+ You can check that by running ::
+
+ $ pear version
+ PEAR Version: 1.9.2
+ PHP Version: 5.3.6-13ubuntu3.2
+ Zend Engine Version: 2.3.0
+ Running on: Linux bogo 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64
+
+2. Discover the channel if you haven't done so yet::
+
+ $ pear channel-discover semanticscuttle.sourceforge.net
+
+ Verify that the channel has been added with::
+
+ $ pear list-channels
+ Registered Channels:
+ ====================
+ Channel Alias Summary
+ ...
+ semanticscuttle.sourceforge.net sc SemanticScuttle PEAR channel
+ ...
+
+3. Install SemanticScuttle::
+
+ $ pear install sc/semanticscuttle-beta
+
+4. Find out where it got installed to::
+
+ $ pear list-files sc/semanticscuttle
+
+5. Generally, the directory you need to point your web server's ``DocumentRoot`` to
+ is the *PEAR www directory* + ``/SemanticScuttle/``. Find the www directory with::
+
+ $ pear config-get www_dir
+ /usr/share/php/htdocs
+
+6. The configuration file is located in *PEAR's data directory* + ``/SemanticScuttle/``::
+
+ $ pear config-get data_dir
+ /usr/share/php/data
+
+ In ``$data_dir/SemanticScuttle/``, copy ``config.php.dist`` to
+ ``config.php`` and continue with configuration_.
diff --git a/doc/LICENSE.txt b/doc/LICENSE.txt
new file mode 100644
index 0000000..72188c3
--- /dev/null
+++ b/doc/LICENSE.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License. \ No newline at end of file
diff --git a/doc/README.rst b/doc/README.rst
new file mode 100644
index 0000000..ed41a38
--- /dev/null
+++ b/doc/README.rst
@@ -0,0 +1,67 @@
+======================
+SemanticScuttle 0.98.5
+======================
+A social bookmarking tool experimenting with new features
+like structured tags or collaborative descriptions of tags.
+
+- Home page: http://semanticscuttle.sourceforge.net/
+- Project page: https://sourceforge.net/projects/semanticscuttle/
+- Demo: http://semanticscuttle.sourceforge.net/demo/
+
+Available under the GNU General Public License
+
+
+Installation
+============
+See `INSTALL.rst`__
+
+
+__ INSTALL.html
+
+
+Upgrading from a previous version
+=================================
+See `UPGRADE.txt`__
+
+__ UPGRADE.html
+
+
+Public API
+==========
+SemanticScuttle supports most of the `del.icio.us API`__.
+Almost all of the neat tools made for that system can be modified
+to work with your SemanticScuttle installation. If you find a tool
+that won't let you change the API address, ask the creator to add
+this setting. You never know, they might just do it.
+
+__ http://del.icio.us/doc/api
+
+
+
+Links
+-----
+- `further documentation`__
+- `support and help questions`__
+- `development mailing list instructions`__
+- `suggestions`_ for SemanticScuttle
+- `bug reports`_
+- `feature requests`_
+
+__ http://semanticscuttle.wiki.sourceforge.net/
+__ http://sourceforge.net/forum/forum.php?forum_id=759510
+__ https://sourceforge.net/mailarchive/forum.php?forum_name=semanticscuttle-devel
+.. _suggestions: http://sourceforge.net/forum/forum.php?forum_id=759511
+.. _bug reports: http://sourceforge.net/tracker/?group_id=211356&atid=1017430
+.. _feature requests: https://sourceforge.net/tracker/?group_id=211356&atid=1017433
+
+
+
+
+Known issues
+============
+
+Number of bookmarks always 0: "0 bookmark(s)"
+---------------------------------------------
+This issue occurs when debug mode is enabled.
+Technically, this is because the database layers ``DEBUG_EXTRA`` gets
+enabled through debug mode.
diff --git a/doc/UPGRADE.txt b/doc/UPGRADE.txt
new file mode 100644
index 0000000..511748e
--- /dev/null
+++ b/doc/UPGRADE.txt
@@ -0,0 +1,172 @@
+=================================================
+Upgrading SemanticScuttle from a previous version
+=================================================
+
+.. contents::
+
+From version 0.94-0.98.1 to 0.98.3
+==================================
+Run ``scripts/fix-unfiled-tags.php`` to fix old bookmarks that miss the
+``system:unfiled`` tags.
+
+
+From version 0.97 to 0.98
+=========================
+Database updates
+----------------
+Apply ``data/schema/6.sql``
+
+ ALTER TABLE `sc_users` ADD `privateKey` VARCHAR(33) NULL;
+ CREATE UNIQUE INDEX `privateKey` ON `sc_users` (`privateKey`);
+
+
+From version 0.96 to 0.97
+=========================
+No database changes necessary.
+
+
+From version 0.95 to 0.96
+=========================
+Database updates
+----------------
+Apply ``data/schema/5.sql``
+
+API
+---
+The method signatures of ``addBookmark()`` and ``updateBookmark()``
+changed due to the addition of the ``$short`` parameter.
+
+We got complaints about the changed file structure, and people told
+us that they just cannot set the document root to ``www/``, because they
+are not admins on their HTTP server. This is a valid point, and
+with 0.96.0 you can easily change it. See `INSTALL.txt`_ for more information
+about moving ``www/``.
+
+.. _INSTALL.txt: INSTALL.html
+
+
+From version 0.94 to 0.95
+=========================
+The file structure completely changed in 0.95.0 compared
+to previous versions. We recommend that you start with a
+fresh installation, just copying over your ``config.php`` file.
+Set your web server document root directory to ``www/``.
+
+Yes, we kind of lost the ability to run SemanticScuttle
+in a subdirectory of a hostname. This functionality will
+be back in one of the next releases, but for now, you have
+to live with it.
+
+Update your database
+--------------------
+Apply ``data/schema/4.sql``.
+
+Currently, only MySQL can be used as database backend.
+All other DBMS (database management systems) have not been
+tested except for PostgreSQL, and SemanticScuttle fails there.
+
+Translation
+-----------
+The ``de_AT`` translation has been re-added. This is because
+``de_AT`` provides a rather ugly "official German" style,
+while the normal ``de_DE`` is friendlier. Choose what you like.
+
+
+From version 0.93 to 0.94
+=========================
+
+- Nothing changed except for the default configuration file.
+ It is recommended to start with a fresh config file,
+ but not neccesary. Old config files still work.
+- If you used translation ``de_AT``, please switch to ``de_DE``.
+ ``de_AT`` was moved to ``de_DE`` and ``de_AT`` has been removed.
+
+
+From version 0.92 to 0.93
+=========================
+
+- Backup your database
+- Make a copy from your SemanticScuttle Web directory
+- Upgrade your current configuration file (``config.inc.php``) with respect to ``config.inc.php.example`` ::
+
+ $footerMessage = ''; #HTML message appearing at the bottom of the page (just above SemanticScuttle credits)
+ $sidebarTopMessage = ''; #HTML message appearing at the top of the sidebar
+ $sidebarBottomMessage = ''; #HTML message appearing at the bottom of the sidebar
+ $adminsCanModifyBookmarksFromOtherUsers = true; # 'true' if admin users can edit or delete bookmarks belonging to other users. Else 'false'.
+ $adminsAreAdvisedTagsFromOtherAdmins = false; # 'true' if tags from other admins are proposed to each admin (in add/edit a bookmark page). Else 'false'.
+ $defaultPerPageForAdmins = 20; # default number of bookmarks per page for admins (-1 means no limit)
+
+
+From version 0.91 to 0.92
+=========================
+Message: this version modifies the database to UTF-8 charset. The idea is to convert the content (through BLOB type) and then to change the tables' charsets.
+
+- Backup your database
+- Make a copy from your SemanticScuttle Web directory
+- Upgrade your database by applying ``data/schema/3.sql``
+- Upgrade your current configuration file (``config.inc.php``) with respect to ``config.inc.php.example``
+
+ - Add variable ::
+
+ $descriptionAnchors = array("author", "isbn", "address"=>"[address][street][/street][city][/city][/address]"); #add a possible anchor (structured content) for bookmarks' description field
+
+ - Add variable ::
+
+ $enableCommonTagDescriptionEditedByAll = true; #true mean everybody can edit common description. Else just the admins can do it.
+ - Add variable ::
+
+ $googleAnalyticsCode = ''; #Allow GoogleAnalytics tracker https://www.google.com/analytics/
+
+
+From version 0.90 to 0.91
+=========================
+- Backup you database
+- Make a copy from your SemanticScuttle Web directory
+- Upgrade your database by applying ``data/schema/2.sql``
+- Upgrade your current configuration file (``config.inc.php``) with respect to ``config.inc.php.example``
+
+ - Delete last line ::
+
+ include_once('debug.inc.php');
+
+ - Add variable::
+
+ $menu2Tags = array('example', 'of', 'menu', 'tags');
+
+ - Add variable::
+
+ $debugMode = true; # if true, show debug messages
+
+
+From version 0.89 to 0.90
+=========================
+
+- Backup you database
+- Make a copy from your SemanticScuttle Web directory
+
+- Upgrade your current configuration file (config.inc.php) with respect to config.inc.php.example
+
+ add these lines under ``$enableWebsiteThumbnails = false; # enableWebsiteThumbnails {true|false}``::
+
+ $thumbnailsUserId = '';
+ $thumbnailsKey = '';
+
+
+From version 0.88 to 0.89
+=========================
+
+- Backup you database
+- Make a copy from your SemanticScuttle Web directory
+- Upgrade your database by applying ``data/schema/1.sql``
+- Upgrade your current configuration file (``config.inc.php``) with respect to ``config.inc.php.example``
+
+ - add line::
+
+ $sizeSearchHistory = 10;
+
+ - add sidebar block index line::
+
+ $index_sidebar_blocks = array('search','menu','users','popular');
+
+ - add line::
+ $enableGoogleCustomSearch = true;
diff --git a/doc/allinone.rst b/doc/allinone.rst
new file mode 100644
index 0000000..e5ca3c7
--- /dev/null
+++ b/doc/allinone.rst
@@ -0,0 +1,31 @@
+=============================
+SemanticScuttle documentation
+=============================
+
+.. contents::
+
+First reads
+===========
+.. include:: README.rst
+.. include:: INSTALL.txt
+.. include:: UPGRADE.txt
+
+
+
+Features
+========
+.. include:: authentication.rst
+.. include:: ssl-client-certificates.rst
+.. include:: themes.rst
+
+
+
+Developer documentation
+=======================
+.. include:: developers/rules.rst
+.. include:: developers/api.rst
+.. include:: developers/debugging.rst
+.. include:: developers/release-new-version.rst
+.. include:: developers/running-unit-tests.rst
+.. include:: developers/translation.rst
+.. include:: ChangeLog
diff --git a/doc/authentication.rst b/doc/authentication.rst
new file mode 100644
index 0000000..d9d5066
--- /dev/null
+++ b/doc/authentication.rst
@@ -0,0 +1,216 @@
+============================================
+External authentication with SemanticScuttle
+============================================
+
+Most times, one piece of software is only a part in the big puzzle
+that makes the software landscape of a company or organization.
+SemanticScuttle is not different and should integrate as nicely as
+possible with all other systems.
+
+One of the basic tasks of integration is user authentication against
+a central database - be it a central user database, an LDAP or a
+active directory server.
+
+Since version 0.96, SemanticScuttle supports user authentication against
+external systems. To provide a wide range of supported systems, we chose
+to utilize PEAR's `Authentication package`__.
+It does this by providing different "`authentication containers`__",
+for example Database, IMAP, LDAP, POP3, RADIUS, SAP and SOAP.
+
+Please be aware of the fact that, after successful authentication, the user
+and his scrambled password are stored in the SemanticScuttle database.
+This is required for proper functioning of the software. It does not mean
+that you will be able to login if your external authentication provider
+is offline - you won't, execpt you switch it off in the SemanticScuttle
+configuration.
+
+
+__ http://pear.php.net/package/Auth
+__ http://pear.php.net/manual/en/package.authentication.auth.intro-storage.php
+
+
+Basic configuration
+===================
+The default configuration file ``data/config.default.php`` has an own section
+on auth options and an explanation of the single entries.
+
+To utilize the external authentication, you need to install the
+PEAR Auth package: ::
+
+ $ pear install auth
+
+If you do not have a PEAR installation available, you can try to manually
+install the files in the src/ directory. If you choose to do that, the
+src/ directory should look similar to that: ::
+
+ src/
+ Auth.php
+ Auth/
+ Anonymous.php
+ Container.php
+ Container/
+ ..
+ SemanticScuttle/
+ header.php
+ ..
+
+After that, modify your ``data/config.php`` file. The most important change
+is to use ::
+
+ $serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
+
+which tells SemanticScuttle to switch to the special authentication service.
+
+Now that's done, you can configure the single auth options:
+
+``$authType = 'MDB2';``
+ selects the authentication container.
+
+``$authOptions``
+ is an array of options specific to the authentication container. Please
+ consult the PEAR Auth documentation for more information.
+
+``$authDebug = true;``
+ should be used when setup fails, since it may give important hints
+ where it fails.
+
+ Please note that login will seem to fail with
+ debugging activated. Going back to the main page after that will
+ show that you are logged in.
+
+
+
+Authentication examples
+=======================
+
+General database authentification
+---------------------------------
+Here you also need the PEAR `MDB2 package`_.
+The "``new_link``" option is important!
+
+``config.php`` settings: ::
+
+ $serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
+ $authType = 'MDB2';
+ $authOptions = array(
+ 'dsn' => array(
+ 'phptype' => 'mysql',
+ 'hostspec' => 'FIXME',
+ 'username' => 'FIXME',
+ 'password' => 'FIXME',
+ 'database' => 'FIXME',
+ 'new_link' => true,
+ ),
+ 'table' => 'usersFIXME',
+ 'usernamecol' => 'usernameFIXME',
+ 'passwordcol' => 'passwordFIXME',
+ 'cryptType' => 'md5',
+ );
+
+
+Mantis Bugtracker
+-----------------
+Here you also need the PEAR `MDB2 package`_.
+
+``config.php`` settings: ::
+
+ $serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
+ $authType = 'MDB2';
+ $authOptions = array(
+ 'dsn' => array(
+ 'phptype' => 'mysql',
+ 'hostspec' => 'FIXME',
+ 'username' => 'FIXME',
+ 'password' => 'FIXME',
+ 'database' => 'FIXME',
+ 'new_link' => true,
+ ),
+ 'table' => 'mantis_user_table',
+ 'usernamecol' => 'username',
+ 'passwordcol' => 'password',
+ 'cryptType' => 'md5',
+ );
+
+.. _MDB2 package: http://pear.php.net/package/MDB2
+
+
+MediaWiki
+---------
+Unfortunately, the password column does not contain a simple hashed
+password - for good reasons as described on
+http://www.mediawiki.org/wiki/Manual_talk:User_table#user_password_column
+
+If you configure your MediaWiki_ to use passwords without salt, you
+can make it work nevertheless:
+
+MediaWiki ``LocalSettings.php``: ::
+
+ $wgPasswordSalt = false;
+
+\- after that, users need to change/update their passwords to get them
+unsalted in the database. You can verify if the passwords are unhashed
+if you do ::
+
+ SELECT CAST( user_password AS CHAR ) FROM user
+
+on your MediaWiki database. Passwords prefixed with "``:A:``" can be used.
+
+Another problem is that mediawiki user names begin with an uppercase letter.
+You need to modify ``www/login.php`` and remove the "``utf8_strtolower``" function
+call: ::
+
+ $posteduser = trim(utf8_strtolower(POST_USERNAME));
+
+becomes ::
+
+ $posteduser = trim(POST_USERNAME);
+
+
+``config.php`` settings: ::
+
+ $serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
+ $authType = 'MDB2';
+ $authOptions = array(
+ 'dsn' => array(
+ 'phptype' => 'mysql',
+ 'hostspec' => 'FIXME',
+ 'username' => 'FIXME',
+ 'password' => 'FIXME',
+ 'database' => 'FIXME',
+ 'new_link' => true,
+ ),
+ 'table' => 'user',
+ 'usernamecol' => 'user_name',
+ 'passwordcol' => 'user_password',
+ 'cryptType' => 'md5_mediawiki',
+ );
+ function md5_mediawiki($password) {
+ return ':A:' . md5($password);
+ }
+
+
+.. _MediaWiki: http://www.mediawiki.org/wiki/MediaWiki
+
+Active Directory / LDAP
+-----------------------
+Here we authenticate against an active directory server.
+
+``config.php`` settings: ::
+
+ $serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
+ $authType = 'LDAP';
+ $authOptions = array(
+ 'host' => '192.168.1.4',
+ 'version' => 3,
+ 'basedn' => 'DC=EXAMPLE,DC=ORG',
+ 'binddn' => 'readuser',
+ 'bindpw' => 'readuser',
+ 'userattr' => 'sAMAccountName',
+ 'userfilter' => '(objectClass=user)',
+ 'attributes' => array(''),
+ );
+ $authEmailSuffix = '@example.org';
+
+More LDAP options can be found in the `PEAR manual`__.
+
+__ http://pear.php.net/manual/en/package.authentication.auth.storage.ldap.php
diff --git a/doc/configuration.rst b/doc/configuration.rst
new file mode 100644
index 0000000..dd0fb5e
--- /dev/null
+++ b/doc/configuration.rst
@@ -0,0 +1,98 @@
+===================
+Configuration files
+===================
+
+.. contents::
+
+SemanticScuttle uses at least two configuration files:
+
+1. Default configuration file ``config.default.php``
+2. Custom configuration file ``config.php``
+
+
+The **default configuration** file contains sensible defaults for most users
+that do not need to be changed to get started.
+
+Never change it - it will get overwritten with the next update.
+If you want to change values in it, copy them into your personal
+``config.php`` file - updates to SemanticScuttle will not change that one.
+
+The **custom configuration** file, ``config.php`` is created by copying the
+shipped ``config.php.dist`` file and modifying the values in there.
+
+It consists of the configuration directives that should be set on every
+fresh installation.
+
+
+
+Configuration scenarios
+=======================
+
+Simple installation
+-------------------
+Put your configuration file in ``data/config.php``.
+If you installed SemanticScuttle's PEAR package, use::
+
+ $ pear config-get data_dir
+ /usr/share/php/data
+
+to find the data directory location and append ``SemanticScuttle/`` to it.
+In this case, the configuration file has to be in::
+
+ /usr/share/php/data/SemanticScuttle/config.php
+
+
+The configuration file may also be saved into::
+
+ /etc/semanticscuttle/config.php
+
+
+Multiple SemanticScuttle instances
+----------------------------------
+The files of one single SemanticScuttle installation may be shared
+for several SemanticScuttle instances.
+
+To be able to configure them differently, SemanticScuttle supports
+per-host configuration files:
+
+- ``data/config.$hostname.php``
+- ``/etc/semanticscuttle/config.$hostname.php``
+
+
+
+Configuration options
+=====================
+``$root`` URL
+-------------
+Normally, this configuration setting is detected automatically and will
+work for both HTTP and HTTPS installations.
+
+If your installation is available on **HTTP only**, then you need to configure
+it.
+
+The value is the full URL to your installation, including a trailing
+slash::
+
+ $root = "http://homepage.example.org/semanticscuttle/";
+
+or::
+
+ $root = "http://bookmarks.example.org/";
+
+
+Common problems
+===============
+Searching for words with slashes "/" does not work
+--------------------------------------------------
+When searching for a phrase with a slash in it, like "foo/bar", you
+may get a 404 error.
+
+In that case, you need to enable AllowEncodedSlashes__ in your Apache
+virtual host configuration::
+
+ AllowEncodedSlashes NoDecode
+
+Restart apache after changing the vhost config file.
+Searching will work now.
+
+__ http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes
diff --git a/doc/developers/TODO.rst b/doc/developers/TODO.rst
new file mode 100644
index 0000000..59dd655
--- /dev/null
+++ b/doc/developers/TODO.rst
@@ -0,0 +1,104 @@
+- SemanticScuttle_Filter
+ -> class with static filter functions to filter
+ ids, usernames, passwords, sorting etc.
+- when a user gets deleted from database, he should not be
+ logged in anymore (name not shown on top right)
+- Make users inactive by default when registered newly
+ - have to be activated by admins
+- Add RDFa to user profile page
+- use recaptcha or alike -> quickform
+- tutorial about sidebar
+- update php-gettext
+- index on bookmarks->modified, since created is not used in selects/sort
+ - how to optimize sorts, to prevent mysql filesort? -> index enough?
+ - how to optimize DISTINCT bHash
+
+
+Tracker items:
+#1908041 - klick counter
+ a counter how many people klicked one link
+#1964906 - Page numbers list / alternative pagination
+ I would love to have page numbers like for example google has for terms
+ with many hits. You can have a look at what exactly I'm talking about here:
+ http://www.jenst.se/wp-content/uploads/2008/04/wp-page-numbers-themes.gif .
+ With this you can more easily browse through the pages by clicking the
+ numbers and not those 'next' and 'previous' buttons.
+#1989984 - Branding Improvements
+ Create an ability to brand the installed site on several levels:
+ Level 1 - add a logo and text to the header
+ Level 2 - add a logo and text to the top header and add html (logos, text,
+ flickr widgets, youtube widgets, etc.) to the left and right side bars
+ through an interface similar to the theme editor on Wordpress. Also
+ include easy interface to Google AdWords.
+ Level 3 - add the items in Level 2 plus a banner ad manager.
+ Requirements:
+ - add comments to the CSS to allow for the novice to edit the CSS based on
+ known widget or image size. This is an important addition.
+#1969682 - private bookmarks
+ I think the handling of private bookmarks could be improved. Now it is so
+ that you just see a smaller amount of bookmarks as a visitor as you would
+ see when you are logged in as a member (and if had added some private
+ bookmarks to the site).
+ There should be a separate count of this private bookmarks to indicate that
+ there are some. Something like '80 public/total bookmark(s) - 5 private
+ bookmarks(s)'. It also should be easier to find them. Maybe the above
+ mentioned line counting the private bookmarks could be a link to a page
+ listing them.
+#2035563 - Delete bookmarks based on user votes
+ I'm using Semantic Scuttle for ONE topic based bookmarks sharing. Sometimes
+ I, as admin is not sure if the bookmark submitted is right for or not.
+ I'l like to propose a function, where 5 (numbers can be selected)of top
+ users (or sub admins if they can be created) of the site marks the bookmark
+ not applicable to the site, then that bookmark is deleted.
+#2862548 - Disable email TLD verification
+ It should be possible to disable the top level domain verification in the
+ email verification for new users. Use cases are
+ a) new top level domains (TLD) that are created in the future
+ b) company-internal non-standard TLDs
+#2830219 - Edit by other people
+ We use SemanticScruttle to share bookmarks in the company I work for.
+ It'd be helpful if there was a way all people could edit public bookmarks.
+#1969705 - adjustable thumbnail height and width in config.inc.php
+ I put two vars in the config file to adjust the size of the thumbnails and
+ accordingly changed the bookmarks.tpl.php file:
+ bookmarks.tpl.php
+ $websiteThumbnailsWidth = 90; # width of thumbnails in pixel, max value
+ 240
+ $websiteThumbnailsHeight = 68; # height of thumbnails in pixel, max value
+ 180
+#1933227 - custom maximum number of items in RSS-feeds
+ for Mozilla Firefox's Live Bookmarks feature, the current 15 items
+ delivered by RSS may not be enough.
+ note: by changing getPerPageCount() in functions.inc.php in a similar
+ manner, it should be possible to make the max-entries-per-page
+ customizable
+#1926991 - Admin Approval of New Users
+ Create a way for admins to select if they have to approve all new users.
+ Then have the following methods for new user approval:
+ - by email to selected admin on a per instance basis
+ - through an admin panel on a per instance basis
+ - through an admin panel on a batch basis
+ - through an admin panel by setting up rules for approval (for example:
+ user admin must have a specific domain - helpful for big companies)
+ This would help reduce the amount of spam for some users.
+#1932109 - tag counting: count each URL only once
+ I don't know if it's only me, but I have would prefer another way of
+ calculating a tag's weight:
+ current behaviour:
+ existing tags are currently counted by summing up the entries in the system
+ that have that tag.
+ example:
+ one user added youtube.com with the tag "videos".
+ one user added video.google.com with the tag "videos".
+ ten users added amazon.com with the tag "books".
+ the tags are now weighed like this: 2 videos, 10 books.
+ although there are more unique URLs in the system with the tag "videos".
+ preferred behaviour:
+ for tag-weighing, count the unique URLs, instead of the entries.
+ in the example above: count 2 for "videos", one for "books".
+#2830224 - Shorturl/tinyurl service
+ It would be cool if SemanticScruttle could be used as shorturl service with
+ configurable short urls.
+ So I'd define "freddy" as short url name in the bookmark, and anyone could
+ access it e.g. via our-bookmarks.com/s/freddy and get redirected to the
+ real url. Useful to get permanent URLs to moving targets.
diff --git a/doc/developers/api.rst b/doc/developers/api.rst
new file mode 100644
index 0000000..efa05fe
--- /dev/null
+++ b/doc/developers/api.rst
@@ -0,0 +1,10 @@
+SemanticScuttle API
+===================
+
+SemanticScuttle tries to implement the delicious API v1 as closely as sensible.
+
+Where it makes sense and the delicious API just does things plainly wrong
+(i.e. when returning a wrong status code on an error), we do it better.
+
+- http://www.delicious.com/help/api
+- http://support.delicious.com/forum/comments.php?DiscussionID=5286&page=1
diff --git a/doc/developers/debugging.rst b/doc/developers/debugging.rst
new file mode 100644
index 0000000..6bee309
--- /dev/null
+++ b/doc/developers/debugging.rst
@@ -0,0 +1,24 @@
+How to debug SemanticScuttle
+============================
+
+
+Database queries
+----------------
+
+In ``data/config.php``, enable ``debugMode``.
+Further, add the following afterwards: ::
+
+ register_shutdown_function(
+ create_function('', <<<FNC
+ \$GLOBALS['db'] = SemanticScuttle_Service_Factory::getDb();
+ \$GLOBALS['db']->sql_report('display');
+ FNC
+ )
+ );
+
+
+To see database queries in SemanticScuttle, add ::
+
+ ?explain=1
+
+to your URL.
diff --git a/doc/developers/doc-TODO.rst b/doc/developers/doc-TODO.rst
new file mode 100644
index 0000000..4fac4ab
--- /dev/null
+++ b/doc/developers/doc-TODO.rst
@@ -0,0 +1,9 @@
+- Bookmarklets: Text selection is used as description
+- Tag nesting: Paris > France > World
+- Tag alias: Deutschland = Germany
+
+
+- Which fields are searched?
+ title, description, private note, username, tags
+
+- What are [isbn] and so for?
diff --git a/doc/developers/release-new-version.rst b/doc/developers/release-new-version.rst
new file mode 100644
index 0000000..de2c4e3
--- /dev/null
+++ b/doc/developers/release-new-version.rst
@@ -0,0 +1,31 @@
+How to release a new version of SemanticScuttle
+===============================================
+
+0. Run unit tests and verify that all of them pass
+1. Update ``doc/ChangeLog``
+2. Update ``doc/UPGRADE.txt``
+3. Update version in ``data/templates/default/about.tpl.php``,
+ ``build.xml`` and ``doc/README.rst``
+4. Create a release zip file via the build script:
+ Just type "``phing``".
+5. Make a test installation from your zip file with a fresh
+ database. Register a user, add bookmarks etc.
+6. When all is fine, it's time to release.
+ The build script takes care for most of the
+ tasks.
+ Run "``phing release``", and it will upload the release to
+ sourceforge.
+7. Create a git tag and push it
+8. Create the PEAR package and test it:
+ Run ``phing package``, then
+ ``pear upgrade dist/pear/SemanticScuttle-0.xx.tgz``
+9. Publish the PEAR package: ``phing deploy-sf-pear``
+10. Publish the documentation: ``phing deploy-docs``
+11. Write announcement mail to the SemanticScuttle mailing list
+ semanticscuttle-devel@lists.sourceforge.net
+12. Announce the new release in the sourceforge project news
+ https://sourceforge.net/news/submit.php?group_id=211356
+ Help about the process is available in
+ https://sourceforge.net/apps/trac/sourceforge/wiki/News
+13. Set the default file in
+ https://sourceforge.net/projects/semanticscuttle/files/SemanticScuttle/
diff --git a/doc/developers/rules.rst b/doc/developers/rules.rst
new file mode 100644
index 0000000..701a215
--- /dev/null
+++ b/doc/developers/rules.rst
@@ -0,0 +1,30 @@
+Rules for developers
+====================
+
+1. Coding style
+---------------
+SemanticScuttle uses the PEAR Coding Standards.
+While quite some parts still do not follow them, all of the
+code will be coverted to them. When developing new code,
+adhere to it.
+
+A helpful tool to check your coding style is PHP CodeSniffer,
+http://pear.php.net/package/PHP_CodeSniffer
+
+
+2. Unit tests
+-------------
+At least the service and model classes have unit tests.
+If you fix things in there, make sure you
+a) do not break the tests or
+b) fix the tests if the old behavior was broken
+
+
+3. Keep security in mind
+------------------------
+As a web application, there are several attack vectors to SemanticScuttle.
+When processing user input (form variables, URL parameters)
+be sure to convert and validate them. If you expect a bookmark id,
+there is no reason not to cast the variable to (int).
+
+Filter input, escape output.
diff --git a/doc/developers/running-unit-tests.rst b/doc/developers/running-unit-tests.rst
new file mode 100644
index 0000000..f75cb81
--- /dev/null
+++ b/doc/developers/running-unit-tests.rst
@@ -0,0 +1,31 @@
+Running unit tests
+==================
+The tests are dependent on the pear packages HTTP_Request2 and Stream_Var.
+
+Install them with: ::
+ $ pear install HTTP_Request2
+ $ pear install Stream_Var
+
+Go to the SemanticScuttle ``tests`` directory and run ``phpunit``::
+
+ $ cd tests
+ $ phpunit .
+
+also remember the ``--verbose`` parameter to PHPUnit.
+
+If you want to run a specific test class only: ::
+
+ $ cd tests
+ $ phpunit BookmarksTest.php
+
+If you need to test one method only: ::
+
+ $ cd tests
+ $ phpunit --filter BookmarkTest::testUnificationOfBookmarks tests/BookmarkTest.php
+
+
+Caveats
+-------
+Having debugging enabled and database driver "``mysql4``" activated
+will lead to failing tests because of ``FOUND_ROWS()`` usage, which
+does not work nicely with database debugging.
diff --git a/doc/developers/translation.rst b/doc/developers/translation.rst
new file mode 100644
index 0000000..008f66e
--- /dev/null
+++ b/doc/developers/translation.rst
@@ -0,0 +1,47 @@
+===========================
+Translating SemanticScuttle
+===========================
+
+SemanticScuttle uses gnu gettext for translation. It does not
+rely on the php extension but ships with a pure php implementation,
+php-gettext_.
+
+Using gettext from within the code is really easy:
+Enclose the string you want to translate in a "``T_``" function call.
+
+For example, to translate::
+
+ echo "Vote for";
+
+just write ::
+
+ echo T_("Vote for");
+
+.. _php-gettext: https://launchpad.net/php-gettext/
+
+Translation basics
+==================
+
+We keep one base translation file, ``data/locales/messages.po``.
+This file is auto-generated via ``xgettext`` from all our php source files.
+In case you added a new string to the code that needs translation,
+update the base translation file by running ::
+
+ $ php scripts/update-translation-base.php
+
+After that has been done, the changes to the base ``messages.po`` file
+need to be merged into the single language translation files,
+for example ``data/locales/de_DE/LC_MESSAGES/messages.po``.
+
+Updating them from the master file is as easy as running::
+
+ $ php scripts/update-translation.php de_DE
+
+When the translation is ready, the ``.po`` file needs to be compiled
+in a machine-readable ``.mo`` file. Use ::
+
+ $ php scripts/compile-translation.php de_DE
+
+to achieve that.
+
+
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000..678c102
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,50 @@
+=============================
+SemanticScuttle documentation
+=============================
+
+
+First reads
+===========
+- README_
+- `installation guide`_
+- `upgrade instructions`_
+
+.. _README: README.html
+.. _installation guide: INSTALL.html
+.. _upgrade instructions: UPGRADE.html
+
+
+
+Features
+========
+- `Custom user authentication`__
+- `SSL Client certificates`__
+- Themes__
+- `Configuration files`__
+- Tools__
+
+__ authentication.html
+__ ssl-client-certificates.html
+__ themes.html
+__ configuration.html
+__ tools.html
+
+
+
+Developer documentation
+=======================
+- `General development rules`__
+- `Delicious API`__
+- `Debugging HowTo`__
+- `How to release a new version`__
+- `Running unit testes`__
+- `How to translate SemanticScuttle`__
+- `ChangeLog`__
+
+__ developers/rules.html
+__ developers/api.html
+__ developers/debugging.html
+__ developers/release-new-version.html
+__ developers/running-unit-tests.html
+__ developers/translation.html
+__ ChangeLog.html
diff --git a/doc/ssl-client-certificates.rst b/doc/ssl-client-certificates.rst
new file mode 100644
index 0000000..7abf17a
--- /dev/null
+++ b/doc/ssl-client-certificates.rst
@@ -0,0 +1,181 @@
+=======================
+SSL client certificates
+=======================
+
+By using SSL client certificates, you get automatically logged into
+SemanticScuttle without using a password or submitting a login form.
+
+Any number of certificates can be registered with a user account,
+making it easy to login to the same installation from home and from
+work - without risking to use the same certificate on both machines.
+
+
+Usage scenarios
+===============
+The scenarios assume that the web server is configured_ properly
+to request client certificates.
+
+.. _configured: `Configuring your web server`_
+
+
+Registering a certificate with an existing account
+--------------------------------------------------
+You already have an account and want to associate a SSL client certificate
+with it.
+
+1. Visit your profile page
+2. Click "Register current certificate to automatically login."
+
+That's it. Now logout and click "Home". You will be logged in again
+automatically.
+
+
+Registering a certificate with a new account
+--------------------------------------------
+When you do not have an user account yet, just visit the registration
+page. Your email address will already be filled in, using the information
+from the SSL certificate.
+
+Provide the rest of the data and submit the form.
+The certificate will automatically be associated to your account,
+and the user name will also be set for you.
+
+
+
+Configuring your web server
+===========================
+
+Getting SSL certificates
+------------------------
+You need both a server certificate for normal HTTPS mode, as well as a client
+certificate in your browser.
+
+CAcert.org is a good place to obtain both.
+You are of course free to generate your own certificate with i.e. openssl
+or buy a certificate from another certificate authority, but this is out
+of this document's scope.
+
+Server certificate
+''''''''''''''''''
+First, generate a Certificate Signing Request with the `CSR generator`__.
+Store the key file under ::
+
+ /etc/ssl/private/bookmarks.cweiske.de.key
+
+Use the the .csr file and the CAcert web interface to generate a signed
+certificate. Store it as ::
+
+ /etc/ssl/private/bookmarks.cweiske.de-cacert.pem
+
+Now fetch both official CAcert certificates (root and class 3) and put both
+together into ::
+
+ /etc/ssl/private/cacert-1and3.crt
+
+.. _CSR: http://wiki.cacert.org/CSRGenerator
+__ CSR_
+
+
+Client certificate
+''''''''''''''''''
+CAcert also offers to create client certificates. You do not need a
+certificate sign request but just can create it on their web page.
+
+After creation, you can simply install it in your browser by clicking
+on the appropriate link on the CAcert page.
+
+Once you got the certificate installed in your browser, you can transfer
+it to other browsers by exporting it in the `PKCS #12` format
+(with private key included) and importing it in any other browsers
+you use.
+
+
+
+Apache configuration
+--------------------
+To make use of SSL client certificates, you need to deliver SemanticScuttle
+via HTTPS.
+
+Note that you can equip several virtual hosts with SSL certificates
+and keep them on the same, standard SSL port by using SNI -
+`Server Name Indication`__.
+
+.. _SNI: http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI
+__ SNI_
+
+A basic virtual host configuration with SSL looks like this:
+
+::
+
+ <VirtualHost *:443>
+ ServerName bookmarks.cweiske.de
+
+ LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
+ CustomLog /var/log/apache2/access_log vcommon
+
+ VirtualDocumentRoot /home/cweiske/Dev/html/hosts/bookmarks.cweiske.de
+ <Directory "/home/cweiske/Dev/html/hosts/bookmarks.cweiske.de">
+ AllowOverride all
+ </Directory>
+
+ SSLEngine On
+ SSLCertificateFile /etc/ssl/private/bookmarks.cweiske.de-cacert.pem
+ SSLCertificateKeyFile /etc/ssl/private/bookmarks.cweiske.de.key
+
+ SSLCACertificateFile /etc/ssl/private/cacert-1and3.crt
+ </VirtualHost>
+
+Apart from that, you might need to enable the SSL module in your webserver,
+i.e. by executing ::
+
+ $ a2enmod ssl
+
+
+Now that SSL works, you can configure your web server to request client
+certificates.
+
+::
+
+ ...
+ </Directory>
+
+ SSLVerifyClient optional
+ SSLVerifyDepth 1
+ SSLOptions +StdEnvVars
+ </VirtualHost>
+
+There are several options you need to set:
+
+
+``SSLVerifyClient optional``
+ You may choose ``optional`` or ``required`` here.
+ ``optional`` asks the browser for a client certificate but accepts
+ if the browser (the user) does choose not to send any certificate.
+ This is the best option if you want to be able to login with and
+ without a certificate.
+
+ Setting ``required`` makes the web server terminate the connection
+ when no client certificate is sent by the browser.
+ This option may be used when all users have their client certificate set.
+
+``SSLVerifyDepth 1``
+ Your client certificate is signed by a certificate authority (CA),
+ and your web server trusts the CA specified in ``SSLCACertificateFile``.
+ CA certificates itself may be signed by another authority, i.e. like ::
+
+ CAcert >> your own CA >> your client certificate
+
+ In this case, you have a higher depth. For most cases, 1 is enough.
+
+``SSLOptions +StdEnvVars``
+ This makes your web server pass the SSL environment variables to PHP,
+ so that SemanticScuttle can detect that a client certificate is available
+ and read its data.
+
+ In case you need the complete certificate
+ \- which SemanticScuttle does *not* need - you have to add ``+ExportCertData``
+ to the line.
+
+
+That's it. Restart your web server and visit your SemanticScuttle installation.
+Continue reading the `Usage scenarios`_.
diff --git a/doc/themes.rst b/doc/themes.rst
new file mode 100644
index 0000000..895f1a0
--- /dev/null
+++ b/doc/themes.rst
@@ -0,0 +1,58 @@
+======================
+SemanticScuttle Themes
+======================
+SemanticScuttle may be changed visually by supplying custom "themes" (skins)
+that modify the visual appearance.
+
+
+Changing the current theme
+==========================
+In ``data/config.php``, set your theme like this: ::
+
+ $theme = 'darkmood';
+
+The available themes are the folders in ``www/themes/``.
+By default, SemanticScuttle ships only one usable theme ("default") and one
+to demonstrate how to create your own theme ("testdummy").
+
+
+Creating your own theme
+=======================
+Have a look at the "testdummy" theme in ``www/themes/testdummy/``.
+
+CSS and image files
+-------------------
+Since both file types need to be accessible via the web server directly,
+they are located in the ``www/`` folder: ::
+
+ www/themes/$themename/
+
+The main CSS file that automatically gets included is ::
+
+ www/themes/$themename/scuttle.css
+
+Several template files in SemanticScuttle include image files. If they do not
+exist in your theme, the default ones are used automatically.
+Note that this is not true for images that are specified in the CSS files.
+
+
+Template files
+--------------
+The templates of the default file are located in ::
+
+ data/templates/default/
+
+You may put your theme template files into ::
+
+ data/templates/$themename/
+
+
+Existing themes
+===============
+
+* `Flat`__ by Roman Lehnhof. See the `introduction blog post`__
+* `sscuttlizr`__
+
+__ https://github.com/rlehnhof/flat
+__ http://lehnhof.net/2013/08/semantic-scuttle-new-flat-interface-theme-template/
+__ https://github.com/jonrandoem/sscuttlizr
diff --git a/doc/tools.rst b/doc/tools.rst
new file mode 100644
index 0000000..3c3ad04
--- /dev/null
+++ b/doc/tools.rst
@@ -0,0 +1,44 @@
+=================================
+Tools to use with SemanticScuttle
+=================================
+
+Scuttleoid
+==========
+Scuttloid is an android client for managing your bookmarks that are
+stored on a Semantic Scuttle server.
+It allows to list/search your personal bookmarks, add and edit existing
+bookmarks, and share them to other applications.
+
+Installable via `f-droid`__.
+Also see the `source code`__.
+
+__ https://f-droid.org/repository/browse/?fdid=gr.ndre.scuttloid
+__ https://github.com/ilesinge/scuttloid
+
+
+Scuttle for Android
+===================
+Scuttle for Android is a client for the Scuttle bookmarking software.
+Enter your Scuttle login information and you will presented with a list of your
+bookmarks.
+Touching a bookmark will load that web page in the browser.
+Use the browser's "Share" menu option to add bookmarks to your Scuttle.
+
+See the homepage__ and `source code`__.
+
+__ http://slideme.org/application/scuttle-android
+__ https://github.com/shadybrooksoftware/Scuttle-For-Android
+
+
+ttrss2scuttle
+=============
+Announced in a `blog post`__, the plugin for the feed reader `Tiny Tiny RSS`__
+allows you to bookmark any of the articles in your own SemanticScuttle
+instance.
+
+Source code and installation instructions are on the
+`ttrss2scuttle github page`__.
+
+__ http://www.versvs.net/anotacion/plugin-tiny-tiny-rss-semanticscuttle
+__ http://tt-rss.org/
+__ https://github.com/versvs/ttrss2scuttle