diff --git a/sources/.gitattributes b/sources/.gitattributes new file mode 100644 index 00000000..4be1c918 --- /dev/null +++ b/sources/.gitattributes @@ -0,0 +1,2 @@ +# Disable LF normalization for all files +* -text \ No newline at end of file diff --git a/sources/.gitignore b/sources/.gitignore new file mode 100755 index 00000000..b01074ea --- /dev/null +++ b/sources/.gitignore @@ -0,0 +1,66 @@ +## Ignore tmp, backup, logs and other junk files +*~ +*.gz +*.out +*.bak +*.swp +*.log +*.lock +*.kate-swp +#Ignore emacs tempfiles +\#* +# patch attempts +*.orig +*.rej +# OSX .DS_Store files +.DS_Store +Thumbs.db + + +## Ignore RedMatrix site specific files and folders +.htconfig.php +favicon.* +addon/ +custom/ +/store/ +# site apps +apps/ +# default startpage +home.html +# Ignore site TOS +doc/SiteTOS.md +# themes except for redbasic +view/theme/* +! view/theme/redbasic +# site theme schemas +view/theme/redbasic/schema/default.php +# Doxygen API documentation, run 'doxygen util/Doxyfile' to generate it +doc/html/ +# zotsh configuration files +.zotshrc +# external repositories for themes/addons +extend/ + + +## exclude IDE files +# config files and folders from Eclipse +.project +.buildpath +.externalToolBuilders +.settings/ +# NetBeans project folder +nbproject/ +# Kdevelop project files +*.kdev4 +# PHPStorm +.idea/ + + +# composer files (at the moment composer is not officially supported and only used to add SabreDAV, we should add these) +composer.* + +# When we include composer we should exclude vendor/ +#vendor/ +# Exclude at least some vendor test files, examples, etc. +vendor/sabre/*/tests/ +vendor/sabre/*/examples/ diff --git a/sources/.openshift/README.md b/sources/.openshift/README.md new file mode 100644 index 00000000..535b9bdd --- /dev/null +++ b/sources/.openshift/README.md @@ -0,0 +1,94 @@ +#Hubzilla on OpenShift +You will notice a new .openshift folder when you fetch from upstream, i.e. from https://github.com/redmatrix/hubzilla.git , which contains a deploy script to set up Hubzilla on OpenShift. + +Create an account on OpenShift, then use the registration e-mail and password to create your first Hubzilla instance. Install git and RedHat's command line tools - rhc - if you have not already done so. + +``` +rhc app-create your_app_name php-5.4 mysql-5.5 cron phpmyadmin --namespace your_domain --from-code https://github.com/redmatrix/hubzilla.git -l your@email.address -p your_account_password +``` + +Make a note of the database username and password OpenShift creates for your instance, and use these at https://your_app_name-your_domain.rhcloud.com/ to complete the setup. + +NOTE: PostgreSQL is NOT supported by the deploy script yet. + +Update +To update, consider your own workflow first. I have forked Hubzilla code into my GitHub account to be able to try things out, this remote repo is called origin. Here is how I fetch new code from upstream, merge into my local repo, then push the updated code both into origin and the remote repo called openshift. + +``` +git fetch upstream;git checkout master;git merge upstream/master;git push origin;git push openshift HEAD +``` + +##Administration +Symptoms of need for MySQL database administration are: +- you can visit your domain and see the Hubzilla frontpage, but trying to login throws you back to login. This can mean your session table is marked as crashed. +- you can login, but your channel posts are not visible. This can mean your item table is marked as crashed. +- you can login and you can see your channel posts, but apparently nobody is getting your posts, comments, likes and so on. This can mean your outq table is marked as crashed. + +You can check your OpenShift logs by doing + +``` +rhc tail -a your_app_name -n your_domain -l your@email.address -p your_account_password +``` + +and you might be able to confirm the above suspicions about crashed tables, or other problems you need to fix. + +###How to fix crashed tables in MySQL +Using MySQL and the MyISAM database engine can result in table indexes coming out of sync, and you have at least two options for fixing tables marked as crashed. +- Use the database username and password OpenShift creates for your instance at https://your_app_name-your_domain.rhcloud.com/phpmyadmin/ to login via the web into your phpMyAdmin web interface, click your database in the left column, in the right column scroll down to the bottom of the list of tables and click the checkbox for marking all tables, then select Check tables from the drop down menu. This will check the tables for problems, and you can then checkmark only those tables with problems, and select Repair table from the same drop down menu at the bottom. +- You can login to your instance with SSH - see OpenShift for details - then + +``` +cd mysql/data/your_database +myisamchk -r *.MYI +``` + +or if you get + +``` +Can't create new tempfile +``` + +check your OpenShift's gear quota with + +``` +quota -gus +``` + +and if you are short on space, then locally (not SSH) do + +``` +rhc app-tidy your_app_name -l your_login -p your_password +``` + +to have rhc delete temporary files and OpenShift logs to free space first, then check the size of your local repo dir and execute + +``` +git gc +``` + +against it and check the size again, and then to minimize your remote repo connect via SSH to your application gear and execute the same command against it by changing to the remote repo directory - your repo should be in + +``` +~/git/your_app_name.git +``` + +(if not, do find -size +1M to find it), then do + +``` +cd ~/mysql/data/yourdatabase +myisamchk -r -v -f*.MYI +``` + +and hopefully your database tables are now okay. + +##NOTES +Note 1: definitely DO turn off feeds and discovery by default if you are on the Free or Bronze plan on OpenShift with a single 1Gb gear by visiting https://your-app-name.rhcloud.com/admin/site when logged in as administrator of your Hubzilla site. +Note 2: DO add the above defaults into the deploy script. +Note 3: DO add git gc to the deploy script to clean up git. +Note 4: MAYBE DO add myisamchk - only checking? to the end of the deploy script. + +The OpenShift `php` cartridge documentation can be found at: +http://openshift.github.io/documentation/oo_cartridge_guide.html#php + +For information about .openshift directory, consult the documentation: +http://openshift.github.io/documentation/oo_user_guide.html#the-openshift-directory diff --git a/sources/.openshift/action_hooks/README.md b/sources/.openshift/action_hooks/README.md new file mode 100644 index 00000000..54131958 --- /dev/null +++ b/sources/.openshift/action_hooks/README.md @@ -0,0 +1,3 @@ +For information about action hooks, consult the documentation: + +http://openshift.github.io/documentation/oo_user_guide.html#action-hooks diff --git a/sources/.openshift/action_hooks/deploy b/sources/.openshift/action_hooks/deploy new file mode 100755 index 00000000..dafde2d6 --- /dev/null +++ b/sources/.openshift/action_hooks/deploy @@ -0,0 +1,185 @@ +#!/bin/bash +# This deploy hook gets executed after dependencies are resolved and the +# build hook has been run but before the application has been started back +# up again. This script gets executed directly, so it could be python, php, +# ruby, etc. + +# Bash help: http://www.panix.com/~elflord/unix/bash-tute.html + +# For information about action hooks supported by OpenShift, consult the documentation: +# http://openshift.github.io/documentation/oo_user_guide.html#the-openshift-directory + +#### + +# Hubzilla specific deploy script + +# Place this file in /.openshift/action_hooks/ (The .openshift folder will be in the root of your repo) +# The file name should be "deploy" such that you have: +# .openshift/action_hooks/deploy + +# Conventions: Vars in curley braces have the slash after implied so no need to add it. +# e.g. ${OPENSHIFT_REPO_DIR}php/foobar = /repo/php/foobar +# See all OpenShift vars here: +# https://www.openshift.com/developers/openshift-environment-variables + +# HME - NOTE - leftover from original openshift-drupal-deploy +# In config.php you can leverage the enviroment variables like this: +# // Define env vars. +# if (array_key_exists('OPENSHIFT_APP_NAME', $_SERVER)) { +# $src = $_SERVER; +# } else { +# $src = $_ENV; +# } +# +# $conf["file_private_path"] = $src['OPENSHIFT_DATA_DIR'] . "private"; +# $conf["file_temporary_path"] = $src['OPENSHIFT_DATA_DIR'] . "tmp"; + + +#### + +# Start Deploy + +echo "Starting Deploy..." + +# Let's create the Hubzilla files directory in the Openshift data folder ($OPENSHIFT_DATA_DIR). + +echo "Check for the files directory called store, if not created - create it" + +if [ ! -d ${OPENSHIFT_DATA_DIR}store ]; then +mkdir -p ${OPENSHIFT_DATA_DIR}"store/[data]/smarty3" +echo "Done creating files directory" + +else + +echo "The files directory called store already exists" + +fi + +#### + +# Set permissions on the files directory. + +echo "Now chmod 777 -R files" + +chmod -R 777 ${OPENSHIFT_DATA_DIR}store + +echo "chmod done, permissions set to 777" + +#### + +# Symlink our files folder to the repo. + +# Note the "php" directory below seems to be the best way to serve OpenShift files. +# This is good as that allows us for directories one level above such as tmp and private + +echo "Create sym links for writeable directories" + +ln -sf ${OPENSHIFT_DATA_DIR}store ${OPENSHIFT_REPO_DIR}store + +echo "Files sym links created" + +#### + +# Copy .htconfig.php from the repo, rename it and place it in the data directory. +# if it's there already, skip it. + +if [ ! -f ${OPENSHIFT_DATA_DIR}.htconfig.php ]; + +then + +cp ${OPENSHIFT_REPO_DIR}.htconfig.php ${OPENSHIFT_DATA_DIR}.htconfig.php + +echo ".htconfig.php copied." + +else + +echo "Looks like the .htconfig.php file is already there, we won't overwrite it." + +fi + +#### + +# symlink the .htconfig.php file. + +echo "Create sym link for .htconfig.php" + +ln -sf ${OPENSHIFT_DATA_DIR}.htconfig.php ${OPENSHIFT_REPO_DIR}.htconfig.php + +echo ".htconfig.php symlink created" + +#### +# Copy .htaccess from the repo, rename it and place it in the data directory. +# if it's there already, skip it. + +if [ ! -f ${OPENSHIFT_DATA_DIR}.htaccess ]; + +then + +cp ${OPENSHIFT_REPO_DIR}.htaccess ${OPENSHIFT_DATA_DIR}.htaccess + +echo ".htaccess copied." + +else + +echo "Looks like the .htaccess file is already there, we won't overwrite it." + +fi + +#### + +# symlink the .htaccess file. + +echo "Create sym link for .htaccess" + +ln -sf ${OPENSHIFT_DATA_DIR}.htaccess ${OPENSHIFT_REPO_DIR}.htaccess + +echo ".htaccess symlink created" + +#### + +echo "Check for the poller at .openshift/cron/minutely/poller , if not created - create it" + +if [ ! -f ${OPENSHIFT_REPO_DIR}.openshift/cron/minutely/poller ]; then +printf '%s\n' '#!/bin/bash' 'if [ ! -f $OPENSHIFT_DATA_DIR/last_run ]; then' ' touch $OPENSHIFT_DATA_DIR/last_run' 'fi' 'if [[ $(find $OPENSHIFT_DATA_DIR/last_run -mmin +9) ]]; then #run every 10 mins' ' rm -f $OPENSHIFT_DATA_DIR/last_run' ' touch $OPENSHIFT_DATA_DIR/last_run' ' # The command(s) that you want to run every 10 minutes' 'cd /var/lib/openshift/${OPENSHIFT_APP_UUID}/app-root/repo; /opt/rh/php54/root/usr/bin/php include/poller.php' 'fi' >${OPENSHIFT_REPO_DIR}.openshift/cron/minutely/poller +echo "Done creating file .openshift/cron/minutely/poller" + +else + +echo "The poller already exists" + +fi + +#### + +# Set permissions on the poller script to make it executable. + +echo "Now chmod 777 -R poller" + +chmod -R 777 ${OPENSHIFT_REPO_DIR}.openshift/cron/minutely/poller + +echo "chmod done, permissions set to 777 on poller script." + +#### + +### echo "Check for the hot deploy marker at .openshift/markers/hot_deploy , if not created - create it" + +### if [ ! -f ${OPENSHIFT_REPO_DIR}.openshift/markers/hot_deploy ]; then + +### touch ${OPENSHIFT_REPO_DIR}.openshift/markers/hot_deploy + +### echo "Done creating file .openshift/markers/hot_deploy" + +### else + +### echo "The hot deploy marker already exists" + +### fi + +#### + +# Hubzilla configuration - changes to default settings +# to make Hubzilla on OpenShift a more pleasant experience +cd ${OPENSHIFT_REPO_DIR} +util/config system expire_delivery_reports 3 +util/config system feed_contacts 0 +util/config system disable_discover_tab 1 diff --git a/sources/.openshift/cron/README.cron b/sources/.openshift/cron/README.cron new file mode 100644 index 00000000..ac77f787 --- /dev/null +++ b/sources/.openshift/cron/README.cron @@ -0,0 +1,27 @@ +Run scripts or jobs on a periodic basis +======================================= +Any scripts or jobs added to the minutely, hourly, daily, weekly or monthly +directories will be run on a scheduled basis (frequency is as indicated by the +name of the directory) using run-parts. + +run-parts ignores any files that are hidden or dotfiles (.*) or backup +files (*~ or *,) or named *.{rpmsave,rpmorig,rpmnew,swp,cfsaved} + +The presence of two specially named files jobs.deny and jobs.allow controls +how run-parts executes your scripts/jobs. + jobs.deny ===> Prevents specific scripts or jobs from being executed. + jobs.allow ===> Only execute the named scripts or jobs (all other/non-named + scripts that exist in this directory are ignored). + +The principles of jobs.deny and jobs.allow are the same as those of cron.deny +and cron.allow and are described in detail at: + http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-Automating_System_Tasks.html#s2-autotasks-cron-access + +See: man crontab or above link for more details and see the the weekly/ + directory for an example. + +PLEASE NOTE: The Cron cartridge must be installed in order to run the configured jobs. + +For more information about cron, consult the documentation: +http://openshift.github.io/documentation/oo_cartridge_guide.html#cron +http://openshift.github.io/documentation/oo_user_guide.html#cron diff --git a/sources/extend/addon/matrix/diaspost/diaspost.css b/sources/.openshift/cron/daily/.gitignore old mode 100755 new mode 100644 similarity index 100% rename from sources/extend/addon/matrix/diaspost/diaspost.css rename to sources/.openshift/cron/daily/.gitignore diff --git a/sources/extend/addon/matrix/dwpost/dwpost.css b/sources/.openshift/cron/hourly/.gitignore similarity index 100% rename from sources/extend/addon/matrix/dwpost/dwpost.css rename to sources/.openshift/cron/hourly/.gitignore diff --git a/sources/extend/addon/matrix/extcron/lang/C/messages.po b/sources/.openshift/cron/minutely/.gitignore similarity index 100% rename from sources/extend/addon/matrix/extcron/lang/C/messages.po rename to sources/.openshift/cron/minutely/.gitignore diff --git a/sources/extend/addon/matrix/flattrwidget/style.css b/sources/.openshift/cron/monthly/.gitignore similarity index 100% rename from sources/extend/addon/matrix/flattrwidget/style.css rename to sources/.openshift/cron/monthly/.gitignore diff --git a/sources/.openshift/cron/weekly/README b/sources/.openshift/cron/weekly/README new file mode 100644 index 00000000..7c3e659f --- /dev/null +++ b/sources/.openshift/cron/weekly/README @@ -0,0 +1,16 @@ +Run scripts or jobs on a weekly basis +===================================== +Any scripts or jobs added to this directory will be run on a scheduled basis +(weekly) using run-parts. + +run-parts ignores any files that are hidden or dotfiles (.*) or backup +files (*~ or *,) or named *.{rpmsave,rpmorig,rpmnew,swp,cfsaved} and handles +the files named jobs.deny and jobs.allow specially. + +In this specific example, the chronograph script is the only script or job file +executed on a weekly basis (due to white-listing it in jobs.allow). And the +README and chrono.dat file are ignored either as a result of being black-listed +in jobs.deny or because they are NOT white-listed in the jobs.allow file. + +For more details, please see ../README.cron file. + diff --git a/sources/.openshift/cron/weekly/chrono.dat b/sources/.openshift/cron/weekly/chrono.dat new file mode 100644 index 00000000..fc4abb87 --- /dev/null +++ b/sources/.openshift/cron/weekly/chrono.dat @@ -0,0 +1 @@ +Time And Relative D...n In Execution (Open)Shift! diff --git a/sources/.openshift/cron/weekly/chronograph b/sources/.openshift/cron/weekly/chronograph new file mode 100755 index 00000000..61de949f --- /dev/null +++ b/sources/.openshift/cron/weekly/chronograph @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "`date`: `cat $(dirname \"$0\")/chrono.dat`" diff --git a/sources/.openshift/cron/weekly/jobs.allow b/sources/.openshift/cron/weekly/jobs.allow new file mode 100644 index 00000000..8d32abc7 --- /dev/null +++ b/sources/.openshift/cron/weekly/jobs.allow @@ -0,0 +1,12 @@ +# +# Script or job files listed in here (one entry per line) will be +# executed on a weekly-basis. +# +# Example: The chronograph script will be executed weekly but the README +# and chrono.dat files in this directory will be ignored. +# +# The README file is actually ignored due to the entry in the +# jobs.deny which is checked before jobs.allow (this file). +# +chronograph + diff --git a/sources/.openshift/cron/weekly/jobs.deny b/sources/.openshift/cron/weekly/jobs.deny new file mode 100644 index 00000000..73c94500 --- /dev/null +++ b/sources/.openshift/cron/weekly/jobs.deny @@ -0,0 +1,7 @@ +# +# Any script or job files listed in here (one entry per line) will NOT be +# executed (read as ignored by run-parts). +# + +README + diff --git a/sources/.openshift/markers/README.md b/sources/.openshift/markers/README.md new file mode 100644 index 00000000..8daca526 --- /dev/null +++ b/sources/.openshift/markers/README.md @@ -0,0 +1,4 @@ +For information about markers, consult the documentation: + +http://openshift.github.io/documentation/oo_user_guide.html#markers +http://openshift.github.io/documentation/oo_cartridge_guide.html#php-markers diff --git a/sources/extend/addon/matrix/ijpost/ijpost.css b/sources/.openshift/pear.txt similarity index 100% rename from sources/extend/addon/matrix/ijpost/ijpost.css rename to sources/.openshift/pear.txt diff --git a/sources/README.md b/sources/README.md index ac62f721..bd95cd67 100644 --- a/sources/README.md +++ b/sources/README.md @@ -1,12 +1,12 @@ +![Hubzilla](images/hubzilla-banner.png) -Hubzilla -======== +Hubzilla - Community Server +=========================== -###Websites. Redefined. +Help us redefine the web - using integrated and united community websites. +-------------------------------------------------------------------------- -![Hubzilla](images/ghash-32.png) - **What are Hubs?** Hubs are independent general-purpose websites that not only connect with their associated members and viewers, but also connect together to exchange personal communications and other information with each other. diff --git a/sources/addon/adultphotoflag b/sources/addon/adultphotoflag index 33607d83..024e70fd 120000 --- a/sources/addon/adultphotoflag +++ b/sources/addon/adultphotoflag @@ -1 +1 @@ -../extend/addon/matrix/adultphotoflag \ No newline at end of file +../extend/addon/official/adultphotoflag \ No newline at end of file diff --git a/sources/addon/bbmath b/sources/addon/bbmath index 86ee3399..8e149947 120000 --- a/sources/addon/bbmath +++ b/sources/addon/bbmath @@ -1 +1 @@ -../extend/addon/matrix/bbmath \ No newline at end of file +../extend/addon/official/bbmath \ No newline at end of file diff --git a/sources/addon/bookmarker b/sources/addon/bookmarker index 261dacde..5ded7cf2 120000 --- a/sources/addon/bookmarker +++ b/sources/addon/bookmarker @@ -1 +1 @@ -../extend/addon/matrix/bookmarker \ No newline at end of file +../extend/addon/official/bookmarker \ No newline at end of file diff --git a/sources/addon/buglink b/sources/addon/buglink index 2f80f00f..2d77f27a 120000 --- a/sources/addon/buglink +++ b/sources/addon/buglink @@ -1 +1 @@ -../extend/addon/matrix/buglink \ No newline at end of file +../extend/addon/official/buglink \ No newline at end of file diff --git a/sources/addon/calc b/sources/addon/calc index 9a1a36ec..44461b0f 120000 --- a/sources/addon/calc +++ b/sources/addon/calc @@ -1 +1 @@ -../extend/addon/matrix/calc \ No newline at end of file +../extend/addon/official/calc \ No newline at end of file diff --git a/sources/addon/chords b/sources/addon/chords index c6304590..9b5afa56 120000 --- a/sources/addon/chords +++ b/sources/addon/chords @@ -1 +1 @@ -../extend/addon/matrix/chords \ No newline at end of file +../extend/addon/official/chords \ No newline at end of file diff --git a/sources/addon/custom_home b/sources/addon/custom_home index 8a28b982..bcf608f3 120000 --- a/sources/addon/custom_home +++ b/sources/addon/custom_home @@ -1 +1 @@ -../extend/addon/matrix/custom_home \ No newline at end of file +../extend/addon/official/custom_home \ No newline at end of file diff --git a/sources/addon/diaspora b/sources/addon/diaspora index fa8d50c9..18fe8f4e 120000 --- a/sources/addon/diaspora +++ b/sources/addon/diaspora @@ -1 +1 @@ -../extend/addon/matrix/diaspora \ No newline at end of file +../extend/addon/official/diaspora \ No newline at end of file diff --git a/sources/addon/diaspost b/sources/addon/diaspost index d846a76c..c9ae3e9e 120000 --- a/sources/addon/diaspost +++ b/sources/addon/diaspost @@ -1 +1 @@ -../extend/addon/matrix/diaspost \ No newline at end of file +../extend/addon/official/diaspost \ No newline at end of file diff --git a/sources/addon/dirstats b/sources/addon/dirstats index 06de79c6..2b3a3bd5 120000 --- a/sources/addon/dirstats +++ b/sources/addon/dirstats @@ -1 +1 @@ -../extend/addon/matrix/dirstats \ No newline at end of file +../extend/addon/official/dirstats \ No newline at end of file diff --git a/sources/addon/donate b/sources/addon/donate index 3081929f..2c392ad6 120000 --- a/sources/addon/donate +++ b/sources/addon/donate @@ -1 +1 @@ -../extend/addon/matrix/donate \ No newline at end of file +../extend/addon/official/donate \ No newline at end of file diff --git a/sources/addon/dwpost b/sources/addon/dwpost index b662c5bb..435ef3a1 120000 --- a/sources/addon/dwpost +++ b/sources/addon/dwpost @@ -1 +1 @@ -../extend/addon/matrix/dwpost \ No newline at end of file +../extend/addon/official/dwpost \ No newline at end of file diff --git a/sources/addon/embedly b/sources/addon/embedly index 5963a57e..2bf8e1e6 120000 --- a/sources/addon/embedly +++ b/sources/addon/embedly @@ -1 +1 @@ -../extend/addon/matrix/embedly \ No newline at end of file +../extend/addon/official/embedly \ No newline at end of file diff --git a/sources/addon/extcron b/sources/addon/extcron index 2d02ef89..0e8d5b10 120000 --- a/sources/addon/extcron +++ b/sources/addon/extcron @@ -1 +1 @@ -../extend/addon/matrix/extcron \ No newline at end of file +../extend/addon/official/extcron \ No newline at end of file diff --git a/sources/addon/flattrwidget b/sources/addon/flattrwidget index 8f227dec..fc9233d8 120000 --- a/sources/addon/flattrwidget +++ b/sources/addon/flattrwidget @@ -1 +1 @@ -../extend/addon/matrix/flattrwidget \ No newline at end of file +../extend/addon/official/flattrwidget \ No newline at end of file diff --git a/sources/addon/fortunate b/sources/addon/fortunate index 9a51f156..9b6e449b 120000 --- a/sources/addon/fortunate +++ b/sources/addon/fortunate @@ -1 +1 @@ -../extend/addon/matrix/fortunate \ No newline at end of file +../extend/addon/official/fortunate \ No newline at end of file diff --git a/sources/addon/frphotos b/sources/addon/frphotos index 55d3abd8..a48db497 120000 --- a/sources/addon/frphotos +++ b/sources/addon/frphotos @@ -1 +1 @@ -../extend/addon/matrix/frphotos \ No newline at end of file +../extend/addon/official/frphotos \ No newline at end of file diff --git a/sources/addon/hexit b/sources/addon/hexit index 1c2ccebe..003aeca3 120000 --- a/sources/addon/hexit +++ b/sources/addon/hexit @@ -1 +1 @@ -../extend/addon/matrix/hexit \ No newline at end of file +../extend/addon/official/hexit \ No newline at end of file diff --git a/sources/addon/ijpost b/sources/addon/ijpost index 3ec48761..a2c28c85 120000 --- a/sources/addon/ijpost +++ b/sources/addon/ijpost @@ -1 +1 @@ -../extend/addon/matrix/ijpost \ No newline at end of file +../extend/addon/official/ijpost \ No newline at end of file diff --git a/sources/addon/irc b/sources/addon/irc index 22c5bb8e..96bb702f 120000 --- a/sources/addon/irc +++ b/sources/addon/irc @@ -1 +1 @@ -../extend/addon/matrix/irc \ No newline at end of file +../extend/addon/official/irc \ No newline at end of file diff --git a/sources/addon/jappixmini b/sources/addon/jappixmini index 8c035194..57a425f2 120000 --- a/sources/addon/jappixmini +++ b/sources/addon/jappixmini @@ -1 +1 @@ -../extend/addon/matrix/jappixmini \ No newline at end of file +../extend/addon/official/jappixmini \ No newline at end of file diff --git a/sources/addon/js_upload b/sources/addon/js_upload index 49d474bc..954a68cb 120000 --- a/sources/addon/js_upload +++ b/sources/addon/js_upload @@ -1 +1 @@ -../extend/addon/matrix/js_upload \ No newline at end of file +../extend/addon/official/js_upload \ No newline at end of file diff --git a/sources/addon/ldapauth b/sources/addon/ldapauth index 3ca0d37b..9110cc08 120000 --- a/sources/addon/ldapauth +++ b/sources/addon/ldapauth @@ -1 +1 @@ -../extend/addon/matrix/ldapauth \ No newline at end of file +../extend/addon/official/ldapauth \ No newline at end of file diff --git a/sources/addon/libertree b/sources/addon/libertree index 7b5bbdf2..ad355bb4 120000 --- a/sources/addon/libertree +++ b/sources/addon/libertree @@ -1 +1 @@ -../extend/addon/matrix/libertree \ No newline at end of file +../extend/addon/official/libertree \ No newline at end of file diff --git a/sources/addon/likebanner b/sources/addon/likebanner index 7e971707..bcaf7710 120000 --- a/sources/addon/likebanner +++ b/sources/addon/likebanner @@ -1 +1 @@ -../extend/addon/matrix/likebanner \ No newline at end of file +../extend/addon/official/likebanner \ No newline at end of file diff --git a/sources/addon/ljpost b/sources/addon/ljpost index 55a53bc7..2912d56a 120000 --- a/sources/addon/ljpost +++ b/sources/addon/ljpost @@ -1 +1 @@ -../extend/addon/matrix/ljpost \ No newline at end of file +../extend/addon/official/ljpost \ No newline at end of file diff --git a/sources/addon/mahjongg b/sources/addon/mahjongg index 0d6939f0..aed1a8be 120000 --- a/sources/addon/mahjongg +++ b/sources/addon/mahjongg @@ -1 +1 @@ -../extend/addon/matrix/mahjongg \ No newline at end of file +../extend/addon/official/mahjongg \ No newline at end of file diff --git a/sources/addon/mailhost b/sources/addon/mailhost index fcfe7066..926de865 120000 --- a/sources/addon/mailhost +++ b/sources/addon/mailhost @@ -1 +1 @@ -../extend/addon/matrix/mailhost \ No newline at end of file +../extend/addon/official/mailhost \ No newline at end of file diff --git a/sources/addon/morechoice b/sources/addon/morechoice index b91fbcae..eede88f3 120000 --- a/sources/addon/morechoice +++ b/sources/addon/morechoice @@ -1 +1 @@ -../extend/addon/matrix/morechoice \ No newline at end of file +../extend/addon/official/morechoice \ No newline at end of file diff --git a/sources/addon/moremoods b/sources/addon/moremoods index 565a7690..26462449 120000 --- a/sources/addon/moremoods +++ b/sources/addon/moremoods @@ -1 +1 @@ -../extend/addon/matrix/moremoods \ No newline at end of file +../extend/addon/official/moremoods \ No newline at end of file diff --git a/sources/addon/nofed b/sources/addon/nofed index 587029da..e47fa5f9 120000 --- a/sources/addon/nofed +++ b/sources/addon/nofed @@ -1 +1 @@ -../extend/addon/matrix/nofed \ No newline at end of file +../extend/addon/official/nofed \ No newline at end of file diff --git a/sources/addon/nsabait b/sources/addon/nsabait index 8f56590c..dbc91b1f 120000 --- a/sources/addon/nsabait +++ b/sources/addon/nsabait @@ -1 +1 @@ -../extend/addon/matrix/nsabait \ No newline at end of file +../extend/addon/official/nsabait \ No newline at end of file diff --git a/sources/addon/nsfw b/sources/addon/nsfw index 298fbb78..45f9d6e5 120000 --- a/sources/addon/nsfw +++ b/sources/addon/nsfw @@ -1 +1 @@ -../extend/addon/matrix/nsfw \ No newline at end of file +../extend/addon/official/nsfw \ No newline at end of file diff --git a/sources/addon/openclipatar b/sources/addon/openclipatar index 32884213..1aca7361 120000 --- a/sources/addon/openclipatar +++ b/sources/addon/openclipatar @@ -1 +1 @@ -../extend/addon/matrix/openclipatar \ No newline at end of file +../extend/addon/official/openclipatar \ No newline at end of file diff --git a/sources/addon/openstreetmap b/sources/addon/openstreetmap index db03b9df..502e623f 120000 --- a/sources/addon/openstreetmap +++ b/sources/addon/openstreetmap @@ -1 +1 @@ -../extend/addon/matrix/openstreetmap \ No newline at end of file +../extend/addon/official/openstreetmap \ No newline at end of file diff --git a/sources/addon/piwik b/sources/addon/piwik index 302a0298..1c02b005 120000 --- a/sources/addon/piwik +++ b/sources/addon/piwik @@ -1 +1 @@ -../extend/addon/matrix/piwik \ No newline at end of file +../extend/addon/official/piwik \ No newline at end of file diff --git a/sources/addon/planets b/sources/addon/planets index 40fec349..623f5cf0 120000 --- a/sources/addon/planets +++ b/sources/addon/planets @@ -1 +1 @@ -../extend/addon/matrix/planets \ No newline at end of file +../extend/addon/official/planets \ No newline at end of file diff --git a/sources/addon/pumpio b/sources/addon/pumpio index 0c304c4f..8d2db101 120000 --- a/sources/addon/pumpio +++ b/sources/addon/pumpio @@ -1 +1 @@ -../extend/addon/matrix/pumpio \ No newline at end of file +../extend/addon/official/pumpio \ No newline at end of file diff --git a/sources/addon/qrator b/sources/addon/qrator index 8aa7e9b0..dfc52e0a 120000 --- a/sources/addon/qrator +++ b/sources/addon/qrator @@ -1 +1 @@ -../extend/addon/matrix/qrator \ No newline at end of file +../extend/addon/official/qrator \ No newline at end of file diff --git a/sources/addon/rainbowtag b/sources/addon/rainbowtag index 492850e4..382135e6 120000 --- a/sources/addon/rainbowtag +++ b/sources/addon/rainbowtag @@ -1 +1 @@ -../extend/addon/matrix/rainbowtag \ No newline at end of file +../extend/addon/official/rainbowtag \ No newline at end of file diff --git a/sources/addon/randpost b/sources/addon/randpost index 4cd3e6e8..7d19da3e 120000 --- a/sources/addon/randpost +++ b/sources/addon/randpost @@ -1 +1 @@ -../extend/addon/matrix/randpost \ No newline at end of file +../extend/addon/official/randpost \ No newline at end of file diff --git a/sources/addon/redphotos b/sources/addon/redphotos index 93fa601a..5f4aade9 120000 --- a/sources/addon/redphotos +++ b/sources/addon/redphotos @@ -1 +1 @@ -../extend/addon/matrix/redphotos \ No newline at end of file +../extend/addon/official/redphotos \ No newline at end of file diff --git a/sources/addon/redred b/sources/addon/redred index 3b7076b3..3970fca4 120000 --- a/sources/addon/redred +++ b/sources/addon/redred @@ -1 +1 @@ -../extend/addon/matrix/redred \ No newline at end of file +../extend/addon/official/redred \ No newline at end of file diff --git a/sources/addon/rtof b/sources/addon/rtof index 77eb18b9..1571f258 120000 --- a/sources/addon/rtof +++ b/sources/addon/rtof @@ -1 +1 @@ -../extend/addon/matrix/rtof \ No newline at end of file +../extend/addon/official/rtof \ No newline at end of file diff --git a/sources/addon/sendzid b/sources/addon/sendzid index 0c4087fa..e1b1d238 120000 --- a/sources/addon/sendzid +++ b/sources/addon/sendzid @@ -1 +1 @@ -../extend/addon/matrix/sendzid \ No newline at end of file +../extend/addon/official/sendzid \ No newline at end of file diff --git a/sources/addon/smiley_pack b/sources/addon/smiley_pack index 861a674f..971efecf 120000 --- a/sources/addon/smiley_pack +++ b/sources/addon/smiley_pack @@ -1 +1 @@ -../extend/addon/matrix/smiley_pack \ No newline at end of file +../extend/addon/official/smiley_pack \ No newline at end of file diff --git a/sources/addon/smileybutton b/sources/addon/smileybutton index 59940c4f..51d06824 120000 --- a/sources/addon/smileybutton +++ b/sources/addon/smileybutton @@ -1 +1 @@ -../extend/addon/matrix/smileybutton \ No newline at end of file +../extend/addon/official/smileybutton \ No newline at end of file diff --git a/sources/addon/startpage b/sources/addon/startpage index 63cd7668..be49638d 120000 --- a/sources/addon/startpage +++ b/sources/addon/startpage @@ -1 +1 @@ -../extend/addon/matrix/startpage \ No newline at end of file +../extend/addon/official/startpage \ No newline at end of file diff --git a/sources/addon/statistics_json b/sources/addon/statistics_json index 2f7b9159..cdd6ca3e 120000 --- a/sources/addon/statistics_json +++ b/sources/addon/statistics_json @@ -1 +1 @@ -../extend/addon/matrix/statistics_json \ No newline at end of file +../extend/addon/official/statistics_json \ No newline at end of file diff --git a/sources/addon/statusnet b/sources/addon/statusnet index d0006418..3297a173 120000 --- a/sources/addon/statusnet +++ b/sources/addon/statusnet @@ -1 +1 @@ -../extend/addon/matrix/statusnet \ No newline at end of file +../extend/addon/official/statusnet \ No newline at end of file diff --git a/sources/addon/superblock b/sources/addon/superblock index bf1e746f..f2b1ef07 120000 --- a/sources/addon/superblock +++ b/sources/addon/superblock @@ -1 +1 @@ -../extend/addon/matrix/superblock \ No newline at end of file +../extend/addon/official/superblock \ No newline at end of file diff --git a/sources/addon/tictac b/sources/addon/tictac index a8c9ac94..a65e7d37 120000 --- a/sources/addon/tictac +++ b/sources/addon/tictac @@ -1 +1 @@ -../extend/addon/matrix/tictac \ No newline at end of file +../extend/addon/official/tictac \ No newline at end of file diff --git a/sources/addon/torch b/sources/addon/torch index 575d236e..10bbde90 120000 --- a/sources/addon/torch +++ b/sources/addon/torch @@ -1 +1 @@ -../extend/addon/matrix/torch \ No newline at end of file +../extend/addon/official/torch \ No newline at end of file diff --git a/sources/addon/tour b/sources/addon/tour index 39fef8f0..2e83e52d 120000 --- a/sources/addon/tour +++ b/sources/addon/tour @@ -1 +1 @@ -../extend/addon/matrix/tour \ No newline at end of file +../extend/addon/official/tour \ No newline at end of file diff --git a/sources/addon/twitter b/sources/addon/twitter index 6be8e2dc..6286a41c 120000 --- a/sources/addon/twitter +++ b/sources/addon/twitter @@ -1 +1 @@ -../extend/addon/matrix/twitter \ No newline at end of file +../extend/addon/official/twitter \ No newline at end of file diff --git a/sources/addon/upload_limits b/sources/addon/upload_limits index 4281a12a..ad196540 120000 --- a/sources/addon/upload_limits +++ b/sources/addon/upload_limits @@ -1 +1 @@ -../extend/addon/matrix/upload_limits \ No newline at end of file +../extend/addon/official/upload_limits \ No newline at end of file diff --git a/sources/addon/visage b/sources/addon/visage index 3d5d20ef..9ba0502a 120000 --- a/sources/addon/visage +++ b/sources/addon/visage @@ -1 +1 @@ -../extend/addon/matrix/visage \ No newline at end of file +../extend/addon/official/visage \ No newline at end of file diff --git a/sources/addon/wppost b/sources/addon/wppost index 3ac8fbc0..2f23099f 120000 --- a/sources/addon/wppost +++ b/sources/addon/wppost @@ -1 +1 @@ -../extend/addon/matrix/wppost \ No newline at end of file +../extend/addon/official/wppost \ No newline at end of file diff --git a/sources/app/grid.apd b/sources/app/grid.apd new file mode 100644 index 00000000..bc77aa6f --- /dev/null +++ b/sources/app/grid.apd @@ -0,0 +1,4 @@ +url: $baseurl/network +requires: local_channel +name: Grid +photo: $baseurl/images/hubzilla_logo_6.png diff --git a/sources/app/matrix.apd b/sources/app/matrix.apd deleted file mode 100644 index 68188bfd..00000000 --- a/sources/app/matrix.apd +++ /dev/null @@ -1,4 +0,0 @@ -url: $baseurl/network -requires: local_channel -name: Matrix -photo: $baseurl/app/matrix.png diff --git a/sources/app/matrix.png b/sources/app/matrix.png deleted file mode 100644 index aba2c35d..00000000 Binary files a/sources/app/matrix.png and /dev/null differ diff --git a/sources/boot.php b/sources/boot.php index 458d676d..cdf3c302 100755 --- a/sources/boot.php +++ b/sources/boot.php @@ -43,13 +43,14 @@ require_once('include/taxonomy.php'); require_once('include/identity.php'); require_once('include/Contact.php'); require_once('include/account.php'); +require_once('include/AccessList.php'); define ( 'PLATFORM_NAME', 'hubzilla' ); define ( 'RED_VERSION', trim(file_get_contents('version.inc')) . 'H'); define ( 'ZOT_REVISION', 1 ); -define ( 'DB_UPDATE_VERSION', 1148 ); +define ( 'DB_UPDATE_VERSION', 1158 ); /** * @brief Constant with a HTML line break. @@ -80,9 +81,8 @@ $DIRECTORY_FALLBACK_SERVERS = array( 'https://zothub.com', 'https://zotid.net', 'https://red.zottel.red', - 'https://redmatrix.info', - 'https://my.federated.social', - 'https://redmatrix.nl' + 'https://gravizot.de', + 'https://my.federated.social' ); @@ -333,6 +333,12 @@ define ( 'MENU_ITEM_ZID', 0x0001); define ( 'MENU_ITEM_NEWWIN', 0x0002); define ( 'MENU_ITEM_CHATROOM', 0x0004); + + +define ( 'SITE_TYPE_ZOT', 0); +define ( 'SITE_TYPE_NOTZOT', 1); +define ( 'SITE_TYPE_UNKNOWN', 2); + /** * Poll/Survey types */ @@ -800,7 +806,7 @@ class App { $this->is_mobile = $mobile_detect->isMobile(); $this->is_tablet = $mobile_detect->isTablet(); - $this->head_set_icon('/images/rm-32.png'); + $this->head_set_icon('/images/hz-32.png'); BaseObject::set_app($this); diff --git a/sources/doc/Hubzilla_on_OpenShift.bb b/sources/doc/Hubzilla_on_OpenShift.bb new file mode 100644 index 00000000..f33eee98 --- /dev/null +++ b/sources/doc/Hubzilla_on_OpenShift.bb @@ -0,0 +1,103 @@ +[b]Hubzilla on OpenShift[/b] +You will notice a new .openshift folder when you fetch from upstream, i.e. from [url=https://github.com/redmatrix/hubzilla.git]https://github.com/redmatrix/hubzilla.git[/url] , which contains a deploy script to set up Hubzilla on OpenShift. + +Create an account on OpenShift, then use the registration e-mail and password to create your first Hubzilla instance. Install git and RedHat's command line tools - rhc - if you have not already done so. + +[code]rhc app-create your_app_name php-5.4 mysql-5.5 cron phpmyadmin --namespace your_domain --from-code https://github.com/redmatrix/hubzilla.git -l your@email.address -p your_account_password +[/code] + +Make a note of the database username and password OpenShift creates for your instance, and use these at [url=https://your_app_name-your_domain.rhcloud.com/]https://your_app_name-your_domain.rhcloud.com/[/url] to complete the setup. + +NOTE: PostgreSQL is NOT supported by the deploy script yet, see [zrl=https://zot-mor.rhcloud.com/display/3c7035f2a6febf87057d84ea0ae511223e9b38dc27913177bc0df053edecac7c@zot-mor.rhcloud.com?zid=haakon%40zot-mor.rhcloud.com]this thread[/zrl]. + +[b]Update[/b] +To update, consider your own workflow first. I have forked Hubzilla code into my GitHub account to be able to try things out, this remote repo is called origin. Here is how I fetch new code from upstream, merge into my local repo, then push the updated code both into origin and the remote repo called openshift. + +[code]git fetch upstream;git checkout master;git merge upstream/master;git push origin;git push openshift HEAD +[/code] + +[b]Administration[/b] +Symptoms of need for MySQL database administration are: +[list] +[*] you can visit your domain and see the Hubzilla frontpage, but trying to login throws you back to login. This can mean your session table is marked as crashed. +[*] you can login, but your channel posts are not visible. This can mean your item table is marked as crashed. +[*] you can login and you can see your channel posts, but apparently nobody is getting your posts, comments, likes and so on. This can mean your outq table is marked as crashed. +[/list] + +You can check your OpenShift logs by doing + +[code] +rhc tail -a your_app_name -n your_domain -l your@email.address -p your_account_password +[/code] + +and you might be able to confirm the above suspicions about crashed tables, or other problems you need to fix. + +[b]How to fix crashed tables in MySQL[/b] +Using MySQL and the MyISAM database engine can result in table indexes coming out of sync, and you have at least two options for fixing tables marked as crashed. +[list] +[*] Use the database username and password OpenShift creates for your instance at [url=https://your_app_name-your_domain.rhcloud.com/phpmyadmin/]https://your_app_name-your_domain.rhcloud.com/phpmyadmin/[/url] to login via the web into your phpMyAdmin web interface, click your database in the left column, in the right column scroll down to the bottom of the list of tables and click the checkbox for marking all tables, then select Check tables from the drop down menu. This will check the tables for problems, and you can then checkmark only those tables with problems, and select Repair table from the same drop down menu at the bottom. +[*] You can port-forward the MySQL database service to your own machine and use the MySQL client called mysqlcheck to check, repair and optimize your database or individual database tables without stopping the MySQL service on OpenShift. Run the following in two separate console windows. + +To port-forward do + +[code]rhc port-forward -a your_app_name -n your_domain -l your@email.address -p your_password[/code] + +in one console window, then do either -o for optimize, -c for check or -r for repair, like this + +[code]mysqlcheck -h 127.0.0.1 -r your_app_name -u your_app_admin_name -p[/code] + +and give the app's password at the prompt. If all goes well you should see a number of table names with an OK behind them. + +You can now +[code]Press CTRL-C to terminate port forwarding[/code] +[*] You can do + +[code]rhc cartridge stop mysql-5.5 -a your_app_name[/code] + +to stop the MySQL service running in your app on OpenShift before running myisamchk - which should only be run when MySQL is stopped, and then +login to your instance with SSH - see OpenShift for details - and do + +[code]cd mysql/data/your_database +myisamchk -r *.MYI[/code] + +or if you get + +[code]Can't create new tempfile[/code] + +check your OpenShift's gear quota with + +[code]quota -gus[/code] + +and if you are short on space, then locally (not SSH) do + +[code]rhc app-tidy your_app_name -l your_login -p your_password[/code] + +to have rhc delete temporary files and OpenShift logs to free space first, then check the size of your local repo dir and execute + +[code]git gc[/code] + +against it and check the size again, and then to minimize your remote repo connect via SSH to your application gear and execute the same command against it by changing to the remote repo directory - your repo should be in + +[code]~/git/your_app_name.git[/code] + +(if not, do find -size +1M to find it), then do + +[code] +cd +cd mysql/data/yourdatabase +myisamchk -r -v -f*.MYI[/code] + +and hopefully your database tables are now okay. +You can now start the MySQL service on OpenShift by locally doing + +[code]rhc cartridge start mysql-5.5 -a your_app_name[/code] +[/list] + +[b]Notes[/b] +[list] +[*] definitely DO turn off feeds and discovery by default and limit delivery reports from 30 days to 3 days if you are on the Free or Bronze plan on OpenShift with a single 1Gb gear by visiting [observer.baseurl]/admin/site when logged in as administrator of your Hubzilla site. +[*] The above defaults have been added into the deploy script. +[*] DO add git gc to the deploy script +[*] MAYBE DO add myisamchk - only checking? to the end of the deploy script. +[*] mysqlcheck is similar in function to myisamchk, but works differently. The main operational difference is that mysqlcheck must be used when the mysqld server is running, whereas myisamchk should be used when it is not. The benefit of using mysqlcheck is that you do not have to stop the server to perform table maintenance - this means this documenation should be fixed. +[/list] diff --git a/sources/doc/Privacy.md b/sources/doc/Privacy.md index fd6df631..ff5eac18 100644 --- a/sources/doc/Privacy.md +++ b/sources/doc/Privacy.md @@ -1,25 +1,28 @@ -#Privacy Policy +Privacy Policy +============== + + +##Summary## -##Summary Q: Who can see my content? -A: By default ANYBODY on the internet, UNLESS you restrict it. The $Projectname allows you to choose the privacy level you desire. Restricted content will NOT be visible to spy networks and their advertisers. It will be protected against eavesdropping by outsiders - to the best of our ability. Hub administrators with sufficient skills and patience MAY be able to eavesdrop on some private communications but they must expend effort to do so. Privacy modes exist within the $Projectname which are even resistant to eavesdropping by skilled and determined hub administrators. +A: By default ANYBODY on the internet, UNLESS you restrict it. $Projectname allows you to choose the privacy level you desire. Restricted content will NOT be visible to "spy networks" and advertisers. It will be protected against eavesdropping by outsiders - to the best of our ability. Hub administrators with sufficient skills and patience MAY be able to eavesdrop on some private communications but they must expend effort to do so. Privacy modes exist within $Projectname which are even resistant to eavesdropping by skilled and determined hub administrators. Q: Can my content be censored? -A: The $Projectname (the network) CANNOT censor your content. Server and hub administrators are subject to local laws and MAY remove objectionable content from their site/hub. Anybody MAY become a hub administrator, including you; and therefore publish content which might otherwise be censored. You still MAY be subject to local laws. +A: $Projectname (the network) CANNOT censor your content. Server and hub administrators are subject to local laws and MAY remove objectionable content from their site/hub. Anybody MAY become a hub administrator, including you; and therefore publish content which might otherwise be censored. You still MAY be subject to local laws. ##Definitions **$Projectname** -Otherwise referred to as "the network", the $Projectname is a collection of individual computers/servers (aka **hubs**) which connect together to form a larger cooperative network. +Otherwise referred to as "the network", $Projectname is a collection of individual computers/servers (aka **hubs**) which connect together to form a larger cooperative network. **hub** -An individual computer or server connected to the $Projectname. These are provided by a **hub administrator** and may be public or private, paid or free. +An individual computer or server connected to $Projectname. These are provided by a **hub administrator** and may be public or private, paid or free. **hub administrator** @@ -29,7 +32,7 @@ The system operator of an individual hub. **Public Information** -Any information or anything posted by you within the $Projectname MAY be public or visible to anybody on the internet. To the extent possible, the $Projectname allows you to protect content and restrict who can view it. +Any information or anything posted by you within $Projectname MAY be public or visible to anybody on the internet. To the extent possible, $Projectname allows you to protect content and restrict who can view it. Your profile photo, your channel name, and the location (URL or network address) of your channel are visible to anybody on the internet and privacy controls will not affect the display of these items. @@ -37,7 +40,7 @@ You MAY additionally provide other profile information. Any information which yo **Content** -Content you provide (status posts, photos, files, etc.) belongs to you. The $Projectname default is to publish content openly and visible to anybody on the internet (PUBLIC). You MAY control this in your channel settings and restrict the default permissions or you MAY restrict the visibility of any single published item separately (PRIVATE). The $Projectname developers will ensure that restricted content is ONLY visible to those in the restriction list - to the best of their ability. +Content you provide (status posts, photos, files, etc.) belongs to you. The $Projectname default is to publish content openly and visible to anybody on the internet (PUBLIC). You MAY control this in your channel settings and restrict the default permissions or you MAY restrict the visibility of any single published item separately (PRIVATE). $Projectname developers will ensure that restricted content is ONLY visible to those in the restriction list - to the best of their ability. Content (especially status posts) that you share with other networks or that you have made visible to anybody on the internet (PUBLIC) cannot easily be taken back once it has been published. It MAY be shared with other networks and made available through RSS/Atom feeds. It may also be syndicated on other $Projectname sites. It MAY appear on spy networks and internet searches. If you do not wish this default behaviour please adjust your channel settings and restrict who can see your content. @@ -48,25 +51,27 @@ Comments to posts that were created by others and posts which are designated as **Private Information** -$Projectname developers will ensure that any content you provide which is designated as PRIVATE will be protected against eavesdropping - to the best of their ability. Private content is generally hidden or obscured even from hub administrators. It is also stripped from email notifications. It is difficult but NOT impossible for this content to be seen by a hub administrator. This is a side effect of the physical laws of the universe. Unfortunately, if a database needs to decrypt a post at display time, it must have the means to decrypt the post! End to end encryption is also provided and this CANNOT be seen, even by a determined administrator. +$Projectname developers will ensure that any content you provide which is designated as PRIVATE will be protected against eavesdropping - to the best of their ability. Private content is generally hidden or obscured even from hub administrators. It is also stripped from email notifications. It is difficult but NOT impossible for this content to be seen by a hub administrator. End to end encryption is provided as an optional feature and this CANNOT be seen, even by a determined administrator. ##Identity Privacy -Privacy for your identity is another aspect. Because you have a decentralized identity in the $Projectname, your privacy extends beyond your home hub. If you want to have complete control of your privacy and security you should run your own hub on a dedicated server. For many people, this is complicated and may stretch their technical abilities. So let's list a few precautions you can make to assure your privacy as much as possible. +Privacy for your identity is another aspect. Because you have a decentralized identity in $Projectname, your privacy extends beyond your home hub. If you want to have complete control of your privacy and security you should run your own hub on a dedicated server. For many people, this is complicated and may stretch their technical abilities. So let's list a few precautions you can make to assure your privacy as much as possible. A decentralized identity has a lot of advantages and gives you al lot of interesting features, but you should be aware of the fact that your identity is known by other hubs in the $Projectname network. One of those advantages is that other channels can serve you customized content and allow you to see private things (such as private photos which others wish to share with you). Because of this those channels need to know who you are. But we understand that sometimes those other channels know more from you than you might desire. For instance the plug-in Visage that can tell a channel owner the last time you visit their profile. You can easily OPT-OUT of this low level and we think, harmless tracking. -* You can enable [Do Not Track (DNT)](http://donottrack.us/) in your web browser. We respect this new privacy policy proposal. All modern browsers support DNT. You will find it in the privacy settings of your browsers or else you can consult the web browser's manual. This will not affect the functionality of the $Projectname. This setting is probably enough for most people. +* You can enable [Do Not Track (DNT)](http://donottrack.us/) in your web browser. We respect this new privacy policy proposal. All modern browsers support DNT. You will find it in the privacy settings of your browsers or else you can consult the web browser's manual. This will not affect the functionality of $Projectname. This setting is probably enough for most people. + *You can [disable publication](settings) of your channel in our channel directory. If you want people to find your channel, you should give your channel address directly to them. We think this is a good indication that you prefer extra privacy and automatically enable "Do Not Track" if this is the case. + * You can have a blocked hub. That means that all channels and content on that hub is not public, and not visible to the outside world. This is something only your hub administrator can do. We also respect this and automatically enable "Do Not Track" if it is set. ###Censorship -The $Projectname is a global network which is inclusive of all religions and cultures. This does not imply that every member of the network feels the same way you do on contentious issues, and some people may be STRONGLY opposed to the content you post. In general, if you wish to post something that you know may nor be universally acceptable, the best approach is to restrict the audience using privacy controls to a small circle of friends. +$Projectname is a global network which is inclusive of all religions and cultures. This does not imply that every member of the network feels the same way you do on contentious issues, and some people may be STRONGLY opposed to the content you post. In general, if you wish to post something that you know may nor be universally acceptable, the best approach is to restrict the audience using privacy controls to a small circle of friends. -The $Projectname as a network provider is unable to censor content. However, hub administrators MAY censor any content which appears on their hub to comply with local laws or even personal judgement. Their decision is final. If you have issues with any hub administrator, you may move your account and postings to another site which is more in line with your expectations. Please check (periodically) the [Terms of Service](help/TermsOfService) of your hub to learn about any rules or guidelines. If your content consists of material which is illegal or may cause issues, you are STRONGLY encouraged to host your own (become a hub administrator). You may still find that your content is blocked on some hubs, but the $Projectname as a network cannot block it from being posted. +$Projectname as a network provider is unable to censor content. However, hub administrators MAY censor any content which appears on their hub to comply with local laws or even personal judgement. Their decision is final. If you have issues with any hub administrator, you may move your account and postings to another site which is more in line with your expectations. Please check (periodically) the [Terms of Service](help/TermsOfService) of your hub to learn about any rules or guidelines. If your content consists of material which is illegal or may cause issues, you are STRONGLY encouraged to host your own (become a hub administrator). You may still find that your content is blocked on some hubs, but $Projectname as a network cannot block it from being posted. -The $Projectname RECOMMENDS that hub administrators provide a grace period of 1-2 days between warning an account holder of content that needs to be removed and physically removing or disabling the account. This will give the content owner an opportunity to export their channel meta-data and import it to another site. In rare cases the content may be of such a nature to justify the immediate termination of the account. This is a hub decision, not a $Projectname decision. +$Projectname RECOMMENDS that hub administrators provide a grace period of 1-2 days between warning an account holder of content that needs to be removed and physically removing or disabling the account. This will give the content owner an opportunity to export their channel meta-data and import it to another site. In rare cases the content may be of such a nature to justify the immediate termination of the account. This is a hub decision, not a $Projectname decision. If you typically and regularly post content of an adult or offensive nature, you are STRONGLY encouraged to mark your account "NSFW" (Not Safe For Work). This will prevent the display of your profile photo in the directory except to viewers that have chosen to disable "safe mode". If your profile photo is found by directory administrators to be adult or offensive, the directory administrator MAY flag your profile photo as NSFW. There is currently no official mechanism to contest or reverse this decision, which is why you SHOULD mark your own account NSFW if it is likely to be inappropriate for general audiences. diff --git a/sources/doc/README.md b/sources/doc/README.md index 90585a90..10fba445 100644 --- a/sources/doc/README.md +++ b/sources/doc/README.md @@ -5,7 +5,7 @@ Hubzilla ###Websites. Redefined. -![Hubzilla](images/ghash-32.png) +![Hubzilla](../images/hz-32.png) **What are Hubs?** @@ -39,4 +39,4 @@ Possible website applications include -This project is under development and is not yet available for general use. \ No newline at end of file +This project is under development and is not yet available for general use. diff --git a/sources/doc/Widgets.md b/sources/doc/Widgets.md index 5cc7eab2..7acd9241 100644 --- a/sources/doc/Widgets.md +++ b/sources/doc/Widgets.md @@ -88,7 +88,7 @@ Some/many of these widgets have restrictions which may restrict the type of page * photo_rand - display a random photo from one of your photo albums. Photo permissions are honoured * args: * album - album name (very strongly recommended if you have lots of photos) - * scale - typically 0 (original size), 1 (640px), or 2 (320px) + * scale - typically 0 (original size), 1 (1024px), 2, (640px), or 3 (320px) * style - CSS style string * channel_id - if not your own
 
@@ -104,6 +104,9 @@ Some/many of these widgets have restrictions which may restrict the type of page * all - display completed tasks if all is non-zero.
 
+* forums - provide a list of connected public forums with unseen counts for the current logged-in channel. +
 
+ Creating New Widgets ==================== diff --git a/sources/doc/about.bb b/sources/doc/about.bb index 508795ae..1d1a2d09 100644 --- a/sources/doc/about.bb +++ b/sources/doc/about.bb @@ -1,8 +1,8 @@ [b]About[/b] -The $Projectname is a decentralized communication network, which aims to provide communication that is censorship-resistant, privacy-respecting, and thus free from the oppressive claws of contemporary corporate communication giants. These giants function primarily as spy networks for paying clients of all sorts and types, in addition to monopolizing and centralizing the Internet; a feature that was not part of the original and revolutionary goals that produced the World Wide Web. +$Projectname is a decentralized communication network, which aims to provide communication that is censorship-resistant, privacy-respecting, and thus free from the oppressive claws of contemporary corporate communication giants. These giants function primarily as spy networks for paying clients of all sorts and types, in addition to monopolizing and centralizing the Internet; a feature that was not part of the original and revolutionary goals that produced the World Wide Web. -The $Projectname is free and open source. It is designed to scale from a $35 Raspberry Pi, to top of the line AMD and Intel Xeon-powered multi-core enterprise servers. It can be used to support communication between a few individuals, or scale to many thousands and more. +$Projectname is free and open source. It is designed to scale from a $35 Raspberry Pi, to top of the line AMD and Intel Xeon-powered multi-core enterprise servers. It can be used to support communication between a few individuals, or scale to many thousands and more. Red aims to be skill and resource agnostic. It is easy to use by everyday computer users, as well as by systems administrators and developers. @@ -10,15 +10,15 @@ How you use it depends on how you want to use it. It is written in the PHP scripting language, thus making it trivial to install on any hosting platform in use today. This includes self-hosting at home, at hosting providers such as [url=http://mediatemple.com/]Media Temple[/url] and [url=http://www.dreamhost.com/]Dreamhost[/url], or on virtual and dedicated servers, offered by the likes of [url=https://www.linode.com]Linode[/url], [url=http://greenqloud.com]GreenQloud[/url] or [url=https://aws.amazon.com]Amazon AWS[/url]. -In other words, the $Projectname can run on any computing platform that comes with a web server, a MySQL-compatible database, and the PHP scripting language. +In other words, $Projectname can run on any computing platform that comes with a web server, a MySQL-compatible database, and the PHP scripting language. -Along the way, Red offers a number of unique goodies: +Along the way, $Projectname offers a number of unique goodies: -[b]Single-click user identification:[/b] meaning you can access sites on the $Projectname simply by clicking on links to remote sites. Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online. +[b]Single-click user identification:[/b] meaning you can access sites on $Projectname simply by clicking on links to remote sites. Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online. -[b]Cloning:[/b] of online identities. Your online presence no longer has to be tied to a single server, domain name or IP address. You can clone and import your identity (or channel as we call it) to another server (or, a hub as servers are known in the $Projectname). Now, should your primary hub go down, no worries, your contacts, posts[i]*[/i], and messages[i]*[/i] will automagically continue to be available and accessible under your cloned channel. [i](*: only posts and messages as from the moment you cloned your channel)[/i] +[b]Cloning:[/b] of online identities. Your online presence no longer has to be tied to a single server, domain name or IP address. You can clone and import your identity (or channel as we call it) to another server (or, a hub as servers are known in $Projectname). Now, should your primary hub go down, no worries, your contacts, posts[i]*[/i], and messages[i]*[/i] will automagically continue to be available and accessible under your cloned channel. [i](*: only posts and messages as from the moment you cloned your channel)[/i] -[b]Privacy:[/b] Red identities (Zot IDs) can be deleted, backed up/downloaded, and cloned. The user is in full control of their data. Should you decide to delete all your content and erase your Zot ID, all you have to do is click on a link and it's immediately deleted from the hub. No questions, no fuss. +[b]Privacy:[/b] $Projectname identities (Zot IDs) can be deleted, backed up/downloaded, and cloned. The user is in full control of their data. Should you decide to delete all your content and erase your Zot ID, all you have to do is click on a link and it's immediately deleted from the hub. No questions, no fuss. #include doc/macros/main_footer.bb; diff --git a/sources/doc/admins.bb b/sources/doc/admins.bb new file mode 100644 index 00000000..c77b004a --- /dev/null +++ b/sources/doc/admins.bb @@ -0,0 +1,14 @@ +[h2]Documentation for Hub Administrators[/h2] + +[h3]Administrators[/h3] + +[zrl=[baseurl]/help/install]Install[/zrl] +[zrl=[baseurl]/help/red2pi]Installing $Projectname on the Raspberry Pi[/zrl] +[zrl=[baseurl]/help/Hubzilla_on_OpenShift]$Projectname on OpenShift[/zrl] +[zrl=[baseurl]/help/troubleshooting]Troubleshooting Tips[/zrl] +[zrl=[baseurl]/help/hidden_configs]Tweaking $Projectname's Hidden Configurations[/zrl] +[zrl=[baseurl]/help/faq_admins]FAQ For Admins[/zrl] +[zrl=[baseurl]/help/service_classes]Service Classes[/zrl] +[zrl=[baseurl]/help/theme_management]Theme Management[/zrl] + + diff --git a/sources/doc/api_posting.bb b/sources/doc/api_posting.bb index fa955826..c708ad14 100644 --- a/sources/doc/api_posting.bb +++ b/sources/doc/api_posting.bb @@ -4,19 +4,20 @@ The API allows you to post to the red# by HTTP POST request. Below you see an ex [code]curl -ssl -u [color=blue]$E-Mail[/color]:[color=blue]$Password[/color] -d "[color=blue]$Parameters[/color]" [url][observer=1][observer.baseurl][/observer][observer=0]example.com[/observer]/api/statuses/update [/url][/code] -[table][tr][td]$E-Mail:[/td][td]The E-Mail Adress you use to login[/td][/tr] +[table][tr][td]$E-Mail:[/td][td]The E-Mail Address you use to login, or the channel nickname (without the hostname)[/td][/tr] [tr][td]$Password:[/td][td]The Password you use to login[/td][/tr] [tr][td]$Parameters:[/td][td]That's the interesting part, here you insert the content you want to send using the following parameters:[/td][/tr][/table] [ul] [*]title: the title of the posting -[*]channel: the channel you want to post to +[*]channel: the channel you want to post to (do not use this parameter with HTTP Basic auth) [*]category: a comma-seperated list of categories for the posting [*]status: the content of the posting, formatted with BBCode OR [*]htmlstatus:the content of the posting, formatted in HTML. [/ul] +To post to a specific channel, replace the email address with the channel nickname. If you supply the channel parameter, it has to match the "email", but is superfluous anyway. Instead of calling [observer=1][observer.baseurl][/observer][observer=0]example.com[/observer]/api/statuses/update which returns a json (you could also add .json on the end to clarify) output, you can use [observer.baseurl]/api/statuses/update.xml to get an xml formatted return. diff --git a/sources/doc/bugs.bb b/sources/doc/bugs.bb new file mode 100644 index 00000000..1a27e66b --- /dev/null +++ b/sources/doc/bugs.bb @@ -0,0 +1,45 @@ +[h2]Bugs, Issues, and things that go bump in the night...[/h2] +[h3]Something went wrong! Who is charge of fixing it?[/h3] + +[b]Hubzilla Community Server[/b] + +Hubzilla Community Server is open source software which is maintained by "the community" - essentially unpaid volunteers. + +[b]Hubzilla Enterprise Server[/b] + +Hubzilla Enterprise Server is commercial software with a variety of support plans depending on the specific license terms. + + +The first thing you need to do is talk to your hub administrator - the person who runs and manages your site. They are in the unique position of having access to the internal software and database and [b]logfiles[/b] and will need to be involved in fixing your problem. Other people "on the net" can't really help with this. The first thing the hub administrator needs to do is look at their logs and/or try to reproduce the problem. So try to be as helpful and courteous as possible in helping them look into the problem. + +To find your hub administrator (if you don't know who they are) please look at [url=[baseurl]/siteinfo]this page[/url]. If they have not provided any contact info on that page or provided an "Impressum" there, see [url=[baseurl]/siteinfo/json]this site info summary[/url] under the heading "admin:". + +[h3]I'm a hub administrator; what do I do?[/h3] + +The software instructions which provide this server are open source and are available for your inspection. If an error message was reported, often one can do a search on the source files for that error message and find out what triggered it. With this information and the site logfiles it may be possible to figure out the sequence of events leading to the error. There could also be other sites involved, and the problem may not even be on your site but elsewhere in the network. Try to pin down the communication endpoints (hubs or sites) involved in the problem and contact the administrator of that site or those sites. Please try and provide an event time of when things went wrong so it can be found in the logs. Work with the other administrator(s) to try and find the cause of the problem. Logfiles are your friend. When something happens in the software that we didn't expect, it is nearly always logged. + +[h3]The white screen of death[/h3] + +If you get a blank white screen when doing something, this is almost always a code or syntax error. There are instructions in your .htconfig.php file for enabling syntax logging. We recommend all sites use this. With syntax logging enabled repeat the sequence which led to the error and it should log the offending line of code. Hopefully you will be able to fix the problem with this information. When you do, please submit the fix "upstream" so that we can share the fix with the rest of the project members and other communities. This is a key benefit of using open source software - we share with each other and everybody benefits. + +[h3]I'm stumped. I can't figure out what is wrong.[/h3] + +[b]Hubzilla Enterprise Server[/b] + +Please make contact with the vendor - who will have provided you with support contact details. Preferably this contact will be made by the hub administrator so that he/she can assist us in collecting the necessary issue details. We will assign a ticket and notify you of progress. + + +[b]Hubzilla Community Server[/b] + +At this point it might be worthwhile discussing the issue on one of the online forums. There may be several of these and some may be more suited to your spoken language. As a last resort, try "Channel One", which is in English. + +If the community developers can't help you right away, understand that they are volunteers and may have a lot of other work and demands on their time. At this point you need to file a bug report. You will need an account on github.com to do this. So register, and then visit https://github.com/redmatrix/hubzilla/issues +. Create an issue here and provide all the same information that you provided online. Don't leave out anything. + +Then you wait. If it's a high profile issue, it may get fixed quickly. But nobody is in charge of fixing bugs. If it lingers without resolution, please spend some more time investigating the problem. Ask about anything you don't understand related to the behaviour. You will learn more about how the software works and quite possibly figure out why it isn't working now. Ultimately it is somebody in the community who is going to fix this and you are a member of the community; and this is how the open source process works. + + +[b]In either case[/b] + +Other developers working to fix the problem may need to find out more, so do your homework and document what is happening and everything you've tried. Don't say "I did xyz and it didn't work." That doesn't tell us anything. Tell us precisely what steps you took and what you expected the result to be, and precisely what happened as a result. If there were any error messages, don't say "there was an error message". Tell us exactly what the message said. + \ No newline at end of file diff --git a/sources/doc/credits.bb b/sources/doc/credits.bb index 5459c7d7..200f1fc8 100644 --- a/sources/doc/credits.bb +++ b/sources/doc/credits.bb @@ -1,5 +1,9 @@ [b]Credits[/b] +Thanks to all who have helped and contributed to the project and its predecessors over the years. It is possible we missed in your name but this is unintentional. We also thank the community and its members for providing valuable input and without whom this entire effort would be meaningless. + +It is also worth acknowledging the contributions and solutions to problems which arose from discussions amongst members and developers of other somewhat related and competing projects; even if we have had our occasional disagreements. + Mike Macgirvin Fabio Comuni Simon L'nu @@ -62,6 +66,7 @@ tonnerkiller Antoine G Christian Drechsler Ludovic Grossard +RedmatrixCanada Stanislav Lechev [0xAF] aweiher bufalo1973 @@ -73,3 +78,5 @@ mycocham ndurchx pafcu Simó Albert i Beltran +Manuel Reva +Manuel Jiménez Friaza diff --git a/sources/doc/dav_dolphin.bb b/sources/doc/dav_dolphin.bb index a1ebba39..ae60a6d5 100644 --- a/sources/doc/dav_dolphin.bb +++ b/sources/doc/dav_dolphin.bb @@ -1,8 +1,8 @@ [b]Using The Cloud - Dolphin[/b] -Visit webdavs://example.com/cloud where "example.com" is the URL of your hub. +Visit webdavs://example.com/dav where "example.com" is the URL of your hub. -When prompted for a username and password, enter your username (the first part of your webbie - no @ or domain name) and password for your normal account. +When prompted for a username and password, enter your channel name (the first part of your webbie - no @ or domain name) and password for your normal account. Note, if you are already logged in to the web interface via Konqueror, you will not be prompted for further authentication. diff --git a/sources/doc/dav_mount.bb b/sources/doc/dav_mount.bb index d8cb2e08..0fd3d469 100644 --- a/sources/doc/dav_mount.bb +++ b/sources/doc/dav_mount.bb @@ -25,14 +25,14 @@ Edit /etc/fstab to include your cloud directory by adding [code] -[baseurl]/cloud/ /mount/point davfs user,noauto,uid=<DesktopUser>,file_mode=600,dir_mode=700 0 1 +[baseurl]/dav/ /mount/point davfs user,noauto,uid=<DesktopUser>,file_mode=600,dir_mode=700 0 1 [/code] Where [baseurl] is the URL of your hub, /mount/point is the location you want to mount the cloud, and <DesktopUser> is the user you log in to one your computer. Note that if you are mounting as a normal user (not root) the mount point must be in your home directory. For example, if I wanted to mount my cloud to a directory called 'cloud' in my home directory, and my username was bob, my fstab would be -[code][baseurl]/cloud/ /home/bob/cloud davfs user,noauto,uid=bob,file_mode=600,dir_mode=700 0 1[/code] +[code][baseurl]/dav/ /home/bob/cloud davfs user,noauto,uid=bob,file_mode=600,dir_mode=700 0 1[/code] Now, create the mount point. @@ -49,7 +49,7 @@ Create a file called 'secrets' and add your cloud login credentials [code] -[baseurl]/cloud <username> <password> +[baseurl]/dav <username> <password> [/code] Where <username> and <password> are the username and password [i]for your hub[/i]. @@ -60,7 +60,7 @@ Don't let this file be writeable by anyone who doesn't need it with Finally, mount the drive. -[code]mount [baseurl]/cloud[/code] +[code]mount [baseurl]/dav[/code] You can now find your cloud at /home/bob/cloud and use it as though it were part of your local filesystem - even if the applications you are using have no dav support themselves. diff --git a/sources/doc/dav_nautilus.bb b/sources/doc/dav_nautilus.bb index 51663b6d..c8911cda 100644 --- a/sources/doc/dav_nautilus.bb +++ b/sources/doc/dav_nautilus.bb @@ -2,8 +2,8 @@ 1. Open a File browsing window (that's Nautilus) 2. Select File > Connect to server from the menu -3. Type davs://<domain_name>/cloud/<your_username> and click Connect -4. You will be prompted for your username (same as above) and password +3. Type davs://<domain_name>/dav/<your_channelname> and click Connect +4. You will be prompted for your channel name (same as above) and password 5. Your personal DAV directory will be shown in the window #include doc/macros/cloud_footer.bb; diff --git a/sources/doc/dav_nemo.bb b/sources/doc/dav_nemo.bb index 2c88b078..f2d994fb 100644 --- a/sources/doc/dav_nemo.bb +++ b/sources/doc/dav_nemo.bb @@ -3,16 +3,16 @@ For (file browser) Nemo 1.8.2 under Linux Mint 15, Cinnamon 1.8.8. Nemo ist the standard file browser there. 1st way -type "davs://yourusername@friendicared.net/cloud" in the address bar +type "davs://<domain_name>/dav/<your_channelname>" in the address bar. 2nd way Menu > file > connect to server Fill the dialog -- Server: friendicared.net +- Server: hubzilla_domain_name - Type: Secure WebDAV (https) -- Folder: /cloud -- Username: yourusername -- Passwort: yourpasswort +- Folder: /dav +- Username: yourchannelname +- Password: yourpassword Once open you can set a bookmark. diff --git a/sources/doc/dav_windows.bb b/sources/doc/dav_windows.bb index 0eaffd4d..96862e2b 100644 --- a/sources/doc/dav_windows.bb +++ b/sources/doc/dav_windows.bb @@ -4,8 +4,8 @@ RedDav using Windows 7 graphical user interface wizard: 1. Left-click the Start-button to open the start menu. 2. Right-click the My computer icon to access its menu. 3. Left-click Map network drive... to open the connection dialog wizard. -4. Type #^[url=https://example.net/cloud/your_user_name]https://example.net/cloud/your_user_name[/url] in the textbox and click the Complete button where "example.net" is the URL of your hub. -5. Type your Red account's user name. IMPORTANT - NO at-sign or domain name. -6. Type your Red password +4. Type #^[url=https://example.net/dav/your_channel_name]https://example.net/dav/your_channel_name[/url] in the textbox and click the Complete button where "example.net" is the URL of your hub. +5. Type your Hubzilla account's user name. IMPORTANT - NO at-sign or domain name. +6. Type your Hubzilla password #include doc/macros/cloud_footer.bb; diff --git a/sources/doc/develop.bb b/sources/doc/develop.bb new file mode 100644 index 00000000..c46447cc --- /dev/null +++ b/sources/doc/develop.bb @@ -0,0 +1,34 @@ +[h2]Documentation for Developers[/h2] + +[h3]Technical Documentation[/h3] +[zrl=[baseurl]/help/Zot---A-High-Level-Overview]A high level overview of Zot[/zrl] +[zrl=[baseurl]/help/zot]An introduction to Zot[/zrl] +[zrl=[baseurl]/help/zot_structures]Zot Stuctures[/zrl] +[zrl=[baseurl]/help/comanche]Comanche Page Descriptions[/zrl] +[zrl=[baseurl]/help/Creating-Templates]Creating Comanche Templates[/zrl] +[zrl=[baseurl]/help/Widgets]Widgets[/zrl] +[zrl=[baseurl]/help/plugins]Plugins[/zrl] +[zrl=[baseurl]/help/doco]Contributing Documentation[/zrl] +[zrl=[baseurl]/help/DerivedTheme1]Creating Derivative Themes[/zrl] +[zrl=[baseurl]/help/schema_development]Schemas[/zrl] +[zrl=[baseurl]/help/Translations]Translations[/zrl] +[zrl=[baseurl]/help/developers]Developers[/zrl] +[zrl=[baseurl]/help/intro_for_developers]Intro for Developers[/zrl] +[zrl=[baseurl]/help/database]Database schema documantation[/zrl] +[zrl=[baseurl]/help/api_functions]API functions[/zrl] +[zrl=[baseurl]/help/api_posting]Posting to the red# using the API[/zrl] +[zrl=[baseurl]/help/developer_function_primer]Red Functions 101[/zrl] +[zrl=[baseurl]/doc/html/]Code Reference (Doxygen generated - sets cookies)[/zrl] +[zrl=[baseurl]/help/to_do_doco]To-Do list for the Red Documentation Project[/zrl] +[zrl=[baseurl]/help/to_do_code]To-Do list for Developers[/zrl] +[zrl=[baseurl]/help/roadmap]Version 3 roadmap[/zrl] +[zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl] +[zrl=[baseurl]/help/dev_beginner]Step-for-step manual for beginning developers[/zrl] + +[h3]Frequently Asked Questions For Developers[/h3] +[zrl=[baseurl]/help/faq_developers]FAQ For Developers[/zrl] + +[h3]External Resources[/h3] + +[url=https://zothub.com/channel/one]Development Channel[/url] +[url=https://federated.social/channel/postgres]Postgres-specific $Projectname Admin Support Channel[/url] diff --git a/sources/doc/features.bb b/sources/doc/features.bb index 0a9bcee3..06b7fb6b 100644 --- a/sources/doc/features.bb +++ b/sources/doc/features.bb @@ -8,14 +8,14 @@ $Projectname provides distributed web publishing and social communications with So what exactly are "decentralised permissions"? They give me the ability to share something on my website (photos, media, files, webpages, etc.) with specific people on completely different websites - but not necessarily [i]everybody[/i] on those websites; and they do not need a password on my website and do not need to login to my website to view the things I've shared with them. They have one password on their own website and "magic authentication" between affiliated websites in the network. Also, as it is decentralised, there is no third party which has the ability to bypass permissions and see everything in the network. -$Projectname combines many features of traditional blogs, social networking and media, content management systems, and personal cloud storage into an easy to use framework. Each node in the matrix can operate standalone or link with other nodes to create a super-network; leaving privacy under the control of the original publisher. +$Projectname combines many features of traditional blogs, social networking and media, content management systems, and personal cloud storage into an easy to use framework. Each node in the grid can operate standalone or link with other nodes to create a super-network; leaving privacy under the control of the original publisher. $Projectname is an open source webserver application written originally in PHP/MySQL and is easily installable by those with basic website administration skills. It is also easily extended via plugins and themes and other third-party tools. [b][size=24]$Projectname Features[/size][/b] -The $Projectname is a general-purpose web publishing and communication network, with several unique features. It is designed to be used by the widest range of people on the web, from non-technical bloggers, to expert PHP programmers and seasoned systems administrators. +$Projectname is a general-purpose web publishing and communication network, with several unique features. It is designed to be used by the widest range of people on the web, from non-technical bloggers, to expert PHP programmers and seasoned systems administrators. This page lists some of the core features of $Projectname that are bundled with the official release. As with most free and open source software, there may be many other extensions, additions, plugins, themes and configurations that are limited only by the needs and imagination of the members. @@ -29,10 +29,14 @@ When adding connnections in $Projectname, members have the option of assigning " On the other hand, when adding a friend's channel, they could be placed under the affinity level of "Friends". -At this point, the $Projectname [i]Affinity Slider[/i] tool, which usually appears at the top of your "Matrix" page, adjusts the content on the page to include those within the desired affinity range. Channels outside that range will not be displayed, unless you adjust the slider to include them. +At this point, $Projectname [i]Affinity Slider[/i] tool, which usually appears at the top of your "Matrix" page, adjusts the content on the page to include those within the desired affinity range. Channels outside that range will not be displayed, unless you adjust the slider to include them. The Affinity Slider allows instantaneous filtering of large amounts of content, grouped by levels of closeness. +[b]Connection Filtering[/b] + +You have the ability to control precisely what appears in your stream using the optional "Connection Filter". When enabled, the Connection Editor provides inputs for selecting criteria which needs to be matched in order to include or exclude a specific post from a specific channel. Once a post has been allowed, all comments to that post are allowed regardless of whether they match the selection criteria. You may select words that if present block the post or ensure it is included in your stream. Regular expressions may be used for even finer control, as well as hashtags or even the detected language of the post. + [b]Access Control Lists[/b] When sharing content, members have the option of restricting who sees the content. By clicking on the padlock underneath the sharing box, one may choose desired recipients of the post, by clicking on their names. @@ -43,7 +47,7 @@ Access Control Lists may be applied to content and posts, photos, events, webpag [b]Single Sign-on[/b] -Access Control Lists work for all channels in the matrix due to our unique single sign-on technology. Most internal links provide an identity token which can be verified on other $Projectname sites and used to control access to private resources. You login once to your home hub. After that, authentication to all $Projectname resources is "magic". +Access Control Lists work for all channels in the grid due to our unique single sign-on technology. Most internal links provide an identity token which can be verified on other $Projectname sites and used to control access to private resources. You login once to your home hub. After that, authentication to all $Projectname resources is "magic". [b]WebDAV enabled File Storage[/b] @@ -85,7 +89,7 @@ Messages marked [b]private[/b] are encrypted with AES-CBC 256-bit symmetric ciph These private messages are also stored in an encrypted form on remote systems. -Each Red channel has it's own unique set of private and associated public RSA 4096-bit keys, generated when the channels is first created. +Each$Projectname channel has it's own unique set of private and associated public RSA 4096-bit keys, generated when the channels is first created. Additionally, messages may be created utilising "end-to-end encryption" which cannot be read by $Projectname operators or ISPs or anybody who does not know the passcode. @@ -142,9 +146,9 @@ Forums are typically channels which may be open to participation from multiple a [b]Account Cloning[/b] -Accounts in the $Projectname are referred to as [i]nomadic identities[/i], because a member's identity is not bound to the hub where the identity was originally created. For example, when you create a Facebook or Gmail account, it is tied to those services. They cannot function without Facebook.com or Gmail.com. +Accounts in $Projectname are referred to as [i]nomadic identities[/i], because a member's identity is not bound to the hub where the identity was originally created. For example, when you create a Facebook or Gmail account, it is tied to those services. They cannot function without Facebook.com or Gmail.com. -By contrast, say you've created a Red identity called [b]tina@redhub.com[/b]. You can clone it to another Red hub by choosing the same, or a different name: [b]liveForever@Some$ProjectnameHub.info[/b] +By contrast, say you've created a$Projectname identity called [b]tina@redhub.com[/b]. You can clone it to another$Projectname hub by choosing the same, or a different name: [b]liveForever@Some$ProjectnameHub.info[/b] Both channels are now synchronized, which means all your contacts and preferences will be duplicated on your clone. It doesn't matter whether you send a post from your original hub, or the new hub. Posts will be mirrored on both accounts. @@ -152,9 +156,9 @@ This is a rather revolutionary feature, if we consider some scenarios: - What happens if the hub where an identity is based suddenly goes offline? Without cloning, a member will not be able to communicate until that hub comes back online (no doubt many of you have seen and cursed the Twitter "Fail Whale"). With cloning, you just log into your cloned account, and life goes on happily ever after. - - The administrator of your hub can no longer afford to pay for his free and public $Projectname hub. He announces that the hub will be shutting down in two weeks. This gives you ample time to clone your identity(ies) and preserve your Red relationships, friends and content. + - The administrator of your hub can no longer afford to pay for his free and public $Projectname hub. He announces that the hub will be shutting down in two weeks. This gives you ample time to clone your identity(ies) and preserve your$Projectname relationships, friends and content. - - What if your identity is subject to government censorship? Your hub provider may be compelled to delete your account, along with any identities and associated data. With cloning, the $Projectname offers [b]censorship resistance[/b]. You can have hundreds of clones, if you wanted to, all named different, and existing on many different hubs, strewn around the internet. + - What if your identity is subject to government censorship? Your hub provider may be compelled to delete your account, along with any identities and associated data. With cloning, $Projectname offers [b]censorship resistance[/b]. You can have hundreds of clones, if you wanted to, all named different, and existing on many different hubs, strewn around the internet. Red offers interesting new possibilities for privacy. You can read more at the <<Private Communications Best Practices>> page. @@ -172,7 +176,7 @@ Backups can then be used to clone or restore a profile. [b]Account Deletion[/b] -Accounts can be immediately deleted by clicking on a link. That's it. All associated content is then deleted from the matrix (this includes posts and any other content produced by the deleted profile). Depending on the number of connections you have, the process of deleting remote content could take some time but it is scheduled to happen as quickly as is practical. +Accounts can be immediately deleted by clicking on a link. That's it. All associated content is then deleted from the grid (this includes posts and any other content produced by the deleted profile). Depending on the number of connections you have, the process of deleting remote content could take some time but it is scheduled to happen as quickly as is practical. [b][size=20]Content Creation[/size][/b] @@ -183,10 +187,10 @@ Red supports a number of different ways of adding rich-text content. The default When creating "Websites", content may be entered in HTML, Markdown, BBcode, and/or plain text. [b]Deletion of content[/b] -Any content created in the $Projectname remains under the control of the member (or channel) that originally created it. At any time, a member can delete a message, or a range of messages. The deletion process ensures that the content is deleted, regardless of whether it was posted on a channel's primary (home) hub, or on another hub, where the channel was remotely authenticated via Zot (the $Projectname communication and authentication protocol). +Any content created in $Projectname remains under the control of the member (or channel) that originally created it. At any time, a member can delete a message, or a range of messages. The deletion process ensures that the content is deleted, regardless of whether it was posted on a channel's primary (home) hub, or on another hub, where the channel was remotely authenticated via Zot ($Projectname communication and authentication protocol). [b]Media[/b] -Similar to any other modern blogging system, social network, or a micro-blogging service, Red supports the uploading of files, embedding of videos, linking web pages. +Similar to any other modern blogging system, social network, or a micro-blogging service, $Projectname supports the uploading of files, embedding of videos, linking web pages. [b]Previewing/Editing[/b] Post can be previewed prior to sending and edited after sending. diff --git a/sources/doc/general.bb b/sources/doc/general.bb new file mode 100644 index 00000000..c9c2501e --- /dev/null +++ b/sources/doc/general.bb @@ -0,0 +1,20 @@ + +[h2]Project/Site Information[/h2] + +[zrl=[baseurl]/help/Privacy]Privacy Policy[/zrl] + +[zrl=[baseurl]/help/history]$Projectname history[/zrl] + +[h3]External Resources[/h3] +[zrl=[baseurl]/help/external-resource-links]External Resource Links[/zrl] + +[url=https://github.com/redmatrix/hubzilla]Main Website[/url] +[url=https://github.com/redmatrix/hubzilla-addons]Addon Website[/url] + +[url=[baseurl]/help/credits]$Projectname Credits[/url] + +[h3]About This $Projectname Hub[/h3] +[zrl=[baseurl]/help/TermsOfService]Terms of Service For This Hub[/zrl] +[zrl=[baseurl]/siteinfo]Hub Information (/siteinfo)[/zrl] +[zrl=[baseurl]/siteinfo/json]Detailed Technical Hub Information in JSON format(/siteinfo/json)[/zrl] + diff --git a/sources/doc/history.md b/sources/doc/history.md index 32917712..7360c6b2 100644 --- a/sources/doc/history.md +++ b/sources/doc/history.md @@ -1,7 +1,7 @@ -Redmatrix History -================= +Hubzilla History +================ -Redmatrix is a collaborative effort by the Redmatrix community and based on work introduced in Friendica by the Friendica community. The core design, the project mission, and software base itself were created/written primarily by Mike Macgirvin and represent the culmination of over a decade of software design using variations of this platform and an evolving vision of the role of communication software in our lives. Many others have contributed to this work, both conceptually and in terms of actual code (way too many to list individually). +Hubzilla is a community developed open source project based on work introduced in Friendica by the Friendica community and which previously was named Redmatrix. The core design, the project mission, and software base itself were created/written primarily by Mike Macgirvin and represent the culmination of over a decade of software design using variations of this platform and an evolving vision of the role of communication software in our lives. Many others have contributed to this work, both conceptually and in terms of actual code (far too many to list individually). ##Mike Macgirvin -- Biography @@ -10,9 +10,9 @@ Mike Macgirvin is an American software engineer now living in Australia. He spen During a layoff round, Mike was let go from America Online in August 2001 and purchased a music store in Mountain View, California later to be known as "Sonica Music Company". Opening a retail store for non-essential goods at the beginning of a prolonged economic downturn was in retrospect probably not the wisest career move. Sonica eventually folded; in late 2006. Mike returned to working on software and systems support full-time and was employed briefly at Symantec before moving to Australia in early 2007. He currently lives on a farm "out in the middle of nowhere" and is employed as a Computer Systems Officer at the University of Wollongong. -##Redmatrix - The Early Years +##Hubzilla - The Early Years -The software which went into creating Redmatrix has been through three distinct historical phases. It began in 2003 when Mike Macgirvin was looking for a content management system to power the website for his music store and found the available solutions to be lacking in various respects. The project was born as the "PurpleHaze weblog" under the nom de plume "Nerdware Communications". It was a multi-user PHP/MySQL CMS which provided blogs, forums, photo albums, events and more. Initially it provided the basis for a social community and shopping for customers of the store, but was also linked to Mike's personal weblog running on another domain. The distinguishing characteristic of this software was the ability for so-called "normal users" to re-assemble the components and choose different content feeds - and in essence create their own personal "multi-user CMS" as a view. Their custom view was able to communicate with anybody else that used the system, but could be partitioned so that adult sites and motorcycle enthusiast sites would not be visible to each other and not clash (or in this case Mike's personal website and the music store website). This software was developed primarily from 2003 until 2008. +The software which went into creating Hubzilla has been through several distinct historical phases. It began in 2003 when Mike Macgirvin was looking for a content management system to power the website for his music store and found the available solutions to be lacking in various respects. The project was born as the "PurpleHaze weblog" under the nom de plume "Nerdware Communications". It was a multi-user PHP/MySQL CMS which provided blogs, forums, photo albums, events and more. Initially it provided the basis for a social community and shopping for customers of the store, but was also linked to Mike's personal weblog running on another domain. The distinguishing characteristic of this software was the ability for so-called "normal users" to re-assemble the components and choose different content feeds - and in essence create their own personal "multi-user CMS" as a view. Their custom view was able to communicate with anybody else that used the system, but could be partitioned so that adult sites and motorcycle enthusiast sites would not be visible to each other and not clash (or in this case Mike's personal website and the music store website). This software was developed primarily from 2003 until 2008. In 2006 this software was used as the prototype for Symantec's "safeweb" reputation and community site. It was developed and enhanced until about 2008. A rewrite took place in 2008 named "Reflection" but work stagnated as the community dwindled. The need for content management systems and communications software dropped dramatically during this time as humans flocked to the new social aggregrators - Facebook and Twitter. @@ -44,7 +44,13 @@ The concept of identity-aware content was alien to anything that existed previou Over time a few federation components re-emerged. The ability to view RSS feeds was important to many people. Diaspora never really managed to re-write their protocol, so that was re-implemented and allowed Redmatrix to connect with Diaspora and Friendica again (Friendica still had their Diaspora protocol intact, so this was the most common language now remaining on the free web - despite its faults). Diaspora communications aren't able to make use of the advanced identity features, but they work for basic communications. -Mike stepped down as active coordinator for the project in early 2015. +##Hubzilla + +The Redmatrix project reached a point of stagnation in early 2015 as network growth leveled and active interest in the project declined. Mike met with several external high tech developers and innovators in a round of discussions that were called "Zotopia" in early 2015 to perform an independent review of the project and try to identify what had gone wrong and plan a route forward. The basic consensus is that the project suffered from bad marketing decisions which were compounded by mixed messages about the project goals and target audience. A "rival" project (Diaspora) was marketing itself as a Facebook competitor, but after some long discussions it was determined that Redmatrix wasn't a Facebook competitor at all, and too much emphasis was being placed on the "social network" and "anti-Facebook" features. It was a novel decentralisation platform with distributed identity and permissions, and as was pointed out, the "end user" was the wrong target market. These marketing mistakes were now identified with the project name and random sampling of various "customers" showed that none of them really had a clue about the software goals or target market segment. The mixed messages were associated with the brand identity and this was a problem. + +The Redmatrix community held a vote and the project was renamed "Hubzilla", with a renewed identity and focus - to provide software for creating and ultimately linking together unrelated community websites or "hubs" into a global community. This is in fact what we were building all along, but didn't fully recognise it. The target audience for this software as it turns out is not the members or end users, but software integrators and digital community architects and builders. These in turn will be responsible for marketing their own product (their respective online communities) to end-users or members. The software solves a real world need of linking isolated and "walled garden" community sites together into a larger cooperative. The transition from Redmatrix to Hubzilla was complex and has taken several months as we consolidated the marketing and media assets to deliver a consistent message. It is still ongoing at this time, and should be completed in Q4 2015. + +Mike stepped down as active coordinator for the project in early 2015 and turned management over to the community. He remains active as a Hubzilla developer. #include doc/macros/main_footer.bb; diff --git a/sources/doc/html/index.php b/sources/doc/html/index.php index 4ef28aad..2e1b4277 100644 --- a/sources/doc/html/index.php +++ b/sources/doc/html/index.php @@ -1,17 +1,11 @@ -<<<<<<< HEAD - Hubzilla Doxygen API Documentation - - -

Hubzilla Doxygen API Documentation not rendered

-======= $Projectname Doxygen API Documentation

$Projectname Doxygen API Documentation not rendered

->>>>>>> f866a42a42b9e12756353f5bb39a0f31a64bb26a + To get the Doxygen API Documentation you must render it with the program Doxygen (included in most distributions).
 $ doxygen util/Doxyfile
diff --git a/sources/doc/main.bb b/sources/doc/main.bb
index 6998ee90..8ba5d481 100644
--- a/sources/doc/main.bb
+++ b/sources/doc/main.bb
@@ -5,82 +5,9 @@ $Projectname is a decentralized communication and publishing platform that enabl
 [zrl=[baseurl]/help/features][b]$Projectname Features[/b][/zrl]
 
 $Projectname is already running as a global distributed network and proves its versatility and scalability from standalone to huge sites on a daily basis. 
-Think of standalone family communication platforms, distributed online communities, support forums, blogs and homepages. Or professional content providers with commercial premium channels and targeted content acces. Whatever you want, the $Projectname is there to cater to your creativity.
+Think of standalone family communication platforms, distributed online communities, support forums, blogs and homepages. Or professional content providers with commercial premium channels and targeted content acces. Whatever you want, $Projectname is there to cater to your creativity.
 
 [zrl=[baseurl]/help/what_is_zot][b]Got Zot? Well, you should.[/b][/zrl]
 Zot is the great new communicaton protocol invented especially for $Projectname. As a member you are no longer bound to a single site or hub thanks to "Nomadic Identities". Migrate easily to another server and keep your contacts intact, or clone it and run the same channel on several servers. Just in case one of them might shut down, you don't lose out. Plus once you are inside $Projectname there is no need for you to authenticate twice, even when accessing another $Projectname site. Zot is what sets $Projectname apart. 
 
-[h3]Getting Started[/h3]
-[zrl=[baseurl]/help/Privacy]Privacy Policy[/zrl]
-[zrl=[baseurl]/help/registration]Account Registration[/zrl]
-[zrl=[baseurl]/help/accounts_profiles_channels_basics]You at the $Projectname: accounts, profiles and channels in short[/zrl]
-[zrl=[baseurl]/help/profiles]Profiles[/zrl]
-[zrl=[baseurl]/help/channels]Channels[/zrl]
-[zrl=[baseurl]/help/roles]Permission roles and Channel types[/zrl]
-[zrl=[baseurl]/help/first-post]Your first posting[/zrl]
-[zrl=[baseurl]/help/connecting_to_channels]Connecting To Other Channels[/zrl]
-[zrl=[baseurl]/help/permissions]Permissions And Encryption: You Are In Control[/zrl]
-[zrl=[baseurl]/help/cloud]Cloud Storage[/zrl]
-[zrl=[baseurl]/help/remove_account]Remove Channel or Account[/zrl]
 
-[h3]Members Help[/h3]
-[zrl=[baseurl]/help/tags_and_mentions]Tags and Mentions[/zrl]
-[zrl=[baseurl]/help/webpages]Web Pages[/zrl]
-[zrl=[baseurl]/help/bbcode]BBcode reference for posts and comments[/zrl]
-[zrl=[baseurl]/help/checking_account_quota_usage]Checking Account Quota Usage[/zrl]
-[zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl]
-[zrl=[baseurl]/help/AdvancedSearch]Advanced Directory Search[/zrl]
-[zrl=[baseurl]/help/addons]Help With Addons[/zrl]
-[zrl=[baseurl]/help/diaspora_compat]Diaspora Communications Compatibility (Diaspora and Friendica)[/zrl]
-[zrl=[baseurl]/help/faq_members]FAQ For Members[/zrl]
-
-[h3]Administrators Help[/h3]
-[zrl=[baseurl]/help/install]Install[/zrl]
-[zrl=[baseurl]/help/red2pi]Installing Red on the Raspberry Pi[/zrl]
-[zrl=[baseurl]/help/troubleshooting]Troubleshooting Tips[/zrl]
-[zrl=[baseurl]/help/hidden_configs]Tweaking $Projectname's Hidden Configurations[/zrl]
-[zrl=[baseurl]/help/faq_admins]FAQ For Admins[/zrl]
-[zrl=[baseurl]/help/service_classes]Service Classes[/zrl]
-
-[h3]Technical Documentation[/h3]
-[zrl=[baseurl]/help/history]$Projectname history[/zrl]
-[zrl=[baseurl]/help/Zot---A-High-Level-Overview]A high level overview of Zot[/zrl]
-[zrl=[baseurl]/help/zot]An introduction to Zot[/zrl]
-[zrl=[baseurl]/help/zot_structures]Zot Stuctures[/zrl]
-[zrl=[baseurl]/help/comanche]Comanche Page Descriptions[/zrl]
-[zrl=[baseurl]/help/Creating-Templates]Creating Comanche Templates[/zrl]
-[zrl=[baseurl]/help/Widgets]Widgets[/zrl]
-[zrl=[baseurl]/help/plugins]Plugins[/zrl]
-[zrl=[baseurl]/help/doco]Contributing Documentation[/zrl]
-[zrl=[baseurl]/help/DerivedTheme1]Creating Derivative Themes[/zrl]
-[zrl=[baseurl]/help/schema_development]Schemas[/zrl]
-[zrl=[baseurl]/help/Translations]Translations[/zrl]
-[zrl=[baseurl]/help/developers]Developers[/zrl]
-[zrl=[baseurl]/help/intro_for_developers]Intro for Developers[/zrl]
-[zrl=[baseurl]/help/database]Database schema documantation[/zrl]
-[zrl=[baseurl]/help/api_functions]API functions[/zrl]
-[zrl=[baseurl]/help/api_posting]Posting to the red# using the API[/zrl]
-[zrl=[baseurl]/help/developer_function_primer]Red Functions 101[/zrl]
-[zrl=[baseurl]/doc/html/]Code Reference (Doxygen generated - sets cookies)[/zrl]
-[zrl=[baseurl]/help/to_do_doco]To-Do list for the Red Documentation Project[/zrl]
-[zrl=[baseurl]/help/to_do_code]To-Do list for Developers[/zrl]
-[zrl=[baseurl]/help/roadmap]Version 3 roadmap[/zrl]
-[zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl]
-[zrl=[baseurl]/help/dev_beginner]Step-for-step manual for beginning developers[/zrl]
-
-[h3]Frequently Asked Questions For Developers[/h3]
-[zrl=[baseurl]/help/faq_developers]FAQ For Developers[/zrl]
-
-[h3]External Resources[/h3]
-[zrl=[baseurl]/help/external-resource-links]External Resource Links[/zrl]
-[url=https://github.com/redmatrix/hubzilla]Main Website[/url]
-[url=https://github.com/redmatrix/hubzilla-addons]Addon Website[/url]
-[url=https://zothub.com/channel/one]Development Channel[/url]
-[url=https://federated.social/channel/postgres]Postgres-specific $Projectname Admin Support Channel[/url]
-
-[url=[baseurl]/help/credits]$Projectname Credits[/url]
-
-[h3]About This $Projectname Hub[/h3]
-[zrl=[baseurl]/help/TermsOfService]Terms of Service For This Hub[/zrl]
-[zrl=[baseurl]/siteinfo]Hub Information (/siteinfo)[/zrl]
-[zrl=[baseurl]/siteinfo/json]Detailed Technical Hub Information in JSON format(/siteinfo/json)[/zrl]
diff --git a/sources/doc/members.bb b/sources/doc/members.bb
new file mode 100644
index 00000000..13339ef2
--- /dev/null
+++ b/sources/doc/members.bb
@@ -0,0 +1,25 @@
+[h2]Documentation for Hub Members[/h2]
+
+[h3]Getting Started[/h3]
+[zrl=[baseurl]/help/registration]Account Registration[/zrl]
+[zrl=[baseurl]/help/accounts_profiles_channels_basics]You at $Projectname: accounts, profiles and channels in short[/zrl]
+[zrl=[baseurl]/help/profiles]Profiles[/zrl]
+[zrl=[baseurl]/help/channels]Channels[/zrl]
+[zrl=[baseurl]/help/roles]Permission roles and Channel types[/zrl]
+[zrl=[baseurl]/help/first-post]Your first posting[/zrl]
+[zrl=[baseurl]/help/connecting_to_channels]Connecting To Other Channels[/zrl]
+[zrl=[baseurl]/help/permissions]Permissions And Encryption: You Are In Control[/zrl]
+[zrl=[baseurl]/help/cloud]Cloud Storage[/zrl]
+[zrl=[baseurl]/help/remove_account]Remove Channel or Account[/zrl]
+
+[h3]Members Help[/h3]
+[zrl=[baseurl]/help/tags_and_mentions]Tags and Mentions[/zrl]
+[zrl=[baseurl]/help/webpages]Web Pages[/zrl]
+[zrl=[baseurl]/help/bbcode]BBcode reference for posts and comments[/zrl]
+[zrl=[baseurl]/help/checking_account_quota_usage]Checking Account Quota Usage[/zrl]
+[zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl]
+[zrl=[baseurl]/help/AdvancedSearch]Advanced Directory Search[/zrl]
+[zrl=[baseurl]/help/addons]Help With Addons[/zrl]
+[zrl=[baseurl]/help/diaspora_compat]Diaspora Communications Compatibility (Diaspora and Friendica)[/zrl]
+[zrl=[baseurl]/help/faq_members]FAQ For Members[/zrl]
+[zrl=[baseurl]/help/bugs]Bugs, Issues, and things that go bump in the night...[/zrl]
diff --git a/sources/doc/theme_management.bb b/sources/doc/theme_management.bb
new file mode 100644
index 00000000..5691f7c4
--- /dev/null
+++ b/sources/doc/theme_management.bb
@@ -0,0 +1,10 @@
+[h1]Theme Management[/h1]
+$Projectname allows hub admins to easily add and update themes hosted in common git repositories.
+[h2]Add new theme repo to your hub[/h2]
+1. Navigate to your hub web root 
+[code]root@hub:~# cd /var/www[/code] 
+2. Add the theme repo and give it a name 
+[code][nobb]root@hub:/var/www# util/add_theme_repo https://github.com/username/theme-repo.git UniqueThemeRepoName[/nobb][/code] 
+[h2]Update existing theme repo[/h2]
+Update the repo by using 
+[code]root@hub:/var/www# util/update_theme_repo UniqueThemeRepoName[/code]
diff --git a/sources/doc/to_do_code.bb b/sources/doc/to_do_code.bb
index 7fb6da85..57f4b2e0 100644
--- a/sources/doc/to_do_code.bb
+++ b/sources/doc/to_do_code.bb
@@ -4,16 +4,20 @@ We need much more than this, but here are areas where developers can help. Pleas
 
 [li]Documentation - see Red Documentation Project To-Do List[/li]
 [li]Include TOS link in registration/verification email[/li]
-[li](done) forum widget with unread counts (requires the DB schema changes from v3/hubzilla to be viable)[/li]
+[li]Auto preview posts/comments (configurable timer kicks in the preview if not 0)[/li]
+[li]SAML 2.0 and OpenID Connect provider functionality[/li]
 [li]Create bug tracker module[/li]
+[li]Filing posts - provide a dropdown menu integrated with the 'post actions menu'[/li]
+[li]integrate Mozilla Persona (possibly via plugin) https://github.com/mozilla/id-specs/blob/prod/browserid/index.md and become an idP[/li]
 [li]translation plugins - moses or apertium[/li]
 [li]plugins - provide 'disable' which is softer than 'uninstall' for those plugins which create additional DB tables[/li]
 [li]Infinite scroll improvements (i.e. embedded page links) see http://scrollsample.appspot.com/items [/li]
 [li]Finish the anti-spam bayesian engine[/li]
 [li]implement an email permission denied bounce message from the sys channel[/li]
 [li]provide a way for xchans with a certain network type to upgrade (unknown to rss, rss to statusnet, friendica-over-diaspora to friendica, for instance) based on new knowledge and/or redmatrix ability[/li]
-[li](done - HZ) If DAV folders exist, add an option to the Settings page to set a default folder for attachment uploads.[/li] 
 [li]Integrate the "open site" list with the register page[/li]
+[li]Support comments and member notes on documentation pages (to achieve an effect similar to php.net)[/li]
+[li]Support comments on webpages[/li]
 [li]implement oembed provider interface[/li]
 [li]refactor the oembed client interface so that we can safely sandbox remote content[/li]
 [li]Many modern social apps now have both a profile photo and a "cover photo". Add support for this. [/li]
@@ -22,21 +26,17 @@ We need much more than this, but here are areas where developers can help. Pleas
 [li]restricted access OAuth clients[/li]
 [li](Advanced) create a UI for building Comanche pages[/li]
 [li](less advanced) create a way to preview Comanche results on a preview page while editing on another page[/li]
-[li](done - HZ) Extend WebDAV to provide desktop access to photo albums[/li]
 [li]External post connectors - create standard interface[/li]
 [li]External post connectors, add popular services[/li]
 [li](in progress Habeas Codice) service classes - provide a pluggable subscription payment gateway for premium accounts[/li]
 [li](in progress Habeas Codice) service classes - account overview page showing resources consumed by channel. With special consideration this page can also be accessed at a meta level by the site admin to drill down on problematic accounts/channels.[/li]
-[li]Events module - fix permissions on events, and provide JS translation support for the calendar overview (done); integrate with calDAV[/li]
+[li]implement CalDAV/CardDAV sync[/li]
 [li]Uploads - integrate #^[url=https://github.com/blueimp/jQuery-File-Upload]https://github.com/blueimp/jQuery-File-Upload[/url][/li]
-[li]Import/export - include events, things, etc.[/li]
 [li]API extensions, for Twitter API - search, friending, threading. For Red API, lots of stuff[/li]
-[li]OAuth permission extensions[/li]
 [li]Import channel from Diaspora/Friendica (Diaspora partially done)[/li]
 [li]MediaGoblin photo "crosspost" connector[/li]
 [li]Create management page/UI for extensible profile fields[/li]
 [li]Create interface to include/exclude and re-order standard profile fields[/li]
-[li]Provide a mechanism to share page design elements in posts (just like apps) (done)[/li]
 [li]App taxonomy[/li]
 [li]Customisable App collection pages[/li]
 [li]replace the tinymce visual editor and/or make the visual editor pluggable and responsive to different output formats. We probably want library/bbedit for bbcode. This needs a fair bit of work to catch up with our "enhanced bbcode", but start with images, links, bold and highlight and work from there.[/li]
@@ -44,7 +44,7 @@ We need much more than this, but here are areas where developers can help. Pleas
 [li]Create mobile clients for the top platforms - which involves extending the API so that we can do stuff far beyond the current crop of Twitter/Statusnet clients. Ditto for mobile themes. We can probably use something like the Friendica Android app as a base to start from.[/li]
 [li](in progress Habeas Codice) Implement owned and exchangeable "things".[/li]
 [li]Family Account creation - using service classes (an account holder can create a certain number of sub-accounts which are all tied to their subscription - if the subscription lapses they all go away).[/li]
-[li]Put mod_admin under Comanche[/li]
+
 
 In many cases some of the work has already been started and code exists so that you needn't start from scratch. Please contact one of the developer channels like Channel One (one@zothub.com) before embarking and we can tell you what we already have and provide some insights on how we envision these features fitting together.
 
diff --git a/sources/doc/to_do_doco.bb b/sources/doc/to_do_doco.bb
deleted file mode 100644
index d0f595b3..00000000
--- a/sources/doc/to_do_doco.bb
+++ /dev/null
@@ -1,23 +0,0 @@
-[b]Documentation To-Do List[/b]
-
-[b]Documentation we need to write[/b]
-
-    Database schema detailed descriptions
-
-    Complete plugin hook documentation
-
-    API documentation
-
-    Function and code documentation (doxygen)
-
-    New Member guide
-
-    "Extra Feature" reference, description of each
-
-    Detailed Personal Settings Documentation
-
-    Administration Guide (post-install)
-
-    Administration Guide (pre-install)
-
-Return to the [url=[baseurl]/help/main]Main documentation page[/url]
diff --git a/sources/doc/what_is_zot.bb b/sources/doc/what_is_zot.bb
index 50df9e39..9285f4ec 100644
--- a/sources/doc/what_is_zot.bb
+++ b/sources/doc/what_is_zot.bb
@@ -1,6 +1,6 @@
 [b]What is Zot?[/b]
 
-Zot is the protocol that powers the $Projectname, providing three core capabilities: Communications, Identity, and Access Control.
+Zot is the protocol that powers $Projectname, providing three core capabilities: Communications, Identity, and Access Control.
 
 The functionality it provides can also be described as follows: 
 
@@ -9,43 +9,43 @@ The functionality it provides can also be described as follows:
 
 [b][size=20]Communications[/size][/b]
 
-Zot is a revolutionary protocol which provides [i]decentralised communications[/i] and [i]identity management[/i] across the matrix. The resulting platform can provide web services comparable to those offered by large corporate providers, but without the large corporate provider and their associated privacy issues, insatiable profit drive, and walled-garden mentality.
+Zot is a revolutionary protocol which provides [i]decentralised communications[/i] and [i]identity management[/i] across the grid. The resulting platform can provide web services comparable to those offered by large corporate providers, but without the large corporate provider and their associated privacy issues, insatiable profit drive, and walled-garden mentality.
 
-Communications and social networking are an integral part of the matrix. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale. These communications may be public or private - and private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers. 
+Communications and social networking are an integral part of the grid. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale. These communications may be public or private - and private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers. 
 
-Zot allows a wide array of background services in the matrix, from offering friend suggestions, to directory services. You can also perform other things which would typically only be possibly on a centralized provider - such as "Wall to Wall" posts. Priivate/multiple profiles can be easily created, and web content can be tailored to the viewer via the [i]Affinity Slider[/i]. 
+Zot allows a wide array of background services in the grid, from offering friend suggestions, to directory services. You can also perform other things which would typically only be possibly on a centralized provider - such as "Wall to Wall" posts. Private/multiple profiles can be easily created, and web content can be tailored to the viewer via the [i]Affinity Slider[/i]. 
 
 You won't find these features at all on other decentralized communication services. In addition to providing hub (server) decentralization, perhaps the most innovative and interesting Zot feature is its provision of [i]decentralized identity[/i] services.
 
 [b][size=20]Identity[/size][/b] 
 
-Zot's identity layer is unique. It provides [i]invisible single sign-on[/i] across all sites in the matrix. 
+Zot's identity layer is unique. It provides [i]invisible single sign-on[/i] across all sites in the grid. 
 
 It also provides [i]nomadic identity[/i], so that your communications with friends, family, and or anyone else you're communicating with won't be affected by the loss of your primary communication node - either temporarily or permanently. 
 
-The important bits of your identity and relationships can be backed up to a thumb drive, or your laptop, and may appear at any node in the matrix at any time - with all your friends and preferences intact. 
+The important bits of your identity and relationships can be backed up to a thumb drive, or your laptop, and may appear at any node in the grid at any time - with all your friends and preferences intact. 
 
 Crucially, these nomadic instances are kept in sync so any instance can take over if another one is compromised or damaged. This protects you against not only major system failure, but also temporary site overloads and governmental manipulation or censorship. 
 
-Nomadic identity, single sign-on, and Red's decentralization of hubs, we believe, introduce a high degree of degree of [i]resiliency[/i] and [i]persistence[/i] in internet communications, that are sorely needed amidst global trends towards corporate centralization, as well as mass and indiscriminate government surveillance and censorship.
+Nomadic identity, single sign-on, and $Projectname's decentralization of hubs, we believe, introduce a high degree of degree of [i]resiliency[/i] and [i]persistence[/i] in internet communications, that are sorely needed amidst global trends towards corporate centralization, as well as mass and indiscriminate government surveillance and censorship.
 
-As you browse the matrix, viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No passwords to enter. Nothing to type. You're just greeted by name on every new site you visit. 
+As you browse the grid, viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No passwords to enter. Nothing to type. You're just greeted by name on every new site you visit. 
 
-How does Zot do that? We call it [i]magic-auth[/i], because Red hides the details of the complexities that go into single sign-on logins, and nomadic identities, from the experience of browsing on the matrix.  This is one of the design goals of Red: to increase privacy, and freedom on the web, while reducing the complexity and tedium brought by the need to enter new passwords and user names for every different sight that someone might visit online.
+How does Zot do that? We call it [i]magic-auth[/i], because $Projectname hides the details of the complexities that go into single sign-on logins, and nomadic identities, from the experience of browsing on the grid.  This is one of the design goals of $Projectname: to increase privacy, and freedom on the web, while reducing the complexity and tedium brought by the need to enter new passwords and user names for every different sight that someone might visit online.
 
-You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the matrix - such as shopping, blogs, forums, and access to private information. This is just like the services offered by large corporate providers with huge user databases; however you can be a member of this community, as well as a server on this network using a $35 Rasberry Pi. Your password isn't stored on a thousand different sites, or even worse, only on a few sites like Google and Facebook, beyond your direct control.
+You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the grid - such as shopping, blogs, forums, and access to private information. This is just like the services offered by large corporate providers with huge user databases; however you can be a member of this community, as well as a server on this network using a $35 Rasberry Pi. Your password isn't stored on a thousand different sites, or even worse, only on a few sites like Google and Facebook, beyond your direct control.
 
-You cannot be silenced. You cannot be removed from the matrix, unless you yourself choose to exit it.
+You cannot be silenced. You cannot be removed from the grid, unless you yourself choose to exit it.
 
 [b][size=20]Access Control[/size][/b]
 
-Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across the $Projectname. This is like having one super huge website made up of an army of small individual websites - and where each channel in the matrix can completely control their privacy and sharing preferences for any web resources they create. 
+Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across $Projectname. This is like having one super huge website made up of an army of small individual websites - and where each channel in the grid can completely control their privacy and sharing preferences for any web resources they create. 
 
-Currently, the matrix supports communications, photo albums, events, and files. This will be extended in the future to provide content management services (web pages) and cloud storage facilities, such as WebDAV and multi-media libraries. Every object and how it is shared and with whom is completely under your control.
+Currently, the grid supports communications, photo albums, events, and files. This will be extended in the future to provide content management services (web pages) and cloud storage facilities, such as WebDAV and multi-media libraries. Every object and how it is shared and with whom is completely under your control.
 
-This type of control is available on large corporate providers such as Facebook and Google, because they own the user database. Within the matrix, there is no need for a huge user databaseon your machine - because the matrix [i]is[/i] your user database. It has what is essentially infinite capacity (limited by the total number of hubs online across the internet), and is spread amongst hundreds, and potentially millions of computers. 
+This type of control is available on large corporate providers such as Facebook and Google, because they own the user database. Within the grid, there is no need for a huge user databaseon your machine - because the grid [i]is[/i] your user database. It has what is essentially infinite capacity (limited by the total number of hubs online across the internet), and is spread amongst hundreds, and potentially millions of computers. 
 
-Access can be granted or denied for any resource, to any channel, or any group of channels; anywhere within the matrix. Others can access your content if you permit them to do so, and they do not even need to have an account on your hub. Your private photos cannot be viewed, because permission really work; they are not an addon that was added as an afterthought. If you aren't on the list of allowed viewers for a particular photo, you aren't going to look at it. 
+Access can be granted or denied for any resource, to any channel, or any group of channels; anywhere within the grid. Others can access your content if you permit them to do so, and they do not even need to have an account on your hub. Your private photos cannot be viewed, because permission really work; they are not an addon that was added as an afterthought. If you aren't on the list of allowed viewers for a particular photo, you aren't going to look at it. 
 
 [b][size=18]Additional Resources and Links[/size][/b]
 
diff --git a/sources/extend/addon/matrix/README.md b/sources/extend/addon/matrix/README.md
deleted file mode 100644
index ffb55595..00000000
--- a/sources/extend/addon/matrix/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-hubzilla-addons
-================
-
-These are addons for hubzilla sites (see https://github.com/redmatrix/hubzilla )
-
-
diff --git a/sources/extend/addon/matrix/adultphotoflag/adultphotoflag.php b/sources/extend/addon/matrix/adultphotoflag/adultphotoflag.php
deleted file mode 100755
index a8b1371a..00000000
--- a/sources/extend/addon/matrix/adultphotoflag/adultphotoflag.php
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
- */
-
-function adultphotoflag_load() {
-	register_hook('get_features','addon/adultphotoflag/adultphotoflag.php','adultphotoflag_get_features');
-}
-
-function adultphotoflag_unload() {
-	unregister_hook('get_features','addon/adultphotoflag/adultphotoflag.php','adultphotoflag_get_features');
-}
-
-function adultphotoflag_get_features(&$a,&$b) {
-
-	$b['tools'][] = array(
-		'adult_photo_flagging', 
-		t('Flag Adult Photos'),  
-		t('Provide photo edit option to hide inappropriate photos from default album view'),false);
-
-}
-
diff --git a/sources/extend/addon/matrix/bbmath/README b/sources/extend/addon/matrix/bbmath/README
deleted file mode 100644
index e2e9f62c..00000000
--- a/sources/extend/addon/matrix/bbmath/README
+++ /dev/null
@@ -1,3 +0,0 @@
-Adds a new tag, [tex] that can be used in bbcode. Note that you still also have to use $...$ to get equations correct, i.e. [tex] doesn't eneter math-mode by default.
-
-Requires images and tmp directory in your Red root directory (e.g. /var/www/red). Must be writable by server (e.g chown -R www-data tmp images). Also requires latex and imagemagick to be installed.
diff --git a/sources/extend/addon/matrix/bbmath/bbmath.php b/sources/extend/addon/matrix/bbmath/bbmath.php
deleted file mode 100644
index 118772dd..00000000
--- a/sources/extend/addon/matrix/bbmath/bbmath.php
+++ /dev/null
@@ -1,22 +0,0 @@
-
-     *
-     */
-
-require_once('phplatex.php');
-function bbmath_load() {
-	register_hook('bbcode','addon/bbmath/bbmath.php','bbmath_bbcode');
-
-}
-function bbmath_unload() {
-	unregister_hook('bbcode','addon/bbmath/bbmath.php','bbmath_bbcode');
-}
-
-function bbmath_bbcode($a,&$text) {
-	$text = preg_replace_callback('|\[tex\](.*?)\[/tex\]|',function($m) { return texify($m[1]); },$text);
-}
diff --git a/sources/extend/addon/matrix/bbmath/gpl.txt b/sources/extend/addon/matrix/bbmath/gpl.txt
deleted file mode 100644
index d511905c..00000000
--- a/sources/extend/addon/matrix/bbmath/gpl.txt
+++ /dev/null
@@ -1,339 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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.
-
-    
-    Copyright (C)   
-
-    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.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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.
-
-  , 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 Lesser General
-Public License instead of this License.
diff --git a/sources/extend/addon/matrix/bbmath/phplatex.php b/sources/extend/addon/matrix/bbmath/phplatex.php
deleted file mode 100644
index cf10cd94..00000000
--- a/sources/extend/addon/matrix/bbmath/phplatex.php
+++ /dev/null
@@ -1,139 +0,0 @@
-300) $dpi=300;
-
-  $back=phplatex_colorhex($br,$bg,$bb);
-  $fore=phplatex_colorhex($r,$g,$b);
-
-  # Figure out TeX, either to get the right cache entry or to, you know, compile
-  # Semi-common (ams) symbol packages are included.
-  $totex = "\\documentclass[14pt,landscape]{extarticle}\n".
-           "\\usepackage{color}\n".
-           "\\usepackage{amsmath}\n\\usepackage{amsfonts}\n\\usepackage{amssymb}\n".
-           $extraprelude."\n".
-           "\\pagestyle{empty}\n".  #removes header/footer; necessary for trim
-           "\\begin{document}\n".
-           "\\color[rgb]{".$r.",".$g.",".$b."}\n".
-           "\\pagecolor[rgb]{".$br.",".$bg.",".$bb."}\n".
-           $string."\n".
-           "\\end{document}\n";
-  
-  $strhash = sha1($totex).'.'.$dpi; #file cache entry string:  40-char hash string plus size
-  $stralt = str_replace("&","&", preg_replace("/[\"\n]/","",$string)); #stuck in the alt and title attributes
-                                                                           #May need some extra safety.
-  $heredir=getcwd();
-
-  #Experiment: Tries to adjust vertical positioning, so that rendered TeX text looks natural enough inline with HTML text
-  #Only descenders are really a problem since HTML's leeway is upwards.
-  #TODO: This can always use more work. 
-  #      Avoid using characters that are part of TeX commands.
-  #  Some things vary per font, e.g. the slash. In the default CM it is a descender, in Times and others it isn't.
-  $ascenders ="/(b|d|f|h|i|j|k|l|t|A|B|C|D|E|F|G|H|I|J|L|K|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|\[|\]|\\{|\\}|\(|\)|\/|0|1|2|3|4|5|6|7|8|9|\\#|\*|\?|'|\\\\'|\\\\`|\\\\v)/";
-  $monoliners="/(a|c|e|m|n|o|r|s|u|v|w|x|z|-|=|\+|:|.)/";
-  $descenders="/(g|j|p|\/|q|y|Q|,|;|\[|\]|\\{|\\}|\(|\)|\#|\\\\LaTeX|\\\\TeX|\\\\c\{)/";
-  $deepdescenders="/(\[|\]|\\{|\\}|\(|\)|\\int)/";
-
-  $ba = preg_match_all($ascenders,  $string,$m); 
-  $bm = preg_match_all($monoliners, $string,$m); 
-  $bd = preg_match_all($descenders, $string,$m); 
-  $dd = preg_match_all($deepdescenders, $string,$m); 
-  if      ($dd>0)            $verticalalign="vertical-align: -25%";   # deep descenders: move down
-  else if ($bd>0 && $ba==0)  $verticalalign="vertical-align: -15%";   # descenders:  move down
-  else if ($bd==0 && $ba>0)  $verticalalign="vertical-align: 0%";     # ascenders only: move up/do nothing?
-  else if ($bd==0 && $ba==0) $verticalalign="vertical-align: 0%";     # neither    vertical-align: 0%
-  else                       $verticalalign="vertical-align: -15%";   # both ascender and regular descender
-
-  #check image cache, return link if exists
-  #the vertical-align is to fix text baseline/descender(/tail) details in and on-average sort of way
-  if (file_exists($heredir.'/images/'.$strhash.'.'.$imgfmt)) 
-    return ''.$stralt.'';
-
- 
-  #chdir to have superfluous files be created in tmp. (you stiill have to empty this yourself)
-  error_reporting(0); # not checking existence myself, that would be double.
-  if (chdir("tmp")===FALSE) { return '[directory access error, fix permissions]'; } #I should chech whether file creation is allowed to give a nice error for that problem case
-  error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); # TODO: set old value
-  
-  $tfn = tempnam(getcwd(), 'PTX'); #file in tmp dir
-
-  #write temporary .tex file
-  if ( ($tex = fopen($tfn.'.tex', "w"))==FALSE) { return '[file access error] '.phplatex_cleantmp($tfn,$heredir); }
-  fwrite($tex, $totex); 
-  fclose($tex);
-
-
-  #Run latex to create a .dvi.  Have it try to fix minor errors instead of breaking/pausing on them.
-  exec($path_to_latex.' --interaction=nonstopmode '.$tfn.'.tex');
-  if (!file_exists($tfn.".dvi")) {
-    $log = file_get_contents($tfn.'.log'); #The log always exists, but now it's actually interesting since it'll contain an error
-    return '[latex error, code follows]
'.$totex.'

Log file:

'.$log.'

'.phplatex_cleantmp($tfn,$heredir); - } - - - #DVI -> PostScript. Since dvips uses lpr, which may be configured to actually print by default, force writing to a file with -o - exec($path_to_dvips.' '.$tfn.'.dvi -o '.$tfn.'.ps'); - if ( !file_exists($tfn.'.ps')) { - return '[dvi2ps error] '.phplatex_cleantmp($tfn,$heredir); - } - - - #PostScript -> image. Trim based on corner pixel, and set transparent color. - exec($path_to_convert.' -transparent-color "#'.$back.'" -colorspace RGB -density '.$dpi.' -trim +page '.$tfn.'.ps -transparent "#'.$back.'" '.$tfn.'.'.$imgfmt); - #Note: +page OR -page +0+0 OR +repage moves the image to the cropped area (kills offset) - #Older code tried: exec('/usr/bin/mogrify -density 90 -trim +page -format $imgfmt '.$tfn.'.ps'); - # It seems some versions of convert may not have -trim. Old versions? - - if (!file_exists($tfn.'.'.$imgfmt)) { - return '[image convert error] '.phplatex_cleantmp($tfn,$heredir); - } - - #Copy result image to chache. - copy($tfn.'.'.$imgfmt, $heredir.'/images/'.$strhash.'.'.$imgfmt); - - #Clean up temporary files, and return link to just-created image - return phplatex_cleantmp($tfn,$heredir).'LaTeX formula: '.$stralt.''; -} -?> diff --git a/sources/extend/addon/matrix/bookmarker/bookmarker.php b/sources/extend/addon/matrix/bookmarker/bookmarker.php deleted file mode 100755 index 41a86350..00000000 --- a/sources/extend/addon/matrix/bookmarker/bookmarker.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - */ - -function bookmarker_install() { - register_hook('prepare_body', 'addon/bookmarker/bookmarker.php', 'bookmarker_prepare_body', 10); -} - - -function bookmarker_uninstall() { - unregister_hook('prepare_body', 'addon/bookmarker/bookmarker.php', 'bookmarker_prepare_body'); -} - -function bookmarker_prepare_body(&$a,&$b) { - - - if(get_pconfig(local_channel(),'bookmarker','disable')) - return; - - if(! strpos($b['html'],'bookmark-identifier')) - return; - - if(! function_exists('redbasic_init')) - return; - - $id = $b['item']['id']; - if(local_channel()) - $link = ' '; - else - $link = ' '; - - $b['html'] = str_replace('#^',$link,$b['html']); - -} diff --git a/sources/extend/addon/matrix/buglink/bug-x.gif b/sources/extend/addon/matrix/buglink/bug-x.gif deleted file mode 100755 index 10936caa..00000000 Binary files a/sources/extend/addon/matrix/buglink/bug-x.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/buglink/buglink.php b/sources/extend/addon/matrix/buglink/buglink.php deleted file mode 100755 index a237601b..00000000 --- a/sources/extend/addon/matrix/buglink/buglink.php +++ /dev/null @@ -1,15 +0,0 @@ - - */ - - -function buglink_load() { register_hook('page_end', 'addon/buglink/buglink.php', 'buglink_active'); } - - -function buglink_unload() { unregister_hook('page_end', 'addon/buglink/buglink.php', 'buglink_active'); } - -function buglink_active(&$a,&$b) { $b .= ''; } diff --git a/sources/extend/addon/matrix/buglink/lang/C/messages.po b/sources/extend/addon/matrix/buglink/lang/C/messages.po deleted file mode 100644 index 260c583a..00000000 --- a/sources/extend/addon/matrix/buglink/lang/C/messages.po +++ /dev/null @@ -1,22 +0,0 @@ -# ADDON buglink -# Copyright (C) -# This file is distributed under the same license as the Friendica buglink addon package. -# -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-27 05:01-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: buglink.php:15 -msgid "Report Bug" -msgstr "" diff --git a/sources/extend/addon/matrix/buglink/lang/ca/strings.php b/sources/extend/addon/matrix/buglink/lang/ca/strings.php deleted file mode 100644 index 01fc9adb..00000000 --- a/sources/extend/addon/matrix/buglink/lang/ca/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Informar de problema"; diff --git a/sources/extend/addon/matrix/buglink/lang/cs/strings.php b/sources/extend/addon/matrix/buglink/lang/cs/strings.php deleted file mode 100644 index a1cd51f4..00000000 --- a/sources/extend/addon/matrix/buglink/lang/cs/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Nahlásit chybu"; diff --git a/sources/extend/addon/matrix/buglink/lang/de/strings.php b/sources/extend/addon/matrix/buglink/lang/de/strings.php deleted file mode 100644 index cf96a178..00000000 --- a/sources/extend/addon/matrix/buglink/lang/de/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Fehlerreport erstellen"; diff --git a/sources/extend/addon/matrix/buglink/lang/eo/strings.php b/sources/extend/addon/matrix/buglink/lang/eo/strings.php deleted file mode 100644 index 00d95a40..00000000 --- a/sources/extend/addon/matrix/buglink/lang/eo/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Skribi cimraporton"; diff --git a/sources/extend/addon/matrix/buglink/lang/es/strings.php b/sources/extend/addon/matrix/buglink/lang/es/strings.php deleted file mode 100644 index fe632488..00000000 --- a/sources/extend/addon/matrix/buglink/lang/es/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Informe de errores"; diff --git a/sources/extend/addon/matrix/buglink/lang/fr/strings.php b/sources/extend/addon/matrix/buglink/lang/fr/strings.php deleted file mode 100644 index 0075fb0d..00000000 --- a/sources/extend/addon/matrix/buglink/lang/fr/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Signaler un bug"; diff --git a/sources/extend/addon/matrix/buglink/lang/is/strings.php b/sources/extend/addon/matrix/buglink/lang/is/strings.php deleted file mode 100644 index 7b3823a6..00000000 --- a/sources/extend/addon/matrix/buglink/lang/is/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Tilkynna bilun"; diff --git a/sources/extend/addon/matrix/buglink/lang/it/strings.php b/sources/extend/addon/matrix/buglink/lang/it/strings.php deleted file mode 100644 index 90df28fe..00000000 --- a/sources/extend/addon/matrix/buglink/lang/it/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Segnala un Bug"; diff --git a/sources/extend/addon/matrix/buglink/lang/nb-no/strings.php b/sources/extend/addon/matrix/buglink/lang/nb-no/strings.php deleted file mode 100644 index ec212e9a..00000000 --- a/sources/extend/addon/matrix/buglink/lang/nb-no/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = ""; diff --git a/sources/extend/addon/matrix/buglink/lang/pl/strings.php b/sources/extend/addon/matrix/buglink/lang/pl/strings.php deleted file mode 100644 index 8229e7a6..00000000 --- a/sources/extend/addon/matrix/buglink/lang/pl/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "ZgÅ‚oÅ› problem"; diff --git a/sources/extend/addon/matrix/buglink/lang/pt-br/strings.php b/sources/extend/addon/matrix/buglink/lang/pt-br/strings.php deleted file mode 100644 index 6283d77e..00000000 --- a/sources/extend/addon/matrix/buglink/lang/pt-br/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Relate um Bug"; diff --git a/sources/extend/addon/matrix/buglink/lang/ru/strings.php b/sources/extend/addon/matrix/buglink/lang/ru/strings.php deleted file mode 100644 index c4223648..00000000 --- a/sources/extend/addon/matrix/buglink/lang/ru/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Report Bug"] = "Сообщить об ошибке"; diff --git a/sources/extend/addon/matrix/buglink/lang/sv/strings.php b/sources/extend/addon/matrix/buglink/lang/sv/strings.php deleted file mode 100644 index ab4fa67a..00000000 --- a/sources/extend/addon/matrix/buglink/lang/sv/strings.php +++ /dev/null @@ -1,2 +0,0 @@ -strings["Report Bug"] = "报案程åºé”™è¯¯"; diff --git a/sources/extend/addon/matrix/calc/calc.apd b/sources/extend/addon/matrix/calc/calc.apd deleted file mode 100644 index 8171ce06..00000000 --- a/sources/extend/addon/matrix/calc/calc.apd +++ /dev/null @@ -1,3 +0,0 @@ -url: $baseurl/calc -name: Calculator -photo: $baseurl/addon/calc/calc.png diff --git a/sources/extend/addon/matrix/calc/calc.php b/sources/extend/addon/matrix/calc/calc.php deleted file mode 100755 index 2935b4a2..00000000 --- a/sources/extend/addon/matrix/calc/calc.php +++ /dev/null @@ -1,368 +0,0 @@ - - */ - - -function calc_load() { - register_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu'); -} - -function calc_unload() { - unregister_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu'); - -} - -function calc_app_menu($a,&$b) { - $b['app_menu'][] = ''; -} - - -function calc_module() {} - - - - -function calc_init($a) { - -$x = <<< EOT - - - -EOT; -$a->page['htmlhead'] .= $x; -} - -function calc_content($app) { - -$o = ''; - -$o .= <<< EOT - - -

Calculator

-

- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
- -EOT; -return $o; - -} diff --git a/sources/extend/addon/matrix/calc/calc.png b/sources/extend/addon/matrix/calc/calc.png deleted file mode 100644 index e7d15c8c..00000000 Binary files a/sources/extend/addon/matrix/calc/calc.png and /dev/null differ diff --git a/sources/extend/addon/matrix/chords/README.md b/sources/extend/addon/matrix/chords/README.md deleted file mode 100644 index a45e9730..00000000 --- a/sources/extend/addon/matrix/chords/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Chord Generator -=============== - -Before enabling the plugin compile the chord generator binary. - - g++ chord-generator.cpp -o chord - -The example is for Linux. Compilation instructions may vary on Windows or other platforms. - diff --git a/sources/extend/addon/matrix/chords/chord b/sources/extend/addon/matrix/chords/chord deleted file mode 100755 index b6c8a495..00000000 Binary files a/sources/extend/addon/matrix/chords/chord and /dev/null differ diff --git a/sources/extend/addon/matrix/chords/chord-generator.cpp b/sources/extend/addon/matrix/chords/chord-generator.cpp deleted file mode 100755 index 6a7f2c09..00000000 --- a/sources/extend/addon/matrix/chords/chord-generator.cpp +++ /dev/null @@ -1,1133 +0,0 @@ -// -// I have been messing around with this program now for a couple weeks -// and thought it might be useful to someone. Given a chord by name, -// it generates all possible ways to play that chord on a guitar and -// scores them based on things like finger span, root as bass note, -// number of open strings, etc (see below). Then it prints the top -// 50 it found (or more, you can set it). The program is pretty -// configurable if you can stand to read the stuff at the top where -// all the #define's are. Currently it prints out the score, and the -// pieces that made up the score...you may want to get rid of the -// extra info, but I found it interesting. -// -// It generates some wild chords and some interesting versions that -// I have NEVER seen before. Probably a great program to find inversions -// and stuff (especially if you lower the score given for having a root -// note 1st). The program could easily be modified to do Drop D tuning -// or any other alternate tuning, and I think it could do other instruments -// without much change, but I have not tried. -// -// I have been having fun playing with this, if you make a changes or -// fixes I would appreciate a copy. Other than that, this is public -// domain, have a party. Oh yeah, the code is C++... -// -// Thanks, -// Rick Eesley -// re@warren.mentorg.com -// -// -// -// Chords can be built like: | = seperate fields, [ ... ] = range of values -// <> = nothing -// -// [<--optional--->] -// [<--repeating-->] -// [A...G] | <> | <> | <> | # | -// | # | min | maj | | -// | b | m | add | | -// | | sus2 | aug | | -// | | sus4 | dim | | -// | | dim | + | | -// | | aug | - | | -// | | | # | -// | | | b | -// | | | / | -// -// Legal chord names: A A7 Amaj7 Amaj9 Ammaj7 Aadd4 Asus2Add4 E7b13b11 ... -// Does not do: C/G which is a c chord with a g root, just find a c -// chord and pick out a g root you like for those... -// Does not do: E5 (that's not a chord, just 2 notes) -// -// - - -#undef DEBUG -int lefty = 0; - -////////////////////////////////////////////////////////////////////// -// Scoring a chord is influenced by these multipliers, change them around -// to your own preferences -////////////////////////////////////////////////////////////////////// - -// -// Score for where this lands on the fretboard (Lower is better) -// score += (15 - AverageFret) * POSITION_SCORE; -#define POSITION_SCORE 20 - -// Score for minimal span (ie: chord covering from fret 2 to fret 4 has -// a span of 2. Open strings do NOT count in span, this is a measure -// of whether a chord is playable -// The maximum span allowed is set by the #define MAXSPAN -// score += (MAXSPAN - span) * SPAN_SCORE; -#define SPAN_SCORE 12 - -// This score is for total Span (ie: includes open strings, which span -// does not. -// score += (15 - tspan) * TSPAN_SCORE; -#define TSPAN_SCORE 3 - -// This score is for number of open strings (I like them). -// score += numberOfOpens * OPENS_SCORE -#define OPENS_SCORE 10 - -// This score multiplier is the score to add if the most bass string -// is the root note -// score += ROOT_SCORE -#define ROOT_SCORE 50 - -// This score multipier is used to penalize for adjacent notes -// score += ADJ_SCORE * (5-adjNotes) -// THe five is the max number of adjacent strings possible (duh...) -#define ADJ_SCORE 9 - -// This is the maximum finger reach, if this is bumped up to five or -// more you get a zillion more fingers (mainly 'cause 5 takes you to -// the notes on the next string...so leave it probably -#define MAXSPAN 4 - -// This is number of top scores to keep, something < 20 leaves out -// too much, 100 is a lot to look at...but I am going with it... -#define CHORDSTACK 250 - -// -// These are different types of scores, NUMSCORETYPES MUST be set to the -// number of these types, so if any are added change it TOO! -// Add any new scores onto the end, the total MUST be the 0th element -// -#define NUMSCORETYPES 7 - -#define SCORE_TOTAL 0 -#define SCORE_SPAN 1 -#define SCORE_TOTALSPAN 2 -#define SCORE_OPENSTRINGS 3 -#define SCORE_FIRSTROOT 4 -#define SCORE_LOWONNECK 5 -#define SCORE_ADJNOTES 6 - -// Just in case someone wants to port this to banjo or mandolin or something -#define NUM_STRINGS 6 - - -#include -#include -#include -#include - -/* A A# B C C# D D# E F F# G G# */ -/* A Bb B C Db D Eb E F Gb G Ab */ -/* 0 1 2 3 4 5 6 7 8 9 10 11 */ - -/* STRINGS ARE: E=0, A=1, D=2, G=3, B=4, E=5 IN ORDER */ - -// This can be reset for alternate tunings, this is EADGBE tuning -// here: - - int openStrings[NUM_STRINGS] = { 7, 0, 5, 10, 2, 7 }; - -static char *strNotes[] = { "A ", "A#", "B ", "C ", "C#", "D ", - "D#", "E ", "F ", "F#", "G ", "G#" }; - -// -// This class contains a decode chord, and can take a string and turn -// it into a chord. A chord is a triad or greater here. The code is -// decoded from a string into notes in the c array (notes: are A=0, A#=1, -// and so on. The longest chord you can possibly have is 12 notes which -// would be every note in an octave, since chords are typical 3 to 5 -// notes, remaining notes in the c[] array are set to -1 -// -class Chord -{ - public: - // String set to last error - char errorStr[64]; - - // Notes that are in the chord -1 should be ignored - int notes[12]; - - // NOtes that are optional have a 1, otherwise a zero - int optional[12]; - - // ------------------ MEMBER FUNCTIONS ---------------------------- - - // Clears last chord - void clear(); - - // Decodes input string into notes[] array, return error string - int findChord(char *s); - - // Print last error message from chord parse - void printError(); - - // Prints out notes[] array to screen - void print(char *chordName); - - // Is the note note in the chord - int inChord(int note); - - // Is this chord covered by the array of notes (ie: Does the - // array contain all the notes of the chord - int covered(int *noteArray); - - // Return the root note of the chord - int getRoot() { return notes[0]; } - - // Given a chord string, return the note that starts it (and recognize - // sharps and flats (b and #) - int get_base(char *s); - - // Get a note offset from another... - int note_offset(int base, int offset) { - if((! base) && (offset == (-1))) - return(11); - return ((base + offset) % 12); - } -} ; - -// -// This class holds a fingering for a chord, as well as a score for that -// fingering. This class also keeps the CHORDSTACK (ie: 100) best version -// of that chord to print out in sorted order (best score 1st). -// -class Fretboard -{ - public: - - // Score of current chord, held in an array so we can track the - // components of the score (see the SCORE_ defines in the begining - // of this file - int score[NUMSCORETYPES]; - - // Fretboard of the current chord, fretboard[0] is the low (bass) E - // string. A fretboard value of 0 is an open string, -1 is an - // X'ed out string (not strung) - int fretboard[NUM_STRINGS]; - - // Notes of the current fretboard fingering for a chord - int notes[NUM_STRINGS]; - - // The best fret layouts so far based on score - int bestFrets[CHORDSTACK][NUM_STRINGS]; - - // The best fret layout note sets so far based on score - int bestNotes[CHORDSTACK][NUM_STRINGS]; - - // The best scores - int bestScores[CHORDSTACK][NUMSCORETYPES]; - - // Keep track of stack sDepth to speed it up! - int sDepth; - - // ------------------ MEMBER FUNCTIONS ---------------------------- - - // Construct one - Fretboard(); - - // Given a chord (and the current fretboard state) score this doggie - // and leave the score value in score - void getScore(Chord &chord); - - // Print the current Fretboard state (not the stack) - void print(); - - // Print the fretboard stack - void printStack(); - - // Iterate over different fretboard variations for a chord - void iterate(Chord &chord); - - // Take the current fretboard state and put it into the stack - void addToBest(); - - // Get the span of the current chord, excluding open string - int getSpan(); - - // Get the span of the current chord, INCLUDING open string - int getTotalSpan(); -}; - -// -// Before building a chord, clear the notes and optional arrays -// -void -Chord::clear() -{ - for (int i = 0; i < 12; i++) - { - notes[i] = -1; - optional[i] = 0; - } -} - -// -// Print out the last error string -// -void -Chord::printError() -{ - printf("Error: %s\n", errorStr); -} - -// -// I dunno, our C++ compiler at work did not have strupr, so heres mine -// -void -myStrupr(char *s) -{ - while (*s) - { - if (islower(*s)) - *s = toupper(*s); - s++; - } -} - -// -// Decodes input string into notes[] array, return error string -// always: 0 = root, 1 = 3rd, 2 = 5th -// Also sets the optional array in parallel with the notes[] -// -int -Chord::findChord(char *s) -{ - clear(); - - // up case the string - myStrupr(s); - - // DECODE ROOT NOTE : A - G - notes[0] = get_base(s); - s++; - - // CHECK FOR SHARP OR FLAT ROOT NOTE - if (*s == '#') s++; - if (*s == 'B') s++; - - // MODIFY THE ROOT BY M, MIN, SUS2, SUS4, or diminished - if (!strncmp(s, "MIN", 3 )) - { - notes[1] = note_offset(notes[0], 3); - s += 3; - optional[2] = 1; - } - else if (!strncmp(s, "MAJ", 3)) - { - // Do nothing, but stops program from seeing the - // first m in maj as a minor (see next line)...so give a normal 3rd - notes[1] = note_offset(notes[0], 4); - optional[2] = 1; - } - else if (!strncmp(s, "M", 1)) - { - notes[1] = note_offset(notes[0], 3); - s += 1; - optional[2] = 1; - } - else if (!strncmp(s, "SUS", 1)) - { - s += 3; // go past sus - if (*s == '2') - notes[1] = note_offset(notes[0], 2); - else if (*s == '4') - notes[1] = note_offset(notes[0], 5); - else - { - strcpy(errorStr, "sus must be followed by 2 or 4"); - return 1; - } - s++; // Go past 2 or 4 - optional[2] = 1; - } - else if ((!strncmp(s, "DIM", 3 )) && (!isdigit(s[3]))) - { - // If it is diminished, just return (no other stuff allowed)/ - notes[1] = note_offset(notes[0], 3); - notes[2] = note_offset(notes[0], 6); - notes[3] = note_offset(notes[0], 9); - return 0; - } - else if ((!strncmp(s, "AUG", 3 )) && (!isdigit(s[3]))) - { - // If it is diminished, just return (no other stuff allowed)/ - notes[1] = note_offset(notes[0], 4); - notes[2] = note_offset(notes[0], 8); - return 0; - } - else - { - notes[1] = note_offset(notes[0], 4); - // optional[1] = 1; - // optional[2] = 1; - } - - notes[2] = note_offset(notes[0], 7); - - - // At this point, the 1,3,5 triad or variant is built, now add onto - // it until the string end is reached... - // Next note to add is index = 3... - int index = 3; - enum homeboy { NORMAL, MAJ, ADD, AUG, DIM } mtype ; - char lbuf[10]; - - while (*s) - { - // FIrst, check the mtype of modifier, ie: Aug, Maj, etc... - mtype = NORMAL; - if (!strncmp(s, "MAJ", 3)) - { - mtype = MAJ; - s += 3; - } - else if (!strncmp(s, "ADD", 3)) - { - mtype = ADD; - s += 3; - } - else if (!strncmp(s, "AUG", 3)) - { - mtype = AUG ; - s += 3; - } - else if (!strncmp(s, "DIM", 3)) - { - mtype = DIM; - s += 3; - } - else if ( *s == '+' ) - { - mtype = AUG; - s += 1; - } - else if ( *s == '-' ) - { - mtype = DIM; - s += 1; - } - else if ( *s == '#' ) - { - mtype = AUG; - s += 1; - } - else if ( *s == 'B' ) - { - mtype = DIM; - s += 1; - } - else if ( *s == '/' ) - { - mtype = ADD; - s += 1; - } - // Now find the number... - if (isdigit(*s)) - { - lbuf[0] = *s++; - lbuf[1] = '\0'; - } - else - { - sprintf(errorStr, "Expecting number, got %s", s); - return 1; - } - // 2nd digit? - if (isdigit(*s)) - { - lbuf[1] = *s++; - lbuf[2] = '\0'; - } - - int number = atoi(lbuf); - - switch (number) - { - case 7 : - notes[index] = note_offset(notes[0], 10); - break; - case 9 : - notes[index] = note_offset(notes[0], 2); - - // put the 7th in 2nd so it can be maj'ed if need be... - if ((mtype == NORMAL) || (mtype == MAJ)) - { - index++; - notes[index] = note_offset(notes[0], 10); - optional[index] = 1; // 7th is optional, unless it is maj! - } - - break; - case 11 : - notes[index] = note_offset(notes[0], 5); - - // put the 7th in 2nd so it can be maj'ed if need be... - if ((mtype == NORMAL) || (mtype == MAJ)) - { - index++; - notes[index] = note_offset(notes[0], 10); - optional[index] = 1; // 7th is optional, unless it is maj! - } - - break; - case 13 : - notes[index] = note_offset(notes[0], 9); - index++; - notes[index] = note_offset(notes[0], 5); - optional[index] = 1; // 7th is optional, unless it is maj! - index++; - notes[index] = note_offset(notes[0], 2); - optional[index] = 1; // 7th is optional, unless it is maj! - - // put the 7th in 2nd so it can be maj'ed if need be... - if ((mtype == NORMAL) || (mtype == MAJ)) - { - index++; - notes[index] = note_offset(notes[0], 10); - optional[index] = 1; // 7th is optional, unless it is maj! - } - - break; - case 2: - notes[index] = note_offset(notes[0], 2); - break; - case 4: - notes[index] = note_offset(notes[0], 5); - break; - case 6: - notes[index] = note_offset(notes[0], 9); - break; - case 5: - notes[index] = note_offset(notes[0], 7); - break; - default: - sprintf(errorStr, "Cannot do number: %d\n", number); - return 1; - } - - switch (mtype) - { - case DIM: - notes[index] = note_offset(notes[index], -1); - break; - case MAJ: - // It is a major, so not optional - optional[index] = 0; - case AUG : - notes[index] = note_offset(notes[index], 1); - break; - case NORMAL: - case ADD: - break; - default: - break; - } - - index++; - } - return 0; -} - -// -// Print out chord by name -// -void -Chord::print(char *cname) -{ - printf("Notes for chord '%s': ", cname); - for (int i = 0; i < 12; i++) - { - if (notes[i] != -1) - printf("%s ", strNotes[notes[i]]); - } - printf("\n\n"); -} - -// -// Are all the notes in this chord covered by the notes in the -// noteArray, it is not necessary to cover the notes in the optional -// array of the chord -// -int -Chord::covered(int *noteArray) -{ - // noteArray is an array of notes this chord has, it is NUM_STRINGS notes - // long (like a guitar fretboard dude...unused notes may be set - // to -1 (which wont compare since -1 is tossed... - - for (int i = 0; i < 12; i++) - { - if (notes[i] != -1) - { - int gotIt = 0; - for (int j = 0; j < NUM_STRINGS; j++) - { - if (noteArray[j] == notes[i]) - { - gotIt = 1; - break; - } - } - // If it was not found, and it is NOT optional, then it is - // not covered - if ((gotIt == 0) && (optional[i] == 0)) - return 0; - } - } - return 1; -} - - -// -// Is the given note in the chord -// -int -Chord::inChord(int note) -{ - for (int i = 0; i < 12; i++) - { - // Check if we are off the end of the notes set - if (notes[i] == -1) - return 0; - // Check if the note was found - if (note == notes[i]) - return 1; - } - // Did not find out, return 0 - return 0; -} - -// -// Given a chord string, pick off the root (either C or C# or Cb)...and -// return that integer value (A = 0) -// -int -Chord::get_base(char *s) -{ - - static int halfsteps[] = { 0, 2, 3, 5, 7, 8, 10 }; - - if ((*s < 'A') || (*s > 'G')) - return 0; - - if (s[1] == '#') - return ( note_offset(halfsteps[s[0] - 'A'], 1)); - else if (s[1] == 'B') - return ( note_offset(halfsteps[s[0] - 'A'], -1)); - else - return ( halfsteps[s[0] - 'A']); -} - - -// -// Print out the current fretboard -// -void -Fretboard::print() -{ - printf("SCORE: %3d ", score[SCORE_TOTAL]); - printf( - " SPN: %2d TSPN: %2d OS: %2d ROOT: %2d LOW %2d ADJ %2d", - score[SCORE_SPAN], score[SCORE_TOTALSPAN], score[SCORE_OPENSTRINGS], - score[SCORE_FIRSTROOT], score[SCORE_LOWONNECK], - score[SCORE_ADJNOTES]); - - printf(" FB: "); - for (int i = 0; i < NUM_STRINGS; i++) - { - if (fretboard[i] != -1) - printf(" %2d", fretboard[i]); - else - printf(" X"); - } - - printf(" NT: "); - for (int i = 0; i < NUM_STRINGS; i++) - if (notes[i] != -1) - printf(" %s", strNotes[notes[i]]); - else - printf(" X "); - printf("\n"); -} - -// -// Construct a fretboard -- reset to the openStrings, clear the stack -// and reset all the bestScores to -1 -// -Fretboard::Fretboard() -{ - sDepth = 0; - score[0] = 0; - for (int i = 0; i < NUM_STRINGS; i++) - { - notes[i] = openStrings[i]; - fretboard[i] = 0; - } - for (int i = 0; i < CHORDSTACK; i++) - { - bestScores[i][0] = -1; - } -} - -// -// Get the span of this chord, don't count open strings -// -int -Fretboard::getSpan() -{ - int min = 100, max = 0; - for (int i = 0; i < NUM_STRINGS; i++) - { - // Dont count X strings or open strings - if (fretboard[i] <= 0) - continue; - if (fretboard[i] > max) max = fretboard[i]; - if (fretboard[i] < min) min = fretboard[i]; - } - if (min == 100) - // All open strings, took awhile to catch this bug - return 0; - else - return (max - min); -} - -// -// Get the span of this chord, DO count open strings -// -int -Fretboard::getTotalSpan() -{ - int min = 100, max = 0; - for (int i = 0; i < NUM_STRINGS; i++) - { - // Dont count X strings - if (fretboard[i] < 0) - continue; - if (fretboard[i] > max) max = fretboard[i]; - if (fretboard[i] < min) min = fretboard[i]; - } - if (min == -1) - min = 0; - return (max - min); -} - -// -// Add this chord to the best (if there is room in the stack) -// -void -Fretboard::addToBest() -{ - // CHORDSTACK is the sDepth of keepers... -#ifdef DEBUG - printf("ATB: "); - this->print(); -#endif - - int i; - - // NOTE: at the start, bestScores is full of -1's, so any reall - // real score will be better (worst score is 0) - for (i = 0; i < sDepth; i++) - { - if (score[0] > bestScores[i][0]) - break; - } - - // If score was not better than any in the stack just return - if (i >= CHORDSTACK) - return ; - // MOve down old guys to make room for the new guy - for (int j = CHORDSTACK - 1; j >= i; j--) - { - for (int q = 0; q < NUM_STRINGS; q++) - { - bestFrets[j][q] = bestFrets[j - 1][q]; - bestNotes[j][q] = bestNotes[j - 1][q]; - } - for (int q = 0; q < NUMSCORETYPES; q++) - bestScores[j][q] = bestScores[j - 1][q]; - } - - for (int q = 0; q < NUM_STRINGS; q++) - { - bestFrets[i][q] = fretboard[q]; - bestNotes[i][q] = notes[q]; - } - for (int q = 0; q < NUMSCORETYPES; q++) - bestScores[i][q] = score[q]; - - sDepth++; - if (sDepth > CHORDSTACK) - sDepth--; -} - -// -// Print out the stack to the screen -// -void -Fretboard::printStack() -{ - static char *strNotes[] = { "A ", "A#", "B ", "C ", "C#", "D ", - "D#", "E ", "F ", "F#", "G ", "G#" }; - - - for (int f = 0; f < sDepth; f++) - { - printf("\n\n "); - - if(lefty) { - for (int i = NUM_STRINGS - 1; i >= 0; i--) - if (bestNotes[f][i] != -1) - printf(" %s", strNotes[bestNotes[f][i]]); - else - printf(" X "); - } - else { - for (int i = 0; i < NUM_STRINGS; i++) - if (bestNotes[f][i] != -1) - printf(" %s", strNotes[bestNotes[f][i]]); - else - printf(" X "); - } - printf("\n"); - if(lefty) { - for (int i = NUM_STRINGS - 1; i >= 0; i--) - if (bestFrets[f][i] != -1) - printf(" %2d", bestFrets[f][i]); - else - printf(" X"); - - } - else { - for (int i = 0; i < NUM_STRINGS; i++) - - if (bestFrets[f][i] != -1) - printf(" %2d", bestFrets[f][i]); - else - printf(" X"); - } - - printf("\n\n"); - - - int highest = 0; - - for(int i = 0; i < NUM_STRINGS; i++) - if(bestFrets[f][i] > highest) - highest = bestFrets[f][i]; - - printf("\n"); - - for(int i = 0; i <= (highest + 1); i ++) { - if(lefty) { - for (int x = NUM_STRINGS-1; x >= 0; x--) { - if(i == 0) { - if(bestFrets[f][x] == -1) - printf(" X"); - else - if(bestFrets[f][x] == 0) - printf(" 0"); - else - printf(" "); - } - else { - if(bestFrets[f][x] == i) - printf(" *"); - else - printf(" |"); - } - } - } - else { - - for (int x = 0; x < NUM_STRINGS; x++) { - if(i == 0) { - if(bestFrets[f][x] == -1) - printf(" X"); - else - if(bestFrets[f][x] == 0) - printf(" 0"); - else - printf(" "); - } - else { - if(bestFrets[f][x] == i) - printf(" *"); - else - printf(" |"); - } - } - } - printf("\n ---------------- %2d\n",i); - - - - - } - } -} - - -// -// Get the score for this chord -// -void -Fretboard::getScore(Chord &chord) -{ - - // First, points for small span (excluding opens) - score[SCORE_SPAN] = (MAXSPAN - getSpan()) * SPAN_SCORE; - - // Then, points for small total span - score[SCORE_TOTALSPAN] = (15 - getTotalSpan()) * 3; - - score[SCORE_OPENSTRINGS] = 0; - // Points for open strings - for (int i = 0; i < NUM_STRINGS; i++) - { - if (fretboard[i] == 0) - { - score[SCORE_OPENSTRINGS] += OPENS_SCORE; - } - } - - // Points for first string being the root ... - score[SCORE_FIRSTROOT] = 0; - int i; - for (i = 0; (fretboard[i] == -1) && (i < NUM_STRINGS) ; i++) - ; - if (notes[i] == chord.getRoot()) - { - score[SCORE_FIRSTROOT] = ROOT_SCORE; - } - - // Points for being low on the neck... - int sum = 0, cnt = 0; - for (i = 0; i < NUM_STRINGS; i++) - { - // Don't count X strings or open strings - if (fretboard[i] > 0) - { - sum += fretboard[i]; - cnt++; - } - } - if (cnt) - score[SCORE_LOWONNECK] = (int)(15 - ((double) sum / (double) cnt)) - * POSITION_SCORE; - else - score[SCORE_LOWONNECK] = 15 * POSITION_SCORE; - - - int adjNotes = 0; - for (i = 0; i < 5; i++) - { - if ((notes[i] != -1) && (notes[i] == notes[i + 1])) - adjNotes++; - } - score[SCORE_ADJNOTES] = (ADJ_SCORE * (5 - adjNotes)); - - // FInally, total up the score - score[SCORE_TOTAL] = 0; - for (i = 1; i < NUMSCORETYPES; i++) - score[SCORE_TOTAL] += score[i]; -} - - -// -// Iterate over all fretboard config's for this chord, call addToBest -// with any good ones (ie: < span, etc etc...) -// -void -Fretboard::iterate(Chord &chord) -{ - int string = 0; - - // Start notes setup, increment up the neck for each string until - // you find a note that is in this chord (may be an open note) - for (int i = 0; i < NUM_STRINGS; i++) - { - while (! chord.inChord(notes[i])) - { - fretboard[i]++; - notes[i] = ( notes[i] + 1 ) % 12; - } - } - - // Back up the first note one...so the loop will work - fretboard[0] = -1; - - // While we are still on the fretboard! - while (string < NUM_STRINGS) - { - - // increment the current string - fretboard[string]++; - if (fretboard[string] == 0) - notes[string] = openStrings[string]; - else - notes[string] = ( notes[string] + 1 ) % 12; - - while (! chord.inChord(notes[string])) - { - fretboard[string]++; - notes[string] = ( notes[string] + 1 ) % 12; - } - - if (fretboard[string] > 15) - { - - // Before turning over the 3rd string from the bass, try - // to make a chord with the bass string, and 2nd from - // bass string X'ed out...(ie: set to -1) - if (string == 0) - { - - notes[0] = fretboard[0] = -1; - int span = getSpan(); - if ((span < MAXSPAN) && chord.covered(notes)) - { - getScore(chord); - addToBest(); - } - } - - if (string == 1) - { - int store = notes[0]; - int fstore = fretboard[0]; - notes[1] = fretboard[1] = -1; - notes[0] = fretboard[0] = -1; - int span = getSpan(); - if ((span < MAXSPAN) && chord.covered(notes)) - { - getScore(chord); - addToBest(); - } - // Restore the notes you X'ed out - notes[0] = store; - fretboard[0] = fstore; - } - - fretboard[string] = 0; - notes[string] = openStrings[string]; - while (! chord.inChord(notes[string])) - { - fretboard[string]++; - notes[string] = chord.note_offset(notes[string], 1); - } - string++; - continue; - } - -#ifdef DEBUG - printf("TRY: "); this->print(); -#endif - - string = 0; - int span = getSpan(); - if (span >= MAXSPAN) - { -#ifdef DEBUG - printf("Rejected for span\n"); -#endif - continue; - } - if (!chord.covered(notes)) - { -#ifdef DEBUG - printf("Rejected for coverage\n"); -#endif - continue; - } - - getScore(chord); - - addToBest(); - } -} - -// -// uh, main -// -int main(int argc, char **argv) -{ - char buf[256], buf2[256]; - - if(argc > 1) - { - strcpy(buf, argv[1]); - if(argc > 3) { - if(! strcmp(argv[3],"lefty")) { - lefty = 1; - - } - - - } - - if(argc > 2) { - if(! strcmp(argv[2],"dadgad")) { - openStrings[0] = 5; - openStrings[1] = 0; - openStrings[2] = 5; - openStrings[3] = 10; - openStrings[4] = 0; - openStrings[5] = 5; - } - if(! strcmp(argv[2],"openg")) { - openStrings[0] = 5; - openStrings[1] = 10; - openStrings[2] = 5; - openStrings[3] = 10; - openStrings[4] = 2; - openStrings[5] = 5; - - } - if(! strcmp(argv[2],"opene")) { - openStrings[0] = 7; - openStrings[1] = 2; - openStrings[2] = 7; - openStrings[3] = 11; - openStrings[4] = 2; - openStrings[5] = 7; - - } - if(! strcmp(argv[2],"lefty")) { - lefty = 1; - - } - } - - - // Allocate it for DOS/WINDOWS, to avoid stack overflow (weak) - Fretboard *fb = new Fretboard; ; - Chord chord; - - - // findChord upppercases the input string, so save a copy - strcpy(buf2, buf); - - if (chord.findChord(buf)) - { - chord.printError(); - - } - else { - chord.print(buf2); - fb->iterate(chord); - - fb->printStack(); - } - delete fb; - } - return 0; -} - diff --git a/sources/extend/addon/matrix/chords/chords.apd b/sources/extend/addon/matrix/chords/chords.apd deleted file mode 100644 index 2ab5b99d..00000000 --- a/sources/extend/addon/matrix/chords/chords.apd +++ /dev/null @@ -1,3 +0,0 @@ -url: $baseurl/chords -name: Guitar Chords -photo: $baseurl/addon/chords/chords.png diff --git a/sources/extend/addon/matrix/chords/chords.php b/sources/extend/addon/matrix/chords/chords.php deleted file mode 100755 index 93bdbd94..00000000 --- a/sources/extend/addon/matrix/chords/chords.php +++ /dev/null @@ -1,129 +0,0 @@ - - */ - - -function chords_load() { - register_hook('app_menu', 'addon/chords/chords.php', 'chords_app_menu'); -} - -function chords_unload() { - unregister_hook('app_menu', 'addon/chords/chords.php', 'chords_app_menu'); - -} - -function chords_app_menu($a,&$b) { - $b['app_menu'][] = ''; -} - - -function chords_module() {} - - -function chords_content($a) { - - -$o .= '

Guitar Chords

'; -$o .= 'The complete online guitar chord dictionary
'; -$args = ''; -$l = ''; - -if($_SERVER['REQUEST_METHOD'] == 'POST') { - if(isset($_POST['chord']) && strlen($_POST['chord'])) - $args .= escapeshellarg(ucfirst(trim($_POST['chord']))); - if((strlen($args)) && (isset($_POST['tuning'])) && (strlen($_POST['tuning']))) - $args .= ' '.escapeshellarg($_POST['tuning']); - if((strlen($args)) && (isset($_POST['lefty']))) - $args .= ' lefty'; -} - -if((! strlen($args)) && (! stristr(basename($_SERVER['QUERY_STRING']),'chords')) && strlen(basename($_SERVER['QUERY_STRING']))) - $args = escapeshellarg(ucfirst(basename($_SERVER['QUERY_STRING']))); - -$tunings = array("","openg", "opene", "dadgad"); -$tnames = array("Em11 [Standard] (EADGBE)", - "G/D [Drop D] (DGDGBD)","Open E (EBEG#BE)","Dsus4 (DADGAD)"); -$t = ((isset($_POST['tuning'])) ? $_POST['tuning'] : ''); -if(isset($_POST['lefty']) && $_POST['lefty'] == '1') - $l = 'checked="checked"'; - - $ch = ((isset($_POST['chord'])) ? $_POST['chord'] : ''); -$o .= <<< EOT - -
-Chord name: (ex: Em7) -  Tuning: -Left-Handed: -
- -
-

-EOT; - -if(strlen($args)) { - $o .= '
';
-  $o .= shell_exec("addon/chords/chord ".$args);
-  $o .=  '
'; -} -else { - -$o .= <<< EOT - -

-This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc. -

-

-Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements. -

-

-Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ... -

-Quick Reference:
- -EOT; - -$keys = array('A','Bb','B', 'C','Db','D','Eb','E','F','Gb','G','Ab'); -$o .= ''; -$o .= ""; -foreach($keys as $k) - $o .= ""; -$o .= ""; -foreach($keys as $k) - $o .= ""; -$o .= ""; -foreach($keys as $k) - $o .= ""; -$o .= ""; -$o .= "
$k
{$k}m
{$k}7
"; - -} - -return $o; - -} - - - - - - - - - - diff --git a/sources/extend/addon/matrix/chords/chords.png b/sources/extend/addon/matrix/chords/chords.png deleted file mode 100644 index 9427943f..00000000 Binary files a/sources/extend/addon/matrix/chords/chords.png and /dev/null differ diff --git a/sources/extend/addon/matrix/custom_home/README.md b/sources/extend/addon/matrix/custom_home/README.md deleted file mode 100644 index 10f8f867..00000000 --- a/sources/extend/addon/matrix/custom_home/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Configure a custom page to be used for a logged out user when viewing the home page. - -util/config system custom_home landingpage - -landingpage is a relative link. - -EG, util/config system custom_home channel/me will send logged out users to example.com/channel/me - -To set a random channel (replacing random_channel_home) use: - -util/config system custom_home random - diff --git a/sources/extend/addon/matrix/custom_home/custom_home.php b/sources/extend/addon/matrix/custom_home/custom_home.php deleted file mode 100644 index 5335f8a2..00000000 --- a/sources/extend/addon/matrix/custom_home/custom_home.php +++ /dev/null @@ -1,40 +0,0 @@ - - */ - - -function custom_home_load() { - register_hook('home_mod_content', 'addon/custom_home/custom_home.php', 'custom_home_home'); - logger("loaded custom_home"); -} - -function custom_home_unload() { - unregister_hook('home_mod_content', 'addon/custom_home/custom_home.php', 'custom_home_home'); - unregister_hook('home_content', 'addon/custom_home/custom_home.php', 'custom_home_home'); - logger("removed custom_home"); -} - -function custom_home_home(&$a, &$o){ - - $x = get_config('system','custom_home'); - if($x) { - if ($x == "random") { - $rand = db_getfunc('rand'); - $r = q("select channel_address from channel where channel_r_stream = 1 and channel_address != 'sys' order by $rand limit 1"); - $x = z_root() . '/channel/' . $r[0]['channel_address']; - } - else { - $x = z_root() . '/' . $x; - } - - goaway(zid($x)); - } - -//If nothing is set - return $o; -} - diff --git a/sources/extend/addon/matrix/diaspora/diaspora.php b/sources/extend/addon/matrix/diaspora/diaspora.php deleted file mode 100755 index 8501faa4..00000000 --- a/sources/extend/addon/matrix/diaspora/diaspora.php +++ /dev/null @@ -1,3329 +0,0 @@ -',''), - array('',''), - $msg['message']); - - - $parsed_xml = parse_xml_string($msg['message'],false); - - $xmlbase = $parsed_xml->post; - -// logger('diaspora_dispatch: ' . print_r($xmlbase,true), LOGGER_DATA); - - - if($xmlbase->request) { - $ret = diaspora_request($importer,$xmlbase->request); - } - elseif($xmlbase->status_message) { - $ret = diaspora_post($importer,$xmlbase->status_message,$msg); - } - elseif($xmlbase->profile) { - $ret = diaspora_profile($importer,$xmlbase->profile,$msg); - } - elseif($xmlbase->comment) { - $ret = diaspora_comment($importer,$xmlbase->comment,$msg); - } - elseif($xmlbase->like) { - $ret = diaspora_like($importer,$xmlbase->like,$msg); - } - elseif($xmlbase->asphoto) { - $ret = diaspora_asphoto($importer,$xmlbase->asphoto,$msg); - } - elseif($xmlbase->reshare) { - $ret = diaspora_reshare($importer,$xmlbase->reshare,$msg); - } - elseif($xmlbase->retraction) { - $ret = diaspora_retraction($importer,$xmlbase->retraction,$msg); - } - elseif($xmlbase->signed_retraction) { - $ret = diaspora_signed_retraction($importer,$xmlbase->signed_retraction,$msg); - } - elseif($xmlbase->relayable_retraction) { - $ret = diaspora_signed_retraction($importer,$xmlbase->relayable_retraction,$msg); - } - elseif($xmlbase->photo) { - $ret = diaspora_photo($importer,$xmlbase->photo,$msg); - } - elseif($xmlbase->conversation) { - $ret = diaspora_conversation($importer,$xmlbase->conversation,$msg); - } - elseif($xmlbase->message) { - $ret = diaspora_message($importer,$xmlbase->message,$msg); - } - else { - logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true)); - } - return $ret; -} - - -function diaspora_is_blacklisted($s) { - - $bl1 = get_config('system','blacklisted_sites'); - if(is_array($bl1) && $bl1) { - foreach($bl1 as $bl) { - if($bl && strpos($s,$bl) !== false) { - logger('diaspora_is_blacklisted: blacklisted ' . $s); - return true; - } - } - } - return false; -} - -function diaspora_process_outbound(&$a, &$arr) { - -/* - - We are passed the following array from the notifier, providing everything we need to make delivery decisions. - - $arr = array( - 'channel' => $channel, - 'env_recips' => $env_recips, - 'recipients' => $recipients, - 'item' => $item, - 'target_item' => $target_item, - 'hub' => $hub, - 'top_level_post' => $top_level_post, - 'private' => $private, - 'followup' => $followup, - 'relay_to_owner' => $relay_to_owner, - 'uplink' => $uplink, - 'cmd' => $cmd, - 'expire' => $expire, - 'mail' => $mail, - 'location' => $location, - 'fsuggest' => $fsuggest, - 'normal_mode' => $normal_mode, - 'packet_type' => $packet_type, - 'walltowall' => $walltowall, - ); -*/ - - - // allow this to be set per message - - if(strpos($arr['target_item']['postopts'],'nodspr') !== false) - return; - - $allowed = get_pconfig($arr['channel']['channel_id'],'system','diaspora_allowed'); - - if(! intval($allowed)) { - logger('mod-diaspora: disallowed for channel ' . $arr['channel']['channel_name']); - return; - } - - - if($arr['location']) - return; - - - $target_item = $arr['target_item']; - - if($target_item && array_key_exists('item_obscured',$target_item) && intval($target_item['item_obscured'])) { - $key = get_config('system','prvkey'); - if($target_item['title']) - $target_item['title'] = crypto_unencapsulate(json_decode($target_item['title'],true),$key); - if($target_item['body']) - $target_item['body'] = crypto_unencapsulate(json_decode($target_item['body'],true),$key); - } - - - - if($arr['env_recips']) { - $hashes = array(); - - // re-explode the recipients, but only for this hub/pod - - foreach($arr['env_recips'] as $recip) - $hashes[] = "'" . $recip['hash'] . "'"; - - $r = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_url = '%s' - and xchan_hash in (" . implode(',', $hashes) . ") and xchan_network in ('diaspora', 'friendica-over-diaspora') ", - dbesc($arr['hub']['hubloc_url']) - ); - - if(! $r) { - logger('diaspora_process_outbound: no recipients'); - return; - } - - foreach($r as $contact) { - - if($arr['mail']) { - diaspora_send_mail($arr['item'],$arr['channel'],$contact); - continue; - } - - if(! $arr['normal_mode']) - continue; - - // special handling for followup to public post - // all other public posts processed as public batches further below - - if((! $arr['private']) && ($arr['followup'])) { - diaspora_send_followup($target_item,$arr['channel'],$contact, true); - continue; - } - - if(! $contact['xchan_pubkey']) - continue; - - if(intval($target_item['item_deleted']) - && (($target_item['mid'] === $target_item['parent_mid']) || $arr['followup'])) { - // send both top-level retractions and relayable retractions for owner to relay - diaspora_send_retraction($target_item,$arr['channel'],$contact); - continue; - } - elseif($arr['followup']) { - // send comments and likes to owner to relay - diaspora_send_followup($target_item,$arr['channel'],$contact); - continue; - } - - elseif($target_item['mid'] !== $target_item['parent_mid']) { - // we are the relay - send comments, likes and relayable_retractions - // (of comments and likes) to our conversants - diaspora_send_relay($target_item,$arr['channel'],$contact); - continue; - } - elseif($arr['top_level_post']) { - diaspora_send_status($target_item,$arr['channel'],$contact); - continue; - } - } - } - else { - // public message - - $contact = $arr['hub']; - - if(intval($target_item['item_deleted']) - && ($target_item['mid'] === $target_item['parent_mid'])) { - // top-level retraction - logger('delivery: diaspora retract: ' . $loc); - diaspora_send_retraction($target_item,$arr['channel'],$contact,true); - return; - } - elseif($target_item['mid'] !== $target_item['parent_mid']) { - // we are the relay - send comments, likes and relayable_retractions to our conversants - logger('delivery: diaspora relay: ' . $loc); - diaspora_send_relay($target_item,$arr['channel'],$contact,true); - return; - } - elseif($arr['top_level_post']) { - logger('delivery: diaspora status: ' . $loc); - diaspora_send_status($target_item,$arr['channel'],$contact,true); - return; - } - - } - -} - - -function diaspora_handle_from_contact($contact_hash) { - - logger("diaspora_handle_from_contact: contact id is " . $contact_hash, LOGGER_DEBUG); - - $r = q("SELECT xchan_addr from xchan where xchan_hash = '%s' limit 1", - dbesc($contact_hash) - ); - if($r) { - return $r[0]['xchan_addr']; - } - return false; -} - -function diaspora_get_contact_by_handle($uid,$handle) { - - if(diaspora_is_blacklisted($handle)) - return false; - require_once('include/identity.php'); - - $sys = get_sys_channel(); - if(($sys) && ($sys['channel_id'] == $uid)) { - $r = q("SELECT * FROM xchan where xchan_addr = '%s' limit 1", - dbesc($handle) - ); - } - else { - $r = q("SELECT * FROM abook left join xchan on xchan_hash = abook_xchan where xchan_addr = '%s' and abook_channel = %d limit 1", - dbesc($handle), - intval($uid) - ); - } - - return (($r) ? $r[0] : false); -} - -function find_diaspora_person_by_handle($handle) { - - $person = false; - $refresh = false; - - if(diaspora_is_blacklisted($handle)) - return false; - - $r = q("select * from xchan where xchan_addr = '%s' limit 1", - dbesc($handle) - ); - if($r) { - $person = $r[0]; - logger('find_diaspora_person_by handle: in cache ' . print_r($r,true), LOGGER_DATA); - if($person['xchan_name_date'] < datetime_convert('UTC','UTC', 'now - 1 month')) { - logger('Updating Diaspora cached record for ' . $handle); - $refresh = true; - } - } - - if((! $person) || ($refresh)) { - - // try webfinger. Make sure to distinguish between diaspora, - // hubzilla w/diaspora protocol and friendica w/diaspora protocol. - - $result = discover_by_webbie($handle); - if($result) { - $r = q("select * from xchan where xchan_addr = '%s' limit 1", - dbesc(str_replace('acct:','',$handle)) - ); - if($r) { - $person = $r[0]; - logger('find_diaspora_person_by handle: discovered ' . print_r($r,true), LOGGER_DATA); - } - } - } - - return $person; -} - - -function get_diaspora_key($handle) { - logger('Fetching diaspora key for: ' . $handle, LOGGER_DEBUG); - $r = find_diaspora_person_by_handle($handle); - return(($r) ? $r['xchan_pubkey'] : ''); -} - - -function diaspora_pubmsg_build($msg,$channel,$contact,$prvkey,$pubkey) { - - $a = get_app(); - - logger('diaspora_pubmsg_build: ' . $msg, LOGGER_DATA); - - $handle = $channel['channel_address'] . '@' . get_app()->get_hostname(); - - - $b64url_data = base64url_encode($msg,false); - - $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data); - - $type = 'application/xml'; - $encoding = 'base64url'; - $alg = 'RSA-SHA256'; - - $signable_data = $data . '.' . base64url_encode($type,false) . '.' - . base64url_encode($encoding,false) . '.' . base64url_encode($alg,false) ; - - $signature = rsa_sign($signable_data,$prvkey); - $sig = base64url_encode($signature,false); - -$magic_env = <<< EOT - - -
- $handle -
- - base64url - RSA-SHA256 - $data - $sig - -
-EOT; - - logger('diaspora_pubmsg_build: magic_env: ' . $magic_env, LOGGER_DATA); - return $magic_env; - -} - - - - -function diaspora_msg_build($msg,$channel,$contact,$prvkey,$pubkey,$public = false) { - $a = get_app(); - - if($public) - return diaspora_pubmsg_build($msg,$channel,$contact,$prvkey,$pubkey); - - logger('diaspora_msg_build: ' . $msg, LOGGER_DATA); - - // without a public key nothing will work - - if(! $pubkey) { - logger('diaspora_msg_build: pubkey missing: contact id: ' . $contact['abook_id']); - return ''; - } - - $inner_aes_key = random_string(32); - $b_inner_aes_key = base64_encode($inner_aes_key); - $inner_iv = random_string(16); - $b_inner_iv = base64_encode($inner_iv); - - $outer_aes_key = random_string(32); - $b_outer_aes_key = base64_encode($outer_aes_key); - $outer_iv = random_string(16); - $b_outer_iv = base64_encode($outer_iv); - - $handle = $channel['channel_address'] . '@' . get_app()->get_hostname(); - - $padded_data = pkcs5_pad($msg,16); - $inner_encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $padded_data, MCRYPT_MODE_CBC, $inner_iv); - - $b64_data = base64_encode($inner_encrypted); - - - $b64url_data = base64url_encode($b64_data,false); - $data = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data); - - $type = 'application/xml'; - $encoding = 'base64url'; - $alg = 'RSA-SHA256'; - - $signable_data = $data . '.' . base64url_encode($type,false) . '.' - . base64url_encode($encoding,false) . '.' . base64url_encode($alg,false) ; - - logger('diaspora_msg_build: signable_data: ' . $signable_data, LOGGER_DATA); - - $signature = rsa_sign($signable_data,$prvkey); - $sig = base64url_encode($signature,false); - -$decrypted_header = <<< EOT - - $b_inner_iv - $b_inner_aes_key - $handle - -EOT; - - $decrypted_header = pkcs5_pad($decrypted_header,16); - - $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $outer_aes_key, $decrypted_header, MCRYPT_MODE_CBC, $outer_iv); - - $outer_json = json_encode(array('iv' => $b_outer_iv,'key' => $b_outer_aes_key)); - - $encrypted_outer_key_bundle = ''; - openssl_public_encrypt($outer_json,$encrypted_outer_key_bundle,$pubkey); - - $b64_encrypted_outer_key_bundle = base64_encode($encrypted_outer_key_bundle); - - logger('outer_bundle: ' . $b64_encrypted_outer_key_bundle . ' key: ' . $pubkey, LOGGER_DATA); - - $encrypted_header_json_object = json_encode(array('aes_key' => base64_encode($encrypted_outer_key_bundle), - 'ciphertext' => base64_encode($ciphertext))); - $cipher_json = base64_encode($encrypted_header_json_object); - - $encrypted_header = '' . $cipher_json . ''; - -$magic_env = <<< EOT - - - $encrypted_header - - base64url - RSA-SHA256 - $data - $sig - - -EOT; - - logger('diaspora_msg_build: magic_env: ' . $magic_env, LOGGER_DATA); - return $magic_env; - -} - -/** - * - * diaspora_decode($importer,$xml) - * array $importer -> from user table - * string $xml -> urldecoded Diaspora salmon - * - * Returns array - * 'message' -> decoded Diaspora XML message - * 'author' -> author diaspora handle - * 'key' -> author public key (converted to pkcs#8) - * - * Author and key are used elsewhere to save a lookup for verifying replies and likes - */ - - -function diaspora_decode($importer,$xml) { - - $public = false; - $basedom = parse_xml_string($xml); - - $children = $basedom->children('https://joindiaspora.com/protocol'); - - if($children->header) { - $public = true; - $author_link = str_replace('acct:','',$children->header->author_id); - } - else { - - $encrypted_header = json_decode(base64_decode($children->encrypted_header)); - - $encrypted_aes_key_bundle = base64_decode($encrypted_header->aes_key); - $ciphertext = base64_decode($encrypted_header->ciphertext); - - $outer_key_bundle = ''; - openssl_private_decrypt($encrypted_aes_key_bundle,$outer_key_bundle,$importer['channel_prvkey']); - - $j_outer_key_bundle = json_decode($outer_key_bundle); - - $outer_iv = base64_decode($j_outer_key_bundle->iv); - $outer_key = base64_decode($j_outer_key_bundle->key); - - $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $outer_key, $ciphertext, MCRYPT_MODE_CBC, $outer_iv); - - - $decrypted = pkcs5_unpad($decrypted); - - /** - * $decrypted now contains something like - * - * - * 8e+G2+ET8l5BPuW0sVTnQw== - * UvSMb4puPeB14STkcDWq+4QE302Edu15oaprAQSkLKU= - -***** OBSOLETE - - * - * Ryan Hughes - * acct:galaxor@diaspora.pirateship.org - * - -***** CURRENT - - * galaxor@diaspora.priateship.org - -***** END DIFFS - - * - */ - - logger('decrypted: ' . $decrypted, LOGGER_DATA); - $idom = parse_xml_string($decrypted,false); - - $inner_iv = base64_decode($idom->iv); - $inner_aes_key = base64_decode($idom->aes_key); - - $author_link = str_replace('acct:','',$idom->author_id); - - } - - $dom = $basedom->children(NAMESPACE_SALMON_ME); - - // figure out where in the DOM tree our data is hiding - - if($dom->provenance->data) - $base = $dom->provenance; - elseif($dom->env->data) - $base = $dom->env; - elseif($dom->data) - $base = $dom; - - if(! $base) { - logger('mod-diaspora: unable to locate salmon data in xml '); - http_status_exit(400); - } - - - // Stash the signature away for now. We have to find their key or it won't be good for anything. - $signature = base64url_decode($base->sig); - - // unpack the data - - // strip whitespace so our data element will return to one big base64 blob - $data = str_replace(array(" ","\t","\r","\n"),array("","","",""),$base->data); - - - // stash away some other stuff for later - - $type = $base->data[0]->attributes()->type[0]; - $keyhash = $base->sig[0]->attributes()->keyhash[0]; - $encoding = $base->encoding; - $alg = $base->alg; - - $signed_data = $data . '.' . base64url_encode($type,false) . '.' . base64url_encode($encoding,false) . '.' . base64url_encode($alg,false); - - - // decode the data - $data = base64url_decode($data); - - - if($public) { - $inner_decrypted = $data; - } - else { - - // Decode the encrypted blob - - $inner_encrypted = base64_decode($data); - $inner_decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $inner_encrypted, MCRYPT_MODE_CBC, $inner_iv); - $inner_decrypted = pkcs5_unpad($inner_decrypted); - } - - if(! $author_link) { - logger('mod-diaspora: Could not retrieve author URI.'); - http_status_exit(400); - } - - // Once we have the author URI, go to the web and try to find their public key - // (first this will look it up locally if it is in the fcontact cache) - // This will also convert diaspora public key from pkcs#1 to pkcs#8 - - logger('mod-diaspora: Fetching key for ' . $author_link ); - $key = get_diaspora_key($author_link); - - if(! $key) { - logger('mod-diaspora: Could not retrieve author key.'); - http_status_exit(400); - } - - $verify = rsa_verify($signed_data,$signature,$key); - - if(! $verify) { - logger('mod-diaspora: Message did not verify. Discarding.'); - http_status_exit(400); - } - - logger('mod-diaspora: Message verified.'); - - return array('message' => $inner_decrypted, 'author' => $author_link, 'key' => $key); - -} - - -/* sender is now sharing with recipient */ - -function diaspora_request($importer,$xml) { - - $a = get_app(); - - $sender_handle = unxmlify($xml->sender_handle); - $recipient_handle = unxmlify($xml->recipient_handle); - - if(! $sender_handle || ! $recipient_handle) - return; - - - // Do we already have an abook record? - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$sender_handle); - - if($contact && $contact['abook_id']) { - - // perhaps we were already sharing with this person. Now they're sharing with us. - // That makes us friends. Maybe. - - // Please note some of these permissions such as PERMS_R_PAGES are impossible for Disapora. - // They cannot authenticate to our system. - - $newperms = PERMS_R_STREAM|PERMS_R_PROFILE|PERMS_R_PHOTOS|PERMS_R_ABOOK|PERMS_W_STREAM|PERMS_W_COMMENT|PERMS_W_MAIL|PERMS_W_CHAT|PERMS_R_STORAGE|PERMS_R_PAGES; - - $r = q("update abook set abook_their_perms = %d where abook_id = %d and abook_channel = %d", - intval($newperms), - intval($contact['abook_id']), - intval($importer['channel_id']) - ); - - return; - } - - $ret = find_diaspora_person_by_handle($sender_handle); - - if((! $ret) || (! strstr($ret['xchan_network'],'diaspora'))) { - logger('diaspora_request: Cannot resolve diaspora handle ' . $sender_handle . ' for ' . $recipient_handle); - return; - } - - -//FIXME -/* - if(feature_enabled($channel['channel_id'],'premium_channel')) { - $myaddr = $importer['channel_address'] . '@' . get_app()->get_hostname(); - $cnv = random_string(); - $mid = random_string(); - - $msg = t('You have started sharing with a $Projectname premium channel.'); - $msg .= t('$Projectname premium channels are not available for sharing with Diaspora members. This sharing request has been blocked.') . "\r"; - - $msg .= t('Please do not reply to this message, as this channel is not sharing with you and any reply will not be seen by the recipient.') . "\r"; - - $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C'); - $signed_text = $mid . ';' . $cnv . ';' . $msg . ';' - . $created . ';' . $myaddr . ';' . $cnv; - - $sig = base64_encode(rsa_sign($signed_text,$importer['channel_prvkey'],'sha256')); - - $conv = array( - 'guid' => xmlify($cnv), - 'subject' => xmlify(t('Sharing request failed.')), - 'created_at' => xmlify($created), - 'diaspora_handle' => xmlify($myaddr), - 'participant_handles' => xmlify($myaddr . ';' . $sender_handle) - ); - - $msg = array( - 'guid' => xmlify($mid), - 'parent_guid' => xmlify($cnv), - 'parent_author_signature' => xmlify($sig), - 'author_signature' => xmlify($sig), - 'text' => xmlify($msg), - 'created_at' => xmlify($created), - 'diaspora_handle' => xmlify($myaddr), - 'conversation_guid' => xmlify($cnv) - ); - - $conv['messages'] = array($msg); - $tpl = get_markup_template('diaspora_conversation.tpl'); - $xmsg = replace_macros($tpl, array('$conv' => $conv)); - - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($xmsg,$importer,$ret,$importer['channel_prvkey'],$ret['xchan_pubkey'],false))); - - diaspora_transmit($importer,$ret,$slap,false); - return; - } - -*/ -// End FIXME - - - $role = get_pconfig($channel['channel_id'],'system','permissions_role'); - if($role) { - $x = get_role_perms($role); - if($x['perms_auto']) - $default_perms = $x['perms_accept']; - } - if(! $default_perms) - $default_perms = intval(get_pconfig($importer['channel_id'],'system','autoperms')); - - $their_perms = PERMS_R_STREAM|PERMS_R_PROFILE|PERMS_R_PHOTOS|PERMS_R_ABOOK|PERMS_W_STREAM|PERMS_W_COMMENT|PERMS_W_MAIL|PERMS_W_CHAT|PERMS_R_STORAGE|PERMS_R_PAGES; - - - $closeness = get_pconfig($importer['channel_id'],'system','new_abook_closeness'); - if($closeness === false) - $closeness = 80; - - - $r = q("insert into abook ( abook_account, abook_channel, abook_xchan, abook_my_perms, abook_their_perms, abook_closeness, abook_created, abook_updated, abook_connected, abook_dob, abook_pending) values ( %d, %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', %d )", - intval($importer['channel_account_id']), - intval($importer['channel_id']), - dbesc($ret['xchan_hash']), - intval($default_perms), - intval($their_perms), - intval($closeness), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc(NULL_DATE), - intval(($default_perms) ? 0 : 1) - ); - - - if($r) { - logger("New Diaspora introduction received for {$importer['channel_name']}"); - - $new_connection = q("select * from abook left join xchan on abook_xchan = xchan_hash left join hubloc on hubloc_hash = xchan_hash where abook_channel = %d and abook_xchan = '%s' order by abook_created desc limit 1", - intval($importer['channel_id']), - dbesc($ret['xchan_hash']) - ); - if($new_connection) { - require_once('include/enotify.php'); - notification(array( - 'type' => NOTIFY_INTRO, - 'from_xchan' => $ret['xchan_hash'], - 'to_xchan' => $importer['channel_hash'], - 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id'], - )); - - - if($default_perms) { - // Send back a sharing notification to them - diaspora_share($importer,$new_connection[0]); - - } - - $clone = array(); - foreach($new_connection[0] as $k => $v) { - if(strpos($k,'abook_') === 0) { - $clone[$k] = $v; - } - } - unset($clone['abook_id']); - unset($clone['abook_account']); - unset($clone['abook_channel']); - - build_sync_packet($importer['channel_id'], array('abook' => array($clone))); - - } - } - - // find the abook record we just created - - $contact_record = diaspora_get_contact_by_handle($importer['channel_id'],$sender_handle); - - if(! $contact_record) { - logger('diaspora_request: unable to locate newly created contact record.'); - return; - } - - /** If there is a default group for this channel, add this member to it */ - - if($importer['channel_default_group']) { - require_once('include/group.php'); - $g = group_rec_byhash($importer['channel_id'],$importer['channel_default_group']); - if($g) - group_add_member($importer['channel_id'],'',$contact_record['xchan_hash'],$g['id']); - } - - return; -} - - - -function diaspora_post($importer,$xml,$msg) { - - $a = get_app(); - $guid = notags(unxmlify($xml->guid)); - $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - $app = notags(xmlify($xml->provider_display_name)); - - - if($diaspora_handle != $msg['author']) { - logger('diaspora_post: Potential forgery. Message handle is not the same as envelope sender.'); - return 202; - } - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$diaspora_handle); - if(! $contact) - return; - - - - if(! $app) { - if(strstr($contact['xchan_network'],'friendica')) - $app = 'Friendica'; - else - $app = 'Diaspora'; - } - - - $search_guid = ((strlen($guid) == 64) ? $guid . '%' : $guid); - - $r = q("SELECT id FROM item WHERE uid = %d AND mid like '%s' LIMIT 1", - intval($importer['channel_id']), - dbesc($search_guid) - ); - - if($r) { - // check dates if post editing is implemented - logger('diaspora_post: message exists: ' . $guid); - return; - } - - $created = unxmlify($xml->created_at); - $private = ((unxmlify($xml->public) == 'false') ? 1 : 0); - - $body = diaspora2bb($xml->raw_message); - - if($xml->photo) { - $body = '[img]' . $xml->photo->remote_photo_path . $xml->photo->remote_photo_name . '[/img]' . "\n\n" . $body; - $body = scale_external_images($body); - } - - $maxlen = get_max_import_size(); - - if($maxlen && mb_strlen($body) > $maxlen) { - $body = mb_substr($body,0,$maxlen,'UTF-8'); - logger('message length exceeds max_import_size: truncated'); - } - -//WTF? FIXME - // Add OEmbed and other information to the body -// $body = add_page_info_to_body($body, false, true); - - $datarray = array(); - - - // Look for tags and linkify them - $results = linkify_tags(get_app(), $body, $importer['channel_id'], true); - - $datarray['term'] = array(); - - if($results) { - foreach($results as $result) { - $success = $result['success']; - if($success['replaced']) { - $datarray['term'][] = array( - 'uid' => $importer['channel_id'], - 'type' => $success['termtype'], - 'otype' => TERM_OBJ_POST, - 'term' => $success['term'], - 'url' => $success['url'] - ); - } - } - } - - $cnt = preg_match_all('/@\[url=(.*?)\](.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER); - if($cnt) { - foreach($matches as $mtch) { - $datarray['term'][] = array( - 'uid' => $importer['channel_id'], - 'type' => TERM_MENTION, - 'otype' => TERM_OBJ_POST, - 'term' => $mtch[2], - 'url' => $mtch[1] - ); - } - } - - $cnt = preg_match_all('/@\[zrl=(.*?)\](.*?)\[\/zrl\]/ism',$body,$matches,PREG_SET_ORDER); - if($cnt) { - foreach($matches as $mtch) { - // don't include plustags in the term - $term = ((substr($mtch[2],-1,1) === '+') ? substr($mtch[2],0,-1) : $mtch[2]); - $datarray['term'][] = array( - 'uid' => $importer['channel_id'], - 'type' => TERM_MENTION, - 'otype' => TERM_OBJ_POST, - 'term' => $term, - 'url' => $mtch[1] - ); - } - } - - - - - $plink = service_plink($contact,$guid); - - - $datarray['uid'] = $importer['channel_id']; - - $datarray['verb'] = ACTIVITY_POST; - $datarray['mid'] = $datarray['parent_mid'] = $guid; - - $datarray['changed'] = $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created); - $datarray['item_private'] = $private; - - $datarray['plink'] = $plink; - - $datarray['author_xchan'] = $contact['xchan_hash']; - $datarray['owner_xchan'] = $contact['xchan_hash']; - - $datarray['body'] = $body; - - $datarray['app'] = $app; - - $datarray['item_unseen'] = 1; - $datarray['item_thread_top'] = 1; - - $tgroup = tgroup_check($importer['channel_id'],$datarray); - - if((! $importer['system']) && (! perm_is_allowed($importer['channel_id'],$contact['xchan_hash'],'send_stream')) && (! $tgroup)) { - logger('diaspora_post: Ignoring this author.'); - return 202; - } - - if(! post_is_importable($datarray,$contact)) { - logger('diaspora_post: filtering this author.'); - return 202; - } - - $result = item_store($datarray); - return; - -} - - -function get_diaspora_reshare_xml($url,$recurse = 0) { - - $x = z_fetch_url($url); - if(! $x['success']) - $x = z_fetch_url(str_replace('https://','http://',$url)); - if(! $x['success']) { - logger('get_diaspora_reshare_xml: unable to fetch source url ' . $url); - return; - } - logger('get_diaspora_reshare_xml: source: ' . $x['body'], LOGGER_DEBUG); - - $source_xml = parse_xml_string($x['body'],false); - - if(! $source_xml) { - logger('get_diaspora_reshare_xml: unparseable result from ' . $url); - return ''; - } - - if($source_xml->post->status_message) { - return $source_xml; - } - - // see if it's a reshare of a reshare - - if($source_xml->post->reshare) - $xml = $source_xml->post->reshare; - else - return false; - - if($xml->root_diaspora_id && $xml->root_guid && $recurse < 15) { - $orig_author = notags(unxmlify($xml->root_diaspora_id)); - $orig_guid = notags(unxmlify($xml->root_guid)); - $source_url = 'https://' . substr($orig_author,strpos($orig_author,'@')+1) . '/p/' . $orig_guid . '.xml'; - $y = get_diaspora_reshare_xml($source_url,$recurse+1); - if($y) - return $y; - } - return false; -} - - - -function diaspora_reshare($importer,$xml,$msg) { - - logger('diaspora_reshare: init: ' . print_r($xml,true), LOGGER_DATA); - - $a = get_app(); - $guid = notags(unxmlify($xml->guid)); - $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - - - if($diaspora_handle != $msg['author']) { - logger('diaspora_post: Potential forgery. Message handle is not the same as envelope sender.'); - return 202; - } - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$diaspora_handle); - if(! $contact) - return; - - $search_guid = ((strlen($guid) == 64) ? $guid . '%' : $guid); - $r = q("SELECT id FROM item WHERE uid = %d AND mid like '%s' LIMIT 1", - intval($importer['channel_id']), - dbesc($search_guid) - ); - if($r) { - logger('diaspora_reshare: message exists: ' . $guid); - return; - } - - $orig_author = notags(unxmlify($xml->root_diaspora_id)); - $orig_guid = notags(unxmlify($xml->root_guid)); - - $source_url = 'https://' . substr($orig_author,strpos($orig_author,'@')+1) . '/p/' . $orig_guid . '.xml'; - $orig_url = 'https://'.substr($orig_author,strpos($orig_author,'@')+1).'/posts/'.$orig_guid; - - $source_xml = get_diaspora_reshare_xml($source_url); - - if($source_xml->post->status_message) { - $body = diaspora2bb($source_xml->post->status_message->raw_message); - - $orig_author = notags(unxmlify($source_xml->post->status_message->diaspora_handle)); - $orig_guid = notags(unxmlify($source_xml->post->status_message->guid)); - - - // Checking for embedded pictures - if($source_xml->post->status_message->photo->remote_photo_path && - $source_xml->post->status_message->photo->remote_photo_name) { - - $remote_photo_path = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_path)); - $remote_photo_name = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_name)); - - $body = '[img]'.$remote_photo_path.$remote_photo_name.'[/img]'."\n".$body; - - logger('diaspora_reshare: embedded picture link found: '.$body, LOGGER_DEBUG); - } - - $body = scale_external_images($body); - - // Add OEmbed and other information to the body -// $body = add_page_info_to_body($body, false, true); - } - else { - // Maybe it is a reshare of a photo that will be delivered at a later time (testing) - logger('diaspora_reshare: no reshare content found: ' . print_r($source_xml,true)); - $body = ""; - //return; - } - - $maxlen = get_max_import_size(); - - if($maxlen && mb_strlen($body) > $maxlen) { - $body = mb_substr($body,0,$maxlen,'UTF-8'); - logger('message length exceeds max_import_size: truncated'); - } - - $person = find_diaspora_person_by_handle($orig_author); - - if($person) { - $orig_author_name = $person['xchan_name']; - $orig_author_link = $person['xchan_url']; - $orig_author_photo = $person['xchan_photo_m']; - } - - - $created = unxmlify($xml->created_at); - $private = ((unxmlify($xml->public) == 'false') ? 1 : 0); - - $datarray = array(); - - // Look for tags and linkify them - $results = linkify_tags(get_app(), $body, $importer['channel_id'], true); - - $datarray['term'] = array(); - - if($results) { - foreach($results as $result) { - $success = $result['success']; - if($success['replaced']) { - $datarray['term'][] = array( - 'uid' => $importer['channel_id'], - 'type' => $success['termtype'], - 'otype' => TERM_OBJ_POST, - 'term' => $success['term'], - 'url' => $success['url'] - ); - } - } - } - - $cnt = preg_match_all('/@\[url=(.*?)\](.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER); - if($cnt) { - foreach($matches as $mtch) { - $datarray['term'][] = array( - 'uid' => $importer['channel_id'], - 'type' => TERM_MENTION, - 'otype' => TERM_OBJ_POST, - 'term' => $mtch[2], - 'url' => $mtch[1] - ); - } - } - - $cnt = preg_match_all('/@\[zrl=(.*?)\](.*?)\[\/zrl\]/ism',$body,$matches,PREG_SET_ORDER); - if($cnt) { - foreach($matches as $mtch) { - // don't include plustags in the term - $term = ((substr($mtch[2],-1,1) === '+') ? substr($mtch[2],0,-1) : $mtch[2]); - $datarray['term'][] = array( - 'uid' => $importer['channel_id'], - 'type' => TERM_MENTION, - 'otype' => TERM_OBJ_POST, - 'term' => $term, - 'url' => $mtch[1] - ); - } - } - - - - - - $newbody = "[share author='" . urlencode($orig_author_name) - . "' profile='" . $orig_author_link - . "' avatar='" . $orig_author_photo - . "' link='" . $orig_url - . "' posted='" . datetime_convert('UTC','UTC',unxmlify($source_xml->post->status_message->created_at)) - . "' message_id='" . unxmlify($source_xml->post->status_message->guid) - . "']" . $body . "[/share]"; - - - $plink = service_plink($contact,$guid); - - $datarray['uid'] = $importer['channel_id']; - $datarray['mid'] = $datarray['parent_mid'] = $guid; - $datarray['changed'] = $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created); - $datarray['item_private'] = $private; - $datarray['plink'] = $plink; - $datarray['owner_xchan'] = $contact['xchan_hash']; - $datarray['author_xchan'] = $contact['xchan_hash']; - - $datarray['body'] = $newbody; - $datarray['app'] = 'Diaspora'; - - - - $tgroup = tgroup_check($importer['channel_id'],$datarray); - - if((! $importer['system']) && (! perm_is_allowed($importer['channel_id'],$contact['xchan_hash'],'send_stream')) && (! $tgroup)) { - logger('diaspora_post: Ignoring this author.'); - return 202; - } - - - $result = item_store($datarray); - - return; - -} - - -function diaspora_asphoto($importer,$xml,$msg) { - logger('diaspora_asphoto called'); - - $a = get_app(); - $guid = notags(unxmlify($xml->guid)); - $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - - if($diaspora_handle != $msg['author']) { - logger('diaspora_post: Potential forgery. Message handle is not the same as envelope sender.'); - return 202; - } - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$diaspora_handle); - if(! $contact) - return; - - if((! $importer['system']) && (! perm_is_allowed($importer['channel_id'],$contact['xchan_hash'],'send_stream'))) { - logger('diaspora_asphoto: Ignoring this author.'); - return 202; - } - - $message_id = $diaspora_handle . ':' . $guid; - $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1", - intval($importer['channel_id']), - dbesc($message_id), - dbesc($guid) - ); - if(count($r)) { - logger('diaspora_asphoto: message exists: ' . $guid); - return; - } - - // allocate a guid on our system - we aren't fixing any collisions. - // we're ignoring them - - $g = q("select * from guid where guid = '%s' limit 1", - dbesc($guid) - ); - if(! count($g)) { - q("insert into guid ( guid ) values ( '%s' )", - dbesc($guid) - ); - } - - $created = unxmlify($xml->created_at); - $private = ((unxmlify($xml->public) == 'false') ? 1 : 0); - - if(strlen($xml->objectId) && ($xml->objectId != 0) && ($xml->image_url)) { - $body = '[url=' . notags(unxmlify($xml->image_url)) . '][img]' . notags(unxmlify($xml->objectId)) . '[/img][/url]' . "\n"; - $body = scale_external_images($body,false); - } - elseif($xml->image_url) { - $body = '[img]' . notags(unxmlify($xml->image_url)) . '[/img]' . "\n"; - $body = scale_external_images($body); - } - else { - logger('diaspora_asphoto: no photo url found.'); - return; - } - - $plink = service_plink($contact,$guid); - - $datarray = array(); - - $datarray['uid'] = $importer['channel_id']; - $datarray['contact-id'] = $contact['id']; - $datarray['wall'] = 0; - $datarray['network'] = NETWORK_DIASPORA; - $datarray['guid'] = $guid; - $datarray['uri'] = $datarray['parent-uri'] = $message_id; - $datarray['changed'] = $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created); - $datarray['private'] = $private; - $datarray['parent'] = 0; - $datarray['plink'] = $plink; - $datarray['owner-name'] = $contact['name']; - $datarray['owner-link'] = $contact['url']; - //$datarray['owner-avatar'] = $contact['thumb']; - $datarray['owner-avatar'] = ((x($contact,'thumb')) ? $contact['thumb'] : $contact['photo']); - $datarray['author-name'] = $contact['name']; - $datarray['author-link'] = $contact['url']; - $datarray['author-avatar'] = $contact['thumb']; - $datarray['body'] = $body; - - $datarray['app'] = 'Diaspora/Cubbi.es'; - - $message_id = item_store($datarray); - - //if($message_id) { - // q("update item set plink = '%s' where id = %d", - // dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id), - // intval($message_id) - // ); - //} - - return; - -} - - - - - - -function diaspora_comment($importer,$xml,$msg) { - - $a = get_app(); - $guid = notags(unxmlify($xml->guid)); - $parent_guid = notags(unxmlify($xml->parent_guid)); - $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - $target_type = notags(unxmlify($xml->target_type)); - $text = unxmlify($xml->text); - $author_signature = notags(unxmlify($xml->author_signature)); - - $parent_author_signature = (($xml->parent_author_signature) ? notags(unxmlify($xml->parent_author_signature)) : ''); - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$msg['author']); - if(! $contact) { - logger('diaspora_comment: cannot find contact: ' . $msg['author']); - return; - } - - - - $pubcomment = get_pconfig($importer['channel_id'],'system','diaspora_public_comments'); - - // by default comments on public posts are allowed from anybody on Diaspora. That is their policy. - // Once this setting is set to something we'll track your preference and it will over-ride the default. - - if($pubcomment === false) - $pubcomment = 1; - - // Friendica is currently truncating guids at 64 chars - $search_guid = $parent_guid; - if(strlen($parent_guid) == 64) - $search_guid = $parent_guid . '%'; - - $r = q("SELECT * FROM item WHERE uid = %d AND mid LIKE '%s' LIMIT 1", - intval($importer['channel_id']), - dbesc($search_guid) - ); - if(! $r) { - logger('diaspora_comment: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid); - return; - } - - $parent_item = $r[0]; - - if(intval($parent_item['item_private'])) - $pubcomment = 0; - - $search_guid = $guid; - if(strlen($guid) == 64) - $search_guid = $guid . '%'; - - - $r = q("SELECT * FROM item WHERE uid = %d AND mid like '%s' LIMIT 1", - intval($importer['channel_id']), - dbesc($search_guid) - ); - if($r) { - logger('diaspora_comment: our comment just got relayed back to us (or there was a guid collision) : ' . $guid); - return; - } - - - - /* How Diaspora performs comment signature checking: - - - If an item has been sent by the comment author to the top-level post owner to relay on - to the rest of the contacts on the top-level post, the top-level post owner should check - the author_signature, then create a parent_author_signature before relaying the comment on - - If an item has been relayed on by the top-level post owner, the contacts who receive it - check only the parent_author_signature. Basically, they trust that the top-level post - owner has already verified the authenticity of anything he/she sends out - - In either case, the signature that get checked is the signature created by the person - who sent the psuedo-salmon - */ - - $signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle; - $key = $msg['key']; - - if($parent_author_signature) { - // If a parent_author_signature exists, then we've received the comment - // relayed from the top-level post owner. There's no need to check the - // author_signature if the parent_author_signature is valid - - $parent_author_signature = base64_decode($parent_author_signature); - - if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) { - logger('diaspora_comment: top-level owner verification failed.'); - return; - } - } - else { - // If there's no parent_author_signature, then we've received the comment - // from the comment creator. In that case, the person is commenting on - // our post, so he/she must be a contact of ours and his/her public key - // should be in $msg['key'] - - if($importer['system']) { - // don't relay to the sys channel - logger('diaspora_comment: relay to sys channel blocked.'); - return; - } - - $author_signature = base64_decode($author_signature); - - if(! rsa_verify($signed_data,$author_signature,$key,'sha256')) { - logger('diaspora_comment: comment author verification failed.'); - return; - } - } - - // Phew! Everything checks out. Now create an item. - - // Find the original comment author information. - // We need this to make sure we display the comment author - // information (name and avatar) correctly. - - if(strcasecmp($diaspora_handle,$msg['author']) == 0) - $person = $contact; - else { - $person = find_diaspora_person_by_handle($diaspora_handle); - - if(! is_array($person)) { - logger('diaspora_comment: unable to find author details'); - return; - } - } - - - $body = diaspora2bb($text); - - - $maxlen = get_max_import_size(); - - if($maxlen && mb_strlen($body) > $maxlen) { - $body = mb_substr($body,0,$maxlen,'UTF-8'); - logger('message length exceeds max_import_size: truncated'); - } - - - $datarray = array(); - - // Look for tags and linkify them - $results = linkify_tags(get_app(), $body, $importer['channel_id'], true); - - $datarray['term'] = array(); - - if($results) { - foreach($results as $result) { - $success = $result['success']; - if($success['replaced']) { - $datarray['term'][] = array( - 'uid' => $importer['channel_id'], - 'type' => $success['termtype'], - 'otype' => TERM_OBJ_POST, - 'term' => $success['term'], - 'url' => $success['url'] - ); - } - } - } - - $cnt = preg_match_all('/@\[url=(.*?)\](.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER); - if($cnt) { - foreach($matches as $mtch) { - $datarray['term'][] = array( - 'uid' => $importer['channel_id'], - 'type' => TERM_MENTION, - 'otype' => TERM_OBJ_POST, - 'term' => $mtch[2], - 'url' => $mtch[1] - ); - } - } - - $cnt = preg_match_all('/@\[zrl=(.*?)\](.*?)\[\/zrl\]/ism',$body,$matches,PREG_SET_ORDER); - if($cnt) { - foreach($matches as $mtch) { - // don't include plustags in the term - $term = ((substr($mtch[2],-1,1) === '+') ? substr($mtch[2],0,-1) : $mtch[2]); - $datarray['term'][] = array( - 'uid' => $importer['channel_id'], - 'type' => TERM_MENTION, - 'otype' => TERM_OBJ_POST, - 'term' => $term, - 'url' => $mtch[1] - ); - } - } - - $datarray['uid'] = $importer['channel_id']; - $datarray['verb'] = ACTIVITY_POST; - $datarray['mid'] = $guid; - $datarray['parent_mid'] = $parent_item['mid']; - - // set the route to that of the parent so downstream hubs won't reject it. - $datarray['route'] = $parent_item['route']; - - // No timestamps for comments? OK, we'll the use current time. - $datarray['changed'] = $datarray['created'] = $datarray['edited'] = datetime_convert(); - $datarray['item_private'] = $parent_item['item_private']; - - $datarray['owner_xchan'] = $parent_item['owner_xchan']; - $datarray['author_xchan'] = $person['xchan_hash']; - - $datarray['body'] = $body; - - if(strstr($person['xchan_network'],'friendica')) - $app = 'Friendica'; - else - $app = 'Diaspora'; - - $datarray['app'] = $app; - - if(! $parent_author_signature) { - $key = get_config('system','pubkey'); - $x = array('signer' => $diaspora_handle, 'body' => $text, - 'signed_text' => $signed_data, 'signature' => base64_encode($author_signature)); - $datarray['diaspora_meta'] = json_encode($x); - } - - - - // So basically if something arrives at the sys channel it's by definition public and we allow it. - // If $pubcomment and the parent was public, we allow it. - // In all other cases, honour the permissions for this Diaspora connection - - $tgroup = tgroup_check($importer['channel_id'],$datarray); - - if((! $importer['system']) && (! $pubcomment) && (! perm_is_allowed($importer['channel_id'],$contact['xchan_hash'],'post_comments')) && (! $tgroup)) { - logger('diaspora_comment: Ignoring this author.'); - return 202; - } - - - - - $result = item_store($datarray); - - if($result && $result['success']) - $message_id = $result['item_id']; - - if(intval($parent_item['item_origin']) && (! $parent_author_signature)) { - // if the message isn't already being relayed, notify others - // the existence of parent_author_signature means the parent_author or owner - // is already relaying. - - proc_run('php','include/notifier.php','comment-import',$message_id); - } - - if($result['item_id']) { - $r = q("select * from item where id = %d limit 1", - intval($result['item_id']) - ); - if($r) - send_status_notifications($result['item_id'],$r[0]); - } - - return; -} - - - - -function diaspora_conversation($importer,$xml,$msg) { - - $a = get_app(); - - $guid = notags(unxmlify($xml->guid)); - $subject = notags(unxmlify($xml->subject)); - $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - $participant_handles = notags(unxmlify($xml->participant_handles)); - $created_at = datetime_convert('UTC','UTC',notags(unxmlify($xml->created_at))); - - $parent_uri = $diaspora_handle . ':' . $guid; - - $messages = $xml->message; - - if(! count($messages)) { - logger('diaspora_conversation: empty conversation'); - return; - } - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$msg['author']); - if(! $contact) { - logger('diaspora_conversation: cannot find contact: ' . $msg['author']); - return; - } - - - if(! perm_is_allowed($importer['channel_id'],$contact['xchan_hash'],'post_mail')) { - logger('diaspora_conversation: Ignoring this author.'); - return 202; - } - - $conversation = null; - - $c = q("select * from conv where uid = %d and guid = '%s' limit 1", - intval($importer['channel_id']), - dbesc($guid) - ); - if(count($c)) - $conversation = $c[0]; - else { - $r = q("insert into conv (uid,guid,creator,created,updated,subject,recips) values(%d, '%s', '%s', '%s', '%s', '%s', '%s') ", - intval($importer['channel_id']), - dbesc($guid), - dbesc($diaspora_handle), - dbesc(datetime_convert('UTC','UTC',$created_at)), - dbesc(datetime_convert()), - dbesc($subject), - dbesc($participant_handles) - ); - if($r) - $c = q("select * from conv where uid = %d and guid = '%s' limit 1", - intval($importer['channel_id']), - dbesc($guid) - ); - if(count($c)) - $conversation = $c[0]; - } - if(! $conversation) { - logger('diaspora_conversation: unable to create conversation.'); - return; - } - - foreach($messages as $mesg) { - - $reply = 0; - - $msg_guid = notags(unxmlify($mesg->guid)); - $msg_parent_guid = notags(unxmlify($mesg->parent_guid)); - $msg_parent_author_signature = notags(unxmlify($mesg->parent_author_signature)); - $msg_author_signature = notags(unxmlify($mesg->author_signature)); - $msg_text = unxmlify($mesg->text); - $msg_created_at = datetime_convert('UTC','UTC',notags(unxmlify($mesg->created_at))); - $msg_diaspora_handle = notags(unxmlify($mesg->diaspora_handle)); - $msg_conversation_guid = notags(unxmlify($mesg->conversation_guid)); - if($msg_conversation_guid != $guid) { - logger('diaspora_conversation: message conversation guid does not belong to the current conversation. ' . $xml); - continue; - } - - $body = diaspora2bb($msg_text); - - - $maxlen = get_max_import_size(); - - if($maxlen && mb_strlen($body) > $maxlen) { - $body = mb_substr($body,0,$maxlen,'UTF-8'); - logger('message length exceeds max_import_size: truncated'); - } - - - $author_signed_data = $msg_guid . ';' . $msg_parent_guid . ';' . $msg_text . ';' . unxmlify($mesg->created_at) . ';' . $msg_diaspora_handle . ';' . $msg_conversation_guid; - - $author_signature = base64_decode($msg_author_signature); - - if(strcasecmp($msg_diaspora_handle,$msg['author']) == 0) { - $person = $contact; - $key = $msg['key']; - } - else { - $person = find_diaspora_person_by_handle($msg_diaspora_handle); - - if(is_array($person) && x($person,'xchan_pubkey')) - $key = $person['xchan_pubkey']; - else { - logger('diaspora_conversation: unable to find author details'); - continue; - } - } - - if(! rsa_verify($author_signed_data,$author_signature,$key,'sha256')) { - logger('diaspora_conversation: verification failed.'); - continue; - } - - if($msg_parent_author_signature) { - $owner_signed_data = $msg_guid . ';' . $msg_parent_guid . ';' . $msg_text . ';' . unxmlify($mesg->created_at) . ';' . $msg_diaspora_handle . ';' . $msg_conversation_guid; - - $parent_author_signature = base64_decode($msg_parent_author_signature); - - $key = $msg['key']; - - if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha256')) { - logger('diaspora_conversation: owner verification failed.'); - continue; - } - } - - $r = q("select id from mail where mid = '%s' limit 1", - dbesc($message_id) - ); - if(count($r)) { - logger('diaspora_conversation: duplicate message already delivered.', LOGGER_DEBUG); - continue; - } - - if($subject) - $subject = str_rot47(base64url_encode($subject)); - if($body) - $body = str_rot47(base64url_encode($body)); - - q("insert into mail ( `channel_id`, `convid`, `from_xchan`,`to_xchan`,`title`,`body`,`mail_obscured`,`mid`,`parent_mid`,`created`) values ( %d, %d, '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s')", - intval($importer['channel_id']), - intval($conversation['id']), - dbesc($person['xchan_hash']), - dbesc($importer['channel_hash']), - dbesc($subject), - dbesc($body), - intval(1), - dbesc($msg_guid), - dbesc($parent_uri), - dbesc($msg_created_at) - ); - - q("update conv set updated = '%s' where id = %d", - dbesc(datetime_convert()), - intval($conversation['id']) - ); - - require_once('include/enotify.php'); -/****** -//FIXME - - notification(array( - 'type' => NOTIFY_MAIL, - 'notify_flags' => $importer['notify-flags'], - 'language' => $importer['language'], - 'to_name' => $importer['username'], - 'to_email' => $importer['email'], - 'uid' =>$importer['importer_uid'], - 'item' => array('subject' => $subject, 'body' => $body), - 'source_name' => $person['name'], - 'source_link' => $person['url'], - 'source_photo' => $person['thumb'], - 'verb' => ACTIVITY_POST, - 'otype' => 'mail' - )); -*******/ - - } - - return; -} - -function diaspora_message($importer,$xml,$msg) { - - $a = get_app(); - - $msg_guid = notags(unxmlify($xml->guid)); - $msg_parent_guid = notags(unxmlify($xml->parent_guid)); - $msg_parent_author_signature = notags(unxmlify($xml->parent_author_signature)); - $msg_author_signature = notags(unxmlify($xml->author_signature)); - $msg_text = unxmlify($xml->text); - $msg_created_at = datetime_convert('UTC','UTC',notags(unxmlify($xml->created_at))); - $msg_diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - $msg_conversation_guid = notags(unxmlify($xml->conversation_guid)); - - $parent_uri = $msg_parent_guid; - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$msg_diaspora_handle); - if(! $contact) { - logger('diaspora_message: cannot find contact: ' . $msg_diaspora_handle); - return; - } - - if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { - logger('diaspora_message: Ignoring this author.'); - return 202; - } - - $conversation = null; - - $c = q("select * from conv where uid = %d and guid = '%s' limit 1", - intval($importer['channel_id']), - dbesc($msg_conversation_guid) - ); - if($c) - $conversation = $c[0]; - else { - logger('diaspora_message: conversation not available.'); - return; - } - - $reply = 0; - - $subject = $conversation['subject']; - $body = diaspora2bb($msg_text); - - - $maxlen = get_max_import_size(); - - if($maxlen && mb_strlen($body) > $maxlen) { - $body = mb_substr($body,0,$maxlen,'UTF-8'); - logger('message length exceeds max_import_size: truncated'); - } - - - - $message_id = $msg_diaspora_handle . ':' . $msg_guid; - - $author_signed_data = $msg_guid . ';' . $msg_parent_guid . ';' . $msg_text . ';' . unxmlify($xml->created_at) . ';' . $msg_diaspora_handle . ';' . $msg_conversation_guid; - - - $author_signature = base64_decode($msg_author_signature); - - $person = find_diaspora_person_by_handle($msg_diaspora_handle); - if(is_array($person) && x($person,'xchan_pubkey')) - $key = $person['xchan_pubkey']; - else { - logger('diaspora_message: unable to find author details'); - return; - } - - if(! rsa_verify($author_signed_data,$author_signature,$key,'sha256')) { - logger('diaspora_message: verification failed.'); - return; - } - - $r = q("select id from mail where mid = '%s' and channel_id = %d limit 1", - dbesc($message_id), - intval($importer['channel_id']) - ); - if($r) { - logger('diaspora_message: duplicate message already delivered.', LOGGER_DEBUG); - return; - } - - $key = get_config('system','pubkey'); - if($subject) - $subject = str_rot47(base64url_encode($subject)); - if($body) - $body = str_rot47(base64url_encode($body)); - - q("insert into mail ( `channel_id`, `convid`, `from_xchan`,`to_xchan`,`title`,`body`,`mail_obscured`,`mid`,`parent_mid`,`created`) values ( %d, %d, '%s', '%s', '%s', '%s', '%d','%s','%s','%s')", - intval($importer['channel_id']), - intval($conversation['id']), - dbesc($person['xchan_hash']), - dbesc($importer['xchan_hash']), - dbesc($subject), - dbesc($body), - intval(1), - dbesc($msg_guid), - dbesc($parent_uri), - dbesc($msg_created_at) - ); - - q("update conv set updated = '%s' where id = %d", - dbesc(datetime_convert()), - intval($conversation['id']) - ); - - return; -} - - -function diaspora_photo($importer,$xml,$msg) { - - $a = get_app(); - - logger('diaspora_photo: init',LOGGER_DEBUG); - - $remote_photo_path = notags(unxmlify($xml->remote_photo_path)); - - $remote_photo_name = notags(unxmlify($xml->remote_photo_name)); - - $status_message_guid = notags(unxmlify($xml->status_message_guid)); - - $guid = notags(unxmlify($xml->guid)); - - $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - - $public = notags(unxmlify($xml->public)); - - $created_at = notags(unxmlify($xml_created_at)); - - logger('diaspora_photo: status_message_guid: ' . $status_message_guid, LOGGER_DEBUG); - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$msg['author']); - if(! $contact) { - logger('diaspora_photo: contact record not found: ' . $msg['author'] . ' handle: ' . $diaspora_handle); - return; - } - - if((! $importer['system']) && (! perm_is_allowed($importer['channel_id'],$contact['xchan_hash'],'send_stream'))) { - logger('diaspora_photo: Ignoring this author.'); - return 202; - } - - $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `mid` = '%s' LIMIT 1", - intval($importer['channel_id']), - dbesc($status_message_guid) - ); - if(! $r) { - logger('diaspora_photo: attempt = ' . $attempt . '; status message not found: ' . $status_message_guid . ' for photo: ' . $guid); - return; - } - -// $parent_item = $r[0]; - -// $link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n"; - -// $link_text = scale_external_images($link_text, true, -// array($remote_photo_name, 'scaled_full_' . $remote_photo_name)); - -// if(strpos($parent_item['body'],$link_text) === false) { -// $r = q("update item set `body` = '%s', `visible` = 1 where `id` = %d and `uid` = %d", -// dbesc($link_text . $parent_item['body']), -// intval($parent_item['id']), -// intval($parent_item['uid']) -// ); -// } - - return; -} - - - - -function diaspora_like($importer,$xml,$msg) { - - $a = get_app(); - $guid = notags(unxmlify($xml->guid)); - $parent_guid = notags(unxmlify($xml->parent_guid)); - $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - $target_type = notags(unxmlify($xml->target_type)); - $positive = notags(unxmlify($xml->positive)); - $author_signature = notags(unxmlify($xml->author_signature)); - - $parent_author_signature = (($xml->parent_author_signature) ? notags(unxmlify($xml->parent_author_signature)) : ''); - - // likes on comments not supported here and likes on photos not supported by Diaspora - -// if($target_type !== 'Post') -// return; - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$msg['author']); - if(! $contact) { - logger('diaspora_like: cannot find contact: ' . $msg['author'] . ' for channel ' . $importer['channel_name']); - return; - } - - - if((! $importer['system']) && (! perm_is_allowed($importer['channel_id'],$contact['xchan_hash'],'post_comments'))) { - logger('diaspora_like: Ignoring this author.'); - return 202; - } - - $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `mid` = '%s' LIMIT 1", - intval($importer['channel_id']), - dbesc($parent_guid) - ); - if(! count($r)) { - logger('diaspora_like: parent item not found: ' . $guid); - return; - } - - $parent_item = $r[0]; - - $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `mid` = '%s' LIMIT 1", - intval($importer['channel_id']), - dbesc($guid) - ); - if(count($r)) { - if($positive === 'true') { - logger('diaspora_like: duplicate like: ' . $guid); - return; - } - // Note: I don't think "Like" objects with positive = "false" are ever actually used - // It looks like "RelayableRetractions" are used for "unlike" instead - if($positive === 'false') { - logger('diaspora_like: received a like with positive set to "false"...ignoring'); - // perhaps call drop_item() - // FIXME--actually don't unless it turns out that Diaspora does indeed send out "false" likes - // send notification via proc_run() - return; - } - } - - $i = q("select * from xchan where xchan_hash = '%s' limit 1", - dbesc($parent_item['author_xchan']) - ); - if($i) - $item_author = $i[0]; - - // Note: I don't think "Like" objects with positive = "false" are ever actually used - // It looks like "RelayableRetractions" are used for "unlike" instead - if($positive === 'false') { - logger('diaspora_like: received a like with positive set to "false"'); - logger('diaspora_like: unlike received with no corresponding like...ignoring'); - return; - } - - - /* How Diaspora performs "like" signature checking: - - - If an item has been sent by the like author to the top-level post owner to relay on - to the rest of the contacts on the top-level post, the top-level post owner should check - the author_signature, then create a parent_author_signature before relaying the like on - - If an item has been relayed on by the top-level post owner, the contacts who receive it - check only the parent_author_signature. Basically, they trust that the top-level post - owner has already verified the authenticity of anything he/she sends out - - In either case, the signature that get checked is the signature created by the person - who sent the salmon - */ - - // 2014-09-10 let's try this: signatures are failing. I'll try and make a signable string from - // the parameters in the order they were presented in the post. This is how D* creates the signable string. - - - $signed_data = $positive . ';' . $guid . ';' . $target_type . ';' . $parent_guid . ';' . $diaspora_handle; - - $key = $msg['key']; - - if($parent_author_signature) { - // If a parent_author_signature exists, then we've received the like - // relayed from the top-level post owner. There's no need to check the - // author_signature if the parent_author_signature is valid - - $parent_author_signature = base64_decode($parent_author_signature); - - if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) { - if (intval(get_config('system','ignore_diaspora_like_signature'))) - logger('diaspora_like: top-level owner verification failed. Proceeding anyway.'); - else { - logger('diaspora_like: top-level owner verification failed.'); - return; - } - } - } - else { - // If there's no parent_author_signature, then we've received the like - // from the like creator. In that case, the person is "like"ing - // our post, so he/she must be a contact of ours and his/her public key - // should be in $msg['key'] - - $author_signature = base64_decode($author_signature); - - if(! rsa_verify($signed_data,$author_signature,$key,'sha256')) { - if (intval(get_config('system','ignore_diaspora_like_signature'))) - logger('diaspora_like: like creator verification failed. Proceeding anyway'); - else { - logger('diaspora_like: like creator verification failed.'); - return; - } - } - } - - logger('diaspora_like: signature check complete.',LOGGER_DEBUG); - - // Phew! Everything checks out. Now create an item. - - // Find the original comment author information. - // We need this to make sure we display the comment author - // information (name and avatar) correctly. - if(strcasecmp($diaspora_handle,$msg['author']) == 0) - $person = $contact; - else { - $person = find_diaspora_person_by_handle($diaspora_handle); - - if(! is_array($person)) { - logger('diaspora_like: unable to find author details'); - return; - } - } - - $uri = $diaspora_handle . ':' . $guid; - - $activity = ACTIVITY_LIKE; - - $post_type = (($parent_item['resource_type'] === 'photo') ? t('photo') : t('status')); - - $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $parent_item['plink'])); - $objtype = (($parent_item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE ); - - $body = $parent_item['body']; - - - $object = json_encode(array( - 'type' => $post_type, - 'id' => $parent_item['mid'], - 'parent' => (($parent_item['thr_parent']) ? $parent_item['thr_parent'] : $parent_item['parent_mid']), - 'link' => $links, - 'title' => $parent_item['title'], - 'content' => $parent_item['body'], - 'created' => $parent_item['created'], - 'edited' => $parent_item['edited'], - 'author' => array( - 'name' => $item_author['xchan_name'], - 'address' => $item_author['xchan_addr'], - 'guid' => $item_author['xchan_guid'], - 'guid_sig' => $item_author['xchan_guid_sig'], - 'link' => array( - array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']), - array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])), - ), - )); - - - $bodyverb = t('%1$s likes %2$s\'s %3$s'); - - $arr = array(); - - $arr['uid'] = $importer['channel_id']; - $arr['aid'] = $importer['channel_account_id']; - $arr['mid'] = $guid; - $arr['parent_mid'] = $parent_item['mid']; - $arr['owner_xchan'] = $parent_item['owner_xchan']; - $arr['author_xchan'] = $person['xchan_hash']; - - $ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]'; - $alink = '[url=' . $parent_item['author-link'] . ']' . $parent_item['author-name'] . '[/url]'; - $plink = '[url='. z_root() .'/display/'.$guid.']'.$post_type.'[/url]'; - $arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink ); - - $arr['app'] = 'Diaspora'; - - // set the route to that of the parent so downstream hubs won't reject it. - $arr['route'] = $parent_item['route']; - - $arr['item_private'] = $parent_item['item_private']; - $arr['verb'] = $activity; - $arr['obj_type'] = $objtype; - $arr['object'] = $object; - - if(! $parent_author_signature) { - $key = get_config('system','pubkey'); - $x = array('signer' => $diaspora_handle, 'body' => $text, - 'signed_text' => $signed_data, 'signature' => base64_encode($author_signature)); - $arr['diaspora_meta'] = json_encode($x); - } - - $x = item_store($arr); - - if($x) - $message_id = $x['item_id']; - - // if the message isn't already being relayed, notify others - // the existence of parent_author_signature means the parent_author or owner - // is already relaying. The parent_item['origin'] indicates the message was created on our system - - if(intval($parent_item['item_origin']) && (! $parent_author_signature)) - proc_run('php','include/notifier.php','comment-import',$message_id); - - return; -} - -function diaspora_retraction($importer,$xml) { - - - $guid = notags(unxmlify($xml->guid)); - $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - $type = notags(unxmlify($xml->type)); - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$diaspora_handle); - if(! $contact) - return; - - if($type === 'Person') { - require_once('include/Contact.php'); - contact_remove($importer['channel_id'],$contact['abook_id']); - } - elseif($type === 'Post') { - $r = q("select * from item where mid = '%s' and uid = %d limit 1", - dbesc('guid'), - intval($importer['channel_id']) - ); - if(count($r)) { - if(link_compare($r[0]['author_xchan'],$contact['xchan_hash'])) { - drop_item($r[0]['id'],false); - } - } - } - - return 202; - // NOTREACHED -} - -function diaspora_signed_retraction($importer,$xml,$msg) { - - - $guid = notags(unxmlify($xml->target_guid)); - $diaspora_handle = notags(unxmlify($xml->sender_handle)); - $type = notags(unxmlify($xml->target_type)); - $sig = notags(unxmlify($xml->target_author_signature)); - - $parent_author_signature = (($xml->parent_author_signature) ? notags(unxmlify($xml->parent_author_signature)) : ''); - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$diaspora_handle); - if(! $contact) { - logger('diaspora_signed_retraction: no contact ' . $diaspora_handle . ' for ' . $importer['channel_id']); - return; - } - - - $signed_data = $guid . ';' . $type ; - $key = $msg['key']; - - /* How Diaspora performs relayable_retraction signature checking: - - - If an item has been sent by the item author to the top-level post owner to relay on - to the rest of the contacts on the top-level post, the top-level post owner checks - the author_signature, then creates a parent_author_signature before relaying the item on - - If an item has been relayed on by the top-level post owner, the contacts who receive it - check only the parent_author_signature. Basically, they trust that the top-level post - owner has already verified the authenticity of anything he/she sends out - - In either case, the signature that get checked is the signature created by the person - who sent the salmon - */ - - if($parent_author_signature) { - - $parent_author_signature = base64_decode($parent_author_signature); - - if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) { - logger('diaspora_signed_retraction: top-level post owner verification failed'); - return; - } - - } - else { - - $sig_decode = base64_decode($sig); - - if(! rsa_verify($signed_data,$sig_decode,$key,'sha256')) { - logger('diaspora_signed_retraction: retraction owner verification failed.' . print_r($msg,true)); - return; - } - } - - if($type === 'StatusMessage' || $type === 'Comment' || $type === 'Like') { - $r = q("select * from item where mid = '%s' and uid = %d limit 1", - dbesc($guid), - intval($importer['channel_id']) - ); - if($r) { - if($r[0]['author_xchan'] == $contact['xchan_hash']) { - - drop_item($r[0]['id'],false, DROPITEM_PHASE1); - - // Now check if the retraction needs to be relayed by us - // - // The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always - // return the items ordered by `item`.`id`, in which case the wrong item is chosen as the parent. - // The only item with `parent` and `id` as the parent id is the parent item. - $p = q("select item_flags from item where parent = %d and id = %d limit 1", - $r[0]['parent'], - $r[0]['parent'] - ); - if($p) { - if(intval($p[0]['item_origin']) && (! $parent_author_signature)) { - - // the existence of parent_author_signature would have meant the parent_author or owner - // is already relaying. - - logger('diaspora_signed_retraction: relaying relayable_retraction'); - proc_run('php','include/notifier.php','drop',$r[0]['id']); - } - } - } - } - } - else - logger('diaspora_signed_retraction: unknown type: ' . $type); - - return 202; - // NOTREACHED -} - -function diaspora_profile($importer,$xml,$msg) { - - $a = get_app(); - $diaspora_handle = notags(unxmlify($xml->diaspora_handle)); - - - if($diaspora_handle != $msg['author']) { - logger('diaspora_post: Potential forgery. Message handle is not the same as envelope sender.'); - return 202; - } - - $contact = diaspora_get_contact_by_handle($importer['channel_id'],$diaspora_handle); - if(! $contact) - return; - - if($contact['blocked']) { - logger('diaspora_post: Ignoring this author.'); - return 202; - } - - $name = unxmlify($xml->first_name) . ((strlen($xml->last_name)) ? ' ' . unxmlify($xml->last_name) : ''); - $image_url = unxmlify($xml->image_url); - $birthday = unxmlify($xml->birthday); - - - $handle_parts = explode("@", $diaspora_handle); - if($name === '') { - $name = $handle_parts[0]; - } - - if( preg_match("|^https?://|", $image_url) === 0) { - $image_url = "http://" . $handle_parts[1] . $image_url; - } - - require_once('include/photo/photo_driver.php'); - - $images = import_profile_photo($image_url,$contact['xchan_hash']); - - // Generic birthday. We don't know the timezone. The year is irrelevant. - - $birthday = str_replace('1000','1901',$birthday); - - $birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d'); - - // this is to prevent multiple birthday notifications in a single year - // if we already have a stored birthday and the 'm-d' part hasn't changed, preserve the entry, which will preserve the notify year - - if(substr($birthday,5) === substr($contact['bd'],5)) - $birthday = $contact['bd']; - - $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s' ", - dbesc($name), - dbesc(datetime_convert()), - dbesc($images[0]), - dbesc($images[1]), - dbesc($images[2]), - dbesc($images[3]), - dbesc(datetime_convert()), - intval($contact['xchan_hash']) - ); - - return; - -} - -function diaspora_share($owner,$contact) { - $a = get_app(); - - $allowed = get_pconfig($owner['channel_id'],'system','diaspora_allowed'); - if($allowed === false) - $allowed = 1; - - if(! intval($allowed)) { - logger('diaspora_share: disallowed for channel ' . $importer['channel_name']); - return; - } - - - - $myaddr = $owner['channel_address'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); - - if(! array_key_exists('xchan_hash',$contact)) { - $c = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where xchan_hash = '%s' limit 1", - dbesc($contact['hubloc_hash']) - ); - if(! $c) { - logger('diaspora_share: ' . $contact['hubloc_hash'] . ' not found.'); - return; - } - $contact = $c[0]; - } - - $theiraddr = $contact['xchan_addr']; - - $tpl = get_markup_template('diaspora_share.tpl'); - $msg = replace_macros($tpl, array( - '$sender' => $myaddr, - '$recipient' => $theiraddr - )); - - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey']))); - return(diaspora_transmit($owner,$contact,$slap, false)); -} - -function diaspora_unshare($owner,$contact) { - - $a = get_app(); - $myaddr = $owner['channel_address'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); - - $tpl = get_markup_template('diaspora_retract.tpl'); - $msg = replace_macros($tpl, array( - '$guid' => $owner['channel_guid'], - '$type' => 'Person', - '$handle' => $myaddr - )); - - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey']))); - - return(diaspora_transmit($owner,$contact,$slap, false)); -} - - -function diaspora_send_status($item,$owner,$contact,$public_batch = false) { - - $a = get_app(); - $myaddr = $owner['channel_address'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); - - if(intval($item['id']) != intval($item['parent'])) { - logger('attempted to send a comment as a top-level post'); - return; - } - - $images = array(); - - $title = $item['title']; - $body = bb2diaspora_itembody($item,true); - -/* - // We're trying to match Diaspora's split message/photo protocol but - // all the photos are displayed on D* as links and not img's - even - // though we're sending pretty much precisely what they send us when - // doing the same operation. - // Commented out for now, we'll use bb2diaspora to convert photos to markdown - // which seems to get through intact. - - $cnt = preg_match_all('|\[img\](.*?)\[\/img\]|',$body,$matches,PREG_SET_ORDER); - if($cnt) { - foreach($matches as $mtch) { - $detail = array(); - $detail['str'] = $mtch[0]; - $detail['path'] = dirname($mtch[1]) . '/'; - $detail['file'] = basename($mtch[1]); - $detail['guid'] = $item['guid']; - $detail['handle'] = $myaddr; - $images[] = $detail; - $body = str_replace($detail['str'],$mtch[1],$body); - } - } -*/ - - if(intval($item['item_consensus'])) { - $poll = replace_macros(get_markup_template('diaspora_consensus.tpl'), array( - '$guid_q' => '10000000', - '$question' => t('Please choose'), - '$guid_y' => '00000001', - '$agree' => t('Agree'), - '$guid_n' => '0000000F', - '$disagree' => t('Disagree'), - '$guid_a' => '00000000', - '$abstain' => t('Abstain') - )); - } - elseif($item['resource_type'] === 'event' && $item['resource_id']) { - $poll = replace_macros(get_markup_template('diaspora_consensus.tpl'), array( - '$guid_q' => '1000000', - '$question' => t('Please choose'), - '$guid_y' => '0000001', - '$agree' => t('I will attend'), - '$guid_n' => '000000F', - '$disagree' => t('I will not attend'), - '$guid_a' => '0000000', - '$abstain' => t('I may attend') - )); - } - else - $poll = ''; - - $public = (($item['item_private']) ? 'false' : 'true'); - - require_once('include/datetime.php'); - $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C'); - - // Detect a share element and do a reshare - // see: https://github.com/Raven24/diaspora-federation/blob/master/lib/diaspora-federation/entities/reshare.rb - if (!$item['item_private'] AND ($ret = diaspora_is_reshare($item["body"]))) { - $tpl = get_markup_template('diaspora_reshare.tpl'); - $msg = replace_macros($tpl, array( - '$root_handle' => xmlify($ret['root_handle']), - '$root_guid' => $ret['root_guid'], - '$guid' => $item['mid'], - '$handle' => xmlify($myaddr), - '$public' => $public, - '$created' => $created, - '$provider' => (($item['app']) ? $item['app'] : t('$projectname')) - )); - } else { - $tpl = get_markup_template('diaspora_post.tpl'); - $msg = replace_macros($tpl, array( - '$body' => xmlify($body), - '$guid' => $item['mid'], - '$poll' => $poll, - '$handle' => xmlify($myaddr), - '$public' => $public, - '$created' => $created, - '$provider' => (($item['app']) ? $item['app'] : t('$projectname')) - )); - } - - logger('diaspora_send_status: '.$owner['channel_name'].' -> '.$contact['xchan_name'].' base message: ' . $msg, LOGGER_DATA); - - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],$public_batch))); - - $return_code = diaspora_transmit($owner,$contact,$slap,$public_batch); - -// logger('diaspora_send_status: guid: '.$item['mid'].' result '.$return_code, LOGGER_DEBUG); - - if(count($images)) { - diaspora_send_images($item,$owner,$contact,$images,$public_batch); - } - - return $return_code; -} - -function diaspora_is_reshare($body) { - - $body = trim($body); - - // Skip if it isn't a pure repeated messages - // Does it start with a share? - if(strpos($body, "[share") > 0) - return(false); - - // Does it end with a share? - if(strlen($body) > (strrpos($body, "[/share]") + 8)) - return(false); - - $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body); - // Skip if there is no shared message in there - if ($body == $attributes) - return(false); - - $profile = ""; - preg_match("/profile='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") - $profile = $matches[1]; - - preg_match('/profile="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") - $profile = $matches[1]; - - $ret= array(); - - $ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile); - if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == "")) - return(false); - - $link = ""; - preg_match("/link='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") - $link = $matches[1]; - - preg_match('/link="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") - $link = $matches[1]; - - $ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link); - if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == "")) - return(false); - - return($ret); -} - -function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) { - $a = get_app(); - if(! count($images)) - return; - $mysite = substr($a->get_baseurl(),strpos($a->get_baseurl(),'://') + 3) . '/photo'; - - $tpl = get_markup_template('diaspora_photo.tpl'); - foreach($images as $image) { - if(! stristr($image['path'],$mysite)) - continue; - $resource = str_replace('.jpg','',$image['file']); - $resource = substr($resource,0,strpos($resource,'-')); - - $r = q("select * from photo where `resource_id` = '%s' and `uid` = %d limit 1", - dbesc($resource), - intval($owner['uid']) - ); - if(! $r) - continue; - $public = (($r[0]['allow_cid'] || $r[0]['allow_gid'] || $r[0]['deny_cid'] || $r[0]['deny_gid']) ? 'false' : 'true' ); - $msg = replace_macros($tpl,array( - '$path' => xmlify($image['path']), - '$filename' => xmlify($image['file']), - '$msg_guid' => xmlify($image['guid']), - '$guid' => xmlify($r[0]['resource_id']), - '$handle' => xmlify($image['handle']), - '$public' => xmlify($public), - '$created_at' => xmlify(datetime_convert('UTC','UTC',$r[0]['created'],'Y-m-d H:i:s \U\T\C')) - )); - - - logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA); - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],$public_batch))); - - diaspora_transmit($owner,$contact,$slap,$public_batch); - } - -} - -function diaspora_send_followup($item,$owner,$contact,$public_batch = false) { - - $a = get_app(); - $myaddr = $owner['channel_address'] . '@' . get_app()->get_hostname(); - $theiraddr = $contact['xchan_addr']; - - // Diaspora doesn't support threaded comments, but some - // versions of Diaspora (i.e. Diaspora-pistos) support - // likes on comments - if(($item['verb'] === ACTIVITY_LIKE || $item['verb'] === ACTIVITY_DISLIKE) && $item['thr_parent']) { - $p = q("select mid, parent_mid from item where mid = '%s' limit 1", - dbesc($item['thr_parent']) - ); - } - else { - // The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always - // return the items ordered by `item`.`id`, in which case the wrong item is chosen as the parent. - // The only item with `parent` and `id` as the parent id is the parent item. - $p = q("select * from item where parent = %d and id = %d limit 1", - intval($item['parent']), - intval($item['parent']) - ); - } - if($p) - $parent = $p[0]; - else - return; - - - if(($item['verb'] === ACTIVITY_LIKE) && ($parent['mid'] === $parent['parent_mid'])) { - $tpl = get_markup_template('diaspora_like.tpl'); - $like = true; - $target_type = 'Post'; - $positive = 'true'; - - if(intval($item['item_deleted'])) - logger('diaspora_send_followup: received deleted "like". Those should go to diaspora_send_retraction'); - } - else { - $tpl = get_markup_template('diaspora_comment.tpl'); - $like = false; - } - - if($item['diaspora_meta'] && ! $like) { - $diaspora_meta = json_decode($item['diaspora_meta'],true); - if($diaspora_meta) { - if(array_key_exists('iv',$diaspora_meta)) { - $key = get_config('system','prvkey'); - $meta = json_decode(crypto_unencapsulate($diaspora_meta,$key),true); - } - else - $meta = $diaspora_meta; - } - $signed_text = $meta['signed_text']; - $authorsig = $meta['signature']; - $signer = $meta['signer']; - $text = $meta['body']; - } - else { - $text = bb2diaspora_itembody($item); - - // sign it - - if($like) - $signed_text = $item['mid'] . ';' . $target_type . ';' . $parent['mid'] . ';' . $positive . ';' . $myaddr; - else - $signed_text = $item['mid'] . ';' . $parent['mid'] . ';' . $text . ';' . $myaddr; - - $authorsig = base64_encode(rsa_sign($signed_text,$owner['channel_prvkey'],'sha256')); - - } - - $msg = replace_macros($tpl,array( - '$guid' => xmlify($item['mid']), - '$parent_guid' => xmlify($parent['mid']), - '$target_type' =>xmlify($target_type), - '$authorsig' => xmlify($authorsig), - '$body' => xmlify($text), - '$positive' => xmlify($positive), - '$handle' => xmlify($myaddr) - )); - - logger('diaspora_followup: base message: ' . $msg, LOGGER_DATA); - - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],$public_batch))); - - - return(diaspora_transmit($owner,$contact,$slap,$public_batch)); -} - - -function diaspora_send_relay($item,$owner,$contact,$public_batch = false) { - - - $a = get_app(); - $myaddr = $owner['channel_address'] . '@' . get_app()->get_hostname(); - - $text = bb2diaspora_itembody($item); - - $body = $text; - - // Diaspora doesn't support threaded comments, but some - // versions of Diaspora (i.e. Diaspora-pistos) support - // likes on comments - - if($item['verb'] === ACTIVITY_LIKE && $item['thr_parent']) { - $p = q("select * from item where mid = '%s' limit 1", - dbesc($item['thr_parent']) - ); - } - else { - // The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always - // return the items ordered by `item`.`id`, in which case the wrong item is chosen as the parent. - // The only item with `parent` and `id` as the parent id is the parent item. - $p = q("select * from item where parent = %d and id = %d limit 1", - intval($item['parent']), - intval($item['parent']) - ); - } - - if($p) - $parent = $p[0]; - else { - logger('diaspora_send_relay: no parent'); - return; - } - - $like = false; - $relay_retract = false; - $sql_sign_id = 'iid'; - - if( intval($item['item_deleted'])) { - $relay_retract = true; - - $target_type = ( ($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment'); - - $sql_sign_id = 'retract_iid'; - $tpl = get_markup_template('diaspora_relayable_retraction.tpl'); - } - elseif($item['verb'] === ACTIVITY_LIKE) { - $like = true; - - $target_type = ( $parent['mid'] === $parent['parent_mid'] ? 'Post' : 'Comment'); -// $positive = (intval($item['item_deleted']) ? 'false' : 'true'); - $positive = 'true'; - - $tpl = get_markup_template('diaspora_like_relay.tpl'); - } - else { // item is a comment - $tpl = get_markup_template('diaspora_comment_relay.tpl'); - } - - $diaspora_meta = (($item['diaspora_meta']) ? json_decode($item['diaspora_meta'],true) : ''); - if($diaspora_meta) { - if(array_key_exists('iv',$diaspora_meta)) { - $key = get_config('system','prvkey'); - $meta = json_decode(crypto_unencapsulate($diaspora_meta,$key),true); - } - else - $meta = $diaspora_meta; - $sender_signed_text = $meta['signed_text']; - $authorsig = $meta['signature']; - $handle = $meta['signer']; - $text = $meta['body']; - } - else - logger('diaspora_send_relay: original author signature not found'); - - /* Since the author signature is only checked by the parent, not by the relay recipients, - * I think it may not be necessary for us to do so much work to preserve all the original - * signatures. The important thing that Diaspora DOES need is the original creator's handle. - * Let's just generate that and forget about all the original author signature stuff. - * - * Note: this might be more of an problem if we want to support likes on comments for older - * versions of Diaspora (diaspora-pistos), but since there are a number of problems with - * doing that, let's ignore it for now. - * - * - */ -// bug - nomadic identity may/will affect diaspora_handle_from_contact - if(! $handle) { - if($item['author_xchan'] === $owner['channel_hash']) - $handle = $owner['channel_address'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); - else - $handle = diaspora_handle_from_contact($item['author_xchan']); - } - if(! $handle) { - logger('diaspora_send_relay: no handle'); - return; - } - - if(! $sender_signed_text) { - if($relay_retract) - $sender_signed_text = $item['mid'] . ';' . $target_type; - elseif($like) - $sender_signed_text = $positive . ';' . $item['mid'] . ';' . $target_type . ';' . $parent['mid'] . ';' . $handle; - else - $sender_signed_text = $item['mid'] . ';' . $parent['mid'] . ';' . $text . ';' . $handle; - } - - // Sign the relayable with the top-level owner's signature - // - // We'll use the $sender_signed_text that we just created, instead of the $signed_text - // stored in the database, because that provides the best chance that Diaspora will - // be able to reconstruct the signed text the same way we did. This is particularly a - // concern for the comment, whose signed text includes the text of the comment. The - // smallest change in the text of the comment, including removing whitespace, will - // make the signature verification fail. Since we translate from BB code to Diaspora's - // markup at the top of this function, which is AFTER we placed the original $signed_text - // in the database, it's hazardous to trust the original $signed_text. - - $parentauthorsig = base64_encode(rsa_sign($sender_signed_text,$owner['channel_prvkey'],'sha256')); - - if(! $text) - logger('diaspora_send_relay: no text'); - - $msg = replace_macros($tpl,array( - '$guid' => xmlify($item['mid']), - '$parent_guid' => xmlify($parent['mid']), - '$target_type' =>xmlify($target_type), - '$authorsig' => xmlify($authorsig), - '$parentsig' => xmlify($parentauthorsig), - '$body' => xmlify($text), - '$positive' => xmlify($positive), - '$handle' => xmlify($handle) - )); - - logger('diaspora_send_relay: base message: ' . $msg, LOGGER_DATA); - - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],$public_batch))); - - return(diaspora_transmit($owner,$contact,$slap,$public_batch)); - -} - - - -function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) { - - $a = get_app(); - $myaddr = $owner['channel_address'] . '@' . get_app()->get_hostname(); - - // Check whether the retraction is for a top-level post or whether it's a relayable - if( $item['mid'] !== $item['parent_mid'] ) { - - $tpl = get_markup_template('diaspora_relay_retraction.tpl'); - $target_type = (($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment'); - } - else { - - $tpl = get_markup_template('diaspora_signed_retract.tpl'); - $target_type = 'StatusMessage'; - } - - $signed_text = $item['mid'] . ';' . $target_type; - - $msg = replace_macros($tpl, array( - '$guid' => xmlify($item['mid']), - '$type' => xmlify($target_type), - '$handle' => xmlify($myaddr), - '$signature' => xmlify(base64_encode(rsa_sign($signed_text,$owner['channel_prvkey'],'sha256'))) - )); - - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],$public_batch))); - - return(diaspora_transmit($owner,$contact,$slap,$public_batch)); -} - -function diaspora_send_mail($item,$owner,$contact) { - - $a = get_app(); - $myaddr = $owner['channel_address'] . '@' . get_app()->get_hostname(); - - $r = q("select * from conv where id = %d and uid = %d limit 1", - intval($item['convid']), - intval($item['channel_id']) - ); - - if(! count($r)) { - logger('diaspora_send_mail: conversation not found.'); - return; - } - $cnv = $r[0]; - - $conv = array( - 'guid' => xmlify($cnv['guid']), - 'subject' => xmlify($cnv['subject']), - 'created_at' => xmlify(datetime_convert('UTC','UTC',$cnv['created'],'Y-m-d H:i:s \U\T\C')), - 'diaspora_handle' => xmlify($cnv['creator']), - 'participant_handles' => xmlify($cnv['recips']) - ); - - if(array_key_exists('mail_obscured',$item) && intval($item['mail_obscured'])) { - if($item['title']) - $item['title'] = base64url_decode(str_rot47($item['title'])); - if($item['body']) - $item['body'] = base64url_decode(str_rot47($item['body'])); - } - - - $body = bb2diaspora($item['body']); - $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C'); - - $signed_text = $item['mid'] . ';' . $cnv['guid'] . ';' . $body . ';' - . $created . ';' . $myaddr . ';' . $cnv['guid']; - - $sig = base64_encode(rsa_sign($signed_text,$owner['channel_prvkey'],'sha256')); - - $msg = array( - 'guid' => xmlify($item['mid']), - 'parent_guid' => xmlify($cnv['guid']), - 'parent_author_signature' => (($item['reply']) ? null : xmlify($sig)), - 'author_signature' => xmlify($sig), - 'text' => xmlify($body), - 'created_at' => xmlify($created), - 'diaspora_handle' => xmlify($myaddr), - 'conversation_guid' => xmlify($cnv['guid']) - ); - - if($item['reply']) { - $tpl = get_markup_template('diaspora_message.tpl'); - $xmsg = replace_macros($tpl, array('$msg' => $msg)); - } - else { - $conv['messages'] = array($msg); - $tpl = get_markup_template('diaspora_conversation.tpl'); - $xmsg = replace_macros($tpl, array('$conv' => $conv)); - } - - logger('diaspora_conversation: ' . print_r($xmsg,true), LOGGER_DATA); - - $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($xmsg,$owner,$contact,$owner['channel_prvkey'],$contact['xchan_pubkey'],false))); - - return(diaspora_transmit($owner,$contact,$slap,false)); - - -} - -function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false) { - - - $allowed = get_pconfig($owner['channel_id'],'system','diaspora_allowed'); - if($allowed === false) - $allowed = 1; - - if(! intval($allowed)) { - return 200; - } - - if($public_batch) - $dest_url = $contact['hubloc_callback'] . '/public'; - else - $dest_url = $contact['hubloc_callback'] . '/users/' . $contact['hubloc_guid']; - - logger('diaspora_transmit: URL: ' . $dest_url, LOGGER_DEBUG); - - if(intval(get_config('system','diaspora_test'))) - return 200; - - $a = get_app(); - $logid = random_string(4); - - logger('diaspora_transmit: ' . $logid . ' ' . $dest_url, LOGGER_DEBUG); - - $hash = random_string(); - - $interval = ((get_config('system','delivery_interval') !== false) - ? intval(get_config('system','delivery_interval')) : 2 ); - - q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', '%s', %d, '%s', '%s', '%s', '%s' )", - dbesc($hash), - intval($owner['account_id']), - intval($owner['channel_id']), - dbesc('post'), - dbesc($dest_url), - intval(1), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc(''), - dbesc($slap) - ); - - proc_run('php','include/deliver.php',$hash); - if($interval) - @time_sleep_until(microtime(true) + (float) $interval); - -} - - -function diaspora_follow_allow(&$a, &$b) { - - $b['allowed'] = intval(get_pconfig($b['channel_id'],'system','diaspora_allowed')); - -} - - -function diaspora_discover(&$a,&$b) { - - require_once('include/network.php'); - - $result = array(); - $network = null; - $diaspora = false; - - $diaspora_base = ''; - $diaspora_guid = ''; - $diaspora_key = ''; - $dfrn = false; - - $x = old_webfinger($webbie); - if($x) { - logger('old_webfinger: ' . print_r($x,true)); - foreach($x as $link) { - if($link['@attributes']['rel'] === NAMESPACE_DFRN) - $dfrn = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === 'salmon') - $notify = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === NAMESPACE_FEED) - $poll = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === 'http://microformats.org/profile/hcard') - $hcard = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page') - $profile = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === 'http://portablecontacts.net/spec/1.0') - $poco = unamp($link['@attributes']['href']); - if($link['@attributes']['rel'] === 'http://joindiaspora.com/seed_location') { - $diaspora_base = unamp($link['@attributes']['href']); - $diaspora = true; - } - if($link['@attributes']['rel'] === 'http://joindiaspora.com/guid') { - $diaspora_guid = unamp($link['@attributes']['href']); - $diaspora = true; - } - if($link['@attributes']['rel'] === 'diaspora-public-key') { - $diaspora_key = base64_decode(unamp($link['@attributes']['href'])); - if(strstr($diaspora_key,'RSA ')) - $pubkey = rsatopem($diaspora_key); - else - $pubkey = $diaspora_key; - $diaspora = true; - } - } - - if($diaspora && $diaspora_base && $diaspora_guid) { - $guid = $diaspora_guid; - $diaspora_base = trim($diaspora_base,'/'); - - $notify = $diaspora_base . '/receive'; - - if(strpos($webbie,'@')) { - $addr = str_replace('acct:', '', $webbie); - $hostname = substr($webbie,strpos($webbie,'@')+1); - } - $network = 'diaspora'; - // until we get a dfrn layer, we'll use diaspora protocols for Friendica, - // but give it a different network so we can go back and fix these when we get proper support. - // It really should be just 'friendica' but we also want to distinguish - // between Friendica sites that we can use D* protocols with and those we can't. - // Some Friendica sites will have Diaspora disabled. - if($dfrn) - $network = 'friendica-over-diaspora'; - if($hcard) { - $vcard = scrape_vcard($hcard); - $vcard['nick'] = substr($webbie,0,strpos($webbie,'@')); - } - - $r = q("select * from xchan where xchan_hash = '%s' limit 1", - dbesc($addr) - ); - - /** - * - * Diaspora communications are notoriously unreliable and receiving profile update messages (indeed any messages) - * are pretty much random luck. We'll check the timestamp of the xchan_name_date at a higher level and refresh - * this record once a month; because if you miss a profile update message and they update their profile photo or name - * you're otherwise stuck with stale info until they change their profile again - which could be years from now. - * - */ - - if($r) { - $r = q("update xchan set xchan_name = '%s', xchan_network = '%s', xchan_name_date = '%s' where xchan_hash = '%s' limit 1", - dbesc($vcard['fn']), - dbesc($network), - dbesc(datetime_convert()), - dbesc($addr) - ); - } - else { - - $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_pubkey, xchan_addr, xchan_url, xchan_name, xchan_network, xchan_instance_url, xchan_name_date ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ", - dbesc($addr), - dbesc($guid), - dbesc($pubkey), - dbesc($addr), - dbesc($profile), - dbesc($vcard['fn']), - dbesc($network), - dbesc(z_root()), - dbescdate(datetime_convert()) - ); - } - - $r = q("select * from hubloc where hubloc_hash = '%s' limit 1", - dbesc($webbie) - ); - - if(! $r) { - - $r = q("insert into hubloc ( hubloc_guid, hubloc_hash, hubloc_addr, hubloc_network, hubloc_url, hubloc_host, hubloc_callback, hubloc_updated, hubloc_primary ) values ('%s','%s','%s','%s','%s','%s','%s','%s', 1)", - dbesc($guid), - dbesc($addr), - dbesc($addr), - dbesc($network), - dbesc(trim($diaspora_base,'/')), - dbesc($hostname), - dbesc($notify), - dbescdate(datetime_convert()) - ); - } - $photos = import_profile_photo($vcard['photo'],$addr); - $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'", - dbescdate(datetime_convert('UTC','UTC',$arr['photo_updated'])), - dbesc($photos[0]), - dbesc($photos[1]), - dbesc($photos[2]), - dbesc($photos[3]), - dbesc($addr) - ); - return true; - - } - - return false; - -/* - $vcard['fn'] = notags($vcard['fn']); - $vcard['nick'] = str_replace(' ','',notags($vcard['nick'])); - - $result['name'] = $vcard['fn']; - $result['nick'] = $vcard['nick']; - $result['guid'] = $guid; - $result['url'] = $profile; - $result['hostname'] = $hostname; - $result['addr'] = $addr; - $result['batch'] = $batch; - $result['notify'] = $notify; - $result['poll'] = $poll; - $result['request'] = $request; - $result['confirm'] = $confirm; - $result['poco'] = $poco; - $result['photo'] = $vcard['photo']; - $result['priority'] = $priority; - $result['network'] = $network; - $result['alias'] = $alias; - $result['pubkey'] = $pubkey; - - logger('probe_url: ' . print_r($result,true), LOGGER_DEBUG); - - return $result; - -*/ - -/* Sample Diaspora result. - -Array -( - [name] => Mike Macgirvin - [nick] => macgirvin - [guid] => a9174a618f8d269a - [url] => https://joindiaspora.com/u/macgirvin - [hostname] => joindiaspora.com - [addr] => macgirvin@joindiaspora.com - [batch] => - [notify] => https://joindiaspora.com/receive - [poll] => https://joindiaspora.com/public/macgirvin.atom - [request] => - [confirm] => - [poco] => - [photo] => https://joindiaspora.s3.amazonaws.com/uploads/images/thumb_large_fec4e6eef13ae5e56207.jpg - [priority] => - [network] => diaspora - [alias] => - [pubkey] => -----BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtihtyIuRDWkDpCA+I1UaQ -jI4S7k625+A7EEJm+pL2ZVSJxeCKiFeEgHBQENjLMNNm8l8F6blxgQqE6ZJ9Spa7f -tlaXYTRCrfxKzh02L3hR7sNA+JS/nXJaUAIo+IwpIEspmcIRbD9GB7Wv/rr+M28uH -31EeYyDz8QL6InU/bJmnCdFvmEMBQxJOw1ih9tQp7UNJAbUMCje0WYFzBz7sfcaHL -OyYcCOqOCBLdGucUoJzTQ9iDBVzB8j1r1JkIHoEb2moUoKUp+tkCylNfd/3IVELF9 -7w1Qjmit3m50OrJk2DQOXvCW9KQxaQNdpRPSwhvemIt98zXSeyZ1q/YjjOwG0DWDq -AF8aLj3/oQaZndTPy/6tMiZogKaijoxj8xFLuPYDTw5VpKquriVC0z8oxyRbv4t9v -8JZZ9BXqzmayvY3xZGGp8NulrfjW+me2bKh0/df1aHaBwpZdDTXQ6kqAiS2FfsuPN -vg57fhfHbL1yJ4oDbNNNeI0kJTGchXqerr8C20khU/cQ2Xt31VyEZtnTB665Ceugv -kp3t2qd8UpAVKl430S5Quqx2ymfUIdxdW08CEjnoRNEL3aOWOXfbf4gSVaXmPCR4i -LSIeXnd14lQYK/uxW/8cTFjcmddsKxeXysoQxbSa9VdDK+KkpZdgYXYrTTofXs6v+ -4afAEhRaaY+MCAwEAAQ== ------END PUBLIC KEY----- - -) -*/ - - - - - } -} - - -function diaspora_feature_settings_post(&$a,&$b) { - - if($_POST['diaspora-submit']) { - set_pconfig(local_channel(),'system','diaspora_allowed',intval($_POST['dspr_allowed'])); - set_pconfig(local_channel(),'system','diaspora_public_comments',intval($_POST['dspr_pubcomment'])); - set_pconfig(local_channel(),'system','prevent_tag_hijacking',intval($_POST['dspr_hijack'])); - info( t('Diaspora Protocol Settings updated.') . EOL); - } -} - - -function diaspora_feature_settings(&$a,&$s) { - $dspr_allowed = get_pconfig(local_channel(),'system','diaspora_allowed'); - $pubcomments = get_pconfig(local_channel(),'system','diaspora_public_comments'); - if($pubcomments === false) - $pubcomments = 1; - $hijacking = get_pconfig(local_channel(),'system','prevent_tag_hijacking'); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('dspr_allowed', t('Enable the (experimental) Diaspora protocol for this channel'), $dspr_allowed, '', $yes_no), - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('dspr_pubcomment', t('Allow any Diaspora member to comment on your public posts'), $pubcomments, '', $yes_no), - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('dspr_hijack', t('Prevent your hashtags from being redirected to other sites'), $hijacking, '', $yes_no), - )); - - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('diaspora', '' . t('Diaspora Protocol Settings'), '', t('Submit')), - '$content' => $sc - )); - - return; - -} \ No newline at end of file diff --git a/sources/extend/addon/matrix/diaspora/p.php b/sources/extend/addon/matrix/diaspora/p.php deleted file mode 100644 index 3df8cd55..00000000 --- a/sources/extend/addon/matrix/diaspora/p.php +++ /dev/null @@ -1,52 +0,0 @@ -get_hostname(); - - $item = $r[0]; - - $title = $item['title']; - $body = bb2diaspora_itembody($item); - $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C'); - - $tpl = get_markup_template('diaspora_post.tpl'); - $msg = replace_macros($tpl, array( - '$body' => xmlify($body), - '$guid' => $item['mid'], - '$handle' => xmlify($myaddr), - '$public' => 'true', - '$created' => $created, - '$provider' => (($item['app']) ? $item['app'] : t('$projectname')) - )); - - header('Content-type: text/xml'); - echo $msg; - killme(); -} \ No newline at end of file diff --git a/sources/extend/addon/matrix/diaspora/receive.php b/sources/extend/addon/matrix/diaspora/receive.php deleted file mode 100644 index 0c73a57c..00000000 --- a/sources/extend/addon/matrix/diaspora/receive.php +++ /dev/null @@ -1,69 +0,0 @@ -token_regex = '/content="(.*?)" name="csrf-token/'; - - $this->pod = $pod; - $this->cookiejar = tempnam(sys_get_temp_dir(), 'cookies'); - } - - function _fetch_token() { - $ch = curl_init(); - - curl_setopt ($ch, CURLOPT_URL, $this->pod . "/stream"); - curl_setopt ($ch, CURLOPT_COOKIEFILE, $this->cookiejar); - curl_setopt ($ch, CURLOPT_COOKIEJAR, $this->cookiejar); - curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); - - $output = curl_exec ($ch); - curl_close($ch); - - // Token holen und zurückgeben - preg_match($this->token_regex, $output, $matches); - return $matches[1]; - } - - function login($username, $password) { - $datatopost = array( - 'user[username]' => $username, - 'user[password]' => $password, - 'authenticity_token' => $this->_fetch_token() - ); - - $poststr = http_build_query($datatopost); - - // Adresse per cURL abrufen - $ch = curl_init(); - - curl_setopt ($ch, CURLOPT_URL, $this->pod . "/users/sign_in"); - curl_setopt ($ch, CURLOPT_COOKIEFILE, $this->cookiejar); - curl_setopt ($ch, CURLOPT_COOKIEJAR, $this->cookiejar); - curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, false); - curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt ($ch, CURLOPT_POST, true); - curl_setopt ($ch, CURLOPT_POSTFIELDS, $poststr); - - curl_exec ($ch); - $info = curl_getinfo($ch); - curl_close($ch); - - if($info['http_code'] != 302) { - throw new Exception('Login error '.print_r($info, true)); - } - - // Das Objekt zurückgeben, damit man Aurufe verketten kann. - return $this; - } - - function post($text, $provider = "diasphp") { - // post-daten vorbereiten - $datatopost = json_encode(array( - 'aspect_ids' => 'public', - 'status_message' => array('text' => $text, - 'provider_display_name' => $provider) - )); - - // header vorbereiten - $headers = array( - 'Content-Type: application/json', - 'accept: application/json', - 'x-csrf-token: '.$this->_fetch_token() - ); - - // Adresse per cURL abrufen - $ch = curl_init(); - - curl_setopt ($ch, CURLOPT_URL, $this->pod . "/status_messages"); - curl_setopt ($ch, CURLOPT_COOKIEFILE, $this->cookiejar); - curl_setopt ($ch, CURLOPT_COOKIEJAR, $this->cookiejar); - curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, false); - curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt ($ch, CURLOPT_POST, true); - curl_setopt ($ch, CURLOPT_POSTFIELDS, $datatopost); - curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers); - - curl_exec ($ch); - $info = curl_getinfo($ch); - curl_close($ch); - - if($info['http_code'] != 201) { - throw new Exception('Post error '.print_r($info, true)); - } - - // Ende der möglichen Kette, gib mal "true" zurück. - return true; - } -} -?> diff --git a/sources/extend/addon/matrix/diaspost/diaspora.png b/sources/extend/addon/matrix/diaspost/diaspora.png deleted file mode 100644 index 96665916..00000000 Binary files a/sources/extend/addon/matrix/diaspost/diaspora.png and /dev/null differ diff --git a/sources/extend/addon/matrix/diaspost/diaspost.php b/sources/extend/addon/matrix/diaspost/diaspost.php deleted file mode 100755 index b4200fc8..00000000 --- a/sources/extend/addon/matrix/diaspost/diaspost.php +++ /dev/null @@ -1,337 +0,0 @@ - - */ - -function diaspost_load() { - register_hook('post_local', 'addon/diaspost/diaspost.php', 'diaspost_post_local'); - register_hook('notifier_normal', 'addon/diaspost/diaspost.php', 'diaspost_send'); - register_hook('jot_networks', 'addon/diaspost/diaspost.php', 'diaspost_jot_nets'); - register_hook('feature_settings', 'addon/diaspost/diaspost.php', 'diaspost_settings'); - register_hook('feature_settings_post', 'addon/diaspost/diaspost.php', 'diaspost_settings_post'); - -} -function diaspost_unload() { - unregister_hook('post_local', 'addon/diaspost/diaspost.php', 'diaspost_post_local'); - unregister_hook('notifier_normal', 'addon/diaspost/diaspost.php', 'diaspost_send'); - unregister_hook('jot_networks', 'addon/diaspost/diaspost.php', 'diaspost_jot_nets'); - unregister_hook('feature_settings', 'addon/diaspost/diaspost.php', 'diaspost_settings'); - unregister_hook('feature_settings_post', 'addon/diaspost/diaspost.php', 'diaspost_settings_post'); - -} - - -function diaspost_jot_nets(&$a,&$b) { - if((! local_channel()) || (! perm_is_allowed(local_channel(),'','view_stream'))) - return; - - $diaspost_post = get_pconfig(local_channel(),'diaspost','post'); - if(intval($diaspost_post) == 1) { - $diaspost_defpost = get_pconfig(local_channel(),'diaspost','post_by_default'); - $selected = ((intval($diaspost_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '
' . t('Post to Diaspora') . '
'; - } -} - -function diaspost_queue_hook(&$a,&$b) { - $hostname = $a->get_hostname(); - - $qi = q("SELECT * FROM `queue` WHERE `network` = '%s'", - dbesc(NETWORK_DIASPORA2) - ); - if(! count($qi)) - return; - - require_once('include/queue_fn.php'); - - foreach($qi as $x) { - if($x['network'] !== NETWORK_DIASPORA2) - continue; - - logger('diaspost_queue: run'); - - $r = q("SELECT `user`.* FROM `user` LEFT JOIN `contact` on `contact`.`uid` = `user`.`uid` - WHERE `contact`.`self` = 1 AND `contact`.`id` = %d LIMIT 1", - intval($x['cid']) - ); - if(! count($r)) - continue; - - $userdata = $r[0]; - - $diaspost_username = get_pconfig($userdata['uid'],'diaspost','diaspost_username'); - $diaspost_password = z_unobscure(get_pconfig($userdata['uid'],'diaspost','diaspost_password')); - $diaspost_url = get_pconfig($userdata['uid'],'diaspost','diaspost_url'); - - $success = false; - - if($diaspost_url && $diaspost_username && $diaspost_password) { - require_once("addon/diaspost/diasphp.php"); - - logger('diaspost_queue: able to post for user '.$diaspost_username); - - $z = unserialize($x['content']); - - $post = $z['post']; - - logger('diaspost_queue: post: '.$post, LOGGER_DATA); - - try { - logger('diaspost_queue: prepare', LOGGER_DEBUG); - $conn = new Diasphp($diaspost_url); - logger('diaspost_queue: try to log in '.$diaspost_username, LOGGER_DEBUG); - $conn->login($diaspost_username, $diaspost_password); - logger('diaspost_queue: try to send '.$body, LOGGER_DEBUG); - $conn->post($post, $hostname); - - logger('diaspost_queue: send '.$userdata['uid'].' success', LOGGER_DEBUG); - - $success = true; - - remove_queue_item($x['id']); - } catch (Exception $e) { - logger("diaspost_queue: Send ".$userdata['uid']." failed: ".$e->getMessage(), LOGGER_DEBUG); - } - } else - logger('diaspost_queue: send '.$userdata['uid'].' missing username or password', LOGGER_DEBUG); - - if (!$success) { - logger('diaspost_queue: delayed'); - update_queue_time($x['id']); - } - } -} - -function diaspost_settings(&$a,&$s) { - - if(! local_channel()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - //$a->page['htmlhead'] .= '' . "\r\n"; - - /* Get the current state of our config variables */ - - $enabled = get_pconfig(local_channel(),'diaspost','post'); - $checked = (($enabled) ? '1' : false); - $css = (($enabled) ? '' : '-disabled'); - - $def_enabled = get_pconfig(local_channel(),'diaspost','post_by_default'); - - $def_checked = (($def_enabled) ? 1 : false); - - $diaspost_username = get_pconfig(local_channel(), 'diaspost', 'diaspost_username'); - $diaspost_password = z_unobscure(get_pconfig(local_channel(), 'diaspost', 'diaspost_password')); - $diaspost_url = get_pconfig(local_channel(), 'diaspost', 'diaspost_url'); - - $status = ""; - - if ($diaspost_username AND $diaspost_password AND $diaspost_url) { - try { - require_once("addon/diaspost/diasphp.php"); - - $conn = new Diasphp($diaspost_url); - $conn->login($diaspost_username, $diaspost_password); - } catch (Exception $e) { - $status = t("Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"); - } - } - - /* Add some HTML to the existing form */ - if ($status) { - $sc .= '
'; - $sc .= '' . $status . ''; - $sc .= '
'; - } - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('diaspost', t('Enable Diaspost Post Plugin'), $checked, '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('diaspost_username', t('Diaspora username'), $diaspost_username, '') - )); - - $sc .= replace_macros(get_markup_template('field_password.tpl'), array( - '$field' => array('diaspost_password', t('Diaspora password'), $diaspost_password, '') - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('diaspost_url', t('Diaspora site URL'), $diaspost_url, 'Example: https://joindiaspora.com') - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('diaspost_bydefault', t('Post to Diaspora by default'), $def_checked, '', array(t('No'),t('Yes'))), - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('diaspost', '' . t('Diaspost Post Settings'), '', t('Submit')), - '$content' => $sc - )); - - return; -} - - -function diaspost_settings_post(&$a,&$b) { - - if(x($_POST,'diaspost-submit')) { - - set_pconfig(local_channel(),'diaspost','post',intval($_POST['diaspost'])); - set_pconfig(local_channel(),'diaspost','post_by_default',intval($_POST['diaspost_bydefault'])); - set_pconfig(local_channel(),'diaspost','diaspost_username',trim($_POST['diaspost_username'])); - set_pconfig(local_channel(),'diaspost','diaspost_password',z_obscure(trim($_POST['diaspost_password']))); - set_pconfig(local_channel(),'diaspost','diaspost_url',trim($_POST['diaspost_url'])); - - } - -} - -function diaspost_post_local(&$a,&$b) { - - if($b['created'] != $b['edited']) - return; - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - - if((! local_channel()) || (local_channel() != $b['uid'])) - return; - - if($b['item_private']) - return; - - $diaspost_post = intval(get_pconfig(local_channel(),'diaspost','post')); - - $diaspost_enable = (($diaspost_post && x($_REQUEST,'diaspost_enable')) ? intval($_REQUEST['diaspost_enable']) : 0); - - if($_REQUEST['api_source'] && intval(get_pconfig(local_channel(),'diaspost','post_by_default'))) - $diaspost_enable = 1; - - if(! $diaspost_enable) - return; - - if(strlen($b['postopts'])) - $b['postopts'] .= ','; - $b['postopts'] .= 'diaspost'; -} - - - - -function diaspost_send(&$a,&$b) { - $hostname = 'hubzilla ' . '(' . $a->get_hostname() . ')'; - - logger('diaspost_send: invoked',LOGGER_DEBUG); - - if($b['mid'] != $b['parent_mid']) - return; - - if((! is_item_normal($b)) || $b['item_private'] || ($b['created'] !== $b['edited'])) - return; - - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - - if(! strstr($b['postopts'],'diaspost')) - return; - - - logger('diaspost_send: prepare posting', LOGGER_DEBUG); - - $diaspost_username = get_pconfig($b['uid'],'diaspost','diaspost_username'); - $diaspost_password = z_unobscure(get_pconfig($b['uid'],'diaspost','diaspost_password')); - $diaspost_url = get_pconfig($b['uid'],'diaspost','diaspost_url'); - - if($diaspost_url && $diaspost_username && $diaspost_password) { - - logger('diaspost_send: all values seem to be okay', LOGGER_DEBUG); - - require_once('include/bb2diaspora.php'); - $tag_arr = array(); - $tags = ''; - $x = preg_match_all('/\#\[(.*?)\](.*?)\[/',$b['tag'],$matches,PREG_SET_ORDER); - - if($x) { - foreach($matches as $mtch) { - $tag_arr[] = $mtch[2]; - } - } - if(count($tag_arr)) - $tags = implode(',',$tag_arr); - - $title = $b['title']; - $body = $b['body']; - // Insert a newline before and after a quote - $body = str_ireplace("[quote", "\n\n[quote", $body); - $body = str_ireplace("[/quote]", "[/quote]\n\n", $body); - - // strip bookmark indicators - - $body = preg_replace('/\#\^\[([zu])rl/i', '[$1rl', $body); - - $body = preg_replace('/\#\^http/i', 'http', $body); - - - if(intval(get_pconfig($item['uid'],'system','prevent_tag_hijacking'))) { - $new_tag = html_entity_decode('⋕',ENT_COMPAT,'UTF-8'); - $new_mention = html_entity_decode('@',ENT_COMPAT,'UTF-8'); - - // #-tags - $body = preg_replace('/\#\[url/i', $new_tag . '[url', $body); - $body = preg_replace('/\#\[zrl/i', $new_tag . '[zrl', $body); - // @-mentions - $body = preg_replace('/\@\!?\[url/i', $new_mention . '[url', $body); - $body = preg_replace('/\@\!?\[zrl/i', $new_mention . '[zrl', $body); - } - - // remove multiple newlines - do { - $oldbody = $body; - $body = str_replace("\n\n\n", "\n\n", $body); - } while ($oldbody != $body); - - // convert to markdown - $body = bb2diaspora($body, false, true); - - // Adding the title - if(strlen($title)) - $body = "## ".html_entity_decode($title)."\n\n".$body; - - require_once("addon/diaspost/diasphp.php"); - - try { - logger('diaspost_send: prepare', LOGGER_DEBUG); - $conn = new Diasphp($diaspost_url); - logger('diaspost_send: try to log in '.$diaspost_username, LOGGER_DEBUG); - $conn->login($diaspost_username, $diaspost_password); - logger('diaspost_send: try to send '.$body, LOGGER_DEBUG); - - //throw new Exception('Test'); - $conn->post($body, $hostname); - - logger('diaspost_send: success'); - } catch (Exception $e) { - logger("diaspost_send: Error submitting the post: " . $e->getMessage()); - -// logger('diaspost_send: requeueing '.$b['uid'], LOGGER_DEBUG); - -// $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self`", $b['uid']); -// if (count($r)) -// $a->contact = $r[0]["id"]; - -// $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $body)); -// require_once('include/queue_fn.php'); -// add_to_queue($a->contact,NETWORK_DIASPORA2,$s); -// notice(t('Diaspost post failed. Queued for retry.').EOL); - } - } -} diff --git a/sources/extend/addon/matrix/dirstats/dirstats.php b/sources/extend/addon/matrix/dirstats/dirstats.php deleted file mode 100644 index 21780eef..00000000 --- a/sources/extend/addon/matrix/dirstats/dirstats.php +++ /dev/null @@ -1,204 +0,0 @@ - -*/ - -function dirstats_load() { - register_hook('cron_daily', 'addon/dirstats/dirstats.php', 'dirstats_cron'); -} -function dirstats_unload() { - unregister_hook('cron_daily', 'addon/dirstats/dirstats.php', 'dirstats_cron'); -} -function dirstats_module() {} - - -function dirstats_init() { - if(! get_config('dirstats','hubcount')) - dirstats_cron($a,$b); - -} - -function dirstats_content(&$a) { - - $hubcount = get_config('dirstats','hubcount'); - $zotcount = get_config('dirstats','zotcount'); - $friendicacount = get_config('dirstats','friendicacount'); - $diasporacount = get_config('dirstats','diasporacount'); - $channelcount = get_config('dirstats','channelcount'); - $friendicachannelcount = get_config('dirstats','friendicachannelcount'); - $diasporachannelcount = get_config('dirstats','diasporachannelcount'); - $over35s = get_config('dirstats','over35s'); - $under35s = get_config('dirstats','under35s'); - $average = get_config('dirstats','averageage'); - $chatrooms = get_config('dirstats','chatrooms'); - $tags = get_config('dirstats','tags'); - - $ob = $a->get_observer(); - $observer = $ob['xchan_hash']; - // Requested by Martin - $fountainofyouth = get_xconfig($observer, 'dirstats', 'averageage'); - if (intval($fountainofyouth)) - $average = $fountainofyouth; - -if (argv(1) == 'json') { - $dirstats = array ( - 'hubcount' => $hubcount, - 'zotcount' => $zotcount, - 'friendicacount' => $friendicacount, - 'diasporacount' => $diasporacount, - 'channelcount' => $channelcount, - 'friendicachannelcount' => $friendicachannelcount, - 'diasporachannelcount' => $diasporachannelcount, - 'over35s' => $over35s, - 'under35s' => $under35s, - 'average' => $average, - 'chatrooms' => $chatrooms, - 'tags' => $tags - ); - echo json_return_and_die($dirstats); - } - - // Used by Hubzilla News - elseif (argv(1) == 'genpost' && get_config('dirstats','allowfiledump')) { - $result = '[b]Hub count[/b] : ' . $hubcount . "\xA" . - '[b]Hubzilla Hubs[/b] : ' . $zotcount . "\xA" . - '[b]Friendica Hubs[/b] : ' . $friendicacount . "\xA" . - '[b]Diaspora Pods[/b] : ' . $diasporacount . "\xA" . - '[b]Hubzilla Channels[/b] : ' . $channelcount . "\xA" . - '[b]Friendica Profiles[/b] : ' . $friendicachannelcount . "\xA" . - '[b]Diaspora Profiles[/b] : ' . $diasporachannelcount . "\xA" . - '[b]People aged 35 and above[/b] : ' . $over35s . "\xA" . - '[b]People aged 34 and below[/b] : ' . $under35s . "\xA" . - '[b]Average Age[/b] : ' . $average . "\xA" . - '[b]Known Chatrooms[/b] : ' . $chatrooms . "\xA" . - '[b]Unique Profile Tags[/b] : ' . $tags . "\xA"; - - file_put_contents('genpost', $result); - } -else { - $tpl = get_markup_template( "dirstats.tpl", "addon/dirstats/" ); - return replace_macros($tpl, array( - '$title' => t('Hubzilla Directory Stats'), - '$hubtitle' => t('Total Hubs'), - '$hubcount' => $hubcount, - '$zotlabel' => t('Hubzilla Hubs'), - '$zotcount' => $zotcount, - '$friendicalabel' => t('Friendica Hubs'), - '$friendicacount' => $friendicacount, - '$diasporalabel' => t('Diaspora Pods'), - '$diasporacount' => $diasporacount, - '$zotchanlabel' => t('Hubzilla Channels'), - '$channelcount' => $channelcount, - '$friendicachanlabel' => t('Friendica Channels'), - '$friendicachannelcount' => $friendicachannelcount, - '$diasporachanlabel' => t('Diaspora Channels'), - '$diasporachannelcount' => $diasporachannelcount, - '$over35label' => t('Aged 35 and above'), - '$over35s' => $over35s, - '$under35label' => t('Aged 34 and under'), - '$under35s' => $under35s, - '$averageagelabel' => t('Average Age'), - '$average' => $average, - '$chatlabel' => t('Known Chatrooms'), - '$chatrooms' => $chatrooms, - '$tagslabel' => t('Known Tags'), - '$tags' => $tags, - '$disclaimer' => t('Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,') - )); - } -} -function dirstats_cron(&$a, $b) { - // Some hublocs are immortal and won't ever die - they all have null date for hubloc_connected and hubloc_updated - $r = q("SELECT count(distinct hubloc_host) as total FROM `hubloc` where not (hubloc_flags & %d) > 0 and not (hubloc_connected = %d and hubloc_updated = %d)", - intval(HUBLOC_FLAGS_DELETED), - dbesc(NULL_DATE), - dbesc(NULL_DATE) - ); - if ($r) { - $hubcount = $r[0]['total']; - set_config('dirstats','hubcount',$hubcount); - } - - $r = q("SELECT count(distinct hubloc_host) as total FROM `hubloc` where hubloc_network = 'zot' and not (hubloc_flags & %d) > 0 and not (hubloc_connected = %d and hubloc_updated = %d)", - intval(HUBLOC_FLAGS_DELETED), - dbesc(NULL_DATE), - dbesc(NULL_DATE) - - ); - if ($r) { - $zotcount = $r[0]['total']; - set_config('dirstats','zotcount',$zotcount); - } - $r = q("SELECT count(distinct hubloc_host) as total FROM `hubloc` where hubloc_network = 'friendica-over-diaspora'"); - if ($r){ - $friendicacount = $r[0]['total']; - set_config('dirstats','friendicacount',$friendicacount); - } - $r = q("SELECT count(distinct hubloc_host) as total FROM `hubloc` where hubloc_network = 'diaspora'"); - if ($r) { - $diasporacount = $r[0]['total']; - set_config('dirstats','diasporacount',$diasporacount); - } - $r = q("SELECT count(distinct xchan_hash) as total FROM `xchan` where xchan_network = 'zot' and not (xchan_flags & %d) > 0", - intval(XCHAN_FLAGS_DELETED) - ); - if ($r) { - $channelcount = $r[0]['total']; - set_config('dirstats','channelcount',$channelcount); - } - $r = q("SELECT count(distinct xchan_hash) as total FROM `xchan` where xchan_network = 'friendica-over-diaspora'"); - if ($r) { - $friendicachannelcount = $r[0]['total']; - set_config('dirstats','friendicachannelcount',$friendicachannelcount); - } - $r = q("SELECT count(distinct xchan_hash) as total FROM `xchan` where xchan_network = 'diaspora'"); - if ($r) { - $diasporachannelcount = $r[0]['total']; - set_config('dirstats','diasporachannelcount',$diasporachannelcount); - } - $r = q("select count(xprof_hash) as total from `xprof` where xprof_age >=35"); - if ($r) { - $over35s = $r[0]['total']; - set_config('dirstats','over35s',$over35s); - } - $r = q("select count(xprof_hash) as total from `xprof` where xprof_age <=34 and xprof_age >=1"); - if ($r) { - $under35s = $r[0]['total']; - set_config('dirstats','under35s',$under35s); - } - - $r = q("select sum(xprof_age) as sum from xprof"); - if ($r) { - $rr = q("select count(xprof_hash) as total from `xprof` where xprof_age >=1"); - $total = $r[0]['sum']; - $number = $rr[0]['total']; - if($number) - $average = $total / $number; - else - $average = 0; - set_config('dirstats','averageage',$average); - } - - $r = q("select count(distinct xchat_url) as total from `xchat`"); - if ($r) { - $chatrooms = $r[0]['total']; - set_config('dirstats','chatrooms',$chatrooms); - } - $r = q("select count(distinct xtag_term) as total from `xtag`"); - if ($r) { - $tags = $r[0]['total']; - set_config('dirstats','tags',$tags); - } -} diff --git a/sources/extend/addon/matrix/dirstats/view/tpl/dirstats.tpl b/sources/extend/addon/matrix/dirstats/view/tpl/dirstats.tpl deleted file mode 100644 index f1c3a132..00000000 --- a/sources/extend/addon/matrix/dirstats/view/tpl/dirstats.tpl +++ /dev/null @@ -1,20 +0,0 @@ -
-

{{$title}}

-
    {{$hubtitle}} : {{$hubcount}}
-
    {{$zotlabel}} : {{$zotcount}}
-
    {{$friendicalabel}} : {{$friendicacount}}
-
    {{$diasporalabel}} : {{$diasporacount}}
-

-
    {{$zotchanlabel}} : {{$channelcount}}
-
    {{$friendicachanlabel}} : {{$friendicachannelcount}}
-
    {{$diasporachanlabel}} : {{$diasporachannelcount}}
-

-
    {{$over35label}} : {{$over35s}}
-
    {{$under35label}} : {{$under35s}}
-
    {{$averageagelabel}} : {{$average}}
-

-
    {{$chatlabel}} : {{$chatrooms}}
-
    {{$tagslabel}} : {{$tags}}
- -

{{$disclaimer}}

-
diff --git a/sources/extend/addon/matrix/donate/donate.apd b/sources/extend/addon/matrix/donate/donate.apd deleted file mode 100644 index eff602d3..00000000 --- a/sources/extend/addon/matrix/donate/donate.apd +++ /dev/null @@ -1,3 +0,0 @@ -url: $baseurl/donate -name: Support Hubzilla -photo: $baseurl/addon/donate/donate.png diff --git a/sources/extend/addon/matrix/donate/donate.php b/sources/extend/addon/matrix/donate/donate.php deleted file mode 100644 index 1eb6d57d..00000000 --- a/sources/extend/addon/matrix/donate/donate.php +++ /dev/null @@ -1,75 +0,0 @@ -' . t('The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others.') . '

'; -$text .= '

' . t('There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don\'t control your personal information - you do.)') . '

'; -$text .= '

' . t('Help support our ground-breaking work in decentralisation, web identity, and privacy.') . '

'; - -$text .= '

' . t('Your donations keep servers and services running and also helps us to provide innovative new features and continued development.') . '

'; - -$o = replace_macros(get_markup_template('donate.tpl','addon/donate'),array( - '$header' => t('Donate'), - '$text' => $text, - '$choice' => t('Choose a project, developer, or public hub to support with a one-time donation'), - '$onetime' => t('Donate Now'), - '$repeat' => t('Or become a project sponsor (Hubzilla Project only)'), - '$note' => t('Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing'), - '$subscribe' => t('Sponsor'), - '$contributors' => $contributors, - '$sponsors' => $sponsors, - '$thanks' => t('Special thanks to: '), -)); - -call_hooks('donate_plugin',$o); - -return $o; - -} diff --git a/sources/extend/addon/matrix/donate/donate.png b/sources/extend/addon/matrix/donate/donate.png deleted file mode 100644 index d932f001..00000000 Binary files a/sources/extend/addon/matrix/donate/donate.png and /dev/null differ diff --git a/sources/extend/addon/matrix/donate/tipping.jpg b/sources/extend/addon/matrix/donate/tipping.jpg deleted file mode 100644 index f370ece7..00000000 Binary files a/sources/extend/addon/matrix/donate/tipping.jpg and /dev/null differ diff --git a/sources/extend/addon/matrix/donate/view/tpl/donate.tpl b/sources/extend/addon/matrix/donate/view/tpl/donate.tpl deleted file mode 100644 index 6382cc6f..00000000 --- a/sources/extend/addon/matrix/donate/view/tpl/donate.tpl +++ /dev/null @@ -1,64 +0,0 @@ -

{{$header}}

- -
{{$text}}
- -
- -Donations - -
-
- -
- - -
{{$choice}}
-
- - -


- - - - - -
- -


- -

-{{$repeat}} -

-

-{{$note}} -

- -
- - -
- - -
-
-
- - -
- -

-{{$thanks}} -
    -{{foreach $sponsors as $s}} -
  • {{$s}}
  • -{{/foreach}} -
diff --git a/sources/extend/addon/matrix/dwpost/dwpost.php b/sources/extend/addon/matrix/dwpost/dwpost.php deleted file mode 100644 index a4b999f0..00000000 --- a/sources/extend/addon/matrix/dwpost/dwpost.php +++ /dev/null @@ -1,229 +0,0 @@ - - * Author: Michael Johnston - * Author: Cat Gray - */ - -require_once('include/permissions.php'); - -function dwpost_load() { - register_hook('post_local', 'addon/dwpost/dwpost.php', 'dwpost_post_local'); - register_hook('notifier_normal', 'addon/dwpost/dwpost.php', 'dwpost_send'); - register_hook('jot_networks', 'addon/dwpost/dwpost.php', 'dwpost_jot_nets'); - register_hook('feature_settings', 'addon/dwpost/dwpost.php', 'dwpost_settings'); - register_hook('feature_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post'); - -} -function dwpost_unload() { - unregister_hook('post_local', 'addon/dwpost/dwpost.php', 'dwpost_post_local'); - unregister_hook('notifier_normal', 'addon/dwpost/dwpost.php', 'dwpost_send'); - unregister_hook('jot_networks', 'addon/dwpost/dwpost.php', 'dwpost_jot_nets'); - unregister_hook('feature_settings', 'addon/dwpost/dwpost.php', 'dwpost_settings'); - unregister_hook('feature_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post'); - -} - - -function dwpost_jot_nets(&$a,&$b) { - if((! local_channel()) || (! perm_is_allowed(local_channel(),'','view_stream'))) - return; - - $dw_post = get_pconfig(local_channel(),'dwpost','post'); - if(intval($dw_post) == 1) { - $dw_defpost = get_pconfig(local_channel(),'dwpost','post_by_default'); - $selected = ((intval($dw_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '
' - . t('Post to Dreamwidth') . '
'; - } -} - - -function dwpost_settings(&$a,&$s) { - - if(! local_channel()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - //$a->page['htmlhead'] .= '' . "\r\n"; - - /* Get the current state of our config variables */ - - $enabled = get_pconfig(local_channel(),'dwpost','post'); - - $checked = (($enabled) ? 1 : false); - - $def_enabled = get_pconfig(local_channel(),'dwpost','post_by_default'); - - $def_checked = (($def_enabled) ? 1 : false); - - $dw_username = get_pconfig(local_channel(), 'dwpost', 'dw_username'); - $dw_password = z_unobscure(get_pconfig(local_channel(), 'dwpost', 'dw_password')); - - - /* Add some HTML to the existing form */ - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('dwpost', t('Enable Dreamwidth Post Plugin'), $checked, '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('dw_username', t('Dreamwidth username'), $dw_username, '') - )); - - $sc .= replace_macros(get_markup_template('field_password.tpl'), array( - '$field' => array('dw_password', t('Dreamwidth password'), $dw_password, '') - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('dw_bydefault', t('Post to Dreamwidth by default'), $def_checked, '', array(t('No'),t('Yes'))), - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('dwpost',t('Dreamwidth Post Settings'), '', t('Submit')), - '$content' => $sc - )); - -} - - -function dwpost_settings_post(&$a,&$b) { - - if(x($_POST,'dwpost-submit')) { - - set_pconfig(local_channel(),'dwpost','post',intval($_POST['dwpost'])); - set_pconfig(local_channel(),'dwpost','post_by_default',intval($_POST['dw_bydefault'])); - set_pconfig(local_channel(),'dwpost','dw_username',trim($_POST['dw_username'])); - set_pconfig(local_channel(),'dwpost','dw_password',z_obscure(trim($_POST['dw_password']))); - - } - -} - -function dwpost_post_local(&$a,&$b) { - - // This can probably be changed to allow editing by pointing to a different API endpoint - - if($b['edit']) - return; - - if((! local_channel()) || (local_channel() != $b['uid'])) - return; - - if($b['item_private'] || $b['parent']) - return; - - logger('Dreamwidth xpost invoked'); - - $dw_post = intval(get_pconfig(local_channel(),'dwpost','post')); - - $dw_enable = (($dw_post && x($_REQUEST,'dwpost_enable')) ? intval($_REQUEST['dwpost_enable']) : 0); - - if($_REQUEST['api_source'] && intval(get_pconfig(local_channel(),'dwpost','post_by_default'))) - $dw_enable = 1; - - if(! $dw_enable) - return; - - if(strlen($b['postopts'])) - $b['postopts'] .= ','; - $b['postopts'] .= 'dwpost'; -} - - - - -function dwpost_send(&$a,&$b) { - - if((! is_item_normal($b)) || $b['item_private'] || ($b['created'] !== $b['edited'])) - return; - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - if(! strstr($b['postopts'],'dwpost')) - return; - - if($b['parent'] != $b['id']) - return; - - // dreamwidth post in the LJ user's timezone. - // Hopefully the person's Friendica account - // will be set to the same thing. - - $tz = 'UTC'; - - $x = q("select channel_timezone from channel where channel_id = %d limit 1", - intval($b['uid']) - ); - if($x && strlen($x[0]['channel_timezone'])) - $tz = $x[0]['channel_timezone']; - - $dw_username = get_pconfig($b['uid'],'dwpost','dw_username'); - $dw_password = z_unobscure(get_pconfig($b['uid'],'dwpost','dw_password')); - $dw_blog = 'http://www.dreamwidth.org/interface/xmlrpc'; - - if($dw_username && $dw_password && $dw_blog) { - - require_once('include/bbcode.php'); - require_once('include/datetime.php'); - - $title = $b['title']; - $post = bbcode($b['body']); - $post = xmlify($post); - $tags = dwpost_get_tags($b['tag']); - - $date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s'); - $year = intval(substr($date,0,4)); - $mon = intval(substr($date,5,2)); - $day = intval(substr($date,8,2)); - $hour = intval(substr($date,11,2)); - $min = intval(substr($date,14,2)); - - $xml = <<< EOT - -LJ.XMLRPC.postevent - - -year$year -mon$mon -day$day -hour$hour -min$min -event$post -username$dw_username -password$dw_password -subject$title -lineendingsunix -ver1 -props - -useragentFriendica -taglist$tags - - - - - -EOT; - - logger('dwpost: data: ' . $xml, LOGGER_DATA); - - if($dw_blog !== 'test') - $x = z_post_url($dw_blog,$xml,array('headers' => array("Content-Type: text/xml"))); - logger('posted to dreamwidth: ' . print_r($x,true), LOGGER_DEBUG); - - } -} - -function dwpost_get_tags($post) -{ - preg_match_all("/\]([^\[#]+)\[/",$post,$matches); - $tags = implode(', ',$matches[1]); - return $tags; -} diff --git a/sources/extend/addon/matrix/dwpost/lang/C/messages.po b/sources/extend/addon/matrix/dwpost/lang/C/messages.po deleted file mode 100644 index 6bed922f..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/C/messages.po +++ /dev/null @@ -1,46 +0,0 @@ -# ADDON dwpost -# Copyright (C) -# This file is distributed under the same license as the Friendica dwpost addon package. -# -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-27 05:01-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: dwpost.php:39 -msgid "Post to Dreamwidth" -msgstr "" - -#: dwpost.php:70 -msgid "Dreamwidth Post Settings" -msgstr "" - -#: dwpost.php:72 -msgid "Enable dreamwidth Post Plugin" -msgstr "" - -#: dwpost.php:77 -msgid "dreamwidth username" -msgstr "" - -#: dwpost.php:82 -msgid "dreamwidth password" -msgstr "" - -#: dwpost.php:87 -msgid "Post to dreamwidth by default" -msgstr "" - -#: dwpost.php:93 -msgid "Submit" -msgstr "" diff --git a/sources/extend/addon/matrix/dwpost/lang/ca/strings.php b/sources/extend/addon/matrix/dwpost/lang/ca/strings.php deleted file mode 100644 index 6ad56a9b..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/ca/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "Missatge a Dreamwidth"; -$a->strings["Dreamwidth Post Settings"] = "Configuració d'enviaments a Dreamwidth"; -$a->strings["Enable dreamwidth Post Plugin"] = "Habilitat el plugin d'enviaments a Dreamwidth"; -$a->strings["dreamwidth username"] = "Nom d'usuari a Dreamwidth"; -$a->strings["dreamwidth password"] = "Contrasenya a Dreamwidth"; -$a->strings["Post to dreamwidth by default"] = "Enviar per defecte a Dreamwidth"; -$a->strings["Submit"] = "Enviar"; diff --git a/sources/extend/addon/matrix/dwpost/lang/cs/strings.php b/sources/extend/addon/matrix/dwpost/lang/cs/strings.php deleted file mode 100644 index e01db0d1..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/cs/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "Poslat na Dreamwidth"; -$a->strings["Dreamwidth Post Settings"] = "Nastavení Dreamwidth příspÄ›vků"; -$a->strings["Enable dreamwidth Post Plugin"] = "Povolit dreamwidth Plugin"; -$a->strings["dreamwidth username"] = "dreamwidth uživatelské jméno"; -$a->strings["dreamwidth password"] = "dreamwidth heslo"; -$a->strings["Post to dreamwidth by default"] = "DefaultnÄ› umístit na dreamwidth"; -$a->strings["Submit"] = "Odeslat"; diff --git a/sources/extend/addon/matrix/dwpost/lang/de/strings.php b/sources/extend/addon/matrix/dwpost/lang/de/strings.php deleted file mode 100644 index 2e3ba985..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/de/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "In Dreamwidth veröffentlichen"; -$a->strings["Dreamwidth Post Settings"] = "Dreamwidth Veröffentlichungs-Einstellungen"; -$a->strings["Enable dreamwidth Post Plugin"] = "Dreamwidth Post Plugin aktivieren"; -$a->strings["dreamwidth username"] = "Dreamwidth Benutzername"; -$a->strings["dreamwidth password"] = "Dreamwidth Passwort"; -$a->strings["Post to dreamwidth by default"] = "Standardmäßig bei Dreamwidth veröffentlichen"; -$a->strings["Submit"] = "Senden"; diff --git a/sources/extend/addon/matrix/dwpost/lang/eo/strings.php b/sources/extend/addon/matrix/dwpost/lang/eo/strings.php deleted file mode 100644 index 967d4b9b..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/eo/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "AfiÅi al Dreamwidth"; -$a->strings["Dreamwidth Post Settings"] = "Agordoj por AfiÅoj al Dreamwidth"; -$a->strings["Enable dreamwidth Post Plugin"] = "Åœalti la Dreamwidth Kromprogramon"; -$a->strings["dreamwidth username"] = "Dreamwidth salutnomo"; -$a->strings["dreamwidth password"] = "Dreamwidth pasvorto"; -$a->strings["Post to dreamwidth by default"] = "DefaÅ­lte afiÅi al Dreamwidth"; -$a->strings["Submit"] = "Sendi"; diff --git a/sources/extend/addon/matrix/dwpost/lang/es/strings.php b/sources/extend/addon/matrix/dwpost/lang/es/strings.php deleted file mode 100644 index 11e6ff59..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/es/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "Publicar en Dreamwidth"; -$a->strings["Dreamwidth Post Settings"] = "Configuración de las publicaciones en Dreamwidth"; -$a->strings["Enable dreamwidth Post Plugin"] = "Activar el módulo de publicación en Dreamwidth"; -$a->strings["dreamwidth username"] = "Nombre de usuario de Dreamwidth"; -$a->strings["dreamwidth password"] = "Contraseña de Dreamwidth"; -$a->strings["Post to dreamwidth by default"] = "Publicar en Dreamwidth por defecto"; -$a->strings["Submit"] = "Envíar"; diff --git a/sources/extend/addon/matrix/dwpost/lang/fr/strings.php b/sources/extend/addon/matrix/dwpost/lang/fr/strings.php deleted file mode 100644 index 729bb028..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/fr/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "Poster vers Dreamwidth"; -$a->strings["Dreamwidth Post Settings"] = "Réglages Dreamwidth"; -$a->strings["Enable dreamwidth Post Plugin"] = "Activer \"Poster vers Dreamwidth\""; -$a->strings["dreamwidth username"] = "Nom d'utilisateur Dreamwidth"; -$a->strings["dreamwidth password"] = "Mot de passe"; -$a->strings["Post to dreamwidth by default"] = "Poster vers Dreamwidth par défaut"; -$a->strings["Submit"] = "Envoyer"; diff --git a/sources/extend/addon/matrix/dwpost/lang/is/strings.php b/sources/extend/addon/matrix/dwpost/lang/is/strings.php deleted file mode 100644 index 96f1f78b..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/is/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = ""; -$a->strings["Dreamwidth Post Settings"] = ""; -$a->strings["Enable dreamwidth Post Plugin"] = ""; -$a->strings["dreamwidth username"] = ""; -$a->strings["dreamwidth password"] = ""; -$a->strings["Post to dreamwidth by default"] = ""; -$a->strings["Submit"] = "Senda inn"; diff --git a/sources/extend/addon/matrix/dwpost/lang/it/strings.php b/sources/extend/addon/matrix/dwpost/lang/it/strings.php deleted file mode 100644 index a47497aa..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/it/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "Posta su Dreamwidth"; -$a->strings["Dreamwidth Post Settings"] = "Impostazioni post Dreamwidth"; -$a->strings["Enable dreamwidth Post Plugin"] = "Abilita il plugin dreamwidth"; -$a->strings["dreamwidth username"] = "dreamwidth username"; -$a->strings["dreamwidth password"] = "Password dreamwidth"; -$a->strings["Post to dreamwidth by default"] = "Invia a dreamwidth per impostazione predefinita"; -$a->strings["Submit"] = "Invia"; diff --git a/sources/extend/addon/matrix/dwpost/lang/nb-no/strings.php b/sources/extend/addon/matrix/dwpost/lang/nb-no/strings.php deleted file mode 100644 index 37677e6d..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/nb-no/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = ""; -$a->strings["Dreamwidth Post Settings"] = ""; -$a->strings["Enable dreamwidth Post Plugin"] = ""; -$a->strings["dreamwidth username"] = ""; -$a->strings["dreamwidth password"] = ""; -$a->strings["Post to dreamwidth by default"] = ""; -$a->strings["Submit"] = "Lagre"; diff --git a/sources/extend/addon/matrix/dwpost/lang/pl/strings.php b/sources/extend/addon/matrix/dwpost/lang/pl/strings.php deleted file mode 100644 index 237c95d9..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/pl/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "Opublikuj na Dreamwidth"; -$a->strings["Dreamwidth Post Settings"] = ""; -$a->strings["Enable dreamwidth Post Plugin"] = ""; -$a->strings["dreamwidth username"] = ""; -$a->strings["dreamwidth password"] = ""; -$a->strings["Post to dreamwidth by default"] = ""; -$a->strings["Submit"] = "Potwierdź"; diff --git a/sources/extend/addon/matrix/dwpost/lang/pt-br/strings.php b/sources/extend/addon/matrix/dwpost/lang/pt-br/strings.php deleted file mode 100644 index 329cf9e3..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/pt-br/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "Publicar no Dreamwidth"; -$a->strings["Dreamwidth Post Settings"] = "Configurações de publicação no Dreamwidth"; -$a->strings["Enable dreamwidth Post Plugin"] = "Habilitar o plugin de publicação no Dreamwidth"; -$a->strings["dreamwidth username"] = "Nome de usuário do Dreamwidth"; -$a->strings["dreamwidth password"] = "Senha do Dreamwidth"; -$a->strings["Post to dreamwidth by default"] = "Publicar no Dreamwidth por padrão"; -$a->strings["Submit"] = "Enviar"; diff --git a/sources/extend/addon/matrix/dwpost/lang/ru/strings.php b/sources/extend/addon/matrix/dwpost/lang/ru/strings.php deleted file mode 100644 index 98b08781..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/ru/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = ""; -$a->strings["Dreamwidth Post Settings"] = "Dreamwidth наÑтройки Ñообщений"; -$a->strings["Enable dreamwidth Post Plugin"] = "Включить dreamwidth плагин Ñообщений"; -$a->strings["dreamwidth username"] = "dreamwidth Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"; -$a->strings["dreamwidth password"] = "dreamwidth пароль"; -$a->strings["Post to dreamwidth by default"] = ""; -$a->strings["Submit"] = "Подтвердить"; diff --git a/sources/extend/addon/matrix/dwpost/lang/sv/strings.php b/sources/extend/addon/matrix/dwpost/lang/sv/strings.php deleted file mode 100644 index 3ec569a7..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/sv/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Submit"] = "Spara"; diff --git a/sources/extend/addon/matrix/dwpost/lang/zh-cn/strings.php b/sources/extend/addon/matrix/dwpost/lang/zh-cn/strings.php deleted file mode 100644 index 93e075c6..00000000 --- a/sources/extend/addon/matrix/dwpost/lang/zh-cn/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Dreamwidth"] = "转播到Dreamwidth"; -$a->strings["Dreamwidth Post Settings"] = "Dreamwidth转播设置"; -$a->strings["Enable dreamwidth Post Plugin"] = "使Dreamwidth转播æ’件å¯ç”¨"; -$a->strings["dreamwidth username"] = "Dreamwidth用户å"; -$a->strings["dreamwidth password"] = "Dreamwidth密ç "; -$a->strings["Post to dreamwidth by default"] = "默认地转播到Dreamwidth"; -$a->strings["Submit"] = "æ交"; diff --git a/sources/extend/addon/matrix/embedly/embedly.php b/sources/extend/addon/matrix/embedly/embedly.php deleted file mode 100644 index 924c21dd..00000000 --- a/sources/extend/addon/matrix/embedly/embedly.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - */ - -function embedly_load() { - register_hook('oembed_probe','addon/embedly/embedly.php','embedly_oembed_probe'); -} - -function embedly_unload() { - unregister_hook('oembed_probe','addon/embedly/embedly.php','embedly_oembed_probe'); -} - -function embedly_oembed_probe($a,$b) { - // try oohembed service - $ourl = "http://oohembed.com/oohembed/?url=".$b['url'].'&maxwidth=' . $b['videowidth']; - $result = z_fetch_url($ourl); - if($result['success']) - $b['embed'] = $result['body']; -} \ No newline at end of file diff --git a/sources/extend/addon/matrix/extcron/extcron.php b/sources/extend/addon/matrix/extcron/extcron.php deleted file mode 100755 index 85169fe1..00000000 --- a/sources/extend/addon/matrix/extcron/extcron.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * Notes: External service needs to make a web request to http(s)://yoursite/extcron - */ - -function extcron_load() {} - -function extcron_unload() {} - -function extcron_module() {} - -function extcron_init(&$a) { - proc_run('php','include/poller.php'); - killme(); -} diff --git a/sources/extend/addon/matrix/flattrwidget/CHANGELOG b/sources/extend/addon/matrix/flattrwidget/CHANGELOG deleted file mode 100644 index fd5f3538..00000000 --- a/sources/extend/addon/matrix/flattrwidget/CHANGELOG +++ /dev/null @@ -1,3 +0,0 @@ -2013-09-22 Version 0.1 Tobias Diekershoff - initial version of the widget - * add a flattr button to left or right aside of the channel view diff --git a/sources/extend/addon/matrix/flattrwidget/README.md b/sources/extend/addon/matrix/flattrwidget/README.md deleted file mode 100644 index 9fc30baf..00000000 --- a/sources/extend/addon/matrix/flattrwidget/README.md +++ /dev/null @@ -1,76 +0,0 @@ -Flattr Widget for The Hubzilla -================================ -This widget is ment to add a [flattr][1] button for one thing to the -left/right aside area of a red# channel. For example this could be the flattr -thing for your blog (on a blog channel). - -What can be configured? - -* static button from your server or dynamic button generated using the flattr - API -* left or right aside area -* URL and Title of the thing you want to be flattred. - - If none are set, the channel URL and the title "_Channel Name_ on The Red - Matrix" will be used. - -There will also be a widget that adds the flattr button to each posting -separetely. - -Screenshots ------------ -_At the moment the screenshots will only show in your red# admin panel._ - -![Dynamic flattr button in channel view](/addon/flattrwidget/img/red-flattr-widget.png) - -Dynamic flattr button generated from the flattr API displaying the number of -flattrs received. - -![Static flattr button in channel view](/addon/flattrwidget/img/red-flattr-widget2.png) - -Static flattr buttton, the image is hosted on your server for privacy of the -visitors. - -Feedback --------- - -You can send feedback, bug reports etc, for this widget to [my red# stuff -feedback channel][3], you can also leave a flattr there if you like. - -Author ------- - -Original Author: [Tobias Diekershoff][TD] - -License -------- - -This widget id licensed under the [MIT][2] license. - -Copyright (c) 2013, Tobias Diekershoff - -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. - -The _flattr_ button located in the img directory was retrieved from the flattr -homepage. - -[1]: https://flattr.com -[2]: http://opensource.org/licenses/mit-license.php -[3]: https://diekershoff.de/channel/basredstuff -[TD]: https://diekershoff.de/channel/bavatar diff --git a/sources/extend/addon/matrix/flattrwidget/flattrwidget.php b/sources/extend/addon/matrix/flattrwidget/flattrwidget.php deleted file mode 100644 index e0c0f87e..00000000 --- a/sources/extend/addon/matrix/flattrwidget/flattrwidget.php +++ /dev/null @@ -1,129 +0,0 @@ - - * Maintainer: Tobias Diekershoff - */ - -function flattrwidget_load() { - register_hook('construct_page', 'addon/flattrwidget/flattrwidget.php', 'flattrwidget_construct_page'); - register_hook('feature_settings', 'addon/flattrwidget/flattrwidget.php', 'flattrwidget_settings'); - register_hook('feature_settings_post', 'addon/flattrwidget/flattrwidget.php', 'flattrwidget_settings_post'); -} - -function flattrwidget_unload() { - unregister_hook('construct_page', 'addon/flattrwidget/flattrwidget.php', 'flattrwidget_construct_page'); - unregister_hook('feature_settings', 'addon/flattrwidget/flattrwidget.php', 'flattrwidget_settings'); - unregister_hook('feature_settings_post', 'addon/flattrwidget/flattrwidget.php', 'flattrwidget_settings_post'); -} - -function flattrwidget_construct_page(&$a,&$b) { - if (! $b['module']=='channel') - return; - $id = $a->profile['profile_uid']; - $enable = intval(get_pconfig($id,'flattrwidget','enable')); - if (! $enable) - return; - $a->page['htmlhead'] .= ''; - // get alignment and static/dynamic from the settings - // align is either "aside" or "right_aside" - // sd is either static or dynamic - $lr = get_pconfig( $id, 'flattrwidget', 'align'); - $sd = get_pconfig( $id, 'flattrwidget', 'sd'); - // title of the thing for the things page on flattr - $ftitle = get_pconfig( $id, 'flattrwidget', 'title'); - // URL of the thing - $thing = get_pconfig( $id, 'flattrwidget', 'thing'); - // flattr user the thing belongs to - $user = get_pconfig( $id, 'flattrwidget', 'user'); - // title for the flattr button itself - $title = t('Flattr this!'); - // construct the link for the button - $link = 'https://flattr.com/submit/auto?user_id='.$user.'&url=' . rawurlencode($thing).'&title='.rawurlencode($ftitle); - if ($sd == 'static') { - // static button graphic from the img folder - $img = $a->get_baseurl() .'/addon/flattrwidget/img/flattr-badge-large.png'; - $code = ''.$title.''; - } else { - $code = ''; - // dynamic button from flattr API - } - // put the widget content together - $flattrwidget = '
'.$code.'
'; - // place the widget into the selected aside area - if ($lr=='right_aside') { - $b['layout']['region_right_aside'] = $flattrwidget . $b['layout']['region_right_aside']; - } else { - $b['layout']['region_aside'] = $flattrwidget . $b['layout']['region_aside']; - } -} -function flattrwidget_settings_post($a,$s) { - if(! local_channel() || (! x($_POST,'flattrwidget-submit'))) - return; - $c = $a->get_channel(); - set_pconfig( local_channel(), 'flattrwidget', 'align', $_POST['flattrwidget-align'] ); - set_pconfig( local_channel(), 'flattrwidget', 'sd', $_POST['flattrwidget-static'] ); - $thing = $_POST['flattrwidget-thing']; - if ($thing == '') { - $thing = $a->get_baseurl().'/channel/'.$c['channel_address']; - } - set_pconfig( local_channel(), 'flattrwidget', 'thing', $thing); - set_pconfig( local_channel(), 'flattrwidget', 'user', $_POST['flattrwidget-user']); - $ftitle = $_POST['flattrwidget-thingtitle']; - if ($ftitle == '') { - $ftitle = $c['channel_name'].' on The Hubzilla'; - } - set_pconfig( local_channel(), 'flattrwidget', 'title', $ftitle); - set_pconfig( local_channel(), 'flattrwidget', 'enable', intval($_POST['flattrwidget-enable'])); - info(t('Flattr widget settings updated.').EOL); -} -function flattrwidget_settings(&$a,&$s) { - $id = local_channel(); - if (! $id) - return; - - //$a->page['htmlhead'] .= ''; - $lr = get_pconfig( $id, 'flattrwidget', 'align'); - $sd = get_pconfig( $id, 'flattrwidget', 'sd'); - $thing = get_pconfig( $id, 'flattrwidget', 'thing'); - $user = get_pconfig( $id, 'flattrwidget', 'user'); - $ftitle = get_pconfig( $id, 'flattrwidget', 'title'); - $enable = intval(get_pconfig(local_channel(),'flattrwidget','enable')); - $enable_checked = (($enable) ? 1 : false); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('flattrwidget-user', t('Flattr user'), $user, '') - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('flattrwidget-thing', t('URL of the Thing to flattr'), $thing, t('If empty channel URL is used')) - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('flattrwidget-thingtitle', t('Title of the Thing to flattr'), $ftitle, t('If empty "channel name on The Hubzilla" will be used')) - )); - - $sc .= replace_macros(get_markup_template('field_select.tpl'), array( - '$field' => array('flattrwidget-static', t('Static or dynamic flattr button'), $sd, '', array('static'=>t('static'), 'dynamic'=>t('dynamic'))) - )); - - $sc .= replace_macros(get_markup_template('field_select.tpl'), array( - '$field' => array('flattrwidget-align', t('Alignment of the widget'), $lr, '', array('aside'=>t('left'), 'right_aside'=>t('right'))) - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('flattrwidget-enable', t('Enable Flattr widget'), $enable_checked, '', array(t('No'),t('Yes'))), - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('flattrwidget',t('Flattr Widget Settings'), '', t('Submit')), - '$content' => $sc - )); - - -} diff --git a/sources/extend/addon/matrix/flattrwidget/img/flattr-badge-large.png b/sources/extend/addon/matrix/flattrwidget/img/flattr-badge-large.png deleted file mode 100644 index 11053058..00000000 Binary files a/sources/extend/addon/matrix/flattrwidget/img/flattr-badge-large.png and /dev/null differ diff --git a/sources/extend/addon/matrix/flattrwidget/img/red-flattr-widget.png b/sources/extend/addon/matrix/flattrwidget/img/red-flattr-widget.png deleted file mode 100644 index c7226382..00000000 Binary files a/sources/extend/addon/matrix/flattrwidget/img/red-flattr-widget.png and /dev/null differ diff --git a/sources/extend/addon/matrix/flattrwidget/img/red-flattr-widget2.png b/sources/extend/addon/matrix/flattrwidget/img/red-flattr-widget2.png deleted file mode 100644 index 84b886e7..00000000 Binary files a/sources/extend/addon/matrix/flattrwidget/img/red-flattr-widget2.png and /dev/null differ diff --git a/sources/extend/addon/matrix/fortunate/README b/sources/extend/addon/matrix/fortunate/README deleted file mode 100644 index 8297cf41..00000000 --- a/sources/extend/addon/matrix/fortunate/README +++ /dev/null @@ -1,7 +0,0 @@ -This addon requires a fortune server. You may use the DB supplied here to create one. - -gunzip the fortunate.sql.gz and import into your database. -Copy cookie.php to the top level Friendica directory. -Edit fortunate.php and change FORTUNATE_SERVER definition to your hostname. Change the http in that file to https if your server doesn't support http. - -Many additional options are available if you examine cookie.php - a clever developer can provide a settings page to tailor this to one's liking. Also several languages are supported, and it would be convenient to set this to the current Friendica language if that is amongst those supported. \ No newline at end of file diff --git a/sources/extend/addon/matrix/fortunate/cookie.php b/sources/extend/addon/matrix/fortunate/cookie.php deleted file mode 100644 index a4be4ef0..00000000 --- a/sources/extend/addon/matrix/fortunate/cookie.php +++ /dev/null @@ -1,351 +0,0 @@ -real_escape_string($_GET['lang']); - -if(strlen($_GET['pattern'])) - $pattern = @$db->real_escape_string($_GET['pattern']); - -if(strlen($_GET['regex'])) - $regex = @$db->real_escape_string($_GET['regex']); - -if(strlen($_GET['db'])) - $table = @$db->real_escape_string($_GET['db']); -else - $table = ''; - -if($length < 0) - $length = 0; -if($numlines < 0) - $numlines = 0; - -function do_query($table,$length,$numlines,$adult,$cat,$limit,$lang,$pattern,$regex,$equal) { - global $db; - $rnd = mt_rand(); - $r = array(); - - $typesql = (($table) ? " WHERE `category` = '$table' " : " WHERE 1 "); - $lengthsql = (($length) ? " AND LENGTH(`text`) < $length " : "" ); - - if($adult == 2) - $adultsql = " AND offensive = 1 "; - elseif($adult == 1) - $adultsql = ""; - else - $adultsql = " AND offensive = 0 "; - - - if($numlines) - $lengthsql .= - " AND (LENGTH(`text`) - LENGTH(REPLACE(`text`,\"\n\",\"\"))) <= $numlines "; - - $langsql = (($lang === 'any') ? '' : " AND lang = '$lang' "); - - $patsql = ''; - if(strlen($pattern)) - $patsql = " AND MATCH text AGAINST ('$pattern') "; - - $regexsql = ''; - if(strlen($regex)) - $regexsql = " AND text REGEXP '$regex' "; - - $eqsql = ''; - - if($equal) { - $catsavail = array(); - $res = @$db->query("SELECT DISTINCT ( `category` ) FROM `fortune` - $typesql - $adultsql - $lengthsql - $langsql - $patsql - $regexsql "); - if($res->num_rows) { - while($x = $res->fetch_array(MYSQL_ASSOC)) - $catsavail[] = $x['category']; - - $eqsql = " AND `category` = '" - . $catsavail[mt_rand(0,$res->num_rows - 1)] . "' "; - } - } - - $order = (($patsql && $limit == 1) ? "" : "ORDER BY RAND($rnd)" ); - - $result = @$db->query("SELECT `text`, `category` FROM `fortune` - $typesql - $adultsql - $lengthsql - $langsql - $patsql - $regexsql - $eqsql - $order - LIMIT $limit"); - - if($result->num_rows) { - while($x = $result->fetch_array(MYSQL_ASSOC)) - $r[] = fortune_to_html($x['text']) - .(($cat) ? "
[{$x['category']}]
" : ""); - } - return $r; -} - - -function do_stats($table,$length,$numlines,$adult,$cat,$limit,$lang,$pattern,$regex,$equal) { - global $db; - $rnd = mt_rand(); - $r = array(); - - $typesql = (($table) ? " WHERE `category` = '$table' " : " WHERE 1 "); - $lengthsql = (($length) ? " AND LENGTH(`text`) < $length " : "" ); - - if($adult == 2) - $adultsql = " AND offensive = 1 "; - elseif($adult == 1) - $adultsql = ""; - else - $adultsql = " AND offensive = 0 "; - - - if($numlines) - $lengthsql .= - " AND (LENGTH(`text`) - LENGTH(REPLACE(`text`,\"\n\",\"\"))) <= $numlines "; - - $langsql = " AND lang = '$lang' "; - - $patsql = ''; - if(strlen($pattern)) - $patsql = " AND MATCH text AGAINST ('$pattern') "; - - $regexsql = ''; - if(strlen($regex)) - $regexsql = " AND text REGEXP '$regex' "; - - $eqsql = ''; - - $result = @$db->query("SELECT `text`, `category` FROM `fortune` - $typesql - $adultsql - $lengthsql - $langsql - $patsql - $regexsql - $eqsql"); - - - echo '
' . $result->num_rows . ' matching quotations.
'; - - - $res = @$db->query("SELECT DISTINCT ( `category` ) FROM `fortune` - $typesql - $adultsql - $lengthsql - $langsql - $patsql - $regexsql "); - if($res->num_rows) { - echo '
Matching Databases:
'; - while($x = $res->fetch_array(MYSQL_ASSOC)) - echo $x['category'].'
'; - - } - else - echo '
No matching databases using those search parameters - please refine your options.
'; - - -} - - -function fortune_to_html($s) { - - // First pass - escape all the HTML entities, and while we're at it - // get rid of any MS-DOS end-of-line characters and expand tabs to - // 8 non-breaking spaces, and translate linefeeds to
. - // We also get rid of ^G which used to sound the terminal beep or bell - // on ASCII terminals and were humourous in some fortunes. - // We could map these to autoplay a short sound file but browser support - // is still sketchy and then there's the issue of where to locate the - // URL, and a lot of people find autoplay sounds downright annoying. - // So for now, just remove them. - - $s = str_replace( - array("&", - "<", - ">", - '"', - "\007", - "\t", - "\r", - "\n"), - - array("&", - "<", - ">", - """, - "", - "        ", - "", - "
"), - $s); - // Replace pseudo diacritics - // These were used to produce accented characters. For instance an accented - // e would have been encoded by '^He - the backspace moving the cursor - // backward so both the single quote and the e would appear in the same - // character position. Umlauts were quite clever - they used a double quote - // as the accent mark over a normal character. - - $s = preg_replace("/'\010([a-zA-Z])/","&\\1acute;",$s); - $s = preg_replace("/\"\010([a-zA-Z])/","&\\1uml;",$s); - $s = preg_replace("/\`\010([a-zA-Z])/","&\\1grave;",$s); - $s = preg_replace("/\^\010([a-zA-Z])/","&\\1circ;",$s); - $s = preg_replace("/\~\010([a-zA-Z])/","&\\1tilde;",$s); - - // Ignore multiple underlines for the same character. These were - // most useful when sent to a line printer back in the day as it - // would type over the same character a number of times making it - // much darker (e.g. bold). I think there are only one or two - // instances of this in the current (2008) fortune cookie database. - - $s = preg_replace("/(_\010)+/","_\010",$s); - // Map the characters which sit underneath a backspace. - // If you can come up with a regex to do all of the following - // madness - be my guest. - // It's not as simple as you think. We need to take something - // that has been backspaced over an arbitrary number of times - // and wrap a forward looking matching number of characters in - // HTML, whilst deciding if it's intended as an underline or - // strikeout sequence. - - // Essentially we produce a string of '1' and '0' characters - // the same length as the source text. - // Any position which is marked '1' has been backspaced over. - - $cursor = 0; - $dst = $s; - $bs_found = false; - for($x = 0; $x < strlen($s); $x ++) { - if($s[$x] == "\010" && $cursor) { - $bs_found = true; - $cursor --; - $dst[$cursor] = '1'; - $dst[$x] = '0'; - $continue; - } - else { - if($bs_found) { - $bs_found = false; - $cursor = $x; - } - $dst[$cursor] = '0'; - $cursor ++; - } - - } - - $out = ''; - $strike = false; - $bold = false; - - // Underline sequence, convert to bold to avoid confusion with links. - // These were generally used for emphasis so it's a reasonable choice. - // Please note that this logic will fail if there is an underline sequence - // and also a strikeout sequence in the same fortune. - - if(strstr($s,"_\010")) { - $len = 0; - for($x = 0; $x < strlen($s); $x ++) { - if($dst[$x] == '1') { - $len ++; - $bold = true; - } - else { - if($bold) { - $out .= ''; - while($s[$x] == "\010") - $x ++; - $out .= substr($s,$x,$len); - $out .= ''; - $x = $x + $len - 1; - $len = 0; - $bold = false; - } - else - $out .= $s[$x]; - } - } - } - - // These aren't seen very often these days - simulation of - // backspace/replace. You could occasionally see the original text - // on slower terminals before it got replaced. Once modems reached - // 4800/9600 baud in the late 70's and early 80's the effect was - // mostly lost - but if you find a really old fortune file you might - // encounter a few of these. - - else { - for($x = 0; $x < strlen($s); $x ++) { - if($dst[$x] == '1') { - if($strike) - $out .= $s[$x]; - else - $out .= ''.$s[$x]; - $strike = true; - } - else { - if($strike) - $out .= ''; - $strike = false; - $out .= $s[$x]; - } - } - } - - // Many of the underline sequences are also wrapped in asterisks, - // which was yet another way of marking ASCII as 'bold'. - // So if it's an underline sequence, and there are asterisks - // on both ends, strip the asterisks as we've already emboldened the text. - - $out = preg_replace('/\*([^<]*<\/strong>)\*/',"\\1",$out); - - // Finally, remove the backspace characters which we don't need anymore. - - return str_replace("\010","",$out); -} - -$result1 = do_query($table,$length,$numlines,$adult,$cat,1,$lang,$pattern,$regex,$equal); - -if(count($result1)) - echo $result1[0]; - -if($stats) - do_stats($table,$length,$numlines,$adult,$cat,1,$lang,$pattern,$regex,$equal); - - diff --git a/sources/extend/addon/matrix/fortunate/fortunate.apd b/sources/extend/addon/matrix/fortunate/fortunate.apd deleted file mode 100644 index d1c72473..00000000 --- a/sources/extend/addon/matrix/fortunate/fortunate.apd +++ /dev/null @@ -1,3 +0,0 @@ -url: $baseurl/fortunate -name: Fortunate -photo: $baseurl/addon/fortunate/fortunate.png diff --git a/sources/extend/addon/matrix/fortunate/fortunate.css b/sources/extend/addon/matrix/fortunate/fortunate.css deleted file mode 100644 index 61813b7d..00000000 --- a/sources/extend/addon/matrix/fortunate/fortunate.css +++ /dev/null @@ -1,7 +0,0 @@ -.fortunate { - margin-top: 25px; - margin-left: 100px; - margin-bottom: 25px; - color: #000088; - font-size: 14px; -} \ No newline at end of file diff --git a/sources/extend/addon/matrix/fortunate/fortunate.php b/sources/extend/addon/matrix/fortunate/fortunate.php deleted file mode 100644 index 5b0f47ac..00000000 --- a/sources/extend/addon/matrix/fortunate/fortunate.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ - - -function fortunate_load() { - register_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch'); - -} - -function fortunate_unload() { - unregister_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch'); -} - -function fortunate_module(){} - - -function fortunate_fetch(&$a,&$b) { - - $fort_server = get_config('fortunate','server'); - if(! $fort_server) - return; - - $a->page['htmlhead'] .= '' . "\r\n"; - - $s = z_fetch_url('http://' . $fort_server . '/cookie.php?numlines=4&equal=1&rand=' . mt_rand()); - if($s['success']) - $b .= '
' . $s['body'] . '
'; - -} - -function fortunate_content(&$a) { - -// $o = ''; -// fortunate_fetch($a,$o); -// return $o; - -} \ No newline at end of file diff --git a/sources/extend/addon/matrix/fortunate/fortunate.png b/sources/extend/addon/matrix/fortunate/fortunate.png deleted file mode 100644 index 894a94c7..00000000 Binary files a/sources/extend/addon/matrix/fortunate/fortunate.png and /dev/null differ diff --git a/sources/extend/addon/matrix/fortunate/fortunemod.sql.gz b/sources/extend/addon/matrix/fortunate/fortunemod.sql.gz deleted file mode 100644 index 2ce0e557..00000000 Binary files a/sources/extend/addon/matrix/fortunate/fortunemod.sql.gz and /dev/null differ diff --git a/sources/extend/addon/matrix/frphotos/frphotohelper.php b/sources/extend/addon/matrix/frphotos/frphotohelper.php deleted file mode 100644 index c2edc3e3..00000000 --- a/sources/extend/addon/matrix/frphotos/frphotohelper.php +++ /dev/null @@ -1,75 +0,0 @@ -get_channel(); - - $fr_server = $_REQUEST['fr_server']; - $fr_username = $_REQUEST['fr_username']; - $fr_password = $_REQUEST['fr_password']; - - $cookies = 'store/[data]/frphoto_cookie_' . $channel['channel_address']; - - if($fr_server && $fr_username && $fr_password) { - - $ch = curl_init($fr_server . '/api/friendica/photos/list'); - - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookies); - curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookies); - curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_setopt($ch, CURLOPT_USERPWD, $fr_username . ':' . $fr_password); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_USERAGENT, 'Hubzilla'); - - $output = curl_exec($ch); - curl_close($ch); - - $j = json_decode($output,true); - -// echo print_r($j,true); - - $total = 0; - if(count($j)) { - foreach($j as $jj) { - - $r = q("select uid from photo where resource_id = '%s' and uid = %d limit 1", - dbesc($jj), - intval($channel['channel_id']) - ); - if($r) - continue; - - $total ++; - proc_run('php','addon/frphotos/frphotohelper.php',$jj, $channel['channel_address'], urlencode($fr_server)); - sleep(3); - } - } - if($total) { - set_pconfig(local_channel(),'frphotos','complete','1'); - } - @unlink($cookies); - goaway(z_root() . '/photos/' . $channel['channel_address']); - } -} - - -function frphotos_content(&$a) { - - if(! local_channel()) { - notice( t('Permission denied') . EOL); - return; - } - - if(intval(get_pconfig(local_channel(),'frphotos','complete'))) { - info('Friendica photos have already been imported into this channel.'); - return; - } - - $o = replace_macros(get_markup_template('frphotos.tpl','addon/frphotos'),array( - '$header' => t('Friendica Photo Album Import'), - '$desc' => t('This will import all your Friendica photo albums to this Red channel.'), - '$fr_server' => array('fr_server', t('Friendica Server base URL'),'',''), - '$fr_username' => array('fr_username', t('Friendica Login Username'),'',''), - '$fr_password' => array('fr_password', t('Friendica Login Password'),'',''), - '$submit' => t('Submit'), - )); - return $o; -} diff --git a/sources/extend/addon/matrix/frphotos/view/tpl/frphotos.tpl b/sources/extend/addon/matrix/frphotos/view/tpl/frphotos.tpl deleted file mode 100644 index b8e97882..00000000 --- a/sources/extend/addon/matrix/frphotos/view/tpl/frphotos.tpl +++ /dev/null @@ -1,13 +0,0 @@ -

{{$header}}

- -

{{$desc}}

- -
- -{{include file="field_input.tpl" field=$fr_server}} -{{include file="field_input.tpl" field=$fr_username}} -{{include file="field_password.tpl" field=$fr_password}} - - -
- diff --git a/sources/extend/addon/matrix/hexit/hexit.apd b/sources/extend/addon/matrix/hexit/hexit.apd deleted file mode 100644 index af0b05fb..00000000 --- a/sources/extend/addon/matrix/hexit/hexit.apd +++ /dev/null @@ -1,3 +0,0 @@ -url: $baseurl/hexit -name: Hexit -photo: $baseurl/addon/hexit/hexit.png diff --git a/sources/extend/addon/matrix/hexit/hexit.php b/sources/extend/addon/matrix/hexit/hexit.php deleted file mode 100644 index bd9b7204..00000000 --- a/sources/extend/addon/matrix/hexit/hexit.php +++ /dev/null @@ -1,185 +0,0 @@ - -/** - * A function for converting hex <-> dec w/o loss of precision. - * - * The problem is that parseInt("0x12345...") isn't precise enough to convert - * 64-bit integers correctly. - * - * Internally, this uses arrays to encode decimal digits starting with the least - * significant: - * 8 = [8] - * 16 = [6, 1] - * 1024 = [4, 2, 0, 1] - */ - -// Adds two arrays for the given base (10 or 16), returning the result. -// This turns out to be the only "primitive" operation we need. -function add(x, y, base) { - var z = []; - var n = Math.max(x.length, y.length); - var carry = 0; - var i = 0; - while (i < n || carry) { - var xi = i < x.length ? x[i] : 0; - var yi = i < y.length ? y[i] : 0; - var zi = carry + xi + yi; - z.push(zi % base); - carry = Math.floor(zi / base); - i++; - } - return z; -} - -// Returns a*x, where x is an array of decimal digits and a is an ordinary -// JavaScript number. base is the number base of the array x. -function multiplyByNumber(num, x, base) { - if (num < 0) return null; - if (num == 0) return []; - - var result = []; - var power = x; - while (true) { - if (num & 1) { - result = add(result, power, base); - } - num = num >> 1; - if (num === 0) break; - power = add(power, power, base); - } - - return result; -} - -function parseToDigitsArray(str, base) { - var digits = str.split(''); - var ary = []; - for (var i = digits.length - 1; i >= 0; i--) { - var n = parseInt(digits[i], base); - if (isNaN(n)) return null; - ary.push(n); - } - return ary; -} - -function convertBase(str, fromBase, toBase) { - var digits = parseToDigitsArray(str, fromBase); - if (digits === null) return null; - - var outArray = []; - var power = [1]; - for (var i = 0; i < digits.length; i++) { - // invariant: at this point, fromBase^i = power - if (digits[i]) { - outArray = add(outArray, multiplyByNumber(digits[i], power, toBase), toBase); - } - power = multiplyByNumber(fromBase, power, toBase); - } - - var out = ''; - for (var i = outArray.length - 1; i >= 0; i--) { - out += outArray[i].toString(toBase); - } - return out; -} - -function decToHex(decStr) { - var hex = convertBase(decStr, 10, 16); - return hex ? '0x' + hex : null; -} - -function hexToDec(hexStr) { - if (hexStr.substring(0, 2) === '0x') hexStr = hexStr.substring(2); - hexStr = hexStr.toLowerCase(); - return convertBase(hexStr, 16, 10); -} - - - - function str_or_null(x) { - return x === null ? 'null' : x; - } - - // "1.234e+5" -> "12340" - function expandExponential(x) { - var pos = x.indexOf("e"); - if (pos === -1) pos = x.indexOf("E"); - if (pos === -1) return x; - - var base = x.substring(0, pos); - var pow = parseInt(x.substring(pos + 1), 10); - if (pow < 0) return x; // not supported. - - var dotPos = base.indexOf('.'); - if (dotPos === -1) dotPos = base.length; - - var ret = base.replace('.', ''); - while (ret.length < dotPos + pow) ret += '0'; - return ret; - } - - function boldDifference(correct, actual) { - for (var i = 0, j = 0; i < correct.length && j < actual.length; i++, j++) { - if (correct[i] !== actual[j]) { - break; - } - } - if (j < actual.length) { - return actual.substring(0, j) + '' + actual.substring(j) + ''; - } else { - return actual; - } - } - - function convert() { - var input = document.getElementById("in").value; - if (input) { - var aHex = str_or_null(decToHex(input)); - var aDec = str_or_null(hexToDec(input)); - var bHex = '0x' + (parseInt(input, 10)).toString(16); - var bDec = "" + expandExponential("" +parseInt(input, 16)); - - var html = '

To Decimal(' + input + ') = ' + aDec + '

'; - html += '

To Hex(' + input + ') = ' + aHex + '

'; - document.getElementById('result').innerHTML = html; - } - } - convert(); - - - - -

Hexit

- -

Type in a hex or decimal string:

- -

- - - -EOT; - -return $o; -} diff --git a/sources/extend/addon/matrix/hexit/hexit.png b/sources/extend/addon/matrix/hexit/hexit.png deleted file mode 100644 index 990f7ead..00000000 Binary files a/sources/extend/addon/matrix/hexit/hexit.png and /dev/null differ diff --git a/sources/extend/addon/matrix/ijpost/ijpost.php b/sources/extend/addon/matrix/ijpost/ijpost.php deleted file mode 100644 index 863a2b05..00000000 --- a/sources/extend/addon/matrix/ijpost/ijpost.php +++ /dev/null @@ -1,229 +0,0 @@ - - * Author: Michael Johnston - * Author: Cat Gray - */ - -require_once('include/permissions.php'); - -function ijpost_load() { - register_hook('post_local', 'addon/ijpost/ijpost.php', 'ijpost_post_local'); - register_hook('notifier_normal', 'addon/ijpost/ijpost.php', 'ijpost_send'); - register_hook('jot_networks', 'addon/ijpost/ijpost.php', 'ijpost_jot_nets'); - register_hook('feature_settings', 'addon/ijpost/ijpost.php', 'ijpost_settings'); - register_hook('feature_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post'); - -} -function ijpost_unload() { - unregister_hook('post_local', 'addon/ijpost/ijpost.php', 'ijpost_post_local'); - unregister_hook('notifier_normal', 'addon/ijpost/ijpost.php', 'ijpost_send'); - unregister_hook('jot_networks', 'addon/ijpost/ijpost.php', 'ijpost_jot_nets'); - unregister_hook('feature_settings', 'addon/ijpost/ijpost.php', 'ijpost_settings'); - unregister_hook('feature_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post'); - -} - - -function ijpost_jot_nets(&$a,&$b) { - if((! local_channel()) || (! perm_is_allowed(local_channel(),'','view_stream'))) - return; - - $ij_post = get_pconfig(local_channel(),'ijpost','post'); - if(intval($ij_post) == 1) { - $ij_defpost = get_pconfig(local_channel(),'ijpost','post_by_default'); - $selected = ((intval($ij_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '
' - . t('Post to Insanejournal') . '
'; - } -} - - -function ijpost_settings(&$a,&$s) { - - if(! local_channel()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - //$a->page['htmlhead'] .= '' . "\r\n"; - - /* Get the current state of our config variables */ - - $enabled = get_pconfig(local_channel(),'ijpost','post'); - - $checked = (($enabled) ? 1 : false); - - $def_enabled = get_pconfig(local_channel(),'ijpost','post_by_default'); - - $def_checked = (($def_enabled) ? 1 : false); - - $ij_username = get_pconfig(local_channel(), 'ijpost', 'ij_username'); - $ij_password = z_unobscure(get_pconfig(local_channel(), 'ijpost', 'ij_password')); - - - /* Add some HTML to the existing form */ - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('ijpost', t('Enable InsaneJournal Post Plugin'), $checked, '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('ij_username', t('InsaneJournal username'), $ij_username, '') - )); - - $sc .= replace_macros(get_markup_template('field_password.tpl'), array( - '$field' => array('ij_password', t('InsaneJournal password'), $ij_password, '') - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('ij_bydefault', t('Post to InsaneJournal by default'), $def_checked, '', array(t('No'),t('Yes'))), - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('ijpost',t('InsaneJournal Post Settings'), '', t('Submit')), - '$content' => $sc - )); - -} - - -function ijpost_settings_post(&$a,&$b) { - - if(x($_POST,'ijpost-submit')) { - - set_pconfig(local_channel(),'ijpost','post',intval($_POST['ijpost'])); - set_pconfig(local_channel(),'ijpost','post_by_default',intval($_POST['ij_bydefault'])); - set_pconfig(local_channel(),'ijpost','ij_username',trim($_POST['ij_username'])); - set_pconfig(local_channel(),'ijpost','ij_password',z_obscure(trim($_POST['ij_password']))); - info( t('Insane Journal Settings saved.') . EOL); - } - -} - -function ijpost_post_local(&$a,&$b) { - - // This can probably be changed to allow editing by pointing to a different API endpoint - - if($b['edit']) - return; - - if((! local_channel()) || (local_channel() != $b['uid'])) - return; - - if($b['item_private'] || $b['parent']) - return; - - $ij_post = intval(get_pconfig(local_channel(),'ijpost','post')); - - $ij_enable = (($ij_post && x($_REQUEST,'ijpost_enable')) ? intval($_REQUEST['ijpost_enable']) : 0); - - if($_REQUEST['api_source'] && intval(get_pconfig(local_channel(),'ijpost','post_by_default'))) - $ij_enable = 1; - - if(! $ij_enable) - return; - - if(strlen($b['postopts'])) - $b['postopts'] .= ','; - $b['postopts'] .= 'ijpost'; -} - - - - -function ijpost_send(&$a,&$b) { - - if((! is_item_normal($b)) || $b['item_private'] || ($b['created'] !== $b['edited'])) - return; - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - if(! strstr($b['postopts'],'ijpost')) - return; - - if($b['parent'] != $b['id']) - return; - - logger('Insanejournal xpost invoked'); - - // insanejournal post in the LJ user's timezone. - // Hopefully the person's Friendica account - // will be set to the same thing. - - $tz = 'UTC'; - - $x = q("select channel_timezone from channel where channel_id = %d limit 1", - intval($b['uid']) - ); - if($x && strlen($x[0]['channel_timezone'])) - $tz = $x[0]['channel_timezone']; - - $ij_username = get_pconfig($b['uid'],'ijpost','ij_username'); - $ij_password = z_unobscure(get_pconfig($b['uid'],'ijpost','ij_password')); - $ij_blog = 'http://www.insanejournal.com/interface/xmlrpc'; - - if($ij_username && $ij_password && $ij_blog) { - - require_once('include/bbcode.php'); - require_once('include/datetime.php'); - - $title = $b['title']; - $post = bbcode($b['body']); - $post = xmlify($post); - $tags = ijpost_get_tags($b['tag']); - - $date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s'); - $year = intval(substr($date,0,4)); - $mon = intval(substr($date,5,2)); - $day = intval(substr($date,8,2)); - $hour = intval(substr($date,11,2)); - $min = intval(substr($date,14,2)); - - $xml = <<< EOT - -LJ.XMLRPC.postevent - - -year$year -mon$mon -day$day -hour$hour -min$min -event$post -username$ij_username -password$ij_password -subject$title -lineendingsunix -ver1 -props - -useragentHubzilla -taglist$tags - - - - - -EOT; - - logger('ijpost: data: ' . $xml, LOGGER_DATA); - - if($ij_blog !== 'test') - $x = z_post_url($ij_blog,$xml,array('headers' => array("Content-Type: text/xml"))); - logger('posted to insanejournal: ' . print_r($x,true), LOGGER_DEBUG); - - } -} - -function ijpost_get_tags($post) -{ - preg_match_all("/\]([^\[#]+)\[/",$post,$matches); - $tags = implode(', ',$matches[1]); - return $tags; -} diff --git a/sources/extend/addon/matrix/ijpost/lang/C/messages.po b/sources/extend/addon/matrix/ijpost/lang/C/messages.po deleted file mode 100644 index 4f62c23a..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/C/messages.po +++ /dev/null @@ -1,46 +0,0 @@ -# ADDON ijpost -# Copyright (C) -# This file is distributed under the same license as the Friendica ijpost addon package. -# -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-27 05:01-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ijpost.php:39 -msgid "Post to Insanejournal" -msgstr "" - -#: ijpost.php:70 -msgid "InsaneJournal Post Settings" -msgstr "" - -#: ijpost.php:72 -msgid "Enable InsaneJournal Post Plugin" -msgstr "" - -#: ijpost.php:77 -msgid "InsaneJournal username" -msgstr "" - -#: ijpost.php:82 -msgid "InsaneJournal password" -msgstr "" - -#: ijpost.php:87 -msgid "Post to InsaneJournal by default" -msgstr "" - -#: ijpost.php:93 -msgid "Submit" -msgstr "" diff --git a/sources/extend/addon/matrix/ijpost/lang/ca/strings.php b/sources/extend/addon/matrix/ijpost/lang/ca/strings.php deleted file mode 100644 index b5382615..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/ca/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "Enviament a Insanejournal"; -$a->strings["InsaneJournal Post Settings"] = "Ajustos d'Enviament a Insanejournal"; -$a->strings["Enable InsaneJournal Post Plugin"] = "Habilita el Plugin d'Enviaments a Insanejournal"; -$a->strings["InsaneJournal username"] = "Nom d'usuari de Insanejournal"; -$a->strings["InsaneJournal password"] = "Contrasenya de Insanejournal"; -$a->strings["Post to InsaneJournal by default"] = "Enviar per defecte a Insanejournal"; -$a->strings["Submit"] = "Enviar"; diff --git a/sources/extend/addon/matrix/ijpost/lang/cs/strings.php b/sources/extend/addon/matrix/ijpost/lang/cs/strings.php deleted file mode 100644 index 8e40419a..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/cs/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "Odeslat na Insanejournal"; -$a->strings["InsaneJournal Post Settings"] = "Nastavení příspÄ›vků pro InsaneJournal"; -$a->strings["Enable InsaneJournal Post Plugin"] = "Povolit Insanejournal plugin"; -$a->strings["InsaneJournal username"] = "Insanejournal uživatelské jméno"; -$a->strings["InsaneJournal password"] = "Insanejournal heslo"; -$a->strings["Post to InsaneJournal by default"] = "DefaultnÄ› zasílat příspÄ›vky na InsaneJournal"; -$a->strings["Submit"] = "Odeslat"; diff --git a/sources/extend/addon/matrix/ijpost/lang/de/strings.php b/sources/extend/addon/matrix/ijpost/lang/de/strings.php deleted file mode 100644 index 319a9743..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/de/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "Auf InsaneJournal posten."; -$a->strings["InsaneJournal Post Settings"] = "InsaneJournal Beitrags-Einstellungen"; -$a->strings["Enable InsaneJournal Post Plugin"] = "InsaneJournal Plugin aktivieren"; -$a->strings["InsaneJournal username"] = "InsaneJournal Benutzername"; -$a->strings["InsaneJournal password"] = "InsaneJournal Passwort"; -$a->strings["Post to InsaneJournal by default"] = "Standardmäßig auf InsaneJournal posten."; -$a->strings["Submit"] = "Senden"; diff --git a/sources/extend/addon/matrix/ijpost/lang/eo/strings.php b/sources/extend/addon/matrix/ijpost/lang/eo/strings.php deleted file mode 100644 index 11698887..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/eo/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "AfiÅi al Insanejournal"; -$a->strings["InsaneJournal Post Settings"] = "Agordoj pri Insaenejournal AfiÅoj"; -$a->strings["Enable InsaneJournal Post Plugin"] = "Åœalti la InsaneJournal afiÅo kromprogramon."; -$a->strings["InsaneJournal username"] = "Salutnomo ĉe InsaneJournal"; -$a->strings["InsaneJournal password"] = "Pasvorto ĉe InsaneJournal"; -$a->strings["Post to InsaneJournal by default"] = "DefaÅ­lte afiÅi ĉe InsaneJournal"; -$a->strings["Submit"] = "Sendi"; diff --git a/sources/extend/addon/matrix/ijpost/lang/es/strings.php b/sources/extend/addon/matrix/ijpost/lang/es/strings.php deleted file mode 100644 index 4468be83..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/es/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "Publicar en Insanejournal"; -$a->strings["InsaneJournal Post Settings"] = "Configuración de publicación en Insanejournal"; -$a->strings["Enable InsaneJournal Post Plugin"] = "Activar el módulo de publicación en Insanejournal"; -$a->strings["InsaneJournal username"] = "Nombre de usuario de Insanejournal"; -$a->strings["InsaneJournal password"] = "Contraseña de Insanejournal"; -$a->strings["Post to InsaneJournal by default"] = "Publicar en Insanejournal por defecto"; -$a->strings["Submit"] = "Envíar"; diff --git a/sources/extend/addon/matrix/ijpost/lang/fr/strings.php b/sources/extend/addon/matrix/ijpost/lang/fr/strings.php deleted file mode 100644 index 7db58ccf..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/fr/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "Publier vers InsaneJournal"; -$a->strings["InsaneJournal Post Settings"] = "Réglages InsaneJournal"; -$a->strings["Enable InsaneJournal Post Plugin"] = "Activer le connecteur InsaneJournal"; -$a->strings["InsaneJournal username"] = "Utilisateur InsaneJournal"; -$a->strings["InsaneJournal password"] = "Mot de passe InsaneJournal"; -$a->strings["Post to InsaneJournal by default"] = "Publier sur InsaneJournal par défaut"; -$a->strings["Submit"] = "Envoyer"; diff --git a/sources/extend/addon/matrix/ijpost/lang/is/strings.php b/sources/extend/addon/matrix/ijpost/lang/is/strings.php deleted file mode 100644 index b79f347e..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/is/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = ""; -$a->strings["InsaneJournal Post Settings"] = ""; -$a->strings["Enable InsaneJournal Post Plugin"] = ""; -$a->strings["InsaneJournal username"] = ""; -$a->strings["InsaneJournal password"] = ""; -$a->strings["Post to InsaneJournal by default"] = ""; -$a->strings["Submit"] = "Senda inn"; diff --git a/sources/extend/addon/matrix/ijpost/lang/it/strings.php b/sources/extend/addon/matrix/ijpost/lang/it/strings.php deleted file mode 100644 index f82132ce..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/it/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "Invia a Insanejournal"; -$a->strings["InsaneJournal Post Settings"] = "Impostazioni Invio a InsaneJournal "; -$a->strings["Enable InsaneJournal Post Plugin"] = "Abilita il plugin Invio a InsaneJournal"; -$a->strings["InsaneJournal username"] = "Nome utente InsaneJournal"; -$a->strings["InsaneJournal password"] = "Password InsaneJournal"; -$a->strings["Post to InsaneJournal by default"] = "Invia sempre a InsaneJournal"; -$a->strings["Submit"] = "Invia"; diff --git a/sources/extend/addon/matrix/ijpost/lang/nb-no/strings.php b/sources/extend/addon/matrix/ijpost/lang/nb-no/strings.php deleted file mode 100644 index 2eaa62e3..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/nb-no/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = ""; -$a->strings["InsaneJournal Post Settings"] = ""; -$a->strings["Enable InsaneJournal Post Plugin"] = ""; -$a->strings["InsaneJournal username"] = ""; -$a->strings["InsaneJournal password"] = ""; -$a->strings["Post to InsaneJournal by default"] = ""; -$a->strings["Submit"] = "Lagre"; diff --git a/sources/extend/addon/matrix/ijpost/lang/pl/strings.php b/sources/extend/addon/matrix/ijpost/lang/pl/strings.php deleted file mode 100644 index 5b6ec674..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/pl/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "Opublikuj na Insanejournal"; -$a->strings["InsaneJournal Post Settings"] = ""; -$a->strings["Enable InsaneJournal Post Plugin"] = ""; -$a->strings["InsaneJournal username"] = ""; -$a->strings["InsaneJournal password"] = ""; -$a->strings["Post to InsaneJournal by default"] = ""; -$a->strings["Submit"] = "Potwierdź"; diff --git a/sources/extend/addon/matrix/ijpost/lang/pt-br/strings.php b/sources/extend/addon/matrix/ijpost/lang/pt-br/strings.php deleted file mode 100644 index 4dce00fc..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/pt-br/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "Publicar no InsaneJournal"; -$a->strings["InsaneJournal Post Settings"] = "Configurações da publicação no InsaneJournal"; -$a->strings["Enable InsaneJournal Post Plugin"] = "Habilitar o plugin de publicação no InsaneJournal"; -$a->strings["InsaneJournal username"] = "Nome de usuário do InsaneJournal"; -$a->strings["InsaneJournal password"] = "Senha do InsaneJournal"; -$a->strings["Post to InsaneJournal by default"] = "Publicar no InsaneJournal por padrão"; -$a->strings["Submit"] = "Enviar"; diff --git a/sources/extend/addon/matrix/ijpost/lang/ru/strings.php b/sources/extend/addon/matrix/ijpost/lang/ru/strings.php deleted file mode 100644 index 0109f8a6..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/ru/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = ""; -$a->strings["InsaneJournal Post Settings"] = ""; -$a->strings["Enable InsaneJournal Post Plugin"] = "Включить InsaneJournal плагин Ñообщений"; -$a->strings["InsaneJournal username"] = ""; -$a->strings["InsaneJournal password"] = ""; -$a->strings["Post to InsaneJournal by default"] = ""; -$a->strings["Submit"] = "Подтвердить"; diff --git a/sources/extend/addon/matrix/ijpost/lang/sv/strings.php b/sources/extend/addon/matrix/ijpost/lang/sv/strings.php deleted file mode 100644 index 3ec569a7..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/sv/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Submit"] = "Spara"; diff --git a/sources/extend/addon/matrix/ijpost/lang/zh-cn/strings.php b/sources/extend/addon/matrix/ijpost/lang/zh-cn/strings.php deleted file mode 100644 index f2a04712..00000000 --- a/sources/extend/addon/matrix/ijpost/lang/zh-cn/strings.php +++ /dev/null @@ -1,9 +0,0 @@ -strings["Post to Insanejournal"] = "转播到Insanejournal"; -$a->strings["InsaneJournal Post Settings"] = "Insanejournal转播设置"; -$a->strings["Enable InsaneJournal Post Plugin"] = "使InsaneJournal转播æ’件å¯ç”¨"; -$a->strings["InsaneJournal username"] = "InsaneJournal用户å"; -$a->strings["InsaneJournal password"] = "InsaneJournal密ç "; -$a->strings["Post to InsaneJournal by default"] = "默认地转播到InsaneJournal"; -$a->strings["Submit"] = "æ交"; diff --git a/sources/extend/addon/matrix/irc/irc.apd b/sources/extend/addon/matrix/irc/irc.apd deleted file mode 100644 index 12189e78..00000000 --- a/sources/extend/addon/matrix/irc/irc.apd +++ /dev/null @@ -1,3 +0,0 @@ -url: $baseurl/irc -name: IRC Chat -photo: $baseurl/addon/irc/irc.png diff --git a/sources/extend/addon/matrix/irc/irc.css b/sources/extend/addon/matrix/irc/irc.css deleted file mode 100644 index e69de29b..00000000 diff --git a/sources/extend/addon/matrix/irc/irc.php b/sources/extend/addon/matrix/irc/irc.php deleted file mode 100644 index b9d3a4a0..00000000 --- a/sources/extend/addon/matrix/irc/irc.php +++ /dev/null @@ -1,119 +0,0 @@ - -*/ - -/* enable in admin->plugins - * you will then have "irc chatroom" listed at yoursite/apps - * and the app will run at yoursite/irc - * documentation at http://tonybaldwin.me/hax/doku.php?id=friendica:irc - * admin can set popular chans, auto connect chans in settings->plugin settings - */ - -function irc_load() { - register_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu'); - register_hook('feature_settings', 'addon/irc/irc.php', 'irc_addon_settings'); - register_hook('feature_settings_post', 'addon/irc/irc.php', 'irc_addon_settings_post'); -} - -function irc_unload() { - unregister_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu'); - unregister_hook('feature_settings', 'addon/irc/irc.php', 'irc_addon_settings'); - unregister_hook('feature_settings_post', 'addon/irc/irc.php', 'irc_addon_settings_post'); - -} - - -function irc_addon_settings(&$a,&$s) { - - if(! is_site_admin()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - //$a->page['htmlhead'] .= '' . "\r\n"; - - /* setting popular channels, auto connect channels */ - $sitechats = get_config('irc','sitechats'); /* popular channels */ - $autochans = get_config('irc','autochans'); /* auto connect chans */ - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('autochans', t('Channels to auto connect'), $sitechats, t('Comma separated list')) - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('sitechats', t('Popular Channels'), $autochans, t('Comma separated list')) - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('irc', t('IRC Settings'), '', t('Submit')), - '$content' => $sc - )); - - return; - -} - -function irc_addon_settings_post(&$a,&$b) { - if(! is_site_admin()) - return; - - if($_POST['irc-submit']) { - set_config('irc','autochans',trim($_POST['autochans'])); - set_config('irc','sitechats',trim($_POST['sitechats'])); - /* stupid pop-up thing */ - info( t('IRC settings saved.') . EOL); - } -} - -function irc_app_menu($a,&$b) { -$b['app_menu'][] = ''; -} - - -function irc_module() { -return; -} - - -function irc_content(&$a) { - - $baseurl = $a->get_baseurl() . '/addon/irc'; - $o = ''; - - /* set the list of popular channels */ - $sitechats = get_config('irc','sitechats'); - if($sitechats) - $chats = explode(',',$sitechats); - else - $chats = array('hubzilla','friendica','chat','chatback','hottub','ircbar','dateroom','debian'); - - - $a->page['aside'] .= '

' . t('Popular Channels') . '

    '; - foreach($chats as $chat) { - $a->page['aside'] .= '
  • ' . '#' . $chat . '
  • '; - } - $a->page['aside'] .= '
'; - - /* setting the channel(s) to auto connect */ - $autochans = get_config('irc','autochans'); - if($autochans) - $channels = $autochans; - else - $channels = ((x($_GET,'channels')) ? $_GET['channels'] : 'hubzilla'); - -/* add the chatroom frame and some html */ - $o .= <<< EOT -

IRC chat

-

A beginner's guide to using IRC. [en]

- -EOT; - -return $o; - -} - - diff --git a/sources/extend/addon/matrix/irc/irc.png b/sources/extend/addon/matrix/irc/irc.png deleted file mode 100644 index 0e4b185d..00000000 Binary files a/sources/extend/addon/matrix/irc/irc.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/MIT.txt b/sources/extend/addon/matrix/jappixmini/MIT.txt deleted file mode 100644 index 2517727f..00000000 --- a/sources/extend/addon/matrix/jappixmini/MIT.txt +++ /dev/null @@ -1,7 +0,0 @@ -You may distribute all files which are not within the jappix/ folder under the following conditions: - -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. diff --git a/sources/extend/addon/matrix/jappixmini/README b/sources/extend/addon/matrix/jappixmini/README deleted file mode 100644 index 0bda660f..00000000 --- a/sources/extend/addon/matrix/jappixmini/README +++ /dev/null @@ -1,27 +0,0 @@ -Jappix Mini Plugin -================== - -This quick-and-dirty addon allows you to add a Jabber-based, Facebook-like chat -to Hubzilla. It uses Jappix Mini. - -It is necessary to use a BOSH host - so to use this plugin, each users need to -know the address of a BOSH host that works with his account. -It is recommended that you install your own BOSH server and recommend it using -the configuration help field. If it is on the same server, you can also deactivate the -BOSH proxy. This should improve the performance. - -The addon has an experimental autosubscribe and autosuggest functionality which -tries to add your Hubzilla contacts to your roster automatically. - -Limitations: - - Jabber passwords can only be encrypted if they are at most 39 characters - long. - -Notes on the license --------------------- - -The license of this addon is AGPL, as required by Jappix Mini. If you make -modifications to the addon, you are responsible for providing a proper facility -for downloading the changed source code. -Moreover, it may be necessary that you publish the source code of the Friendica -application and all other used addons if you do not use standard versions. diff --git a/sources/extend/addon/matrix/jappixmini/jappix/AUTHORS b/sources/extend/addon/matrix/jappixmini/jappix/AUTHORS deleted file mode 100644 index 0086eb6a..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/AUTHORS +++ /dev/null @@ -1,54 +0,0 @@ -Jappix - An open social platform -These are the authors of Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 15/01/12 - -------------------------------------------------- - -Here are the Jappix contributors, who coded or translated the application (Codingteam.net nicknames): - -# DEVELOPERS - - am0ur3ux - - LinkMauve - - Maranda - - Mathieui - - Olivier - - sim6 - - Vanaryon - -# TRANSLATORS - - allan - - Arsimael - - Belzeneph - - Catdarko - - Cerritus - - chunzu - - ebraminio - - Finkregh - - hamano - - JanCBorchardt - - jarda - - joeka - - kr2ysiek - - krohn - - Lenwe - - LinkMauve - - Liverbool - - lwj - - m1st - - Maime - - Maranda - - mbajur - - mentalo - - mkwm - - Otourly - - pocamon - - quimi - - sahwar - - Vanaryon - - vitalyster - - Zash diff --git a/sources/extend/addon/matrix/jappixmini/jappix/COPYING b/sources/extend/addon/matrix/jappixmini/jappix/COPYING deleted file mode 100644 index 84ae389f..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/COPYING +++ /dev/null @@ -1,662 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license -for software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are -designed to take away your freedom to share and change the works. By -contrast, our General Public Licenses are intended to guarantee your -freedom to share and change all versions of a program--to make sure it -remains free software for all its users. - - 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 -them 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. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public -License. - - "Copyright" also means copyright-like laws that apply to other kinds -of works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further restriction, -you may remove that term. If a license document contains a further -restriction but permits relicensing or conveying under this License, you -may add to a covered work material governed by the terms of that license -document, provided that the further restriction does not survive such -relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have permission -to link or combine any covered work with a work licensed under version 3 -of the GNU General Public License into a single combined work, and to -convey the resulting work. The terms of this License will continue to -apply to the part which is the covered work, but the work with which it is -combined will remain governed by version 3 of the GNU General Public -License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero 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 that a certain numbered version of the GNU Affero -General Public License "or any later version" applies to it, you have -the option of following the terms and conditions either of that -numbered version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number -of the GNU Affero General Public License, you may choose any version -ever published by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that -proxy's public statement of acceptance of a version permanently -authorizes you to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as - published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. \ No newline at end of file diff --git a/sources/extend/addon/matrix/jappixmini/jappix/INSTALL b/sources/extend/addon/matrix/jappixmini/jappix/INSTALL deleted file mode 100644 index 652c1be7..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/INSTALL +++ /dev/null @@ -1,23 +0,0 @@ -Jappix - An open social platform -These are the installation instructions for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 15/09/10 - -------------------------------------------------- - -It's very simple to install Jappix on your webserver, you just have to follow these things: - -# INSTALLATION - - The HTTP server : http://codingteam.net/project/jappix/doc/HttpServer - - The XMPP server : http://codingteam.net/project/jappix/doc/XmppServer - - The BOSH server : http://codingteam.net/project/jappix/doc/BoshServer - - The Jappix app. : http://codingteam.net/project/jappix/doc/JappixApp - -# MORE - - The whole documentation is available at : http://codingteam.net/project/jappix/doc - -Now, you can use Jappix. Happy socializing! diff --git a/sources/extend/addon/matrix/jappixmini/jappix/README b/sources/extend/addon/matrix/jappixmini/jappix/README deleted file mode 100644 index 49cbf974..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/README +++ /dev/null @@ -1,20 +0,0 @@ -Jappix - An open social platform -This is the readme file for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 18/02/11 - -------------------------------------------------- - -Please refer to the installation instructions that are located in the INSTALL file to process the Jappix installation. - -The Jappix Project official service: https://www.jappix.com/ -The Jappix Project website: https://project.jappix.com/ -The Jappix Project panel: http://codingteam.net/project/jappix - -Jappix is released under the terms of the AGPL license. See COPYING for details. - -Have fun with Jappix! diff --git a/sources/extend/addon/matrix/jappixmini/jappix/THANKS b/sources/extend/addon/matrix/jappixmini/jappix/THANKS deleted file mode 100644 index a5b12227..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/THANKS +++ /dev/null @@ -1,27 +0,0 @@ -Jappix - An open social platform -These are the special thanks for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 16/02/11 - -------------------------------------------------- - -We would like to thanks the authors of these tools, coming from other projects: - -# PROJECTS - - Base64 http://rumkin.com - - DrawSVGChart http://codingteam.net/project/codingteam - - idzXHR http://www.iadvize.com/plugin_strophe_xmpp.html - - JSJaC http://blog.jwchat.org/jsjac/ - - jQuery http://jquery.com/ - - jQuery Form http://jquery.malsup.com/form/ - - jQuery Timers http://plugins.jquery.com/project/timers - - jXHR http://mulletxhr.com/ - - Mobile Detect http://code.google.com/p/php-mobile-detect/ - - JSMin http://github.com/rgrove/jsmin-php/ - - PHP-gettext https://launchpad.net/php-gettext - - Silk icons http://www.famfamfam.com/lab/icons/silk/ - - Smileys http://www.gajim.org/ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/VERSION b/sources/extend/addon/matrix/jappixmini/jappix/VERSION deleted file mode 100644 index 76892598..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/VERSION +++ /dev/null @@ -1 +0,0 @@ -Spaco [0.9] diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/adhoc.css b/sources/extend/addon/matrix/jappixmini/jappix/css/adhoc.css deleted file mode 100644 index 68d0383f..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/adhoc.css +++ /dev/null @@ -1,26 +0,0 @@ -/* - -Jappix - An open social platform -This is the Ad-Hoc CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 20/12/10 - -*/ - -#adhoc .content { - padding: 10px 0 10px 0; -} - -#adhoc .adhoc-head { - background-color: #f1f6fd; - border: 1px #9dc4fc solid; - width: 598px; - height: 18px; - font-size: 0.9em; - margin: 0 10px 12px 10px; - padding: 6px 10px; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/anonymous.css b/sources/extend/addon/matrix/jappixmini/jappix/css/anonymous.css deleted file mode 100644 index f61a79c6..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/anonymous.css +++ /dev/null @@ -1,29 +0,0 @@ -/* - -Jappix - An open social platform -This is the anonymous mode CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 06/11/10 - -*/ - -#top-content { - min-width: 500px !important; -} - -#main-content { - min-width: 490px !important; - min-height: 450px !important; -} - -#left-content { - display: none; -} - -#right-content { - left: 0; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/archives.css b/sources/extend/addon/matrix/jappixmini/jappix/css/archives.css deleted file mode 100644 index 5e60a8be..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/archives.css +++ /dev/null @@ -1,93 +0,0 @@ -/* - -Jappix - An open social platform -This is the archives CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 19/12/10 - -*/ - -#archives .content { - padding: 10px 0 10px 0; -} - -#archives .filter { - background-color: #e9f1fd; - border-right: 1px solid #9dc4fc; - width: 180px; - padding: 12px; - position: absolute; - top: 0; - left: 0; - bottom: 0; - float: left; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-topleft: 4px; - -moz-border-radius-bottomleft: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; -} - -#archives .filter .friend { - margin-bottom: 12px; -} - -#archives .filter .friend { - height: 210px; - width: 180px; - float: none; -} - -#archives .current, -#archives .logs { - position: absolute; - bottom: 0; - right: 0; - left: 204px; -} - -#archives .current { - background-color: #e4eef9; - border-bottom: 1px solid #9dc4fc; - font-size: 0.9em; - height: 16px; - padding: 6px; - top: 0; -} - -#archives .current span { - height: 16px; - overflow: hidden; -} - -#archives .current .name { - max-width: 160px; - font-weight: bold; - float: left; -} - -#archives .current .time { - color: #47646a; - font-size: 0.95em; - float: right; -} - -#archives .logs { - color: black; - font-size: 0.9em; - overflow: auto; - padding: 8px 10px 0; - float: left; - position: absolute; - top: 29px; -} - -#archives .logs a { - color: black; - text-decoration: underline; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/board.css b/sources/extend/addon/matrix/jappixmini/jappix/css/board.css deleted file mode 100644 index 91e6dcf9..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/board.css +++ /dev/null @@ -1,47 +0,0 @@ -/* - -Jappix - An open social platform -This is the board CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 26/08/11 - -*/ - -#board .one-board { - display: none; - position: fixed; - top: 0; - left: 0; - right: 0; - height: 18px; - z-index: 10000; - font-size: 0.92em; - padding: 6px 8px; - box-shadow: 0 0 8px #5c5c5c; - -moz-box-shadow: 0 0 8px #5c5c5c; - -webkit-box-shadow: 0 0 8px #5c5c5c; -} - -#board .one-board:hover { - cursor: pointer; -} - -#board .one-board.visible { - display: block; -} - -#board .one-board.error { - background-color: rgb(241,160,160); - background-color: rgba(241,160,160,0.9); - color: #420c0c; -} - -#board .one-board.info { - background-color: rgb(248,246,186); - background-color: rgba(248,246,186,0.9); - color: #2f2a02; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/buddylist.css b/sources/extend/addon/matrix/jappixmini/jappix/css/buddylist.css deleted file mode 100644 index 3bfa70cb..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/buddylist.css +++ /dev/null @@ -1,530 +0,0 @@ -/* - -Jappix - An open social platform -This is the buddy-list CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 31/08/11 - -*/ - -#buddy-list { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.85); - color: #919191; - padding: 15px 6px 4px 6px; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - box-shadow: 0 0 6px #5c5c5c; - -moz-box-shadow: 0 0 6px #5c5c5c; - -webkit-box-shadow: 0 0 6px #5c5c5c; -} - -#buddy-list .content { - background: #e8f1f3; - background: -moz-linear-gradient(top, #e8f1f3, #e4edef); - background: -webkit-gradient(linear, left top, left bottom, from(#e8f1f3), to(#e4edef)); - color: #666666; - height: 207px; - padding: 4px 4px 0 4px; - overflow-x: hidden; - overflow-y: auto; - border-top-left-radius: 3px; - border-top-right-radius: 3px; - -moz-border-radius-topleft: 3px; - -moz-border-radius-topright: 3px; - -webkit-border-top-left-radius: 3px; - -webkit-border-top-right-radius: 3px; -} - -#buddy-list .one-group { - margin-bottom: 10px; -} - -#buddy-list .one-group a.group { - color: #202c2f; - font-size: 0.8em; - margin: 3px 6px; - padding-left: 12px; - max-height: 15px; - text-decoration: none; - overflow: hidden; - display: block; -} - -#buddy-list .one-group a.group.plus { - background-position: -4px -1143px; -} - -#buddy-list .one-group a.group.minus { - background-position: -4px -1162px; -} - -#buddy-list .one-group a.group:hover { - cursor: pointer; -} - -#buddy-list .hidden-buddy, -#buddy-list .foot-edit-finish, -.buddy-conf-more-display-available { - display: none; -} - -#buddy-list .buddy { - width: 100%; - height: 50px; - margin-bottom: 4px; -} - -#buddy-list .buddy-click { - background: #d9e7ea; - width: 100%; - height: 100%; - overflow: hidden; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#buddy-list .buddy-click:hover, -#buddy-list .buddy-click:focus { - background: #cedee1; - cursor: pointer; -} - -#buddy-list .buddy-click:active { - background: #c3d3d7; -} - -#buddy-list .gateway { - height: 27px; -} - -#buddy-list .gateway .name { - margin-left: 0; -} - -#buddy-list .gateway .buddy-presence { - float: left; - overflow: hidden; - width: 0; - margin: 0 4px; -} - -#buddy-list .avatar-container { - float: left; - text-align: center; - margin: 3px; - width: 46px; - height: 46px; -} - -#buddy-list .avatar { - max-width: 44px; - max-height: 44px; -} - -#buddy-list .name { - margin: 4px 3px 5px 56px; -} - -#buddy-list .buddy-name { - height: 17px; - font-weight: bold; - font-size: 0.8em; - color: #264249; - margin: 5px 0 5px 2px; - overflow: hidden; -} - -#buddy-list .buddy.blocked p.buddy-name { - text-decoration: line-through; -} - -#buddy-list .buddy-presence { - height: 14px; - font-size: 0.7em; - color: #3a585e; - padding: 2px 0 0 16px; - margin-top: -3px; -} - -#buddy-list .unavailable, -#page-switch .unavailable, -#page-engine p.bc-infos span.show.unavailable { - background-position: 0 -153px; -} - -#buddy-list .available, -#page-engine p.bc-infos span.show.available, -#page-engine .list .available, -#page-engine .list .chat, -#page-switch .available, -#my-infos .f-presence a[data-value=available] span { - background-position: 0 -169px; -} - -#buddy-list .away, -#page-engine p.bc-infos span.show.away, -#page-engine .list .away, -#page-switch .away, -#my-infos .f-presence a[data-value=away] span { - background-position: 0 -185px; -} - -#buddy-list .busy, -#page-engine p.bc-infos span.show.busy, -#page-engine .list .xa, -#page-engine .list .dnd, -#page-switch .busy, -#my-infos .f-presence a[data-value=xa] span { - background-position: 0 -201px; -} - -#buddy-list .error, -#page-switch .error, -#page-engine p.bc-infos span.show.error { - background-position: 0 -217px; -} - -#buddy-list .buddy-infos { - position: absolute; - z-index: 100; - width: 337px; - color: white; - font-size: 0.8em; -} - -.buddy-infos-subarrow { - background-position: 0 -241px; - opacity: 0.8; - width: 9px; - height: 20px; - margin-top: 12px; - float: left; -} - -.buddy-infos-subitem { - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.8); - padding: 8px 10px; - width: 308px; - text-shadow: 0 1px 1px black; - float: left; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} - -.manage-infos p.bm-authorize, -#rosterx .oneresult span.action.add { - background-position: 0 -1181px; -} - -.manage-infos p.bm-remove, -#rosterx .oneresult span.action.delete, -#attach div.one-file a.remove { - background-position: 0 -1200px; -} - -.manage-infos p.bm-remove { - margin-bottom: 18px; -} - -.manage-infos p.bm-rename { - background-position: 0 -1216px; -} - -.manage-infos p.bm-group { - background-position: 0 -1241px; -} - -.manage-infos div.bm-choose { - max-height: 95px; - margin: 0 0 8px 102px; - overflow: auto; -} - -.manage-infos div.bm-choose label { - float: left; - clear: both; - margin-bottom: 1px; -} - -.manage-infos div.bm-choose input { - float: left; -} - -.manage-infos div.bm-choose input[type=checkbox] { - margin: 0 6px 0 0; -} - -.manage-infos div.bm-choose div { - clear: both; -} - -.manage-infos p.bm-rename, -.manage-infos p.bm-group { - height: 26px; -} - -.manage-infos p.bm-rename label, -.manage-infos p.bm-group label { - width: 80px; - padding-top: 3px; - float: left; -} - -.manage-infos p.bm-rename input, -.manage-infos p.bm-group input { - float: left; - width: 155px; -} - -.manage-infos a.save { - float: right; - margin: 4px; -} - -.buddy-infos-subitem p { - margin: 6px 0; - padding-left: 22px; - height: 16px; - overflow: hidden; -} - -.buddy-infos-subitem a { - color: white; - text-decoration: underline; -} - -.tune-note { - background-position: 0 -676px; -} - -.location-world { - background-position: 0 -658px; -} - -.view-individual { - background-position: 0 -34px; -} - -.edit-buddy { - background-position: 0 -1008px; -} - -#buddy-list .filter { - background-color: white; - border-top: 1px solid #b8c2c4; - height: 15px; - padding: 2px 4px; - font-size: 0.8em; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-bottomright: 3px; - -webkit-border-bottom-left-radius: 3px; - -webkit-border-bottom-right-radius: 3px; -} - -#buddy-list .filter input { - border: none; - color: #273a3f; - width: 211px; - padding: 0; - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; -} - -#buddy-list .filter a { - display: none; - background-color: #9a2d2d; - color: white; - height: 13px; - width: 13px; - margin-top: 1px; - font-size: 0.8em; - text-align: center; - text-decoration: none; - float: right; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -#buddy-list .filter a:hover, -#buddy-list .filter a:focus { - background-color: #8c2121; -} - -#buddy-list .filter a:active { - background-color: #7e1919; -} - -#buddy-list .foot { - padding: 9px 1px 3px; -} - -#buddy-list .buddy-list-icon { - height: 16px; - width: 16px; - margin: -3px 5px 0 0; - float: left; -} - -#buddy-list .buddy-list-icon a.talk-images { - height: 16px; - width: 16px; - display: block; -} - -#buddy-list .add, -#page-engine .text .tools-add { - background-position: 0 -1047px; -} - -#buddy-list .join { - background-position: 0 -1065px; -} - -#buddy-list .groupchat, -#page-switch .groupchat-default { - background-position: 0 -1082px; -} - -#buddy-list .more { - background-position: 0 -1100px; -} - -#buddy-list .foot-edit-finish a { - color: white; - font-size: 0.8em; - margin: -3px 4px 0 0; - float: right; - display: block; -} - -#buddy-list .foot-edit-finish a:hover, -#buddy-list .foot-edit-finish a:focus { - text-decoration: underline; - cursor: pointer; -} - -.buddy-conf-item { - position: absolute; - width: 263px; - color: white; - z-index: 9998; - text-align: left; - font-size: 0.8em; - margin-left: -10px; -} - -.buddy-conf-item:hover { - cursor: default; -} - -.buddy-conf-subarrow { - background-position: 0 -241px; - opacity: 0.8; - height: 10px; - width: 18px; - margin-left: 9px; -} - -.buddy-conf-subitem { - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.8); - padding: 10px; - text-shadow: 0 1px 1px black; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} - -.buddy-conf-p { - margin-bottom: 4px; - width: 220px; - font-weight: bold; - float: left; -} - -.buddy-conf-input { - padding-top: 2px; -} - -.buddy-conf-text { - font-size: 11px; - clear: both; - margin-bottom: 3px; -} - -.buddy-conf-text a { - color: white; -} - -.buddy-conf-text a:hover, -.buddy-conf-text a:focus { - cursor: pointer; - text-decoration: underline; -} - -.buddy-conf-text a.buddy-conf-add-search { - text-decoration: underline; - margin-top: 6px; - display: block; -} - -.buddy-conf-select { - font-size: 1.1em; - clear: both; - margin-bottom: 8px; - width: 180px; - height: 23px; -} - -.join-jid { - width: 220px; - margin-top: 5px; -} - -.add-contact-jid, -.add-contact-name, -.add-contact-gateway { - width: 156px; - margin-bottom: 4px; -} - -.add-contact-name-get { - font-size: 0.8em; - display: none; -} - -.buddy-conf-subitem label { - clear: both; -} - -.buddy-conf-subitem label span { - width: 76px; - height: 14px; - margin-top: 3px; - overflow: hidden; - float: left; -} - -#buddy-conf-join ul { - width: 224px; - max-height: 160px; - left: 10px; - top: 51px; -} - -.buddy-conf-join-select { - margin: 8px 0 0 0; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/channel.css b/sources/extend/addon/matrix/jappixmini/jappix/css/channel.css deleted file mode 100644 index 671d25ea..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/channel.css +++ /dev/null @@ -1,545 +0,0 @@ -/* - -Jappix - An open social platform -This is the channel CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 26/08/11 - -*/ - -#channel .top div.update { - position: absolute; - top: 12px; - left: 115px; - right: 15px; - bottom: 15px; - border-radius: 20px; - -moz-border-radius: 20px; - -webkit-border-radius: 20px; -} - -#channel .top p { - font-size: 0.9em; - margin-bottom: 10px; -} - -#channel .top h2 { - font-size: 1.6em; - margin-bottom: 10px; - color: #232323; -} - -#channel .top a { - font-size: 0.9em; - color: #232323; -} - -#channel .top.individual div.update { - right: 36px; -} - -#channel .top.individual div.shortcuts, -#userinfos .main-infos div.shortcuts { - width: 16px; - float: right; -} - -#channel .top.individual div.shortcuts { - margin: 2px 5px 0 0; -} - -#channel .top.individual div.shortcuts a, -#userinfos .main-infos div.shortcuts a { - height: 16px; - width: 16px; - margin-bottom: 4px; - display: block; -} - -#channel .top.individual div.shortcuts a.message, -#userinfos .main-infos a.message { - background-position: 0 -1717px; -} - -#channel .top.individual div.shortcuts a.chat, -#userinfos .main-infos a.chat { - background-position: 0 -1737px; -} - -#channel .top.individual div.shortcuts a.command, -#userinfos .main-infos a.command { - background-position: 0 -1758px; -} - -#channel .microblog-body { - height: 20px; - margin-right: 50px; -} - -#channel .microblog-body input { - width: 100%; - height: 100%; - padding: 8px; -} - -#channel .one-microblog-icon { - position: absolute; - top: 38px; - right: 0; -} - -#channel div.update .one-microblog-icon, -#channel div.update .postit { - width: 16px; - height: 16px; - display: block; -} - -#channel div.update .attach { - background-position: 0 -79px; - display: none; -} - -#attach { - position: absolute; - width: 263px; - margin-left: -227px; - color: white; - font-size: 0.85em; - z-index: 9998; - text-align: left; - display: none; -} - -#attach p { - margin-bottom: 6px !important; -} - -#attach input[type=submit] { - margin: 8px 0 6px 0; -} - -#attach .wait { - float: right; - margin: 7px 5px; -} - -#attach div.one-file { - height: 16px; - margin-top: 2px; -} - -#attach div.one-file a.link { - color: white; - width: 215px; - height: 14px; - margin-left: 2px; - overflow: hidden; - float: left; -} - -#attach div.one-file a.remove { - width: 16px; - height: 16px; - float: left; -} - -.attach-subarrow { - background-position: 0 -241px; - opacity: 0.8; - height: 10px; - width: 18px; - margin-left: 226px; -} - -.attach-subitem { - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.8); - padding: 10px; - text-shadow: 0 1px 1px black; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} - -.attach-p { - font-weight: bold; - float: left; -} - -#channel .one-update { - margin-bottom: 12px; - padding: 6px 6px 8px 6px; - border-bottom: 1px dotted #d0d0d0; - min-height: 50px; - color: black; - position: relative; - display: none; -} - -#channel .one-update .avatar-container { - text-align: center; - margin-right: 16px; - float: left; - height: 50px; - width: 50px; -} - -#channel .one-update .avatar-container:hover { - cursor: pointer; -} - -#channel .one-update img.avatar { - max-height: 50px; - max-width: 50px; -} - -#channel .one-update div.body { - margin-left: 65px; - opacity: 0.8; -} - -#channel .one-update:hover div.body { - opacity: 1; -} - -#channel .one-update a.repeat { - background-position: 0 -1681px; - height: 16px; - width: 16px; - margin-right: 4px; - float: left; -} - -#channel .one-update span a { - text-decoration: underline; -} - -#channel .one-update p { - display: block; - margin: 0 12px 5px 0; -} - -#channel .one-update p b.name:hover { - cursor: pointer; - text-decoration: underline; -} - -#channel .one-update p.infos { - font-size: 0.9em; -} - -#channel .one-update p.infos a.geoloc { - background-position: 0 -1778px; - color: #363636; - margin-left: 18px; - padding-left: 14px; -} - -#channel .one-update p.infos a.geoloc:hover, -#channel .one-update p.infos a.geoloc:focus, -#channel .one-update p.infos a.geoloc:active { - color: #141414; -} - -#channel .one-update p.file { - font-size: 0.9em; - margin: 6px 0 5px 10px; -} - -#channel .one-update p.file a.link, -#inbox .inbox-new-file a.file { - min-height: 16px; - padding-left: 22px; - text-decoration: underline; - display: block; -} - -#channel .one-update p.file a.link { - margin-top: 4px; -} - -#channel p.file a, -#inbox .inbox-new-file a.file { - background-position: 0 -988px; -} - -#channel p.file a.audio, -#inbox .inbox-new-file a.file.audio { - background-position: 0 -899px; -} - -#channel p.file a.image, -#inbox .inbox-new-file a.file.image { - background-position: 0 -917px; -} - -#channel p.file a.video, -#inbox .inbox-new-file a.file.video { - background-position: 0 -935px; -} - -#channel p.file a.document, -#inbox .inbox-new-file a.file.document { - background-position: 0 -953px; -} - -#channel p.file a.package, -#inbox .inbox-new-file a.file.package { - background-position: 0 -971px; -} - -#channel .one-update p.file a.thumb img { - border: 1px solid #a2a2a2; - max-width: 140px; - max-height: 105px; - margin: 4px 10px 2px 0; - padding: 1px; -} - -#channel .one-update p.file a.thumb img:hover { - border-color: #464646; -} - -#channel .one-update div.comments, -.popup.large div.comments { - width: 410px; - margin: 2px 0 2px 76px; -} - -#channel .one-update div.comments div.arrow, -.popup.large div.comments div.arrow { - background-position: 0 -1702px; - width: 20px; - height: 8px; - margin-left: 20px; - display: block; -} - -#channel .one-update div.comments div.comments-content, -.popup.large div.comments div.comments-content { - background-color: #e5ebec; - color: black; - font-size: 0.9em; - text-shadow: 0 1px 0 white; -} - -#channel .one-update div.comments input, -.popup.large div.comments input { - width: 356px; - margin: 6px 0; - padding: 4px 5px; -} - -#channel .one-update div.comments span.icon, -.popup.large div.comments span.icon { - background-position: 0 -1082px; - height: 16px; - width: 16px; - margin: 10px; - float: left; -} - -#channel .one-update div.comments .one-comment.loading span.icon, -.popup.large div.comments .one-comment.loading span.icon { - margin: 0 10px 0 0; -} - -#channel .one-update div.comments .one-comment, -.popup.large div.comments .one-comment { - border-bottom: 1px solid #f4f4f4; - padding: 4px 8px 0px 8px; - position: relative; - display: block; -} - -#channel .one-update div.comments .one-comment.compose, -.popup.large div.comments .one-comment.compose { - border-bottom: 2px solid #f4f4f4; - height: 36px; - padding: 0; -} - -#channel .one-update div.comments .one-comment.new, -.popup.large div.comments .one-comment.new { - display: none; -} - -#channel .one-update div.comments a.one-comment, -.popup.large div.comments a.one-comment { - text-decoration: none; -} - -#channel .one-update div.comments a.one-comment:hover, -#channel .one-update div.comments a.one-comment:focus, -.popup.large div.comments a.one-comment:hover, -.popup.large div.comments a.one-comment:focus { - text-decoration: underline; -} - -#channel .one-update div.comments .one-comment.loading, -.popup.large div.comments .one-comment.loading { - padding-bottom: 5px; -} - -#channel .one-update div.comments .one-comment div.marker, -.popup.large div.comments .one-comment div.marker { - background-color: #6d8387; - width: 2px; - position: absolute; - top: 0; - left: 0; - bottom: 0; -} - -#channel .one-update div.comments .one-comment .avatar-container, -.popup.large div.comments .one-comment .avatar-container { - text-align: center; - width: 30px; - height: 30px; - margin: 2px 8px 0 0; - float: left; -} - -#channel .one-update div.comments .one-comment .avatar-container:hover, -.popup.large div.comments .one-comment .avatar-container:hover { - cursor: pointer; -} - -#channel .one-update div.comments .one-comment img.avatar, -.popup.large div.comments .one-comment img.avatar { - max-height: 30px; - max-width: 30px; -} - -#channel .one-update div.comments .one-comment .comment-container, -.popup.large div.comments .one-comment .comment-container { - float: left; -} - -#channel .one-update div.comments .one-comment a.name, -.popup.large div.comments .one-comment a.name { - font-weight: bold; - text-decoration: none; - font-size: 0.95em; - padding-bottom: 2px; - float: left; -} - -#channel .one-update div.comments .one-comment a.name:hover, -#channel .one-update div.comments .one-comment a.name:focus, -.popup.large div.comments .one-comment a.name:hover, -.popup.large div.comments .one-comment a.name:focus { - text-decoration: underline; -} - -#channel .one-update div.comments .one-comment span.date, -#channel .one-update div.comments .one-comment a.remove, -.popup.large div.comments .one-comment span.date, -.popup.large div.comments .one-comment a.remove { - font-size: 0.85em; - float: right; -} - -#channel .one-update div.comments .one-comment.me:hover span.date, -.popup.large div.comments .one-comment.me:hover span.date { - display: none; -} - -#channel .one-update div.comments .one-comment.me a.remove, -.popup.large div.comments .one-comment.me a.remove { - display: none; -} - -#channel .one-update div.comments .one-comment.me:hover a.remove, -.popup.large div.comments .one-comment.me:hover a.remove { - display: block; -} - -#channel .one-update div.comments .one-comment p.body, -.popup.large div.comments .one-comment p.body { - clear: both; -} - -#channel a.more { - background-position: 0 -334px; - color: black; - height: 16px; - text-decoration: none; - margin: -2px 0 0 4px; - padding: 0 0 14px 20px; - display: block; - visibility: hidden; -} - -#channel a.more:hover, -#channel a.more:focus { - text-decoration: underline; -} - -#channel a.mbtool { - width: 11px; - height: 11px; - display: none; - position: absolute; - right: 0; -} - -#channel .one-update:hover a.mbtool { - display: block; -} - -#channel a.mbtool:hover, -#channel a.mbtool:focus { - text-decoration: none; -} - -#channel a.mbtool.profile { - background-position: -1px -1333px; - top: 24px; -} - -#channel a.mbtool.repost { - background-position: -1px -1354px; -} - -#channel a.mbtool.remove { - background-position: -1px -1312px; -} - -#channel a.mbtool.repost, -#channel a.mbtool.remove { - top: 6px; -} - -#channel .footer { - bottom: 0; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; -} - -#channel .footer div { - margin-left: 5px; - padding-left: 24px; - min-height: 16px; - font-size: 0.85em; - width: auto !important; -} - -#channel .footer .sync { - background-position: 0 -804px; - display: none; -} - -#channel .footer .unsync { - background-position: 0 -830px; - display: none; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/directory.css b/sources/extend/addon/matrix/jappixmini/jappix/css/directory.css deleted file mode 100644 index 34b32312..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/directory.css +++ /dev/null @@ -1,16 +0,0 @@ -/* - -Jappix - An open social platform -This is the directory tool CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 13/02/11 - -*/ - -#directory .content { - padding: 10px 0 10px 0; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/discovery.css b/sources/extend/addon/matrix/jappixmini/jappix/css/discovery.css deleted file mode 100644 index f66456b6..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/discovery.css +++ /dev/null @@ -1,61 +0,0 @@ -/* - -Jappix - An open social platform -This is the discovery CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 13/02/11 - -*/ - -#discovery .content { - padding: 10px 0 10px 0; -} - -#discovery .content p { - margin: 5px 10px 5px 10px; - text-align: justify; - font-size: 0.85em; -} - -#discovery .discovery-head, -#directory .directory-head, -#rosterx .rosterx-head, -#privacy .privacy-head { - width: 606px; - height: 24px; - margin: 0 10px 10px 10px; - padding: 6px; - background: #f1f6fd; - border: 1px #9dc4fc solid; -} - -#discovery .disco-server-text, -#directory .directory-server-text { - float: left; - font-size: 0.9em; - margin: 3px; -} - -#discovery .disco-server-input, -#directory .directory-server-input { - float: right; - width: 200px; - padding: 2px; - height: 18px; - float: right; - margin-right: 10px; - padding: 2px; -} - -#discovery .disco-category { - display: none; - margin-bottom: 22px; -} - -#discovery .disco-category-title { - font-weight: bold; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/favorites.css b/sources/extend/addon/matrix/jappixmini/jappix/css/favorites.css deleted file mode 100644 index 5d3fd51d..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/favorites.css +++ /dev/null @@ -1,179 +0,0 @@ -/* - -Jappix - An open social platform -This is the favorites CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 28/12/10 - -*/ - -#favorites .content { - padding: 10px 0 10px 0; -} - -#favorites .fedit-head-select { - min-width: 190px; - max-width: 210px; -} - -#favorites .switch-fav { - margin: 0 10px 0 10px; - width: 200px; - height: 355px; - border-right: 1px #c0c0c0 dotted; - float: left; -} - -#favorites .room-switcher { - width: 188px; - height: 18px; - border-bottom: 1px #9dc4fc solid; - float: left; - padding: 10px 6px; - font-size: 0.9em; -} - -#favorites .room-switcher:hover { - background-color: #e9f1fd; - cursor: pointer; -} - -#favorites .room-switcher:active { - background-color: #f1f6fd; -} - -#favorites .switch-fav .icon { - float: left; - height: 16px; - width: 16px; - margin: 0 8px 0 0; -} - -#favorites .switch-fav .room-list .list-icon { - background-position: 0 -855px; -} - -#favorites .switch-fav .room-search .search-icon { - background-position: 0 -876px; -} - -#favorites .static-fav { - width: 385px; - height: 335px; - margin: 0 10px 0 0; - padding: 10px; - float: right; -} - -#favorites .favorites-search { - display: none; -} - -#favorites .static-fav-head { - width: 393px; - margin: -10px; -} - -#favorites .static-fav-results { - width: 406px; - height: 314px; - margin: 10px -10px -10px -10px; - padding: 6px 0 0 0; -} - -#favorites .fedit-line { - height: 30px; - font-size: 0.9em; - padding: 10px 0 4px 4px; - border-bottom: 1px #9dc4fc solid; -} - -#favorites .fedit-line:hover { - background: #e9f1fd; -} - -#favorites label { - width: 140px; - margin-top: 3px; -} - -#favorites input { - height: 18px; - width: 186px; - margin-top: 0; - padding: 2px; -} - -#favorites .fedit-select { - min-width: 160px; -} - -#favorites .fedit-actions { - margin: 10px 0 0; - font-size: 0.9em; - float: right; -} - -#favorites input[type=checkbox] { - margin-top: 5px; -} - -#favorites .fedit-terminate { - float: right; -} - -#favorites .fedit-add { - display: block; -} - -#favorites .fedit-edit { - background-position: 2px -1240px; -} - -#favorites .fedit-remove { - margin: 0 8px 0 0; -} - -#favorites .add, -.popup .results .one-button.one-add { - background-position: 3px -1177px; -} - -#favorites .remove, -#inbox .remove { - background-position: 3px -1196px; -} - -#favorites .join, -#inbox .reply, -#inbox .send, -.popup .results .one-button.one-chat { - background-position: 3px -124px; -} - -#favorites .one-button, -#inbox .one-button, -.popup .results .one-button { - padding-left: 20px !important; - font-size: 0.98em; -} - -#favorites .fsearch-results { - overflow: auto; -} - -#favorites .room-name { - margin: 4px 2px 5px; - max-width: 210px; - float: left; -} - -#favorites .fsearch-noresults { - display: none; - font-size: 0.9em; - font-weight: bold; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/home.css b/sources/extend/addon/matrix/jappixmini/jappix/css/home.css deleted file mode 100644 index 789ea4d9..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/home.css +++ /dev/null @@ -1,579 +0,0 @@ -/* - -Jappix - An open social platform -This is the home CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 15/01/12 - -*/ - -#home { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - min-height: 550px; - min-width: 875px; -} - -#home .corporation, -#home .corporation .corp_network, -#home .locale, -#home .obsolete { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.70); - color: white; - position: absolute; - top: 0; - text-shadow: 0 0 1px black; - z-index: 100; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-bottomright: 3px; - -webkit-border-bottom-left-radius: 3px; - -webkit-border-bottom-right-radius: 3px; -} - -#home .corporation { - background-position: 9px -357px; - left: 12px; - height: 26px; - width: 34px; -} - -#home .corporation.hovered { - height: 28px; - border-radius: 0; - -moz-border-radius: 0; - -webkit-border-radius: 0; -} - -#home .corporation .corp_network { - width: 180px; - padding: 10px 12px; - top: 28px; - display: none; - border-top-right-radius: 3px; - -moz-border-radius-topright: 3px; - -webkit-border-top-right-radius: 3px; -} - -#home .corporation.hovered .corp_network { - display: block; -} - -#home .corporation .corp_network h2 { - font-size: 1.1em; - margin: 14px 0 4px 0; -} - -#home .corporation .corp_network h2.nomargin { - margin-top: 0; -} - -#home .corporation .corp_network a { - font-size: 0.8em; - margin: 2px 0; - padding: 2px 6px; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -#home .corporation .corp_network a span { - margin: 2px 0; - display: block; -} - -#home .corporation .corp_network a span.name { - font-weight: bold; -} - -#home .corporation .corp_network a span.desc { - font-size: 0.9em; - margin-left: 2px; -} - -#home .locale { - left: 52px; - font-size: 0.8em; -} - -#home .locale .current { - height: 19px; - padding: 3px 12px 4px 12px; - font-weight: bold; -} - -#home .locale .current:hover { - cursor: default; -} - -#home .locale .current .current_align { - height: 19px; - vertical-align: middle; - display: table-cell; -} - -#home .locale .list { - margin: 2px 0 2px; -} - -#home .locale .list a, -#home .corporation .corp_network a { - color: white; - text-decoration: none; - display: block; -} - -#home .locale .list a { - padding: 3px 10px; -} - -#home .locale .list a:hover, -#home .locale .list a:focus, -#home .corporation .corp_network a:hover, -#home .corporation .corp_network a:focus { - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.1); - cursor: pointer; -} - -#home .locale .list a:active, -#home .corporation .corp_network a:active { - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.14); -} - -#home .obsolete { - height: 60px; - padding: 4px 10px; - right: 12px; - font-size: 0.9em; - font-weight: bold; - display: none; -} - -#home .obsolete a { - height: 33px; - width: 33px; - margin: 5px 2px 0 0; - float: left; -} - -#home .obsolete a:hover, -#home .obsolete a:focus { - opacity: 0.8; -} - -#home .obsolete a:active { - opacity: 0.6; -} - -#home .obsolete a.firefox { - background-position: 1px 0; -} - -#home .obsolete a.chrome { - background-position: -34px 0; -} - -#home .obsolete a.safari { - background-position: -68px 0; -} - -#home .obsolete a.opera { - background-position: -101px 0; -} - -#home .obsolete a.ie { - background-position: -135px 0; -} - -#home .plane { - background-position: 0 -384px; - width: 507px; - height: 328px; - position: absolute; - left: 0; - top: 60px; -} - -#home .main { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.85); - position: absolute; - top: 50%; - margin-top: -200px; - width: 800px; - height: 400px; - left: 50%; - margin-left: -400px; - z-index: 50; - border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - box-shadow: 0 0 35px #5c5c5c; - -moz-box-shadow: 0 0 35px #5c5c5c; - -webkit-box-shadow: 0 0 35px #5c5c5c; -} - -#home .left { - float: left; - width: 350px; - height: 370px; - margin: 15px 0 15px 15px; - color: white; - text-align: center; - text-shadow: 0 1px 1px black; -} - -#home .left .logo { - background-position: 0 0; - float: left; - margin: 30px 20px; - width: 311px; - height: 113px; -} - -#home .left p.upper { - margin: 12px 0 20px 0; -} - -#home .left p.secondary { - margin: 8px 0 0 16px; - font-size: 0.9em; - width: 320px; -} - -#home .right { - background: #e4eef9; - background: -moz-linear-gradient(top, #e4eef9, #C5E1FF); - background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#C5E1FF)); - float: right; - width: 385px; - height: 350px; - margin: 15px 15px 15px 0; - padding: 10px; - font-size: 13px; - text-align: justify; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - box-shadow: 0 0 20px black; - -moz-box-shadow: 0 0 20px black; - -webkit-box-shadow: 0 0 20px black; -} - -#home .right h1 { - font-size: 16px; - padding-bottom: 4px; - border-bottom: 1px black dotted; -} - -#home .right p { - margin-bottom: 4px; -} - -#home .right p a { - border-width: 0 0 1px 0; - border-style: dotted; - border-color: black; -} - -#home .right p a:hover, -#home .right p a:focus { - border-style: solid; - text-decoration: none; -} - -#home .right button { - display: block; - margin-left: 22px; - width: 342px; - height: 64px; - text-decoration: none; - font-weight: bold; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; -} - -#home .right button:hover { - cursor: pointer; -} - -#home .right button span { - float: left; -} - -#home .right button span.home-images { - height: 16px; - width: 16px; - margin: 5px 7px 7px 24px; -} - -#home .right button span.text { - padding-left: 20px; - font-size: 1.5em; -} - -#home .right .login { - background-color: #72d071; - background-position: 0 0; - border: 1px solid #5cb55c; - margin-top: 22px; - box-shadow: 0 0 10px #89e389; - -moz-box-shadow: 0 0 10px #89e389; - -webkit-box-shadow: 0 0 10px #89e389; -} - -#home .right .login:hover, -#home .right .login:focus { - border: 1px solid #419141; - box-shadow: 0 0 15px #72d071; - -moz-box-shadow: 0 0 15px #72d071; - -webkit-box-shadow: 0 0 15px #72d071; -} - -#home .right .login:active { - background-color: #97e896; - background-position: 0 -80px; -} - -#home .right .login span.text { - color: #2d612d; - text-shadow: 1px 1px 1px #5cb55c; -} - -#home .right .login span.home-images { - background-position: 0 -230px; -} - -#home .right .register { - background-color: #f6ef82; - background-position: 0 -160px; - border: 1px solid #e3db56; - margin-top: 15px; - box-shadow: 0 0 15px #f1e968; - -moz-box-shadow: 0 0 15px #f1e968; - -webkit-box-shadow: 0 0 15px #f1e968; -} - -#home .right .register:hover, -#home .right .register:focus { - border: 1px solid #d2c93f; - box-shadow: 0 0 15px #e0d743; - -moz-box-shadow: 0 0 15px #e0d743; - -webkit-box-shadow: 0 0 15px #e0d743; -} - -#home .right .register:active { - background-color: #fdf7af; - background-position: 0 -240px; -} - -#home .right .register span.text { - color: #6d6813; - text-shadow: 1px 1px 1px #dbd56e; -} - -#home .right .register span.home-images { - background-position: 0 -204px; -} - -#home .right p.notice { - margin-top: 24px; - font-size: 0.9em; -} - -#home .right .navigation { - clear: both; - width: 385px; - border-top: 1px black dotted; - position: absolute; - text-align: right; - bottom: 25px; - right: 25px; - padding-top: 6px; -} - -#home .right .navigation a { - margin-left: 9px; - color: black; - text-decoration: none; - font-size: 0.9em; - height: 12px; - padding: 0 0 4px 20px; - float: right; -} - -#home .right .navigation a:hover, -#home .right .navigation a:focus { - text-decoration: underline; -} - -#home .right .navigation a.unencrypted { - background-position: 0 -256px; -} - -#home .right .navigation a.encrypted { - background-position: 0 -282px; -} - -#home .right .navigation a.project { - background-position: 0 -126px; -} - -#home .right .navigation a.manager { - background-position: 0 -152px; -} - -#home .right .navigation a.mobile { - background-position: 0 -178px; -} - -#home a.advanced { - background-position: 0 -334px; - font-size: 0.9em; - height: 16px; - margin-bottom: 10px; - padding-left: 16px; - display: block; -} - -#home fieldset.advanced { - display: none; -} - -#home .anonymouser input[type=text] { - width: 160px; -} - -#home .homediv.registerer .success a { - font-weight: bold; - text-decoration: underline; -} - -#home fieldset { - border: 1px solid black; - margin: 12px 0 12px 0; - padding: 5px 0 4px 0; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#home legend { - font-size: 0.9em; - margin: 0 0 0 15px; - padding: 0 2px; - text-transform: uppercase; -} - -#home label { - width: 110px; - display: block; - float: left; - clear: both; - margin: 0 0 5px 12px; -} - -#home input, -#home select { - float: left; - margin-bottom: 5px; -} - -#home input[type=text], -#home input[type=password], -#home select { - width: 140px; - margin-top: -2px; -} - -#home input[type=submit] { - min-width: 120px; - float: right; -} - -#home span.jid { - display: block; - float: left; - margin: 0 4px; -} - -#home input.nick, #home input.server { - width: 110px; -} - -#home .info { - padding: 6px; - position: absolute; - bottom: 62px; - right: 35px; - border-width: 1px; - border-style: dotted; - clear: both; - width: 350px; -} - -#home .info.success { - background-color: #aee578; - border-color: #85b05c; - display: none; -} - -#home .info.fail { - background-color: #f19d9d; - border-color: #b34f4f; -} - -#home .info.report { - background-color: #f3f48b; - border-color: #c9c66b; - display: none; -} - -#home .info.report span { - text-decoration: underline; -} - -#home .notice.simple { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.7); - color: white; - font-size: 0.9em; - text-decoration: none; - text-shadow: 0 1px 0 black; - position: fixed; - bottom: 0; - left: 0; - right: 0; - padding: 8px 20px; - z-index: 100; - box-shadow: 0 0 25px #ababab; - -moz-box-shadow: 0 0 25px #ababab; - -webkit-box-shadow: 0 0 25px #ababab; -} - -#home .notice.simple .title { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.4); - background-position: 8px -299px; - border-width: 0 1px 1px 1px; - border-style: solid; - border-color: #141414; - font-weight: bold; - padding: 8px 8px 8px 30px; -} - -#home .notice.simple .text { - margin-left: 20px; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/ie.css b/sources/extend/addon/matrix/jappixmini/jappix/css/ie.css deleted file mode 100644 index 8808b50b..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/ie.css +++ /dev/null @@ -1,146 +0,0 @@ -/* - -Jappix - An open social platform -These are all the IE compliant CSS classes - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 22/04/11 - -*/ - -/* rgba(255,255,255,0.9) */ -.search ul { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edffffff,endColorstr=#edffffff); -} - -/* rgba(255,255,255,0.3) */ -a.finish:active, -#manager-buttons input:active, -#install-buttons input:active { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#49ffffff,endColorstr=#49ffffff); -} - -/* rgba(255,255,255,0.2) */ -a.finish:hover, -a.finish:focus, -#manager-buttons input:hover, -#manager-buttons input:focus, -#install-buttons input:hover, -#install-buttons input:focus, -.notifications-content .one-notification:active { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33ffffff,endColorstr=#33ffffff); -} - -/* rgba(255,255,255,0.14) */ -#home .locale .list a:active { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#2fffffff,endColorstr=#2fffffff); -} - -/* rgba(255,255,255,0.1) */ -#home .locale .list a:hover, -#home .locale .list a:focus, -a.finish, -a.finish.disabled:hover, -a.finish.disabled:focus, -a.finish.disabled:active, -#manager-buttons input, -#install-buttons input, -.notifications-content .one-notification:hover, -.notifications-content .one-notification:focus { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#20ffffff,endColorstr=#20ffffff); -} - -/* rgba(255,239,104,0.8) */ -.popup .infos { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#deffef68,endColorstr=#deffef68); -} - -/* rgba(225,160,20,0.3) */ -.search ul li.hovered { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#46e1a014,endColorstr=#46e1a014); -} - -/* rgba(248,246,186,0.9) */ -#board .one-board.info { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edf8f6ba,endColorstr=#edf8f6ba); -} - -/* rgba(241,160,160,0.9) */ -#board .one-board.error { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#edf1a0a0,endColorstr=#edf1a0a0); -} - -/* rgba(234,234,234,0.8) */ -#page-engine .chatstate { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#deeaeaea,endColorstr=#deeaeaea); -} - -/* rgba(20,20,20,0.6) */ -#home .locale, -#home .obsolete, -#home .notice.simple { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#a0141414,endColorstr=#a0141414); -} - -/* rgba(20,20,20,0.8) */ -#home .main, -#reconnect .pane, -#my-infos, -#right-content, -#buddy-list, -#manager, -#install { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#de141414,endColorstr=#de141414); -} - -/* rgba(20,20,20,0.9) */ -.popup { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ed141414,endColorstr=#ed141414); -} - -/* rgba(0,0,0,0.2) */ -#install-top .step { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33000000,endColorstr=#33000000); -} - -/* rgba(0,0,0,0.6) */ -.lock { - background: url(../img/others/lock.png) repeat !important; -} - -/* rgba(0,0,0,0.8) */ -#page-engine .tooltip-subitem, -.attach-subitem, -.buddy-infos-subitem, -.buddy-conf-subitem, -.tools-content-subitem { - background: transparent; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#de000000,endColorstr=#de000000); -} - -/* Fix a fieldset padding bug */ -legend { - margin-bottom: 5px !important; -} - -/* Fix an opacity bug */ -a.finish.disabled { - filter: alpha(opacity = 20) !important; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/images.css b/sources/extend/addon/matrix/jappixmini/jappix/css/images.css deleted file mode 100644 index 2dfb756f..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/images.css +++ /dev/null @@ -1,89 +0,0 @@ -/* - -Jappix - An open social platform -This is the images CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 16/01/12 - -*/ - -.body-images { - background-image: url(../img/sprites/background.png); - background-repeat: repeat; - background-color: #93c5fa; -} - -.install-images { - background-image: url(../img/sprites/install.png); - background-repeat: no-repeat; -} - -.home-images { - background-image: url(../img/sprites/home.png); - background-repeat: no-repeat; -} - -.browsers-images { - background-image: url(../img/sprites/browsers.png); - background-repeat: no-repeat; -} - -.buttons-images { - background-image: url(../img/sprites/buttons.png); - background-repeat: repeat-x; -} - -.talk-images { - background-image: url(../img/sprites/talk.png); - background-repeat: no-repeat; -} - -.smileys-images { - background-image: url(../img/sprites/smileys.png); - background-repeat: no-repeat; -} - -.welcome-images { - background-image: url(../img/sprites/welcome.png); - background-repeat: no-repeat; -} - -.me-images { - background-image: url(../img/sprites/me.png); - background-repeat: no-repeat; -} - -.manager-images { - background-image: url(../img/sprites/manager.png); - background-repeat: no-repeat; -} - -.mobile-images { - background-image: url(../img/sprites/mobile.png); - background-repeat: no-repeat; -} - -.wait-small { - background-image: url(../img/wait/wait-small.gif); - background-repeat: no-repeat; - height: 16px; - width: 16px; -} - -.wait-medium { - background-image: url(../img/wait/wait-medium.png); - background-repeat: no-repeat; - height: 24px; - width: 24px; -} - -.wait-big { - background-image: url(../img/wait/wait-big.gif); - background-repeat: no-repeat; - height: 30px; - width: 30px; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/inbox.css b/sources/extend/addon/matrix/jappixmini/jappix/css/inbox.css deleted file mode 100644 index 1ef05886..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/inbox.css +++ /dev/null @@ -1,202 +0,0 @@ -/* - -Jappix - An open social platform -This is the inbox CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 28/12/10 - -*/ - -#inbox .content { - padding: 10px 0 10px 0; -} - -#inbox .content p { - margin: 3px 10px; - text-align: justify; - font-size: 0.9em; -} - -#inbox .inbox-results { - height: 310px; - width: 620px; - margin: -5px 0 0 10px; - padding: 6px 0 0 0; - overflow: auto; -} - -#inbox .message-unread { - background-color: #E9F1FD; -} - -#inbox .one-message { - font-size: 0.9em; - border-bottom: 1px #b2c7cb solid; -} - -#inbox .message-head { - padding: 6px 0 7px 4px; - overflow: hidden; -} - -#inbox .message-head:hover { - background-color: #e9f1fd; - cursor: pointer; -} - -#inbox .message-head:active { - background-color: #f1f6fd; -} - -#inbox .one-message.message-reading, -#inbox .one-message.message-reading .message-head { - background-color: #f1f6fd; -} - -#inbox .avatar-container { - float: left; - width: 40px; - height: 40px; - margin-right: 7px; - text-align: center; - background-repeat: no-repeat; -} - -#inbox .avatar { - max-width: 40px; - max-height: 40px; -} - -#inbox .message-jid, -#inbox .message-subject { - float: left; - margin: 0 2px; - overflow: hidden; -} - -#inbox .message-jid { - width: 165px; - font-weight: bold; -} - -#inbox .message-subject { - width: 355px; -} - -#inbox .message-truncated { - color: #42646b; - font-size: 0.8em; - margin: 23px 0 0 49px; -} - -#inbox .message-body { - padding: 8px 5px 5px 5px; -} - -#inbox .message-body a { - text-decoration: underline; -} - -#inbox .message-meta { - margin-top: 6px; - padding: 3px 4px; - border-top: 1px #b2c7cb dotted; -} - -#inbox .message-meta span.date { - color: #28474e; - font-size: 0.8em; - margin: 10px 0 0 4px; - float: left; -} - -#inbox .message-meta a { - font-size: 0.98em; - margin: 5px; - float: right; - display: block; -} - -#inbox .inbox-noresults { - font-weight: bold; - display: none; -} - -#inbox .a-show-messages { - display: none; -} - -#inbox .inbox-new { - display: none; - height: 300px; - width: 620px; - margin: -5px 0 0 10px; - padding: 16px 0 0 0; -} - -#inbox .inbox-new-block { - border-top: 1px #686868 dotted; - padding-top: 9px; - min-height: 32px; - clear: both; -} - -#inbox .inbox-new-text { - float: left; - width: 100px; -} - -#inbox .inbox-new-textarea { - width: 460px; - height: 109px; - margin-bottom: 10px; - float: left; -} - -#inbox .inbox-new input { - float: left; -} - -#inbox .inbox-new-to ul { - width: 264px; - max-height: 168px; - font-size: 0.9em; - left: 120px; - top: 31px; -} - -#inbox .inbox-new-to-input { - width: 260px; -} - -#inbox .inbox-new-subject-input { - width: 380px; -} - -#inbox .inbox-new-file a { - display: block; - float: left; -} - -#inbox .inbox-new-file a.file { - font-size: 0.85em; - height: 16px; - max-width: 320px; - margin: 3px 0 15px 013px; - overflow: hidden; -} - -#inbox .inbox-new-file a.one-button { - font-size: 0.85em; - margin: -2px 0 0 25px; -} - -#inbox .inbox-new-send a { - font-size: 0.85em; - float: right; - display: block; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/install.css b/sources/extend/addon/matrix/jappixmini/jappix/css/install.css deleted file mode 100644 index 9dbde3fc..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/install.css +++ /dev/null @@ -1,285 +0,0 @@ -/* - -Jappix - An open social platform -This is the install CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 08/06/11 - -*/ - -body { - color: white; -} - -#install { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.85); - width: 800px; - margin: 35px auto; - padding-bottom: 17px; - border-radius: 6px; - -moz-border-radius: 6px; - -webkit-border-radius: 6px; - box-shadow: 0 0 35px #5c5c5c; - -moz-box-shadow: 0 0 35px #5c5c5c; - -webkit-box-shadow: 0 0 35px #5c5c5c; -} - -#install a { - color: black; - text-decoration: underline; -} - -#install .clear { - clear: both; -} - -#install fieldset { - border: 1px solid black; - margin: 22px 0 15px 0; - padding: 7px 2px 5px 2px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#install legend { - font-size: 0.9em; - margin: 0 0 0 15px; - padding: 0 2px; - text-transform: uppercase; -} - -#install label { - width: 200px; - display: block; - float: left; - clear: both; - margin: 0 0 9px 12px; -} - -#install input { - float: left; - margin-bottom: 5px; -} - -#install input[type=text], -#install input[type=url], -#install input[type=password] { - margin-top: -2px; - padding: 3px; - font-size: 0.95em; - min-width: 220px; -} - -#install input.icon { - padding-left: 24px; - min-width: 199px; - max-height: 18px; -} - -#install input.icon#user_name { - background-position: 4px -204px; -} - -#install input.icon#user_password { - background-position: 4px -226px; -} - -#install input.icon#user_repassword { - background-position: 4px -248px; -} - -#install-top { - padding: 30px 45px; -} - -#install-top .logo { - background-position: 0 0; - min-width: 88px; - height: 36px; - padding: 32px 0 0 66px; - font-size: 32px; - color: white; - text-transform: lowercase; - float: left; - text-shadow: 0 1px 1px black; -} - -#install-top .step { - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.2); - border: 2px solid white; - padding: 6px 21px; - font-size: 2.7em; - text-shadow: 0 1px 1px black; - float: right; - border-radius: 40px; - -moz-border-radius: 40px; - -webkit-border-radius: 40px; - box-shadow: 0 0 10px #202020; - -moz-box-shadow: 0 0 10px #202020; - -webkit-box-shadow: 0 0 10px #202020; -} - -#install-top .step span { - font-size: 0.6em; -} - -#install-content { - background: #e4eef9; - background: -moz-linear-gradient(top, #e4eef9, #d0e5fa); - background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#d0e5fa)); - color: black; - font-size: 0.9em; - margin: 0 10px; - padding: 20px 24px; - min-height: 260px; - clear: both; - right: 10px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - box-shadow: 0 0 20px #202020; - -moz-box-shadow: 0 0 20px #202020; - -webkit-box-shadow: 0 0 20px #202020; -} - -#install-content h3 { - padding-left: 24px; - margin-bottom: 15px; -} - -#install-content h3.start { - background-position: 0 -73px; -} - -#install-content h3.storage { - background-position: 0 -95px; -} - -#install-content h3.account { - background-position: 0 -117px; -} - -#install-content h3.main { - background-position: 0 -139px; -} - -#install-content h3.hosts { - background-position: 0 -161px; -} - -#install-content h3.services { - background-position: 0 -183px; -} - -#install-content p { - margin-bottom: 10px; -} - -#install-content .info { - color: black; - border-width: 1px; - border-style: dashed; - padding: 6px 8px; - display: block; - text-decoration: none; -} - -#install-content .info.smallspace { - margin: 14px 0 10px 0; -} - -#install-content .info.bigspace { - margin: 35px 0 20px 0; -} - -#install-content .info.first { - margin-top: 28px; -} - -#install-content .info.last { - margin-bottom: 28px; -} - -#install-content .info.neutral { - background-color: #f0f19d; - border-color: #b3ad4f; -} - -#install-content a.info.neutral:hover, -#install-content a.info.neutral:focus { - background-color: #eced96; -} - -#install-content a.info.neutral:active { - background-color: #e9ea93; -} - -#install-content .info.success { - background-color: #a8dca9; - border-color: #5e9f5f; -} - -#install-content a.info.success:hover, -#install-content a.info.success:focus { - background-color: #a0d5a1; -} - -#install-content a.info.success:active { - background-color: #9ad09b; -} - -#install-content .info.fail { - background-color: #f19d9d; - border-color: #b34f4f; -} - -#install-content ol { - margin: 20px 30px; -} - -#install-content ol li { - margin-bottom: 1px; -} - -#install-buttons { - margin-top: 22px; -} - -#install-buttons input { - border: 1px solid white; - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.1); - color: white; - padding: 4px 8px; - margin-right: 20px; - text-shadow: 0 1px 1px black; - float: right; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - box-shadow: 0 0 5px #202020; - -moz-box-shadow: 0 0 5px #202020; - -webkit-box-shadow: 0 0 5px #202020; -} - -#install-buttons input:hover, -#install-buttons input:focus { - cursor: pointer; - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.2); - box-shadow: 0 0 15px #202020; - -moz-box-shadow: 0 0 15px #202020; - -webkit-box-shadow: 0 0 15px #202020; -} - -#install-buttons input:active { - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.3); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/integratebox.css b/sources/extend/addon/matrix/jappixmini/jappix/css/integratebox.css deleted file mode 100644 index b5cb9c9f..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/integratebox.css +++ /dev/null @@ -1,34 +0,0 @@ -/* - -Jappix - An open social platform -This is the integratebox CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 06/11/10 - -*/ - -#integratebox .top { - height: 40px; -} - -#integratebox .content { - text-align: center; - height: 385px; -} - -#integratebox .one-media img { - max-height: 385px; - max-width: 640px; -} - -#integratebox .one-media a img { - border: none; -} - -#integratebox .one-media audio { - margin-top: 170px; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/jquery.datepicker.css b/sources/extend/addon/matrix/jappixmini/jappix/css/jquery.datepicker.css deleted file mode 100644 index 264cd544..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/jquery.datepicker.css +++ /dev/null @@ -1,148 +0,0 @@ -/* - -Jappix - An open social platform -This is the datepicker CSS stylesheet - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 28/12/10 - -*/ - -div.datepicker { - position: relative; - font-family: Arial, Helvetica, sans-serif; - font-size: 12px; - width: 196px; - height: 147px; - position: absolute; - cursor: default; - top: 0; - left: 0; - display: none; -} - -.datepickerHidden { - display: none; -} - -div.datepicker table { - border-collapse:collapse; -} - -div.datepicker a { - text-decoration: none; - cursor: default; - outline: none; -} - -div.datepicker table td { - text-align: right; - padding: 0; - margin: 0; -} - -div.datepicker th { - text-align: center; - color: #47646a; - font-weight: normal; -} - -div.datepicker tbody th { - text-align: left; -} - -div.datepicker tbody a { - display: block; -} - -.datepickerDays a { - width: 20px; - line-height: 16px; - height: 16px; - padding-right: 2px; -} - -.datepickerYears a, -.datepickerMonths a { - width: 44px; - line-height: 36px; - height: 36px; - text-align: center; -} - -td.datepickerNotInMonth { - background: #c7d1d4; -} - -tbody.datepickerDays td.datepickerSelected { - background: #b0bdc1; -} - -tbody.datepickerYears td.datepickerSelected, -tbody.datepickerMonths td.datepickerSelected { - background: #9daaae; -} - -div.datepicker a:hover, -div.datepicker a:focus { - color: #3d7682; -} - -div.datepicker tbody th { - text-align: left; -} - -.datepickerSpace div { - width: 20px; -} - -.datepickerGoNext a, -.datepickerGoPrev a, -.datepickerMonth a { - text-align: center; - height: 20px; - line-height: 20px; -} - -.datepickerGoNext a { - float: right; - width: 20px; -} - -.datepickerGoPrev a { - float: left; - width: 20px; -} - -table.datepickerViewDays tbody.datepickerMonths, -table.datepickerViewDays tbody.datepickerYears { - display: none; -} - -table.datepickerViewMonths tbody.datepickerDays, -table.datepickerViewMonths tbody.datepickerYears, -table.datepickerViewMonths tr.datepickerDoW { - display: none; -} - -table.datepickerViewYears tbody.datepickerDays, -table.datepickerViewYears tbody.datepickerMonths, -table.datepickerViewYears tr.datepickerDoW { - display: none; -} - -td.datepickerDisabled a, -td.datepickerDisabled.datepickerNotInMonth a { - color: #333; -} - -td.datepickerSpecial a { - background: #700; -} - -td.datepickerSpecial.datepickerSelected a { - background: #a00; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/main.css b/sources/extend/addon/matrix/jappixmini/jappix/css/main.css deleted file mode 100644 index 68254814..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/main.css +++ /dev/null @@ -1,131 +0,0 @@ -/* - -Jappix - An open social platform -This is the main CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 05/10/11 - -*/ - -* { - margin: 0; - padding: 0; -} - -body { - font: normal 14.4px Helvetica, Verdana, sans-serif; - text-shadow: 0 0 5px white; -} - -h1 { - margin-bottom: 15px; -} - -a { - text-decoration: none; - color: black; - outline-style: none; -} - -a:hover, -a:focus { - cursor: pointer; - text-decoration: underline; -} - -legend { - color: black; -} - -input, -textarea { - background-color: white; - border: 1px solid #636363; - font-size: 0.95em; - padding: 2px; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - box-shadow: inset 0 3px 10px #dcdcdc; - -moz-box-shadow: inset 0 3px 10px #dcdcdc; - -webkit-box-shadow: inset 0 3px 10px #dcdcdc; -} - -textarea { - font-size: 1.1em; -} - -input:focus, -input[type=submit]:hover, -input[type=reset]:hover, -textarea:focus { - border: 1px solid #e1a014; - box-shadow: inset 0 3px 10px #edd9bc; - -moz-box-shadow: inset 0 3px 10px #edd9bc; - -webkit-box-shadow: inset 0 3px 10px #edd9bc; -} - -input[type=submit], -input[type=reset] { - cursor: pointer; -} - -input[type=submit]:active, -input[type=reset]:active { - box-shadow: inset 0 3px 15px #e1a753; - -moz-box-shadow: inset 0 3px 15px #e1a753; - -webkit-box-shadow: inset 0 3px 15px #e1a753; -} - -input[disabled], -textarea[disabled] { - background-color: #f3f3f3; - border: 1px solid #989898; -} - -input:placeholder { - color: #67787c !important; -} - -input:-moz-placeholder { - color: #67787c !important; -} - -input::-webkit-input-placeholder { - color: #67787c !important; -} - -input.placeholder { - color: #67787c !important; -} - -input[type=checkbox] { - margin-top: 2px; -} - -input[type=checkbox], -input[type=radio] { - background: transparent none !important; - border: 0 none !important; -} - -.please-complete, -.please-complete:hover, -.please-complete:focus { - border: 1px #ac2525 solid !important; - box-shadow: inset 0 3px 10px #f39c9c !important; - -moz-box-shadow: inset 0 3px 10px #f39c9c !important; - -webkit-box-shadow: inset 0 3px 10px #f39c9c !important; -} - -.hidden { - display: none !important; -} - -.clear { - clear: both !important; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/manager.css b/sources/extend/addon/matrix/jappixmini/jappix/css/manager.css deleted file mode 100644 index c1dd358c..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/manager.css +++ /dev/null @@ -1,543 +0,0 @@ -/* - -Jappix - An open social platform -This is the manager CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 31/08/11 - -*/ - -#manager { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.85); - width: 945px; - margin: 0 auto 25px; - padding-bottom: 17px; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - box-shadow: 0 0 35px #5c5c5c; - -moz-box-shadow: 0 0 35px #5c5c5c; - -webkit-box-shadow: 0 0 35px #5c5c5c; -} - -#manager a { - color: black; - text-decoration: underline; -} - -#manager .clear { - clear: both; -} - -#manager fieldset { - border: 1px solid black; - margin: 22px 0 15px 0; - padding: 7px 2px 5px 2px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#manager legend { - font-size: 0.9em; - margin: 0 0 0 15px; - padding: 0 2px; - text-transform: uppercase; -} - -#manager label { - width: 200px; - display: block; - float: left; - clear: both; - margin: 0 0 9px 12px; -} - -#manager label.master { - text-decoration: underline; -} - -#manager input, -#manager select { - float: left; - margin-bottom: 5px; -} - -#manager input[type=radio] { - margin: 2px 8px 5px 0; -} - -#manager input[type=text], -#manager input[type=url], -#manager input[type=password], -#manager select { - margin-top: -2px; - font-size: 0.95em; -} - -#manager input[type=text], -#manager input[type=url], -#manager input[type=password] { - padding: 3px; - min-width: 220px; -} - -#manager input.icon { - padding-left: 24px; - min-width: 199px; - max-height: 18px; -} - -#manager input.icon#admin_name { - background-position: 4px -510px; -} - -#manager input.icon#admin_password, -#manager input.icon#user_repassword { - background-position: 4px -532px; -} - -#manager input.icon#user_name, -#manager input.icon#music_artist { - background-position: 4px -554px; -} - -#manager input.icon#user_password { - background-position: 4px -576px; -} - -#manager input.icon#music_title { - background-position: 4px -598px; -} - -#manager input.icon#music_album { - background-position: 4px -620px; -} - -#manager input.icon#background_image_color, -#manager input.icon#background_color_color { - background-position: 4px -641px; -} - -#manager select { - min-width: 160px; - max-width: 230px; -} - -#manager-top { - padding: 25px 45px 30px; -} - -#manager-top .logo { - background-position: 0 0; - min-width: 89px; - height: 40px; - padding: 28px 0 0 65px; - font-size: 32px; - color: white; - text-transform: lowercase; - float: left; - text-shadow: 0 1px 1px black; -} - -#manager-top .meta { - background-color: #e0eaec; - font-size: 0.9em; - padding: 12px 7px 12px 14px; - float: right; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - box-shadow: 0 0 10px #202020; - -moz-box-shadow: 0 0 10px #202020; - -webkit-box-shadow: 0 0 10px #202020; -} - -#manager-top .meta span { - margin-right: 10px; - color: black; -} - -#manager-top .meta a { - background-color: #f1f6fd; - border: 1px solid #b9cbcf; - color: #224249; - padding: 4px 8px 4px 21px; - margin-left: 2px; - text-decoration: none; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -#manager-top .meta a:hover, -#manager-top .meta a:focus { - border: 1px solid #95b1b7; -} - -#manager-top .meta a:active { - border: 1px solid #77989f; -} - -#manager-top .meta a.logout { - background-position: 3px -69px; -} - -#manager-top .meta a.close { - background-position: 3px -90px; -} - -#manager-tabs { - margin-left: 12px; -} - -#manager-tabs a { - background-color: #d9e7ea; - color: #204249; - width: 107px; - height: 17px; - padding: 4px 4px 4px 16px; - margin-left: 4px; - font-size: 0.94em; - text-decoration: none; - overflow: hidden; - float: left; - border-top-right-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-topleft: 3px; - -webkit-border-top-right-radius: 3px; - -webkit-border-top-left-radius: 3px; -} - -#manager-tabs a:hover, -#manager-tabs a:focus { - background-color: #cedee1; - text-decoration: none; -} - -#manager-tabs a:active { - background-color: #c3d3d7; - text-decoration: none; -} - -#manager-tabs a.tab-active { - background-color: #e4eef9 !important; -} - -#manager-content { - background: #e4eef9; - background: -moz-linear-gradient(top, #e4eef9, #d0e5fa); - background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#d0e5fa)); - color: black; - font-size: 0.9em; - margin: 0 10px; - padding: 20px 24px; - min-height: 260px; - clear: both; - right: 10px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - box-shadow: 0 0 20px #202020; - -moz-box-shadow: 0 0 20px #202020; - -webkit-box-shadow: 0 0 20px #202020; -} - -#manager-content h3 { - padding-left: 24px; - margin-bottom: 15px; -} - -#manager-content h3.login { - background-position: 0 -466px; -} - -#manager-content h3.statistics { - background-position: 0 -203px; -} - -#manager-content h3.configuration { - background-position: 0 -224px; -} - -#manager-content h3.hosts { - background-position: 0 -246px; -} - -#manager-content h3.storage { - background-position: 0 -268px; -} - -#manager-content h3.design { - background-position: 0 -290px; -} - -#manager-content h3.users { - background-position: 0 -312px; -} - -#manager-content h3.updates { - background-position: 0 -334px; -} - -#manager-content h4 { - border-top: 1px dotted black; - padding-top: 5px; - margin: 20px 0 14px; - clear: both; -} - -#manager-content ul, -#manager-content ol { - width: 380px; - margin: 8px 0 20px 18px; -} - -#manager-content li { - margin-bottom: 3px; -} - -#manager-content li.total { - margin-bottom: 14px; -} - -#manager-content li b { - width: 190px; - float: left; -} - -#manager-content li span { - margin-left: 10px; - float: left; -} - -#manager-content ul.stats, -#manager-content ol.stats { - float: left; -} - -#manager-content object.stats { - border: 1px dotted #bed4d9; - width: 450px; - height: 270px; - margin-bottom: 20px; - float: right; -} - -#manager-content p, -#manager-content div { - margin-bottom: 10px; -} - -#manager-content .info { - color: black; - border-width: 1px; - border-style: dashed; - padding: 6px 8px; - display: block; - text-decoration: none; -} - -#manager-content .info.bottomspace { - margin-bottom: 16px; -} - -#manager-content .info.smallspace { - margin: 14px 0 10px 0; -} - -#manager-content .info.bigspace { - margin: 35px 0 20px 0; -} - -#manager-content .info.neutral { - background-color: #f0f19d; - border-color: #b3ad4f; -} - -#manager-content a.info.neutral:hover, -#manager-content a.info.neutral:focus { - background-color: #eced96; -} - -#manager-content a.info.neutral:active { - background-color: #e9ea93; -} - -#manager-content .info.success { - background-color: #a8dca9; - border-color: #5e9f5f; -} - -#manager-content a.info.success:hover, -#manager-content a.info.success:focus { - background-color: #a0d5a1; -} - -#manager-content a.info.success:active { - background-color: #9ad09b; -} - -#manager-content .info.fail { - background-color: #f19d9d; - border-color: #b34f4f; -} - -#manager-content a.info.fail:hover, -#manager-content a.info.fail:focus { - background-color: #ea9595; -} - -#manager-content a.info.fail:active { - background-color: #e59090; -} - -#manager-content .browse { - margin: 2px 0 6px; - max-height: 243px; - overflow: auto; -} - -#manager-content .browse .one-browse { - padding: 5px 10px 5px 34px; - height: 17px; -} - -#manager-content .browse .user { - background-position: 9px -111px; -} - -#manager-content .browse .other { - background-position: 9px -133px; -} - -#manager-content .browse .folder { - background-position: 9px -178px; -} - -#manager-content .browse .audio { - background-position: 9px -154px; -} - -#manager-content .browse .alert { - background-position: 9px -353px; -} - -#manager-content .browse .image { - background-position: 9px -374px; -} - -#manager-content .browse .video { - background-position: 9px -397px; -} - -#manager-content .browse .document { - background-position: 9px -418px; -} - -#manager-content .browse .package { - background-position: 9px -441px; -} - -#manager-content .browse .previous { - background-position: 9px -485px; - margin-bottom: 4px; -} - -#manager-content .browse div { - margin: 0; -} - -#manager-content .browse input { - float: right; - margin: 1px 0; -} - -#manager-content .browse .odd { - background-color: #e9f1fd; -} - -#manager-content .browse .even { - background-color: #f1f6fd; -} - -#manager-content .sub { - border-left: 1px solid black; - margin: 5px 0 20px 22px; - padding-left: 12px; - clear: both; -} - -#manager span.logo_links a { - width: 16px; - height: 16px; - margin-right: 6px; - float: left; -} - -#manager span.logo_links a.remove { - background-position: 0 -688px; -} - -#manager span.logo_links a.view { - background-position: 0 -666px; -} - -#manager-content .clear { - margin: 0; -} - -#manager-content textarea.notice-text { - height: 70px; - width: 600px; - margin-left: 4px; - padding: 5px; - font-size: 1.2em; -} - -#manager-buttons { - margin-top: 22px; -} - -#manager-buttons input { - border: 1px solid white; - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.1); - color: white; - padding: 4px 8px; - margin-left: -12px; - margin-right: 20px; - font-size: 1em; - text-shadow: 0 1px 1px black; - float: right; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - box-shadow: 0 0 5px #202020; - -moz-box-shadow: 0 0 5px #202020; - -webkit-box-shadow: 0 0 5px #202020; -} - -#manager-buttons input:hover, -#manager-buttons input:focus { - cursor: pointer; - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.2); - box-shadow: 0 0 15px #202020; - -moz-box-shadow: 0 0 15px #202020; - -webkit-box-shadow: 0 0 15px #202020; -} - -#manager-buttons input:active { - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.3); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/me.css b/sources/extend/addon/matrix/jappixmini/jappix/css/me.css deleted file mode 100644 index 2ff74fbd..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/me.css +++ /dev/null @@ -1,49 +0,0 @@ -/* - -Jappix - An open social platform -This is the Jappix Me tool CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 16/01/12 - -*/ - -#me .content { - padding: 10px 0; -} - -#me .logo { - background-position: 0 0; - width: 300px; - height: 61px; - margin: 20px auto 0 auto; - display: block; -} - -#me .infos { - margin-top: 30px; -} - -#me .infos p { - margin-top: 8px; -} - -#me .infos p.infos-title { - margin-top: 0; -} - -#me .infos a { - text-decoration: underline; -} - -#me a.go { - text-align: center; - font-weight: bold; - width: 300px; - margin: 30px auto 0 auto; - padding: 8px 12px; - display: block; -} \ No newline at end of file diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/mini-ie.css b/sources/extend/addon/matrix/jappixmini/jappix/css/mini-ie.css deleted file mode 100644 index d8f4b908..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/mini-ie.css +++ /dev/null @@ -1,73 +0,0 @@ -/* - -Jappix - An open social platform -This is the Jappix Mini legacy IE CSS stylesheet - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 20/03/11 - -*/ - -#jappix_mini { - width: expression(document.documentElement.clientWidth - 150 + 'px') !important; - position: absolute !important; - bottom: auto !important; - right: auto !important; - top: expression(((document.documentElement.clientHeight - this.offsetHeight) + (ignoreMiniTop = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop)) + 'px') !important; - left: expression((150 + this.offsetWidth - (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth) + (ignoreMiniLeft = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft)) + 'px') !important; -} - -#jappix_mini .jm_images { - background-image: url(../img/sprites/mini.gif) !important; -} - -#jappix_mini .jm_images_animate { - background-image: url(../img/sprites/animate.gif) !important; -} - -#jappix_mini a.jm_button { - width: 1px !important; -} - -#jappix_mini div.jm_roster { - right: -1px !important; - bottom: 23px !important; -} - -#jappix_mini div.jm_roster div.jm_buddies { - height: expression(this.scrollHeight > (document.documentElement.clientHeight - 70) ? (document.documentElement.clientHeight - 70) + 'px' : 'auto') !important; -} - -#jappix_mini a.jm_pane { - height: 12px !important; - overflow-y: hidden !important; -} - -#jappix_mini a.jm_button.jm_clicked { - background-image: none !important; -} - -#jappix_mini div.jm_conversations a.jm_clicked { - border-right: none !important; - padding: 7px 6px 6px 6px !important; -} - -#jappix_mini div.jm_chat-content { - bottom: 23px !important; - right: -2px !important; -} - -#jappix_popup { - height: expression(document.documentElement.clientHeight + 'px') !important; - width: expression(document.documentElement.clientWidth + 'px') !important; - position: absolute !important; - top: expression(((ignorePopupTop = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop)) + 'px') !important; - left: expression(((ignorePopupLeft = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft)) + 'px') !important; -} - -#jappix_popup div.jm_prompt { - position: absolute !important; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/mini.css b/sources/extend/addon/matrix/jappixmini/jappix/css/mini.css deleted file mode 100644 index 7ad6058b..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/mini.css +++ /dev/null @@ -1,540 +0,0 @@ -/* - -Jappix - An open social platform -This is the Jappix Mini CSS stylesheet - -------------------------------------------------- - -License: AGPL -Authors: Vanaryon, Julien -Last revision: 16/01/12 - -*/ - -#jappix_mini, -#jappix_popup { - font: normal 11px helvetica, "Lucida Grande", "Lucida Sans", "Lucida Sans Unicode", Arial, sans-serif; -} - -#jappix_mini { - margin-left: 130px; - position: fixed; - bottom: 0; - right: 20px; - z-index: 999; -} - -#jappix_mini *, -#jappix_popup * { - border: none; - color: black; - width: auto; - height: auto; - margin: 0; - padding: 0; - overflow: visible; - font-size: 11px; - text-align: left; - text-transform: none; - text-shadow: none; - opacity: 1.0; - border-radius: 0; - -moz-border-radius: 0; - -webkit-border-radius: 0; - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; -} - -#jappix_mini .jm_images { - background-image: url(../img/sprites/mini.png); - background-repeat: no-repeat; -} - -#jappix_mini .jm_images_animate { - background-image: url(../img/sprites/animate.png); - background-repeat: no-repeat; -} - -#jappix_mini a { - text-decoration: none; - cursor: pointer; -} - -#jappix_mini a:hover { - cursor: pointer; -} - -#jappix_mini div.jm_position { - float: right; -} - -#jappix_mini a.jm_pane { - background-color: #f4f4f4; - background-position: 0 -100px; - background-repeat: repeat-x; - border-color: #999999; - border-style: solid; - border-width: 1px 1px 0 1px; - font-weight: bold; - outline-style: none; - display: block; - padding: 6px; - height: 24px; -} - -#jappix_mini a.jm_pane:hover { - background: white; -} - -#jappix_mini a.jm_pane:hover, -#jappix_mini a.jm_pane:focus { - border-color: #666666; -} - -#jappix_mini div.jm_starter, -#jappix_mini div.jm_conversations, -#jappix_mini div.jm_conversation { - float: left; - position: relative; -} - -#jappix_mini div.jm_conversation { - width: 153px; -} - -#jappix_mini a.jm_chat-tab { - border-width: 1px 0 0 1px; - width: 140px; - float: right; - overflow: hidden; -} - -#jappix_mini a.jm_chat-tab.jm_clicked { - background: white; - position: relative; - border-top: none; - border-left: 1px solid #999999; - padding-top: 7px; -} - -#jappix_mini a.jm_chat-tab span.jm_notify { - position: absolute; - top: 6px; - right: 9px; -} - -#jappix_mini a.jm_chat-tab span.jm_notify span { - float: left; -} - -#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_left { - background-position: 0 -360px; -} - -#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_right { - background-position: -7px -360px; -} - -#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_left, -#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_right { - height: 16px; - width: 7px; -} - -#jappix_mini a.jm_chat-tab span.jm_notify span.jm_notify_middle { - background-color: #c60505; - color: white; - font-size: 0.85em; - height: 14px; - padding-top: 2px; -} - -#jappix_mini div.jm_conversation.jm_type_groupchat span.jm_name { - margin-left: 4px; -} - -#jappix_mini div.jm_chat-content { - background-color: white; - border: 1px solid #999999; - height: 300px; - width: 260px; - position: absolute; - right: -1px; - bottom: 25px; - display: none; -} - -#jappix_mini div.jm_actions { - background-color: #565d5e; - border-bottom: 1px solid #3a3a3a; - height: 24px; - padding: 4px 6px; - font-weight: bold; - overflow: hidden; -} - -#jappix_mini div.jm_actions span.jm_nick { - color: white; - height: 16px; - width: 225px; - overflow: hidden; - float: left; -} - -#jappix_mini div.jm_actions a.jm_one-action { - background-color: #727879; - margin: 0 -2px 0 5px; - height: 15px; - width: 15px; - outline-style: none; - float: right; -} - -#jappix_mini div.jm_actions a.jm_one-action:hover, -#jappix_mini div.jm_actions a.jm_one-action:focus { - background-color: #7f8788; -} - -#jappix_mini div.jm_actions a.jm_one-action:active { - background-color: #8c9293; -} - -#jappix_mini div.jm_actions a.jm_logo { - background-position: 7px 2px; - width: 81px; - height: 22px; - margin: -4px 0 0 -2px; - outline-style: none; - float: left; -} - -#jappix_mini div.jm_actions a.jm_logo:hover, -#jappix_mini div.jm_actions a.jm_logo:focus { - background-color: #636a6b; -} - -#jappix_mini div.jm_actions a.jm_logo:active { - background-color: #707677; -} - -#jappix_mini div.jm_actions a.jm_close { - background-position: 1px -341px; -} - -#jappix_mini div.jm_actions a.jm_join { - background-position: 0 -327px; -} - -#jappix_mini div.jm_received-messages { - background-color: white; - padding: 5px 0 4px; - height: 242px; - overflow: auto; -} - -#jappix_mini div.jm_received-messages p { - margin: 3px 0; - word-wrap: break-word; -} - -#jappix_mini div.jm_received-messages p, -#jappix_mini div.jm_received-messages a { - color: black !important; -} - -#jappix_mini div.jm_received-messages div.jm_group { - margin: 2px 6px 9px 6px; - padding-bottom: 8px; - border-bottom: 1px solid #eaeaea; -} - -#jappix_mini div.jm_received-messages div.jm_system-message p, -#jappix_mini div.jm_received-messages div.jm_system-message a { - color: #053805 !important; - font-style: italic !important; -} - -#jappix_mini div.jm_received-messages p a { - text-decoration: underline; -} - -#jappix_mini div.jm_received-messages b { - margin-bottom: 3px; - display: block; -} - -#jappix_mini div.jm_received-messages b.jm_me { - color: #123a5c; -} - -#jappix_mini div.jm_received-messages b.jm_him { - color: #801e1e; -} - -#jappix_mini div.jm_received-messages span.jm_date { - font-size: 0.8em; - float: right; - display: none; -} - -#jappix_mini div.jm_received-messages div.jm_group:hover span.jm_date { - display: block; -} - -#jappix_mini input.jm_send-messages { - background-color: white; - border-color: #999999; - border-style: solid; - border-width: 1px 0 0 0; - padding: 5px; - width: 250px; - min-height: 14px; -} - -#jappix_mini div.jm_disabled div.jm_chat-content, -#jappix_mini div.jm_disabled input.jm_send-messages, -#jappix_mini div.jm_disabled a.jm_pane { - background: #f3f3f3 !important; -} - -#jappix_mini div.jm_disabled input.jm_send-messages { - color: #9d9d9d; -} - -#jappix_mini div.jm_roster { - background-color: white; - border: 1px solid #999999; - width: 160px; - position: absolute; - right: 0; - bottom: 25px; - display: none; -} - -#jappix_mini div.jm_roster div.jm_buddies { - width: 100%; - max-height: 300px; - padding: 5px 0; - overflow: auto; -} - -#jappix_mini div.jm_roster div.jm_grouped { - margin: 2px 0; -} - -#jappix_mini div.jm_roster div.jm_grouped div.jm_name { - margin-bottom: 2px; - padding: 4px 8px 0; - font-weight: bold; -} - -#jappix_mini a.jm_friend { - border-color: white; - border-style: solid; - border-width: 1px 0; - outline-style: none; - padding: 6px; - display: block; -} - -#jappix_mini a.jm_friend.jm_offline { - display: none; -} - -#jappix_mini a.jm_friend:hover, -#jappix_mini a.jm_friend:focus { - background-color: #888888; - border-color: #494949; - color: white; -} - -#jappix_mini a.jm_friend:hover span.jm_presence, -#jappix_mini a.jm_friend:focus span.jm_presence { - background-position: 0 -84px; -} - -#jappix_mini a.jm_button { - padding: 6px 10px; - position: relative; - z-index: 1; -} - -#jappix_mini a.jm_button.jm_clicked { - background: white; - border-top: none; - border-left: 1px solid #999999; - border-right: 1px solid #999999; - padding: 7px 10px 6px 10px; -} - -#jappix_mini span.jm_animate { - background-position: 0 0; - width: 111px; - height: 102px; - position: absolute; - top: -100px; - left: -74px; - z-index: 1; - display: block; -} - -#jappix_mini span.jm_counter { - background-position: 0 -288px; - color: #333333; - height: 16px; - padding-left: 25px; - display: block; -} - -#jappix_mini span.jm_counter.jm_error { - background-position: 0 -305px; -} - -#jappix_mini span.jm_presence { - display: block; - height: 16px; - width: 16px; - margin-right: 4px; - float: left; -} - -#jappix_mini span.jm_name { - color: #272727; - height: 14px; - width: 105px; - overflow: hidden; - float: left; -} - -#jappix_mini .jm_available, -#jappix_mini .jm_chat { - background-position: 0 -20px; -} - -#jappix_mini .jm_away { - background-position: 0 -36px; -} - -#jappix_mini .jm_xa, -#jappix_mini .jm_dnd { - background-position: 0 -52px; -} - -#jappix_mini .jm_unavailable { - background-position: 0 -68px; -} - -#jappix_mini .jm_smiley { - border: 0 none; - height: 16px; - width: 16px; - vertical-align: bottom; -} - -#jappix_mini .jm_smiley-wink { - background-position: 0 -148px; -} - -#jappix_mini .jm_smiley-waii { - background-position: 0 -164px; -} - -#jappix_mini .jm_smiley-unhappy { - background-position: 0 -180px; -} - -#jappix_mini .jm_smiley-tongue { - background-position: 0 -196px; -} - -#jappix_mini .jm_smiley-surprised { - background-position: 0 -212px; -} - -#jappix_mini .jm_smiley-smile { - background-position: 0 -228px; -} - -#jappix_mini .jm_smiley-happy { - background-position: 0 -244px; -} - -#jappix_mini .jm_smiley-grin { - background-position: 0 -260px; -} - -#jappix_popup { - background: url(../img/others/blank.gif) repeat; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 999; -} - -#jappix_popup div.jm_prompt { - background-color: #565d5e; - border: 1px solid #3a3a3a; - width: 346px; - position: fixed; - top: 50%; - left: 50%; - margin-left: -175px; - padding: 16px 2px 2px 2px; - border-top-right-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - box-shadow: 0 0 35px #232323; - -moz-box-shadow: 0 0 35px #232323; - -webkit-box-shadow: 0 0 35px #232323; -} - -#jappix_popup div.jm_prompt form { - background-color: white; - border: 1px solid #3a3a3a; - width: 332px; - padding: 6px; -} - -#jappix_popup div.jm_prompt form input { - background-color: #f9f9f9; - border: 1px solid #666666; - font-size: 1.1em; - padding: 1px 2px; -} - -#jappix_popup div.jm_prompt form input:hover, -#jappix_popup div.jm_prompt form input:focus { - border: 1px solid #202020; -} - -#jappix_popup div.jm_prompt form input.jm_text { - width: 326px; - margin: 6px 0; - display: block; -} - -#jappix_popup div.jm_prompt form input.jm_submit { - text-align: center; - margin-left: 3px; - float: right; -} - -#jappix_popup div.jm_prompt form input.jm_submit:hover, -#jappix_popup div.jm_prompt form input.jm_submit:focus { - background-color: #f3f3f3; - cursor: pointer; -} - -#jappix_popup div.jm_prompt form input.jm_submit:active { - background-color: #e8e8e8; -} - -#jappix_popup div.jm_prompt div.jm_clear { - clear: both; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/mobile.css b/sources/extend/addon/matrix/jappixmini/jappix/css/mobile.css deleted file mode 100644 index ed44cc03..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/mobile.css +++ /dev/null @@ -1,288 +0,0 @@ -/* - -Jappix - An open social platform -This is the Jappix Mobile CSS stylesheet - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 05/10/11 - -*/ - -/* BEGIN GENERAL STYLE */ - -* { - margin: 0; - padding: 0; -} - -body { - font: normal 14.4px Helvetica, Verdana, sans-serif; - background-color: #dcdcdc; - margin: 0 auto; - text-align: center; - min-width: 200px; - min-height: 260px; -} - -a { - color: black; -} - -/* END GENERAL STYLE */ - -/* BEGIN HEADER STYLE */ - -.header { - background-color: #2d2d2d; - border-bottom: 1px solid #6d6d6d; - color: #405964; - padding: 6px 0; - height: 30px; -} - -.header div { - background-position: 0 0; - width: 83px; - height: 30px; -} - -/* END HEADER STYLE */ - -/* BEGIN HOME STYLE */ - -#home .header div { - margin: 0 auto; -} - -#home .notification { - padding: 2px; - margin-top: -1px; -} - -#noscript { - background: #86a2ff; - border-bottom: 1px solid #5890d6; - color: #1e4b82; -} - -#error { - background: #ff8686; - border-bottom: 1px solid #d65858; - color: #821e1e; - display: none; -} - -#info { - background: #f3eba7; - border-bottom: 1px solid #d9d085; - color: #5e5616; - display: none; -} - -#home .login { - padding: 8px 0; - margin: 30px 0 30px 0; -} - -#home .login input { - margin-top: 5px; - padding: 2px; -} - -#home .login input.xid, -#home .login input.password { - display: block; - margin: 4px auto; - font-size: 0.85em; - padding: 4px; - background-color: white; - border: 1px solid #636363; - width: 150px; - padding-left: 24px; -} - -#home .login input.xid { - background-position: 4px -30px; -} - -#home .login input.password { - background-position: 4px -53px; -} - -#home .login label { - margin-bottom: 12px; - display: block; -} - -#home .login label input { - margin-right: 4px; -} - -#home a { - font-size: 0.8em; -} - -/* END HOME STYLE */ - -/* BEGIN TALK STYLE */ - -#talk .header div, -#chat .header div { - float: left; - margin-left: 7px; -} - -#talk .header button, -#chat .header button { - float: right; - margin-right: 7px; - padding: 2px; -} - -#talk a.one-buddy { - display: none; - background-color: #87a5ab; - border-bottom: 1px solid #5b8088; - text-shadow: 1px 1px 1px #5b8088; - text-decoration: none; - color: white; - outline-style: none; - padding: 10px 0; -} - -#talk a.one-buddy:hover { - cursor: pointer; -} - -#talk a.available, -#talk a.chat { - background-color: #83b187; - border-bottom: 1px solid #4d8252; - text-shadow: 1px 1px 1px #4d8252; -} - -#talk a.available:hover, -#talk a.chat:hover, -#talk a.available:focus, -#talk a.chat:focus { - background-color: #89c68e; -} - -#talk a.available:active, -#talk a.chat:active { - background-color: #90d496; -} - -#talk a.away { - background-color: #e0be7b; - border-bottom: 1px solid #ae8941; - text-shadow: 1px 1px 1px #ae8941; -} - -#talk a.away:hover, -#talk a.away:focus { - background-color: #eac784; -} - -#talk a.away:active { - background-color: #f3d294; -} - -#talk a.xa, -#talk a.dnd { - background-color: #db8989; - border-bottom: 1px solid #a24343; - text-shadow: 1px 1px 1px #a24343; -} - -#talk a.xa:hover, -#talk a.dnd:hover, -#talk a.xa:focus, -#talk a.dnd:focus { - background-color: #e89797; -} - -#talk a.xa:active, -#talk a.dnd:active { - background-color: #ef9f9f; -} - -/* END TALK STYLE */ - -/* BEGIN CHAT STYLE */ - -#chat { - display: none; -} - -#chat .one-chat, -#chat .one-chat p, -#chat .one-chat div, -#chat .one-chat input { - position: absolute; - bottom: 0; - right: 0; -} - -#chat .one-chat { - top: 43px; - left: 0; -} - -#chat .one-chat p { - background-color: #87a5ab; - border-bottom: 1px solid #5b8088; - text-shadow: 1px 1px 1px #5b8088; - color: white; - top: 0; - left: 0; - height: 18px; - padding: 2px 0; - font-size: 0.9em; -} - -#chat .one-chat div { - border-bottom: 1px solid #cbcbcb; - top: 23px; - left: 0; - bottom: 25px; - overflow: auto; - text-align: left; -} - -#chat .one-chat span { - display: block; - font-size: 0.85em; - margin: 4px 6px; - word-wrap: break-word; -} - -#chat .one-chat b { - margin-right: 3px; -} - -#chat .one-chat b.me { - color: #123a5c; -} - -#chat .one-chat b.him { - color: #801e1e; -} - -#chat .one-chat input { - background-color: white; - bottom: 0; - height: 25px; - width: 100%; - border: none; -} - -#chat .one-chat input.submit { - right: 0; - width: 35px; -} - -/* END CHAT STYLE */ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/mucadmin.css b/sources/extend/addon/matrix/jappixmini/jappix/css/mucadmin.css deleted file mode 100644 index 3fe1c754..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/mucadmin.css +++ /dev/null @@ -1,91 +0,0 @@ -/* - -Jappix - An open social platform -This is the mucadmin CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 11/05/11 - -*/ - -#mucadmin .content { - padding: 10px 0 10px 0; -} - -#mucadmin .content p { - margin: 5px 10px 5px 10px; - text-align: justify; -} - -#mucadmin .mucadmin-head-jid { - text-decoration: underline; - font-size: 0.9em; - float: right; - margin: 1px 4px 1px 1px; -} - -#mucadmin .mucadmin-forms { - height: 310px; - width: 620px; - margin: -5px 0 0 10px; - padding: 6px 0 0 0; - overflow: auto; -} - -#mucadmin .mucadmin-forms label { - width: 260px; -} - -#mucadmin .mucadmin-topic label, -#mucadmin .mucadmin-aut label, -#mucadmin .mucadmin-others label { - font-size: 0.9em; -} - -#mucadmin .mucadmin-forms textarea { - height: 60px; - width: 300px; - margin: 5px 12px 10px 0; -} - -#mucadmin .results { - height: auto; - width: auto; - overflow: visible; - margin: 5px; -} - -#mucadmin .aut-group { - float: left; - padding-bottom: 4px; -} - -#mucadmin .one-aut { - clear: both; - margin: 0 10px 5px 0; -} - -#mucadmin .aut-add { - clear: both; - float: left; - margin-bottom: 5px; - font-size: 0.9em; -} - -#mucadmin .aut-remove { - float: left; -} - -#mucadmin .aut-remove:hover, -#mucadmin .aut-remove:focus { - font-weight: bold; - text-decoration: none; -} - -#mucadmin .mucadmin-others a { - float: left; - font-size: 0.9em; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/myinfos.css b/sources/extend/addon/matrix/jappixmini/jappix/css/myinfos.css deleted file mode 100644 index 83262268..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/myinfos.css +++ /dev/null @@ -1,330 +0,0 @@ -/* - -Jappix - An open social platform -This is the my-infos CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 31/08/11 - -*/ - -#my-infos { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.85); - color: #919191; - margin-top: 8px; - padding: 15px 6px 6px 6px; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - box-shadow: 0 0 6px #5c5c5c; - -moz-box-shadow: 0 0 6px #5c5c5c; - -webkit-box-shadow: 0 0 6px #5c5c5c; -} - -#my-infos .content { - background: #e8f1f3; - background: -moz-linear-gradient(top, #e4edef, #e8f1f3); - background: -webkit-gradient(linear, left top, left bottom, from(#e4edef), to(#e8f1f3)); - color: #919191; - max-height: 140px; - padding: 1px 0; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#my-infos .element { - height: 24px; - margin: 6px 0; - position: relative; -} - -#my-infos .element .icon { - background-color: white; - border-color: #636363; - border-width: 1px; - border-style: solid; - margin-left: 6px; - height: 22px; - width: 25px; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -#my-infos .element div.bubble a { - width: 100%; - height: 20px; -} - -#my-infos .element .icon:hover, -#my-infos .element div.bubble a:hover { - background-color: #f4f4f4; -} - -#my-infos .element .icon:active, -#my-infos .element div.bubble a:active { - background-color: #ededed; -} - -#my-infos .f-presence div.bubble a[data-value=available] { - background-position: 4px -167px; -} - -#my-infos .f-presence div.bubble a[data-value=away] { - background-position: 4px -183px; -} - -#my-infos .f-presence div.bubble a[data-value=xa] { - background-position: 4px -199px; -} - -#my-infos .f-mood div.bubble a[data-value=crazy] { - background-position: 4px -296px; -} - -#my-infos .f-mood div.bubble a[data-value=excited] { - background-position: 4px -314px; -} - -#my-infos .f-mood div.bubble a[data-value=playful] { - background-position: 4px -332px; -} - -#my-infos .f-mood div.bubble a[data-value=happy] { - background-position: 4px -350px; -} - -#my-infos .f-mood div.bubble a[data-value=shocked] { - background-position: 4px -368px; -} - -#my-infos .f-mood div.bubble a[data-value=hot] { - background-position: 4px -386px; -} - -#my-infos .f-mood div.bubble a[data-value=sad] { - background-position: 4px -404px; -} - -#my-infos .f-mood div.bubble a[data-value=amorous] { - background-position: 4px -422px; -} - -#my-infos .f-mood div.bubble a[data-value=confident] { - background-position: 4px -440px; -} - -#my-infos .f-mood a[data-value] span { - background-position: 0 -352px; -} - -#my-infos .f-mood a[data-value=crazy] span, -.mood-one { - background-position: 0 -298px; -} - -#my-infos .f-mood a[data-value=excited] span, -.mood-two { - background-position: 0 -316px; -} - -#my-infos .f-mood a[data-value=playful] span, -.mood-three { - background-position: 0 -334px; -} - -#my-infos .f-mood a[data-value=happy] span, -.mood-four { - background-position: 0 -352px; -} - -#my-infos .f-mood a[data-value=shocked] span, -.mood-five { - background-position: 0 -370px; -} - -#my-infos .f-mood a[data-value=hot] span, -.mood-six { - background-position: 0 -388px; -} - -#my-infos .f-mood a[data-value=sad] span, -.mood-seven { - background-position: 0 -406px; -} - -#my-infos .f-mood a[data-value=amorous] span, -.mood-eight { - background-position: 0 -424px; -} - -#my-infos .f-mood a[data-value=confident] span, -.mood-nine { - background-position: 0 -442px; -} - -#my-infos .f-activity div.bubble a[data-value=doing_chores] { - background-position: 4px -458px; -} - -#my-infos .f-activity div.bubble a[data-value=drinking] { - background-position: 4px -476px; -} - -#my-infos .f-activity div.bubble a[data-value=eating] { - background-position: 4px -494px; -} - -#my-infos .f-activity div.bubble a[data-value=exercising] { - background-position: 4px -512px; -} - -#my-infos .f-activity div.bubble a[data-value=grooming] { - background-position: 4px -548px; -} - -#my-infos .f-activity div.bubble a[data-value=having_appointment] { - background-position: 4px -566px; -} - -#my-infos .f-activity div.bubble a[data-value=inactive] { - background-position: 4px -530px; -} - -#my-infos .f-activity div.bubble a[data-value=relaxing] { - background-position: 4px -620px; -} - -#my-infos .f-activity div.bubble a[data-value=talking] { - background-position: 4px -602px; -} - -#my-infos .f-activity div.bubble a[data-value=traveling] { - background-position: 4px -584px; -} - -#my-infos .f-activity div.bubble a[data-value=working] { - background-position: 4px -638px; -} - -#my-infos .f-activity a[data-value] span { - background-position: 0 -514px; -} - -#my-infos .f-activity a[data-value=doing_chores] span, -.activity-doing_chores { - background-position: 0 -460px; -} - -#my-infos .f-activity a[data-value=drinking] span, -.activity-drinking { - background-position: 0 -478px; -} - -#my-infos .f-activity a[data-value=eating] span, -.activity-eating { - background-position: 0 -496px; -} - -#my-infos .f-activity a[data-value=exercising] span, -.activity-exercising { - background-position: 0 -514px; -} - -#my-infos .f-activity a[data-value=grooming] span, -.activity-grooming { - background-position: 0 -550px; -} - -#my-infos .f-activity a[data-value=having_appointment] span, -.activity-having_appointment { - background-position: 0 -568px; -} - -#my-infos .f-activity a[data-value=inactive] span, -.activity-inactive { - background-position: 0 -532px; -} - -#my-infos .f-activity a[data-value=relaxing] span, -.activity-relaxing { - background-position: 0 -622px; -} - -#my-infos .f-activity a[data-value=talking] span, -.activity-talking { - background-position: 0 -604px; -} - -#my-infos .f-activity a[data-value=traveling] span, -.activity-traveling { - background-position: 0 -586px; -} - -#my-infos .f-activity a[data-value=working] span, -.activity-working { - background-position: 0 -640px; -} - -#my-infos .element .icon.picker { - border-width: 1px 0 1px 1px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-bottomright: 0; - -webkit-border-top-right-radius: 0; - -webkit-border-bottom-right-radius: 0; -} - -#my-infos .element .icon.disabled { - background-color: #f3f3f3; - border-color: #989898; - cursor: default; -} - -#my-infos .element div.bubble { - background-color: white; - border-color: #636363; - border-width: 1px 1px 0 1px; - border-style: solid; - width: 25px; - padding: 1px 0; - position: absolute; - bottom: 21px; - left: 6px; - border-top-left-radius: 2px; - border-top-right-radius: 2px; - -moz-border-radius-topleft: 2px; - -moz-border-radius-topright: 2px; - -webkit-border-top-left-radius: 2px; - -webkit-border-top-right-radius: 2px; -} - -#my-infos .element a { - float: left; -} - -#my-infos .element .icon span { - height: 16px; - width: 16px; - margin: 3px 4px; - display: block; -} - -#my-infos .element input { - height: 18px; - width: 190px; - font-size: 0.85em; - padding-left: 4px; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-topleft: 0; - -moz-border-radius-bottomleft: 0; - -webkit-border-top-left-radius: 0; - -webkit-border-top-bottom-radius: 0; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/options.css b/sources/extend/addon/matrix/jappixmini/jappix/css/options.css deleted file mode 100644 index 6dc4ecdb..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/options.css +++ /dev/null @@ -1,97 +0,0 @@ -/* - -Jappix - An open social platform -This is the options CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 26/04/11 - -*/ - -#options label { - width: 190px; - font-size: 0.94em; -} - -#options .forms { - width: 610px; - height: 328px; - margin: 15px 15px 15px 15px; - float: left; -} - -#options .forms select { - margin-top: -3px; - min-width: 120px; - float: left; -} - -#options .forms a.linked { - font-size: 0.9em; - float: left; -} - -#options fieldset.privacy { - display: none; -} - -#options .sub-ask-delete, #options .sub-ask-pass, #options .sub-ask-pass-success { - display: none; -} - -#options .sub-ask { - display: none; - width: 592px; - padding: 8px; - float: left; - border: 1px #879da2 dotted; - background: #cbdde1; -} - -#options .sub-ask-top { - font-size: 0.9em; - margin-top: -3px; -} - -#options .sub-ask-title { - margin-bottom: 4px; - float: left; -} - -#options .sub-ask-close { - float: right; -} - -#options .sub-ask-close:hover { - cursor: pointer; -} - -#options .sub-ask-content { - clear: both; - height: 25px; - font-size: 0.9em; - border-top: 1px #416972 solid; - padding: 12px 0; -} - -#options .sub-ask-content label { - width: 125px; -} - -#options .sub-ask-content input { - width: 125px; -} - -#options .sub-ask-bottom { - clear: both; - font-size: 0.9em; - float: right; - text-decoration: underline; -} - -#options .sub-ask-bottom:hover { - cursor: pointer; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/others.css b/sources/extend/addon/matrix/jappixmini/jappix/css/others.css deleted file mode 100644 index f3e2461f..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/others.css +++ /dev/null @@ -1,118 +0,0 @@ -/* - -Jappix - An open social platform -This is the others CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 31/08/11 - -*/ - -#audio { - display: none; -} - -#top-content { - position: absolute; - right: 5px; - left: 5px; - top: 0; - min-width: 860px; - z-index: 50; -} - -#main-content { - position: absolute; - top: 34px; - left: 5px; - right: 5px; - bottom: 5px; - min-width: 850px; - min-height: 450px; -} - -#left-content { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 248px; -} - -#right-content { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.85); - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 260px; - z-index: 10; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - box-shadow: 0 0 6px #5c5c5c; - -moz-box-shadow: 0 0 6px #5c5c5c; - -webkit-box-shadow: 0 0 6px #5c5c5c; -} - -#general-wait { - background: url(../img/others/blank.gif) repeat; - z-index: 10000; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; -} - -.general-wait-content { - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.9); - background-position: 8px 8px; - padding: 8px; - position: absolute; - right: 5px; - bottom: 5px; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - box-shadow: 0 0 2px #000; - -moz-box-shadow: 0 0 2px #000; - -webkit-box-shadow: 0 0 2px #000; -} - -.inbox-hidable, -.options-hidable, -.pep-hidable, -.pubsub-hidable, -.archives-hidable, -.commands-hidable, -.privacy-hidable, -.xmpplinks-hidable { - display: none; -} - -#reconnect .pane { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.85); - color: white; - padding: 25px; - z-index: 10000; - text-shadow: 0 1px 1px black; - position: absolute; - left: 0; - right: 0; - top: 0; - box-shadow: 0 0 35px #232323; - -moz-box-shadow: 0 0 35px #232323; - -webkit-box-shadow: 0 0 35px #232323; -} - -#reconnect .pane a { - margin-top: -4px; - float: right; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/pageengine.css b/sources/extend/addon/matrix/jappixmini/jappix/css/pageengine.css deleted file mode 100644 index 75038b6c..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/pageengine.css +++ /dev/null @@ -1,601 +0,0 @@ -/* - -Jappix - An open social platform -This is the page-engine CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 31/08/11 - -*/ - -#page-engine { - background-color: #f4f4f4; - position: absolute; - top: 40px; - bottom: 6px; - right: 6px; - left: 6px; - z-index: 8; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#page-engine .top { - background: #e8f1f3; - background: -moz-linear-gradient(top, #e8f1f3, #dee8ea); - background: -webkit-gradient(linear, left top, left bottom, from(#e8f1f3), to(#dee8ea)); - border-bottom: 1px solid #d0d0d0; - color: black; - position: absolute; - top: 0; - left: 0; - right: 0; - padding: 6px; - height: 80px; - border-top-right-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-topleft: 3px; - -webkit-border-top-right-radius: 3px; - -webkit-border-top-left-radius: 3px; -} - -#page-engine .top .avatar-container { - text-align: center; - margin: 2px 0 0 10px; - height: 76px; - width: 76px; - float: left; -} - -#page-engine .top .avatar { - max-height: 76px; - max-width: 76px; -} - -#page-engine .top .name { - text-align: right; - padding: 7px; -} - -#page-engine p.bc-name { - font-size: 2.3em; - margin-bottom: 5px; -} - -#page-engine p.bc-infos { - font-size: 0.85em; - height: 16px; - overflow: hidden; - position: absolute; - left: 115px; - right: 12px; -} - -#page-engine .page-engine-chan[data-type=groupchat] p.bc-infos { - left: 12px; -} - -#page-engine p.bc-infos span.show { - padding-left: 18px; -} - -#page-engine p.bc-infos a { - text-decoration: underline; -} - -#page-engine div.bc-pep { - float: right; -} - -#page-engine div.bc-pep a { - height: 16px; - width: 16px; - margin-left: 4px; - float: left; -} - -#page-engine div.bc-pep a:hover { - cursor: default; -} - -#page-engine div.bc-pep a[href]:hover { - cursor: pointer; -} - -#page-engine .content, -#page-engine .list { - font-size: 0.9em; - position: absolute; - top: 93px; - right: 0; - bottom: 29px; - overflow: auto; - box-shadow: inset 0 3px 10px #e8e8e8; - -moz-box-shadow: inset 0 3px 10px #e8e8e8; - -webkit-box-shadow: inset 0 3px 10px #e8e8e8; -} - -#page-engine .content { - left: 0; - padding: 12px 14px 0; -} - -#page-engine .content a { - text-decoration: underline; -} - -#page-engine .page-engine-chan { - display: none; -} - -#page-engine .chat .content, -#page-engine .chat .list { - bottom: 93px; -} - -#page-engine .chat .content { - padding-bottom: 24px; -} - -#page-engine .groupchat-content { - padding-bottom: 16px !important; - right: 191px !important; -} - -#page-engine .list { - border-left: 1px solid #c8c8c8; - padding: 8px 0 0; - width: 190px; - right: 0; -} - -#page-engine .list .role { - display: none; - margin-bottom: 10px; -} - -#page-engine .list .title { - font-weight: bold; - color: #383838; - margin-left: 8px; -} - -#page-engine .list .user { - background: #eff2f2; - background: -moz-linear-gradient(top, #eff2f2, #ecefef); - background: -webkit-gradient(linear, left top, left bottom, from(#eff2f2), to(#ecefef)); - border-color: #c8c8c8; - border-width: 1px 0; - border-style: solid; - color: #383838; - margin-bottom: 3px; - height: 32px; - overflow: hidden; -} - -#page-engine .list .user:hover { - background: #e9ecec; - cursor: pointer; -} - -#page-engine .list .user:active { - background: #e3e7e7; -} - -#page-engine .list .user.myself { - background-color: #eff2f2; - cursor: default; -} - -#page-engine .list .user .name { - float: left; - height: 18px; - overflow: hidden; - margin: 7px 0 7px 3px; - padding-left: 18px; -} - -#page-engine .list .user .avatar-container { - text-align: center; - float: right; - height: 32px; - width: 32px; -} - -#page-engine .list .user .avatar { - max-height: 32px; - max-width: 32px; -} - -#page-engine .one-group, -#archives .one-group { - border-bottom: 1px dotted #d0d0d0; - padding-bottom: 8px; - margin-bottom: 10px; -} - -#page-engine .one-line, -#archives .one-line, -#page-engine .one-group b.name, -#archives .one-group b.name { - padding-left: 50px; - word-wrap: break-word; -} - -#page-engine .one-group b.name, -#archives .one-group b.name { - display: block; - margin-bottom: 4px; -} - -#page-engine .one-group b.name.me, -#archives .one-group b.name.me { - color: #123a5c; -} - -#page-engine .one-group b.name.him, -#archives .one-group b.name.him { - color: #801e1e; -} - -#page-engine .one-group span.date, -#archives .one-group span.date { - float: right; - font-size: 0.9em; -} - -#page-engine .one-group .avatar-container, -#archives .one-group .avatar-container { - text-align: center; - margin: 4px 0 0 6px; - height: 30px; - width: 30px; - float: left; -} - -#page-engine .one-group .avatar, -#archives .one-group .avatar { - max-height: 30px; - max-width: 30px; -} - -#page-engine b.name.talk-images { - background-position: 50px -99px; - padding-left: 68px; -} - -#page-engine .user-message, -#archives .user-message { - margin-bottom: 3px; -} - -#page-engine .system-message { - color: #053805 !important; - margin-bottom: 3px !important; - padding-left: 0 !important; -} - -#page-engine .system-message a { - color: #053805 !important; -} - -#page-engine .system-message p.help b { - margin-bottom: 5px; - text-decoration: underline; - display: block; -} - -#page-engine .system-message p.help em { - width: 240px; - text-decoration: underline; - margin-left: 5px; - float: left; -} - -#page-engine .my-nick { - font-weight: bold; -} - -#page-engine .old-message { - font-size: 11px !important; - margin-bottom: 1px !important; -} - -#page-engine .chatstate { - background-color: rgb(234,234,234); - background-color: rgba(234,234,234,0.8); - color: #2c2c2c; - padding: 3px 10px 2px 8px; - position: absolute; - bottom: 93px; - left: 0; - font-size: 0.75em; - border-top-right-radius: 3px; - -moz-border-radius-topright: 3px; - -webkit-border-top-right-radius: 3px; -} - -#page-engine .text { - height: 93px; - position: absolute; - bottom: 0; - left: 0; - right: 0; -} - -#page-engine .footer { - background: #e8f1f3; - background: -moz-linear-gradient(top, #dee8ea, #e8f1f3); - background: -webkit-gradient(linear, left top, left bottom, from(#dee8ea), to(#e8f1f3)); - border-color: #d0d0d0; - border-width: 1px 0 0; - border-style: solid; - color: black; - position: absolute; - left: 0; - right: 0; - padding: 6px; - height: 16px; -} - -#page-engine .chat .footer { - border-width: 1px 0; - position: static; -} - -#page-engine .chat-tools-content { - height: 16px; - width: 16px; - margin-right: 8px; - float: left; -} - -#page-engine .tools-tooltip { - display: block; - height: 16px; - width: 16px; - overflow: hidden; - float: left; -} - -#page-engine .text .chat-tools-smileys { - margin-left: 4px; -} - -#page-engine .text .chat-tools-file { - display: none; -} - -#page-engine .text .chat-tools-file.mini .bubble-file { - z-index: 39; -} - -#page-engine .text .chat-tools-file.mini .tooltip-subitem { - width: 22px; - height: 20px; -} - -#page-engine .text .chat-tools-file.mini .wait { - margin: -2px 0 0 -1px; -} - -#page-engine .text .tools-smileys { - background-position: 0 -388px; -} - -#page-engine .text .tools-style { - background-position: 0 -700px; -} - -#page-engine .text .tools-file { - background-position: 0 -1956px; -} - -#page-engine .text .tools-save { - background-position: 0 -719px; -} - -#page-engine .text .tools-clear { - background-position: 0 -739px; -} - -#page-engine .text .tools-infos, -#channel .top div.shortcuts a.profile { - background-position: 0 -758px; -} - -#page-engine .text .tools-add, -#page-engine .text .tools-archives, -#page-engine .text .tools-mucadmin { - display: none; -} - -#page-engine .text .tools-mucadmin { - background-position: 0 -777px; -} - -#page-engine .bubble-style label.bold { - font-weight: bold; -} - -#page-engine .bubble-style label.italic { - font-style: italic; -} - -#page-engine .bubble-style label.underline { - text-decoration: underline; -} - -#page-engine .bubble-style a.color { - height: 18px; - width: 18px; - border-color: white; - border-width: 1px; - border-style: solid; - margin: 6px 5px 0 0; - float: left; - opacity: 0.6; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - box-shadow: 0 0 5px black; - -moz-box-shadow: 0 0 5px black; - -webkit-box-shadow: 0 0 5px black; -} - -#page-engine .bubble-style a.color:hover, -#page-engine .bubble-style a.color:focus { - opacity: 0.7; -} - -#page-engine .bubble-style a.color.selected { - opacity: 1; - border-color: #ffb20d; -} - -#page-engine .bubble-file .tooltip-subitem { - width: 240px; -} - -#page-engine .bubble-file input[type=file] { - width: 220px; -} - -#page-engine .bubble-file input[type=submit], -#page-engine .bubble-file input[type=reset] { - margin: 4px 4px 0 0; -} - -#page-engine .text .compose, -#page-engine .muc-ask { - position: absolute; - left: 0; -} - -#page-engine .text .compose { - top: 29px; - right: 12px; - bottom: 12px; -} - -#page-engine .muc-ask { - right: 0; - bottom: 0; -} - -#page-engine .text textarea { - border: 1px solid #c8c8c8; - padding: 5px; - height: 100%; - width: 100%; - font-size: 1.1em; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-top-right-radius: 0; - border-top-left-radius: 0; - -moz-border-radius-topright: 0; - -moz-border-radius-topleft: 0; - -webkit-border-top-right-radius: 0; - -webkit-border-top-left-radius: 0; -} - -#page-engine .muc-ask { - background-color: #e8f1f3; - height: 64px; - font-size: 0.9em; - right: 0; - z-index: 2; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-bottomright: 3px; - -webkit-border-bottom-left-radius: 3px; - -webkit-border-bottom-right-radius: 3px; -} - -#page-engine .muc-ask label { - color: #224249; - margin: 23px 10px 0 16px; - font-weight: bold; -} - -#page-engine .muc-ask input { - width: 200px; - margin: 19px 10px 0 10px; - padding: 3px; -} - -#page-engine .tooltip { - position: absolute; - bottom: 84px; - margin-left: -13px; - z-index: 40; - font-size: 0.8em; - color: white; -} - -#page-engine .tooltip a { - color: white; - text-decoration: underline; -} - -#page-engine .tooltip-subitem { - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.8); - padding: 10px; - width: 200px; - height: 110px; - text-shadow: 0 1px 1px black; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} - -#page-engine .tooltip-subarrow { - background-position: 0 -251px; - opacity: 0.8; - height: 10px; - width: 18px; - margin-left: 12px; -} - -#page-engine .tooltip .tooltip-top { - margin-bottom: 8px; - font-weight: bold; -} - -#page-engine .tooltip label { - margin-bottom: 4px; - float: left; - clear: both; -} - -#page-engine .tooltip label input[type=checkbox] { - margin: 0 6px 0 0; - float: left; -} - -#page-engine .tooltip label.select { - margin-top: 5px; -} - -#page-engine .tooltip input, -#page-engine .tooltip select { - float: left; -} - -#page-engine .tooltip select { - width: 100px; -} - -#page-engine .tooltip .tooltip-actionlog:hover, -#page-engine .tooltip .tooltip-actionlog:focus { - cursor: pointer; - text-decoration: underline; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/pageswitch.css b/sources/extend/addon/matrix/jappixmini/jappix/css/pageswitch.css deleted file mode 100644 index 59830049..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/pageswitch.css +++ /dev/null @@ -1,209 +0,0 @@ -/* - -Jappix - An open social platform -This is the page-switch CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 22/05/11 - -*/ - -#page-switch { - position: absolute; - top: 15px; - left: 10px; - right: 10px; - z-index: 9; -} - -#page-switch .chans { - position: absolute; - left: 0; - right: 40px; - top: 0; - height: 25px; - overflow: hidden; -} - -#page-switch .more { - position: absolute; - right: 0; - top: 0; -} - -#page-switch .more-button { - background-position: 6px -1372px; - background-color: #d9e7ea; - width: 7px; - height: 17px; - padding: 1px 6px; - font-size: 0.9em; - text-decoration: none; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -#page-switch .more-content { - background-color: #d9e7ea; - width: 200px; - max-height: 400px; - overflow: auto; - position: absolute; - margin: -2px 0 0 -181px; - padding: 4px 0; - font-size: 0.95em; - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-topleft: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-bottomright: 3px; - -webkit-border-top-left-radius: 3px; - -webkit-border-bottom-left-radius: 3px; - -webkit-border-bottom-right-radius: 3px; -} - -#page-switch .switcher { - background-color: #d9e7ea; - color: #17353b; - height: 15px; - padding: 5px 10px 5px 5px; - margin: 0 2px; - font-size: 0.85em; - float: left; - border-top-right-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-topleft: 3px; - -webkit-border-top-right-radius: 3px; - -webkit-border-top-left-radius: 3px; -} - -#page-switch .more-content .switcher { - background-color: #d9e7ea; - float: none; - margin: 0; - font-size: 0.9em; - border-radius: 0; - -moz-border-radius: 0; - -webkit-border-radius: 0; -} - -#page-switch .more-content .switcher .exit { - display: block; -} - -#page-switch .more-button:hover, -#page-switch .more-button:focus, -#page-switch .switcher:hover, -#page-switch .switcher:focus, -#page-switch .more-content .switcher:hover, -#page-switch .more-content .switcher:focus { - background-color: #cedee1; - cursor: pointer; -} - -#page-switch .more-button:active, -#page-switch .switcher:active, -#page-switch .more-content .switcher:active { - background-color: #c3d3d7; -} - -#page-switch .switcher.activechan { - background-color: #e8f1f3; -} - -#page-switch .more-content .switcher.activechan { - background-color: #d1e0e3; -} - -#page-switch .icon { - height: 16px; - width: 16px; - float: left; -} - -#page-switch .name { - float: left; - margin-left: 4px; - max-height: 16px; - max-width: 140px; - overflow: hidden; -} - -#page-switch .exit { - display: none; - background-color: #bdd9dc; - border: 1px solid #80aab0; - color: #355e64; - height: 14px; - width: 13px; - margin-left: 10px; - font-size: 0.85em; - text-align: center; - text-decoration: none; - float: right; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -#page-switch .exit:hover, -#page-switch .exit:focus { - background-color: #aac7cb; -} - -#page-switch .exit:active { - background-color: #9bbdc1; -} - -#page-switch .activechan .exit { - display: block; - float: right; -} - -#page-switch .chan-newmessage { - background-color: #f6edc3 !important; -} - -#page-switch .chan-newmessage:hover, -#page-switch .chan-newmessage:focus { - background-color: #f1eac0 !important; -} - -#page-switch .chan-newmessage:active { - background-color: #ede4b8 !important; -} - -#page-switch .composing, -#page-engine .list .user.composing { - color: #217021 !important; -} - -#page-switch .paused, -#page-switch .chan-unread .name, -#page-engine .list .user.paused { - color: #2431ac !important; -} - -#page-switch .active, -#page-engine .list .user.active { - color: #353535 !important; -} - -#page-switch .inactive, -#page-engine .list .user.inactive { - color: #585858 !important; -} - -#page-switch .gone { - color: #851313 !important; -} - -#page-switch .channel .icon { - background-position: 0 -55px; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/popup.css b/sources/extend/addon/matrix/jappixmini/jappix/css/popup.css deleted file mode 100644 index e5b3eb92..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/popup.css +++ /dev/null @@ -1,612 +0,0 @@ -/* - -Jappix - An open social platform -This is the popup CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 02/05/11 - -*/ - -.lock { - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.6); - left: 0; - right: 0; - top: 0; - bottom: 0; - position: fixed; - z-index: 9999; -} - -.popup { - background-color: rgb(20,20,20); - background-color: rgba(20,20,20,0.95); - margin-top: -250px; - margin-left: -330px; - width: 640px; - height: 500px; - padding: 0 10px; - position: absolute; - z-index: 10000; - left: 50%; - top: 50%; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - box-shadow: 0 0 35px #232323; - -moz-box-shadow: 0 0 35px #232323; - -webkit-box-shadow: 0 0 35px #232323; -} - -.popup.large { - margin-left: -460px; - width: 920px; -} - -.popup .top { - width: 600px; - height: 45px; - font-size: 1.2em; - padding-top: 9px; - color: white; - margin: 14px 0 0 40px; - text-transform: uppercase; - text-decoration: none; - font-weight: bold; - text-shadow: 0 2px 2px black; -} - -.popup .tab { - width: 620px; - height: 25px; - margin: -5px 10px 0 10px; - position: relative; - z-index: 1; -} - -.popup .tab a { - background-color: #d9e7ea; - color: #204249; - width: 180px; - height: 17px; - padding: 4px 4px 4px 16px; - margin-left: 5px; - font-size: 0.94em; - overflow: hidden; - float: left; - border-top-right-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-topleft: 3px; - -webkit-border-top-right-radius: 3px; - -webkit-border-top-left-radius: 3px; -} - -.popup .tab a:hover, -.popup .tab a:focus { - background-color: #cedee1; - text-decoration: none; -} - -.popup .tab a:active { - background-color: #c3d3d7; - text-decoration: none; -} - -.popup .tab a.tab-active { - background-color: #e4eef9 !important; -} - -.popup .one-lap { - display: none; -} - -.popup .one-lap.lap-active { - display: block; -} - -.popup .content { - background: #e4eef9; - background: -moz-linear-gradient(top, #e4eef9, #D0E5FA); - background: -webkit-gradient(linear, left top, left bottom, from(#e4eef9), to(#D0E5FA)); - height: 358px; - width: 640px; - position: absolute; - left: 10px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - box-shadow: 0 0 20px black; - -moz-box-shadow: 0 0 20px black; - -webkit-box-shadow: 0 0 20px black; -} - -.popup .content, -.popup .content a { - color: #112a2f; -} - -.popup.large div.comments { - background-color: #f4f4f4; - width: 272px; - margin: 0; - position: absolute; - right: 10px; - top: 63px; - bottom: 10px; - overflow-x: hidden; - overflow-y: auto; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -.popup.large div.comments div.comments-content { - font-size: 0.8em; -} - -.popup.large div.comments input { - width: 185px; - min-width: 0; -} - -.popup.large div.comments .one-comment { - padding-bottom: 4px; -} - -.popup.large div.comments .one-comment a { - text-decoration: underline; -} - -.popup.large div.comments div.comments-content { - border-top-right-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-topleft: 3px; - -webkit-border-top-right-radius: 3px; - -webkit-border-top-left-radius: 3px; -} - -.popup .head { - background: #f1f6fd; - border: 1px #9dc4fc solid; - width: 606px; - height: 24px; - margin: 0 10px 10px 10px; - padding: 6px; -} - -.popup .head-text { - float: left; - font-size: 0.9em; - margin: 3px; -} - -.popup .head-actions { - float: right; - margin-top: 2px; -} - -.popup .head-actions a { - font-size: 0.9em; - margin: 0 4px; -} - -.popup .actions a { - color: #30575f; - font-size: 0.9em; - margin-left: 5px; -} - -.popup .head .head-input { - float: right; - width: 200px; - padding: 2px; -} - -.popup .head .head-select { - float: right; - height: 24px; -} - -.popup .forms { - width: 390px; - height: 328px; - margin: 15px; - float: left; -} - -.popup fieldset { - border: 1px #547177 solid; - margin: 0 0 15px 0; - padding: 8px 2px 3px 2px; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -.popup legend { - font-size: 0.9em; - margin: 0 0 0 15px; - padding: 0 2px; - text-transform: uppercase; -} - -.popup label { - color: #1b1b1b; - width: 150px; - margin: 0 0 10px 12px; - clear: both; - float: left; -} - -.popup input, -.popup select { - margin: 0 10px 10px 0; - float: left; -} - -.popup input[type=text] { - min-width: 174px; -} - -.popup select { - min-height: 20px; -} - -.popup .results { - height: 310px; - width: 620px; - margin: -5px 0 0 10px; - padding: 6px 0 0 0; - overflow: auto; -} - -.popup .results .no-results { - margin: 6px 0; - font-size: 0.85em; - font-weight: bold; -} - -.popup .results label { - width: 180px; - margin: 6px 4px 4px 4px; -} - -.popup .results input, -.popup .results textarea, -.popup .results select { - margin: 4px; -} - -.popup .results input, -.popup .results select { - min-width: 180px; -} - -.popup .results input[type=checkbox], -.popup .results input[type=radio] { - margin-top: 7px; -} - -.popup .results textarea { - width: 380px; -} - -.popup .results .avatar-container { - float: left; - width: 60px; - height: 60px; - margin: 5px 12px 5px 9px; - text-align: center; - background-repeat: no-repeat; -} - -.popup .results img.avatar { - max-width: 60px; - max-height: 60px; -} - -.popup .results .one-icon { - height: 16px; - width: 16px; - margin: 10px 3px 0 8px; - float: left; -} - -.popup .results .one-icon.account, -.popup .results .one-icon.auth { - background-position: 0 -777px; -} - -.popup .results .one-icon.automation, -.popup .results .one-icon.client { - background-position: 0 -1500px; -} - -.popup .results .one-icon.collaboration { - background-position: 0 -1520px; -} - -.popup .results .one-icon.proxy, -.popup .results .one-icon.server, -.popup .results .one-icon.others { - background-position: 0 -1540px; -} - -.popup .results .one-icon.component, -.popup .results .one-icon.gateway { - background-position: 0 -1560px; -} - -.popup .results .one-icon.conference { - background-position: 0 -1082px; -} - -.popup .results .one-icon.directory { - background-position: 0 -876px; -} - -.popup .results .one-icon.headline, -.popup .results .one-icon.hierarchy { - background-position: 0 -1580px; -} - -.popup .results .one-icon.pubsub, -.popup .results .one-icon.store { - background-position: 0 -1600px; -} - -.popup .results .one-icon.loading { - background-position: 0 -1620px; -} - -.popup .results .one-icon.down { - background-position: 0 -1640px; -} - -.popup .results .one-host { - font-weight: bold; - width: 170px; -} - -.popup .results .one-type { - width: 210px; -} - -.popup .results .one-type, -.popup .results .one-host { - float: left; - overflow: hidden; - margin: 9px 8px; -} - -.popup .results .one-jid, -.popup .results .one-ctry, -.popup .results .one-fn { - margin: 4px; - width: 400px; -} - -.popup .results .one-fn { - font-weight: bold; -} - -.popup .results .one-jid { - margin-top: 8px; - font-size: 0.9em; -} - -.popup .results .one-name { - float: left; - margin: 4px; -} - -.popup a.one-button { - display: none; - background-color: #f1f6fd; - border: 1px solid #b9cbcf; - margin-top: 1px; - padding: 4px 8px; - text-decoration: none; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -.popup a.one-button:hover, -.popup a.one-button:focus { - border: 1px solid #95b1b7; -} - -.popup a.one-button:active { - border: 1px solid #77989f; -} - -.popup .results .oneresult:hover a.one-button { - display: block; -} - -.popup .results a.one-button, -#inbox .one-message a.one-button { - float: right; - padding: 3px 6px; - margin-right: 4px; -} - -.popup .results a.one-vjud { - position: absolute; - right: 4px; -} - -.popup .results a.one-add { - top: 8px; -} - -.popup .results a.one-chat { - top: 42px; -} - -.popup .results .one-next { - float: right; - margin: 4px 8px 4px 4px; - font-weight: bold; -} - -.popup .results .one-actions { - width: 148px; - margin: 4px; - float: left; -} - -.popup .results .one-actions a { - width: 16px; - height: 16px; - padding: 2px 2px 4px 5px !important; - margin-top: 2px; -} - -.popup .results .one-actions a.browse { - background-position: 3px -1396px; -} - -.popup .results .one-actions a.command { - background-position: 3px -1415px; -} - -.popup .results .one-actions a.subscribe { - background-position: 4px -1435px; -} - -.popup .results .one-actions a.join { - background-position: 3px -1455px; -} - -.popup .results .one-actions a.search { - background-position: 4px -1475px; -} - -.popup .results a.submit, -.popup .results a.cancel, -.popup .results a.back { - margin-right: 8px; - float: right; -} - -.popup .onetitle { - font-size: 0.9em; - padding: 4px; - font-weight: bold; -} - -.popup .oneinstructions { - font-size: 0.9em; - padding: 4px; - margin: 8px 0; -} - -.popup .oneresult { - font-size: 0.9em; - padding: 3px 0 4px 4px; - border-bottom: 1px #9dc4fc solid; - overflow: hidden; - position: relative; -} - -.popup .oneresult:hover { - background: #e9f1fd; -} - -.popup .oneresult[onclick]:hover { - cursor: pointer; -} - -.popup .oneresult[onclick]:active { - background: #f1f6fd; -} - -.popup .infos { - background-color: rgb(255,239,104); - background-color: rgba(255,239,104,0.8); - border: 1px #decb2f solid; - color: #3f3f3f; - padding: 8px; - margin: 10px; - font-size: 0.8em; -} - -.popup .infos p { - margin-top: 10px; -} - -.popup .infos p.infos-title { - font-weight: bold; -} - -.popup .bottom { - width: 640px; - height: 40px; - position: absolute; - bottom: 8px; -} - -.popup .wait { - display: none; - margin: 8px 0 0 3px; - float: left; -} - -a.finish { - border: 1px solid white; - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.1); - color: white; - padding: 4px 8px; - margin-right: 7px; - font-size: 0.95em; - text-align: center; - text-decoration: none; - text-shadow: 0 1px 1px black; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - box-shadow: 0 0 5px black; - -moz-box-shadow: 0 0 5px black; - -webkit-box-shadow: 0 0 5px black; -} - -a.finish:hover, -a.finish:focus { - cursor: pointer; - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.2); - box-shadow: 0 0 15px black; - -moz-box-shadow: 0 0 15px black; - -webkit-box-shadow: 0 0 15px black; -} - -a.finish:active { - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.3); -} - -a.finish.disabled { - opacity: 0.2; -} - -a.finish.disabled:hover, -a.finish.disabled:focus, -a.finish.disabled:active { - cursor: default; - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.1); -} - -.popup a.finish { - margin-top: 6px; - float: right; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/privacy.css b/sources/extend/addon/matrix/jappixmini/jappix/css/privacy.css deleted file mode 100644 index 521be322..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/privacy.css +++ /dev/null @@ -1,197 +0,0 @@ -/* - -Jappix - An open social platform -This is the privacy CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 16/02/11 - -*/ - -#privacy .content { - padding: 10px 0 10px 0; -} - -#privacy .privacy-head div.list-left, -#privacy .privacy-head div.list-center, -#privacy .privacy-head div.list-right, -#privacy .privacy-first { - float: left; -} - -#privacy .privacy-head div.list-left { - margin-left: 5px; -} - -#privacy .privacy-head div.list-center { - border-right: 1px dotted #1b393f; - height: 24px; - width: 1px; - margin-right: 15px; - padding-left: 18px; -} - -#privacy .privacy-head span, -#privacy .privacy-head a, -#privacy .privacy-item span, -#privacy .privacy-item a { - float: left; -} - -#privacy .privacy-head span { - font-size: 0.9em; - font-weight: bold; - margin: 3px 10px 0 0; -} - -#privacy .privacy-head input, -#privacy .privacy-head select { - width: 180px; -} - -#privacy .privacy-head input { - margin-top: 1px; -} - -#privacy .privacy-head select, -#privacy .privacy-item select { - margin-top: -2px; -} - -#privacy .privacy-head span.left-space { - margin-left: 16px; -} - -#privacy .privacy-head a, -#privacy .privacy-item a { - width: 20px; - height: 20px; - padding: 0; - display: block; -} - -#privacy .privacy-item a.item-add { - background-position: 2px -1178px; -} - -#privacy .privacy-head a.list-remove, -#privacy .privacy-item a.item-remove { - background-position: 2px -1197px; -} - -#privacy .privacy-item a.item-save { - background-position: 3px -126px; - width: auto; - height: 19px; - padding: 1px 7px 0 21px; -} - -#privacy .privacy-item, -#privacy form, -#privacy .privacy-active { - clear: both; -} - -#privacy .privacy-item { - margin: 17px 12px; - font-size: 0.9em; -} - -#privacy .privacy-item span { - font-weight: bold; -} - -#privacy .privacy-item select { - width: 300px; - margin: -4px 30px 0 10px; -} - -#privacy .privacy-item a { - margin: -2px 6px 0 0; -} - -#privacy .privacy-first, -#privacy .privacy-second, -#privacy .privacy-third { - height: 195px; - font-size: 0.9em; - margin: 10px 0 0 10px; - float: left; -} - -#privacy .privacy-first, -#privacy .privacy-second { - border-right: 1px dotted #1b393f; - padding-right: 14px; -} - -#privacy .privacy-first { - width: 125px; -} - -#privacy .privacy-first label { - margin: 50px 0 0 15px; -} - -#privacy .privacy-first label input { - margin-top: 2px; -} - -#privacy .privacy-second { - width: 205px; -} - -#privacy .privacy-second label { - margin: 2px 0 0 12px; -} - -#privacy .privacy-second input[type=radio], -#privacy .privacy-third input[type=checkbox] { - margin-top: 2px; - margin-bottom: 2px; -} - -#privacy .privacy-second input[type=text], -#privacy .privacy-second select { - width: 170px; - margin: 2px 0 11px 12px; - float: none; -} - -#privacy .privacy-third label { - width: auto; - margin-top: 11px; -} - -#privacy .privacy-third { - width: 240px; -} - -#privacy .privacy-active { - margin: 34px 16px 0 16px; - font-size: 0.9em; -} - -#privacy .privacy-active-elements { - float: right; -} - -#privacy .privacy-active input[type=text] { - width: 30px; - margin: 0 0 0 8px; - float: none; -} - -#privacy .privacy-active input[type=checkbox] { - margin: 2px 8px 0 0; - float: left; -} - -#privacy .privacy-active label { - width: auto; - margin: 0 15px 0 0; - clear: none; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/rosterx.css b/sources/extend/addon/matrix/jappixmini/jappix/css/rosterx.css deleted file mode 100644 index 4f159ac8..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/rosterx.css +++ /dev/null @@ -1,53 +0,0 @@ -/* - -Jappix - An open social platform -This is the Roster Item Exchange tool CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 05/02/11 - -*/ - -#rosterx .content { - padding: 10px 0 10px 0; -} - -#rosterx .rosterx-head a { - font-size: 0.9em; - margin: 3px 4px; - float: left; -} - -#rosterx .oneresult:hover { - cursor: pointer; -} - -#rosterx .oneresult span { - margin: 2px 5px 0 5px; - overflow: hidden; - float: left; -} - -#rosterx .oneresult span.name { - width: 230px; - font-weight: bold; -} - -#rosterx .oneresult span.xid { - width: 270px; - font-size: 0.9em; -} - -#rosterx .oneresult span.action { - width: 16px; - height: 16px; - margin-top: 4px; - float: right; -} - -#rosterx .oneresult span.action.modify { - background-position: 0 -1244px; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/search.css b/sources/extend/addon/matrix/jappixmini/jappix/css/search.css deleted file mode 100644 index 505b17d9..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/search.css +++ /dev/null @@ -1,60 +0,0 @@ -/* - -Jappix - An open social platform -This is the search tool CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 23/01/11 - -*/ - -.search { - position: relative; -} - -.search input.suggested { - border-bottom: 1px solid white; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomright: 0; - -moz-border-radius-bottomleft: 0; - -webkit-border-bottom-right-radius: 0; - -webkit-border-bottom-left-radius: 0; -} - -.search ul { - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.9); - border-color: #e1a014; - border-style: solid; - border-width: 0 1px 1px 1px; - position: absolute; - z-index: 1; - padding: 3px 0; - list-style: none; - overflow: auto; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; - -moz-border-radius-bottomright: 3px; - -moz-border-radius-bottomleft: 3px; - -webkit-border-bottom-right-radius: 3px; - -webkit-border-bottom-left-radius: 3px; -} - -.search ul li { - padding: 2px 6px; - color: #3d3d3d; - text-shadow: none; -} - -.search ul li:hover { - cursor: pointer; -} - -.search ul li.hovered { - background-color: rgb(225,160,20); - background-color: rgba(225,160,20,0.3); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/smileys.css b/sources/extend/addon/matrix/jappixmini/jappix/css/smileys.css deleted file mode 100644 index faad478b..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/smileys.css +++ /dev/null @@ -1,196 +0,0 @@ -/* - -Jappix - An open social platform -This is the smileys CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 16/02/11 - -*/ - -.emoticon { - width: 16px; - height: 16px; -} - -a.emoticon { - margin: 2px; - float: left; -} - -a.emoticon:hover, -a.emoticon:focus { - opacity: 0.8; -} - -a.emoticon:active { - opacity: 0.7; -} - -img.emoticon { - border: 0 none; - vertical-align: bottom; -} - -.emoticon-biggrin { - background-position: 0 0; -} - -.emoticon-devil { - background-position: -16px 0; -} - -.emoticon-coolglasses { - background-position: -32px 0; -} - -.emoticon-tongue { - background-position: -48px 0; -} - -.emoticon-smile { - background-position: -64px 0; -} - -.emoticon-wink { - background-position: -80px 0; -} - -.emoticon-blush { - background-position: -96px 0; -} - -.emoticon-stare { - background-position: -112px 0; -} - -.emoticon-frowning { - background-position: -128px 0; -} - -.emoticon-oh { - background-position: -144px 0; -} - -.emoticon-unhappy { - background-position: -160px 0; -} - -.emoticon-cry { - background-position: -176px 0; -} - -.emoticon-angry { - background-position: -192px 0; -} - -.emoticon-puke { - background-position: -208px 0; -} - -.emoticon-hugright { - background-position: -224px 0; -} - -.emoticon-hugleft { - background-position: -240px 0; -} - -.emoticon-lion { - background-position: -256px 0; -} - -.emoticon-pussy { - background-position: -272px 0; -} - -.emoticon-bat { - background-position: -288px 0; -} - -.emoticon-kiss { - background-position: -304px 0; -} - -.emoticon-heart { - background-position: -320px 0; -} - -.emoticon-brheart { - background-position: -336px 0; -} - -.emoticon-flower { - background-position: -352px 0; -} - -.emoticon-brflower { - background-position: -368px 0; -} - -.emoticon-thumbup { - background-position: -384px 0; -} - -.emoticon-thumbdown { - background-position: -400px 0; -} - -.emoticon-lamp { - background-position: -416px 0; -} - -.emoticon-coffee { - background-position: -432px 0; -} - -.emoticon-drink { - background-position: -448px 0; -} - -.emoticon-beer { - background-position: -464px 0; -} - -.emoticon-boy { - background-position: -480px 0; -} - -.emoticon-girl { - background-position: -496px 0; -} - -.emoticon-phone { - background-position: -512px 0; -} - -.emoticon-photo { - background-position: -528px 0; -} - -.emoticon-music { - background-position: -544px 0; -} - -.emoticon-cuffs { - background-position: -560px 0; -} - -.emoticon-mail { - background-position: -576px 0; -} - -.emoticon-rainbow { - background-position: -592px 0; -} - -.emoticon-star { - background-position: -608px 0; -} - -.emoticon-moon { - background-position: -624px 0; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/stats-svg.css b/sources/extend/addon/matrix/jappixmini/jappix/css/stats-svg.css deleted file mode 100644 index f512a939..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/stats-svg.css +++ /dev/null @@ -1,71 +0,0 @@ -/* - -Jappix - An open social platform -This is the SVG stats CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Erwan Briand, Vanaryon -Last revision: 20/11/10 - -*/ - -svg { - background-color: #e8f1f3; -} - -.refline { - stroke: #596171; - stroke-width: 2px; -} - -.refleft { - fill: #000000; - font-family: "Inconsolata", "DejaVu Serif sans", Verdana, sans-serif; - font-size: 8px; -} - -.reftext { - fill: #586070; - font-family: "Inconsolata", "DejaVu Serif sans", Verdana, sans-serif; - font-size: 10px; -} - -.bubbletextblue, -.bubbletextred { - fill: none; - font-family: "Inconsolata", "DejaVu Serif sans", Verdana, sans-serif; - font-size: 8px; - text-anchor: end; -} - -.bluebar { - fill: "#6C84C0"; - fill-opacity: "0.6"; -} - -.gbar:hover .bluebar { - fill: #2A3F73; -} - -.gbar:hover .redbar { - fill: #C70705; -} - -.gbar:hover #bubble { - fill: white; - stroke: grey; -} - -.gbar:hover .bubbletextblue { - fill: #2A3F73; -} - -.gbar:hover .bubbletextred { - fill: #C70705; -} - -.gbar:hover .reftext { - fill: #000000; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/tools.css b/sources/extend/addon/matrix/jappixmini/jappix/css/tools.css deleted file mode 100644 index 8b689f54..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/tools.css +++ /dev/null @@ -1,346 +0,0 @@ -/* - -Jappix - An open social platform -This is the tools CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 27/08/11 - -*/ - -#top-content .tools { - background-color: rgb(232,241,243); - background-color: rgba(232,241,243,0.6); - padding: 3px 8px 5px 8px; - min-width: 10px; - height: 17px; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; -} - -#top-content .tools a { - color: black; - padding: 0 3px; - margin: 0 1.5px; -} - -#top-content .tools a:hover, -#top-content .tools a:focus { - cursor: pointer; - text-decoration: underline; -} - -#top-content .tools-logo { - background-position: 9px 2px; - width: 74px; - float: left; -} - -#top-content .tools-all { - float: right; - text-align: right; - margin-left: 8px; - font-size: 0.9em; - color: black; -} - -#top-content .notifications { - background-position: 7px -1264px; -} - -#top-content .music { - background-position: 6px -1286px; -} - -#top-content .notifications:hover, -#top-content .music:hover { - cursor: pointer; -} - -#top-content .music:hover, -#top-content .notifications:hover, -#top-content .music:focus, -#top-content .notifications:focus { - background-color: rgb(232,241,243); - background-color: rgba(232,241,243,0.7); -} - -#top-content .music:active, -#top-content .notifications:active { - background-color: rgb(232,241,243); - background-color: rgba(232,241,243,0.8); -} - -#top-content .actived, -#top-content .actived:hover, -#top-content .actived:focus, -#top-content .actived:active { - background-color: rgb(232,241,243) !important; - background-color: rgba(232,241,243,0.9) !important; -} - -#top-content .notify { - background-color: #c60505; - color: white; - font-size: 0.7em; - font-weight: bold; - margin-left: -10px; - padding: 1px 4px; - position: absolute; - bottom: -2px; - border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; -} - -#top-content .tools-content { - display: none; - position: absolute; - top: 25px; - margin-left: -8px; -} - -.tools-content-subarrow { - background-position: 0 -241px; - opacity: 0.8; - height: 10px; - width: 18px; - margin-left: 12px; -} - -.tools-content-subitem { - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.8); - padding: 14px 6px 6px 6px; - border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} - -.notifications-content { - width: 240px; -} - -.notifications-content .tools-content-subitem { - max-height: 250px; - color: white; - text-shadow: 0 1px 1px black; - text-align: left; - overflow-x: none; - overflow-y: auto; -} - -.notifications-content .empty { - color: white; - font-size: 0.9em; - text-decoration: underline; - margin: -8px 4px 2px 0; - display: none; - float: right; -} - -.notifications-content .nothing { - font-size: 0.9em; - margin: 5px; -} - -.notifications-content .one-notification { - padding: 6px 4px; - font-size: 0.85em; - clear: both; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -.notifications-content .one-notification:hover, -.notifications-content .one-notification:focus { - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.1); -} - -.notifications-content .one-notification:active { - background-color: rgb(255,255,255); - background-color: rgba(255,255,255,0.2); -} - -.notifications-content .avatar-container { - float: left; - width: 40px; - height: 40px; - margin: 0 8px 8px 0; - text-align: center; - background-repeat: no-repeat; -} - -.notifications-content .avatar { - max-width: 40px; - max-height: 40px; -} - -.notifications-content .notification-text, -.notifications-content .notification-actions { - margin-left: 48px; - overflow: hidden; -} - -.notifications-content .notification-actions { - margin-top: 3px; -} - -.notifications-content .notification-actions a { - color: white; - font-weight: bold; - font-size: 0.9em; - text-decoration: underline; - margin-right: 8px; -} - -.notifications-content .one-notification .notification-actions span.talk-images { - background-position: 0 -1828px; - width: 16px; - height: 16px; - margin: -1px 6px 0 0; - float: left; -} - -.notifications-content .one-notification[data-type=subscribe] .notification-actions span.talk-images { - background-position: 0 -1796px; -} - -.notifications-content .one-notification[data-type=invite_room] .notification-actions span.talk-images { - background-position: 0 -1812px; -} - -.notifications-content .one-notification[data-type=send] .notification-actions span.talk-images, -.notifications-content .one-notification[data-type=send_accept] .notification-actions span.talk-images, -.notifications-content .one-notification[data-type=send_reject] .notification-actions span.talk-images, -.notifications-content .one-notification[data-type=send_fail] .notification-actions span.talk-images { - background-position: 0 -1956px; -} - -.notifications-content .one-notification[data-type=rosterx] .notification-actions span.talk-images { - background-position: 0 -1844px; -} - -.notifications-content .one-notification[data-type=comment] .notification-actions span.talk-images { - background-position: 0 -1860px; -} - -.notifications-content .one-notification[data-type=like] .notification-actions span.talk-images { - background-position: 0 -1876px; -} - -.notifications-content .one-notification[data-type=quote] .notification-actions span.talk-images { - background-position: 0 -1892px; -} - -.notifications-content .one-notification[data-type=wall] .notification-actions span.talk-images { - background-position: 0 -1908px; -} - -.notifications-content .one-notification[data-type=photo] .notification-actions span.talk-images { - background-position: 0 -1924px; -} - -.notifications-content .one-notification[data-type=video] .notification-actions span.talk-images { - background-position: 0 -1940px; -} - -.music-content { - width: 220px; -} - -.music-content .tools-content-subitem { - height: 247px; -} - -.music-content .player { - background: #b5d5db; - background: -moz-linear-gradient(top, #b5d5db, #adced4); - background: -webkit-gradient(linear, left top, left bottom, from(#b5d5db), to(#adced4)); - height: 20px; - padding: 2px 5px; - border-top-right-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; -} - -.music-content .player a { - margin: 2px; - height: 16px; - width: 16px; - float: left; -} - -.music-content .player a:hover, -.music-content .player a:focus { - opacity: 0.8; -} - -.music-content .player a:active { - opacity: 0.6; -} - -.music-content .stop { - display: none; - background-position: 0 -270px; -} - -.music-content .list { - background-color: #e8f1f3; - height: 188px; - padding: 5px; - text-align: left; - overflow-y: auto; - overflow-x: hidden; -} - -.music-content p.no-results { - display: none; - color: black; - font-size: 0.9em; -} - -.music-content div.special { - padding-bottom: 2px; - margin-bottom: 6px; - border-bottom: 1px solid #c3d4d7; -} - -.music-content .song { - display: block; - margin: 3px 0; - font-size: 0.8em; -} - -.music-content .playing { - font-weight: bold; -} - -.music-content .search { - background-color: #e8f1f3; - height: 25px; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; -} - -.music-content .search input { - margin: 2px; - width: 198px; - height: 15px; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/userinfos.css b/sources/extend/addon/matrix/jappixmini/jappix/css/userinfos.css deleted file mode 100644 index 59bab655..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/userinfos.css +++ /dev/null @@ -1,100 +0,0 @@ -/* - -Jappix - An open social platform -This is the user-infos CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 27/03/11 - -*/ - -#userinfos .content { - overflow: auto; -} - -#userinfos .one-lap a { - text-decoration: underline; -} - -#userinfos .main-infos { - margin: 20px 20px 8px 20px; - height: 120px; - background: white; - position: relative; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; -} - -#userinfos .avatar-container { - float: left; - text-align: center; - margin: 20px 35px; - width: 80px; - height: 80px; -} - -#userinfos .avatar { - max-width: 80px; - max-height: 80px; -} - -#userinfos h1, -#userinfos h2, -#userinfos h3 { - width: 410px; - overflow: hidden; -} - -#userinfos h1 { - font-size: 2em; - padding-top: 12px; - margin-bottom: 4px; -} - -#userinfos h2 { - color: #447079; - font-size: 1.1em; - margin-bottom: 10px; -} - -#userinfos h3 { - color: #6e8388; - font-size: 0.8em; -} - -#userinfos .main-infos div.shortcuts { - position: absolute; - top: 10px; - right: 12px; -} - -#userinfos .block-infos { - margin: 7px 20px; - float: left; -} - -#userinfos .one-line { - margin: 4px 0; - font-size: 0.9em; - float: left; -} - -#userinfos .one-line b { - width: 120px; - float: left; -} - -#userinfos .one-line span.reset-info { - float: left; - width: 460px; -} - -#userinfos textarea { - margin: 30px 0 0 30px; - width: 572px; - height: 292px; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/vcard.css b/sources/extend/addon/matrix/jappixmini/jappix/css/vcard.css deleted file mode 100644 index 59dfc486..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/vcard.css +++ /dev/null @@ -1,106 +0,0 @@ -/* - -Jappix - An open social platform -This is the vCard CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 16/01/12 - -*/ - -#vcard label { - font-size: 0.94em; - margin-top: 2px; -} - -#vcard #vcard-avatar input[type=file] { - margin-left: 15px; -} - -#vcard .avatar-container { - float: left; - text-align: center; - margin: 20px 0 35px 35px; - max-width: 96px; - max-height: 96px; -} - -#vcard .avatar { - max-width: 96px; - max-height: 96px; -} - -#vcard .avatar-delete { - background-position: 3px -1195px; - margin: 12px 25px 0 025px; - padding-left: 20px; - font-size: 0.9em; - float: right; -} - -#vcard .no-avatar { - width: 300px; - color: #7c2222; - padding: 10px; - margin: 15px 0 20px 40px; - background: #f8cece; - border: 1px #ba6d6d solid; - font-size: 0.8em; -} - -#vcard .forms textarea { - height: 111px; - width: 358px; - margin: 5px 12px 10px 12px; -} - -#vcard .forms .avatar-info { - border-width: 1px; - border-style: solid; - display: none; - width: 370px; - height: 15px; - font-size: 0.85em; - padding: 10px; -} - -#vcard .forms .avatar-wait { - background-color: #9bcbed; - color: #0a3858; - border-color: #306780; -} - -#vcard .forms .avatar-ok { - background-color: #c4ed9b; - color: #325213; - border-color: #578030; -} - -#vcard .forms .avatar-error { - background-color: #e79595; - color: #6a0b0b; - border-color: #7c1010; -} - -#vcard .infos { - width: 179px; - height: 328px; - margin: 15px 15px 15px 0; - padding: 0 8px; - float: right; -} - -#vcard .infos a { - text-decoration: underline; -} - -#vcard .send { - float: right; -} - -#vcard .send:hover { - cursor: pointer; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/css/welcome.css b/sources/extend/addon/matrix/jappixmini/jappix/css/welcome.css deleted file mode 100644 index 71b31ef2..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/css/welcome.css +++ /dev/null @@ -1,170 +0,0 @@ -/* - -Jappix - An open social platform -This is the welcome tool CSS stylesheet for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 26/04/11 - -*/ - -#welcome .infos { - margin: 15px; -} - -#welcome .infos p { - margin-top: 6px; -} - -#welcome .infos p.infos-title { - margin-top: 0; -} - -#welcome a.box { - background-color: #e4eef9; - border: 1px solid #ccdbde; - margin: 12px 11px 4px 15px; - padding: 10px; - width: 270px; - text-decoration: none; - float: left; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; -} - -#welcome a.box.share { - width: 350px; - margin: 4px 130px; - padding: 4px 10px; - clear: both; -} - -#welcome a.box.share.first { - margin-top: 0; -} - -#welcome a.box.share:hover span.go { - display: block; -} - -#welcome a.box:hover, -#welcome a.box:focus { - border: 1px solid #93c5fa; -} - -#welcome a.box:active { - border: 1px solid #419afa; -} - -#welcome a.box.enabled { - background-color: #f1f6fd; - border: 1px solid #9dc4fc; -} - -#welcome a.box span { - margin: 3px 0; - display: block; -} - -#welcome a.box span.logo { - height: 35px; - width: 35px; - margin-right: 15px; - float: left; -} - -#welcome a.box span.logo.facebook { - background-position: 0 0; -} - -#welcome a.box span.logo.twitter { - background-position: -35px 0; -} - -#welcome a.box span.logo.buzz { - background-position: -70px 0; -} - -#welcome a.box span.logo.identica { - background-position: -105px 0; -} - -#welcome a.box span.option, -#welcome a.box span.name { - font-size: 0.9em; - font-weight: bold; -} - -#welcome a.box span.description { - font-size: 0.7em; - margin-top: 7px; -} - -#welcome a.box.share span.description { - margin-top: 4px; -} - -#welcome a.box span.image { - height: 16px; - width: 16px; - margin: -30px 12px 0 0; - float: right; -} - -#welcome a.box span.image.sound { - background-position: 0 -900px; -} - -#welcome a.box span.image.geolocation { - background-position: 0 -658px; -} - -#welcome a.box span.image.xmpp { - background-position: 0 -990px; -} - -#welcome a.box span.image.archives, -#page-engine .text .tools-archives { - background-position: 0 -1025px; -} - -#welcome a.box span.image.offline { - background-position: 0 -80px; -} - -#welcome a.box span.tick, -#welcome a.box span.go { - height: 16px; - width: 16px; - display: none; - float: right; -} - -#welcome a.box span.tick { - background-position: 0 -1661px; - margin: -52px -15px 0 0; -} - -#welcome a.box span.go { - background-position: 0 -1120px; - margin: -28px 5px 0 0; -} - -#welcome a.box.enabled span.tick { - display: block; -} - -#welcome div.results { - margin: -7px 15px; - padding: 0; - height: 272px; - overflow: auto; -} - -#welcome .bottom .finish.save { - display: none; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/others/blank.gif b/sources/extend/addon/matrix/jappixmini/jappix/img/others/blank.gif deleted file mode 100644 index 35d42e80..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/others/blank.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/others/default-avatar.png b/sources/extend/addon/matrix/jappixmini/jappix/img/others/default-avatar.png deleted file mode 100644 index 7cda4c64..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/others/default-avatar.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/others/lock.png b/sources/extend/addon/matrix/jappixmini/jappix/img/others/lock.png deleted file mode 100644 index cba6c0d3..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/others/lock.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/animate.gif b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/animate.gif deleted file mode 100644 index cbf55da5..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/animate.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/animate.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/animate.png deleted file mode 100644 index 3d89e5db..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/animate.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/background.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/background.png deleted file mode 100644 index 4ae286d8..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/background.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/browsers.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/browsers.png deleted file mode 100644 index 8fadb7b3..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/browsers.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/buttons.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/buttons.png deleted file mode 100644 index 4c32b14d..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/buttons.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/home.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/home.png deleted file mode 100644 index cd3ca4a1..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/home.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/install.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/install.png deleted file mode 100644 index e2f4cd26..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/install.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/logs.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/logs.png deleted file mode 100644 index bae4fb18..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/logs.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/manager.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/manager.png deleted file mode 100644 index d63a3fec..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/manager.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/me.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/me.png deleted file mode 100644 index 8a8bc0fb..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/me.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/mini.gif b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/mini.gif deleted file mode 100644 index 3f3f9523..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/mini.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/mini.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/mini.png deleted file mode 100644 index 6852274d..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/mini.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/mobile.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/mobile.png deleted file mode 100644 index ba36a24c..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/mobile.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/smileys.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/smileys.png deleted file mode 100644 index 1c33243d..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/smileys.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/talk.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/talk.png deleted file mode 100644 index a307e19e..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/talk.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/welcome.png b/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/welcome.png deleted file mode 100644 index 9044bd9c..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/sprites/welcome.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/wait/wait-big.gif b/sources/extend/addon/matrix/jappixmini/jappix/img/wait/wait-big.gif deleted file mode 100644 index c6573207..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/wait/wait-big.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/wait/wait-medium.png b/sources/extend/addon/matrix/jappixmini/jappix/img/wait/wait-medium.png deleted file mode 100644 index 4b9a780b..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/wait/wait-medium.png and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/img/wait/wait-small.gif b/sources/extend/addon/matrix/jappixmini/jappix/img/wait/wait-small.gif deleted file mode 100644 index c4b5787e..00000000 Binary files a/sources/extend/addon/matrix/jappixmini/jappix/img/wait/wait-small.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/adhoc.js b/sources/extend/addon/matrix/jappixmini/jappix/js/adhoc.js deleted file mode 100644 index d4e3bf4c..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/adhoc.js +++ /dev/null @@ -1,85 +0,0 @@ -/* - -Jappix - An open social platform -These are the Ad-Hoc JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 11/07/11 - -*/ - -// Opens the adhoc popup -function openAdHoc() { - // Popup HTML content - var html = - '
' + _e("Commands") + '
' + - - '
' + - '
' + - - '
' + - '
' + - - '
' + - '
' + - - '' + _e("Close") + '' + - '
'; - - // Create the popup - createPopup('adhoc', html); - - // Associate the events - launchAdHoc(); - - return false; -} - -// Quits the adhoc popup -function closeAdHoc() { - // Destroy the popup - destroyPopup('adhoc'); - - return false; -} - -// Retrieves an entity adhoc command -function retrieveAdHoc(xid) { - // Open the popup - openAdHoc(); - - // Add a XID marker - $('#adhoc .adhoc-head').html('' + getBuddyName(xid).htmlEnc() + ' (' + xid.htmlEnc() + ')'); - - // Get the highest entity resource - var highest = getHighestResource(xid); - - if(highest) - xid = highest; - - // Start a new adhoc command - dataForm(xid, 'command', '', '', 'adhoc'); - - return false; -} - -// Starts an adhoc command on the user server -function serverAdHoc(server) { - // Open the popup - openAdHoc(); - - // Add a XID marker - $('#adhoc .adhoc-head').html('' + server.htmlEnc() + ''); - - // Start a new adhoc command - dataForm(server, 'command', '', '', 'adhoc'); -} - -// Plugin launcher -function launchAdHoc() { - // Click event - $('#adhoc .bottom .finish').click(closeAdHoc); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/anonymous.js b/sources/extend/addon/matrix/jappixmini/jappix/js/anonymous.js deleted file mode 100644 index 88eaa7dc..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/anonymous.js +++ /dev/null @@ -1,131 +0,0 @@ -/* - -Jappix - An open social platform -These are the anonymous mode JS script for Jappix - -------------------------------------------------- - -License: AGPL -Authors: Vanaryon, LinkMauve -Last revision: 02/10/11 - -*/ - -// Connected to an anonymous session -function anonymousConnected(con) { - logThis('Jappix (anonymous) is now connected.', 3); - - // Connected marker - CONNECTED = true; - CURRENT_SESSION = true; - RECONNECT_TRY = 0; - RECONNECT_TIMER = 0; - - // Not resumed? - if(!RESUME) { - // Create the app - createTalkPage(); - - // Send our first presence - firstPresence(''); - - // Set last activity stamp - LAST_ACTIVITY = getTimeStamp(); - - // Create the new groupchat - checkChatCreate(generateXID(ANONYMOUS_ROOM, 'groupchat'), 'groupchat'); - - // Remove some nasty elements for the anonymous mode - $('.tools-mucadmin, .tools-add').remove(); - } - - // Resumed - else { - // Send again our presence - presenceSend(); - - // Change the title - updateTitle(); - } - - // Remove the waiting icon - removeGeneralWait(); -} - -// Disconnected from an anonymous session -function anonymousDisconnected() { - logThis('Jappix (anonymous) is now disconnected.', 3); -} - -// Logins to a anonymous account -function anonymousLogin(server) { - try { - // We define the http binding parameters - oArgs = new Object(); - - if(HOST_BOSH_MAIN) - oArgs.httpbase = HOST_BOSH_MAIN; - else - oArgs.httpbase = HOST_BOSH; - - // We create the new http-binding connection - con = new JSJaCHttpBindingConnection(oArgs); - - // And we handle everything that happen - con.registerHandler('message', handleMessage); - con.registerHandler('presence', handlePresence); - con.registerHandler('iq', handleIQ); - con.registerHandler('onconnect', anonymousConnected); - con.registerHandler('onerror', handleError); - con.registerHandler('ondisconnect', anonymousDisconnected); - - // We set the anonymous connection parameters - oArgs = new Object(); - oArgs.domain = server; - oArgs.authtype = 'saslanon'; - oArgs.resource = JAPPIX_RESOURCE + ' Anonymous (' + (new Date()).getTime() + ')'; - oArgs.secure = true; - oArgs.xmllang = XML_LANG; - - // We connect ! - con.connect(oArgs); - - // Change the page title - pageTitle('wait'); - } - - catch(e) { - // Logs errors - logThis('Error while anonymous loggin in: ' + e, 1); - - // Reset Jappix - anonymousDisconnected(); - - // Open an unknown error - openThisError(2); - } - - finally { - return false; - } -} - -// Plugin launcher -function launchAnonymous() { - logThis('Anonymous mode detected, connecting...', 3); - - // We add the login wait div - showGeneralWait(); - - // Get the vars - if(LINK_VARS['r']) - ANONYMOUS_ROOM = LINK_VARS['r']; - if(LINK_VARS['n']) - ANONYMOUS_NICK = LINK_VARS['n']; - - // Fire the login action - anonymousLogin(HOST_ANONYMOUS); -} - -// Launch this plugin! -$(document).ready(launchAnonymous); diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/archives.js b/sources/extend/addon/matrix/jappixmini/jappix/js/archives.js deleted file mode 100644 index 387a379f..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/archives.js +++ /dev/null @@ -1,418 +0,0 @@ -/* - -Jappix - An open social platform -These are the archives functions for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 03/03/11 - -*/ - -// Opens the archive tools -function openArchives() { - // Popup HTML content - var html = - '
' + _e("Message archives") + '
' + - - '
' + - '
' + - '' + - - '
' + - '
' + - - '
' + - '' + - '' + _e("Please select a friend to view the chat history.") + '' + - '
' + - - '
' + - '
' + - - '
' + - '
' + - - '' + _e("Close") + '' + - '
'; - - // Create the popup - createPopup('archives', html); - - // Associate the events - launchArchives(); - - // Get all the buddies in our roster - var buddies = getAllBuddies(); - var options = ''; - - for(i in buddies) { - var current = buddies[i]; - - // Add the current buddy - options += ''; - } - - // Can append the buddy HTML code? - if(options) - $('#archives .filter .friend').append(options); - - return false; -} - -// Closes the archive tools -function closeArchives() { - // Destroy the popup - destroyPopup('archives'); - - return false; -} - -// Gets the archives list for a buddy -function getListArchives(xid) { - // Reset the archives viewer - $('#archives .logs').empty(); - - // Show the waiting icon - $('#archives .wait').show(); - - // Apply the ID - var id = genID(); - $('#archives').attr('data-session', id); - - // New IQ - var iq = new JSJaCIQ(); - iq.setType('get'); - iq.setID(id); - - var list = iq.appendNode('list', {'xmlns': NS_URN_ARCHIVE, 'with': xid}); - var set = list.appendChild(iq.buildNode('set', {'xmlns': NS_RSM})); - set.appendChild(iq.buildNode('max', {'xmlns': NS_RSM}, '0')); - - con.send(iq, handleListArchives); - - logThis('Getting archives list for: ' + xid + '...'); -} - -// Handles the archives list for a buddy -function handleListArchives(iq) { - // Hide the waiting icon - $('#archives .wait').hide(); - - // Any error? - if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']')) - return; - - // Get the last archive date - var last = $(iq.getNode()).find('list set changed').text(); - - // Any last archive? - if(last) { - // Read the date - var date = Date.jab2date(last); - - // Change the datepicker value - $('#archives .filter .date').DatePickerSetDate(date, true); - - // Retrieve the archives - checkChangeArchives(); - } - - logThis('Got archives list.', 2); -} - -// Gets the archives for a day -function getDayArchives(xid, date) { - // Reset the archives viewer - $('#archives .logs').empty(); - - // Show the waiting icon - $('#archives .wait').show(); - - // Apply the ID - var id = genID(); - $('#archives').attr('data-session', id); - - // New IQ - var iq = new JSJaCIQ(); - iq.setType('get'); - iq.setID(id); - - iq.appendNode('list', {'xmlns': NS_URN_ARCHIVE, 'with': xid, 'start': date + 'T00:00:00Z', 'end': date + 'T23:59:59Z'}); - - con.send(iq, handleDayArchives); - - logThis('Getting day archives (' + date + ') for: ' + xid + '...'); -} - -// Handles the archives for a day -function handleDayArchives(iq) { - // Hide the waiting icon - $('#archives .wait').hide(); - - // Any error? - if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']')) - return; - - // Get each archive thread - $(iq.getNode()).find('chat').each(function() { - // Current values - var xid = $(this).attr('with'); - var start = $(this).attr('start'); - - if(xid && start) - $('#archives .logs').append(''); - }); - - // Display the day - var date = parseDay($('#archives .filter .date').DatePickerGetDate(true) + 'T00:00:00Z' + getDateTZO()); - - // Try to get the first thread - var pending = '#archives input.archives-pending:first'; - - if(!exists(pending)) - date = printf(_e("Nothing found for: %s"), date); - - else { - retrieveArchives($(pending).attr('data-with'), $(pending).attr('data-start')); - $(pending).remove(); - } - - $('#archives .current .time').text(date); - - logThis('Got day archives.', 2); -} - -// Retrieves a specified archive collection -function retrieveArchives(xid, start) { - // Show the waiting icon - $('#archives .wait').show(); - - // Apply the ID - var id = genID(); - $('#archives').attr('data-session', id); - - // New IQ - var iq = new JSJaCIQ(); - iq.setType('get'); - iq.setID(id); - - var list = iq.appendNode('retrieve', {'xmlns': NS_URN_ARCHIVE, 'with': xid, 'start': start}); - - con.send(iq, handleRetrieveArchives); - - logThis('Retrieving archives (start: ' + start + ') for: ' + xid + '...'); -} - -// Handles a specified archive collection -function handleRetrieveArchives(iq) { - // Hide the waiting icon - $('#archives .wait').hide(); - - // Any error? - if(handleErrorReply(iq) || !exists('#archives[data-session=' + iq.getID() + ']')) - return; - - // Get the node - var chat = $(iq.getNode()).find('chat:first'); - - // Get the buddy XID - var xid = bareXID(chat.attr('with')); - - // Get the start date & stamp - var start_date = Date.jab2date(chat.attr('start')); - var start_stamp = extractStamp(start_date); - - // Parse the result chat - chat.find('to, from').each(function() { - var node = (this).nodeName; - var stamp = start_stamp + parseInt($(this).attr('secs')); - var date = extractTime(new Date(stamp * 1000)); - var body = $(this).find('body').text(); - - // Is it my message? - if((node == 'to') && body) - displayMessage('chat', getXID(), 'archives', getBuddyName(getXID()).htmlEnc(), body, date, start_stamp, 'user-message', true, '', 'me'); - - // Is it a buddy message? - else if((node == 'from') && body) - displayMessage('chat', xid, 'archives', getBuddyName(xid).htmlEnc(), body, date, start_stamp, 'user-message', true, '', 'him'); - }); - - // Not the latest thread? - var pending = '#archives input.archives-pending:first'; - - if(exists(pending)) { - retrieveArchives($(pending).attr('data-with'), $(pending).attr('data-start')); - $(pending).remove(); - } - - // Everything has been retrieved, get the avatars - else { - getAvatar(getXID(), 'cache', 'true', 'forget'); - getAvatar(xid, 'cache', 'true', 'forget'); - } - - logThis('Got archives.', 2); -} - -// Gets the archiving configuration -function getConfigArchives() { - // Lock the archiving options - $('#archiving').attr('checked', false).attr('disabled', true); - - // Get the archiving configuration - var iq = new JSJaCIQ(); - iq.setType('get'); - - iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE}); - - con.send(iq, handleGetConfigArchives); -} - -// Handles the archiving configuration -function handleGetConfigArchives(iq) { - // Reset the options stuffs - waitOptions('archives'); - - // Unlock the archiving options - $('#archiving').removeAttr('disabled'); - - // End if not a result - if(!iq || (iq.getType() != 'result')) - return; - - // Extract the preferences from the IQ - var enabled = $(iq.getNode()).find('pref auto').attr('save'); - - // Define the input enabling/disabling vars - var checked = true; - - if(enabled != 'true') - checked = false; - - // Apply the values - $('#archiving').attr('checked', checked); -} - -// Configures the archiving on the server -function configArchives(enabled) { - // Configure the auto element - var iq = new JSJaCIQ(); - iq.setType('set'); - - iq.appendNode('auto', {'xmlns': NS_URN_ARCHIVE, 'save': enabled}); - - con.send(iq, handleConfigArchives); - - // Configure the default element - var iq = new JSJaCIQ(); - iq.setType('set'); - - var pref = iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE}); - pref.appendChild(iq.appendNode('default', {'xmlns': NS_URN_ARCHIVE, 'otr': 'concede', 'save': 'body'})); - - con.send(iq); - - // Configure the method element - var iq = new JSJaCIQ(); - iq.setType('set'); - - var mType = new Array('auto', 'local', 'manual'); - var mUse = new Array('prefer', 'concede', 'concede'); - - var pref = iq.appendNode('pref', {'xmlns': NS_URN_ARCHIVE}); - - for(i in mType) - pref.appendChild(iq.appendNode('method', {'xmlns': NS_URN_ARCHIVE, 'type': mType[i], 'use': mUse[i]})); - - con.send(iq); - - // Logger - logThis('Configuring archives...', 3); -} - -// Handles the archives configuration -function handleConfigArchives(iq) { - if(!iq || (iq.getType() != 'result')) - logThis('Archives not configured.', 2); - else - logThis('Archives configured.', 3); -} - -// Checks if the datepicker has changed -function checkChangeArchives() { - var xid = $('#archives .filter .friend').val(); - var date = $('#archives .filter .date').DatePickerGetDate(true); - - // No XID? - if(!xid || !xid.length) - return; - - // Too many value? - if(xid.length > 1) { - $('#archives .filter .friend').val(xid[0]); - - return; - } - - // Get the first XID - xid = xid[0]; - - // Get the archives - getDayArchives(xid, date); -} - -// Update the archives with the selected XID -function updateArchives() { - // Read the values - var xid = $('#archives .filter .friend').val(); - var date = $('#archives .filter .date').DatePickerGetDate(true); - - // No XID? - if(!xid || !xid.length) - return; - - // Too many value? - if(xid.length > 1) { - $('#archives .filter .friend').val(xid[0]); - - return; - } - - // Get the first XID - xid = xid[0]; - - // Apply the current marker - $('#archives .current .name').text(getBuddyName(xid)); - $('#archives .current .time').text(parseDay(date + 'T00:00:00Z' + getDateTZO())); - - // Get the archives - getListArchives(xid, date); -} - -// Plugin launcher -function launchArchives() { - // Current date - var current_date = explodeThis('T', getXMPPTime(), 0); - - // Datepicker - $('#archives .filter .date').DatePicker({ - flat: true, - date: current_date, - current: current_date, - calendars: 1, - starts: 1, - onChange: checkChangeArchives - }); - - // Click events - $('#archives .bottom .finish').click(function() { - return closeArchives(); - }); - - // Change event - $('#archives .filter .friend').change(updateArchives); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/audio.js b/sources/extend/addon/matrix/jappixmini/jappix/js/audio.js deleted file mode 100644 index f83583a9..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/audio.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - -Jappix - An open social platform -These are the audio JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 10/08/11 - -*/ - -// Plays the given sound ID -function soundPlay(num) { - try { - // Not supported! - if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 9)) - return false; - - // If the sounds are enabled - if(getDB('options', 'sounds') == '1') { - // If the audio elements aren't yet in the DOM - if(!exists('#audio')) { - $('body').append( - '
' + - '
' - ); - } - - // We play the target sound - var playThis = document.getElementById('audio').getElementsByTagName('audio')[num]; - playThis.load(); - playThis.play(); - } - } - - catch(e) {} - - finally { - return false; - } -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/autocompletion.js b/sources/extend/addon/matrix/jappixmini/jappix/js/autocompletion.js deleted file mode 100644 index 52d3c47e..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/autocompletion.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - -Jappix - An open social platform -These are the autocompletion tools JS script for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 12/11/10 - -*/ - -// Sort an array with insensitivity to the case -function caseInsensitiveSort(a, b) { - // Put the two strings into lower case - a = a.toLowerCase(); - b = b.toLowerCase(); - - // Process the sort - if(a > b) - return 1; - if(a < b) - return -1; -} - -// Creates an array with the autocompletion results -function processAutocompletion(query, id) { - // Replace forbidden characters in regex - query = escapeRegex(query); - - // Create an empty array - var results = new Array(); - - // Search in the roster - $('#' + id + ' .user').each(function() { - var nick = $(this).find('.name').text(); - var regex = new RegExp('(^)' + query, 'gi'); - - if(nick.match(regex)) - results.push(nick); - }); - - // Sort the array - results = results.sort(caseInsensitiveSort); - - // Return the results array - return results; -} - -// Resets the autocompletion tools -function resetAutocompletion(hash) { - $('#' + hash + ' .message-area').removeAttr('data-autocompletion-pointer').removeAttr('data-autocompletion-query'); -} - -// Autocompletes the chat input nick -function createAutocompletion(hash) { - // Initialize - var vSelector = $('#' + hash + ' .message-area'); - var value = vSelector.val(); - if(!value) - resetAutocompletion(hash); - var query = vSelector.attr('data-autocompletion-query'); - - // The autocompletion has not been yet launched - if(query == undefined) { - query = value; - vSelector.attr('data-autocompletion-query', query); - } - - // Get the pointer - var pointer = vSelector.attr('data-autocompletion-pointer'); - var i = 0; - - if(pointer) - i = parseInt(pointer); - - // We get the nickname - var nick = processAutocompletion(query, hash)[i]; - - // Shit, this is my nick! - if((nick != undefined) && (nick.toLowerCase() == getMUCNick(hash).toLowerCase())) { - // Increment - i++; - - // Get the next nick - nick = processAutocompletion(query, hash)[i]; - } - - // We quote the nick - if(nick != undefined) { - // Increment - i++; - quoteMyNick(hash, nick); - - // Put a pointer - vSelector.attr('data-autocompletion-pointer', i); - } -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/avatar.js b/sources/extend/addon/matrix/jappixmini/jappix/js/avatar.js deleted file mode 100644 index 4234ffc7..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/avatar.js +++ /dev/null @@ -1,205 +0,0 @@ -/* - -Jappix - An open social platform -These are the avatar JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 01/03/11 - -*/ - -// Requests the avatar of a given user -var AVATAR_PENDING = []; - -function getAvatar(xid, mode, enabled, photo) { - /* REF: http://xmpp.org/extensions/xep-0153.html */ - - // No need to get the avatar, another process is yet running - if(existArrayValue(AVATAR_PENDING, xid)) - return false; - - // Initialize: XML data is in one SQL entry, because some browser are sloooow with SQL requests - var xml = XMLFromString(getPersistent('avatar', xid)); - var forced = false; - - // Retrieving forced? - if($(xml).find('forced').text() == 'true') - forced = true; - - // No avatar in presence - if(!photo && !forced && (enabled == 'true')) { - // Pending marker - AVATAR_PENDING.push(xid); - - // Reset the avatar - resetAvatar(xid, hex_md5(xid)); - - logThis('No avatar for: ' + xid, 2); - } - - // Try to catch the avatar - else { - // Define some stuffs - var type = $(xml).find('type').text(); - var binval = $(xml).find('binval').text(); - var checksum = $(xml).find('checksum').text(); - var updated = false; - - // Process the checksum of the avatar - if((checksum == photo) || (photo == 'forget') || forced) - updated = true; - - // If the avatar is yet stored and a new retrieving is not needed - if((mode == 'cache') && type && binval && checksum && updated) { - // Pending marker - AVATAR_PENDING.push(xid); - - // Display the cache avatar - displayAvatar(xid, hex_md5(xid), type, binval); - - logThis('Read avatar from cache: ' + xid, 3); - } - - // Else if the request has not yet been fired, we get it - else if((!updated || (mode == 'cache' && !updated) || (mode == 'force') || (photo = 'forget')) && (enabled != 'false')) { - // Pending marker - AVATAR_PENDING.push(xid); - - // Get the latest avatar - var iq = new JSJaCIQ(); - iq.setType('get'); - iq.setTo(xid); - - iq.appendNode('vCard', {'xmlns': NS_VCARD}); - - con.send(iq, handleAvatar); - - logThis('Get avatar from server: ' + xid, 3); - } - } - - return true; -} - -// Handles the avatar -function handleAvatar(iq) { - // Extract the XML values - var handleXML = iq.getNode(); - var handleFrom = fullXID(getStanzaFrom(iq)); - - // Is this me? Remove the resource! - if(bareXID(handleFrom) == getXID()) - handleFrom = bareXID(handleFrom); - - // Get some other values - var hash = hex_md5(handleFrom); - var find = $(handleXML).find('vCard'); - var aChecksum = 'none'; - var oChecksum = null; - - // Read our own checksum - if(handleFrom == getXID()) { - oChecksum = getDB('checksum', 1); - - // Avoid the "null" value - if(!oChecksum) - oChecksum = ''; - } - - // vCard not empty? - if(find.size()) { - // We get our profile details - if(handleFrom == getXID()) { - // Get the names - var names = generateBuddyName(iq); - - // Write the values to the database - setDB('profile', 'name', names[0]); - setDB('profile', 'nick', names[1]); - } - - // We get the avatar - var aType = find.find('TYPE:first').text(); - var aBinval = find.find('BINVAL:first').text(); - - // No binval? - if(!aBinval) { - aType = 'none'; - aBinval = 'none'; - } - - // Enough data - else { - // No type? - if(!aType) - aType = 'image/png'; - - // Process the checksum - else - aChecksum = hex_sha1(Base64.decode(aBinval)); - } - - // We display the user avatar - displayAvatar(handleFrom, hash, aType, aBinval); - - // Store the avatar - setPersistent('avatar', handleFrom, '' + aType + '' + aBinval + '' + aChecksum + 'false'); - - logThis('Avatar retrieved from server: ' + handleFrom, 3); - } - - // vCard is empty - else - resetAvatar(handleFrom); - - // We got a new checksum for us? - if(((oChecksum != null) && (oChecksum != aChecksum)) || !FIRST_PRESENCE_SENT) { - // Define a proper checksum - var pChecksum = aChecksum; - - if(pChecksum == 'none') - pChecksum = ''; - - // Update our temp. checksum - setDB('checksum', 1, pChecksum); - - // Send the stanza - if(FIRST_PRESENCE_SENT) - presenceSend(pChecksum); - else - getStorage(NS_OPTIONS); - } -} - -// Reset the avatar of an user -function resetAvatar(xid, hash) { - // Store the empty avatar - setPersistent('avatar', xid, 'nonenonenonefalse'); - - // Display the empty avatar - displayAvatar(xid, hash, 'none', 'none'); -} - -// Displays the avatar of an user -function displayAvatar(xid, hash, type, binval) { - // Initialize the vars - var container = hash + ' .avatar-container'; - var code = ''; - - // Replace with the new avatar (in the roster and in the chat) - $('.' + container).html(code); - - // We can remove the pending marker - removeArrayValue(AVATAR_PENDING, xid); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/base64.js b/sources/extend/addon/matrix/jappixmini/jappix/js/base64.js deleted file mode 100644 index 1cf2dc74..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/base64.js +++ /dev/null @@ -1,80 +0,0 @@ -// This code was written by Tyler Akins and has been placed in the -// public domain. It would be nice if you left this header intact. -// Base64 code from Tyler Akins -- http://rumkin.com - -var Base64 = (function () { - var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - - var obj = { - /** - * Encodes a string in base64 - * @param {String} input The string to encode in base64. - */ - encode: function (input) { - var output = ""; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - - do { - chr1 = input.charCodeAt(i++); - chr2 = input.charCodeAt(i++); - chr3 = input.charCodeAt(i++); - - enc1 = chr1 >> 2; - enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); - enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); - enc4 = chr3 & 63; - - if (isNaN(chr2)) { - enc3 = enc4 = 64; - } else if (isNaN(chr3)) { - enc4 = 64; - } - - output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + - keyStr.charAt(enc3) + keyStr.charAt(enc4); - } while (i < input.length); - - return output; - }, - - /** - * Decodes a base64 string. - * @param {String} input The string to decode. - */ - decode: function (input) { - var output = ""; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - - // remove all characters that are not A-Z, a-z, 0-9, +, /, or = - input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); - - do { - enc1 = keyStr.indexOf(input.charAt(i++)); - enc2 = keyStr.indexOf(input.charAt(i++)); - enc3 = keyStr.indexOf(input.charAt(i++)); - enc4 = keyStr.indexOf(input.charAt(i++)); - - chr1 = (enc1 << 2) | (enc2 >> 4); - chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); - chr3 = ((enc3 & 3) << 6) | enc4; - - output = output + String.fromCharCode(chr1); - - if (enc3 != 64) { - output = output + String.fromCharCode(chr2); - } - if (enc4 != 64) { - output = output + String.fromCharCode(chr3); - } - } while (i < input.length); - - return output; - } - }; - - return obj; -})(); diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/board.js b/sources/extend/addon/matrix/jappixmini/jappix/js/board.js deleted file mode 100644 index 1d26acee..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/board.js +++ /dev/null @@ -1,141 +0,0 @@ -/* - -Jappix - An open social platform -These are the notification board JS script for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 12/03/11 - -*/ - -// Creates a board panel -function createBoard(type, id) { - // Text var - var text = ''; - - // Info - if(type == 'info') { - switch(id) { - // Password change - case 1: - text = _e("Your password has been changed, now you can connect to your account with your new login data."); - - break; - - // Account deletion - case 2: - text = _e("Your XMPP account has been removed, bye!"); - - break; - - // Account logout - case 3: - text = _e("You have been logged out of your XMPP account, have a nice day!"); - - break; - - // Groupchat join - case 4: - text = _e("The room you joined seems not to exist. You should create it!"); - - break; - - // Groupchat removal - case 5: - text = _e("The groupchat has been removed, now someone else will be able to recreate it."); - - break; - - // Non-existant groupchat user - case 6: - text = _e("The user that you want to reach is not present in the room."); - - break; - } - } - - // Error - else { - switch(id) { - // Custom error - case 1: - text = '' + _e("Error") + ' » '; - - break; - - // Network error - case 2: - text = _e("Jappix has been interrupted by a network issue, a bug or bad login (check that you entered the right credentials), sorry for the inconvenience."); - - break; - - // List retrieving error - case 3: - text = _e("The element list on this server could not be obtained!"); - - break; - - // Attaching error - case 4: - text = printf(_e("An error occured while uploading your file: maybe it is too big (%s maximum) or forbidden!"), JAPPIX_MAX_UPLOAD); - - break; - } - } - - // No text? - if(!text) - return false; - - // Append the content - $('#board').append('
' + text + '
'); - - // Events (click and auto-hide) - $('#board .one-board.' + type + '[data-id=' + id + ']') - - .click(function() { - closeThisBoard(this); - }) - - .oneTime('5s', function() { - closeThisBoard(this); - }) - - .slideDown(); - - return true; -} - -// Destroys the existing board notifications -function destroyBoard() { - $('#board').empty(); -} - -// Executes a given action on the notification board -function actionBoard(id, type) { - // In a first, we destroy other boards - destroyBoard(); - - // Then we display the board - createBoard(type, id); -} - -// Opens a given error ID -function openThisError(id) { - actionBoard(id, 'error'); -} - -// Opens a given info ID -function openThisInfo(id) { - actionBoard(id, 'info'); -} - -// Closes a given board -function closeThisBoard(board) { - $(board).slideUp('normal', function() { - $(this).remove(); - }); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/browser-detect.js b/sources/extend/addon/matrix/jappixmini/jappix/js/browser-detect.js deleted file mode 100644 index 39edaf2b..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/browser-detect.js +++ /dev/null @@ -1,124 +0,0 @@ -/* BROWSER DETECT - * http://www.quirksmode.org/js/detect.html - */ - -var BrowserDetect = { - init: function () { - this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; - this.version = this.searchVersion(navigator.userAgent) - || this.searchVersion(navigator.appVersion) - || "an unknown version"; - this.OS = this.searchString(this.dataOS) || "an unknown OS"; - }, - - searchString: function (data) { - for (var i=0;i ' + _e("no subject defined for this room.") + '

'; - specialCode = '

' + _e("Moderators") + '

' + _e("Participants") + '

' + _e("Visitors") + '

' + _e("Others") + '

'; - specialLink = ''; - specialStyle = ''; - - // Is this a gateway? - if(xid.match(/%/)) - specialDisabled = ''; - else - specialDisabled = ' disabled=""'; - } - - // Chat (or other things?!) special code - else { - specialAttributes = ' data-type="chat"'; - specialAvatar = '
'; - specialName = '

'; - specialCode = '
'; - specialLink = ''; - specialStyle = ' style="display: none;"'; - specialDisabled = ''; - } - - // Not a groupchat private chat, we can use the buddy add icon - if((type == 'chat') || (type == 'groupchat')) { - var addTitle; - - if(type == 'chat') - addTitle = _e("Add this contact to your friends"); - else - addTitle = _e("Add this groupchat to your favorites"); - - specialLink += ''; - } - - // IE DOM parsing bug fix - var specialStylePicker = '
' + - '' + - '
'; - - if((BrowserDetect.browser == 'Explorer') && (BrowserDetect.version < 9)) - specialStylePicker = ''; - - // Append the chat HTML code - $('#page-engine').append( - '
' + - '
' + - specialAvatar + - - '
' + - '

' + nick.htmlEnc() + '

' + - specialName + - '
' + - '
' + - - specialCode + - - '
' + - '' + - - '
' + - '' + - '
' + - '
' + - '
' - ); - - // Click event: chat cleaner - $(path + 'tools-clear').click(function() { - cleanChat(id); - }); - - // Click event: user-infos - $(path + 'tools-infos').click(function() { - openUserInfos(xid); - }); -} - -// Generates the chat switch elements -function generateSwitch(type, id, xid, nick) { - // Path to the element - var chat_switch = '#page-switch .'; - - // Special code - var specialClass = ' unavailable'; - var show_close = true; - - // Groupchat - if(type == 'groupchat') { - specialClass = ' groupchat-default'; - - if(isAnonymous() && (xid == generateXID(ANONYMOUS_ROOM, 'groupchat'))) - show_close = false; - } - - // Generate the HTML code - var html = '
' + - '
' + - - '
' + nick.htmlEnc() + '
'; - - // Show the close button if not MUC and not anonymous - if(show_close) - html += '
x
'; - - // Close the HTML - html += '
'; - - // Append the HTML code - $(chat_switch + 'chans, ' + chat_switch + 'more-content').append(html); -} - -// Cleans given the chat lines -function cleanChat(chat) { - $('#page-engine #' + chat + ' .content .one-group').remove(); - - $(document).oneTime(10, function() { - $('#page-engine #' + chat + ' .text .message-area').focus(); - }); -} - -// Creates a new chat -function chatCreate(hash, xid, nick, type) { - logThis('New chat: ' + xid, 3); - - // Create the chat content - generateChat(type, hash, xid, nick); - - // Create the chat switcher - generateSwitch(type, hash, xid, nick); - - // If the user is not in our buddy-list - if(type == 'chat') { - // Add button - if(!exists('#buddy-list .buddy[data-xid=' + escape(xid) + ']')) - $('#' + hash + ' .tools-add').click(function() { - // Hide the icon (to tell the user all is okay) - $(this).hide(); - - // Send the subscribe request - addThisContact(xid, nick); - }).show(); - - // Archives button - else if(enabledArchives() || enabledArchives('auto') || enabledArchives('manual') || enabledArchives('manage')) - $('#' + hash + ' .tools-archives').click(function() { - // Open the archives popup - openArchives(); - - // Get the archives for this user - $('#archives .filter .friend').val(xid); - updateArchives(); - }).show(); - } - - // We catch the user's informations (like this avatar, vcard, and so on...) - getUserInfos(hash, xid, nick, type); - - // The icons-hover functions - tooltipIcons(xid, hash); - - // The event handlers - var inputDetect = $('#page-engine #' + hash + ' .message-area'); - - inputDetect.focus(function() { - chanCleanNotify(hash); - }) - - inputDetect.keypress(function(e) { - // Enter key - if(e.keyCode == 13) { - // Add a new line - if(e.shiftKey) - inputDetect.val(inputDetect.val() + '\n'); - - // Send the message - else { - // Send the message - sendMessage(hash, 'chat'); - - // Reset the composing database entry - setDB('chatstate', xid, 'off'); - } - - return false; - } - }); - - // Chatstate events - eventsChatState(inputDetect, xid, hash); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/chatstate.js b/sources/extend/addon/matrix/jappixmini/jappix/js/chatstate.js deleted file mode 100644 index de7e7966..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/chatstate.js +++ /dev/null @@ -1,174 +0,0 @@ -/* - -Jappix - An open social platform -These are the chatstate JS script for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 25/08/11 - -*/ - -// Sends a given chatstate to a given entity -function chatStateSend(state, xid, hash) { - var user_type = $('#' + hash).attr('data-type'); - - // If the friend client supports chatstates and is online - if((user_type == 'groupchat') || ((user_type == 'chat') && $('#' + hash + ' .message-area').attr('data-chatstates') && !exists('#page-switch .' + hash + ' .unavailable'))) { - // Already sent? - if(getDB('currentchatstate', xid) == state) - return; - - // Write the state - setDB('currentchatstate', xid, state); - - // New message stanza - var aMsg = new JSJaCMessage(); - aMsg.setTo(xid); - aMsg.setType(user_type); - - // Append the chatstate node - aMsg.appendNode(state, {'xmlns': NS_CHATSTATES}); - - // Send this! - con.send(aMsg); - } -} - -// Displays a given chatstate in a given chat -function displayChatState(state, hash, type) { - // Groupchat? - if(type == 'groupchat') { - resetChatState(hash, type); - - // "gone" state not allowed - if(state != 'gone') - $('#page-engine .page-engine-chan .user.' + hash).addClass(state); - } - - // Chat - else { - // We change the buddy name color in the page-switch - resetChatState(hash, type); - $('#page-switch .' + hash + ' .name').addClass(state); - - // We generate the chatstate text - var text = ''; - - switch(state) { - // Active - case 'active': - text = _e("Your friend is paying attention to the conversation."); - - break; - - // Composing - case 'composing': - text = _e("Your friend is writing a message..."); - - break; - - // Paused - case 'paused': - text = _e("Your friend stopped writing a message."); - - break; - - // Inactive - case 'inactive': - text = _e("Your friend is doing something else."); - - break; - - // Gone - case 'gone': - text = _e("Your friend closed the chat."); - - break; - } - - // We reset the previous state - $('#' + hash + ' .chatstate').remove(); - - // We create the chatstate - $('#' + hash + ' .content').after('
' + text + '
'); - } -} - -// Resets the chatstate switcher marker -function resetChatState(hash, type) { - // Define the selector - var selector; - - if(type == 'groupchat') - selector = $('#page-engine .page-engine-chan .user.' + hash); - else - selector = $('#page-switch .' + hash + ' .name'); - - // Reset! - selector.removeClass('active') - selector.removeClass('composing') - selector.removeClass('paused') - selector.removeClass('inactive') - selector.removeClass('gone'); -} - -// Adds the chatstate events -function eventsChatState(target, xid, hash) { - target.keyup(function(e) { - if(e.keyCode != 13) { - // Composing a message - if($(this).val() && (getDB('chatstate', xid) != 'on')) { - // We change the state detect input - setDB('chatstate', xid, 'on'); - - // We send the friend a "composing" chatstate - chatStateSend('composing', xid, hash); - } - - // Stopped composing a message - else if(!$(this).val() && (getDB('chatstate', xid) == 'on')) { - // We change the state detect input - setDB('chatstate', xid, 'off'); - - // We send the friend an "active" chatstate - chatStateSend('active', xid, hash); - } - } - }); - - target.change(function() { - // Reset the composing database entry - setDB('chatstate', xid, 'off'); - }); - - target.focus(function() { - // Not needed - if(target.is(':disabled')) - return; - - // Nothing in the input, user is active - if(!$(this).val()) - chatStateSend('active', xid, hash); - - // Something was written, user started writing again - else - chatStateSend('composing', xid, hash); - }); - - target.blur(function() { - // Not needed - if(target.is(':disabled')) - return; - - // Nothing in the input, user is inactive - if(!$(this).val()) - chatStateSend('inactive', xid, hash); - - // Something was written, user paused - else - chatStateSend('paused', xid, hash); - }); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/common.js b/sources/extend/addon/matrix/jappixmini/jappix/js/common.js deleted file mode 100644 index ab10d6e7..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/common.js +++ /dev/null @@ -1,311 +0,0 @@ -/* - -Jappix - An open social platform -These are the common JS script for Jappix - -------------------------------------------------- - -License: AGPL -Authors: Vanaryon, olivierm -Last revision: 24/06/11 - -*/ - -// Checks if an element exists in the DOM -function exists(selector) { - if(jQuery(selector).size() > 0) - return true; - else - return false; -} - -// Checks if Jappix is connected -function isConnected() { - if((typeof con != 'undefined') && con && con.connected()) - return true; - - return false; -} - -// Checks if Jappix has focus -function isFocused() { - try { - if(document.hasFocus()) - return true; - - return false; - } - - catch(e) { - return true; - } -} - -// Generates the good XID -function generateXID(xid, type) { - // XID needs to be transformed - if(xid && (xid.indexOf('@') == -1)) { - // Groupchat - if(type == 'groupchat') - return xid + '@' + HOST_MUC; - - // One-to-one chat - if(xid.indexOf('.') == -1) - return xid + '@' + HOST_MAIN; - - // It might be a gateway? - return xid; - } - - // Nothing special (yet bare XID) - return xid; -} - -// Gets the asked translated string -function _e(string) { - return string; -} - -// Replaces '%s' to a given value for a translated string -function printf(string, value) { - return string.replace('%s', value); -} - -// Properly explodes a string with a given character -function explodeThis(toEx, toStr, i) { - // Get the index of our char to explode - var index = toStr.indexOf(toEx); - - // We split if necessary the string - if(index != -1) { - if(i == 0) - toStr = toStr.substr(0, index); - else - toStr = toStr.substr(index + 1); - } - - // We return the value - return toStr; -} - -// Cuts the resource of a XID -function cutResource(aXID) { - return explodeThis('/', aXID, 0); -} - -// Gets the resource of a XID -function thisResource(aXID) { - // Any resource? - if(aXID.indexOf('/') != -1) - return explodeThis('/', aXID, 1); - - // No resource - return ''; -} - -// Does stringprep on a string -function stringPrep(string) { - // Replacement arrays - var invalid = new Array('Å ', 'Å¡', 'Ä', 'Ä‘', 'Ž', 'ž', 'ÄŒ', 'Ä', 'Ć', 'ć', 'À', 'Ã', 'Â', 'Ã', 'Ä', 'Ã…', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'ÃŒ', 'Ã', 'ÃŽ', 'Ã', 'Ñ', 'Ã’', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ãœ', 'Ã', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'Ã¥', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ý', 'þ', 'ÿ', 'Å”', 'Å•'); - - var valid = new Array('S', 's', 'Dj', 'dj', 'Z', 'z', 'C', 'c', 'C', 'c', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 'B', 'Ss', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'y', 'b', 'y', 'R', 'r'); - - // Compute a new string - for(i in invalid) - string = string.replace(invalid[i], valid[i]); - - return string; -} - -// Encodes quotes in a string -function encodeQuotes(str) { - return (str + '').replace(/"/g, '"'); -} - -// Gets the bare XID from a XID -function bareXID(xid) { - // Cut the resource - xid = cutResource(xid); - - // Launch the stringprep - xid = stringPrep(xid); - - // Set the XID to lower case - xid = xid.toLowerCase(); - - return xid; -} - -// Gets the full XID from a XID -function fullXID(xid) { - // Normalizes the XID - var full = bareXID(xid); - var resource = thisResource(xid); - - // Any resource? - if(resource) - full += '/' + resource; - - return full; -} - -// Gets the nick from a XID -function getXIDNick(aXID) { - return explodeThis('@', aXID, 0); -} - -// Gets the host from a XID -function getXIDHost(aXID) { - return explodeThis('@', aXID, 1); -} - -// Checks if we are in developer mode -function isDeveloper() { - if(DEVELOPER == 'on') - return true; - - return false; -} - -// Checks if anonymous mode is allowed -function allowedAnonymous() { - if(ANONYMOUS == 'on') - return true; - - return false; -} - -// Checks if host is locked -function lockHost() { - if(LOCK_HOST == 'on') - return true; - - return false; -} - -// Gets the full XID of the user -function getXID() { - // Return the XID of the user - if(con.username && con.domain) - return con.username + '@' + con.domain; - - return ''; -} - -// Generates the colors for a given user XID -function generateColor(xid) { - var colors = new Array( - 'ac0000', - 'a66200', - '007703', - '00705f', - '00236b', - '4e005c' - ); - - var number = 0; - - for(var i = 0; i < xid.length; i++) - number += xid.charCodeAt(i); - - var color = '#' + colors[number % (colors.length)]; - - return color; -} - -// Checks if the XID is a gateway -function isGateway(xid) { - if(xid.indexOf('@') != -1) - return false; - - return true; -} - -// Gets the from attribute of a stanza (overrides some servers like Prosody missing from attributes) -function getStanzaFrom(stanza) { - var from = stanza.getFrom(); - - // No from, we assume this is our XID - if(!from) - from = getXID(); - - return from; -} - -// Logs a given data in the console -function logThis(data, level) { - // Console not available - if(!isDeveloper() || (typeof(console) == 'undefined')) - return false; - - // Switch the log level - switch(level) { - // Debug - case 0: - console.debug(data); - - break; - - // Error - case 1: - console.error(data); - - break; - - // Warning - case 2: - console.warn(data); - - break; - - // Information - case 3: - console.info(data); - - break; - - // Default log level - default: - console.log(data); - - break; - } - - return true; -} - -// Gets the current Jappix app. location -function getJappixLocation() { - var url = window.location.href; - - // If the URL has variables, remove them - if(url.indexOf('?') != -1) - url = url.split('?')[0]; - if(url.indexOf('#') != -1) - url = url.split('#')[0]; - - // No "/" at the end - if(!url.match(/(.+)\/$/)) - url += '/'; - - return url; -} - -// Removes spaces at the beginning & the end of a string -function trim(str) { - return str.replace(/^\s+/g,'').replace(/\s+$/g,''); -} - -// Adds a zero to a date when needed -function padZero(i) { - // Negative number (without first 0) - if(i > -10 && i < 0) - return '-0' + (i * -1); - - // Positive number (without first 0) - if(i < 10 && i >= 0) - return '0' + i; - - // All is okay - return i; -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/connection.js b/sources/extend/addon/matrix/jappixmini/jappix/js/connection.js deleted file mode 100644 index 85a718c5..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/connection.js +++ /dev/null @@ -1,526 +0,0 @@ -/* - -Jappix - An open social platform -These are the connection JS script for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 29/08/11 - -*/ - -// Does the user login -var CURRENT_SESSION = false; - -function doLogin(lNick, lServer, lPass, lResource, lPriority, lRemember) { - try { - // We remove the not completed class to avoid problems - $('#home .loginer input').removeClass('please-complete'); - - // We add the login wait div - showGeneralWait(); - - // We define the http binding parameters - oArgs = new Object(); - - if(HOST_BOSH_MAIN) - oArgs.httpbase = HOST_BOSH_MAIN; - else - oArgs.httpbase = HOST_BOSH; - - // We create the new http-binding connection - con = new JSJaCHttpBindingConnection(oArgs); - - // And we handle everything that happen - setupCon(con); - - // Generate a resource - var random_resource = getDB('session', 'resource'); - - if(!random_resource) - random_resource = lResource + ' (' + (new Date()).getTime() + ')'; - - // We retrieve what the user typed in the login inputs - oArgs = new Object(); - oArgs.domain = trim(lServer); - oArgs.username = trim(lNick); - oArgs.resource = random_resource; - oArgs.pass = lPass; - oArgs.secure = true; - oArgs.xmllang = XML_LANG; - - // Store the resource (for reconnection) - setDB('session', 'resource', random_resource); - - // Generate a session XML to be stored - session_xml = 'true' + lServer.htmlEnc() + '' + lNick.htmlEnc() + '' + lResource.htmlEnc() + '' + lPass.htmlEnc() + '' + lPriority.htmlEnc() + ''; - - // Save the session parameters (for reconnect if network issue) - CURRENT_SESSION = session_xml; - - // Remember me? - if(lRemember) - setDB('remember', 'session', 1); - - // We store the infos of the user into the data-base - setDB('priority', 1, lPriority); - - // We connect ! - con.connect(oArgs); - - // Change the page title - pageTitle('wait'); - - logThis('Jappix is connecting...', 3); - } - - catch(e) { - // Logs errors - logThis('Error while logging in: ' + e, 1); - - // Reset Jappix - destroyTalkPage(); - - // Open an unknown error - openThisError(2); - } - - finally { - return false; - } -} - -// Handles the user registration -function handleRegistered() { - logThis('A new account has been registered.', 3); - - // We remove the waiting image - removeGeneralWait(); - - // Reset the title - pageTitle('home'); - - // We show the success information - $('#home .registerer .success').fadeIn('fast'); - - // We quit the session - logout(); -} - -// Does the user registration -function doRegister(username, domain, pass) { - logThis('Trying to register an account...', 3); - - try { - // We define the http binding parameters - oArgs = new Object(); - - if(HOST_BOSH_MAIN) - oArgs.httpbase = HOST_BOSH_MAIN; - else - oArgs.httpbase = HOST_BOSH; - - // We create the new http-binding connection - con = new JSJaCHttpBindingConnection(oArgs); - - // We setup the connection ! - con.registerHandler('onconnect', handleRegistered); - con.registerHandler('onerror', handleError); - - // We retrieve what the user typed in the register inputs - oArgs = new Object(); - oArgs.domain = trim(domain); - oArgs.username = trim(username); - oArgs.resource = JAPPIX_RESOURCE + ' Register (' + (new Date()).getTime() + ')'; - oArgs.pass = pass; - oArgs.register = true; - oArgs.secure = true; - oArgs.xmllang = XML_LANG; - - con.connect(oArgs); - - // We change the registered information text - $('#home .homediv.registerer').append( - '
' + - _e("You have been registered, here is your XMPP address:") + ' ' + con.username.htmlEnc() + '@' + con.domain.htmlEnc() + ' - ' + _e("Login") + '' + - '
' - ); - - // Login link - $('#home .homediv.registerer .success a').click(function() { - return doLogin(con.username, con.domain, con.pass, con.resource, '10', false); - }); - - // Show the waiting image - showGeneralWait(); - - // Change the page title - pageTitle('wait'); - } - - catch(e) { - // Logs errors - logThis(e, 1); - } - - finally { - return false; - } -} - -// Does the user anonymous login -function doAnonymous() { - logThis('Trying to login anonymously...', 3); - - var aPath = '#home .anonymouser '; - var room = $(aPath + '.room').val(); - var nick = $(aPath + '.nick').val(); - - // If the form is correctly completed - if(room && nick) { - // We remove the not completed class to avoid problems - $('#home .anonymouser input').removeClass('please-complete'); - - // Redirect the user to the anonymous room - window.location.href = JAPPIX_LOCATION + '?r=' + room + '&n=' + nick; - } - - // We check if the form is entirely completed - else { - $(aPath + 'input[type=text]').each(function() { - var select = $(this); - - if(!select.val()) - $(document).oneTime(10, function() { - select.addClass('please-complete').focus(); - }); - else - select.removeClass('please-complete'); - }); - } - - return false; -} - -// Handles the user connected event -var CONNECTED = false; - -function handleConnected() { - logThis('Jappix is now connected.', 3); - - // Connection markers - CONNECTED = true; - RECONNECT_TRY = 0; - RECONNECT_TIMER = 0; - - // We hide the home page - $('#home').hide(); - - // Not resumed? - if(!RESUME) { - // Remember the session? - if(getDB('remember', 'session')) - setPersistent('session', 1, CURRENT_SESSION); - - // We show the chatting app. - createTalkPage(); - - // We reset the homepage - switchHome('default'); - - // We get all the other things - getEverything(); - - // Set last activity stamp - LAST_ACTIVITY = getTimeStamp(); - } - - // Resumed - else { - // Send our presence - presenceSend(); - - // Change the title - updateTitle(); - } - - // Remove the waiting item - removeGeneralWait(); -} - -// Handles the user disconnected event -function handleDisconnected() { - logThis('Jappix is now disconnected.', 3); - - // Normal disconnection - if(!CURRENT_SESSION && !CONNECTED) - destroyTalkPage(); -} - -// Setups the normal connection -function setupCon(con) { - // We setup all the necessary handlers for the connection - con.registerHandler('message', handleMessage); - con.registerHandler('presence', handlePresence); - con.registerHandler('iq', handleIQ); - con.registerHandler('onconnect', handleConnected); - con.registerHandler('onerror', handleError); - con.registerHandler('ondisconnect', handleDisconnected); -} - -// Logouts from the server -function logout() { - // We are not connected - if(!isConnected()) - return false; - - // Disconnect from the XMPP server - con.disconnect(); - - logThis('Jappix is disconnecting...', 3); -} - -// Terminates a session -function terminate() { - if(!isConnected()) - return; - - // Clear temporary session storage - resetConMarkers(); - - // Show the waiting item (useful if BOSH is sloooow) - showGeneralWait(); - - // Change the page title - pageTitle('wait'); - - // Disconnect from the XMPP server - logout(); -} - -// Quitss a session -function quit() { - if(!isConnected()) - return; - - // We show the waiting image - showGeneralWait(); - - // Change the page title - pageTitle('wait'); - - // We disconnect from the XMPP server - logout(); -} - -// Creates the reconnect pane -var RECONNECT_TRY = 0; -var RECONNECT_TIMER = 0; - -function createReconnect(mode) { - logThis('This is not a normal disconnection, show the reconnect pane...', 1); - - // Reconnect pane not yet displayed? - if(!exists('#reconnect')) { - // Blur the focused input/textarea/select - $('input, select, textarea').blur(); - - // Create the HTML code - var html = '
' + - '
' + - _e("Due to a network issue, you were disconnected. What do you want to do now?"); - - // Can we cancel reconnection? - if(mode == 'normal') - html += '' + _e("Cancel") + ''; - - html += '' + _e("Reconnect") + '' + - '
'; - - // Append the code - $('body').append(html); - - // Click events - if(mode == 'normal') - $('#reconnect a.finish.cancel').click(function() { - return cancelReconnect(); - }); - - $('#reconnect a.finish.reconnect').click(function() { - return acceptReconnect(mode); - }); - - // Try to reconnect automatically after a while - if(RECONNECT_TRY < 5) - RECONNECT_TIMER = 5 + (5 * RECONNECT_TRY); - else - RECONNECT_TIMER = 120; - - // Change the try number - RECONNECT_TRY++; - - // Fire the event! - $('#reconnect a.finish.reconnect').everyTime('1s', function() { - // We can reconnect! - if(RECONNECT_TIMER == 0) - return acceptReconnect(mode); - - // Button text - if(RECONNECT_TIMER <= 10) - $(this).text(_e("Reconnect") + ' (' + RECONNECT_TIMER + ')'); - - // Remove 1 second - RECONNECT_TIMER--; - }); - - // Page title - updateTitle(); - } -} - -// Reconnects the user if he was disconnected (network issue) -var RESUME = false; - -function acceptReconnect(mode) { - logThis('Trying to reconnect the user...', 3); - - // Resume marker - RESUME = true; - - // Show waiting item - showGeneralWait(); - - // Reset some various stuffs - var groupchats = '#page-engine .page-engine-chan[data-type=groupchat]'; - $(groupchats + ' .list .role').hide(); - $(groupchats + ' .one-group, ' + groupchats + ' .list .user').remove(); - $(groupchats).attr('data-initial', 'false'); - - // Stop the timer - $('#reconnect a.finish.reconnect').stopTime(); - - // Remove the reconnect pane - $('#reconnect').remove(); - - // Try to login again - if(mode == 'normal') - loginFromSession(XMLFromString(CURRENT_SESSION)); - else if(mode == 'anonymous') - anonymousLogin(HOST_ANONYMOUS); - - return false; -} - -// Cancel the reconnection of user account (network issue) -function cancelReconnect() { - logThis('User has canceled automatic reconnection...', 3); - - // Stop the timer - $('#reconnect a.finish.reconnect').stopTime(); - - // Remove the reconnect pane - $('#reconnect').remove(); - - // Destroy the talk page - destroyTalkPage(); - - // Renitialize the previous session parameters - resetConMarkers(); - - return false; -} - -// Clears session reminder database -function clearLastSession() { - // Clear temporary storage - resetConMarkers(); - - // Clear persistent storage - if($(XMLFromString(getPersistent('session', 1))).find('stored').text() == 'true') - removePersistent('session', 1); -} - -// Resets the connection markers -function resetConMarkers() { - CURRENT_SESSION = false; - CONNECTED = false; - RESUME = false; - RECONNECT_TRY = 0; - RECONNECT_TIMER = 0; -} - -// Logins from a saved session -function loginFromSession(data) { - // Select the data - var session = $(data); - - // Fire the login event - doLogin( - session.find('username').text(), - session.find('domain').text(), - session.find('password').text(), - session.find('resource').text(), - session.find('priority').text(), - false - ); -} - -// Quits a session normally -function normalQuit() { - // Reset our database - clearLastSession(); - - // We quit the current session - quit(); - - // We show an info - openThisInfo(3); - - return false; -} - -// Gets all the users stuffs -function getEverything() { - getFeatures(); - getRoster(); - listPrivacy(); - getStorage(NS_ROSTERNOTES); -} - -// Plugin launcher -function launchConnection() { - // Logouts when Jappix is closed - $(window).bind('beforeunload', terminate); - - // Nothing to do when anonymous! - if(isAnonymous()) - return; - - // Try to resume a stored session, if not anonymous - var session = XMLFromString(getPersistent('session', 1)); - - if($(session).find('stored').text() == 'true') { - // Hide the homepage - $('#home').hide(); - - // Show the waiting icon - showGeneralWait(); - - // Login! - loginFromSession(session); - - logThis('Saved session found, resuming it...', 3); - } - - // Not connected, maybe a XMPP link is submitted? - else if((parent.location.hash != '#OK') && LINK_VARS['x']) { - switchHome('loginer'); - - logThis('A XMPP link is set, switch to login page.', 3); - } -} - -// Launch this plugin! -$(document).ready(launchConnection); diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/constants.js b/sources/extend/addon/matrix/jappixmini/jappix/js/constants.js deleted file mode 100644 index bc59bd75..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/constants.js +++ /dev/null @@ -1,211 +0,0 @@ -/* - -Jappix - An open social platform -These are the constants JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Authors: Stefan Strigler, Vanaryon -Last revision: 26/08/11 - -*/ - -// XMPP XMLNS attributes -var NS_PROTOCOL = 'http://jabber.org/protocol/'; -var NS_FEATURES = 'http://jabber.org/features/'; -var NS_CLIENT = 'jabber:client'; -var NS_IQ = 'jabber:iq:'; -var NS_X = 'jabber:x:'; -var NS_IETF = 'urn:ietf:params:xml:ns:xmpp-'; -var NS_XMPP = 'urn:xmpp:'; - -var NS_STORAGE = 'storage:'; -var NS_BOOKMARKS = NS_STORAGE + 'bookmarks'; -var NS_ROSTERNOTES = NS_STORAGE + 'rosternotes'; - -var NS_JAPPIX = 'jappix:'; -var NS_INBOX = NS_JAPPIX + 'inbox'; -var NS_OPTIONS = NS_JAPPIX + 'options'; - -var NS_DISCO_ITEMS = NS_PROTOCOL + 'disco#items'; -var NS_DISCO_INFO = NS_PROTOCOL + 'disco#info'; -var NS_VCARD = 'vcard-temp'; -var NS_VCARD_P = NS_VCARD + ':x:update'; -var NS_AUTH = NS_IQ + 'auth'; -var NS_AUTH_ERROR = NS_IQ + 'auth:error'; -var NS_REGISTER = NS_IQ + 'register'; -var NS_SEARCH = NS_IQ + 'search'; -var NS_ROSTER = NS_IQ + 'roster'; -var NS_PRIVACY = NS_IQ + 'privacy'; -var NS_PRIVATE = NS_IQ + 'private'; -var NS_VERSION = NS_IQ + 'version'; -var NS_TIME = NS_IQ + 'time'; -var NS_LAST = NS_IQ + 'last'; -var NS_IQDATA = NS_IQ + 'data'; -var NS_XDATA = NS_X + 'data'; -var NS_IQOOB = NS_IQ + 'oob'; -var NS_XOOB = NS_X + 'oob'; -var NS_DELAY = NS_X + 'delay'; -var NS_EXPIRE = NS_X + 'expire'; -var NS_EVENT = NS_X + 'event'; -var NS_XCONFERENCE = NS_X + 'conference'; -var NS_STATS = NS_PROTOCOL + 'stats'; -var NS_MUC = NS_PROTOCOL + 'muc'; -var NS_MUC_USER = NS_MUC + '#user'; -var NS_MUC_ADMIN = NS_MUC + '#admin'; -var NS_MUC_OWNER = NS_MUC + '#owner'; -var NS_MUC_CONFIG = NS_MUC + '#roomconfig'; -var NS_PUBSUB = NS_PROTOCOL + 'pubsub'; -var NS_PUBSUB_EVENT = NS_PUBSUB + '#event'; -var NS_PUBSUB_OWNER = NS_PUBSUB + '#owner'; -var NS_PUBSUB_NMI = NS_PUBSUB + '#node-meta-info'; -var NS_PUBSUB_NC = NS_PUBSUB + '#node_config'; -var NS_PUBSUB_RI = NS_PUBSUB + '#retrieve-items'; -var NS_COMMANDS = NS_PROTOCOL + 'commands'; -var NS_BOSH = NS_PROTOCOL + 'httpbind'; -var NS_STREAM = 'http://etherx.jabber.org/streams'; -var NS_URN_TIME = NS_XMPP + 'time'; -var NS_URN_PING = NS_XMPP + 'ping'; -var NS_URN_ADATA = NS_XMPP + 'avatar:data'; -var NS_URN_AMETA = NS_XMPP + 'avatar:metadata'; -var NS_URN_MBLOG = NS_XMPP + 'microblog:0'; -var NS_URN_INBOX = NS_XMPP + 'inbox'; -var NS_URN_ARCHIVE = NS_XMPP + 'archive'; -var NS_URN_AR_PREF = NS_URN_ARCHIVE + ':pref'; -var NS_URN_AR_AUTO = NS_URN_ARCHIVE + ':auto'; -var NS_URN_AR_MANUAL = NS_URN_ARCHIVE + ':manual'; -var NS_URN_AR_MANAGE = NS_URN_ARCHIVE + ':manage'; -var NS_URN_DELAY = NS_XMPP + 'delay'; -var NS_URN_RECEIPTS = NS_XMPP + 'receipts'; -var NS_RSM = NS_PROTOCOL + 'rsm'; -var NS_IPV6 = 'ipv6'; -var NS_XHTML = 'http://www.w3.org/1999/xhtml'; -var NS_XHTML_IM = NS_PROTOCOL + 'xhtml-im'; -var NS_CHATSTATES = NS_PROTOCOL + 'chatstates'; -var NS_HTTP_AUTH = NS_PROTOCOL + 'http-auth'; -var NS_ROSTERX = NS_PROTOCOL + 'rosterx'; -var NS_MOOD = NS_PROTOCOL + 'mood'; -var NS_ACTIVITY = NS_PROTOCOL + 'activity'; -var NS_TUNE = NS_PROTOCOL + 'tune'; -var NS_GEOLOC = NS_PROTOCOL + 'geoloc'; -var NS_NICK = NS_PROTOCOL + 'nick'; -var NS_NOTIFY = '+notify'; -var NS_CAPS = NS_PROTOCOL + 'caps'; -var NS_ATOM = 'http://www.w3.org/2005/Atom'; - -var NS_STANZAS = NS_IETF + 'stanzas'; -var NS_STREAMS = NS_IETF + 'streams'; - -var NS_TLS = NS_IETF + 'tls'; -var NS_SASL = NS_IETF + 'sasl'; -var NS_SESSION = NS_IETF + 'session'; -var NS_BIND = NS_IETF + 'bind'; - -var NS_FEATURE_IQAUTH = NS_FEATURES + 'iq-auth'; -var NS_FEATURE_IQREGISTER = NS_FEATURES + 'iq-register'; -var NS_FEATURE_COMPRESS = NS_FEATURES + 'compress'; - -var NS_COMPRESS = NS_PROTOCOL + 'compress'; - -// Available locales -var LOCALES_AVAILABLE_ID = new Array(); -var LOCALES_AVAILABLE_NAMES = new Array(); - -// XML lang -var XML_LANG = null; - -// Jappix parameters -var JAPPIX_STATIC = null; -var JAPPIX_VERSION = null; -var JAPPIX_MAX_FILE_SIZE = null; -var JAPPIX_MAX_UPLOAD = null; - -// Jappix main configuration -var SERVICE_NAME = null; -var SERVICE_DESC = null; -var JAPPIX_RESOURCE = null; -var LOCK_HOST = null; -var ANONYMOUS = null; -var REGISTRATION = null; -var BOSH_PROXY = null; -var MANAGER_LINK = null; -var GROUPCHATS_JOIN = null; -var ENCRYPTION = null; -var HTTPS_STORAGE = null; -var HTTPS_FORCE = null; -var COMPRESSION = null; -var MULTI_FILES = null; -var DEVELOPER = null; - -// Jappix hosts configuration -var HOST_MAIN = null; -var HOST_MUC = null; -var HOST_PUBSUB = null; -var HOST_VJUD = null; -var HOST_ANONYMOUS = null; -var HOST_BOSH = null; -var HOST_BOSH_MAIN = null; -var HOST_BOSH_MINI = null; -var HOST_STATIC = null; -var HOST_UPLOAD = null; - -// Anonymous mode -var ANONYMOUS_ROOM = null; -var ANONYMOUS_NICK = null; - -// Node parameters -var JAPPIX_LOCATION = getJappixLocation(); - -// XMPP error stanzas -function STANZA_ERROR(code, type, cond) { - if (window == this) - return new STANZA_ERROR(code, type, cond); - - this.code = code; - this.type = type; - this.cond = cond; -} - -var ERR_BAD_REQUEST = - STANZA_ERROR('400', 'modify', 'bad-request'); -var ERR_CONFLICT = - STANZA_ERROR('409', 'cancel', 'conflict'); -var ERR_FEATURE_NOT_IMPLEMENTED = - STANZA_ERROR('501', 'cancel', 'feature-not-implemented'); -var ERR_FORBIDDEN = - STANZA_ERROR('403', 'auth', 'forbidden'); -var ERR_GONE = - STANZA_ERROR('302', 'modify', 'gone'); -var ERR_INTERNAL_SERVER_ERROR = - STANZA_ERROR('500', 'wait', 'internal-server-error'); -var ERR_ITEM_NOT_FOUND = - STANZA_ERROR('404', 'cancel', 'item-not-found'); -var ERR_JID_MALFORMED = - STANZA_ERROR('400', 'modify', 'jid-malformed'); -var ERR_NOT_ACCEPTABLE = - STANZA_ERROR('406', 'modify', 'not-acceptable'); -var ERR_NOT_ALLOWED = - STANZA_ERROR('405', 'cancel', 'not-allowed'); -var ERR_NOT_AUTHORIZED = - STANZA_ERROR('401', 'auth', 'not-authorized'); -var ERR_PAYMENT_REQUIRED = - STANZA_ERROR('402', 'auth', 'payment-required'); -var ERR_RECIPIENT_UNAVAILABLE = - STANZA_ERROR('404', 'wait', 'recipient-unavailable'); -var ERR_REDIRECT = - STANZA_ERROR('302', 'modify', 'redirect'); -var ERR_REGISTRATION_REQUIRED = - STANZA_ERROR('407', 'auth', 'registration-required'); -var ERR_REMOTE_SERVER_NOT_FOUND = - STANZA_ERROR('404', 'cancel', 'remote-server-not-found'); -var ERR_REMOTE_SERVER_TIMEOUT = - STANZA_ERROR('504', 'wait', 'remote-server-timeout'); -var ERR_RESOURCE_CONSTRAINT = - STANZA_ERROR('500', 'wait', 'resource-constraint'); -var ERR_SERVICE_UNAVAILABLE = - STANZA_ERROR('503', 'cancel', 'service-unavailable'); -var ERR_SUBSCRIPTION_REQUIRED = - STANZA_ERROR('407', 'auth', 'subscription-required'); -var ERR_UNEXPECTED_REQUEST = - STANZA_ERROR('400', 'wait', 'unexpected-request'); diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/dataform.js b/sources/extend/addon/matrix/jappixmini/jappix/js/dataform.js deleted file mode 100644 index 7fbea89d..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/dataform.js +++ /dev/null @@ -1,921 +0,0 @@ -/* - -Jappix - An open social platform -These are the dataform JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 28/08/11 - -*/ - -// Gets the defined dataform elements -function dataForm(host, type, node, action, target) { - // Clean the current session - cleanDataForm(target); - - // We tell the user that a search has been launched - $('#' + target + ' .wait').show(); - - // If we have enough data - if(host && type) { - // Generate a session ID - var sessionID = Math.round(100000.5 + (((900000.49999) - (100000.5)) * Math.random())); - var id = target + '-' + sessionID + '-' + genID(); - $('.' + target + '-results').attr('data-session', target + '-' + sessionID); - - // We request the service item - var iq = new JSJaCIQ(); - iq.setID(id); - iq.setTo(host); - iq.setType('get'); - - // MUC admin query - if(type == 'muc') { - iq.setQuery(NS_MUC_OWNER); - con.send(iq, handleDataFormMuc); - } - - // Browse query - else if(type == 'browse') { - var iqQuery = iq.setQuery(NS_DISCO_ITEMS); - - if(node) - iqQuery.setAttribute('node', node); - - con.send(iq, handleDataFormBrowse); - } - - // Command - else if(type == 'command') { - var items; - - if(node) - items = iq.appendNode('command', {'node': node, 'xmlns': NS_COMMANDS}); - - else { - items = iq.setQuery(NS_DISCO_ITEMS); - items.setAttribute('node', NS_COMMANDS); - } - - if(action && node) { - iq.setType('set'); - items.setAttribute('action', action); - } - - con.send(iq, handleDataFormCommand); - } - - // Search query - else if(type == 'search') { - iq.setQuery(NS_SEARCH); - con.send(iq, handleDataFormSearch); - } - - // Subscribe query - else if(type == 'subscribe') { - iq.setQuery(NS_REGISTER); - con.send(iq, handleDataFormSubscribe); - } - - // Join - else if(type == 'join') { - if(target == 'discovery') - closeDiscovery(); - - checkChatCreate(host, 'groupchat'); - } - } - - return false; -} - -// Sends a given dataform -function sendDataForm(type, action, x_type, id, xid, node, sessionid, target) { - // Path - var pathID = '#' + target + ' .results[data-session=' + id + ']'; - - // New IQ - var iq = new JSJaCIQ(); - iq.setTo(xid); - iq.setType('set'); - - // Set the correct query - var query; - - if(type == 'subscribe') - iqQuery = iq.setQuery(NS_REGISTER); - else if(type == 'search') - iqQuery = iq.setQuery(NS_SEARCH); - else if(type == 'command') - iqQuery = iq.appendNode('command', {'xmlns': NS_COMMANDS, 'node': node, 'sessionid': sessionid, 'action': action}); - else if(type == 'x') - iqQuery = iq.setQuery(NS_MUC_OWNER); - - // Build the XML document - if(action != 'cancel') { - // No X node - if(exists('input.register-special') && (type == 'subscribe')) { - $('input.register-special').each(function() { - var iName = $(this).attr('name'); - var iValue = $(this).val(); - - iqQuery.appendChild(iq.buildNode(iName, {'xmlns': NS_REGISTER}, iValue)); - }); - } - - // Can create the X node - else { - var iqX = iqQuery.appendChild(iq.buildNode('x', {'xmlns': NS_XDATA, 'type': x_type})); - - // Each input - $(pathID + ' .oneresult input, ' + pathID + ' .oneresult textarea, ' + pathID + ' .oneresult select').each(function() { - // Get the current input value - var iVar = $(this).attr('name'); - var iType = $(this).attr('data-type'); - var iValue = $(this).val(); - - // Build a new field node - var field = iqX.appendChild(iq.buildNode('field', {'var': iVar, 'type': iType, 'xmlns': NS_XDATA})); - - // Boolean input? - if(iType == 'boolean') { - if($(this).filter(':checked').size()) - iValue = '1'; - else - iValue = '0'; - } - - // JID-multi input? - if(iType == 'jid-multi') { - // Values array - var xid_arr = [iValue]; - var xid_check = []; - - // Try to split it - if(iValue.indexOf(',') != -1) - xid_arr = iValue.split(','); - - // Append each value to the XML document - for(i in xid_arr) { - // Get the current value - xid_current = trim(xid_arr[i]); - - // No current value? - if(!xid_current) - continue; - - // Add the current value - if(!existArrayValue(xid_check, xid_current)) { - xid_check.push(xid_current); - field.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, xid_current)); - } - } - } - - // List-multi selector? - else if(iType == 'list-multi') { - // Any value? - if(iValue && iValue.length) { - for(i in iValue) - field.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, iValue[i])); - } - } - - // Other inputs? - else - field.appendChild(iq.buildNode('value', {'xmlns': NS_XDATA}, iValue)); - }); - } - } - - // Clean the current session - cleanDataForm(target); - - // Show the waiting item - $('#' + target + ' .wait').show(); - - // Change the ID of the current discovered item - var iqID = target + '-' + genID(); - $('#' + target + ' .' + target + '-results').attr('data-session', iqID); - iq.setID(iqID); - - // Send the IQ - if(type == 'subscribe') - con.send(iq, handleDataFormSubscribe); - else if(type == 'search') - con.send(iq, handleDataFormSearch); - else if(type == 'command') - con.send(iq, handleDataFormCommand); - else - con.send(iq); - - return false; -} - -// Displays the good dataform buttons -function buttonsDataForm(type, action, id, xid, node, sessionid, target, pathID) { - // No need to use buttons? - if(type == 'muc') - return; - - // Override the "undefined" output - if(!id) - id = ''; - if(!xid) - xid = ''; - if(!node) - node = ''; - if(!sessionid) - sessionid = ''; - - // We generate the buttons code - var buttonsCode = '
'; - - if(action == 'submit') { - if((target == 'adhoc') && (type == 'command')) { - buttonsCode += '' + _e("Submit") + ''; - - // When keyup on one text input - $(pathID + ' input').keyup(function(e) { - if(e.keyCode == 13) { - sendDataForm(type, 'execute', 'submit', id, xid, node, sessionid, target); - - return false; - } - }); - } - - else { - buttonsCode += '' + _e("Submit") + ''; - - // When keyup on one text input - $(pathID + ' input').keyup(function(e) { - if(e.keyCode == 13) { - sendDataForm(type, 'submit', 'submit', id, xid, node, sessionid, target); - - return false; - } - }); - } - } - - if((action == 'submit') && (type != 'subscribe') && (type != 'search')) - buttonsCode += '' + _e("Cancel") + ''; - - if(((action == 'back') || (type == 'subscribe') || (type == 'search')) && (target == 'discovery')) - buttonsCode += '' + _e("Close") + ''; - - if((action == 'back') && ((target == 'welcome') || (target == 'directory'))) - buttonsCode += '' + _e("Previous") + ''; - - if((action == 'back') && (target == 'adhoc')) - buttonsCode += '' + _e("Previous") + ''; - - buttonsCode += '
'; - - // We display the buttons code - $(pathID).append(buttonsCode); - - // If no submit link, lock the form - if(!exists(pathID + ' a.submit')) - $(pathID + ' input, ' + pathID + ' textarea').attr('readonly', true); -} - -// Handles the MUC dataform -function handleDataFormMuc(iq) { - handleErrorReply(iq); - handleDataFormContent(iq, 'muc'); -} - -// Handles the browse dataform -function handleDataFormBrowse(iq) { - handleErrorReply(iq); - handleDataFormContent(iq, 'browse'); -} - -// Handles the command dataform -function handleDataFormCommand(iq) { - handleErrorReply(iq); - handleDataFormContent(iq, 'command'); -} - -// Handles the subscribe dataform -function handleDataFormSubscribe(iq) { - handleErrorReply(iq); - handleDataFormContent(iq, 'subscribe'); -} - -// Handles the search dataform -function handleDataFormSearch(iq) { - handleErrorReply(iq); - handleDataFormContent(iq, 'search'); -} - -// Handles the dataform content -function handleDataFormContent(iq, type) { - // Get the ID - var sID = iq.getID(); - - // Get the target - var splitted = sID.split('-'); - var target = splitted[0]; - var sessionID = target + '-' + splitted[1]; - var from = fullXID(getStanzaFrom(iq)); - var pathID = '#' + target + ' .results[data-session=' + sessionID + ']'; - - // If an error occured - if(!iq || (iq.getType() != 'result')) - noResultDataForm(pathID); - - // If we got something okay - else { - var handleXML = iq.getNode(); - - if(type == 'browse') { - if($(handleXML).find('item').attr('jid')) { - // Get the query node - var queryNode = $(handleXML).find('query').attr('node'); - - $(handleXML).find('item').each(function() { - // We parse the received xml - var itemHost = $(this).attr('jid'); - var itemNode = $(this).attr('node'); - var itemName = $(this).attr('name'); - var itemHash = hex_md5(itemHost); - - // Node - if(itemNode) - $(pathID).append( - '
' + - '
' + itemNode.htmlEnc() + '
' + - '
' - ); - - // Item - else if(queryNode && itemName) - $(pathID).append( - '
' + - '
' + itemName.htmlEnc() + '
' + - '
' - ); - - // Item with children - else { - // We display the waiting element - $(pathID + ' .disco-wait .disco-category-title').after( - '
' + - '
' + - '
' + itemHost + '
' + - '
' + _e("Requesting this service...") + '
' + - '
' - ); - - // We display the category - $('#' + target + ' .disco-wait').show(); - - // We ask the server what's the service type - getDataFormType(itemHost, itemNode, sessionID); - } - }); - } - - // Else, there are no items for this query - else - noResultDataForm(pathID); - } - - else if((type == 'muc') || (type == 'search') || (type == 'subscribe') || ((type == 'command') && $(handleXML).find('command').attr('xmlns'))) { - // Get some values - var xCommand = $(handleXML).find('command'); - var bNode = xCommand.attr('node'); - var bSession = xCommand.attr('sessionid'); - var bStatus = xCommand.attr('status'); - var xRegister = $(handleXML).find('query[xmlns=' + NS_REGISTER + ']').text(); - var xElement = $(handleXML).find('x'); - - // Search done - if((xElement.attr('type') == 'result') && (type == 'search')) { - var bPath = pathID; - - // Display the result - $(handleXML).find('item').each(function() { - var bXID = $(this).find('field[var=jid] value:first').text(); - var bName = $(this).find('field[var=fn] value:first').text(); - var bCountry = $(this).find('field[var=ctry] value:first').text(); - var dName = bName; - - // Override "undefined" value - if(!bXID) - bXID = ''; - if(!bName) - bName = _e("Unknown name"); - if(!bCountry) - bCountry = _e("Unknown country"); - - // User hash - var bHash = hex_md5(bXID); - - // HTML code - var bHTML = '
' + - '
' + - '' + - '
' + - '
' + bName + '
' + - '
' + bCountry + '
' + - '
' + bXID + '
' + - '
'; - - // The buddy is not in our buddy list? - if(!exists('#buddy-list .buddy[data-xid=' + escape(bXID) + ']')) - bHTML += '' + _e("Add") + ''; - - // Chat button, if not in welcome/directory mode - if(target == 'discovery') - bHTML += '' + _e("Chat") + ''; - - // Close the HTML element - bHTML += '
'; - - $(bPath).append(bHTML); - - // Click events - $(bPath + ' .' + bHash + ' a').click(function() { - // Buddy add - if($(this).is('.one-add')) { - $(this).hide(); - - addThisContact(bXID, dName); - } - - // Buddy chat - if($(this).is('.one-chat')) { - if(target == 'discovery') - closeDiscovery(); - - checkChatCreate(bXID , 'chat', '', '', dName); - } - - return false; - }); - - // Get the user's avatar - if(bXID) - getAvatar(bXID, 'cache', 'true', 'forget'); - }); - - // No result? - if(!$(handleXML).find('item').size()) - noResultDataForm(pathID); - - // Previous button - buttonsDataForm(type, 'back', sessionID, from, bNode, bSession, target, pathID); - } - - // Command to complete - else if(xElement.attr('xmlns') || ((type == 'subscribe') && xRegister)) { - // We display the elements - fillDataForm(handleXML, sessionID); - - // We display the buttons - if(bStatus != 'completed') - buttonsDataForm(type, 'submit', sessionID, from, bNode, bSession, target, pathID); - else - buttonsDataForm(type, 'back', sessionID, from, bNode, bSession, target, pathID); - } - - // Command completed or subscription done - else if(((bStatus == 'completed') && (type == 'command')) || (!xRegister && (type == 'subscribe'))) { - // Display the good text - var cNote = $(xCommand).find('note'); - - // Any note? - if(cNote.size()) { - cNote.each(function() { - $(pathID).append( - '
' + $(this).text().htmlEnc() + '
' - ); - }); - } - - // Default text - else - $(pathID).append('
' + _e("Your form has been sent.") + '
'); - - // Display the back button - buttonsDataForm(type, 'back', sessionID, from, '', '', target, pathID); - - // Add the gateway to our roster if subscribed - if(type == 'subscribe') - addThisContact(from); - } - - // Command canceled - else if((bStatus == 'canceled') && (type == 'command')) { - if(target == 'discovery') - startDiscovery(); - else if(target == 'adhoc') - dataForm(from, 'command', '', '', 'adhoc'); - } - - // No items for this query - else - noResultDataForm(pathID); - } - - else if(type == 'command') { - if($(handleXML).find('item').attr('jid')) { - // We display the elements - $(handleXML).find('item').each(function() { - // We parse the received xml - var itemHost = $(this).attr('jid'); - var itemNode = $(this).attr('node'); - var itemName = $(this).attr('name'); - var itemHash = hex_md5(itemHost); - - // We display the waiting element - $(pathID).prepend( - '
' + - '
' + itemName + '
' + - '
»
' + - '
' - ); - }); - } - - // Else, there are no items for this query - else - noResultDataForm(pathID); - } - } - - // Focus on the first input - $(document).oneTime(10, function() { - $(pathID + ' input:visible:first').focus(); - }); - - // Hide the wait icon - $('#' + target + ' .wait').hide(); -} - -// Fills the dataform elements -function fillDataForm(xml, id) { - /* REF: http://xmpp.org/extensions/xep-0004.html */ - - // Initialize new vars - var target = id.split('-')[0]; - var pathID = '#' + target + ' .results[data-session=' + id + ']'; - var selector, is_dataform; - - // Is it a dataform? - if($(xml).find('x[xmlns=' + NS_XDATA + ']').size()) - is_dataform = true; - else - is_dataform = false; - - // Determines the good selector to use - if(is_dataform) - selector = $(xml).find('x[xmlns=' + NS_XDATA + ']'); - else - selector = $(xml); - - // Form title - selector.find('title').each(function() { - $(pathID).append( - '
' + $(this).text().htmlEnc() + '
' - ); - }); - - // Form instructions - selector.find('instructions').each(function() { - $(pathID).append( - '
' + $(this).text().htmlEnc() + '
' - ); - }); - - // Register? - if(!is_dataform) { - // Items to detect - var reg_names = [_e("Nickname"), _e("Name"), _e("Password"), _e("E-mail")]; - var reg_ids = ['username', 'name', 'password', 'email']; - - // Append these inputs - for(a in reg_names) { - selector.find(reg_ids[a]).each(function() { - $(pathID).append( - '
' + - '' + - '' + - '
' - ); - }); - } - - return false; - } - - // Dataform? - selector.find('field').each(function() { - // We parse the received xml - var type = $(this).attr('type'); - var label = $(this).attr('label'); - var field = $(this).attr('var'); - var value = $(this).find('value:first').text(); - var required = ''; - - // No value? - if(!field) - return; - - // Required input? - if($(this).find('required').size()) - required = ' required=""'; - - // Compatibility fix - if(!label) - label = field; - - if(!type) - type = ''; - - // Generate some values - var input; - var hideThis = ''; - - // Fixed field - if(type == 'fixed') - $(pathID).append('
' + value.htmlEnc() + '
'); - - else { - // Hidden field - if(type == 'hidden') { - hideThis = ' style="display: none;"'; - input = ''; - } - - // Boolean field - else if(type == 'boolean') { - var checked; - - if(value == '1') - checked = 'checked'; - else - checked = ''; - - input = ''; - } - - // List-single/list-multi field - else if((type == 'list-single') || (type == 'list-multi')) { - var multiple = ''; - - // Multiple options? - if(type == 'list-multi') - multiple = ' multiple=""'; - - // Append the select field - input = ''; - } - - // Text-multi field - else if(type == 'text-multi') - input = ''; - - // JID-multi field - else if(type == 'jid-multi') { - // Put the XID into an array - var xid_arr = []; - - $(this).find('value').each(function() { - var cValue = $(this).text(); - - if(!existArrayValue(xid_arr, cValue)) - xid_arr.push(cValue); - }); - - // Sort the array - xid_arr.sort(); - - // Create the input - var xid_value = ''; - - if(xid_arr.length) { - for(i in xid_arr) { - // Any pre-value - if(xid_value) - xid_value += ', '; - - // Add the current XID - xid_value += xid_arr[i]; - } - } - - input = ''; - } - - // Other stuffs that are similar - else { - // Text-single field - var iType = 'text'; - - // Text-private field - if(type == 'text-private') - iType = 'password'; - - // JID-single field - else if(type == 'jid-single') - iType = 'email'; - - input = ''; - } - - // Append the HTML markup for this field - $(pathID).append( - '
' + - '' + - input + - '
' - ); - } - }); - - return false; -} - -// Gets the dataform type -function getDataFormType(host, node, id) { - var iq = new JSJaCIQ(); - iq.setID(id + '-' + genID()); - iq.setTo(host); - iq.setType('get'); - - var iqQuery = iq.setQuery(NS_DISCO_INFO); - - if(node) - iqQuery.setAttribute('node', node); - - con.send(iq, handleThisBrowse); -} - -// Handles the browse stanza -function handleThisBrowse(iq) { - /* REF: http://xmpp.org/registrar/disco-categories.html */ - - var id = iq.getID(); - var splitted = id.split('-'); - var target = splitted[0]; - var sessionID = target + '-' + splitted[1]; - var from = fullXID(getStanzaFrom(iq)); - var hash = hex_md5(from); - var handleXML = iq.getQuery(); - var pathID = '#' + target + ' .results[data-session=' + sessionID + ']'; - - // We first remove the waiting element - $(pathID + ' .disco-wait .' + hash).remove(); - - if($(handleXML).find('identity').attr('type')) { - var category = $(handleXML).find('identity').attr('category'); - var type = $(handleXML).find('identity').attr('type'); - var named = $(handleXML).find('identity').attr('name'); - - if(named) - gName = named; - else - gName = ''; - - var one, two, three, four, five; - - // Get the features that this entity supports - var findFeature = $(handleXML).find('feature'); - - for(i in findFeature) { - var current = findFeature.eq(i).attr('var'); - - switch(current) { - case NS_SEARCH: - one = 1; - break; - - case NS_MUC: - two = 1; - break; - - case NS_REGISTER: - three = 1; - break; - - case NS_COMMANDS: - four = 1; - break; - - case NS_DISCO_ITEMS: - five = 1; - break; - - default: - break; - } - } - - var buttons = Array(one, two, three, four, five); - - // We define the toolbox links depending on the supported features - var tools = ''; - var aTools = Array('search', 'join', 'subscribe', 'command', 'browse'); - var bTools = Array(_e("Search"), _e("Join"), _e("Subscribe"), _e("Command"), _e("Browse")); - - for(i in buttons) { - if(buttons[i]) - tools += ''; - } - - // As defined in the ref, we detect the type of each category to put an icon - switch(category) { - case 'account': - case 'auth': - case 'automation': - case 'client': - case 'collaboration': - case 'component': - case 'conference': - case 'directory': - case 'gateway': - case 'headline': - case 'hierarchy': - case 'proxy': - case 'pubsub': - case 'server': - case 'store': - break; - - default: - category = 'others'; - } - - // We display the item we found - $(pathID + ' .disco-' + category + ' .disco-category-title').after( - '
' + - '
' + - '
' + from + '
' + - '
' + gName + '
' + - '
' + tools + '
' + - '
' - ); - - // We display the category - $(pathID + ' .disco-' + category).show(); - } - - else { - $(pathID + ' .disco-others .disco-category-title').after( - '
' + - '
' + - '
' + from + '
' + - '
' + _e("Service offline or broken") + '
' + - '
' - ); - - // We display the category - $(pathID + ' .disco-others').show(); - } - - // We hide the waiting stuffs if there's no remaining loading items - if(!$(pathID + ' .disco-wait .' + target + '-oneresult').size()) - $(pathID + ' .disco-wait, #' + target + ' .wait').hide(); -} - -// Cleans the current data-form popup -function cleanDataForm(target) { - if(target == 'discovery') - cleanDiscovery(); - else - $('#' + target + ' div.results').empty(); -} - -// Displays the no result indicator -function noResultDataForm(path) { - $(path).prepend('

' + _e("Sorry, but the entity didn't return any result!") + '

'); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/datastore.js b/sources/extend/addon/matrix/jappixmini/jappix/js/datastore.js deleted file mode 100644 index b818b301..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/datastore.js +++ /dev/null @@ -1,209 +0,0 @@ -/* - -Jappix - An open social platform -These are the temporary/persistent data store functions - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 23/06/11 - -*/ - -// Temporary: returns whether it is available or not -function hasDB() { - if(window.sessionStorage) - return true; - - return false; -} - -// Temporary: used to read a database entry -function getDB(type, id) { - try { - return sessionStorage.getItem(type + '_' + id); - } - - catch(e) { - logThis('Error while getting a temporary database entry (' + type + ' -> ' + id + '): ' + e, 1); - - return null; - } -} - -// Temporary: used to update a database entry -function setDB(type, id, value) { - try { - sessionStorage.setItem(type + '_' + id, value); - - return true; - } - - catch(e) { - logThis('Error while writing a temporary database entry (' + type + ' -> ' + id + '): ' + e, 1); - - return false; - } -} - -// Temporary: used to remove a database entry -function removeDB(type, id) { - try { - sessionStorage.removeItem(type + '_' + id); - - return true; - } - - catch(e) { - logThis('Error while removing a temporary database entry (' + type + ' -> ' + id + '): ' + e, 1); - - return false; - } -} - -// Temporary: used to check a database entry exists -function existDB(type, id) { - var read = getDB(type, id); - - if(read != null) - return true; - - return false; -} - -// Temporary: used to clear all the database -function resetDB() { - try { - sessionStorage.clear(); - - logThis('Temporary database cleared.', 3); - - return true; - } - - catch(e) { - logThis('Error while clearing temporary database: ' + e, 1); - - return false; - } -} - -// Persistent: returns whether it is available or not -function hasPersistent() { - if(window.localStorage) - return true; - - return false; -} - -// Persistent: used to read a database entry -function getPersistent(type, id) { - try { - return localStorage.getItem(type + '_' + id); - } - - catch(e) { - logThis('Error while getting a persistent database entry (' + type + ' -> ' + id + '): ' + e, 1); - - return null; - } -} - -// Persistent: used to update a database entry -function setPersistent(type, id, value) { - try { - localStorage.setItem(type + '_' + id, value); - - return true; - } - - // Database might be full - catch(e) { - logThis('Retrying: could not write a persistent database entry (' + type + ' -> ' + id + '): ' + e, 2); - - // Flush it! - flushPersistent(); - - // Set the item again - try { - localStorage.setItem(type + '_' + id, value); - - return true; - } - - // New error! - catch(e) { - logThis('Aborted: error while writing a persistent database entry (' + type + ' -> ' + id + '): ' + e, 1); - - return false; - } - } -} - -// Persistent: used to remove a database entry -function removePersistent(type, id) { - try { - localStorage.removeItem(type + '_' + id); - - return true; - } - - catch(e) { - logThis('Error while removing a persistent database entry (' + type + ' -> ' + id + '): ' + e, 1); - - return false; - } -} - -// Persistent: used to check a database entry exists -function existPersistent(type, id) { - var read = getPersistent(type, id); - - if(read != null) - return true; - - return false; -} - -// Persistent: used to clear all the database -function resetPersistent() { - try { - localStorage.clear(); - - logThis('Persistent database cleared.', 3); - - return true; - } - - catch(e) { - logThis('Error while clearing persistent database: ' + e, 1); - - return false; - } -} - -// Persistent: used to flush the database -function flushPersistent() { - try { - // Get the stored session entry - var session = getPersistent('session', 1); - - // Clear the persistent database - localStorage.clear(); - - // Restaure the stored session entry - if(session) - setPersistent('session', 1, session); - - logThis('Persistent database flushed.', 3); - - return true; - } - - catch(e) { - logThis('Error while flushing persistent database: ' + e, 1); - - return false; - } -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/date.js b/sources/extend/addon/matrix/jappixmini/jappix/js/date.js deleted file mode 100644 index adbe01c8..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/date.js +++ /dev/null @@ -1,214 +0,0 @@ -/* - -Jappix - An open social platform -These are the date related JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 17/08/11 - -*/ - -// Gets a stamp from a date -function extractStamp(date) { - return Math.round(date.getTime() / 1000); -} - -// Gets the time from a date -function extractTime(date) { - return date.toLocaleTimeString(); -} - -// Gets the actual date stamp -function getTimeStamp() { - return extractStamp(new Date()); -} - -// Gets the last user activity in seconds -var LAST_ACTIVITY = 0; - -function getLastActivity() { - // Last activity not yet initialized? - if(LAST_ACTIVITY == 0) - return 0; - - return getTimeStamp() - LAST_ACTIVITY; -} - -// Gets the last user available presence in seconds -var PRESENCE_LAST_ACTIVITY = 0; - -function getPresenceLast() { - // Last presence stamp not yet initialized? - if(PRESENCE_LAST_ACTIVITY == 0) - return 0; - - return getTimeStamp() - PRESENCE_LAST_ACTIVITY; -} - -// Generates the time for XMPP -function getXMPPTime(location) { - /* FROM : http://trac.jwchat.org/jsjac/browser/branches/jsjac_1.0/jsextras.js?rev=221 */ - - // Initialize - var jInit = new Date(); - var year, month, day, hours, minutes, seconds; - - // Gets the UTC date - if(location == 'utc') { - year = jInit.getUTCFullYear(); - month = jInit.getUTCMonth(); - day = jInit.getUTCDate(); - hours = jInit.getUTCHours(); - minutes = jInit.getUTCMinutes(); - seconds = jInit.getUTCSeconds(); - } - - // Gets the local date - else { - year = jInit.getFullYear(); - month = jInit.getMonth(); - day = jInit.getDate(); - hours = jInit.getHours(); - minutes = jInit.getMinutes(); - seconds = jInit.getSeconds(); - } - - // Generates the date string - var jDate = year + '-'; - jDate += padZero(month + 1) + '-'; - jDate += padZero(day) + 'T'; - jDate += padZero(hours) + ':'; - jDate += padZero(minutes) + ':'; - jDate += padZero(seconds) + 'Z'; - - // Returns the date string - return jDate; -} - -// Generates then human time -function getCompleteTime() { - var init = new Date(); - var time = padZero(init.getHours()) + ':'; - time += padZero(init.getMinutes()) + ':'; - time += padZero(init.getSeconds()); - - return time; -} - -// Gets the TZO of a date -function getDateTZO() { - // Get the date - var date = new Date(); - var offset = date.getTimezoneOffset(); - - // Default vars - var sign = ''; - var hours = 0; - var minutes = 0; - - // Process a neutral offset - if(offset < 0) { - offset = offset * -1; - sign = '+'; - } - - // Get the values - var n_date = new Date(offset * 60 * 1000); - hours = n_date.getHours() - 1; - minutes = n_date.getMinutes(); - - // Process the TZO - tzo = sign + padZero(hours) + ':' + padZero(minutes); - - // Return the processed value - return tzo; -} - -// Parses a XMPP date (yyyy-mm-dd, hh-mm-ss) into an human-readable one -function parseDate(to_parse) { - var date = Date.jab2date(to_parse); - var parsed = date.toLocaleDateString() + ' (' + date.toLocaleTimeString() + ')'; - - return parsed; -} - -// Parses a XMPP date (yyyy-mm-dd) into an human-readable one -function parseDay(to_parse) { - var date = Date.jab2date(to_parse); - var parsed = date.toLocaleDateString(); - - return parsed; -} - -// Parses a XMPP date (hh-mm-ss) into an human-readable one -function parseTime(to_parse) { - var date = Date.jab2date(to_parse); - var parsed = date.toLocaleTimeString(); - - return parsed; -} - -// Parses a XMPP date stamp into a relative one -function relativeDate(to_parse) { - // Get the current date - var current_date = Date.jab2date(getXMPPTime('utc')); - var current_day = current_date.getDate(); - var current_stamp = current_date.getTime(); - - // Parse the given date - var old_date = Date.jab2date(to_parse); - var old_day = old_date.getDate(); - var old_stamp = old_date.getTime(); - var old_time = old_date.toLocaleTimeString(); - - // Get the day number between the two dates - var days = Math.round((current_stamp - old_stamp) / 86400000); - - // Invalid date? - if(isNaN(old_stamp) || isNaN(days)) - return getCompleteTime(); - - // Is it today? - if(current_day == old_day) - return old_time; - - // It is yesterday? - if(days <= 1) - return _e("Yesterday") + ' - ' + old_time; - - // Is it less than a week ago? - if(days <= 7) - return printf(_e("%s days ago"), days) + ' - ' + old_time; - - // Another longer period - return old_date.toLocaleDateString() + ' - ' + old_time; -} - -// Reads a message delay -function readMessageDelay(node) { - try { - // Initialize - var delay, d_delay; - - // Read the delay - d_delay = jQuery(node).find('delay[xmlns=' + NS_URN_DELAY + ']:first').attr('stamp'); - - // New delay (valid XEP) - if(d_delay) - delay = d_delay; - - // Old delay (obsolete XEP!) - else { - // Try to read the old-school delay - var x_delay = jQuery(node).find('x[xmlns=' + NS_DELAY + ']:first').attr('stamp'); - - if(x_delay) - delay = x_delay.replace(/^(\w{4})(\w{2})(\w{2})T(\w{2}):(\w{2}):(\w{2})Z?(\S+)?/, '$1-$2-$3T$4:$5:$6Z$7'); - } - - return delay; - } catch(e) {} -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/directory.js b/sources/extend/addon/matrix/jappixmini/jappix/js/directory.js deleted file mode 100644 index ebe1a570..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/directory.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - -Jappix - An open social platform -These are the directory JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 03/03/11 - -*/ - -// Opens the directory popup -function openDirectory() { - // Popup HTML content - var html = - '
' + _e("User directory") + '
' + - - '
' + - '
' + - '
' + _e("Server to query") + '
' + - - '' + - '
' + - - '
' + - '
' + - - '
' + - '
' + - - '' + _e("Close") + '' + - '
'; - - // Create the popup - createPopup('directory', html); - - // Associate the events - launchDirectory(); - - // Start a search! - startDirectory(); - - return false; -} - -// Quits the directory popup -function closeDirectory() { - // Destroy the popup - destroyPopup('directory'); - - return false; -} - -// Launches a directory search -function startDirectory() { - // Get the server to query - var server = $('#directory .directory-server-input').val(); - - // Launch the search! - dataForm($('#directory .directory-server-input').val(), 'search', '', '', 'directory'); - - logThis('Directory search launched: ' + server); - - return false; -} - -// Plugin launcher -function launchDirectory() { - // Click event - $('#directory .bottom .finish').click(closeDirectory); - - // Keyboard event - $('#directory .directory-server-input').keyup(function(e) { - if(e.keyCode == 13) { - // No value? - if(!$(this).val()) - $(this).val(HOST_VJUD); - - // Start the directory search - startDirectory(); - - return false; - } - }); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/discovery.js b/sources/extend/addon/matrix/jappixmini/jappix/js/discovery.js deleted file mode 100644 index 867037b2..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/discovery.js +++ /dev/null @@ -1,169 +0,0 @@ -/* - -Jappix - An open social platform -These are the discovery JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 03/03/11 - -*/ - -// Opens the discovery popup -function openDiscovery() { - // Popup HTML content - var html = - '
' + _e("Service discovery") + '
' + - - '
' + - '
' + - '
' + _e("Server to query") + '
' + - - '' + - '
' + - - '
' + - '' + - - '
' + - '

' + _e("Authentications") + '

' + - '
' + - - '
' + - '

' + _e("Automation") + '

' + - '
' + - - '
' + - '

' + _e("Clients") + '

' + - '
' + - - '
' + - '

' + _e("Collaboration") + '

' + - '
' + - - '
' + - '

' + _e("Components") + '

' + - '
' + - - '
' + - '

' + _e("Rooms") + '

' + - '
' + - - '
' + - '

' + _e("Directories") + '

' + - '
' + - - '
' + - '

' + _e("Gateways") + '

' + - '
' + - - '
' + - '

' + _e("News") + '

' + - '
' + - - '
' + - '

' + _e("Hierarchy") + '

' + - '
' + - - '
' + - '

' + _e("Proxies") + '

' + - '
' + - - '
' + - '

' + _e("Publication/Subscription") + '

' + - '
' + - - '
' + - '

' + _e("Server") + '

' + - '
' + - - '
' + - '

' + _e("Storage") + '

' + - '
' + - - '
' + - '

' + _e("Others") + '

' + - '
' + - - '
' + - '

' + _e("Loading") + '

' + - '
' + - '
' + - '
' + - - '
' + - '
' + - - '' + _e("Close") + '' + - '
'; - - // Create the popup - createPopup('discovery', html); - - // Associate the events - launchDiscovery(); - - // We request a disco to the default server - startDiscovery(); - - return false; -} - -// Quits the discovery popup -function closeDiscovery() { - // Destroy the popup - destroyPopup('discovery'); - - return false; -} - -// Launches a discovery -function startDiscovery() { - /* REF: http://xmpp.org/extensions/xep-0030.html */ - - // We get the server to query - var discoServer = $('#discovery .disco-server-input').val(); - - // We launch the items query - dataForm(discoServer, 'browse', '', '', 'discovery'); - - logThis('Service discovery launched: ' + discoServer); - - return false; -} - -// Cleans the discovery results -function cleanDiscovery() { - // We remove the results - $('#discovery .discovery-oneresult, #discovery .oneinstructions, #discovery .onetitle, #discovery .no-results').remove(); - - // We clean the user info - $('#discovery .disco-server-info').text(''); - - // We hide the wait icon, the no result alert and the results - $('#discovery .wait, #discovery .disco-category').hide(); -} - -// Plugin launcher -function launchDiscovery() { - // Click event - $('#discovery .bottom .finish').click(closeDiscovery); - - // Keyboard event - $('#discovery .disco-server-input').keyup(function(e) { - if(e.keyCode == 13) { - // No value? - if(!$(this).val()) - $(this).val(HOST_MAIN); - - // Start the discovery - startDiscovery(); - - return false; - } - }); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/error.js b/sources/extend/addon/matrix/jappixmini/jappix/js/error.js deleted file mode 100644 index c16ca2a5..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/error.js +++ /dev/null @@ -1,139 +0,0 @@ -/* - -Jappix - An open social platform -These are the error functions for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 02/04/11 - -*/ - -// Shows the given error output -function showError(condition, reason, type) { - // Enough data to output the error - if(condition || reason) { - // Initialize the error text - var eText = ''; - - // Any error condition - if(condition) - eText += condition; - - // Any error type - if(type && eText) - eText += ' (' + type + ')'; - - // Any error reason - if(reason) { - if(eText) - eText += ' - '; - - eText += reason; - } - - // We reveal the error - openThisError(1); - - // Create the error text - $('#board .one-board.error[data-id=1] span').text(eText); - } - - // Not enough data to output the error: output a generic board - else - openThisError(2); -} - -// Handles the error from a packet and return true if any error -function handleError(packet) { - /* REF: http://xmpp.org/extensions/xep-0086.html */ - - // Initialize - var type, code, reason, condition; - var node = $(packet); - - // First level error (connection error) - if(node.is('error')) { - // Get the value - code = node.attr('code'); - - // Specific error reason - switch(code) { - case '401': - reason = _e("Authorization failed"); - break; - - case '409': - reason = _e("Registration failed, please choose a different username"); - break; - - case '503': - reason = _e("Service unavailable"); - break; - - case '500': - reason = _e("Internal server error, try later"); - break; - - default: - reason = node.find('text').text(); - break; - } - - // Remove the general wait item (security) - removeGeneralWait(); - - // Show reconnect pane - if(CURRENT_SESSION && CONNECTED) { - // Anonymous? - if(isAnonymous()) - createReconnect('anonymous'); - else - createReconnect('normal'); - } - - // Show the homepage (security) - else if(!CURRENT_SESSION || !CONNECTED) { - $('#home').show(); - pageTitle('home'); - } - - // Still connected? (security) - if(isConnected()) - con.disconnect(); - - logThis('First level error received.', 1); - } - - // Second level error (another error) - else if(node.find('error').size()) { - type = node.find('error').attr('type'); - reason = node.find('error text').text(); - condition = packet.getElementsByTagName('error').item(0).childNodes.item(0).nodeName.replace(/-/g, ' '); - - logThis('Second level error received.', 1); - } - - // No error - else - return false; - - // Show the error board - showError(condition, reason, type); - - // Return there's an error - return true; -} - -// Handles the error reply of a packet -function handleErrorReply(packet) { - return handleError(packet.getNode()); -} - -// Handles the error reply for a message -function handleMessageError(packet) { - if(!handleErrorReply(packet)) - handleMessage(packet); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/favorites.js b/sources/extend/addon/matrix/jappixmini/jappix/js/favorites.js deleted file mode 100644 index 69a042e8..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/favorites.js +++ /dev/null @@ -1,537 +0,0 @@ -/* - -Jappix - An open social platform -These are the favorites JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 23/06/11 - -*/ - -// Opens the favorites popup -function openFavorites() { - // Popup HTML content - var html = - '
' + _e("Manage favorite rooms") + '
' + - - '
' + - '
' + - '
' + - '
' + - - _e("Change favorites") + - '
' + - - '' + - '
' + - - '
' + - '
' + - '
' + - '
' + _e("Select a favorite") + '
' + - - '' + - '
' + - - '
' + - '
' + - '' + - - '' + - '
' + - - '
' + - '' + - - '' + - '
' + - - '
' + - '' + - - '' + - '
' + - - '
' + - '' + - - '' + - '
' + - - '
' + - '' + - - '' + - '
' + - - '
' + - '' + - - '' + - '
' + - - '' + - '
' + - '
' + - - '' + - '
' + - '
' + - - '
' + - '
' + - - '' + _e("Close") + '' + - '
'; - - // Create the popup - createPopup('favorites', html); - - // Load the favorites - loadFavorites(); - - // Associate the events - launchFavorites(); -} - -// Resets the favorites elements -function resetFavorites() { - var path = '#favorites '; - - $(path + '.wait, ' + path + '.fedit-terminate').hide(); - $(path + '.fedit-add').show(); - $(path + '.fsearch-oneresult').remove(); - $(path + 'input').val(''); - $(path + '.please-complete').removeClass('please-complete'); - $(path + '.fedit-nick').val(getNick()); - $(path + '.fsearch-head-server, ' + path + '.fedit-server').val(HOST_MUC); - $(path + '.fedit-autojoin').attr('checked', false); -} - -// Quits the favorites popup -function quitFavorites() { - // Destroy the popup - destroyPopup('favorites'); - - return false; -} - -// Adds a room to the favorites -function addThisFavorite(roomXID, roomName) { - // Button path - var button = '#favorites .fsearch-results div[data-xid=' + escape(roomXID) + '] a.one-button'; - - // Add a remove button instead of the add one - $(button + '.add').replaceWith('' + _e("Remove") + ''); - - // Click event - $(button + '.remove').click(function() { - return removeThisFavorite(roomXID, roomName); - }); - - // Hide the add button in the (opened?) groupchat - $('#' + hex_md5(roomXID) + ' .tools-add').hide(); - - // Add the database entry - displayFavorites(roomXID, explodeThis(' (', roomName, 0), getNick(), '0', ''); - - // Publish the favorites - favoritePublish(); - - return false; -} - -// Removes a room from the favorites -function removeThisFavorite(roomXID, roomName) { - // Button path - var button = '#favorites .fsearch-results div[data-xid=' + escape(roomXID) + '] a.one-button'; - - // Add a remove button instead of the add one - $(button + '.remove').replaceWith('' + _e("Add") + ''); - - // Click event - $(button + '.add').click(function() { - return addThisFavorite(roomXID, roomName); - }); - - // Show the add button in the (opened?) groupchat - $('#' + hex_md5(roomXID) + ' .tools-add').show(); - - // Remove the favorite - removeFavorite(roomXID, true); - - // Publish the favorites - favoritePublish(); - - return false; -} - -// Edits a favorite -function editFavorite() { - // Path to favorites - var favorites = '#favorites .'; - - // Reset the favorites - resetFavorites(); - - // Show the edit/remove button, hide the others - $(favorites + 'fedit-terminate').hide(); - $(favorites + 'fedit-edit').show(); - $(favorites + 'fedit-remove').show(); - - // We retrieve the values - var xid = $(favorites + 'fedit-head-select').val(); - var data = XMLFromString(getDB('favorites', xid)); - - // If this is not the default room - if(xid != 'none') { - // We apply the values - $(favorites + 'fedit-title').val($(data).find('name').text()); - $(favorites + 'fedit-nick').val($(data).find('nick').text()); - $(favorites + 'fedit-chan').val(getXIDNick(xid)); - $(favorites + 'fedit-server').val(getXIDHost(xid)); - $(favorites + 'fedit-password').val($(data).find('password').text()); - - if($(data).find('autojoin').text() == '1') - $(favorites + 'fedit-autojoin').attr('checked', true); - } - - else - resetFavorites(); -} - -// Adds a favorite -function addFavorite() { - // Path to favorites - var favorites = '#favorites .'; - - // We reset the inputs - $(favorites + 'fedit-title, ' + favorites + 'fedit-nick, ' + favorites + 'fedit-chan, ' + favorites + 'fedit-server, ' + favorites + 'fedit-password').val(''); - - // Show the add button, hide the others - $(favorites + 'fedit-terminate').hide(); - $(favorites + 'fedit-add').show(); -} - -// Terminate a favorite editing -function terminateThisFavorite(type) { - // Path to favorites - var favorites = '#favorites '; - - // We get the values of the current edited groupchat - var old_xid = $(favorites + '.fedit-head-select').val(); - - var title = $(favorites + '.fedit-title').val(); - var nick = $(favorites + '.fedit-nick').val(); - var room = $(favorites + '.fedit-chan').val(); - var server = $(favorites + '.fedit-server').val(); - var xid = room + '@' + server; - var password = $(favorites + '.fedit-password').val(); - var autojoin = '0'; - - if($(favorites + '.fedit-autojoin').filter(':checked').size()) - autojoin = '1'; - - // We check the missing values and send this if okay - if((type == 'add') || (type == 'edit')) { - if(title && nick && room && server) { - // Remove the edited room - if(type == 'edit') - removeFavorite(old_xid, true); - - // Display the favorites - displayFavorites(xid, title, nick, autojoin, password); - - // Reset the inputs - resetFavorites(); - } - - else { - $(favorites + 'input[required]').each(function() { - var select = $(this); - - if(!select.val()) - $(document).oneTime(10, function() { - select.addClass('please-complete').focus(); - }); - else - select.removeClass('please-complete'); - }); - } - } - - // Must remove a favorite? - else if(type == 'remove') { - removeFavorite(old_xid, true); - - // Reset the inputs - resetFavorites(); - } - - // Publish the new favorites - favoritePublish(); - - logThis('Action on this bookmark: ' + room + '@' + server + ' / ' + type, 3); - - return false; -} - -// Removes a favorite -function removeFavorite(xid, database) { - // We remove the target favorite everywhere needed - $('.buddy-conf-groupchat-select option[value=' + xid + ']').remove(); - $('.fedit-head-select option[value=' + xid + ']').remove(); - - // Must remove it from database? - if(database) - removeDB('favorites', xid); -} - -// Sends a favorite to the XMPP server -function favoritePublish() { - var iq = new JSJaCIQ(); - iq.setType('set'); - - var query = iq.setQuery(NS_PRIVATE); - var storage = query.appendChild(iq.buildNode('storage', {'xmlns': NS_BOOKMARKS})); - - // We generate the XML - for(var i = 0; i < sessionStorage.length; i++) { - // Get the pointer values - var current = sessionStorage.key(i); - - // If the pointer is on a stored favorite - if(explodeThis('_', current, 0) == 'favorites') { - var data = XMLFromString(sessionStorage.getItem(current)); - var xid = $(data).find('xid').text(); - var rName = $(data).find('name').text(); - var nick = $(data).find('nick').text(); - var password = $(data).find('password').text(); - var autojoin = $(data).find('autojoin').text(); - - // We create the node for this groupchat - var item = storage.appendChild(iq.buildNode('conference', {'name': rName, 'jid': xid, 'autojoin': autojoin, xmlns: NS_BOOKMARKS})); - item.appendChild(iq.buildNode('nick', {xmlns: NS_BOOKMARKS}, nick)); - - if(password) - item.appendChild(iq.buildNode('password', {xmlns: NS_BOOKMARKS}, password)); - - logThis('Bookmark sent: ' + xid, 3); - } - } - - con.send(iq); -} - -// Gets a list of the MUC items on a given server -function getGCList() { - var path = '#favorites .'; - var gcServer = $('.fsearch-head-server').val(); - - // We reset some things - $(path + 'fsearch-oneresult').remove(); - $(path + 'fsearch-noresults').hide(); - $(path + 'wait').show(); - - var iq = new JSJaCIQ(); - iq.setType('get'); - iq.setTo(gcServer); - - iq.setQuery(NS_DISCO_ITEMS); - - con.send(iq, handleGCList); -} - -// Handles the MUC items list -function handleGCList(iq) { - var path = '#favorites .'; - var from = fullXID(getStanzaFrom(iq)); - - if (!iq || (iq.getType() != 'result')) { - openThisError(3); - - $(path + 'wait').hide(); - - logThis('Error while retrieving the rooms: ' + from, 1); - } - - else { - var handleXML = iq.getQuery(); - - if($(handleXML).find('item').size()) { - // Initialize the HTML code - var html = ''; - - $(handleXML).find('item').each(function() { - var roomXID = $(this).attr('jid'); - var roomName = $(this).attr('name'); - - if(roomXID && roomName) { - // Escaped values - var escaped_xid = encodeOnclick(roomXID); - var escaped_name = encodeOnclick(roomName); - - // Initialize the room HTML - html += '
' + - '
' + roomName.htmlEnc() + '
' + - '' + _e("Join") + ''; - - // This room is yet a favorite - if(existDB('favorites', roomXID)) - html += '' + _e("Remove") + ''; - else - html += '' + _e("Add") + ''; - - // Close the room HTML - html += '
'; - } - }); - - // Append this code to the popup - $(path + 'fsearch-results').append(html); - } - - else - $(path + 'fsearch-noresults').show(); - - logThis('Rooms retrieved: ' + from, 3); - } - - $(path + 'wait').hide(); -} - -// Joins a groupchat from favorites -function joinFavorite(room) { - quitFavorites(); - checkChatCreate(room, 'groupchat', '', '', getXIDNick(room)); - - return false; -} - -// Displays a given favorite -function displayFavorites(xid, name, nick, autojoin, password) { - // Generate the HTML code - var html = ''; - - // Remove the existing favorite - removeFavorite(xid, false); - - // We complete the select forms - $('#buddy-list .gc-join-first-option, #favorites .fedit-head-select-first-option').after(html); - - // We store the informations - var value = '' + xid.htmlEnc() + '' + name.htmlEnc() + '' + nick.htmlEnc() + '' + autojoin.htmlEnc() + '' + password.htmlEnc() + ''; - setDB('favorites', xid, value); -} - -// Loads the favorites for the popup -function loadFavorites() { - // Initialize the HTML code - var html = ''; - - // Read the database - for(var i = 0; i < sessionStorage.length; i++) { - // Get the pointer values - var current = sessionStorage.key(i); - - // If the pointer is on a stored favorite - if(explodeThis('_', current, 0) == 'favorites') { - var data = XMLFromString(sessionStorage.getItem(current)); - - // Add the current favorite to the HTML code - html += ''; - } - } - - // Generate specific HTML code - var favorites_bubble = '' + html; - var favorites_popup = '' + html; - - // Append the HTML code - $('#buddy-list .buddy-conf-groupchat-select').html(favorites_bubble); - $('#favorites .fedit-head-select').html(favorites_popup); -} - -// Plugin launcher -function launchFavorites() { - var path = '#favorites .'; - - // Keyboard events - $(path + 'fsearch-head-server').keyup(function(e) { - if(e.keyCode == 13) { - // No value? - if(!$(this).val()) - $(this).val(HOST_MUC); - - // Get the list - getGCList(); - } - }); - - $(path + 'fedit-line input').keyup(function(e) { - if(e.keyCode == 13) { - // Edit a favorite - if($(path + 'fedit-edit').is(':visible')) - terminateThisFavorite('edit'); - - // Add a favorite - else - terminateThisFavorite('add'); - } - }); - - // Change events - $('.fedit-head-select').change(editFavorite); - - // Click events - $(path + 'room-switcher').click(function() { - $(path + 'favorites-content').hide(); - resetFavorites(); - }); - - $(path + 'room-list').click(function() { - $(path + 'favorites-edit').show(); - }); - - $(path + 'room-search').click(function() { - $(path + 'favorites-search').show(); - getGCList(); - }); - - $(path + 'fedit-add').click(function() { - return terminateThisFavorite('add'); - }); - - $(path + 'fedit-edit').click(function() { - return terminateThisFavorite('edit'); - }); - - $(path + 'fedit-remove').click(function() { - return terminateThisFavorite('remove'); - }); - - $(path + 'bottom .finish').click(function() { - return quitFavorites(); - }); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/features.js b/sources/extend/addon/matrix/jappixmini/jappix/js/features.js deleted file mode 100644 index 4944be0a..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/features.js +++ /dev/null @@ -1,213 +0,0 @@ -/* - -Jappix - An open social platform -This is the server features JS script for Jappix - -------------------------------------------------- - -License: AGPL -Author: Vanaryon -Last revision: 01/06/11 - -*/ - -// Gets the features of a server -function getFeatures() { - /* REF: http://xmpp.org/extensions/xep-0030.html */ - - // Get the main values - var to = getServer(); - var caps = con.server_caps; - var xml = null; - - // Try to get the stored data - if(caps) - xml = XMLFromString(getPersistent('caps', caps)); - - // Any stored data? - if(xml) { - handleFeatures(xml); - - logThis('Read server CAPS from cache.'); - } - - // Not stored (or no CAPS)! - else { - var iq = new JSJaCIQ(); - - iq.setTo(to); - iq.setType('get'); - iq.setQuery(NS_DISCO_INFO); - - con.send(iq, handleDiscoInfos); - - logThis('Read server CAPS from network.'); - } -} - -// Handles the features of a server -function handleFeatures(xml) { - // Selector - var selector = $(xml); - - // Markers - var pep = false; - var pubsub = false; - var archive = false; - var archive_auto = false; - var archive_manual = false; - var archive_manage = false; - var archive_pref = false; - var commands = false; - - // Scan the features - if(selector.find('identity[category=pubsub][type=pep]').size()) - pep = true; - if(selector.find('feature[var=' + NS_PUBSUB + ']').size()) - pubsub = true; - if(selector.find('feature[var=' + NS_URN_ARCHIVE + ']').size()) - archive = true; - if(selector.find('feature[var=' + NS_URN_AR_AUTO + ']').size()) - archive_auto = true; - if(selector.find('feature[var=' + NS_URN_AR_MANUAL + ']').size()) - archive_manual = true; - if(selector.find('feature[var=' + NS_URN_AR_MANAGE + ']').size()) - archive_manage = true; - if(selector.find('feature[var=' + NS_URN_AR_PREF + ']').size()) - archive_pref = true; - if(selector.find('feature[var=' + NS_COMMANDS + ']').size()) - commands = true; - - // Enable the pep elements if available - if(pep) { - // Update our database - enableFeature('pep'); - - // Get the microblog - getInitMicroblog(); - - // Get the notifications - getNotifications(); - - // Geolocate the user - geolocate(); - - // Enable microblogging send tools - waitMicroblog('sync'); - $('.postit.attach').css('display', 'block'); - - logThis('XMPP server supports PEP.', 3); - } - - // Disable microblogging send tools (no PEP!) - else { - waitMicroblog('unsync'); - - logThis('XMPP server does not support PEP.', 2); - } - - // Enable the pubsub features if available - if(pubsub) - enableFeature(NS_PUBSUB); - - // Enable the archiving features if available - if(archive) - enableFeature(NS_URN_ARCHIVE); - - // Enable the archiving sub-features if available - if(archive_pref) - enableFeature(NS_URN_AR_PREF); - if(archive_auto) - enableFeature(NS_URN_AR_AUTO); - if(archive_manual) - enableFeature(NS_URN_AR_MANUAL); - if(archive_manage) - enableFeature(NS_URN_AR_MANAGE); - - // Enable the commands features if available - if(commands) - enableFeature(NS_COMMANDS); - - // Hide the private life fieldset if nothing to show - if(!pep && !archive_pref) - $('#options fieldset.privacy').hide(); - - // Apply the features - applyFeatures('talk'); - - // Process the buddy-list height - if(pep) - adaptRoster(); - - return false; -} - -// The function to apply the features to an element -function applyFeatures(id) { - // Path to the elements - var path = '#' + id + ' .'; - - // PEP features - if(enabledPEP()) - $(path + 'pep-hidable').show(); - - // PubSub features - if(enabledPubSub()) - $(path + 'pubsub-hidable').show(); - - // Archives features - if(enabledArchives() || enabledArchives('auto') || enabledArchives('manual') || enabledArchives('manage')) { - $(path + 'archives-hidable:not(.pref)').show(); - - // Sub-feature: archives preferences - if(enabledArchives('pref')) - $(path + 'archives-hidable.pref').show(); - } - - // Commands features - if(enabledCommands()) - $(path + 'commands-hidable').show(); - - // XMPP links (browser feature) - if(navigator.registerProtocolHandler) - $(path + 'xmpplinks-hidable').show(); -} - -// Enables a feature -function enableFeature(feature) { - setDB('feature', feature, 'true'); -} - -// Checks if a feature is enabled -function enabledFeature(feature) { - if(getDB('feature', feature) == 'true') - return true; - else - return false; -} - -// Returns the XMPP server PEP support -function enabledPEP() { - return enabledFeature('pep'); -} - -// Returns the XMPP server PubSub support -function enabledPubSub() { - return enabledFeature(NS_PUBSUB); -} - -// Returns the XMPP server archives support -function enabledArchives(sub) { - var xmlns = NS_URN_ARCHIVE; - - // Any sub element sent? - if(sub) - xmlns += ':' + sub; - - return enabledFeature(xmlns); -} - -// Returns the XMPP server commands support -function enabledCommands() { - return enabledFeature(NS_COMMANDS); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/filter.js b/sources/extend/addon/matrix/jappixmini/jappix/js/filter.js deleted file mode 100644 index 48e5238f..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/filter.js +++ /dev/null @@ -1,189 +0,0 @@ -/* - -Jappix - An open social platform -These are the filtering JS script for Jappix - -------------------------------------------------- - -License: AGPL -Authors: Vanaryon, Maranda -Last revision: 04/08/11 - -*/ - -// Generates a given emoticon HTML code -function emoteImage(image, text, after) { - return ' ' + encodeQuotes(text) + ' ' + after; -} - -// Filters a given message -function filterThisMessage(neutralMessage, nick, html_encode) { - var filteredMessage = neutralMessage; - - // We encode the HTML special chars - if(html_encode) - filteredMessage = filteredMessage.htmlEnc(); - - // /me command - filteredMessage = filteredMessage.replace(/((^)|((.+)(>)))(\/me )([^<]+)/, nick + ' $7') - - // We replace the smilies text into images - .replace(/(:-?@)($|\s|<)/gi, emoteImage('angry', '$1', '$2')) - .replace(/(:-?\[)($|\s|<)/gi, emoteImage('bat', '$1', '$2')) - .replace(/(\(B\))($|\s|<)/g, emoteImage('beer', '$1', '$2')) - .replace(/((:-?D)|(XD))($|\s|<)/gi, emoteImage('biggrin', '$1', '$4')) - .replace(/(:-?\$)($|\s|<)/gi, emoteImage('blush', '$1', '$2')) - .replace(/(\(Z\))($|\s|<)/g, emoteImage('boy', '$1', '$2')) - .replace(/(\(W\))($|\s|<)/g, emoteImage('brflower', '$1', '$2')) - .replace(/((<\/3)|(\(U\)))($|\s|<)/g, emoteImage('brheart', '$1', '$4')) - .replace(/(\(C\))($|\s|<)/g, emoteImage('coffee', '$1', '$2')) - .replace(/((8-\))|(\(H\)))($|\s|<)/g, emoteImage('coolglasses', '$1', '$4')) - .replace(/(:'-?\()($|\s|<)/gi, emoteImage('cry', '$1', '$2')) - .replace(/(\(%\))($|\s|<)/g, emoteImage('cuffs', '$1', '$2')) - .replace(/(\]:-?>)($|\s|<)/gi, emoteImage('devil', '$1', '$2')) - .replace(/(\(D\))($|\s|<)/g, emoteImage('drink', '$1', '$2')) - .replace(/(@}->--)($|\s|<)/gi, emoteImage('flower', '$1', '$2')) - .replace(/((:-?\/)|(:-?S))($|\s|<)/gi, emoteImage('frowning', '$1', '$4')) - .replace(/(\(X\))($|\s|<)/g, emoteImage('girl', '$1', '$2')) - .replace(/((<3)|(\(L\)))($|\s|<)/g, emoteImage('heart', '$1', '$4')) - .replace(/(\(}\))($|\s|<)/g, emoteImage('hugleft', '$1', '$2')) - .replace(/(\({\))($|\s|<)/g, emoteImage('hugright', '$1', '$2')) - .replace(/(:-?{})($|\s|<)/gi, emoteImage('kiss', '$1', '$2')) - .replace(/(\(I\))($|\s|<)/g, emoteImage('lamp', '$1', '$2')) - .replace(/(:-?3)($|\s|<)/gi, emoteImage('lion', '$1', '$2')) - .replace(/(\(E\))($|\s|<)/g, emoteImage('mail', '$1', '$2')) - .replace(/(\(S\))($|\s|<)/g, emoteImage('moon', '$1', '$2')) - .replace(/(\(8\))($|\s|<)/g, emoteImage('music', '$1', '$2')) - .replace(/((=-?O)|(:-?O))($|\s|<)/gi, emoteImage('oh', '$1', '$4')) - .replace(/(\(T\))($|\s|<)/g, emoteImage('phone', '$1', '$2')) - .replace(/(\(P\))($|\s|<)/g, emoteImage('photo', '$1', '$2')) - .replace(/(:-?!)($|\s|<)/gi, emoteImage('puke', '$1', '$2')) - .replace(/(\(@\))($|\s|<)/g, emoteImage('pussy', '$1', '$2')) - .replace(/(\(R\))($|\s|<)/g, emoteImage('rainbow', '$1', '$2')) - .replace(/(:-?\))($|\s|<)/gi, emoteImage('smile', '$1', '$2')) - .replace(/(\(\*\))($|\s|<)/g, emoteImage('star', '$1', '$2')) - .replace(/(:-?\|)($|\s|<)/gi, emoteImage('stare', '$1', '$2')) - .replace(/(\(N\))($|\s|<)/g, emoteImage('thumbdown', '$1', '$2')) - .replace(/(\(Y\))($|\s|<)/g, emoteImage('thumbup', '$1', '$2')) - .replace(/(:-?P)($|\s|<)/gi, emoteImage('tongue', '$1', '$2')) - .replace(/(:-?\()($|\s|<)/gi, emoteImage('unhappy', '$1', '$2')) - .replace(/(;-?\))($|\s|<)/gi, emoteImage('wink', '$1', '$2')) - - // Text in bold - .replace(/(^|\s|>)((\*)([^<>'"]+)(\*))($|\s|<)/gi, '$1$2$6') - - // Italic text - .replace(/(^|\s|>)((\/)([^<>'"]+)(\/))($|\s|<)/gi, '$1$2$6') - - // Underlined text - .replace(/(^|\s|>)((_)([^<>'"]+)(_))($|\s|<)/gi, '$1$2$6'); - - // Add the links - if(html_encode) - filteredMessage = applyLinks(filteredMessage, 'desktop'); - - // Filter integratebox links - filteredMessage = filterIntegrateBox(filteredMessage); - - return filteredMessage; -} - -// Filters a xHTML message to be displayed in Jappix -function filterThisXHTML(code) { - // Allowed elements array - var elements = new Array( - 'a', - 'abbr', - 'acronym', - 'address', - 'blockquote', - 'body', - 'br', - 'cite', - 'code', - 'dd', - 'dfn', - 'div', - 'dt', - 'em', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'head', - 'html', - 'img', - 'kbd', - 'li', - 'ol', - 'p', - 'pre', - 'q', - 'samp', - 'span', - 'strong', - 'title', - 'ul', - 'var' - ); - - // Allowed attributes array - var attributes = new Array( - 'accesskey', - 'alt', - 'charset', - 'cite', - 'class', - 'height', - 'href', - 'hreflang', - 'id', - 'longdesc', - 'profile', - 'rel', - 'rev', - 'src', - 'style', - 'tabindex', - 'title', - 'type', - 'uri', - 'version', - 'width', - 'xml:lang', - 'xmlns' - ); - - // Remove forbidden elements - $(code).find('html body *').each(function() { - // This element is not authorized - if(!existArrayValue(elements, (this).nodeName.toLowerCase())) - $(this).remove(); - }); - - // Remove forbidden attributes - $(code).find('html body *').each(function() { - // Put a pointer on this element (jQuery way & normal way) - var cSelector = $(this); - var cElement = (this); - - // Loop the attributes of the current element - $(cElement.attributes).each(function(index) { - // Read the current attribute - var cAttr = cElement.attributes[index]; - var cName = cAttr.name; - var cVal = cAttr.value; - - // This attribute is not authorized, or contains JS code - if(!existArrayValue(attributes, cName.toLowerCase()) || ((cVal.toLowerCase()).match(/(^|"|')javascript:/))) - cSelector.removeAttr(cName); - }); - }); - - // Filter some other elements - $(code).find('a').attr('target', '_blank'); - - return $(code).find('html body').html(); -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/groupchat.js b/sources/extend/addon/matrix/jappixmini/jappix/js/groupchat.js deleted file mode 100644 index c8dd13b1..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/groupchat.js +++ /dev/null @@ -1,283 +0,0 @@ -/* - -Jappix - An open social platform -These are the groupchat JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Authors: Vanaryon, Maranda, Eric -Last revision: 28/08/11 - -*/ - -// Displays the MUC admin elements -function displayMucAdmin(affiliation, id, xid, statuscode) { - // We must be in the "login" mode - if(isAnonymous()) - return; - - // We check if the user is a room owner or administrator to give him privileges - if(affiliation == 'owner' || affiliation == 'admin') - $('#' + id + ' .tools-mucadmin').show(); - - // We check if the room hasn't been yet created - if(statuscode == 201) - openThisInfo(4); - - // We add the click event - $('#' + id + ' .tools-mucadmin').click(function() { - openMucAdmin(xid, affiliation); - }); -} - -// Initializes a connection with a MUC groupchat -function getMUC(room, nickname, password) { - // Room hash - var hash = hex_md5(room); - - // Reset the elements - $('#' + hash + ' .muc-ask').remove(); - $('#' + hash + ' .compose').show(); - - // No nickname? - if(!nickname) { - // Get some values - if(!isAnonymous()) - nickname = getNick(); - else - nickname = ANONYMOUS_NICK; - - // If the nickname could not be retrieved, ask it - if(!nickname) - generateMUCAsk('nickname', room, hash, nickname, password); - } - - // Got our nickname? - if(nickname) { - // Get our general presence - var show = getDB('presence-show', 1); - var status = getDB('options', 'presence-status'); - - // Set my nick - $('#' + hash).attr('data-nick', escape(nickname)); - - // Send the appropriate presence - sendPresence(room + '/' + nickname, '', show, status, '', true, password, handleMUC); - } - - return false; -} - -// Handles the MUC main elements -function handleMUC(presence) { - // We get the xml content - var xml = presence.getNode(); - var from = fullXID(getStanzaFrom(presence)); - var room = bareXID(from); - var nickname = thisResource(from); - var hash = hex_md5(room); - - // No ID: must fix M-Link bug - if(presence.getID() == null) - presence.setID(1); - - logThis('First MUC presence: ' + from, 3); - - // Catch the errors - if(!handleError(xml)) { - // Define some stuffs - var muc_user = $(xml).find('x[xmlns=' + NS_MUC_USER + ']'); - var affiliation = muc_user.find('item').attr('affiliation'); - var statuscode = parseInt(muc_user.find('status').attr('code')); - - // Handle my presence - handlePresence(presence); - - // Check if I am a room owner - displayMucAdmin(affiliation, hash, room, statuscode); - - // Tell the MUC we can notify the incoming presences - $(document).oneTime('15s', function() { - $('#' + hash).attr('data-initial', 'true'); - }); - - // Enable the chatting input - $(document).oneTime(10, function() { - $('#' + hash + ' .message-area').removeAttr('disabled').focus(); - }); - } - - // A password is required - else if($(xml).find('error[type=auth] not-authorized').size()) - generateMUCAsk('password', room, hash, nickname); - - // There's a nickname conflict - else if($(xml).find('error[type=cancel] conflict').size()) - generateMUCAsk('nickname', room, hash); -} - -// Generates a correct MUC asker -function generateMUCAsk(type, room, hash, nickname, password) { - // Generate the path to the elements - var path_to = '#' + hash + ' .muc-ask'; - - // Define the label text - var label_text; - - switch(type) { - case 'nickname': - label_text = _e("Nickname"); - break; - - case 'password': - label_text = _e("Password"); - break; - } - - // Create the HTML markup - $('#' + hash + ' .compose').hide(); - - $('#' + hash).append( - '
' + - '' + - '' + - '
' - ); - - // When a key is pressed in the input - $(path_to + ' input').keyup(function(e) { - var value_input = $(this).val(); - - // Enter key pressed - if((e.keyCode == 13) && value_input) { - if(type == 'nickname') - nickname = value_input; - else if(type == 'password') - password = value_input; - - return getMUC(room, nickname, password); - } - }); - - // Focus on the input - $(document).oneTime(10, function() { - $(path_to + ' input').focus(); - }); -} - -// Creates a new groupchat -function groupchatCreate(hash, room, chan, nickname, password) { - /* REF: http://xmpp.org/extensions/xep-0045.html */ - - logThis('New groupchat: ' + room, 3); - - // Create the chat content - generateChat('groupchat', hash, room, chan); - - // Create the chat switcher - generateSwitch('groupchat', hash, room, chan); - - // The icons-hover functions - tooltipIcons(room, hash); - - // Click event on the add tool - $('#' + hash + ' .tools-add').click(function() { - // Hide the icon (to tell the user all is okay) - $(this).hide(); - - // Add the groupchat to the user favorites - addThisFavorite(room, chan); - }); - - // Must show the add button? - if(!existDB('favorites', room)) - $('#' + hash + ' .tools-add').show(); - - // The event handlers - var inputDetect = $('#' + hash + ' .message-area'); - - // Focus event - inputDetect.focus(function() { - chanCleanNotify(hash); - }) - - // Blur event - inputDetect.blur(function() { - resetAutocompletion(hash); - }) - - // Lock to the input - inputDetect.keypress(function(e) { - // Enter key - if(e.keyCode == 13) { - // Add a new line - if(e.shiftKey) - inputDetect.val(inputDetect.val() + '\n'); - - // Send the message - else { - sendMessage(hash, 'groupchat'); - - // Reset the composing database entry - setDB('chatstate', room, 'off'); - } - - return false; - } - - // Tabulation key - else if(e.keyCode == 9) { - createAutocompletion(hash); - - return false; - } - - // Reset the autocompleter - else - resetAutocompletion(hash); - }); - - // Chatstate events - eventsChatState(inputDetect, room, hash); - - // Get the current muc informations and content - getMUC(room, nickname, password); -} - -// Joins the defined groupchats -function joinConfGroupchats() { - // Nothing to join? - if(!GROUPCHATS_JOIN) - return; - - // Values array - var muc_arr = [GROUPCHATS_JOIN]; - var new_arr = []; - - // Try to split it - if(GROUPCHATS_JOIN.indexOf(',') != -1) - muc_arr = GROUPCHATS_JOIN.split(','); - - for(i in muc_arr) { - // Get the current value - var muc_current = trim(muc_arr[i]); - - // No current value? - if(!muc_current) - continue; - - // Filter the current value - muc_current = generateXID(muc_current, 'groupchat'); - - // Add the current value - if(!existArrayValue(new_arr, muc_current)) - new_arr.push(muc_current); - } - - // Join the chats - if(new_arr.length) { - for(g in new_arr) - checkChatCreate(new_arr[g], 'groupchat'); - } -} diff --git a/sources/extend/addon/matrix/jappixmini/jappix/js/home.js b/sources/extend/addon/matrix/jappixmini/jappix/js/home.js deleted file mode 100644 index 5322501d..00000000 --- a/sources/extend/addon/matrix/jappixmini/jappix/js/home.js +++ /dev/null @@ -1,371 +0,0 @@ -/* - -Jappix - An open social platform -These are the homepage JS scripts for Jappix - -------------------------------------------------- - -License: AGPL -Authors: Vanaryon, LinkMauve -Last revision: 15/01/12 - -*/ - -// Allows the user to switch the difference home page elements -function switchHome(div) { - // Path to - var home = '#home .'; - var right = home + 'right '; - var current = right + '.homediv.' + div; - - // We switch the div - $(right + '.homediv, ' + right + '.top').hide(); - $(right + '.' + div).show(); - - // We reset the homedivs - $(home + 'homediv:not(.default), ' + home + 'top:not(.default)').remove(); - - // Get the HTML code to display - var disable_form = ''; - var lock_host = ''; - var code = ''; - - // Apply the previous link - switch(div) { - case 'loginer': - case 'anonymouser': - case 'registerer': - if(!exists(right + '.top.sub')) { - // Append the HTML code for previous link - $(right + '.top.default').after('

«

'); - - // Click event on previous link - $(home + 'top.sub a.previous').click(function() { - return switchHome('default'); - }); - } - - break; - } - - // Apply the form - switch(div) { - // Login tool - case 'loginer': - lock_host = disableInput(LOCK_HOST, 'on'); - code = '

' + printf(_e("Login to your existing XMPP account. You can also use the %s to join a groupchat."), '' + _e("anonymous mode") + '') + '

' + - - '
' + - '
' + - '' + _e("Required") + '' + - - '' + - '@' + - '' + - '' + - '' + - '' + - '
' + - - '' + _e("Advanced") + '' + - - '
' + - '' + _e("Advanced") + '' + - - '' + - '' + - '' + - '' + - '
' + - - '' + - '
'; - - break; - - // Anonymous login tool - case 'anonymouser': - disable_form = disableInput(ANONYMOUS, 'off'); - code = '

' + printf(_e("Enter the groupchat you want to join and the nick you want to have. You can also go back to the %s."), '' + _e("login page") + '') + '

' + - - '
' + - '
' + - '' + _e("Required") + '' + - - '' + - '' + - - '' + - '' + - '
' + - - '' + - '
' + - - '
' + - _e("Share this link with your friends:") + ' ' + - '
'; - - break; - - // Register tool - case 'registerer': - disable_form = disableInput(REGISTRATION, 'off'); - - if(!disable_form) - lock_host = disableInput(LOCK_HOST, 'on'); - - code = '

' + _e("Register a new XMPP account to join your friends on your own social cloud. That's simple!") + '

' + - - '
' + - '
' + - '' + _e("Required") + '' + - - '' + - '@' + - '' + - '' + - '' + - '
' + - - '' + - '
'; - - break; - } - - // Form disabled? - if(disable_form) - code += '
' + - _e("This tool has been disabled, you cannot use it!") + - '
'; - - // Create this HTML code - if(code && !exists(current)) { - // Append it! - $(right + '.homediv.default').after('
' + code + '
'); - - // Create the attached events - switch(div) { - // Login tool - case 'loginer': - $(current + ' a.to-anonymous').click(function() { - return switchHome('anonymouser'); - }); - - $(current + ' a.advanced').click(showAdvanced); - - $(current + ' form').submit(loginForm); - - break; - - // Anonymous login tool - case 'anonymouser': - $(current + ' a.to-home').click(function() { - return switchHome('loginer'); - }); - - $(current + ' form').submit(doAnonymous); - - // Keyup event on anonymous join's room input - $(current + ' input.room').keyup(function() { - var value = $(this).val(); - var report = current + ' .report'; - var span = report + ' span'; - - if(!value) { - $(report).hide(); - $(span).text(''); - } - - else { - $(report).show(); - $(span).text(JAPPIX_LOCATION + '?r=' + value); - } - }); - - break; - - // Register tool - case 'registerer': - $(current + ' form').submit(registerForm); - - break; - } - } - - // We focus on the first input - $(document).oneTime(10, function() { - $(right + 'input:visible:first').focus(); - }); - - return false; -} - -// Allows the user to display the advanced login options -function showAdvanced() { - // Hide the link - $('#home a.advanced').hide(); - - // Show the fieldset - $('#home fieldset.advanced').show(); - - return false; -} - -// Reads the login form values -function loginForm() { - // We get the values - var lPath = '#home .loginer '; - var lServer = $(lPath + '.server').val(); - var lNick = $(lPath + '.nick').val(); - var lPass = $(lPath + '.password').val(); - var lResource = $(lPath + '.resource').val(); - var lPriority = $(lPath + '.priority').val(); - var lRemember = $(lPath + '.remember').filter(':checked').size(); - - // Enough values? - if(lServer && lNick && lPass && lResource && lPriority) - doLogin(lNick, lServer, lPass, lResource, lPriority, lRemember); - - // Something is missing? - else { - $(lPath + 'input[type=text], ' + lPath + 'input[type=password]').each(function() { - var select = $(this); - - if(!select.val()) - $(document).oneTime(10, function() { - select.addClass('please-complete').focus(); - }); - else - select.removeClass('please-complete'); - }); - } - - return false; -} - -// Reads the register form values -function registerForm() { - var rPath = '#home .registerer '; - - // Remove the success info - $(rPath + '.success').remove(); - - // Get the values - var username = $(rPath + '.nick').val(); - var domain = $(rPath + '.server').val(); - var pass = $(rPath + '.password').val(); - var spass = $(rPath + '.spassword').val(); - - // Enough values? - if(domain && username && pass && spass && (pass == spass)) { - // We remove the not completed class to avoid problems - $('#home .registerer input').removeClass('please-complete'); - - // Fire the register event! - doRegister(username, domain, pass); - } - - // Something is missing? - else { - $(rPath + 'input[type=text], ' + rPath + 'input[type=password]').each(function() { - var select = $(this); - - if(!select.val() || (select.is('#spassword') && pass && (pass != spass))) - $(document).oneTime(10, function() { - select.addClass('please-complete').focus(); - }); - else - select.removeClass('please-complete'); - }); - } - - return false; -} - -// Plugin launcher -function launchHome() { - // Define the vars - var home = '#home '; - var button = home + 'button'; - var corp = home + '.corporation'; - var locale = home + '.locale'; - - // Removes the






'; - - } else { - - foreach ($frame as &$frameLine) { - $frameLine = join(' ', explode("\xc0", $frameLine)); - $frameLine = join('', explode("\xc1", $frameLine)); - $frameLine = join(' ', explode("\xa0", $frameLine)); - $frameLine = join('', explode("\xa1", $frameLine)); - $frameLine = join('', explode("\x84", $frameLine)); //format 0 - $frameLine = join('', explode("\x85", $frameLine)); //format 1 - $frameLine = join('', explode("\x81", $frameLine)); //special bit - $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 - $frameLine = join('', explode("\x91", $frameLine)); //clock 1 - $frameLine = join(' ', explode("\x88", $frameLine)); //version - $frameLine = join('', explode("\x89", $frameLine)); //version - $frameLine = join('♦', explode("\x01", $frameLine)); - $frameLine = join('⋅', explode("\0", $frameLine)); - } - - ?> - - "; - echo join("
", $frame); - echo "
"; - - } - } - - //---------------------------------------------------------------------- - public static function serial($frame) - { - return gzcompress(join("\n", $frame), 9); - } - - //---------------------------------------------------------------------- - public static function unserial($code) - { - return explode("\n", gzuncompress($code)); - } - - //---------------------------------------------------------------------- - public static function newFrame($version) - { - if($version < 1 || $version > QRSPEC_VERSION_MAX) - return null; - - if(!isset(self::$frames[$version])) { - - $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; - - if (QR_CACHEABLE) { - if (file_exists($fileName)) { - self::$frames[$version] = self::unserial(file_get_contents($fileName)); - } else { - self::$frames[$version] = self::createFrame($version); - file_put_contents($fileName, self::serial(self::$frames[$version])); - } - } else { - self::$frames[$version] = self::createFrame($version); - } - } - - if(is_null(self::$frames[$version])) - return null; - - return self::$frames[$version]; - } - - //---------------------------------------------------------------------- - public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } - public static function rsBlockNum1($spec) { return $spec[0]; } - public static function rsDataCodes1($spec) { return $spec[1]; } - public static function rsEccCodes1($spec) { return $spec[2]; } - public static function rsBlockNum2($spec) { return $spec[3]; } - public static function rsDataCodes2($spec) { return $spec[4]; } - public static function rsEccCodes2($spec) { return $spec[2]; } - public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } - public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } - - } - - - -//---- qrimage.php ----------------------------- - - - - -/* - * PHP QR Code encoder - * - * Image output of code using GD2 - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - define('QR_IMAGE', true); - - class QRimage { - - //---------------------------------------------------------------------- - public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) - { - $image = self::image($frame, $pixelPerPoint, $outerFrame); - - if ($filename === false) { - Header("Content-type: image/png"); - ImagePng($image); - } else { - if($saveandprint===TRUE){ - ImagePng($image, $filename); - header("Content-type: image/png"); - ImagePng($image); - }else{ - ImagePng($image, $filename); - } - } - - ImageDestroy($image); - } - - //---------------------------------------------------------------------- - public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) - { - $image = self::image($frame, $pixelPerPoint, $outerFrame); - - if ($filename === false) { - Header("Content-type: image/jpeg"); - ImageJpeg($image, null, $q); - } else { - ImageJpeg($image, $filename, $q); - } - - ImageDestroy($image); - } - - //---------------------------------------------------------------------- - private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) - { - $h = count($frame); - $w = strlen($frame[0]); - - $imgW = $w + 2*$outerFrame; - $imgH = $h + 2*$outerFrame; - - $base_image =ImageCreate($imgW, $imgH); - - $col[0] = ImageColorAllocate($base_image,255,255,255); - $col[1] = ImageColorAllocate($base_image,0,0,0); - - imagefill($base_image, 0, 0, $col[0]); - - for($y=0; $y<$h; $y++) { - for($x=0; $x<$w; $x++) { - if ($frame[$y][$x] == '1') { - ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); - } - } - } - - $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); - ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); - ImageDestroy($base_image); - - return $target_image; - } - } - - - -//---- qrinput.php ----------------------------- - - - - -/* - * PHP QR Code encoder - * - * Input encoding class - * - * Based on libqrencode C library distributed under LGPL 2.1 - * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - define('STRUCTURE_HEADER_BITS', 20); - define('MAX_STRUCTURED_SYMBOLS', 16); - - class QRinputItem { - - public $mode; - public $size; - public $data; - public $bstream; - - public function __construct($mode, $size, $data, $bstream = null) - { - $setData = array_slice($data, 0, $size); - - if (count($setData) < $size) { - $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); - } - - if(!QRinput::check($mode, $size, $setData)) { - throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); - return null; - } - - $this->mode = $mode; - $this->size = $size; - $this->data = $setData; - $this->bstream = $bstream; - } - - //---------------------------------------------------------------------- - public function encodeModeNum($version) - { - try { - - $words = (int)($this->size / 3); - $bs = new QRbitstream(); - - $val = 0x1; - $bs->appendNum(4, $val); - $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); - - for($i=0; $i<$words; $i++) { - $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; - $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; - $val += (ord($this->data[$i*3+2]) - ord('0')); - $bs->appendNum(10, $val); - } - - if($this->size - $words * 3 == 1) { - $val = ord($this->data[$words*3]) - ord('0'); - $bs->appendNum(4, $val); - } else if($this->size - $words * 3 == 2) { - $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; - $val += (ord($this->data[$words*3+1]) - ord('0')); - $bs->appendNum(7, $val); - } - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function encodeModeAn($version) - { - try { - $words = (int)($this->size / 2); - $bs = new QRbitstream(); - - $bs->appendNum(4, 0x02); - $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); - - for($i=0; $i<$words; $i++) { - $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; - $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); - - $bs->appendNum(11, $val); - } - - if($this->size & 1) { - $val = QRinput::lookAnTable(ord($this->data[$words * 2])); - $bs->appendNum(6, $val); - } - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function encodeMode8($version) - { - try { - $bs = new QRbitstream(); - - $bs->appendNum(4, 0x4); - $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); - - for($i=0; $i<$this->size; $i++) { - $bs->appendNum(8, ord($this->data[$i])); - } - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function encodeModeKanji($version) - { - try { - - $bs = new QRbitrtream(); - - $bs->appendNum(4, 0x8); - $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); - - for($i=0; $i<$this->size; $i+=2) { - $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); - if($val <= 0x9ffc) { - $val -= 0x8140; - } else { - $val -= 0xc140; - } - - $h = ($val >> 8) * 0xc0; - $val = ($val & 0xff) + $h; - - $bs->appendNum(13, $val); - } - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function encodeModeStructure() - { - try { - $bs = new QRbitstream(); - - $bs->appendNum(4, 0x03); - $bs->appendNum(4, ord($this->data[1]) - 1); - $bs->appendNum(4, ord($this->data[0]) - 1); - $bs->appendNum(8, ord($this->data[2])); - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function estimateBitStreamSizeOfEntry($version) - { - $bits = 0; - - if($version == 0) - $version = 1; - - switch($this->mode) { - case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; - case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; - case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; - case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; - case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; - default: - return 0; - } - - $l = QRspec::lengthIndicator($this->mode, $version); - $m = 1 << $l; - $num = (int)(($this->size + $m - 1) / $m); - - $bits += $num * (4 + $l); - - return $bits; - } - - //---------------------------------------------------------------------- - public function encodeBitStream($version) - { - try { - - unset($this->bstream); - $words = QRspec::maximumWords($this->mode, $version); - - if($this->size > $words) { - - $st1 = new QRinputItem($this->mode, $words, $this->data); - $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); - - $st1->encodeBitStream($version); - $st2->encodeBitStream($version); - - $this->bstream = new QRbitstream(); - $this->bstream->append($st1->bstream); - $this->bstream->append($st2->bstream); - - unset($st1); - unset($st2); - - } else { - - $ret = 0; - - switch($this->mode) { - case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; - case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; - case QR_MODE_8: $ret = $this->encodeMode8($version); break; - case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; - case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; - - default: - break; - } - - if($ret < 0) - return -1; - } - - return $this->bstream->size(); - - } catch (Exception $e) { - return -1; - } - } - }; - - //########################################################################## - - class QRinput { - - public $items; - - private $version; - private $level; - - //---------------------------------------------------------------------- - public function __construct($version = 0, $level = QR_ECLEVEL_L) - { - if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { - throw new Exception('Invalid version no'); - return NULL; - } - - $this->version = $version; - $this->level = $level; - } - - //---------------------------------------------------------------------- - public function getVersion() - { - return $this->version; - } - - //---------------------------------------------------------------------- - public function setVersion($version) - { - if($version < 0 || $version > QRSPEC_VERSION_MAX) { - throw new Exception('Invalid version no'); - return -1; - } - - $this->version = $version; - - return 0; - } - - //---------------------------------------------------------------------- - public function getErrorCorrectionLevel() - { - return $this->level; - } - - //---------------------------------------------------------------------- - public function setErrorCorrectionLevel($level) - { - if($level > QR_ECLEVEL_H) { - throw new Exception('Invalid ECLEVEL'); - return -1; - } - - $this->level = $level; - - return 0; - } - - //---------------------------------------------------------------------- - public function appendEntry(QRinputItem $entry) - { - $this->items[] = $entry; - } - - //---------------------------------------------------------------------- - public function append($mode, $size, $data) - { - try { - $entry = new QRinputItem($mode, $size, $data); - $this->items[] = $entry; - return 0; - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - - public function insertStructuredAppendHeader($size, $index, $parity) - { - if( $size > MAX_STRUCTURED_SYMBOLS ) { - throw new Exception('insertStructuredAppendHeader wrong size'); - } - - if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { - throw new Exception('insertStructuredAppendHeader wrong index'); - } - - $buf = array($size, $index, $parity); - - try { - $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); - array_unshift($this->items, $entry); - return 0; - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function calcParity() - { - $parity = 0; - - foreach($this->items as $item) { - if($item->mode != QR_MODE_STRUCTURE) { - for($i=$item->size-1; $i>=0; $i--) { - $parity ^= $item->data[$i]; - } - } - } - - return $parity; - } - - //---------------------------------------------------------------------- - public static function checkModeNum($size, $data) - { - for($i=0; $i<$size; $i++) { - if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ - return false; - } - } - - return true; - } - - //---------------------------------------------------------------------- - public static function estimateBitsModeNum($size) - { - $w = (int)$size / 3; - $bits = $w * 10; - - switch($size - $w * 3) { - case 1: - $bits += 4; - break; - case 2: - $bits += 7; - break; - default: - break; - } - - return $bits; - } - - //---------------------------------------------------------------------- - public static $anTable = array( - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 - ); - - //---------------------------------------------------------------------- - public static function lookAnTable($c) - { - return (($c > 127)?-1:self::$anTable[$c]); - } - - //---------------------------------------------------------------------- - public static function checkModeAn($size, $data) - { - for($i=0; $i<$size; $i++) { - if (self::lookAnTable(ord($data[$i])) == -1) { - return false; - } - } - - return true; - } - - //---------------------------------------------------------------------- - public static function estimateBitsModeAn($size) - { - $w = (int)($size / 2); - $bits = $w * 11; - - if($size & 1) { - $bits += 6; - } - - return $bits; - } - - //---------------------------------------------------------------------- - public static function estimateBitsMode8($size) - { - return $size * 8; - } - - //---------------------------------------------------------------------- - public function estimateBitsModeKanji($size) - { - return (int)(($size / 2) * 13); - } - - //---------------------------------------------------------------------- - public static function checkModeKanji($size, $data) - { - if($size & 1) - return false; - - for($i=0; $i<$size; $i+=2) { - $val = (ord($data[$i]) << 8) | ord($data[$i+1]); - if( $val < 0x8140 - || ($val > 0x9ffc && $val < 0xe040) - || $val > 0xebbf) { - return false; - } - } - - return true; - } - - /*********************************************************************** - * Validation - **********************************************************************/ - - public static function check($mode, $size, $data) - { - if($size <= 0) - return false; - - switch($mode) { - case QR_MODE_NUM: return self::checkModeNum($size, $data); break; - case QR_MODE_AN: return self::checkModeAn($size, $data); break; - case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; - case QR_MODE_8: return true; break; - case QR_MODE_STRUCTURE: return true; break; - - default: - break; - } - - return false; - } - - - //---------------------------------------------------------------------- - public function estimateBitStreamSize($version) - { - $bits = 0; - - foreach($this->items as $item) { - $bits += $item->estimateBitStreamSizeOfEntry($version); - } - - return $bits; - } - - //---------------------------------------------------------------------- - public function estimateVersion() - { - $version = 0; - $prev = 0; - do { - $prev = $version; - $bits = $this->estimateBitStreamSize($prev); - $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); - if ($version < 0) { - return -1; - } - } while ($version > $prev); - - return $version; - } - - //---------------------------------------------------------------------- - public static function lengthOfCode($mode, $version, $bits) - { - $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); - switch($mode) { - case QR_MODE_NUM: - $chunks = (int)($payload / 10); - $remain = $payload - $chunks * 10; - $size = $chunks * 3; - if($remain >= 7) { - $size += 2; - } else if($remain >= 4) { - $size += 1; - } - break; - case QR_MODE_AN: - $chunks = (int)($payload / 11); - $remain = $payload - $chunks * 11; - $size = $chunks * 2; - if($remain >= 6) - $size++; - break; - case QR_MODE_8: - $size = (int)($payload / 8); - break; - case QR_MODE_KANJI: - $size = (int)(($payload / 13) * 2); - break; - case QR_MODE_STRUCTURE: - $size = (int)($payload / 8); - break; - default: - $size = 0; - break; - } - - $maxsize = QRspec::maximumWords($mode, $version); - if($size < 0) $size = 0; - if($size > $maxsize) $size = $maxsize; - - return $size; - } - - //---------------------------------------------------------------------- - public function createBitStream() - { - $total = 0; - - foreach($this->items as $item) { - $bits = $item->encodeBitStream($this->version); - - if($bits < 0) - return -1; - - $total += $bits; - } - - return $total; - } - - //---------------------------------------------------------------------- - public function convertData() - { - $ver = $this->estimateVersion(); - if($ver > $this->getVersion()) { - $this->setVersion($ver); - } - - for(;;) { - $bits = $this->createBitStream(); - - if($bits < 0) - return -1; - - $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); - if($ver < 0) { - throw new Exception('WRONG VERSION'); - return -1; - } else if($ver > $this->getVersion()) { - $this->setVersion($ver); - } else { - break; - } - } - - return 0; - } - - //---------------------------------------------------------------------- - public function appendPaddingBit(&$bstream) - { - $bits = $bstream->size(); - $maxwords = QRspec::getDataLength($this->version, $this->level); - $maxbits = $maxwords * 8; - - if ($maxbits == $bits) { - return 0; - } - - if ($maxbits - $bits < 5) { - return $bstream->appendNum($maxbits - $bits, 0); - } - - $bits += 4; - $words = (int)(($bits + 7) / 8); - - $padding = new QRbitstream(); - $ret = $padding->appendNum($words * 8 - $bits + 4, 0); - - if($ret < 0) - return $ret; - - $padlen = $maxwords - $words; - - if($padlen > 0) { - - $padbuf = array(); - for($i=0; $i<$padlen; $i++) { - $padbuf[$i] = ($i&1)?0x11:0xec; - } - - $ret = $padding->appendBytes($padlen, $padbuf); - - if($ret < 0) - return $ret; - - } - - $ret = $bstream->append($padding); - - return $ret; - } - - //---------------------------------------------------------------------- - public function mergeBitStream() - { - if($this->convertData() < 0) { - return null; - } - - $bstream = new QRbitstream(); - - foreach($this->items as $item) { - $ret = $bstream->append($item->bstream); - if($ret < 0) { - return null; - } - } - - return $bstream; - } - - //---------------------------------------------------------------------- - public function getBitStream() - { - - $bstream = $this->mergeBitStream(); - - if($bstream == null) { - return null; - } - - $ret = $this->appendPaddingBit($bstream); - if($ret < 0) { - return null; - } - - return $bstream; - } - - //---------------------------------------------------------------------- - public function getByteStream() - { - $bstream = $this->getBitStream(); - if($bstream == null) { - return null; - } - - return $bstream->toByte(); - } - } - - - - - - -//---- qrbitstream.php ----------------------------- - - - - -/* - * PHP QR Code encoder - * - * Bitstream class - * - * Based on libqrencode C library distributed under LGPL 2.1 - * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - class QRbitstream { - - public $data = array(); - - //---------------------------------------------------------------------- - public function size() - { - return count($this->data); - } - - //---------------------------------------------------------------------- - public function allocate($setLength) - { - $this->data = array_fill(0, $setLength, 0); - return 0; - } - - //---------------------------------------------------------------------- - public static function newFromNum($bits, $num) - { - $bstream = new QRbitstream(); - $bstream->allocate($bits); - - $mask = 1 << ($bits - 1); - for($i=0; $i<$bits; $i++) { - if($num & $mask) { - $bstream->data[$i] = 1; - } else { - $bstream->data[$i] = 0; - } - $mask = $mask >> 1; - } - - return $bstream; - } - - //---------------------------------------------------------------------- - public static function newFromBytes($size, $data) - { - $bstream = new QRbitstream(); - $bstream->allocate($size * 8); - $p=0; - - for($i=0; $i<$size; $i++) { - $mask = 0x80; - for($j=0; $j<8; $j++) { - if($data[$i] & $mask) { - $bstream->data[$p] = 1; - } else { - $bstream->data[$p] = 0; - } - $p++; - $mask = $mask >> 1; - } - } - - return $bstream; - } - - //---------------------------------------------------------------------- - public function append(QRbitstream $arg) - { - if (is_null($arg)) { - return -1; - } - - if($arg->size() == 0) { - return 0; - } - - if($this->size() == 0) { - $this->data = $arg->data; - return 0; - } - - $this->data = array_values(array_merge($this->data, $arg->data)); - - return 0; - } - - //---------------------------------------------------------------------- - public function appendNum($bits, $num) - { - if ($bits == 0) - return 0; - - $b = QRbitstream::newFromNum($bits, $num); - - if(is_null($b)) - return -1; - - $ret = $this->append($b); - unset($b); - - return $ret; - } - - //---------------------------------------------------------------------- - public function appendBytes($size, $data) - { - if ($size == 0) - return 0; - - $b = QRbitstream::newFromBytes($size, $data); - - if(is_null($b)) - return -1; - - $ret = $this->append($b); - unset($b); - - return $ret; - } - - //---------------------------------------------------------------------- - public function toByte() - { - - $size = $this->size(); - - if($size == 0) { - return array(); - } - - $data = array_fill(0, (int)(($size + 7) / 8), 0); - $bytes = (int)($size / 8); - - $p = 0; - - for($i=0; $i<$bytes; $i++) { - $v = 0; - for($j=0; $j<8; $j++) { - $v = $v << 1; - $v |= $this->data[$p]; - $p++; - } - $data[$i] = $v; - } - - if($size & 7) { - $v = 0; - for($j=0; $j<($size & 7); $j++) { - $v = $v << 1; - $v |= $this->data[$p]; - $p++; - } - $data[$bytes] = $v; - } - - return $data; - } - - } - - - - -//---- qrsplit.php ----------------------------- - - - - -/* - * PHP QR Code encoder - * - * Input splitting classes - * - * Based on libqrencode C library distributed under LGPL 2.1 - * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * The following data / specifications are taken from - * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) - * or - * "Automatic identification and data capture techniques -- - * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - class QRsplit { - - public $dataStr = ''; - public $input; - public $modeHint; - - //---------------------------------------------------------------------- - public function __construct($dataStr, $input, $modeHint) - { - $this->dataStr = $dataStr; - $this->input = $input; - $this->modeHint = $modeHint; - } - - //---------------------------------------------------------------------- - public static function isdigitat($str, $pos) - { - if ($pos >= strlen($str)) - return false; - - return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); - } - - //---------------------------------------------------------------------- - public static function isalnumat($str, $pos) - { - if ($pos >= strlen($str)) - return false; - - return (QRinput::lookAnTable(ord($str[$pos])) >= 0); - } - - //---------------------------------------------------------------------- - public function identifyMode($pos) - { - if ($pos >= strlen($this->dataStr)) - return QR_MODE_NUL; - - $c = $this->dataStr[$pos]; - - if(self::isdigitat($this->dataStr, $pos)) { - return QR_MODE_NUM; - } else if(self::isalnumat($this->dataStr, $pos)) { - return QR_MODE_AN; - } else if($this->modeHint == QR_MODE_KANJI) { - - if ($pos+1 < strlen($this->dataStr)) - { - $d = $this->dataStr[$pos+1]; - $word = (ord($c) << 8) | ord($d); - if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { - return QR_MODE_KANJI; - } - } - } - - return QR_MODE_8; - } - - //---------------------------------------------------------------------- - public function eatNum() - { - $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); - - $p = 0; - while(self::isdigitat($this->dataStr, $p)) { - $p++; - } - - $run = $p; - $mode = $this->identifyMode($p); - - if($mode == QR_MODE_8) { - $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln - + QRinput::estimateBitsMode8(1) // + 4 + l8 - - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 - if($dif > 0) { - return $this->eat8(); - } - } - if($mode == QR_MODE_AN) { - $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln - + QRinput::estimateBitsModeAn(1) // + 4 + la - - QRinput::estimateBitsModeAn($run + 1);// - 4 - la - if($dif > 0) { - return $this->eatAn(); - } - } - - $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); - if($ret < 0) - return -1; - - return $run; - } - - //---------------------------------------------------------------------- - public function eatAn() - { - $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); - $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); - - $p = 0; - - while(self::isalnumat($this->dataStr, $p)) { - if(self::isdigitat($this->dataStr, $p)) { - $q = $p; - while(self::isdigitat($this->dataStr, $q)) { - $q++; - } - - $dif = QRinput::estimateBitsModeAn($p) // + 4 + la - + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - - QRinput::estimateBitsModeAn($q); // - 4 - la - - if($dif < 0) { - break; - } else { - $p = $q; - } - } else { - $p++; - } - } - - $run = $p; - - if(!self::isalnumat($this->dataStr, $p)) { - $dif = QRinput::estimateBitsModeAn($run) + 4 + $la - + QRinput::estimateBitsMode8(1) // + 4 + l8 - - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 - if($dif > 0) { - return $this->eat8(); - } - } - - $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); - if($ret < 0) - return -1; - - return $run; - } - - //---------------------------------------------------------------------- - public function eatKanji() - { - $p = 0; - - while($this->identifyMode($p) == QR_MODE_KANJI) { - $p += 2; - } - - $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); - if($ret < 0) - return -1; - - return $run; - } - - //---------------------------------------------------------------------- - public function eat8() - { - $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); - $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); - - $p = 1; - $dataStrLen = strlen($this->dataStr); - - while($p < $dataStrLen) { - - $mode = $this->identifyMode($p); - if($mode == QR_MODE_KANJI) { - break; - } - if($mode == QR_MODE_NUM) { - $q = $p; - while(self::isdigitat($this->dataStr, $q)) { - $q++; - } - $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 - + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - - QRinput::estimateBitsMode8($q); // - 4 - l8 - if($dif < 0) { - break; - } else { - $p = $q; - } - } else if($mode == QR_MODE_AN) { - $q = $p; - while(self::isalnumat($this->dataStr, $q)) { - $q++; - } - $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 - + QRinput::estimateBitsModeAn($q - $p) + 4 + $la - - QRinput::estimateBitsMode8($q); // - 4 - l8 - if($dif < 0) { - break; - } else { - $p = $q; - } - } else { - $p++; - } - } - - $run = $p; - $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); - - if($ret < 0) - return -1; - - return $run; - } - - //---------------------------------------------------------------------- - public function splitString() - { - while (strlen($this->dataStr) > 0) - { - if($this->dataStr == '') - return 0; - - $mode = $this->identifyMode(0); - - switch ($mode) { - case QR_MODE_NUM: $length = $this->eatNum(); break; - case QR_MODE_AN: $length = $this->eatAn(); break; - case QR_MODE_KANJI: - if ($hint == QR_MODE_KANJI) - $length = $this->eatKanji(); - else $length = $this->eat8(); - break; - default: $length = $this->eat8(); break; - - } - - if($length == 0) return 0; - if($length < 0) return -1; - - $this->dataStr = substr($this->dataStr, $length); - } - } - - //---------------------------------------------------------------------- - public function toUpper() - { - $stringLen = strlen($this->dataStr); - $p = 0; - - while ($p<$stringLen) { - $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); - if($mode == QR_MODE_KANJI) { - $p += 2; - } else { - if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { - $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); - } - $p++; - } - } - - return $this->dataStr; - } - - //---------------------------------------------------------------------- - public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) - { - if(is_null($string) || $string == '\0' || $string == '') { - throw new Exception('empty string!!!'); - } - - $split = new QRsplit($string, $input, $modeHint); - - if(!$casesensitive) - $split->toUpper(); - - return $split->splitString(); - } - } - - - -//---- qrrscode.php ----------------------------- - - - - -/* - * PHP QR Code encoder - * - * Reed-Solomon error correction support - * - * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q - * (libfec is released under the GNU Lesser General Public License.) - * - * Based on libqrencode C library distributed under LGPL 2.1 - * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - class QRrsItem { - - public $mm; // Bits per symbol - public $nn; // Symbols per block (= (1<= $this->nn) { - $x -= $this->nn; - $x = ($x >> $this->mm) + ($x & $this->nn); - } - - return $x; - } - - //---------------------------------------------------------------------- - public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) - { - // Common code for intializing a Reed-Solomon control block (char or int symbols) - // Copyright 2004 Phil Karn, KA9Q - // May be used under the terms of the GNU Lesser General Public License (LGPL) - - $rs = null; - - // Check parameter ranges - if($symsize < 0 || $symsize > 8) return $rs; - if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; - if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; - if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! - if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding - - $rs = new QRrsItem(); - $rs->mm = $symsize; - $rs->nn = (1<<$symsize)-1; - $rs->pad = $pad; - - $rs->alpha_to = array_fill(0, $rs->nn+1, 0); - $rs->index_of = array_fill(0, $rs->nn+1, 0); - - // PHP style macro replacement ;) - $NN =& $rs->nn; - $A0 =& $NN; - - // Generate Galois field lookup tables - $rs->index_of[0] = $A0; // log(zero) = -inf - $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 - $sr = 1; - - for($i=0; $i<$rs->nn; $i++) { - $rs->index_of[$sr] = $i; - $rs->alpha_to[$i] = $sr; - $sr <<= 1; - if($sr & (1<<$symsize)) { - $sr ^= $gfpoly; - } - $sr &= $rs->nn; - } - - if($sr != 1){ - // field generator polynomial is not primitive! - $rs = NULL; - return $rs; - } - - /* Form RS code generator polynomial from its roots */ - $rs->genpoly = array_fill(0, $nroots+1, 0); - - $rs->fcr = $fcr; - $rs->prim = $prim; - $rs->nroots = $nroots; - $rs->gfpoly = $gfpoly; - - /* Find prim-th root of 1, used in decoding */ - for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) - ; // intentional empty-body loop! - - $rs->iprim = (int)($iprim / $prim); - $rs->genpoly[0] = 1; - - for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { - $rs->genpoly[$i+1] = 1; - - // Multiply rs->genpoly[] by @**(root + x) - for ($j = $i; $j > 0; $j--) { - if ($rs->genpoly[$j] != 0) { - $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; - } else { - $rs->genpoly[$j] = $rs->genpoly[$j-1]; - } - } - // rs->genpoly[0] can never be zero - $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; - } - - // convert rs->genpoly[] to index form for quicker encoding - for ($i = 0; $i <= $nroots; $i++) - $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; - - return $rs; - } - - //---------------------------------------------------------------------- - public function encode_rs_char($data, &$parity) - { - $MM =& $this->mm; - $NN =& $this->nn; - $ALPHA_TO =& $this->alpha_to; - $INDEX_OF =& $this->index_of; - $GENPOLY =& $this->genpoly; - $NROOTS =& $this->nroots; - $FCR =& $this->fcr; - $PRIM =& $this->prim; - $IPRIM =& $this->iprim; - $PAD =& $this->pad; - $A0 =& $NN; - - $parity = array_fill(0, $NROOTS, 0); - - for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { - - $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; - if($feedback != $A0) { - // feedback term is non-zero - - // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must - // always be for the polynomials constructed by init_rs() - $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); - - for($j=1;$j<$NROOTS;$j++) { - $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; - } - } - - // Shift - array_shift($parity); - if($feedback != $A0) { - array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); - } else { - array_push($parity, 0); - } - } - } - } - - //########################################################################## - - class QRrs { - - public static $items = array(); - - //---------------------------------------------------------------------- - public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) - { - foreach(self::$items as $rs) { - if($rs->pad != $pad) continue; - if($rs->nroots != $nroots) continue; - if($rs->mm != $symsize) continue; - if($rs->gfpoly != $gfpoly) continue; - if($rs->fcr != $fcr) continue; - if($rs->prim != $prim) continue; - - return $rs; - } - - $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); - array_unshift(self::$items, $rs); - - return $rs; - } - } - - - -//---- qrmask.php ----------------------------- - - - - -/* - * PHP QR Code encoder - * - * Masking - * - * Based on libqrencode C library distributed under LGPL 2.1 - * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - define('N1', 3); - define('N2', 3); - define('N3', 40); - define('N4', 10); - - class QRmask { - - public $runLength = array(); - - //---------------------------------------------------------------------- - public function __construct() - { - $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); - } - - //---------------------------------------------------------------------- - public function writeFormatInformation($width, &$frame, $mask, $level) - { - $blacks = 0; - $format = QRspec::getFormatInfo($mask, $level); - - for($i=0; $i<8; $i++) { - if($format & 1) { - $blacks += 2; - $v = 0x85; - } else { - $v = 0x84; - } - - $frame[8][$width - 1 - $i] = chr($v); - if($i < 6) { - $frame[$i][8] = chr($v); - } else { - $frame[$i + 1][8] = chr($v); - } - $format = $format >> 1; - } - - for($i=0; $i<7; $i++) { - if($format & 1) { - $blacks += 2; - $v = 0x85; - } else { - $v = 0x84; - } - - $frame[$width - 7 + $i][8] = chr($v); - if($i == 0) { - $frame[8][7] = chr($v); - } else { - $frame[8][6 - $i] = chr($v); - } - - $format = $format >> 1; - } - - return $blacks; - } - - //---------------------------------------------------------------------- - public function mask0($x, $y) { return ($x+$y)&1; } - public function mask1($x, $y) { return ($y&1); } - public function mask2($x, $y) { return ($x%3); } - public function mask3($x, $y) { return ($x+$y)%3; } - public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } - public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } - public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } - public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } - - //---------------------------------------------------------------------- - private function generateMaskNo($maskNo, $width, $frame) - { - $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); - - for($y=0; $y<$width; $y++) { - for($x=0; $x<$width; $x++) { - if(ord($frame[$y][$x]) & 0x80) { - $bitMask[$y][$x] = 0; - } else { - $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); - $bitMask[$y][$x] = ($maskFunc == 0)?1:0; - } - - } - } - - return $bitMask; - } - - //---------------------------------------------------------------------- - public static function serial($bitFrame) - { - $codeArr = array(); - - foreach ($bitFrame as $line) - $codeArr[] = join('', $line); - - return gzcompress(join("\n", $codeArr), 9); - } - - //---------------------------------------------------------------------- - public static function unserial($code) - { - $codeArr = array(); - - $codeLines = explode("\n", gzuncompress($code)); - foreach ($codeLines as $line) - $codeArr[] = str_split($line); - - return $codeArr; - } - - //---------------------------------------------------------------------- - public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) - { - $b = 0; - $bitMask = array(); - - $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; - - if (QR_CACHEABLE) { - if (file_exists($fileName)) { - $bitMask = self::unserial(file_get_contents($fileName)); - } else { - $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); - if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) - mkdir(QR_CACHE_DIR.'mask_'.$maskNo); - file_put_contents($fileName, self::serial($bitMask)); - } - } else { - $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); - } - - if ($maskGenOnly) - return; - - $d = $s; - - for($y=0; $y<$width; $y++) { - for($x=0; $x<$width; $x++) { - if($bitMask[$y][$x] == 1) { - $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); - } - $b += (int)(ord($d[$y][$x]) & 1); - } - } - - return $b; - } - - //---------------------------------------------------------------------- - public function makeMask($width, $frame, $maskNo, $level) - { - $masked = array_fill(0, $width, str_repeat("\0", $width)); - $this->makeMaskNo($maskNo, $width, $frame, $masked); - $this->writeFormatInformation($width, $masked, $maskNo, $level); - - return $masked; - } - - //---------------------------------------------------------------------- - public function calcN1N3($length) - { - $demerit = 0; - - for($i=0; $i<$length; $i++) { - - if($this->runLength[$i] >= 5) { - $demerit += (N1 + ($this->runLength[$i] - 5)); - } - if($i & 1) { - if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { - $fact = (int)($this->runLength[$i] / 3); - if(($this->runLength[$i-2] == $fact) && - ($this->runLength[$i-1] == $fact) && - ($this->runLength[$i+1] == $fact) && - ($this->runLength[$i+2] == $fact)) { - if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { - $demerit += N3; - } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { - $demerit += N3; - } - } - } - } - } - return $demerit; - } - - //---------------------------------------------------------------------- - public function evaluateSymbol($width, $frame) - { - $head = 0; - $demerit = 0; - - for($y=0; $y<$width; $y++) { - $head = 0; - $this->runLength[0] = 1; - - $frameY = $frame[$y]; - - if ($y>0) - $frameYM = $frame[$y-1]; - - for($x=0; $x<$width; $x++) { - if(($x > 0) && ($y > 0)) { - $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); - $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); - - if(($b22 | ($w22 ^ 1))&1) { - $demerit += N2; - } - } - if(($x == 0) && (ord($frameY[$x]) & 1)) { - $this->runLength[0] = -1; - $head = 1; - $this->runLength[$head] = 1; - } else if($x > 0) { - if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { - $head++; - $this->runLength[$head] = 1; - } else { - $this->runLength[$head]++; - } - } - } - - $demerit += $this->calcN1N3($head+1); - } - - for($x=0; $x<$width; $x++) { - $head = 0; - $this->runLength[0] = 1; - - for($y=0; $y<$width; $y++) { - if($y == 0 && (ord($frame[$y][$x]) & 1)) { - $this->runLength[0] = -1; - $head = 1; - $this->runLength[$head] = 1; - } else if($y > 0) { - if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { - $head++; - $this->runLength[$head] = 1; - } else { - $this->runLength[$head]++; - } - } - } - - $demerit += $this->calcN1N3($head+1); - } - - return $demerit; - } - - - //---------------------------------------------------------------------- - public function mask($width, $frame, $level) - { - $minDemerit = PHP_INT_MAX; - $bestMaskNum = 0; - $bestMask = array(); - - $checked_masks = array(0,1,2,3,4,5,6,7); - - if (QR_FIND_FROM_RANDOM !== false) { - - $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); - for ($i = 0; $i < $howManuOut; $i++) { - $remPos = rand (0, count($checked_masks)-1); - unset($checked_masks[$remPos]); - $checked_masks = array_values($checked_masks); - } - - } - - $bestMask = $frame; - - foreach($checked_masks as $i) { - $mask = array_fill(0, $width, str_repeat("\0", $width)); - - $demerit = 0; - $blacks = 0; - $blacks = $this->makeMaskNo($i, $width, $frame, $mask); - $blacks += $this->writeFormatInformation($width, $mask, $i, $level); - $blacks = (int)(100 * $blacks / ($width * $width)); - $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); - $demerit += $this->evaluateSymbol($width, $mask); - - if($demerit < $minDemerit) { - $minDemerit = $demerit; - $bestMask = $mask; - $bestMaskNum = $i; - } - } - - return $bestMask; - } - - //---------------------------------------------------------------------- - } - - - - -//---- qrencode.php ----------------------------- - - - - -/* - * PHP QR Code encoder - * - * Main encoder classes. - * - * Based on libqrencode C library distributed under LGPL 2.1 - * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - class QRrsblock { - public $dataLength; - public $data = array(); - public $eccLength; - public $ecc = array(); - - public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) - { - $rs->encode_rs_char($data, $ecc); - - $this->dataLength = $dl; - $this->data = $data; - $this->eccLength = $el; - $this->ecc = $ecc; - } - }; - - //########################################################################## - - class QRrawcode { - public $version; - public $datacode = array(); - public $ecccode = array(); - public $blocks; - public $rsblocks = array(); //of RSblock - public $count; - public $dataLength; - public $eccLength; - public $b1; - - //---------------------------------------------------------------------- - public function __construct(QRinput $input) - { - $spec = array(0,0,0,0,0); - - $this->datacode = $input->getByteStream(); - if(is_null($this->datacode)) { - throw new Exception('null imput string'); - } - - QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); - - $this->version = $input->getVersion(); - $this->b1 = QRspec::rsBlockNum1($spec); - $this->dataLength = QRspec::rsDataLength($spec); - $this->eccLength = QRspec::rsEccLength($spec); - $this->ecccode = array_fill(0, $this->eccLength, 0); - $this->blocks = QRspec::rsBlockNum($spec); - - $ret = $this->init($spec); - if($ret < 0) { - throw new Exception('block alloc error'); - return null; - } - - $this->count = 0; - } - - //---------------------------------------------------------------------- - public function init(array $spec) - { - $dl = QRspec::rsDataCodes1($spec); - $el = QRspec::rsEccCodes1($spec); - $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); - - - $blockNo = 0; - $dataPos = 0; - $eccPos = 0; - for($i=0; $iecccode,$eccPos); - $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); - $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); - - $dataPos += $dl; - $eccPos += $el; - $blockNo++; - } - - if(QRspec::rsBlockNum2($spec) == 0) - return 0; - - $dl = QRspec::rsDataCodes2($spec); - $el = QRspec::rsEccCodes2($spec); - $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); - - if($rs == NULL) return -1; - - for($i=0; $iecccode,$eccPos); - $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); - $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); - - $dataPos += $dl; - $eccPos += $el; - $blockNo++; - } - - return 0; - } - - //---------------------------------------------------------------------- - public function getCode() - { - $ret; - - if($this->count < $this->dataLength) { - $row = $this->count % $this->blocks; - $col = $this->count / $this->blocks; - if($col >= $this->rsblocks[0]->dataLength) { - $row += $this->b1; - } - $ret = $this->rsblocks[$row]->data[$col]; - } else if($this->count < $this->dataLength + $this->eccLength) { - $row = ($this->count - $this->dataLength) % $this->blocks; - $col = ($this->count - $this->dataLength) / $this->blocks; - $ret = $this->rsblocks[$row]->ecc[$col]; - } else { - return 0; - } - $this->count++; - - return $ret; - } - } - - //########################################################################## - - class QRcode { - - public $version; - public $width; - public $data; - - //---------------------------------------------------------------------- - public function encodeMask(QRinput $input, $mask) - { - if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { - throw new Exception('wrong version'); - } - if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { - throw new Exception('wrong level'); - } - - $raw = new QRrawcode($input); - - QRtools::markTime('after_raw'); - - $version = $raw->version; - $width = QRspec::getWidth($version); - $frame = QRspec::newFrame($version); - - $filler = new FrameFiller($width, $frame); - if(is_null($filler)) { - return NULL; - } - - // inteleaved data and ecc codes - for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { - $code = $raw->getCode(); - $bit = 0x80; - for($j=0; $j<8; $j++) { - $addr = $filler->next(); - $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); - $bit = $bit >> 1; - } - } - - QRtools::markTime('after_filler'); - - unset($raw); - - // remainder bits - $j = QRspec::getRemainder($version); - for($i=0; $i<$j; $i++) { - $addr = $filler->next(); - $filler->setFrameAt($addr, 0x02); - } - - $frame = $filler->frame; - unset($filler); - - - // masking - $maskObj = new QRmask(); - if($mask < 0) { - - if (QR_FIND_BEST_MASK) { - $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); - } else { - $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); - } - } else { - $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); - } - - if($masked == NULL) { - return NULL; - } - - QRtools::markTime('after_mask'); - - $this->version = $version; - $this->width = $width; - $this->data = $masked; - - return $this; - } - - //---------------------------------------------------------------------- - public function encodeInput(QRinput $input) - { - return $this->encodeMask($input, -1); - } - - //---------------------------------------------------------------------- - public function encodeString8bit($string, $version, $level) - { - if(string == NULL) { - throw new Exception('empty string!'); - return NULL; - } - - $input = new QRinput($version, $level); - if($input == NULL) return NULL; - - $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); - if($ret < 0) { - unset($input); - return NULL; - } - return $this->encodeInput($input); - } - - //---------------------------------------------------------------------- - public function encodeString($string, $version, $level, $hint, $casesensitive) - { - - if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { - throw new Exception('bad hint'); - return NULL; - } - - $input = new QRinput($version, $level); - if($input == NULL) return NULL; - - $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); - if($ret < 0) { - return NULL; - } - - return $this->encodeInput($input); - } - - //---------------------------------------------------------------------- - public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) - { - $enc = QRencode::factory($level, $size, $margin); - return $enc->encodePNG($text, $outfile, $saveandprint=false); - } - - //---------------------------------------------------------------------- - public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) - { - $enc = QRencode::factory($level, $size, $margin); - return $enc->encode($text, $outfile); - } - - //---------------------------------------------------------------------- - public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) - { - $enc = QRencode::factory($level, $size, $margin); - return $enc->encodeRAW($text, $outfile); - } - } - - //########################################################################## - - class FrameFiller { - - public $width; - public $frame; - public $x; - public $y; - public $dir; - public $bit; - - //---------------------------------------------------------------------- - public function __construct($width, &$frame) - { - $this->width = $width; - $this->frame = $frame; - $this->x = $width - 1; - $this->y = $width - 1; - $this->dir = -1; - $this->bit = -1; - } - - //---------------------------------------------------------------------- - public function setFrameAt($at, $val) - { - $this->frame[$at['y']][$at['x']] = chr($val); - } - - //---------------------------------------------------------------------- - public function getFrameAt($at) - { - return ord($this->frame[$at['y']][$at['x']]); - } - - //---------------------------------------------------------------------- - public function next() - { - do { - - if($this->bit == -1) { - $this->bit = 0; - return array('x'=>$this->x, 'y'=>$this->y); - } - - $x = $this->x; - $y = $this->y; - $w = $this->width; - - if($this->bit == 0) { - $x--; - $this->bit++; - } else { - $x++; - $y += $this->dir; - $this->bit--; - } - - if($this->dir < 0) { - if($y < 0) { - $y = 0; - $x -= 2; - $this->dir = 1; - if($x == 6) { - $x--; - $y = 9; - } - } - } else { - if($y == $w) { - $y = $w - 1; - $x -= 2; - $this->dir = -1; - if($x == 6) { - $x--; - $y -= 8; - } - } - } - if($x < 0 || $y < 0) return null; - - $this->x = $x; - $this->y = $y; - - } while(ord($this->frame[$y][$x]) & 0x80); - - return array('x'=>$x, 'y'=>$y); - } - - } ; - - //########################################################################## - - class QRencode { - - public $casesensitive = true; - public $eightbit = false; - - public $version = 0; - public $size = 3; - public $margin = 4; - - public $structured = 0; // not supported yet - - public $level = QR_ECLEVEL_L; - public $hint = QR_MODE_8; - - //---------------------------------------------------------------------- - public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) - { - $enc = new QRencode(); - $enc->size = $size; - $enc->margin = $margin; - - switch ($level.'') { - case '0': - case '1': - case '2': - case '3': - $enc->level = $level; - break; - case 'l': - case 'L': - $enc->level = QR_ECLEVEL_L; - break; - case 'm': - case 'M': - $enc->level = QR_ECLEVEL_M; - break; - case 'q': - case 'Q': - $enc->level = QR_ECLEVEL_Q; - break; - case 'h': - case 'H': - $enc->level = QR_ECLEVEL_H; - break; - } - - return $enc; - } - - //---------------------------------------------------------------------- - public function encodeRAW($intext, $outfile = false) - { - $code = new QRcode(); - - if($this->eightbit) { - $code->encodeString8bit($intext, $this->version, $this->level); - } else { - $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); - } - - return $code->data; - } - - //---------------------------------------------------------------------- - public function encode($intext, $outfile = false) - { - $code = new QRcode(); - - if($this->eightbit) { - $code->encodeString8bit($intext, $this->version, $this->level); - } else { - $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); - } - - QRtools::markTime('after_encode'); - - if ($outfile!== false) { - file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); - } else { - return QRtools::binarize($code->data); - } - } - - //---------------------------------------------------------------------- - public function encodePNG($intext, $outfile = false,$saveandprint=false) - { - try { - - ob_start(); - $tab = $this->encode($intext); - $err = ob_get_contents(); - ob_end_clean(); - - if ($err != '') - QRtools::log($outfile, $err); - - $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); - - QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); - - } catch (Exception $e) { - - QRtools::log($outfile, $e->getMessage()); - - } - } - } - - diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrbitstream.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrbitstream.php deleted file mode 100644 index 7d4ec4a6..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrbitstream.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - class QRbitstream { - - public $data = array(); - - //---------------------------------------------------------------------- - public function size() - { - return count($this->data); - } - - //---------------------------------------------------------------------- - public function allocate($setLength) - { - $this->data = array_fill(0, $setLength, 0); - return 0; - } - - //---------------------------------------------------------------------- - public static function newFromNum($bits, $num) - { - $bstream = new QRbitstream(); - $bstream->allocate($bits); - - $mask = 1 << ($bits - 1); - for($i=0; $i<$bits; $i++) { - if($num & $mask) { - $bstream->data[$i] = 1; - } else { - $bstream->data[$i] = 0; - } - $mask = $mask >> 1; - } - - return $bstream; - } - - //---------------------------------------------------------------------- - public static function newFromBytes($size, $data) - { - $bstream = new QRbitstream(); - $bstream->allocate($size * 8); - $p=0; - - for($i=0; $i<$size; $i++) { - $mask = 0x80; - for($j=0; $j<8; $j++) { - if($data[$i] & $mask) { - $bstream->data[$p] = 1; - } else { - $bstream->data[$p] = 0; - } - $p++; - $mask = $mask >> 1; - } - } - - return $bstream; - } - - //---------------------------------------------------------------------- - public function append(QRbitstream $arg) - { - if (is_null($arg)) { - return -1; - } - - if($arg->size() == 0) { - return 0; - } - - if($this->size() == 0) { - $this->data = $arg->data; - return 0; - } - - $this->data = array_values(array_merge($this->data, $arg->data)); - - return 0; - } - - //---------------------------------------------------------------------- - public function appendNum($bits, $num) - { - if ($bits == 0) - return 0; - - $b = QRbitstream::newFromNum($bits, $num); - - if(is_null($b)) - return -1; - - $ret = $this->append($b); - unset($b); - - return $ret; - } - - //---------------------------------------------------------------------- - public function appendBytes($size, $data) - { - if ($size == 0) - return 0; - - $b = QRbitstream::newFromBytes($size, $data); - - if(is_null($b)) - return -1; - - $ret = $this->append($b); - unset($b); - - return $ret; - } - - //---------------------------------------------------------------------- - public function toByte() - { - - $size = $this->size(); - - if($size == 0) { - return array(); - } - - $data = array_fill(0, (int)(($size + 7) / 8), 0); - $bytes = (int)($size / 8); - - $p = 0; - - for($i=0; $i<$bytes; $i++) { - $v = 0; - for($j=0; $j<8; $j++) { - $v = $v << 1; - $v |= $this->data[$p]; - $p++; - } - $data[$i] = $v; - } - - if($size & 7) { - $v = 0; - for($j=0; $j<($size & 7); $j++) { - $v = $v << 1; - $v |= $this->data[$p]; - $p++; - } - $data[$bytes] = $v; - } - - return $data; - } - - } diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrconfig.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrconfig.php deleted file mode 100644 index e53dff8c..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrconfig.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - // Encoding modes - - define('QR_MODE_NUL', -1); - define('QR_MODE_NUM', 0); - define('QR_MODE_AN', 1); - define('QR_MODE_8', 2); - define('QR_MODE_KANJI', 3); - define('QR_MODE_STRUCTURE', 4); - - // Levels of error correction. - - define('QR_ECLEVEL_L', 0); - define('QR_ECLEVEL_M', 1); - define('QR_ECLEVEL_Q', 2); - define('QR_ECLEVEL_H', 3); - - // Supported output formats - - define('QR_FORMAT_TEXT', 0); - define('QR_FORMAT_PNG', 1); - - class qrstr { - public static function set(&$srctab, $x, $y, $repl, $replLen = false) { - $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); - } - } \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrencode.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrencode.php deleted file mode 100644 index 4b77a5bd..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrencode.php +++ /dev/null @@ -1,502 +0,0 @@ - - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - class QRrsblock { - public $dataLength; - public $data = array(); - public $eccLength; - public $ecc = array(); - - public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) - { - $rs->encode_rs_char($data, $ecc); - - $this->dataLength = $dl; - $this->data = $data; - $this->eccLength = $el; - $this->ecc = $ecc; - } - }; - - //########################################################################## - - class QRrawcode { - public $version; - public $datacode = array(); - public $ecccode = array(); - public $blocks; - public $rsblocks = array(); //of RSblock - public $count; - public $dataLength; - public $eccLength; - public $b1; - - //---------------------------------------------------------------------- - public function __construct(QRinput $input) - { - $spec = array(0,0,0,0,0); - - $this->datacode = $input->getByteStream(); - if(is_null($this->datacode)) { - throw new Exception('null imput string'); - } - - QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); - - $this->version = $input->getVersion(); - $this->b1 = QRspec::rsBlockNum1($spec); - $this->dataLength = QRspec::rsDataLength($spec); - $this->eccLength = QRspec::rsEccLength($spec); - $this->ecccode = array_fill(0, $this->eccLength, 0); - $this->blocks = QRspec::rsBlockNum($spec); - - $ret = $this->init($spec); - if($ret < 0) { - throw new Exception('block alloc error'); - return null; - } - - $this->count = 0; - } - - //---------------------------------------------------------------------- - public function init(array $spec) - { - $dl = QRspec::rsDataCodes1($spec); - $el = QRspec::rsEccCodes1($spec); - $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); - - - $blockNo = 0; - $dataPos = 0; - $eccPos = 0; - for($i=0; $iecccode,$eccPos); - $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); - $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); - - $dataPos += $dl; - $eccPos += $el; - $blockNo++; - } - - if(QRspec::rsBlockNum2($spec) == 0) - return 0; - - $dl = QRspec::rsDataCodes2($spec); - $el = QRspec::rsEccCodes2($spec); - $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); - - if($rs == NULL) return -1; - - for($i=0; $iecccode,$eccPos); - $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); - $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); - - $dataPos += $dl; - $eccPos += $el; - $blockNo++; - } - - return 0; - } - - //---------------------------------------------------------------------- - public function getCode() - { - $ret; - - if($this->count < $this->dataLength) { - $row = $this->count % $this->blocks; - $col = $this->count / $this->blocks; - if($col >= $this->rsblocks[0]->dataLength) { - $row += $this->b1; - } - $ret = $this->rsblocks[$row]->data[$col]; - } else if($this->count < $this->dataLength + $this->eccLength) { - $row = ($this->count - $this->dataLength) % $this->blocks; - $col = ($this->count - $this->dataLength) / $this->blocks; - $ret = $this->rsblocks[$row]->ecc[$col]; - } else { - return 0; - } - $this->count++; - - return $ret; - } - } - - //########################################################################## - - class QRcode { - - public $version; - public $width; - public $data; - - //---------------------------------------------------------------------- - public function encodeMask(QRinput $input, $mask) - { - if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { - throw new Exception('wrong version'); - } - if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { - throw new Exception('wrong level'); - } - - $raw = new QRrawcode($input); - - QRtools::markTime('after_raw'); - - $version = $raw->version; - $width = QRspec::getWidth($version); - $frame = QRspec::newFrame($version); - - $filler = new FrameFiller($width, $frame); - if(is_null($filler)) { - return NULL; - } - - // inteleaved data and ecc codes - for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { - $code = $raw->getCode(); - $bit = 0x80; - for($j=0; $j<8; $j++) { - $addr = $filler->next(); - $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); - $bit = $bit >> 1; - } - } - - QRtools::markTime('after_filler'); - - unset($raw); - - // remainder bits - $j = QRspec::getRemainder($version); - for($i=0; $i<$j; $i++) { - $addr = $filler->next(); - $filler->setFrameAt($addr, 0x02); - } - - $frame = $filler->frame; - unset($filler); - - - // masking - $maskObj = new QRmask(); - if($mask < 0) { - - if (QR_FIND_BEST_MASK) { - $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); - } else { - $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); - } - } else { - $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); - } - - if($masked == NULL) { - return NULL; - } - - QRtools::markTime('after_mask'); - - $this->version = $version; - $this->width = $width; - $this->data = $masked; - - return $this; - } - - //---------------------------------------------------------------------- - public function encodeInput(QRinput $input) - { - return $this->encodeMask($input, -1); - } - - //---------------------------------------------------------------------- - public function encodeString8bit($string, $version, $level) - { - if(string == NULL) { - throw new Exception('empty string!'); - return NULL; - } - - $input = new QRinput($version, $level); - if($input == NULL) return NULL; - - $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); - if($ret < 0) { - unset($input); - return NULL; - } - return $this->encodeInput($input); - } - - //---------------------------------------------------------------------- - public function encodeString($string, $version, $level, $hint, $casesensitive) - { - - if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { - throw new Exception('bad hint'); - return NULL; - } - - $input = new QRinput($version, $level); - if($input == NULL) return NULL; - - $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); - if($ret < 0) { - return NULL; - } - - return $this->encodeInput($input); - } - - //---------------------------------------------------------------------- - public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) - { - $enc = QRencode::factory($level, $size, $margin); - return $enc->encodePNG($text, $outfile, $saveandprint=false); - } - - //---------------------------------------------------------------------- - public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) - { - $enc = QRencode::factory($level, $size, $margin); - return $enc->encode($text, $outfile); - } - - //---------------------------------------------------------------------- - public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) - { - $enc = QRencode::factory($level, $size, $margin); - return $enc->encodeRAW($text, $outfile); - } - } - - //########################################################################## - - class FrameFiller { - - public $width; - public $frame; - public $x; - public $y; - public $dir; - public $bit; - - //---------------------------------------------------------------------- - public function __construct($width, &$frame) - { - $this->width = $width; - $this->frame = $frame; - $this->x = $width - 1; - $this->y = $width - 1; - $this->dir = -1; - $this->bit = -1; - } - - //---------------------------------------------------------------------- - public function setFrameAt($at, $val) - { - $this->frame[$at['y']][$at['x']] = chr($val); - } - - //---------------------------------------------------------------------- - public function getFrameAt($at) - { - return ord($this->frame[$at['y']][$at['x']]); - } - - //---------------------------------------------------------------------- - public function next() - { - do { - - if($this->bit == -1) { - $this->bit = 0; - return array('x'=>$this->x, 'y'=>$this->y); - } - - $x = $this->x; - $y = $this->y; - $w = $this->width; - - if($this->bit == 0) { - $x--; - $this->bit++; - } else { - $x++; - $y += $this->dir; - $this->bit--; - } - - if($this->dir < 0) { - if($y < 0) { - $y = 0; - $x -= 2; - $this->dir = 1; - if($x == 6) { - $x--; - $y = 9; - } - } - } else { - if($y == $w) { - $y = $w - 1; - $x -= 2; - $this->dir = -1; - if($x == 6) { - $x--; - $y -= 8; - } - } - } - if($x < 0 || $y < 0) return null; - - $this->x = $x; - $this->y = $y; - - } while(ord($this->frame[$y][$x]) & 0x80); - - return array('x'=>$x, 'y'=>$y); - } - - } ; - - //########################################################################## - - class QRencode { - - public $casesensitive = true; - public $eightbit = false; - - public $version = 0; - public $size = 3; - public $margin = 4; - - public $structured = 0; // not supported yet - - public $level = QR_ECLEVEL_L; - public $hint = QR_MODE_8; - - //---------------------------------------------------------------------- - public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) - { - $enc = new QRencode(); - $enc->size = $size; - $enc->margin = $margin; - - switch ($level.'') { - case '0': - case '1': - case '2': - case '3': - $enc->level = $level; - break; - case 'l': - case 'L': - $enc->level = QR_ECLEVEL_L; - break; - case 'm': - case 'M': - $enc->level = QR_ECLEVEL_M; - break; - case 'q': - case 'Q': - $enc->level = QR_ECLEVEL_Q; - break; - case 'h': - case 'H': - $enc->level = QR_ECLEVEL_H; - break; - } - - return $enc; - } - - //---------------------------------------------------------------------- - public function encodeRAW($intext, $outfile = false) - { - $code = new QRcode(); - - if($this->eightbit) { - $code->encodeString8bit($intext, $this->version, $this->level); - } else { - $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); - } - - return $code->data; - } - - //---------------------------------------------------------------------- - public function encode($intext, $outfile = false) - { - $code = new QRcode(); - - if($this->eightbit) { - $code->encodeString8bit($intext, $this->version, $this->level); - } else { - $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); - } - - QRtools::markTime('after_encode'); - - if ($outfile!== false) { - file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); - } else { - return QRtools::binarize($code->data); - } - } - - //---------------------------------------------------------------------- - public function encodePNG($intext, $outfile = false,$saveandprint=false) - { - try { - - ob_start(); - $tab = $this->encode($intext); - $err = ob_get_contents(); - ob_end_clean(); - - if ($err != '') - QRtools::log($outfile, $err); - - $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); - - QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); - - } catch (Exception $e) { - - QRtools::log($outfile, $e->getMessage()); - - } - } - } diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrimage.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrimage.php deleted file mode 100644 index 10b0a6e1..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrimage.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - define('QR_IMAGE', true); - - class QRimage { - - //---------------------------------------------------------------------- - public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) - { - $image = self::image($frame, $pixelPerPoint, $outerFrame); - - if ($filename === false) { - Header("Content-type: image/png"); - ImagePng($image); - } else { - if($saveandprint===TRUE){ - ImagePng($image, $filename); - header("Content-type: image/png"); - ImagePng($image); - }else{ - ImagePng($image, $filename); - } - } - - ImageDestroy($image); - } - - //---------------------------------------------------------------------- - public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) - { - $image = self::image($frame, $pixelPerPoint, $outerFrame); - - if ($filename === false) { - Header("Content-type: image/jpeg"); - ImageJpeg($image, null, $q); - } else { - ImageJpeg($image, $filename, $q); - } - - ImageDestroy($image); - } - - //---------------------------------------------------------------------- - private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) - { - $h = count($frame); - $w = strlen($frame[0]); - - $imgW = $w + 2*$outerFrame; - $imgH = $h + 2*$outerFrame; - - $base_image =ImageCreate($imgW, $imgH); - - $col[0] = ImageColorAllocate($base_image,255,255,255); - $col[1] = ImageColorAllocate($base_image,0,0,0); - - imagefill($base_image, 0, 0, $col[0]); - - for($y=0; $y<$h; $y++) { - for($x=0; $x<$w; $x++) { - if ($frame[$y][$x] == '1') { - ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); - } - } - } - - $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); - ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); - ImageDestroy($base_image); - - return $target_image; - } - } \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrinput.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrinput.php deleted file mode 100644 index 0f6d7f94..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrinput.php +++ /dev/null @@ -1,729 +0,0 @@ - - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - define('STRUCTURE_HEADER_BITS', 20); - define('MAX_STRUCTURED_SYMBOLS', 16); - - class QRinputItem { - - public $mode; - public $size; - public $data; - public $bstream; - - public function __construct($mode, $size, $data, $bstream = null) - { - $setData = array_slice($data, 0, $size); - - if (count($setData) < $size) { - $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); - } - - if(!QRinput::check($mode, $size, $setData)) { - throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); - return null; - } - - $this->mode = $mode; - $this->size = $size; - $this->data = $setData; - $this->bstream = $bstream; - } - - //---------------------------------------------------------------------- - public function encodeModeNum($version) - { - try { - - $words = (int)($this->size / 3); - $bs = new QRbitstream(); - - $val = 0x1; - $bs->appendNum(4, $val); - $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); - - for($i=0; $i<$words; $i++) { - $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; - $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; - $val += (ord($this->data[$i*3+2]) - ord('0')); - $bs->appendNum(10, $val); - } - - if($this->size - $words * 3 == 1) { - $val = ord($this->data[$words*3]) - ord('0'); - $bs->appendNum(4, $val); - } else if($this->size - $words * 3 == 2) { - $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; - $val += (ord($this->data[$words*3+1]) - ord('0')); - $bs->appendNum(7, $val); - } - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function encodeModeAn($version) - { - try { - $words = (int)($this->size / 2); - $bs = new QRbitstream(); - - $bs->appendNum(4, 0x02); - $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); - - for($i=0; $i<$words; $i++) { - $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; - $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); - - $bs->appendNum(11, $val); - } - - if($this->size & 1) { - $val = QRinput::lookAnTable(ord($this->data[$words * 2])); - $bs->appendNum(6, $val); - } - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function encodeMode8($version) - { - try { - $bs = new QRbitstream(); - - $bs->appendNum(4, 0x4); - $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); - - for($i=0; $i<$this->size; $i++) { - $bs->appendNum(8, ord($this->data[$i])); - } - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function encodeModeKanji($version) - { - try { - - $bs = new QRbitrtream(); - - $bs->appendNum(4, 0x8); - $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); - - for($i=0; $i<$this->size; $i+=2) { - $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); - if($val <= 0x9ffc) { - $val -= 0x8140; - } else { - $val -= 0xc140; - } - - $h = ($val >> 8) * 0xc0; - $val = ($val & 0xff) + $h; - - $bs->appendNum(13, $val); - } - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function encodeModeStructure() - { - try { - $bs = new QRbitstream(); - - $bs->appendNum(4, 0x03); - $bs->appendNum(4, ord($this->data[1]) - 1); - $bs->appendNum(4, ord($this->data[0]) - 1); - $bs->appendNum(8, ord($this->data[2])); - - $this->bstream = $bs; - return 0; - - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function estimateBitStreamSizeOfEntry($version) - { - $bits = 0; - - if($version == 0) - $version = 1; - - switch($this->mode) { - case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; - case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; - case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; - case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; - case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; - default: - return 0; - } - - $l = QRspec::lengthIndicator($this->mode, $version); - $m = 1 << $l; - $num = (int)(($this->size + $m - 1) / $m); - - $bits += $num * (4 + $l); - - return $bits; - } - - //---------------------------------------------------------------------- - public function encodeBitStream($version) - { - try { - - unset($this->bstream); - $words = QRspec::maximumWords($this->mode, $version); - - if($this->size > $words) { - - $st1 = new QRinputItem($this->mode, $words, $this->data); - $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); - - $st1->encodeBitStream($version); - $st2->encodeBitStream($version); - - $this->bstream = new QRbitstream(); - $this->bstream->append($st1->bstream); - $this->bstream->append($st2->bstream); - - unset($st1); - unset($st2); - - } else { - - $ret = 0; - - switch($this->mode) { - case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; - case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; - case QR_MODE_8: $ret = $this->encodeMode8($version); break; - case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; - case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; - - default: - break; - } - - if($ret < 0) - return -1; - } - - return $this->bstream->size(); - - } catch (Exception $e) { - return -1; - } - } - }; - - //########################################################################## - - class QRinput { - - public $items; - - private $version; - private $level; - - //---------------------------------------------------------------------- - public function __construct($version = 0, $level = QR_ECLEVEL_L) - { - if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { - throw new Exception('Invalid version no'); - return NULL; - } - - $this->version = $version; - $this->level = $level; - } - - //---------------------------------------------------------------------- - public function getVersion() - { - return $this->version; - } - - //---------------------------------------------------------------------- - public function setVersion($version) - { - if($version < 0 || $version > QRSPEC_VERSION_MAX) { - throw new Exception('Invalid version no'); - return -1; - } - - $this->version = $version; - - return 0; - } - - //---------------------------------------------------------------------- - public function getErrorCorrectionLevel() - { - return $this->level; - } - - //---------------------------------------------------------------------- - public function setErrorCorrectionLevel($level) - { - if($level > QR_ECLEVEL_H) { - throw new Exception('Invalid ECLEVEL'); - return -1; - } - - $this->level = $level; - - return 0; - } - - //---------------------------------------------------------------------- - public function appendEntry(QRinputItem $entry) - { - $this->items[] = $entry; - } - - //---------------------------------------------------------------------- - public function append($mode, $size, $data) - { - try { - $entry = new QRinputItem($mode, $size, $data); - $this->items[] = $entry; - return 0; - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - - public function insertStructuredAppendHeader($size, $index, $parity) - { - if( $size > MAX_STRUCTURED_SYMBOLS ) { - throw new Exception('insertStructuredAppendHeader wrong size'); - } - - if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { - throw new Exception('insertStructuredAppendHeader wrong index'); - } - - $buf = array($size, $index, $parity); - - try { - $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); - array_unshift($this->items, $entry); - return 0; - } catch (Exception $e) { - return -1; - } - } - - //---------------------------------------------------------------------- - public function calcParity() - { - $parity = 0; - - foreach($this->items as $item) { - if($item->mode != QR_MODE_STRUCTURE) { - for($i=$item->size-1; $i>=0; $i--) { - $parity ^= $item->data[$i]; - } - } - } - - return $parity; - } - - //---------------------------------------------------------------------- - public static function checkModeNum($size, $data) - { - for($i=0; $i<$size; $i++) { - if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ - return false; - } - } - - return true; - } - - //---------------------------------------------------------------------- - public static function estimateBitsModeNum($size) - { - $w = (int)$size / 3; - $bits = $w * 10; - - switch($size - $w * 3) { - case 1: - $bits += 4; - break; - case 2: - $bits += 7; - break; - default: - break; - } - - return $bits; - } - - //---------------------------------------------------------------------- - public static $anTable = array( - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 - ); - - //---------------------------------------------------------------------- - public static function lookAnTable($c) - { - return (($c > 127)?-1:self::$anTable[$c]); - } - - //---------------------------------------------------------------------- - public static function checkModeAn($size, $data) - { - for($i=0; $i<$size; $i++) { - if (self::lookAnTable(ord($data[$i])) == -1) { - return false; - } - } - - return true; - } - - //---------------------------------------------------------------------- - public static function estimateBitsModeAn($size) - { - $w = (int)($size / 2); - $bits = $w * 11; - - if($size & 1) { - $bits += 6; - } - - return $bits; - } - - //---------------------------------------------------------------------- - public static function estimateBitsMode8($size) - { - return $size * 8; - } - - //---------------------------------------------------------------------- - public function estimateBitsModeKanji($size) - { - return (int)(($size / 2) * 13); - } - - //---------------------------------------------------------------------- - public static function checkModeKanji($size, $data) - { - if($size & 1) - return false; - - for($i=0; $i<$size; $i+=2) { - $val = (ord($data[$i]) << 8) | ord($data[$i+1]); - if( $val < 0x8140 - || ($val > 0x9ffc && $val < 0xe040) - || $val > 0xebbf) { - return false; - } - } - - return true; - } - - /*********************************************************************** - * Validation - **********************************************************************/ - - public static function check($mode, $size, $data) - { - if($size <= 0) - return false; - - switch($mode) { - case QR_MODE_NUM: return self::checkModeNum($size, $data); break; - case QR_MODE_AN: return self::checkModeAn($size, $data); break; - case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; - case QR_MODE_8: return true; break; - case QR_MODE_STRUCTURE: return true; break; - - default: - break; - } - - return false; - } - - - //---------------------------------------------------------------------- - public function estimateBitStreamSize($version) - { - $bits = 0; - - foreach($this->items as $item) { - $bits += $item->estimateBitStreamSizeOfEntry($version); - } - - return $bits; - } - - //---------------------------------------------------------------------- - public function estimateVersion() - { - $version = 0; - $prev = 0; - do { - $prev = $version; - $bits = $this->estimateBitStreamSize($prev); - $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); - if ($version < 0) { - return -1; - } - } while ($version > $prev); - - return $version; - } - - //---------------------------------------------------------------------- - public static function lengthOfCode($mode, $version, $bits) - { - $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); - switch($mode) { - case QR_MODE_NUM: - $chunks = (int)($payload / 10); - $remain = $payload - $chunks * 10; - $size = $chunks * 3; - if($remain >= 7) { - $size += 2; - } else if($remain >= 4) { - $size += 1; - } - break; - case QR_MODE_AN: - $chunks = (int)($payload / 11); - $remain = $payload - $chunks * 11; - $size = $chunks * 2; - if($remain >= 6) - $size++; - break; - case QR_MODE_8: - $size = (int)($payload / 8); - break; - case QR_MODE_KANJI: - $size = (int)(($payload / 13) * 2); - break; - case QR_MODE_STRUCTURE: - $size = (int)($payload / 8); - break; - default: - $size = 0; - break; - } - - $maxsize = QRspec::maximumWords($mode, $version); - if($size < 0) $size = 0; - if($size > $maxsize) $size = $maxsize; - - return $size; - } - - //---------------------------------------------------------------------- - public function createBitStream() - { - $total = 0; - - foreach($this->items as $item) { - $bits = $item->encodeBitStream($this->version); - - if($bits < 0) - return -1; - - $total += $bits; - } - - return $total; - } - - //---------------------------------------------------------------------- - public function convertData() - { - $ver = $this->estimateVersion(); - if($ver > $this->getVersion()) { - $this->setVersion($ver); - } - - for(;;) { - $bits = $this->createBitStream(); - - if($bits < 0) - return -1; - - $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); - if($ver < 0) { - throw new Exception('WRONG VERSION'); - return -1; - } else if($ver > $this->getVersion()) { - $this->setVersion($ver); - } else { - break; - } - } - - return 0; - } - - //---------------------------------------------------------------------- - public function appendPaddingBit(&$bstream) - { - $bits = $bstream->size(); - $maxwords = QRspec::getDataLength($this->version, $this->level); - $maxbits = $maxwords * 8; - - if ($maxbits == $bits) { - return 0; - } - - if ($maxbits - $bits < 5) { - return $bstream->appendNum($maxbits - $bits, 0); - } - - $bits += 4; - $words = (int)(($bits + 7) / 8); - - $padding = new QRbitstream(); - $ret = $padding->appendNum($words * 8 - $bits + 4, 0); - - if($ret < 0) - return $ret; - - $padlen = $maxwords - $words; - - if($padlen > 0) { - - $padbuf = array(); - for($i=0; $i<$padlen; $i++) { - $padbuf[$i] = ($i&1)?0x11:0xec; - } - - $ret = $padding->appendBytes($padlen, $padbuf); - - if($ret < 0) - return $ret; - - } - - $ret = $bstream->append($padding); - - return $ret; - } - - //---------------------------------------------------------------------- - public function mergeBitStream() - { - if($this->convertData() < 0) { - return null; - } - - $bstream = new QRbitstream(); - - foreach($this->items as $item) { - $ret = $bstream->append($item->bstream); - if($ret < 0) { - return null; - } - } - - return $bstream; - } - - //---------------------------------------------------------------------- - public function getBitStream() - { - - $bstream = $this->mergeBitStream(); - - if($bstream == null) { - return null; - } - - $ret = $this->appendPaddingBit($bstream); - if($ret < 0) { - return null; - } - - return $bstream; - } - - //---------------------------------------------------------------------- - public function getByteStream() - { - $bstream = $this->getBitStream(); - if($bstream == null) { - return null; - } - - return $bstream->toByte(); - } - } - - - \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrlib.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrlib.php deleted file mode 100644 index d55c4af2..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrlib.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; - - // Required libs - - include $QR_BASEDIR."qrconst.php"; - include $QR_BASEDIR."qrconfig.php"; - include $QR_BASEDIR."qrtools.php"; - include $QR_BASEDIR."qrspec.php"; - include $QR_BASEDIR."qrimage.php"; - include $QR_BASEDIR."qrinput.php"; - include $QR_BASEDIR."qrbitstream.php"; - include $QR_BASEDIR."qrsplit.php"; - include $QR_BASEDIR."qrrscode.php"; - include $QR_BASEDIR."qrmask.php"; - include $QR_BASEDIR."qrencode.php"; - diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrmask.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrmask.php deleted file mode 100644 index b14d7ae1..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrmask.php +++ /dev/null @@ -1,328 +0,0 @@ - - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - define('N1', 3); - define('N2', 3); - define('N3', 40); - define('N4', 10); - - class QRmask { - - public $runLength = array(); - - //---------------------------------------------------------------------- - public function __construct() - { - $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); - } - - //---------------------------------------------------------------------- - public function writeFormatInformation($width, &$frame, $mask, $level) - { - $blacks = 0; - $format = QRspec::getFormatInfo($mask, $level); - - for($i=0; $i<8; $i++) { - if($format & 1) { - $blacks += 2; - $v = 0x85; - } else { - $v = 0x84; - } - - $frame[8][$width - 1 - $i] = chr($v); - if($i < 6) { - $frame[$i][8] = chr($v); - } else { - $frame[$i + 1][8] = chr($v); - } - $format = $format >> 1; - } - - for($i=0; $i<7; $i++) { - if($format & 1) { - $blacks += 2; - $v = 0x85; - } else { - $v = 0x84; - } - - $frame[$width - 7 + $i][8] = chr($v); - if($i == 0) { - $frame[8][7] = chr($v); - } else { - $frame[8][6 - $i] = chr($v); - } - - $format = $format >> 1; - } - - return $blacks; - } - - //---------------------------------------------------------------------- - public function mask0($x, $y) { return ($x+$y)&1; } - public function mask1($x, $y) { return ($y&1); } - public function mask2($x, $y) { return ($x%3); } - public function mask3($x, $y) { return ($x+$y)%3; } - public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } - public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } - public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } - public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } - - //---------------------------------------------------------------------- - private function generateMaskNo($maskNo, $width, $frame) - { - $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); - - for($y=0; $y<$width; $y++) { - for($x=0; $x<$width; $x++) { - if(ord($frame[$y][$x]) & 0x80) { - $bitMask[$y][$x] = 0; - } else { - $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); - $bitMask[$y][$x] = ($maskFunc == 0)?1:0; - } - - } - } - - return $bitMask; - } - - //---------------------------------------------------------------------- - public static function serial($bitFrame) - { - $codeArr = array(); - - foreach ($bitFrame as $line) - $codeArr[] = join('', $line); - - return gzcompress(join("\n", $codeArr), 9); - } - - //---------------------------------------------------------------------- - public static function unserial($code) - { - $codeArr = array(); - - $codeLines = explode("\n", gzuncompress($code)); - foreach ($codeLines as $line) - $codeArr[] = str_split($line); - - return $codeArr; - } - - //---------------------------------------------------------------------- - public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) - { - $b = 0; - $bitMask = array(); - - $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; - - if (QR_CACHEABLE) { - if (file_exists($fileName)) { - $bitMask = self::unserial(file_get_contents($fileName)); - } else { - $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); - if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) - mkdir(QR_CACHE_DIR.'mask_'.$maskNo); - file_put_contents($fileName, self::serial($bitMask)); - } - } else { - $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); - } - - if ($maskGenOnly) - return; - - $d = $s; - - for($y=0; $y<$width; $y++) { - for($x=0; $x<$width; $x++) { - if($bitMask[$y][$x] == 1) { - $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); - } - $b += (int)(ord($d[$y][$x]) & 1); - } - } - - return $b; - } - - //---------------------------------------------------------------------- - public function makeMask($width, $frame, $maskNo, $level) - { - $masked = array_fill(0, $width, str_repeat("\0", $width)); - $this->makeMaskNo($maskNo, $width, $frame, $masked); - $this->writeFormatInformation($width, $masked, $maskNo, $level); - - return $masked; - } - - //---------------------------------------------------------------------- - public function calcN1N3($length) - { - $demerit = 0; - - for($i=0; $i<$length; $i++) { - - if($this->runLength[$i] >= 5) { - $demerit += (N1 + ($this->runLength[$i] - 5)); - } - if($i & 1) { - if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { - $fact = (int)($this->runLength[$i] / 3); - if(($this->runLength[$i-2] == $fact) && - ($this->runLength[$i-1] == $fact) && - ($this->runLength[$i+1] == $fact) && - ($this->runLength[$i+2] == $fact)) { - if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { - $demerit += N3; - } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { - $demerit += N3; - } - } - } - } - } - return $demerit; - } - - //---------------------------------------------------------------------- - public function evaluateSymbol($width, $frame) - { - $head = 0; - $demerit = 0; - - for($y=0; $y<$width; $y++) { - $head = 0; - $this->runLength[0] = 1; - - $frameY = $frame[$y]; - - if ($y>0) - $frameYM = $frame[$y-1]; - - for($x=0; $x<$width; $x++) { - if(($x > 0) && ($y > 0)) { - $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); - $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); - - if(($b22 | ($w22 ^ 1))&1) { - $demerit += N2; - } - } - if(($x == 0) && (ord($frameY[$x]) & 1)) { - $this->runLength[0] = -1; - $head = 1; - $this->runLength[$head] = 1; - } else if($x > 0) { - if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { - $head++; - $this->runLength[$head] = 1; - } else { - $this->runLength[$head]++; - } - } - } - - $demerit += $this->calcN1N3($head+1); - } - - for($x=0; $x<$width; $x++) { - $head = 0; - $this->runLength[0] = 1; - - for($y=0; $y<$width; $y++) { - if($y == 0 && (ord($frame[$y][$x]) & 1)) { - $this->runLength[0] = -1; - $head = 1; - $this->runLength[$head] = 1; - } else if($y > 0) { - if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { - $head++; - $this->runLength[$head] = 1; - } else { - $this->runLength[$head]++; - } - } - } - - $demerit += $this->calcN1N3($head+1); - } - - return $demerit; - } - - - //---------------------------------------------------------------------- - public function mask($width, $frame, $level) - { - $minDemerit = PHP_INT_MAX; - $bestMaskNum = 0; - $bestMask = array(); - - $checked_masks = array(0,1,2,3,4,5,6,7); - - if (QR_FIND_FROM_RANDOM !== false) { - - $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); - for ($i = 0; $i < $howManuOut; $i++) { - $remPos = rand (0, count($checked_masks)-1); - unset($checked_masks[$remPos]); - $checked_masks = array_values($checked_masks); - } - - } - - $bestMask = $frame; - - foreach($checked_masks as $i) { - $mask = array_fill(0, $width, str_repeat("\0", $width)); - - $demerit = 0; - $blacks = 0; - $blacks = $this->makeMaskNo($i, $width, $frame, $mask); - $blacks += $this->writeFormatInformation($width, $mask, $i, $level); - $blacks = (int)(100 * $blacks / ($width * $width)); - $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); - $demerit += $this->evaluateSymbol($width, $mask); - - if($demerit < $minDemerit) { - $minDemerit = $demerit; - $bestMask = $mask; - $bestMaskNum = $i; - } - } - - return $bestMask; - } - - //---------------------------------------------------------------------- - } diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrrscode.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrrscode.php deleted file mode 100644 index 591129a3..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrrscode.php +++ /dev/null @@ -1,210 +0,0 @@ - - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - class QRrsItem { - - public $mm; // Bits per symbol - public $nn; // Symbols per block (= (1<= $this->nn) { - $x -= $this->nn; - $x = ($x >> $this->mm) + ($x & $this->nn); - } - - return $x; - } - - //---------------------------------------------------------------------- - public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) - { - // Common code for intializing a Reed-Solomon control block (char or int symbols) - // Copyright 2004 Phil Karn, KA9Q - // May be used under the terms of the GNU Lesser General Public License (LGPL) - - $rs = null; - - // Check parameter ranges - if($symsize < 0 || $symsize > 8) return $rs; - if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; - if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; - if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! - if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding - - $rs = new QRrsItem(); - $rs->mm = $symsize; - $rs->nn = (1<<$symsize)-1; - $rs->pad = $pad; - - $rs->alpha_to = array_fill(0, $rs->nn+1, 0); - $rs->index_of = array_fill(0, $rs->nn+1, 0); - - // PHP style macro replacement ;) - $NN =& $rs->nn; - $A0 =& $NN; - - // Generate Galois field lookup tables - $rs->index_of[0] = $A0; // log(zero) = -inf - $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 - $sr = 1; - - for($i=0; $i<$rs->nn; $i++) { - $rs->index_of[$sr] = $i; - $rs->alpha_to[$i] = $sr; - $sr <<= 1; - if($sr & (1<<$symsize)) { - $sr ^= $gfpoly; - } - $sr &= $rs->nn; - } - - if($sr != 1){ - // field generator polynomial is not primitive! - $rs = NULL; - return $rs; - } - - /* Form RS code generator polynomial from its roots */ - $rs->genpoly = array_fill(0, $nroots+1, 0); - - $rs->fcr = $fcr; - $rs->prim = $prim; - $rs->nroots = $nroots; - $rs->gfpoly = $gfpoly; - - /* Find prim-th root of 1, used in decoding */ - for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) - ; // intentional empty-body loop! - - $rs->iprim = (int)($iprim / $prim); - $rs->genpoly[0] = 1; - - for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { - $rs->genpoly[$i+1] = 1; - - // Multiply rs->genpoly[] by @**(root + x) - for ($j = $i; $j > 0; $j--) { - if ($rs->genpoly[$j] != 0) { - $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; - } else { - $rs->genpoly[$j] = $rs->genpoly[$j-1]; - } - } - // rs->genpoly[0] can never be zero - $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; - } - - // convert rs->genpoly[] to index form for quicker encoding - for ($i = 0; $i <= $nroots; $i++) - $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; - - return $rs; - } - - //---------------------------------------------------------------------- - public function encode_rs_char($data, &$parity) - { - $MM =& $this->mm; - $NN =& $this->nn; - $ALPHA_TO =& $this->alpha_to; - $INDEX_OF =& $this->index_of; - $GENPOLY =& $this->genpoly; - $NROOTS =& $this->nroots; - $FCR =& $this->fcr; - $PRIM =& $this->prim; - $IPRIM =& $this->iprim; - $PAD =& $this->pad; - $A0 =& $NN; - - $parity = array_fill(0, $NROOTS, 0); - - for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { - - $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; - if($feedback != $A0) { - // feedback term is non-zero - - // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must - // always be for the polynomials constructed by init_rs() - $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); - - for($j=1;$j<$NROOTS;$j++) { - $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; - } - } - - // Shift - array_shift($parity); - if($feedback != $A0) { - array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); - } else { - array_push($parity, 0); - } - } - } - } - - //########################################################################## - - class QRrs { - - public static $items = array(); - - //---------------------------------------------------------------------- - public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) - { - foreach(self::$items as $rs) { - if($rs->pad != $pad) continue; - if($rs->nroots != $nroots) continue; - if($rs->mm != $symsize) continue; - if($rs->gfpoly != $gfpoly) continue; - if($rs->fcr != $fcr) continue; - if($rs->prim != $prim) continue; - - return $rs; - } - - $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); - array_unshift(self::$items, $rs); - - return $rs; - } - } \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrspec.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrspec.php deleted file mode 100644 index 92aea0c7..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrspec.php +++ /dev/null @@ -1,592 +0,0 @@ - - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * The following data / specifications are taken from - * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) - * or - * "Automatic identification and data capture techniques -- - * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - define('QRSPEC_VERSION_MAX', 40); - define('QRSPEC_WIDTH_MAX', 177); - - define('QRCAP_WIDTH', 0); - define('QRCAP_WORDS', 1); - define('QRCAP_REMINDER', 2); - define('QRCAP_EC', 3); - - class QRspec { - - public static $capacity = array( - array( 0, 0, 0, array( 0, 0, 0, 0)), - array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 - array( 25, 44, 7, array( 10, 16, 22, 28)), - array( 29, 70, 7, array( 15, 26, 36, 44)), - array( 33, 100, 7, array( 20, 36, 52, 64)), - array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 - array( 41, 172, 7, array( 36, 64, 96, 112)), - array( 45, 196, 0, array( 40, 72, 108, 130)), - array( 49, 242, 0, array( 48, 88, 132, 156)), - array( 53, 292, 0, array( 60, 110, 160, 192)), - array( 57, 346, 0, array( 72, 130, 192, 224)), //10 - array( 61, 404, 0, array( 80, 150, 224, 264)), - array( 65, 466, 0, array( 96, 176, 260, 308)), - array( 69, 532, 0, array( 104, 198, 288, 352)), - array( 73, 581, 3, array( 120, 216, 320, 384)), - array( 77, 655, 3, array( 132, 240, 360, 432)), //15 - array( 81, 733, 3, array( 144, 280, 408, 480)), - array( 85, 815, 3, array( 168, 308, 448, 532)), - array( 89, 901, 3, array( 180, 338, 504, 588)), - array( 93, 991, 3, array( 196, 364, 546, 650)), - array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 - array(101, 1156, 4, array( 224, 442, 644, 750)), - array(105, 1258, 4, array( 252, 476, 690, 816)), - array(109, 1364, 4, array( 270, 504, 750, 900)), - array(113, 1474, 4, array( 300, 560, 810, 960)), - array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 - array(121, 1706, 4, array( 336, 644, 952, 1110)), - array(125, 1828, 4, array( 360, 700, 1020, 1200)), - array(129, 1921, 3, array( 390, 728, 1050, 1260)), - array(133, 2051, 3, array( 420, 784, 1140, 1350)), - array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 - array(141, 2323, 3, array( 480, 868, 1290, 1530)), - array(145, 2465, 3, array( 510, 924, 1350, 1620)), - array(149, 2611, 3, array( 540, 980, 1440, 1710)), - array(153, 2761, 3, array( 570, 1036, 1530, 1800)), - array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 - array(161, 3034, 0, array( 600, 1120, 1680, 1980)), - array(165, 3196, 0, array( 630, 1204, 1770, 2100)), - array(169, 3362, 0, array( 660, 1260, 1860, 2220)), - array(173, 3532, 0, array( 720, 1316, 1950, 2310)), - array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 - ); - - //---------------------------------------------------------------------- - public static function getDataLength($version, $level) - { - return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; - } - - //---------------------------------------------------------------------- - public static function getECCLength($version, $level) - { - return self::$capacity[$version][QRCAP_EC][$level]; - } - - //---------------------------------------------------------------------- - public static function getWidth($version) - { - return self::$capacity[$version][QRCAP_WIDTH]; - } - - //---------------------------------------------------------------------- - public static function getRemainder($version) - { - return self::$capacity[$version][QRCAP_REMINDER]; - } - - //---------------------------------------------------------------------- - public static function getMinimumVersion($size, $level) - { - - for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { - $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; - if($words >= $size) - return $i; - } - - return -1; - } - - //###################################################################### - - public static $lengthTableBits = array( - array(10, 12, 14), - array( 9, 11, 13), - array( 8, 16, 16), - array( 8, 10, 12) - ); - - //---------------------------------------------------------------------- - public static function lengthIndicator($mode, $version) - { - if ($mode == QR_MODE_STRUCTURE) - return 0; - - if ($version <= 9) { - $l = 0; - } else if ($version <= 26) { - $l = 1; - } else { - $l = 2; - } - - return self::$lengthTableBits[$mode][$l]; - } - - //---------------------------------------------------------------------- - public static function maximumWords($mode, $version) - { - if($mode == QR_MODE_STRUCTURE) - return 3; - - if($version <= 9) { - $l = 0; - } else if($version <= 26) { - $l = 1; - } else { - $l = 2; - } - - $bits = self::$lengthTableBits[$mode][$l]; - $words = (1 << $bits) - 1; - - if($mode == QR_MODE_KANJI) { - $words *= 2; // the number of bytes is required - } - - return $words; - } - - // Error correction code ----------------------------------------------- - // Table of the error correction code (Reed-Solomon block) - // See Table 12-16 (pp.30-36), JIS X0510:2004. - - public static $eccTable = array( - array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), - array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 - array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), - array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), - array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), - array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 - array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), - array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), - array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), - array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), - array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 - array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), - array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), - array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), - array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), - array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 - array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), - array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), - array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), - array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), - array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 - array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), - array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), - array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), - array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), - array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 - array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), - array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), - array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), - array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), - array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 - array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), - array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), - array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), - array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), - array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 - array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), - array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), - array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), - array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), - array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 - ); - - //---------------------------------------------------------------------- - // CACHEABLE!!! - - public static function getEccSpec($version, $level, array &$spec) - { - if (count($spec) < 5) { - $spec = array(0,0,0,0,0); - } - - $b1 = self::$eccTable[$version][$level][0]; - $b2 = self::$eccTable[$version][$level][1]; - $data = self::getDataLength($version, $level); - $ecc = self::getECCLength($version, $level); - - if($b2 == 0) { - $spec[0] = $b1; - $spec[1] = (int)($data / $b1); - $spec[2] = (int)($ecc / $b1); - $spec[3] = 0; - $spec[4] = 0; - } else { - $spec[0] = $b1; - $spec[1] = (int)($data / ($b1 + $b2)); - $spec[2] = (int)($ecc / ($b1 + $b2)); - $spec[3] = $b2; - $spec[4] = $spec[1] + 1; - } - } - - // Alignment pattern --------------------------------------------------- - - // Positions of alignment patterns. - // This array includes only the second and the third position of the - // alignment patterns. Rest of them can be calculated from the distance - // between them. - - // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. - - public static $alignmentPattern = array( - array( 0, 0), - array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 - array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 - array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 - array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 - array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 - array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 - array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 - array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 - ); - - - /** -------------------------------------------------------------------- - * Put an alignment marker. - * @param frame - * @param width - * @param ox,oy center coordinate of the pattern - */ - public static function putAlignmentMarker(array &$frame, $ox, $oy) - { - $finder = array( - "\xa1\xa1\xa1\xa1\xa1", - "\xa1\xa0\xa0\xa0\xa1", - "\xa1\xa0\xa1\xa0\xa1", - "\xa1\xa0\xa0\xa0\xa1", - "\xa1\xa1\xa1\xa1\xa1" - ); - - $yStart = $oy-2; - $xStart = $ox-2; - - for($y=0; $y<5; $y++) { - QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); - } - } - - //---------------------------------------------------------------------- - public static function putAlignmentPattern($version, &$frame, $width) - { - if($version < 2) - return; - - $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; - if($d < 0) { - $w = 2; - } else { - $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); - } - - if($w * $w - 3 == 1) { - $x = self::$alignmentPattern[$version][0]; - $y = self::$alignmentPattern[$version][0]; - self::putAlignmentMarker($frame, $x, $y); - return; - } - - $cx = self::$alignmentPattern[$version][0]; - for($x=1; $x<$w - 1; $x++) { - self::putAlignmentMarker($frame, 6, $cx); - self::putAlignmentMarker($frame, $cx, 6); - $cx += $d; - } - - $cy = self::$alignmentPattern[$version][0]; - for($y=0; $y<$w-1; $y++) { - $cx = self::$alignmentPattern[$version][0]; - for($x=0; $x<$w-1; $x++) { - self::putAlignmentMarker($frame, $cx, $cy); - $cx += $d; - } - $cy += $d; - } - } - - // Version information pattern ----------------------------------------- - - // Version information pattern (BCH coded). - // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. - - // size: [QRSPEC_VERSION_MAX - 6] - - public static $versionPattern = array( - 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, - 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, - 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, - 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, - 0x27541, 0x28c69 - ); - - //---------------------------------------------------------------------- - public static function getVersionPattern($version) - { - if($version < 7 || $version > QRSPEC_VERSION_MAX) - return 0; - - return self::$versionPattern[$version -7]; - } - - // Format information -------------------------------------------------- - // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) - - public static $formatInfo = array( - array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), - array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), - array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), - array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) - ); - - public static function getFormatInfo($mask, $level) - { - if($mask < 0 || $mask > 7) - return 0; - - if($level < 0 || $level > 3) - return 0; - - return self::$formatInfo[$level][$mask]; - } - - // Frame --------------------------------------------------------------- - // Cache of initial frames. - - public static $frames = array(); - - /** -------------------------------------------------------------------- - * Put a finder pattern. - * @param frame - * @param width - * @param ox,oy upper-left coordinate of the pattern - */ - public static function putFinderPattern(&$frame, $ox, $oy) - { - $finder = array( - "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", - "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", - "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", - "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", - "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", - "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", - "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" - ); - - for($y=0; $y<7; $y++) { - QRstr::set($frame, $ox, $oy+$y, $finder[$y]); - } - } - - //---------------------------------------------------------------------- - public static function createFrame($version) - { - $width = self::$capacity[$version][QRCAP_WIDTH]; - $frameLine = str_repeat ("\0", $width); - $frame = array_fill(0, $width, $frameLine); - - // Finder pattern - self::putFinderPattern($frame, 0, 0); - self::putFinderPattern($frame, $width - 7, 0); - self::putFinderPattern($frame, 0, $width - 7); - - // Separator - $yOffset = $width - 7; - - for($y=0; $y<7; $y++) { - $frame[$y][7] = "\xc0"; - $frame[$y][$width - 8] = "\xc0"; - $frame[$yOffset][7] = "\xc0"; - $yOffset++; - } - - $setPattern = str_repeat("\xc0", 8); - - QRstr::set($frame, 0, 7, $setPattern); - QRstr::set($frame, $width-8, 7, $setPattern); - QRstr::set($frame, 0, $width - 8, $setPattern); - - // Format info - $setPattern = str_repeat("\x84", 9); - QRstr::set($frame, 0, 8, $setPattern); - QRstr::set($frame, $width - 8, 8, $setPattern, 8); - - $yOffset = $width - 8; - - for($y=0; $y<8; $y++,$yOffset++) { - $frame[$y][8] = "\x84"; - $frame[$yOffset][8] = "\x84"; - } - - // Timing pattern - - for($i=1; $i<$width-15; $i++) { - $frame[6][7+$i] = chr(0x90 | ($i & 1)); - $frame[7+$i][6] = chr(0x90 | ($i & 1)); - } - - // Alignment pattern - self::putAlignmentPattern($version, $frame, $width); - - // Version information - if($version >= 7) { - $vinf = self::getVersionPattern($version); - - $v = $vinf; - - for($x=0; $x<6; $x++) { - for($y=0; $y<3; $y++) { - $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); - $v = $v >> 1; - } - } - - $v = $vinf; - for($y=0; $y<6; $y++) { - for($x=0; $x<3; $x++) { - $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); - $v = $v >> 1; - } - } - } - - // and a little bit... - $frame[$width - 8][8] = "\x81"; - - return $frame; - } - - //---------------------------------------------------------------------- - public static function debug($frame, $binary_mode = false) - { - if ($binary_mode) { - - foreach ($frame as &$frameLine) { - $frameLine = join('  ', explode('0', $frameLine)); - $frameLine = join('██', explode('1', $frameLine)); - } - - ?> - -


        '; - echo join("
        ", $frame); - echo '






'; - - } else { - - foreach ($frame as &$frameLine) { - $frameLine = join(' ', explode("\xc0", $frameLine)); - $frameLine = join('', explode("\xc1", $frameLine)); - $frameLine = join(' ', explode("\xa0", $frameLine)); - $frameLine = join('', explode("\xa1", $frameLine)); - $frameLine = join('', explode("\x84", $frameLine)); //format 0 - $frameLine = join('', explode("\x85", $frameLine)); //format 1 - $frameLine = join('', explode("\x81", $frameLine)); //special bit - $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 - $frameLine = join('', explode("\x91", $frameLine)); //clock 1 - $frameLine = join(' ', explode("\x88", $frameLine)); //version - $frameLine = join('', explode("\x89", $frameLine)); //version - $frameLine = join('♦', explode("\x01", $frameLine)); - $frameLine = join('⋅', explode("\0", $frameLine)); - } - - ?> - - "; - echo join("
", $frame); - echo "
"; - - } - } - - //---------------------------------------------------------------------- - public static function serial($frame) - { - return gzcompress(join("\n", $frame), 9); - } - - //---------------------------------------------------------------------- - public static function unserial($code) - { - return explode("\n", gzuncompress($code)); - } - - //---------------------------------------------------------------------- - public static function newFrame($version) - { - if($version < 1 || $version > QRSPEC_VERSION_MAX) - return null; - - if(!isset(self::$frames[$version])) { - - $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; - - if (QR_CACHEABLE) { - if (file_exists($fileName)) { - self::$frames[$version] = self::unserial(file_get_contents($fileName)); - } else { - self::$frames[$version] = self::createFrame($version); - file_put_contents($fileName, self::serial(self::$frames[$version])); - } - } else { - self::$frames[$version] = self::createFrame($version); - } - } - - if(is_null(self::$frames[$version])) - return null; - - return self::$frames[$version]; - } - - //---------------------------------------------------------------------- - public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } - public static function rsBlockNum1($spec) { return $spec[0]; } - public static function rsDataCodes1($spec) { return $spec[1]; } - public static function rsEccCodes1($spec) { return $spec[2]; } - public static function rsBlockNum2($spec) { return $spec[3]; } - public static function rsDataCodes2($spec) { return $spec[4]; } - public static function rsEccCodes2($spec) { return $spec[2]; } - public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } - public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } - - } \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrsplit.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrsplit.php deleted file mode 100644 index d75b8273..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrsplit.php +++ /dev/null @@ -1,311 +0,0 @@ - - * - * PHP QR Code is distributed under LGPL 3 - * Copyright (C) 2010 Dominik Dzienia - * - * The following data / specifications are taken from - * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) - * or - * "Automatic identification and data capture techniques -- - * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - class QRsplit { - - public $dataStr = ''; - public $input; - public $modeHint; - - //---------------------------------------------------------------------- - public function __construct($dataStr, $input, $modeHint) - { - $this->dataStr = $dataStr; - $this->input = $input; - $this->modeHint = $modeHint; - } - - //---------------------------------------------------------------------- - public static function isdigitat($str, $pos) - { - if ($pos >= strlen($str)) - return false; - - return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); - } - - //---------------------------------------------------------------------- - public static function isalnumat($str, $pos) - { - if ($pos >= strlen($str)) - return false; - - return (QRinput::lookAnTable(ord($str[$pos])) >= 0); - } - - //---------------------------------------------------------------------- - public function identifyMode($pos) - { - if ($pos >= strlen($this->dataStr)) - return QR_MODE_NUL; - - $c = $this->dataStr[$pos]; - - if(self::isdigitat($this->dataStr, $pos)) { - return QR_MODE_NUM; - } else if(self::isalnumat($this->dataStr, $pos)) { - return QR_MODE_AN; - } else if($this->modeHint == QR_MODE_KANJI) { - - if ($pos+1 < strlen($this->dataStr)) - { - $d = $this->dataStr[$pos+1]; - $word = (ord($c) << 8) | ord($d); - if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { - return QR_MODE_KANJI; - } - } - } - - return QR_MODE_8; - } - - //---------------------------------------------------------------------- - public function eatNum() - { - $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); - - $p = 0; - while(self::isdigitat($this->dataStr, $p)) { - $p++; - } - - $run = $p; - $mode = $this->identifyMode($p); - - if($mode == QR_MODE_8) { - $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln - + QRinput::estimateBitsMode8(1) // + 4 + l8 - - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 - if($dif > 0) { - return $this->eat8(); - } - } - if($mode == QR_MODE_AN) { - $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln - + QRinput::estimateBitsModeAn(1) // + 4 + la - - QRinput::estimateBitsModeAn($run + 1);// - 4 - la - if($dif > 0) { - return $this->eatAn(); - } - } - - $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); - if($ret < 0) - return -1; - - return $run; - } - - //---------------------------------------------------------------------- - public function eatAn() - { - $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); - $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); - - $p = 0; - - while(self::isalnumat($this->dataStr, $p)) { - if(self::isdigitat($this->dataStr, $p)) { - $q = $p; - while(self::isdigitat($this->dataStr, $q)) { - $q++; - } - - $dif = QRinput::estimateBitsModeAn($p) // + 4 + la - + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - - QRinput::estimateBitsModeAn($q); // - 4 - la - - if($dif < 0) { - break; - } else { - $p = $q; - } - } else { - $p++; - } - } - - $run = $p; - - if(!self::isalnumat($this->dataStr, $p)) { - $dif = QRinput::estimateBitsModeAn($run) + 4 + $la - + QRinput::estimateBitsMode8(1) // + 4 + l8 - - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 - if($dif > 0) { - return $this->eat8(); - } - } - - $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); - if($ret < 0) - return -1; - - return $run; - } - - //---------------------------------------------------------------------- - public function eatKanji() - { - $p = 0; - - while($this->identifyMode($p) == QR_MODE_KANJI) { - $p += 2; - } - - $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); - if($ret < 0) - return -1; - - return $run; - } - - //---------------------------------------------------------------------- - public function eat8() - { - $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); - $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); - - $p = 1; - $dataStrLen = strlen($this->dataStr); - - while($p < $dataStrLen) { - - $mode = $this->identifyMode($p); - if($mode == QR_MODE_KANJI) { - break; - } - if($mode == QR_MODE_NUM) { - $q = $p; - while(self::isdigitat($this->dataStr, $q)) { - $q++; - } - $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 - + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - - QRinput::estimateBitsMode8($q); // - 4 - l8 - if($dif < 0) { - break; - } else { - $p = $q; - } - } else if($mode == QR_MODE_AN) { - $q = $p; - while(self::isalnumat($this->dataStr, $q)) { - $q++; - } - $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 - + QRinput::estimateBitsModeAn($q - $p) + 4 + $la - - QRinput::estimateBitsMode8($q); // - 4 - l8 - if($dif < 0) { - break; - } else { - $p = $q; - } - } else { - $p++; - } - } - - $run = $p; - $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); - - if($ret < 0) - return -1; - - return $run; - } - - //---------------------------------------------------------------------- - public function splitString() - { - while (strlen($this->dataStr) > 0) - { - if($this->dataStr == '') - return 0; - - $mode = $this->identifyMode(0); - - switch ($mode) { - case QR_MODE_NUM: $length = $this->eatNum(); break; - case QR_MODE_AN: $length = $this->eatAn(); break; - case QR_MODE_KANJI: - if ($hint == QR_MODE_KANJI) - $length = $this->eatKanji(); - else $length = $this->eat8(); - break; - default: $length = $this->eat8(); break; - - } - - if($length == 0) return 0; - if($length < 0) return -1; - - $this->dataStr = substr($this->dataStr, $length); - } - } - - //---------------------------------------------------------------------- - public function toUpper() - { - $stringLen = strlen($this->dataStr); - $p = 0; - - while ($p<$stringLen) { - $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); - if($mode == QR_MODE_KANJI) { - $p += 2; - } else { - if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { - $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); - } - $p++; - } - } - - return $this->dataStr; - } - - //---------------------------------------------------------------------- - public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) - { - if(is_null($string) || $string == '\0' || $string == '') { - throw new Exception('empty string!!!'); - } - - $split = new QRsplit($string, $input, $modeHint); - - if(!$casesensitive) - $split->toUpper(); - - return $split->splitString(); - } - } \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/qrtools.php b/sources/extend/addon/matrix/qrator/phpqrcode/qrtools.php deleted file mode 100644 index 3012db49..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/qrtools.php +++ /dev/null @@ -1,172 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - class QRtools { - - //---------------------------------------------------------------------- - public static function binarize($frame) - { - $len = count($frame); - foreach ($frame as &$frameLine) { - - for($i=0; $i<$len; $i++) { - $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; - } - } - - return $frame; - } - - //---------------------------------------------------------------------- - public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') - { - $barcode_array = array(); - - if (!is_array($mode)) - $mode = explode(',', $mode); - - $eccLevel = 'L'; - - if (count($mode) > 1) { - $eccLevel = $mode[1]; - } - - $qrTab = QRcode::text($code, false, $eccLevel); - $size = count($qrTab); - - $barcode_array['num_rows'] = $size; - $barcode_array['num_cols'] = $size; - $barcode_array['bcode'] = array(); - - foreach ($qrTab as $line) { - $arrAdd = array(); - foreach(str_split($line) as $char) - $arrAdd[] = ($char=='1')?1:0; - $barcode_array['bcode'][] = $arrAdd; - } - - return $barcode_array; - } - - //---------------------------------------------------------------------- - public static function clearCache() - { - self::$frames = array(); - } - - //---------------------------------------------------------------------- - public static function buildCache() - { - QRtools::markTime('before_build_cache'); - - $mask = new QRmask(); - for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { - $frame = QRspec::newFrame($a); - if (QR_IMAGE) { - $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; - QRimage::png(self::binarize($frame), $fileName, 1, 0); - } - - $width = count($frame); - $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); - for ($maskNo=0; $maskNo<8; $maskNo++) - $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); - } - - QRtools::markTime('after_build_cache'); - } - - //---------------------------------------------------------------------- - public static function log($outfile, $err) - { - if (QR_LOG_DIR !== false) { - if ($err != '') { - if ($outfile !== false) { - file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); - } else { - file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); - } - } - } - } - - //---------------------------------------------------------------------- - public static function dumpMask($frame) - { - $width = count($frame); - for($y=0;$y<$width;$y++) { - for($x=0;$x<$width;$x++) { - echo ord($frame[$y][$x]).','; - } - } - } - - //---------------------------------------------------------------------- - public static function markTime($markerId) - { - list($usec, $sec) = explode(" ", microtime()); - $time = ((float)$usec + (float)$sec); - - if (!isset($GLOBALS['qr_time_bench'])) - $GLOBALS['qr_time_bench'] = array(); - - $GLOBALS['qr_time_bench'][$markerId] = $time; - } - - //---------------------------------------------------------------------- - public static function timeBenchmark() - { - self::markTime('finish'); - - $lastTime = 0; - $startTime = 0; - $p = 0; - - echo ' - - '; - - foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { - if ($p > 0) { - echo ''; - } else { - $startTime = $thisTime; - } - - $p++; - $lastTime = $thisTime; - } - - echo ' - - -
BENCHMARK
till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
TOTAL: '.number_format($lastTime-$startTime, 6).'s
'; - } - - } - - //########################################################################## - - QRtools::markTime('start'); - \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/tools/merge.bat b/sources/extend/addon/matrix/qrator/phpqrcode/tools/merge.bat deleted file mode 100644 index b60a4853..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/tools/merge.bat +++ /dev/null @@ -1,2 +0,0 @@ -php ./merge.php -pause \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/tools/merge.php b/sources/extend/addon/matrix/qrator/phpqrcode/tools/merge.php deleted file mode 100644 index 19d338b3..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/tools/merge.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR; - $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; - - $outputFile = $QR_BASEDIR.'phpqrcode.php'; - - // Required libs - - $fileList = array( - $QR_BASEDIR.'qrconst.php', - $QR_TOOLSDIR.'merged_config.php', - $QR_BASEDIR.'qrtools.php', - $QR_BASEDIR.'qrspec.php', - $QR_BASEDIR.'qrimage.php', - $QR_BASEDIR.'qrinput.php', - $QR_BASEDIR.'qrbitstream.php', - $QR_BASEDIR.'qrsplit.php', - $QR_BASEDIR.'qrrscode.php', - $QR_BASEDIR.'qrmask.php', - $QR_BASEDIR.'qrencode.php' - ); - - $headerFile = $QR_TOOLSDIR.'merged_header.php'; - $versionFile = $QR_BASEDIR.'VERSION'; - - $outputCode = ''; - - foreach($fileList as $fileName) { - $outputCode .= "\n\n".'//---- '.basename($fileName).' -----------------------------'."\n\n"; - $anotherCode = file_get_contents($fileName); - $anotherCode = preg_replace ('/^<\?php/', '', $anotherCode); - $anotherCode = preg_replace ('/\?>\*$/', '', $anotherCode); - $outputCode .= "\n\n".$anotherCode."\n\n"; - } - - $versionDataEx = explode("\n", file_get_contents($versionFile)); - - $outputContents = file_get_contents($headerFile); - $outputContents .= "\n\n/*\n * Version: ".trim($versionDataEx[0])."\n * Build: ".trim($versionDataEx[1])."\n */\n\n"; - $outputContents .= $outputCode; - - file_put_contents($outputFile, $outputContents); - - \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/tools/merge.sh b/sources/extend/addon/matrix/qrator/phpqrcode/tools/merge.sh deleted file mode 100644 index e4c2fbcb..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/tools/merge.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -php ./merge.php \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/phpqrcode/tools/merged_config.php b/sources/extend/addon/matrix/qrator/phpqrcode/tools/merged_config.php deleted file mode 100644 index 55ddb450..00000000 --- a/sources/extend/addon/matrix/qrator/phpqrcode/tools/merged_config.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/qrator.apd b/sources/extend/addon/matrix/qrator/qrator.apd deleted file mode 100644 index 7ae0baee..00000000 --- a/sources/extend/addon/matrix/qrator/qrator.apd +++ /dev/null @@ -1,3 +0,0 @@ -url: $baseurl/qrator -name: QRator -photo: $baseurl/addon/qrator/qrator.png diff --git a/sources/extend/addon/matrix/qrator/qrator.php b/sources/extend/addon/matrix/qrator/qrator.php deleted file mode 100644 index 93385373..00000000 --- a/sources/extend/addon/matrix/qrator/qrator.php +++ /dev/null @@ -1,86 +0,0 @@ - 1 && argv(1) === 'qr') { - $t = $_GET['qr']; - require_once('addon/qrator/phpqrcode/phpqrcode.php'); - header("Content-type: image/png"); - QRcode::png(($t) ? $t : '.'); - killme(); - } - -} - - - - -/** - * @brief Returns an QR-code image from a value given in $match[1]. - * - * @param array $match - * @return string HTML img with QR-code of $match[1] - */ -function qrator_bb_qr($match) { - return '' . t('QR code') . ''; -} - - -function qrator_bbcode(&$a,&$b) { - - if (strpos($b,'[/qr]') !== false) { - $b = preg_replace_callback("/\[qr\](.*?)\[\/qr\]/ism", 'qrator_bb_qr', $b); - } - -} - - -function qrator_content(&$a) { - -$header = t('QR Generator'); -$prompt = t('Enter some text'); - -$o .= <<< EOT -

$header

- -
$prompt
- -
- - - - -EOT; -return $o; - -} \ No newline at end of file diff --git a/sources/extend/addon/matrix/qrator/qrator.png b/sources/extend/addon/matrix/qrator/qrator.png deleted file mode 100644 index 0dcd8e2a..00000000 Binary files a/sources/extend/addon/matrix/qrator/qrator.png and /dev/null differ diff --git a/sources/extend/addon/matrix/rainbowtag/rainbowtag.css b/sources/extend/addon/matrix/rainbowtag/rainbowtag.css deleted file mode 100755 index e69de29b..00000000 diff --git a/sources/extend/addon/matrix/rainbowtag/rainbowtag.php b/sources/extend/addon/matrix/rainbowtag/rainbowtag.php deleted file mode 100644 index 2badc51f..00000000 --- a/sources/extend/addon/matrix/rainbowtag/rainbowtag.php +++ /dev/null @@ -1,102 +0,0 @@ -profile_uid) - return; - if(! intval(get_pconfig($a->profile_uid,'rainbowtag','enable'))) - return; - - $c = get_pconfig($a->profile_uid,'rainbowtag','colors'); - $color1 = ((is_array($c) && $c[0]) ? $c[0] : 'DarkGray'); - $color2 = ((is_array($c) && $c[1]) ? $c[1] : 'LawnGreen'); - $color3 = ((is_array($c) && $c[2]) ? $c[2] : 'DarkOrange'); - $color4 = ((is_array($c) && $c[3]) ? $c[3] : 'Red'); - $color5 = ((is_array($c) && $c[4]) ? $c[4] : 'Gold'); - $color6 = ((is_array($c) && $c[5]) ? $c[5] : 'Teal'); - $color7 = ((is_array($c) && $c[6]) ? $c[6] : 'DarkMagenta'); - $color8 = ((is_array($c) && $c[7]) ? $c[7] : 'DarkGoldenRod'); - $color9 = ((is_array($c) && $c[8]) ? $c[8] : 'DarkBlue'); - $color10 = ((is_array($c) && $c[9]) ? $c[9] : 'DeepPink'); - - - - $o = ''; - - $a->page['htmlhead'] .= $o; - -} - -function rainbowtag_addon_settings(&$a,&$s) { - - - if(! local_channel()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - //head_add_css('/addon/rainbowtag/rainbowtag.css'); - - $enable_checked = (intval(get_pconfig(local_channel(),'rainbowtag','enable')) ? 1 : false); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('rainbowtag-enable', t('Enable Rainbowtag'), $enable_checked, '', array(t('No'),t('Yes'))), - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('rainbowtag', t('Rainbowtag Settings'), '', t('Submit')), - '$content' => $sc - )); - - return; - -} - -function rainbowtag_addon_settings_post(&$a,&$b) { - - if(! local_channel()) - return; - - if($_POST['rainbowtag-submit']) { - $enable = ((x($_POST,'rainbowtag-enable')) ? intval($_POST['rainbowtag-enable']) : 0); - set_pconfig(local_channel(),'rainbowtag','enable', $enable); - info( t('Rainbowtag Settings saved.') . EOL); - } -} diff --git a/sources/extend/addon/matrix/randpost/randpost.php b/sources/extend/addon/matrix/randpost/randpost.php deleted file mode 100644 index 17f52040..00000000 --- a/sources/extend/addon/matrix/randpost/randpost.php +++ /dev/null @@ -1,286 +0,0 @@ -get_baseurl() . '/channel/' . $c[0]['channel_address']); - if($v) { - foreach($v as $vv) { - if(link_compare($vv['url'],$link)) { - $my_conversation = true; - break; - } - } - } - } - - // don't hijack somebody else's conversation, but respond (once) if invited to. - - if(! $my_conversation) - return; - - // This conversation is boring me. - - $limit = mt_rand(5,20); - - $h = q("select id, body from item where author_xchan = '%s' and parent_mid = '%s' and uid = %d", - dbesc($c[0]['channel_hash']), - dbesc($b['item']['parent_mid']), - intval($b['uid']) - ); - if($h && count($h) > $limit) - return; - - - - // Be gracious and not obnoxious if thanked - - $replies = array( - t('You\'re welcome.'), - t('Ah shucks...'), - t('Don\'t mention it.'), - t('<blush>'), - ':like' - ); - - - // TODO: if you really want to freak somebody out, add a relevance search function to mod_zotfeed and - // use somebody's own words from long ago to craft a reply to them.... - - require_once('include/bbcode.php'); - require_once('include/html2plain.php'); - - if($b['item'] && $b['item']['body']) { - if(stristr($b['item']['body'],'nocomment')) - return; - $txt = preg_replace('/\@\[z(.*?)\[\/zrl\]/','',$b['item']['body']); - $txt = html2plain(bbcode($txt)); - $pattern = substr($txt,0,255); - } - - if($b['item']['author_xchan']) { - $z = q("select * from xchan where xchan_hash = '%s' limit 1", - dbesc($b['item']['author_xchan']) - ); - if($z) { - $mention = '@' . '[zrl=' . $z[0]['xchan_url'] . ']' . $z[0]['xchan_name'] . '[/zrl]' . "\n\n"; - } - } - - if(stristr($b['item']['body'],$c[0]['channel_name']) && mb_strlen($pattern) < 36 && stristr($pattern,'thank')) { - $reply = $replies[mt_rand(0,count($replies)-1)]; - } - - $x = array(); - - if($reply) { - $x['body'] = $mention . $reply; - } - else { - require_once('include/html2bbcode.php'); - - $valid = false; - - do { - $url = 'http://' . $fort_server . '/cookie.php?f=&lang=any&off=a&pattern=' . urlencode($pattern); - - $s = z_fetch_url($url); - - if($s['success'] && (! $s['body'])) - $s = z_fetch_url('http://' . $fort_server . '/cookie.php'); - - if((! $s['success']) || (! $s['body'])) - return; - - // if it might be a quote make it a quote - if(strpos($s['body'],'--')) - $x['body'] = '[quote]' . html2bbcode($s['body']) . '[/quote]'; - else - $x['body'] = html2bbcode($s['body']); - - $found_text = false; - - if($h) { - foreach($h as $hh) { - if(stripos($hh['body'],$x['body']) !== false) { - $pattern = ''; - $found_text = true; - break; - } - } - } - if(! $found_text) - $valid = true; - - } - while(! $valid); - } - - if($mention) { - $x['body'] = $mention . $x['body']; - - $x['term'] = array(array( - 'uid' => $c[0]['channel_id'], - 'type' => TERM_MENTION, - 'otype' => TERM_OBJ_POST, - 'term' => $z[0]['xchan_name'], - 'url' => $z[0]['xchan_url'] - )); - } - - $x['uid'] = $c[0]['channel_id']; - $x['aid'] = $c[0]['channel_account_id']; - $x['mid'] = item_message_id(); - $x['parent'] = $p[0]['id']; - $x['parent_mid'] = $b['item']['parent_mid']; - $x['author_xchan'] = $c[0]['channel_hash']; - $x['owner_xchan'] = $b['item']['owner_xchan']; - - $x['item_origin'] = 1; - $x['item_verified'] = 1; - - // You can't pass a Turing test if you reply in milliseconds. - // Also I believe we've got ten minutes fudge before we declare a post as time traveling. - // Otherwise we'll just set it to now and it will still go out in milliseconds. - // So set the reply to post sometime in the next 15-45 minutes (depends on poller interval) - - $fudge = mt_rand(15,30); - $x['created'] = $x['edited'] = datetime_convert('UTC','UTC','now + ' . $fudge . ' minutes'); - - $x['body'] = trim($x['body']); - $x['sig'] = base64url_encode(rsa_sign($x['body'],$c[0]['channel_prvkey'])); - - $post = item_store($x); - $post_id = $post['item_id']; - - $x['id'] = $post_id; - - call_hooks('post_local_end', $x); - - proc_run('php','include/notifier.php','comment-new',$post_id); - -} - - - -function randpost_fetch(&$a,&$b) { - - $fort_server = get_config('fortunate','server'); - if(! $fort_server) - return; - - $r = q("select * from pconfig where cat = 'randpost' and k = 'enable'"); - - if($r) { - foreach($r as $rr) { - if(! $rr['v']) - continue; -// logger('randpost'); - - // cronhooks run every 10-15 minutes typically - // try to keep from posting frequently. - - $test = mt_rand(0,100); - if($test == 25) { - $c = q("select * from channel where channel_id = %d limit 1", - intval($rr['uid']) - ); - if(! $c) - continue; - - $mention = ''; - - require_once('include/html2bbcode.php'); - - $s = z_fetch_url('http://' . $fort_server . '/cookie.php?numlines=2&equal=1&rand=' . mt_rand()); - if(! $s['success']) - continue; - - $x = array(); - $x['uid'] = $c[0]['channel_id']; - $x['aid'] = $c[0]['channel_account_id']; - $x['mid'] = $x['parent_mid'] = item_message_id(); - $x['author_xchan'] = $x['owner_xchan'] = $c[0]['channel_hash']; - $x['item_thread_top'] = 1; - $x['item_origin'] = 1; - $x['item_verified'] = 1; - $x['item_wall'] = 1; - - // if it might be a quote make it a quote - if(strpos($s['body'],'--')) - $x['body'] = $mention . '[quote]' . html2bbcode($s['body']) . '[/quote]'; - else - $x['body'] = $mention . html2bbcode($s['body']); - - $x['sig'] = base64url_encode(rsa_sign($x['body'],$c[0]['channel_prvkey'])); - - $post = item_store($x); - $post_id = $post['item_id']; - - $x['id'] = $post_id; - - call_hooks('post_local_end', $x); - - proc_run('php','include/notifier.php','wall-new',$post_id); - } - } - } -} - diff --git a/sources/extend/addon/matrix/redphotos/redphotohelper.php b/sources/extend/addon/matrix/redphotos/redphotohelper.php deleted file mode 100644 index e56f7166..00000000 --- a/sources/extend/addon/matrix/redphotos/redphotohelper.php +++ /dev/null @@ -1,76 +0,0 @@ -get_channel(); - - $fr_server = $_REQUEST['fr_server']; - $fr_username = $_REQUEST['fr_username']; - $fr_password = $_REQUEST['fr_password']; - - $cookies = 'store/[data]/redphoto_cookie_' . $channel['channel_address']; - - if($fr_server && $fr_username && $fr_password) { - - $ch = curl_init($fr_server . '/api/red/photos/list'); - - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookies); - curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookies); - curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_setopt($ch, CURLOPT_USERPWD, $fr_username . ':' . $fr_password); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_USERAGENT, 'RedMatrix'); - - $output = curl_exec($ch); - curl_close($ch); - - $j = json_decode($output,true); - -// echo print_r($j,true); - - $total = 0; - if(count($j)) { - foreach($j as $jj) { - - $r = q("select uid from photo where resource_id = '%s' and uid = %d limit 1", - dbesc($jj), - intval($channel['channel_id']) - ); - if($r) - continue; - - $total ++; - proc_run('php','addon/redphotos/redphotohelper.php',$jj, $channel['channel_address'], urlencode($fr_server)); - sleep(3); - } - } - if($total) { - set_pconfig(local_channel(),'redphotos','complete','1'); - } - @unlink($cookies); - goaway(z_root() . '/photos/' . $channel['channel_address']); - } -} - - -function redphotos_content(&$a) { - - if(! local_channel()) { - notice( t('Permission denied') . EOL); - return; - } - - if(intval(get_pconfig(local_channel(),'redphotos','complete'))) { - info('Redmatrix photos have already been imported into this channel.'); - return; - } - - $o = replace_macros(get_markup_template('redphotos.tpl','addon/redphotos'),array( - '$header' => t('Redmatrix Photo Album Import'), - '$desc' => t('This will import all your Redmatrix photo albums to this channel.'), - '$fr_server' => array('fr_server', t('Redmatrix Server base URL'),'',''), - '$fr_username' => array('fr_username', t('Redmatrix Login Username'),'',''), - '$fr_password' => array('fr_password', t('redmatrix Login Password'),'',''), - '$submit' => t('Submit'), - )); - return $o; -} diff --git a/sources/extend/addon/matrix/redphotos/view/tpl/frphotos.tpl b/sources/extend/addon/matrix/redphotos/view/tpl/frphotos.tpl deleted file mode 100644 index b8e97882..00000000 --- a/sources/extend/addon/matrix/redphotos/view/tpl/frphotos.tpl +++ /dev/null @@ -1,13 +0,0 @@ -

{{$header}}

- -

{{$desc}}

- -
- -{{include file="field_input.tpl" field=$fr_server}} -{{include file="field_input.tpl" field=$fr_username}} -{{include file="field_password.tpl" field=$fr_password}} - - -
- diff --git a/sources/extend/addon/matrix/redred/redred.css b/sources/extend/addon/matrix/redred/redred.css deleted file mode 100755 index e69de29b..00000000 diff --git a/sources/extend/addon/matrix/redred/redred.php b/sources/extend/addon/matrix/redred/redred.php deleted file mode 100755 index 4f1c4640..00000000 --- a/sources/extend/addon/matrix/redred/redred.php +++ /dev/null @@ -1,199 +0,0 @@ - ' - . ' ' . t('Post to Red') . ''; - } -} - -function redred_settings_post ($a,$post) { - if(! local_channel()) - return; - // don't check redred settings if redred submit button is not clicked - if (! x($_POST,'redred-submit')) - return; - - $channel = $a->get_channel(); - // Don't let somebody post to their self channel. Since we aren't passing message-id this would be very very bad. - - if(! trim($_POST['redred_channel'])) { - notice( t('Channel is required.') . EOL); - return; - } - - if($channel['channel_address'] === trim($_POST['redred_channel'])) { - notice( t('Invalid channel.') . EOL); - return; - } - - - - - set_pconfig(local_channel(), 'redred', 'baseapi', trim($_POST['redred_baseapi'])); - set_pconfig(local_channel(), 'redred', 'username', trim($_POST['redred_username'])); - set_pconfig(local_channel(), 'redred', 'password', z_obscure(trim($_POST['redred_password']))); - set_pconfig(local_channel(), 'redred', 'channel', trim($_POST['redred_channel'])); - set_pconfig(local_channel(), 'redred', 'post', intval($_POST['redred_enable'])); - set_pconfig(local_channel(), 'redred', 'post_by_default', intval($_POST['redred_default'])); - info( t('redred Settings saved.') . EOL); - -} - -function redred_settings(&$a,&$s) { - if(! local_channel()) - return; - //head_add_css('/addon/redred/redred.css'); - - $api = get_pconfig(local_channel(), 'redred', 'baseapi'); - $username = get_pconfig(local_channel(), 'redred', 'username' ); - $password = z_unobscure(get_pconfig(local_channel(), 'redred', 'password' )); - $channel = get_pconfig(local_channel(), 'redred', 'channel' ); - $enabled = get_pconfig(local_channel(), 'redred', 'post'); - $checked = (($enabled) ? 1 : false); - $defenabled = get_pconfig(local_channel(),'redred','post_by_default'); - $defchecked = (($defenabled) ? 1 : false); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('redred_enable', t('Allow posting to Red Channel'), $checked, '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('redred_default', t('Send public postings to Red by default'), $defchecked, '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('redred_baseapi', t('Red API Path'), $api, t('https://{sitename}/api')) - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('redred_username', t('Red login name'), $username, t('Email')) - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('redred_channel', t('Red channel name'), $channel, t('Nickname')) - )); - - $sc .= replace_macros(get_markup_template('field_password.tpl'), array( - '$field' => array('redred_password', t('Red password'), $password, '') - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('redred', '' . t('Red to Red Post Settings'), '', t('Submit')), - '$content' => $sc - )); - -} - - -function redred_post_local(&$a,&$b) { - if($b['created'] != $b['edited']) - return; - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - if((local_channel()) && (local_channel() == $b['uid']) && (! $b['item_private'])) { - - $redred_post = get_pconfig(local_channel(),'redred','post'); - $redred_enable = (($redred_post && x($_REQUEST,'redred_enable')) ? intval($_REQUEST['redred_enable']) : 0); - - // if API is used, default to the chosen settings - if($_REQUEST['api_source'] && intval(get_pconfig(local_channel(),'redred','post_by_default'))) - $redred_enable = 1; - - if(! $redred_enable) - return; - - if(strlen($b['postopts'])) - $b['postopts'] .= ','; - $b['postopts'] .= 'redred'; - } -} - - -function redred_post_hook(&$a,&$b) { - - /** - * Post to Red - */ - - // for now, just top level posts. - - if($b['mid'] != $b['parent_mid']) - return; - - if((! is_item_normal($b)) || $b['item_private'] || ($b['created'] !== $b['edited'])) - return; - - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - - if(! strstr($b['postopts'],'redred')) - return; - - logger('Red-to-Red post invoked'); - - load_pconfig($b['uid'], 'redred'); - - - $api = get_pconfig($b['uid'], 'redred', 'baseapi'); - if(substr($api,-1,1) != '/') - $api .= '/'; - $username = get_pconfig($b['uid'], 'redred', 'username'); - $password = z_unobscure(get_pconfig($b['uid'], 'redred', 'password')); - $channel = get_pconfig($b['uid'], 'redred', 'channel'); - - $msg = $b['body']; - - $postdata = array('status' => $b['body'], 'title' => $b['title'], 'channel' => $channel); - - if(strlen($b['body'])) { - $ret = z_post_url($api . 'statuses/update', $postdata, 0, array('http_auth' => $username . ':' . $password)); - if($ret['success']) - logger('redred: returns: ' . print_r($ret['body'],true)); - else - logger('redred: z_post_url failed: ' . print_r($ret['debug'],true)); - } -} - diff --git a/sources/extend/addon/matrix/redred/rhash-32.png b/sources/extend/addon/matrix/redred/rhash-32.png deleted file mode 100644 index 564556d4..00000000 Binary files a/sources/extend/addon/matrix/redred/rhash-32.png and /dev/null differ diff --git a/sources/extend/addon/matrix/rtof/friendica.png b/sources/extend/addon/matrix/rtof/friendica.png deleted file mode 100644 index 61764bf2..00000000 Binary files a/sources/extend/addon/matrix/rtof/friendica.png and /dev/null differ diff --git a/sources/extend/addon/matrix/rtof/rtof.css b/sources/extend/addon/matrix/rtof/rtof.css deleted file mode 100755 index e69de29b..00000000 diff --git a/sources/extend/addon/matrix/rtof/rtof.php b/sources/extend/addon/matrix/rtof/rtof.php deleted file mode 100755 index 22a26645..00000000 --- a/sources/extend/addon/matrix/rtof/rtof.php +++ /dev/null @@ -1,177 +0,0 @@ - ' - . '' . ''; - - } -} - -function rtof_settings_post ($a,$post) { - if(! local_channel()) - return; - // don't check rtof settings if rtof submit button is not clicked - if (! x($_POST,'rtof-submit')) - return; - - set_pconfig(local_channel(), 'rtof', 'baseapi', trim($_POST['rtof_baseapi'])); - set_pconfig(local_channel(), 'rtof', 'username', trim($_POST['rtof_username'])); - set_pconfig(local_channel(), 'rtof', 'password', z_obscure(trim($_POST['rtof_password']))); - set_pconfig(local_channel(), 'rtof', 'post', intval($_POST['rtof_enable'])); - set_pconfig(local_channel(), 'rtof', 'post_by_default', intval($_POST['rtof_default'])); - info( t('rtof Settings saved.') . EOL); - -} - -function rtof_settings(&$a,&$s) { - if(! local_channel()) - return; - //head_add_css('/addon/rtof/rtof.css'); - - $api = get_pconfig(local_channel(), 'rtof', 'baseapi'); - $username = get_pconfig(local_channel(), 'rtof', 'username' ); - $password = z_unobscure(get_pconfig(local_channel(), 'rtof', 'password' )); - $enabled = get_pconfig(local_channel(), 'rtof', 'post'); - $checked = (($enabled) ? 1 : false); - $defenabled = get_pconfig(local_channel(),'rtof','post_by_default'); - $defchecked = (($defenabled) ? 1 : false); - - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('rtof_enable', t('Allow posting to Friendica'), $checked, '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('rtof_default', t('Send public postings to Friendica by default'), $defchecked, '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('rtof_baseapi', t('Friendica API Path'), $api, t('https://{sitename}/api')) - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('rtof_username', t('Friendica login name'), $username, t('Email')) - )); - - $sc .= replace_macros(get_markup_template('field_password.tpl'), array( - '$field' => array('rtof_password', t('Friendica password'), $password, '') - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('rtof', '' . t('Red to Friendica Post Settings'), '', t('Submit')), - '$content' => $sc - )); -} - - -function rtof_post_local(&$a,&$b) { - if($b['created'] != $b['edited']) - return; - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - if((local_channel()) && (local_channel() == $b['uid']) && (! $b['item_private'])) { - - $rtof_post = get_pconfig(local_channel(),'rtof','post'); - $rtof_enable = (($rtof_post && x($_REQUEST,'rtof_enable')) ? intval($_REQUEST['rtof_enable']) : 0); - - // if API is used, default to the chosen settings - if($_REQUEST['api_source'] && intval(get_pconfig(local_channel(),'rtof','post_by_default'))) - $rtof_enable = 1; - - if(! $rtof_enable) - return; - - if(strlen($b['postopts'])) - $b['postopts'] .= ','; - $b['postopts'] .= 'rtof'; - } -} - - -function rtof_post_hook(&$a,&$b) { - - /** - * Post to Friendica - */ - - // for now, just top level posts. - - if($b['mid'] != $b['parent_mid']) - return; - - if((! is_item_normal($b)) || $b['item_private'] || ($b['created'] !== $b['edited'])) - return; - - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - - if(! strstr($b['postopts'],'rtof')) - return; - - logger('Red-to-Friendica post invoked'); - - load_pconfig($b['uid'], 'rtof'); - - - $api = get_pconfig($b['uid'], 'rtof', 'baseapi'); - if(substr($api,-1,1) != '/') - $api .= '/'; - $username = get_pconfig($b['uid'], 'rtof', 'username'); - $password = z_unobscure(get_pconfig($b['uid'], 'rtof', 'password')); - - $msg = $b['body']; - - $postdata = array('status' => $b['body'], 'title' => $b['title'], 'message_id' => $b['mid'], 'source' => 'Hubzilla'); - - if(strlen($b['body'])) { - $ret = z_post_url($api . 'statuses/update', $postdata, 0, array('http_auth' => $username . ':' . $password, 'novalidate' => 1)); - if($ret['success']) - logger('rtof: returns: ' . print_r($ret['body'],true)); - else - logger('rtof: z_post_url failed: ' . print_r($ret['debug'],true)); - } -} - diff --git a/sources/extend/addon/matrix/sendzid/sendzid.php b/sources/extend/addon/matrix/sendzid/sendzid.php deleted file mode 100755 index 20e0314c..00000000 --- a/sources/extend/addon/matrix/sendzid/sendzid.php +++ /dev/null @@ -1,29 +0,0 @@ - - - */ - -function sendzid_load() { - register_hook('get_features','addon/sendzid/sendzid.php','sendzid_get_features'); -} - -function sendzid_unload() { - unregister_hook('get_features','addon/sendzid/sendzid.php','sendzid_get_features'); -} - -function sendzid_get_features(&$a,&$b) { - - //FIXME - needs a better description - $b['general'][] = array( - 'sendzid', - t('Extended Identity Sharing'), - t('Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix.'),false); - -} - diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/bee.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/bee.gif deleted file mode 100644 index 206c2e3e..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/bee.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/bigspider.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/bigspider.gif deleted file mode 100644 index ce546c30..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/bigspider.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/bunny.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/bunny.gif deleted file mode 100644 index 402b2b31..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/bunny.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/bunnyflowers.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/bunnyflowers.gif deleted file mode 100644 index 6d665e2c..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/bunnyflowers.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/cat.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/cat.gif deleted file mode 100644 index a612c476..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/cat.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/chick.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/chick.gif deleted file mode 100644 index 6bcddcd8..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/chick.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/cow.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/cow.gif deleted file mode 100644 index 3f94cfa6..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/cow.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/crab.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/crab.gif deleted file mode 100644 index db5b8ce3..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/crab.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/dog.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/dog.gif deleted file mode 100644 index 7b28477b..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/dog.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/dolphin.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/dolphin.gif deleted file mode 100644 index 672ebd72..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/dolphin.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/dragonfly.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/dragonfly.gif deleted file mode 100644 index 566e95c2..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/dragonfly.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/elephant.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/elephant.gif deleted file mode 100644 index 4311e97d..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/elephant.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/fish.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/fish.gif deleted file mode 100644 index 3a7a584b..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/fish.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/frog.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/frog.gif deleted file mode 100644 index 85e4b56e..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/frog.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/giraffe.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/giraffe.gif deleted file mode 100644 index 4c95ea4c..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/giraffe.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/hamster.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/hamster.gif deleted file mode 100644 index 96c7323c..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/hamster.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/horse.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/horse.gif deleted file mode 100644 index 9103abfa..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/horse.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/ladybird.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/ladybird.gif deleted file mode 100644 index 69444a9e..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/ladybird.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/monkey.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/monkey.gif deleted file mode 100644 index b9b338d2..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/monkey.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/parrot.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/parrot.gif deleted file mode 100644 index ae6faf66..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/parrot.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/pig.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/pig.gif deleted file mode 100644 index bdc68e83..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/pig.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/sheep.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/sheep.gif deleted file mode 100644 index 8fafc11d..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/sheep.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/snail.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/snail.gif deleted file mode 100644 index 3bdb44cb..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/snail.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/animals/tux.gif b/sources/extend/addon/matrix/smiley_pack/icons/animals/tux.gif deleted file mode 100644 index 08e006e1..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/animals/tux.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/babies/baby.gif b/sources/extend/addon/matrix/smiley_pack/icons/babies/baby.gif deleted file mode 100644 index d105afb3..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/babies/baby.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/babies/babycot.gif b/sources/extend/addon/matrix/smiley_pack/icons/babies/babycot.gif deleted file mode 100644 index 750f6df1..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/babies/babycot.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/babies/pregnant.gif b/sources/extend/addon/matrix/smiley_pack/icons/babies/pregnant.gif deleted file mode 100644 index d97f4768..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/babies/pregnant.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/babies/stork.gif b/sources/extend/addon/matrix/smiley_pack/icons/babies/stork.gif deleted file mode 100644 index 8bdf4c9b..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/babies/stork.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/confused/confused.gif b/sources/extend/addon/matrix/smiley_pack/icons/confused/confused.gif deleted file mode 100644 index 8f1b79a7..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/confused/confused.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/confused/dazed.gif b/sources/extend/addon/matrix/smiley_pack/icons/confused/dazed.gif deleted file mode 100644 index f5e7ec26..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/confused/dazed.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/confused/shrug.gif b/sources/extend/addon/matrix/smiley_pack/icons/confused/shrug.gif deleted file mode 100644 index 31ce007f..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/confused/shrug.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/confused/stupid.gif b/sources/extend/addon/matrix/smiley_pack/icons/confused/stupid.gif deleted file mode 100644 index c17170aa..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/confused/stupid.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/cool/affro.gif b/sources/extend/addon/matrix/smiley_pack/icons/cool/affro.gif deleted file mode 100644 index f06166b8..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/cool/affro.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/cool/cool.gif b/sources/extend/addon/matrix/smiley_pack/icons/cool/cool.gif deleted file mode 100644 index 05ba9f13..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/cool/cool.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/angel.gif b/sources/extend/addon/matrix/smiley_pack/icons/devilangel/angel.gif deleted file mode 100644 index 8e585416..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/angel.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/blondedevil.gif b/sources/extend/addon/matrix/smiley_pack/icons/devilangel/blondedevil.gif deleted file mode 100644 index 09e7e682..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/blondedevil.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/catdevil.gif b/sources/extend/addon/matrix/smiley_pack/icons/devilangel/catdevil.gif deleted file mode 100644 index 269d719b..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/catdevil.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/cherub.gif b/sources/extend/addon/matrix/smiley_pack/icons/devilangel/cherub.gif deleted file mode 100644 index 40872e03..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/cherub.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/daseesaw.gif b/sources/extend/addon/matrix/smiley_pack/icons/devilangel/daseesaw.gif deleted file mode 100644 index 1c04b2ee..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/daseesaw.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/devil.gif b/sources/extend/addon/matrix/smiley_pack/icons/devilangel/devil.gif deleted file mode 100644 index 2b567972..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/devil.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/graveside.gif b/sources/extend/addon/matrix/smiley_pack/icons/devilangel/graveside.gif deleted file mode 100644 index 0e909357..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/graveside.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/saint.gif b/sources/extend/addon/matrix/smiley_pack/icons/devilangel/saint.gif deleted file mode 100644 index 52c22c48..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/saint.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/turnevil.gif b/sources/extend/addon/matrix/smiley_pack/icons/devilangel/turnevil.gif deleted file mode 100644 index 1490c0f7..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/devilangel/turnevil.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/disgust/fartblush.gif b/sources/extend/addon/matrix/smiley_pack/icons/disgust/fartblush.gif deleted file mode 100644 index 4160a1fc..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/disgust/fartblush.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/disgust/fartinbed.gif b/sources/extend/addon/matrix/smiley_pack/icons/disgust/fartinbed.gif deleted file mode 100644 index 55536499..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/disgust/fartinbed.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/disgust/toilet.gif b/sources/extend/addon/matrix/smiley_pack/icons/disgust/toilet.gif deleted file mode 100644 index 092d7ca4..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/disgust/toilet.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/disgust/vomit.gif b/sources/extend/addon/matrix/smiley_pack/icons/disgust/vomit.gif deleted file mode 100644 index 6e7e727a..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/disgust/vomit.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/drink/tea.gif b/sources/extend/addon/matrix/smiley_pack/icons/drink/tea.gif deleted file mode 100644 index 474b9894..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/drink/tea.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/drool/drool.gif b/sources/extend/addon/matrix/smiley_pack/icons/drool/drool.gif deleted file mode 100644 index 4093df65..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/drool/drool.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/alienmonster.gif b/sources/extend/addon/matrix/smiley_pack/icons/fantasy/alienmonster.gif deleted file mode 100644 index e0ca7f65..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/alienmonster.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/barbarian.gif b/sources/extend/addon/matrix/smiley_pack/icons/fantasy/barbarian.gif deleted file mode 100644 index de8a0686..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/barbarian.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/dinosaur.gif b/sources/extend/addon/matrix/smiley_pack/icons/fantasy/dinosaur.gif deleted file mode 100644 index e8c625c3..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/dinosaur.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/doctor.gif b/sources/extend/addon/matrix/smiley_pack/icons/fantasy/doctor.gif deleted file mode 100644 index 6f94e040..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/doctor.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/dragon.gif b/sources/extend/addon/matrix/smiley_pack/icons/fantasy/dragon.gif deleted file mode 100644 index fd28fbf1..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/dragon.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/dragonwhelp.gif b/sources/extend/addon/matrix/smiley_pack/icons/fantasy/dragonwhelp.gif deleted file mode 100644 index dbc45559..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/dragonwhelp.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/ghost.gif b/sources/extend/addon/matrix/smiley_pack/icons/fantasy/ghost.gif deleted file mode 100644 index 4c5d85d8..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/ghost.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/mummy.gif b/sources/extend/addon/matrix/smiley_pack/icons/fantasy/mummy.gif deleted file mode 100644 index 50e1dfb9..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fantasy/mummy.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/2guns.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/2guns.gif deleted file mode 100644 index 9e1b6638..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/2guns.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/acid.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/acid.gif deleted file mode 100644 index a53f7c46..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/acid.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/alienfight.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/alienfight.gif deleted file mode 100644 index d9e5d430..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/alienfight.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/alpha.png b/sources/extend/addon/matrix/smiley_pack/icons/fight/alpha.png deleted file mode 100644 index 09e3f233..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/alpha.png and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/army.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/army.gif deleted file mode 100644 index 75067008..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/army.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/arrowhead.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/arrowhead.gif deleted file mode 100644 index f4572c43..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/arrowhead.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/bfg.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/bfg.gif deleted file mode 100644 index c2ba9d06..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/bfg.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/bowman.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/bowman.gif deleted file mode 100644 index 2f1f8f05..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/bowman.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/chainsaw.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/chainsaw.gif deleted file mode 100644 index 71f757c3..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/chainsaw.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/crossbow.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/crossbow.gif deleted file mode 100644 index 20874f3c..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/crossbow.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/crusader.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/crusader.gif deleted file mode 100644 index 95848aea..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/crusader.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/dead.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/dead.gif deleted file mode 100644 index 31adaba3..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/dead.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/gangs.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/gangs.gif deleted file mode 100644 index 2c655b1f..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/gangs.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/hammersplat.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/hammersplat.gif deleted file mode 100644 index 95bd5409..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/hammersplat.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/lasergun.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/lasergun.gif deleted file mode 100644 index f3f82cbd..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/lasergun.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/machinegun.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/machinegun.gif deleted file mode 100644 index 1cff5cc5..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/machinegun.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/marine.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/marine.gif deleted file mode 100644 index 88fd2e09..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/marine.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/sabre.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/sabre.gif deleted file mode 100644 index e6239682..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/sabre.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/samurai.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/samurai.gif deleted file mode 100644 index 8b24385b..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/samurai.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/tank.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/tank.gif deleted file mode 100644 index f1d969dd..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/tank.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/throw-rocks.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/throw-rocks.gif deleted file mode 100644 index 756e4d3d..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/throw-rocks.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/fight/viking.gif b/sources/extend/addon/matrix/smiley_pack/icons/fight/viking.gif deleted file mode 100644 index 4908eddb..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/fight/viking.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/apple.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/apple.gif deleted file mode 100644 index 969d4ca8..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/apple.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/banana.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/banana.gif deleted file mode 100644 index d990d19d..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/banana.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/birthdaycake.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/birthdaycake.gif deleted file mode 100644 index 30ebceb3..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/birthdaycake.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/broccoli.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/broccoli.gif deleted file mode 100644 index f379889c..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/broccoli.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/cake.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/cake.gif deleted file mode 100644 index 22d0ebd9..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/cake.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/carrot.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/carrot.gif deleted file mode 100644 index 387b94c1..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/carrot.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/cooking.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/cooking.gif deleted file mode 100644 index e62fea06..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/cooking.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/fryegg.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/fryegg.gif deleted file mode 100644 index bd1b4ff0..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/fryegg.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/popcorn.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/popcorn.gif deleted file mode 100644 index b0ea6976..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/popcorn.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/food/tomato.gif b/sources/extend/addon/matrix/smiley_pack/icons/food/tomato.gif deleted file mode 100644 index 0e3daddb..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/food/tomato.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/happy/cloud9.gif b/sources/extend/addon/matrix/smiley_pack/icons/happy/cloud9.gif deleted file mode 100644 index 801c1a39..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/happy/cloud9.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/happy/tearsofjoy.gif b/sources/extend/addon/matrix/smiley_pack/icons/happy/tearsofjoy.gif deleted file mode 100644 index 5de31171..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/happy/tearsofjoy.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/laugh/hahaha.gif b/sources/extend/addon/matrix/smiley_pack/icons/laugh/hahaha.gif deleted file mode 100644 index 37aa92a1..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/laugh/hahaha.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/laugh/loltv.gif b/sources/extend/addon/matrix/smiley_pack/icons/laugh/loltv.gif deleted file mode 100644 index 3de6f778..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/laugh/loltv.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/laugh/rofl.gif b/sources/extend/addon/matrix/smiley_pack/icons/laugh/rofl.gif deleted file mode 100644 index a3bb03d6..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/laugh/rofl.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/laugh/snicker.jpeg b/sources/extend/addon/matrix/smiley_pack/icons/laugh/snicker.jpeg deleted file mode 100644 index 2e42a10f..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/laugh/snicker.jpeg and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/love/iloveyou.gif b/sources/extend/addon/matrix/smiley_pack/icons/love/iloveyou.gif deleted file mode 100644 index 7007515b..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/love/iloveyou.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/love/inlove.gif b/sources/extend/addon/matrix/smiley_pack/icons/love/inlove.gif deleted file mode 100644 index 30357af2..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/love/inlove.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/love/love.gif b/sources/extend/addon/matrix/smiley_pack/icons/love/love.gif deleted file mode 100644 index d8f0d5ba..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/love/love.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/love/lovebear.gif b/sources/extend/addon/matrix/smiley_pack/icons/love/lovebear.gif deleted file mode 100644 index d13fd185..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/love/lovebear.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/love/lovebed.gif b/sources/extend/addon/matrix/smiley_pack/icons/love/lovebed.gif deleted file mode 100644 index c5783e0f..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/love/lovebed.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/love/loveheart.gif b/sources/extend/addon/matrix/smiley_pack/icons/love/loveheart.gif deleted file mode 100644 index 541220a9..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/love/loveheart.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/music/dj.gif b/sources/extend/addon/matrix/smiley_pack/icons/music/dj.gif deleted file mode 100644 index 66bc075f..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/music/dj.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/music/drums.gif b/sources/extend/addon/matrix/smiley_pack/icons/music/drums.gif deleted file mode 100644 index 27215f4d..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/music/drums.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/music/elvis.gif b/sources/extend/addon/matrix/smiley_pack/icons/music/elvis.gif deleted file mode 100644 index ebcdcccc..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/music/elvis.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/music/guitar.gif b/sources/extend/addon/matrix/smiley_pack/icons/music/guitar.gif deleted file mode 100644 index 11eccdd0..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/music/guitar.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/music/trumpet.gif b/sources/extend/addon/matrix/smiley_pack/icons/music/trumpet.gif deleted file mode 100644 index 4595cccb..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/music/trumpet.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/music/violin.gif b/sources/extend/addon/matrix/smiley_pack/icons/music/violin.gif deleted file mode 100644 index 53592d6e..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/music/violin.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/beard.png b/sources/extend/addon/matrix/smiley_pack/icons/oldcore/beard.png deleted file mode 100644 index 5d4b2846..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/beard.png and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/headbang.gif b/sources/extend/addon/matrix/smiley_pack/icons/oldcore/headbang.gif deleted file mode 100644 index 91ccb8bb..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/headbang.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/laughing.gif b/sources/extend/addon/matrix/smiley_pack/icons/oldcore/laughing.gif deleted file mode 100755 index 1bf29de7..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/laughing.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/shaka.gif b/sources/extend/addon/matrix/smiley_pack/icons/oldcore/shaka.gif deleted file mode 100644 index e5d7b703..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/shaka.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/surprised.gif b/sources/extend/addon/matrix/smiley_pack/icons/oldcore/surprised.gif deleted file mode 100755 index b0746532..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/surprised.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/whitebeard.png b/sources/extend/addon/matrix/smiley_pack/icons/oldcore/whitebeard.png deleted file mode 100644 index 2a1fccbb..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/oldcore/whitebeard.png and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/respect/bow.gif b/sources/extend/addon/matrix/smiley_pack/icons/respect/bow.gif deleted file mode 100644 index ecc64847..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/respect/bow.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/respect/bravo.gif b/sources/extend/addon/matrix/smiley_pack/icons/respect/bravo.gif deleted file mode 100644 index 34f72abb..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/respect/bravo.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/respect/hailking.gif b/sources/extend/addon/matrix/smiley_pack/icons/respect/hailking.gif deleted file mode 100644 index 07551e50..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/respect/hailking.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/respect/number1.gif b/sources/extend/addon/matrix/smiley_pack/icons/respect/number1.gif deleted file mode 100644 index ab5c410c..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/respect/number1.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/respect/towel.gif b/sources/extend/addon/matrix/smiley_pack/icons/respect/towel.gif deleted file mode 100644 index c141da9f..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/respect/towel.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sad/crying.png b/sources/extend/addon/matrix/smiley_pack/icons/sad/crying.png deleted file mode 100644 index 62b9646d..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sad/crying.png and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sad/prisoner.gif b/sources/extend/addon/matrix/smiley_pack/icons/sad/prisoner.gif deleted file mode 100644 index f2c3181d..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sad/prisoner.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sad/sigh.gif b/sources/extend/addon/matrix/smiley_pack/icons/sad/sigh.gif deleted file mode 100644 index 68602266..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sad/sigh.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/smoking/smoking.gif b/sources/extend/addon/matrix/smiley_pack/icons/smoking/smoking.gif deleted file mode 100644 index 77720b17..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/smoking/smoking.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/archery.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/archery.gif deleted file mode 100644 index 8b4b9f62..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/archery.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/basketball.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/basketball.gif deleted file mode 100644 index e9ad4b57..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/basketball.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/bowling.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/bowling.gif deleted file mode 100644 index 0f8300c9..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/bowling.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/cycling.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/cycling.gif deleted file mode 100644 index 332081e8..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/cycling.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/darts.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/darts.gif deleted file mode 100644 index 09fb6ea9..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/darts.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/fencing.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/fencing.gif deleted file mode 100644 index a4ec5cd3..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/fencing.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/football.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/football.gif deleted file mode 100644 index c9fa6c5e..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/football.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/golf.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/golf.gif deleted file mode 100644 index 179fc52d..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/golf.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/horseriding.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/horseriding.gif deleted file mode 100644 index 13ca4503..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/horseriding.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/juggling.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/juggling.gif deleted file mode 100644 index 1a2eb60b..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/juggling.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/skipping.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/skipping.gif deleted file mode 100644 index f63270b1..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/skipping.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/snooker.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/snooker.gif deleted file mode 100644 index fa2e6a84..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/snooker.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/surfing.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/surfing.gif deleted file mode 100644 index b75d74b9..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/surfing.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/sport/tennis.gif b/sources/extend/addon/matrix/smiley_pack/icons/sport/tennis.gif deleted file mode 100644 index 36e47bf9..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/sport/tennis.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/things/cloud9.gif b/sources/extend/addon/matrix/smiley_pack/icons/things/cloud9.gif deleted file mode 100644 index 46d5007e..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/things/cloud9.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/tired/countsheep.gif b/sources/extend/addon/matrix/smiley_pack/icons/tired/countsheep.gif deleted file mode 100644 index 815b090f..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/tired/countsheep.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/tired/hammock.gif b/sources/extend/addon/matrix/smiley_pack/icons/tired/hammock.gif deleted file mode 100644 index 8639dd32..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/tired/hammock.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/tired/pillow.gif b/sources/extend/addon/matrix/smiley_pack/icons/tired/pillow.gif deleted file mode 100644 index 367f65ed..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/tired/pillow.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/icons/tired/yawn.gif b/sources/extend/addon/matrix/smiley_pack/icons/tired/yawn.gif deleted file mode 100644 index d4514801..00000000 Binary files a/sources/extend/addon/matrix/smiley_pack/icons/tired/yawn.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smiley_pack/smiley_pack.php b/sources/extend/addon/matrix/smiley_pack/smiley_pack.php deleted file mode 100644 index 8e24739d..00000000 --- a/sources/extend/addon/matrix/smiley_pack/smiley_pack.php +++ /dev/null @@ -1,504 +0,0 @@ - - * Category: Post Tools - * Screenshot: None - * Depends: Core - * Recommends: None - */ - -function smiley_pack_load() { - register_hook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies'); -} - -function smiley_pack_unload() { - unregister_hook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies'); -} - - - -function smiley_pack_smilies(&$a,&$b) { - - -#Animal smileys. - - $b['texts'][] = ':bunnyflowers'; - $b['icons'][] = '' . ':bunnyflowers' . ''; - - $b['texts'][] = ':chick'; - $b['icons'][] = '' . ':chick' . ''; - - $b['texts'][] = ':bumblebee'; - $b['icons'][] = '' . ':bee' . ''; - - $b['texts'][] = ':ladybird'; - $b['icons'][] = '' . ':ladybird' . ''; - - $b['texts'][] = ':bigspider'; - $b['icons'][] = '' . ':bigspider' . ''; - - $b['texts'][] = ':cat'; - $b['icons'][] = '' . ':cat' . ''; - - $b['texts'][] = ':bunny'; - $b['icons'][] = '' . ':bunny' . ''; - - $b['texts'][] = ':cow'; - $b['icons'][] = '' . ':cow' . ''; - - $b['texts'][] = ':crab'; - $b['icons'][] = '' . ':crab' . ''; - - $b['texts'][] = ':dolphin'; - $b['icons'][] = '' . ':dolphin' . ''; - - $b['texts'][] = ':dragonfly'; - $b['icons'][] = '' . ':dragonfly' . ''; - - $b['texts'][] = ':frog'; - $b['icons'][] = '' . ':frog' . ''; - - $b['texts'][] = ':hamster'; - $b['icons'][] = '' . ':hamster' . ''; - - $b['texts'][] = ':monkey'; - $b['icons'][] = '' . ':monkey' . ''; - - $b['texts'][] = ':horse'; - $b['icons'][] = '' . ':horse' . ''; - - $b['texts'][] = ':parrot'; - $b['icons'][] = '' . ':parrot' . ''; - - $b['texts'][] = ':tux'; - $b['icons'][] = '' . ':tux' . ''; - - $b['texts'][] = ':snail'; - $b['icons'][] = '' . ':snail' . ''; - - $b['texts'][] = ':sheep'; - $b['icons'][] = '' . ':sheep' . ''; - - $b['texts'][] = ':dog'; - $b['icons'][] = '' . ':dog' . ''; - - $b['texts'][] = ':elephant'; - $b['icons'][] = '' . ':elephant' . ''; - - $b['texts'][] = ':fish'; - $b['icons'][] = '' . ':fish' . ''; - - $b['texts'][] = ':giraffe'; - $b['icons'][] = '' . ':giraffe' . ''; - - $b['texts'][] = ':pig'; - $b['icons'][] = '' . ':pig' . ''; - - - -#Baby Smileys - - $b['texts'][] = ':baby'; - $b['icons'][] = '' . ':baby' . ''; - - $b['texts'][] = ':babycot'; - $b['icons'][] = '' . ':babycot' . ''; - - - $b['texts'][] = ':pregnant'; - $b['icons'][] = '' . ':pregnant' . ''; - - $b['texts'][] = ':stork'; - $b['icons'][] = '' . ':stork' . ''; - - -#Confused Smileys - $b['texts'][] = ':confused'; - $b['icons'][] = '' . ':confused' . ''; - - $b['texts'][] = ':shrug'; - $b['icons'][] = '' . ':shrug' . ''; - - $b['texts'][] = ':stupid'; - $b['icons'][] = '' . ':stupid' . ''; - - $b['texts'][] = ':dazed'; - $b['icons'][] = '' . ':dazed' . ''; - - -#Cool Smileys - - $b['texts'][] = ':affro'; - $b['icons'][] = '' . ':affro' . ''; - -#Devil/Angel Smileys - - $b['texts'][] = ':angel'; - $b['icons'][] = '' . ':angel' . ''; - - $b['texts'][] = ':cherub'; - $b['icons'][] = '' . ':cherub' . ''; - - $b['texts'][] = ':devilangel'; - $b['icons'][] = '' . ':devilangel' . ''; - - $b['texts'][] = ':catdevil'; - $b['icons'][] = '' . ':catdevil' . ''; - - $b['texts'][] = ':devillish'; - $b['icons'][] = '' . ':devillish' . ''; - - $b['texts'][] = ':daseesaw'; - $b['icons'][] = '' . ':daseesaw' . ''; - - $b['texts'][] = ':turnevil'; - $b['icons'][] = '' . ':turnevil' . ''; - - $b['texts'][] = ':saint'; - $b['icons'][] = '' . ':saint' . ''; - - $b['texts'][] = ':graveside'; - $b['icons'][] = '' . ':graveside' . ''; - -#Unpleasent smileys. - - $b['texts'][] = ':toilet'; - $b['icons'][] = '' . ':toilet' . ''; - - $b['texts'][] = ':fartinbed'; - $b['icons'][] = '' . ':fartinbed' . ''; - - $b['texts'][] = ':fartblush'; - $b['icons'][] = '' . ':fartblush' . ''; - -#Drinks - - $b['texts'][] = ':tea'; - $b['icons'][] = '' . ':tea' . ''; - - $b['texts'][] = ':drool'; - $b['icons'][] = '' . ':drool' . ''; - -#Sad smileys - - $b['texts'][] = ':crying'; - $b['icons'][] = '' . ':crying' . ''; - - $b['texts'][] = ':prisoner'; - $b['icons'][] = '' . ':prisoner' . ''; - - $b['texts'][] = ':sigh'; - $b['icons'][] = '' . ':sigh' . ''; - -#Smoking - only one smiley in here, maybe it needs moving elsewhere? - - $b['texts'][] = ':smoking'; - $b['icons'][] = '' . ':smoking' . ''; - -#Sport smileys - - $b['texts'][] = ':basketball'; - $b['icons'][] = '' . ':basketball' . ''; - - $b['texts'][] = '~bowling'; - $b['icons'][] = '' . '~bowling' . ''; - - $b['texts'][] = ':cycling'; - $b['icons'][] = '' . ':cycling' . ''; - - $b['texts'][] = ':darts'; - $b['icons'][] = '' . ':darts' . ''; - - $b['texts'][] = ':fencing'; - $b['icons'][] = '' . ':fencing' . ''; - - $b['texts'][] = ':juggling'; - $b['icons'][] = '' . ':juggling' . ''; - - $b['texts'][] = ':skipping'; - $b['icons'][] = '' . ':skipping' . ''; - - $b['texts'][] = ':archery'; - $b['icons'][] = '' . ':archery' . ''; - - $b['texts'][] = ':surfing'; - $b['icons'][] = '' . ':surfing' . ''; - - $b['texts'][] = ':snooker'; - $b['icons'][] = '' . ':snooker' . ''; - - $b['texts'][] = ':horseriding'; - $b['icons'][] = '' . ':horseriding' . ''; - -#Love smileys - - $b['texts'][] = ':iloveyou'; - $b['icons'][] = '' . ':iloveyou' . ''; - - $b['texts'][] = ':inlove'; - $b['icons'][] = '' . ':inlove' . ''; - - $b['texts'][] = '~love'; - $b['icons'][] = '' . ':love' . ''; - - $b['texts'][] = ':lovebear'; - $b['icons'][] = '' . ':lovebear' . ''; - - $b['texts'][] = ':lovebed'; - $b['icons'][] = '' . ':lovebed' . ''; - - $b['texts'][] = ':loveheart'; - $b['icons'][] = '' . ':loveheart' . ''; - -#Tired/Sleep smileys - - $b['texts'][] = ':countsheep'; - $b['icons'][] = '' . ':countsheep' . ''; - - $b['texts'][] = ':hammock'; - $b['icons'][] = '' . ':hammock' . ''; - - $b['texts'][] = ':pillow'; - $b['icons'][] = '' . ':pillow' . ''; - - $b['texts'][] = ':yawn'; - $b['icons'][] = '' . ':yawn' . ''; - -#Fight/Flame/Violent smileys - - $b['texts'][] = ':2guns'; - $b['icons'][] = '' . ':2guns' . ''; - - $b['texts'][] = ':alienfight'; - $b['icons'][] = '' . ':alienfight' . ''; - - $b['texts'][] = ':army'; - $b['icons'][] = '' . ':army' . ''; - - $b['texts'][] = ':arrowhead'; - $b['icons'][] = '' . ':arrowhead' . ''; - - $b['texts'][] = ':bfg'; - $b['icons'][] = '' . ':bfg' . ''; - - $b['texts'][] = ':bowman'; - $b['icons'][] = '' . ':bowman' . ''; - - $b['texts'][] = ':chainsaw'; - $b['icons'][] = '' . ':chainsaw' . ''; - - $b['texts'][] = ':crossbow'; - $b['icons'][] = '' . ':crossbow' . ''; - - $b['texts'][] = ':crusader'; - $b['icons'][] = '' . ':crusader' . ''; - - $b['texts'][] = ':dead'; - $b['icons'][] = '' . ':dead' . ''; - - $b['texts'][] = ':hammersplat'; - $b['icons'][] = '' . ':hammersplat' . ''; - - $b['texts'][] = ':lasergun'; - $b['icons'][] = '' . ':lasergun' . ''; - - $b['texts'][] = ':machinegun'; - $b['icons'][] = '' . ':machinegun' . ''; - - $b['texts'][] = ':acid'; - $b['icons'][] = '' . ':acid' . ''; - - $b['texts'][] = ':throwrocks'; - $b['icons'][] = '' . ':throwrocks' . ''; - -#Fantasy smileys - monsters and dragons fantasy. - - $b['texts'][] = ':alienmonster'; - $b['icons'][] = '' . ':alienmonster' . ''; - - $b['texts'][] = ':barbarian'; - $b['icons'][] = '' . ':barbarian' . ''; - - $b['texts'][] = ':dinosaur'; - $b['icons'][] = '' . ':dinosaur' . ''; - - $b['texts'][] = ':dragon'; - $b['icons'][] = '' . ':dragon' . ''; - - $b['texts'][] = ':draco'; - $b['icons'][] = '' . ':draco' . ''; - - $b['texts'][] = ':ghost'; - $b['icons'][] = '' . ':ghost' . ''; - - $b['texts'][] = ':mummy'; - $b['icons'][] = '' . ':mummy' . ''; - - $b['texts'][] = ':thedoctor'; - $b['icons'][] = '' . ':thedoctor' . ''; - -#Food smileys - - $b['texts'][] = ':apple'; - $b['icons'][] = '' . ':apple' . ''; - - $b['texts'][] = ':broccoli'; - $b['icons'][] = '' . ':brocolli' . ''; - - $b['texts'][] = ':cake'; - $b['icons'][] = '' . ':cake' . ''; - - $b['texts'][] = ':carrot'; - $b['icons'][] = '' . ':carrot' . ''; - - $b['texts'][] = ':popcorn'; - $b['icons'][] = '' . ':popcorn' . ''; - - $b['texts'][] = ':tomato'; - $b['icons'][] = '' . ':tomato' . ''; - - $b['texts'][] = ':banana'; - $b['icons'][] = '' . ':banana' . ''; - - $b['texts'][] = ':cooking'; - $b['icons'][] = '' . ':cooking' . ''; - - $b['texts'][] = ':fryegg'; - $b['icons'][] = '' . ':fryegg' . ''; - - $b['texts'][] = ':birthdaycake'; - $b['icons'][] = '' . ':birthdaycake' . ''; - -#Happy smileys - - $b['texts'][] = ':tearsofjoy'; - $b['icons'][] = '' . ':tearsofjoy' . ''; - -#Repsect smileys - - $b['texts'][] = ':bow'; - $b['icons'][] = '' . ':bow' . ''; - - $b['texts'][] = ':bravo'; - $b['icons'][] = '' . ':bravo' . ''; - - $b['texts'][] = ':hailking'; - $b['icons'][] = '' . ':hailking' . ''; - - $b['texts'][] = ':number1'; - $b['icons'][] = '' . ':number1' . ''; - - $b['texts'][] = ':towel'; - $b['icons'][] = '' . ':towel' . ''; - -#Laugh smileys - - $b['texts'][] = ':hahaha'; - $b['icons'][] = '' . ':hahaha' . ''; - - $b['texts'][] = ':loltv'; - $b['icons'][] = '' . ':loltv' . ''; - - $b['texts'][] = ':rofl'; - $b['icons'][] = '' . ':rofl' . ''; - - $b['texts'][] = ':snicker'; - $b['icons'][] = '' . ':snicker' . ''; - -#Music smileys - - $b['texts'][] = ':drums'; - $b['icons'][] = '' . ':drums' . ''; - - - $b['texts'][] = ':guitar'; - $b['icons'][] = '' . ':guitar' . ''; - - $b['texts'][] = ':trumpet'; - $b['icons'][] = '' . ':trumpet' . ''; - -#Smileys that used to be in core - - $b['texts'][] = ':headbang'; - $b['icons'][] = '' . ':headbang' . ''; - - $b['texts'][] = ':beard'; - $b['icons'][] = '' . ':beard' . ''; - - $b['texts'][] = ':whitebeard'; - $b['icons'][] = '' . ':whitebeard' . ''; - - $b['texts'][] = ':shaka'; - $b['icons'][] = '' . ':shaka' . ''; - - $b['texts'][] = ':\\.../'; - $b['icons'][] = '' . ':\\.../' . ''; - - $b['texts'][] = ':\\ooo/'; - $b['icons'][] = '' . ':\\ooo/' . ''; - - $b['texts'][] = ':headdesk'; - $b['icons'][] = '' . ':headdesk' . ''; - -#These two are still in core, so oldcore isn't strictly right, but we don't want too many directories - - $b['texts'][] = ':-d'; - $b['icons'][] = '' . ':-d' . ''; - - $b['texts'][] = ':-o'; - $b['icons'][] = '' . ':-o' . ''; - -#Things - $b['texts'][] = ':cloud'; - $b['icons'][] = '' . ':cloud' . ''; - -# Regex killers - stick these at the bottom so they appear at the end of the English and -# at the start of $OtherLanguage. - - $b['texts'][] = ':cool'; - $b['icons'][] = '' . ':cool' . ''; - - $b['texts'][] = ':vomit'; - $b['icons'][] = '' . ':vomit' . ''; - - $b['texts'][] = ':golf'; - $b['icons'][] = '' . ':golf' . ''; - - $b['texts'][] = ':football'; - $b['icons'][] = '' . ':football' . ''; - - $b['texts'][] = ':tennis'; - $b['icons'][] = '' . ':tennis' . ''; - - $b['texts'][] = ':alpha'; - $b['icons'][] = '' . ':alpha' . ''; - - $b['texts'][] = ':marine'; - $b['icons'][] = '' . ':marine' . ''; - - $b['texts'][] = ':sword'; - $b['icons'][] = '' . ':sword' . ''; - - $b['texts'][] = ':tank'; - $b['icons'][] = '' . ':tank' . ''; - - $b['texts'][] = ':viking'; - $b['icons'][] = '' . ':viking' . ''; - - $b['texts'][] = ':gangs'; - $b['icons'][] = '' . ':gangs' . ''; - - - $b['texts'][] = ':dj'; - $b['icons'][] = '' . ':dj' . ''; - - - $b['texts'][] = ':elvis'; - $b['icons'][] = '' . ':elivs' . ''; - - $b['texts'][] = ':violin'; - $b['icons'][] = '' . ':violin' . ''; -} diff --git a/sources/extend/addon/matrix/smileybutton/icon.gif b/sources/extend/addon/matrix/smileybutton/icon.gif deleted file mode 100644 index 6ce09471..00000000 Binary files a/sources/extend/addon/matrix/smileybutton/icon.gif and /dev/null differ diff --git a/sources/extend/addon/matrix/smileybutton/smileybutton.css b/sources/extend/addon/matrix/smileybutton/smileybutton.css deleted file mode 100755 index e69de29b..00000000 diff --git a/sources/extend/addon/matrix/smileybutton/smileybutton.php b/sources/extend/addon/matrix/smileybutton/smileybutton.php deleted file mode 100755 index d707e5c9..00000000 --- a/sources/extend/addon/matrix/smileybutton/smileybutton.php +++ /dev/null @@ -1,286 +0,0 @@ -get_baseurl() . '/images/smiley-heart.gif" alt="<3" />', - '</3', - ':-)', - ';-)', - ':-(', - ':-P', - ':-X', - ':-D', - ':-O', - '\\o/', - 'O_o', - ':\'(', - ':-!', - ':-/', - ':-[', - '8-)', - ':beer', - ':coffee', - ':facepalm', - ':like', - ':dislike', - 'red' - ); - - /** - * - * Call hooks to get aditional smileies from other addons - * - */ - - $params = array('texts' => $texts, 'icons' => $icons, 'string' => ""); //changed - call_hooks('smilie', $params); - - /** - * - * Generate html for smileylist - * - */ - - $s = "\t\n"; - for($x = 0; $x < count($params['texts']); $x ++) { - $icon = $params['icons'][$x]; - $icon = str_replace('/>', 'onclick="smileybutton_addsmiley(\'' . $params['texts'][$x] . '\')"/>', $icon); - $icon = str_replace('class="smiley"', 'class="smiley_preview"', $icon); - $s .= ""; - if (($x+1) % (sqrt(count($params['texts']))+1) == 0) { - $s .= "\n\t"; - } - } - $s .= "\t
" . $icon . "
\n"; - - /** - * - * Add css to page - * - */ - - $a->page['htmlhead'] .= '' . "\r\n"; - - /** - * - * Add the button to the Inputbox - * - */ - if (! $nobutton and ! $deactivated) { - $b = "
\n"; - //$b .= "\tget_baseurl() . "/addon/smileybutton/icon.gif\" onclick=\"toggle_smileybutton()\" alt=\"smiley\">\n"; - $b .= "\t\n"; - $b .= "\t
\n"; - } - - - /** - * - * Write the smileies to an (hidden) div - * - */ - if ($deactivated){ - return; - } - else - { - if ($nobutton) { - $b .= "\t
\n"; - } else { - $b .= "\t
\n"; - } - } - $b .= $s . "\n"; - $b .= "
\n"; - - /** - * - * Function to show and hide the smiley-list in the hidden div - * - */ - - $b .= "\n"; -} - - - - - -/** - * - * Set the configuration - * - */ - -function smileybutton_settings_post($a,$post) { - if(! local_channel()) - return; - if($_POST['smileybutton-submit']) - set_pconfig(local_channel(),'smileybutton','nobutton',intval($_POST['smileybutton'])); - set_pconfig(local_channel(),'smileybutton','deactivated',intval($_POST['deactivated'])); - -} - - -/** - * - * Add configuration-dialog to form - * - */ - - -function smileybutton_settings(&$a,&$s) { - - if(! local_channel()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - //$a->page['htmlhead'] .= '' . "\r\n"; - - /* Get the current state of our config variable */ - - $nobutton = get_pconfig(local_channel(),'smileybutton','nobutton'); - $checked['nobutton'] = (($nobutton) ? 1 : false); - $deactivated = get_pconfig(local_channel(),'smileybutton','deactivated'); - $checked['deactivated'] = (($deactivated) ? 1 : false); - /* Add some HTML to the existing form */ - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('deactivated', t('Deactivate the feature'), $checked['deactivated'], '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('smileybutton', t('Hide the button and show the smilies directly.'), $checked['nobutton'], '', array(t('No'),t('Yes'))), - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('smileybutton', t('Smileybutton Settings'), '', t('Submit')), - '$content' => $sc - )); -} diff --git a/sources/extend/addon/matrix/startpage/lang/C/messages.po b/sources/extend/addon/matrix/startpage/lang/C/messages.po deleted file mode 100644 index 4c2b8a1d..00000000 --- a/sources/extend/addon/matrix/startpage/lang/C/messages.po +++ /dev/null @@ -1,34 +0,0 @@ -# ADDON startpage -# Copyright (C) -# This file is distributed under the same license as the Friendica startpage addon package. -# -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-27 05:01-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: startpage.php:83 -msgid "Startpage Settings" -msgstr "" - -#: startpage.php:85 -msgid "Home page to load after login - leave blank for profile wall" -msgstr "" - -#: startpage.php:88 -msgid "Examples: "network" or "notifications/system"" -msgstr "" - -#: startpage.php:92 -msgid "Submit" -msgstr "" diff --git a/sources/extend/addon/matrix/startpage/lang/ca/strings.php b/sources/extend/addon/matrix/startpage/lang/ca/strings.php deleted file mode 100644 index f7e2048e..00000000 --- a/sources/extend/addon/matrix/startpage/lang/ca/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = "Ajustos de la pàgina d'inici"; -$a->strings["Home page to load after login - leave blank for profile wall"] = "Pàgina personal a carregar després d'accedir - deixar buit pel perfil del mur"; -$a->strings["Examples: "network" or "notifications/system""] = "Exemples: \"xarxa\" o \"notificacions/sistema\""; -$a->strings["Submit"] = "Enviar"; diff --git a/sources/extend/addon/matrix/startpage/lang/cs/strings.php b/sources/extend/addon/matrix/startpage/lang/cs/strings.php deleted file mode 100644 index d48262c9..00000000 --- a/sources/extend/addon/matrix/startpage/lang/cs/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = "Nastavení úvodní stránky"; -$a->strings["Home page to load after login - leave blank for profile wall"] = "Domácí stránka k naÄtení po pÅ™ihlášení - pro profilovou zeÄ ponechejte prázdné"; -$a->strings["Examples: "network" or "notifications/system""] = "Příklady: \"síť\" nebo \"notifikace systému\""; -$a->strings["Submit"] = "Odeslat"; diff --git a/sources/extend/addon/matrix/startpage/lang/de/strings.php b/sources/extend/addon/matrix/startpage/lang/de/strings.php deleted file mode 100644 index 0a1ed34e..00000000 --- a/sources/extend/addon/matrix/startpage/lang/de/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = "Startseiten-Einstellungen"; -$a->strings["Home page to load after login - leave blank for profile wall"] = "Seite, die nach dem Anmelden geladen werden soll. Leer = Pinnwand"; -$a->strings["Examples: "network" or "notifications/system""] = "Beispiele: network, notifications/system"; -$a->strings["Submit"] = "Senden"; diff --git a/sources/extend/addon/matrix/startpage/lang/eo/strings.php b/sources/extend/addon/matrix/startpage/lang/eo/strings.php deleted file mode 100644 index 0152ac95..00000000 --- a/sources/extend/addon/matrix/startpage/lang/eo/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = "StartpaÄaj Agordoj"; -$a->strings["Home page to load after login - leave blank for profile wall"] = "HejmpaÄo Åargonta post la ensaluto - Lasu malplena por profilmuro."; -$a->strings["Examples: "network" or "notifications/system""] = "Ekzemple: "network" aÅ­ "notifications/system""; -$a->strings["Submit"] = "Sendi"; diff --git a/sources/extend/addon/matrix/startpage/lang/es/strings.php b/sources/extend/addon/matrix/startpage/lang/es/strings.php deleted file mode 100644 index d901e740..00000000 --- a/sources/extend/addon/matrix/startpage/lang/es/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = "Configuración de página inicial"; -$a->strings["Home page to load after login - leave blank for profile wall"] = "Página por defecto, dejálo en blanco para cargar tu perfil"; -$a->strings["Examples: "network" or "notifications/system""] = "Ejemplos: "red" o "notificaciones/sistema""; -$a->strings["Submit"] = "Envíar"; diff --git a/sources/extend/addon/matrix/startpage/lang/fr/strings.php b/sources/extend/addon/matrix/startpage/lang/fr/strings.php deleted file mode 100644 index c2ecf5ec..00000000 --- a/sources/extend/addon/matrix/startpage/lang/fr/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = "Paramètres de la page d'accueil"; -$a->strings["Home page to load after login - leave blank for profile wall"] = "Page d'accueil à charger après authentification - laisser ce champ vide pour charger votre mur"; -$a->strings["Examples: "network" or "notifications/system""] = "Exemples : "network" ou "notifications/system""; -$a->strings["Submit"] = "Envoyer"; diff --git a/sources/extend/addon/matrix/startpage/lang/is/strings.php b/sources/extend/addon/matrix/startpage/lang/is/strings.php deleted file mode 100644 index 134d5726..00000000 --- a/sources/extend/addon/matrix/startpage/lang/is/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = ""; -$a->strings["Home page to load after login - leave blank for profile wall"] = ""; -$a->strings["Examples: "network" or "notifications/system""] = ""; -$a->strings["Submit"] = "Senda inn"; diff --git a/sources/extend/addon/matrix/startpage/lang/it/strings.php b/sources/extend/addon/matrix/startpage/lang/it/strings.php deleted file mode 100644 index a80dc5ae..00000000 --- a/sources/extend/addon/matrix/startpage/lang/it/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = ""; -$a->strings["Home page to load after login - leave blank for profile wall"] = ""; -$a->strings["Examples: "network" or "notifications/system""] = ""; -$a->strings["Submit"] = "Invia"; diff --git a/sources/extend/addon/matrix/startpage/lang/nb-no/strings.php b/sources/extend/addon/matrix/startpage/lang/nb-no/strings.php deleted file mode 100644 index b58f8fe3..00000000 --- a/sources/extend/addon/matrix/startpage/lang/nb-no/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = ""; -$a->strings["Home page to load after login - leave blank for profile wall"] = ""; -$a->strings["Examples: "network" or "notifications/system""] = ""; -$a->strings["Submit"] = "Lagre"; diff --git a/sources/extend/addon/matrix/startpage/lang/pl/strings.php b/sources/extend/addon/matrix/startpage/lang/pl/strings.php deleted file mode 100644 index 487e2535..00000000 --- a/sources/extend/addon/matrix/startpage/lang/pl/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = "Ustawienia strony startowej"; -$a->strings["Home page to load after login - leave blank for profile wall"] = ""; -$a->strings["Examples: "network" or "notifications/system""] = ""; -$a->strings["Submit"] = "Potwierdź"; diff --git a/sources/extend/addon/matrix/startpage/lang/pt-br/strings.php b/sources/extend/addon/matrix/startpage/lang/pt-br/strings.php deleted file mode 100644 index 0c22e3b5..00000000 --- a/sources/extend/addon/matrix/startpage/lang/pt-br/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = "Configurações da página inicial"; -$a->strings["Home page to load after login - leave blank for profile wall"] = "Página a ser carregada após a autenticação - deixe em branco para o mural do perfil"; -$a->strings["Examples: "network" or "notifications/system""] = "Exemplos: "network" or "notifications/system""; -$a->strings["Submit"] = "Enviar"; diff --git a/sources/extend/addon/matrix/startpage/lang/ru/strings.php b/sources/extend/addon/matrix/startpage/lang/ru/strings.php deleted file mode 100644 index 361b40b3..00000000 --- a/sources/extend/addon/matrix/startpage/lang/ru/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = ""; -$a->strings["Home page to load after login - leave blank for profile wall"] = ""; -$a->strings["Examples: "network" or "notifications/system""] = ""; -$a->strings["Submit"] = "Подтвердить"; diff --git a/sources/extend/addon/matrix/startpage/lang/sv/strings.php b/sources/extend/addon/matrix/startpage/lang/sv/strings.php deleted file mode 100644 index 3ec569a7..00000000 --- a/sources/extend/addon/matrix/startpage/lang/sv/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Submit"] = "Spara"; diff --git a/sources/extend/addon/matrix/startpage/lang/zh-cn/strings.php b/sources/extend/addon/matrix/startpage/lang/zh-cn/strings.php deleted file mode 100644 index f8c02e4a..00000000 --- a/sources/extend/addon/matrix/startpage/lang/zh-cn/strings.php +++ /dev/null @@ -1,6 +0,0 @@ -strings["Startpage Settings"] = "开始页设置"; -$a->strings["Home page to load after login - leave blank for profile wall"] = "主页登录åŽè¡¨ç¤ºï¼ç•™ç©ºç™½ä¸ºç®€ä»‹å¢™"; -$a->strings["Examples: "network" or "notifications/system""] = "例如:"网络"或"通知ï¼ç³»ç»Ÿ""; -$a->strings["Submit"] = "æ交"; diff --git a/sources/extend/addon/matrix/startpage/startpage.css b/sources/extend/addon/matrix/startpage/startpage.css deleted file mode 100644 index e69de29b..00000000 diff --git a/sources/extend/addon/matrix/startpage/startpage.php b/sources/extend/addon/matrix/startpage/startpage.php deleted file mode 100644 index 65de99ba..00000000 --- a/sources/extend/addon/matrix/startpage/startpage.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - */ - - -function startpage_load() { -// register_hook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init'); - register_hook('feature_settings', 'addon/startpage/startpage.php', 'startpage_settings'); - register_hook('feature_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post'); -} - - -function startpage_unload() { - unregister_hook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init'); - unregister_hook('feature_settings', 'addon/startpage/startpage.php', 'startpage_settings'); - unregister_hook('feature_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post'); -} - - - -function startpage_home_init($a, $b) { - - return; - if(! local_channel()) - return; - - $channel = $a->get_channel(); - $page = $channel['channel_startpage']; - if(! $page) - $page = get_pconfig(local_channel(),'system','startpage'); - - if(strlen($page)) { - $slash = ((strpos($page,'/') === 0) ? true : false); -// If we goaway to a z_root for the channel page, all clones will be redirected to the primary hub, so... - if(stristr($page,'channel')) - goaway ('$page'); - - if(stristr($page,'://')) - goaway(z_root() . '/' . $page); - goaway($a->get_baseurl() . (($slash) ? '' : '/') . $page); - } - return; -} - -/** - * - * Callback from the settings post function. - * $post contains the $_POST array. - * We will make sure we've got a valid user account - * and if so set our configuration setting for this person. - * - */ - -function startpage_settings_post($a,$post) { - if(! local_channel()) - return; - $channel = $a->get_channel(); - - if($_POST['startpage-submit']) { - $page = strip_tags(trim($_POST['startpage'])); - $page = trim($page,'/'); - - if($page == 'channel') - $page = 'channel/' . $channel['channel_address']; - elseif($page == '') - $page = ''; - else - if(strpos($page,'http') !== 0) - $page = $page; - - $r = q("update channel set channel_startpage = '%s' where channel_id = %d", - dbesc($page), - intval(local_channel()) - ); - set_pconfig(local_channel(),'system','startpage',$page); - - } -} - - -/** - * - * Called from the Plugin Setting form. - * Add our own settings info to the page. - * - */ - - - -function startpage_settings(&$a,&$s) { - - if(! local_channel()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - //head_add_css('/addon/startpage/startpage.css'); - - /* Get the current state of our config variable */ - - $page = get_pconfig(local_channel(),'system','startpage'); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('startpage', t('Page to load after login'), $page, t('Examples: "network" or "channel" or "notifications/system" (leave blank for default apps page).')) - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('startpage', t('Startpage Settings'), '', t('Submit')), - '$content' => $sc - )); - - return; - -} diff --git a/sources/extend/addon/matrix/statistics_json/statistics_json.php b/sources/extend/addon/matrix/statistics_json/statistics_json.php deleted file mode 100644 index 7d5eb227..00000000 --- a/sources/extend/addon/matrix/statistics_json/statistics_json.php +++ /dev/null @@ -1,129 +0,0 @@ - - */ - -function statistics_json_load() { - register_hook('cron_daily', 'addon/statistics_json/statistics_json.php', 'statistics_json_cron'); -} - - -function statistics_json_unload() { - unregister_hook('cron_daily', 'addon/statistics_json/statistics_json.php', 'statistics_json_cron'); -} - -function statistics_json_module() {} - -function statistics_json_init() { - global $a; - - if(! get_config('statistics_json','total_users')) - statistics_json_cron($a,$b); - - $statistics = array( - "name" => get_config('system','sitename'), - "network" => PLATFORM_NAME, - "version" => RED_VERSION, - "registrations_open" => (get_config('system','register_policy') != 0), - "total_users" => get_config('statistics_json','total_users'), - "active_users_halfyear" => get_config('statistics_json','active_users_halfyear'), - "active_users_monthly" => get_config('statistics_json','active_users_monthly'), - "local_posts" => get_config('statistics_json','local_posts'), - "twitter" => (bool) get_config('statistics_json','twitter'), - "wordpress" => (bool) get_config('statistics_json','wordpress') - ); - - header("Content-Type: application/json"); - echo json_encode($statistics); - logger("statistics_init: printed ".print_r($statistics, true)); - killme(); -} - -function statistics_json_cron($a,$b) { - - logger('statistics_json_cron: cron_start'); - - - $r = q("select count(channel_id) as total_users from channel left join account on account_id = channel_account_id - where account_flags = 0 "); - if($r) - $total_users = $r[0]['total_users']; - - $r = q("select channel_id from channel left join account on account_id = channel_account_id - where account_flags = 0 and account_lastlog > %s - INTERVAL %s", - db_utcnow(), db_quoteinterval('6 MONTH') - ); - if($r) { - $s = ''; - foreach($r as $rr) { - if($s) - $s .= ','; - $s .= intval($rr['channel_id']); - } - $x = q("select uid from item where uid in ( $s ) and item_wall != 0 and created > %s - INTERVAL %s group by uid", - db_utcnow(), db_quoteinterval('6 MONTH') - ); - if($x) - $active_users_halfyear = count($x); - } - - $r = q("select channel_id from channel left join account on account_id = channel_account_id - where account_flags = 0 and account_lastlog > %s - INTERVAL %s", - db_utcnow(), db_quoteinterval('1 MONTH') - ); - if($r) { - $s = ''; - foreach($r as $rr) { - if($s) - $s .= ','; - $s .= intval($rr['channel_id']); - } - $x = q("select uid from item where uid in ( $s ) and item_wall != 0 and created > %s - INTERVAL %s group by uid", - db_utcnow(), db_quoteinterval('1 MONTH') - ); - if($x) - $active_users_monthly = count($x); - } - - - set_config('statistics_json','total_users', $total_users); - - set_config('statistics_json','active_users_halfyear', $active_users_halfyear); - set_config('statistics_json','active_users_monthly', $active_users_monthly); - - - $posts = q("SELECT COUNT(*) AS local_posts FROM `item` WHERE item_wall != 0 "); - if (!is_array($posts)) - $local_posts = -1; - else - $local_posts = $posts[0]["local_posts"]; - - set_config('statistics_json','local_posts', $local_posts); - - - $wordpress = false; - $r = q("select * from addon where hidden = 0 and name = 'wppost'"); - if($r) - $wordpress = true; - - set_config('statistics_json','wordpress', intval($wordpress)); - - $twitter = false; - $r = q("select * from addon where hidden = 0 and name = 'twitter'"); - if($r) - $twitter = true; - - set_config('statistics_json','twitter', intval($twitter)); - - // Now trying to register - $url = "http://the-federation.info/register/" . $a->get_hostname(); - - $ret = z_fetch_url($url); - logger('statistics_json_cron: registering answer: '. print_r($ret,true), LOGGER_DEBUG); - logger('statistics_json_cron: cron_end'); - -} diff --git a/sources/extend/addon/matrix/statusnet/README b/sources/extend/addon/matrix/statusnet/README deleted file mode 100755 index 98239fa3..00000000 --- a/sources/extend/addon/matrix/statusnet/README +++ /dev/null @@ -1,105 +0,0 @@ -____ GNU social Plugin ____ -by Tobias Diekershoff - http://diekershoff.homeunix.net/friendika/profile/tobias - tobias.diekershoff(at)gmx.net - -Mike, Thomas, Tony and Jeroen adapted this addon to the Hubzilla. - -Important Note: GNU Social instances with self signed certificates or CA-certificates are currently not supported. You're welcome to fix this. - -With this addon to the Hubzilla you can give your user the possibility to post -their public messages to any GNU social instance (like loadaverage.org for example). -The messages will be strapped their rich context and shortened to to the character -limit of the GNU social instance in question if necessary. If shortening of the -message was performed a link will be added to the notice pointing to the -original message on your hub. - -There is a similar plugin to forward public messages to Twitter: Twitter Plugin. - -Online version of this document: http://ur1.ca/35mpb - -___ Requirements ___ - -Due to the distributed nature of the GNU social network, each user who wishes to -forward public messages to a GNU social account has to get the OAuth credentials -for themselves, which makes this addon a little bit more user unfriendly than -the Twitter Plugin is. Nothing too geeky though! - -The inclusion of a shorturl for the original posting in cases when the message -was longer than the maximal allowed notice length requires it, that you have -PHP5+ and curl on your hub. - -___ Where to find ___ - -In the Hubzilla red-addons git repository /addon/statusnet/, this directory contains all -required PHP files (including the Twitter OAuth library [1] by Abraham Williams, -MIT licensed and the Slinky library [2] by Beau Lebens, BSD license), a CSS file -for styling of the user configuration and an image to Sign in with GNU social. - -[1] https://github.com/abraham/twitteroauth -[2] http://dentedreality.com.au/projects/slinky - -___ Configuration ___ - -__ Global Configuration __ - -If you have configured an admin account, you can configure this plugin from the admin panel. First activate it from the plugin section of the panel. - -Afterwards you will have a separate configuration page for the plugin, where -you can provide a set of globally available OAuth credentials for different -GNU social pages which will be available for all users of your hub. - -__ Alternative Configuration __ - -* Go to the root of your Hubzilla installation and type after the prompt: - - util/config system addon - -* Press enter. You get a list of active addons. To activate this addon you have to add GNU social (statusnet) to this list and press enter: - - util/config system addon "plugin 1, plugin 2, etc, statusnet" - - -If you want to provide preconfigured GNU social instances for your user add the -credentials for them by adding this to .htconfig.php: - -$a->config['statusnet']['sites'] = array ( - array ('sitename' => 'identi.ca', 'apiurl' => 'https://identi.ca/api/', - 'consumersecret' => 'OAuth Consumer Secret here', 'consumerkey' => 'OAuth - Consumer Key here'), - array ('sitename' => 'Some other Server', 'apiurl' => - 'http://status.example.com/api/', 'consumersecret' => 'OAuth - Consumer Secret here', 'consumerkey' => 'OAuth Consumer Key here') -); - -Regardless of providing global OAuth credentials for your users or not, they -can always add their own OAuth-Key and -Secret thus enable the relay for any -GNU social instance they may have an account at. - -__ User Configuration __ - -When the addon is activated the user has to aquire three things in order to -connect to the GNU social account of choice. - * the base URL for the GNU social API, for Load Average this is - https://loadaverage.org/api/ - * OAuth Consumer key & secret - -To get the OAuth Consumer key pair the user has to (a) ask their Hubzilla admin -if a pair already exists or (b) has to register the Hubzilla hub as a -client application on the GNU social server. This can be done from the account -settings under "Connect -> Connections -> Register an OAuth client application --> Register a new application". - -During the registration of the OAuth client remember the following: - * there is no callback url - * register a desktop client - * with read & write access - * the Source URL should be the URL of your Hubzilla hub - -After the required credentials for the application are stored in the -configuration you have to actually connect your Hubzilla channel with -GNU social. To do so follow the Sign in with GNU social button, allow the access -and copy the security code into the plugin configuration. Hubzilla will then -try to acquire the final OAuth credentials from the API, if successful the -plugin settings will allow you to select to post your public messages to your -GNU social account. diff --git a/sources/extend/addon/matrix/statusnet/gnusocial.png b/sources/extend/addon/matrix/statusnet/gnusocial.png deleted file mode 100644 index 38436eff..00000000 Binary files a/sources/extend/addon/matrix/statusnet/gnusocial.png and /dev/null differ diff --git a/sources/extend/addon/matrix/statusnet/lang/C/messages.po b/sources/extend/addon/matrix/statusnet/lang/C/messages.po deleted file mode 100644 index b5731008..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/C/messages.po +++ /dev/null @@ -1,177 +0,0 @@ -# ADDON statusnet -# Copyright (C) -# This file is distributed under the same license as the Friendica statusnet addon package. -# -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-27 05:01-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: statusnet.php:138 -msgid "Post to StatusNet" -msgstr "" - -#: statusnet.php:181 -msgid "" -"Please contact your site administrator.
The provided API URL is not " -"valid." -msgstr "" - -#: statusnet.php:210 -msgid "We could not contact the StatusNet API with the Path you entered." -msgstr "" - -#: statusnet.php:240 -msgid "StatusNet settings updated." -msgstr "" - -#: statusnet.php:271 -msgid "StatusNet Posting Settings" -msgstr "" - -#: statusnet.php:285 -msgid "Globally Available StatusNet OAuthKeys" -msgstr "" - -#: statusnet.php:286 -msgid "" -"There are preconfigured OAuth key pairs for some StatusNet servers " -"available. If you are useing one of them, please use these credentials. If " -"not feel free to connect to any other StatusNet instance (see below)." -msgstr "" - -#: statusnet.php:292 statusnet.php:309 statusnet.php:335 statusnet.php:342 -#: statusnet.php:379 statusnet.php:761 -msgid "Submit" -msgstr "" - -#: statusnet.php:294 -msgid "Provide your own OAuth Credentials" -msgstr "" - -#: statusnet.php:295 -msgid "" -"No consumer key pair for StatusNet found. Register your Friendica Account as " -"an desktop client on your StatusNet account, copy the consumer key pair here " -"and enter the API base root.
Before you register your own OAuth key " -"pair ask the administrator if there is already a key pair for this Friendica " -"installation at your favorited StatusNet installation." -msgstr "" - -#: statusnet.php:297 -msgid "OAuth Consumer Key" -msgstr "" - -#: statusnet.php:300 -msgid "OAuth Consumer Secret" -msgstr "" - -#: statusnet.php:303 -msgid "Base API Path (remember the trailing /)" -msgstr "" - -#: statusnet.php:306 -msgid "StatusNet application name" -msgstr "" - -#: statusnet.php:327 -msgid "" -"To connect to your StatusNet account click the button below to get a " -"security code from StatusNet which you have to copy into the input box below " -"and submit the form. Only your public posts will be posted " -"to StatusNet." -msgstr "" - -#: statusnet.php:328 -msgid "Log in with StatusNet" -msgstr "" - -#: statusnet.php:330 -msgid "Copy the security code from StatusNet here" -msgstr "" - -#: statusnet.php:336 -msgid "Cancel Connection Process" -msgstr "" - -#: statusnet.php:338 -msgid "Current StatusNet API is" -msgstr "" - -#: statusnet.php:339 -msgid "Cancel StatusNet Connection" -msgstr "" - -#: statusnet.php:350 -msgid "Currently connected to: " -msgstr "" - -#: statusnet.php:351 -msgid "" -"If enabled all your public postings can be posted to the " -"associated StatusNet account. You can choose to do so by default (here) or " -"for every posting separately in the posting options when writing the entry." -msgstr "" - -#: statusnet.php:353 -msgid "" -"Note: Due your privacy settings (Hide your profile " -"details from unknown viewers?) the link potentially included in public " -"postings relayed to StatusNet will lead the visitor to a blank page " -"informing the visitor that the access to your profile has been restricted." -msgstr "" - -#: statusnet.php:356 -msgid "Allow posting to StatusNet" -msgstr "" - -#: statusnet.php:359 -msgid "Send public postings to StatusNet by default" -msgstr "" - -#: statusnet.php:363 -msgid "" -"Mirror all posts from statusnet that are no replies or repeated messages" -msgstr "" - -#: statusnet.php:367 -msgid "Shortening method that optimizes the post" -msgstr "" - -#: statusnet.php:371 -msgid "Send linked #-tags and @-names to StatusNet" -msgstr "" - -#: statusnet.php:376 -msgid "Clear OAuth configuration" -msgstr "" - -#: statusnet.php:752 -msgid "Site name" -msgstr "" - -#: statusnet.php:753 -msgid "API URL" -msgstr "" - -#: statusnet.php:754 -msgid "Consumer Secret" -msgstr "" - -#: statusnet.php:755 -msgid "Consumer Key" -msgstr "" - -#: statusnet.php:756 -msgid "Application name" -msgstr "" diff --git a/sources/extend/addon/matrix/statusnet/lang/ca/strings.php b/sources/extend/addon/matrix/statusnet/lang/ca/strings.php deleted file mode 100644 index 4bb899e0..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/ca/strings.php +++ /dev/null @@ -1,34 +0,0 @@ -strings["Post to StatusNet"] = "Publica-ho a StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Si us plau, poseu-vos en contacte amb l'administrador del lloc.
L'adreça URL de l'API proporcionada no és vàlida."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "No hem pogut posar-nos en contacte amb l'API StatusNet amb la ruta que has introduït."; -$a->strings["StatusNet settings updated."] = "La configuració StatusNet actualitzada."; -$a->strings["StatusNet Posting Settings"] = "Configuració d'Enviaments per a StatusNet"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "OAuthKeys de StatusNet Globalment Disponible"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Hi ha preconfigurats parells clau OAuth per a alguns servidors StatusNet disponibles. Si està emprant un d'ells, utilitzi aquestes credencials. Si no és així no dubteu a connectar-se a qualsevol altra instància StatusNet (veure a baix)."; -$a->strings["Submit"] = "Enviar"; -$a->strings["Provide your own OAuth Credentials"] = "Proporcioneu les vostres credencials de OAuth"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "no s'ha trobat cap parell \"consumer key\" per StatusNet. Registra el teu compte Friendica com un client d'escriptori en el seu compte StatusNet, copieu el parell de \"consumer key\" aquí i entri a l'arrel de la base de l'API.
Abans de registrar el seu parell de claus OAuth demani a l'administrador si ja hi ha un parell de claus per a aquesta instal·lació de Friendica en la instal·lació del teu favorit StatusNet."; -$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key"; -$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret"; -$a->strings["Base API Path (remember the trailing /)"] = "Base API Path (recorda deixar / al final)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Per connectar al seu compte StatusNet, feu clic al botó de sota per obtenir un codi de seguretat StatusNet, que has de copiar a la casella de sota, i enviar el formulari. Només els missatges públics es publicaran en StatusNet."; -$a->strings["Log in with StatusNet"] = "Accedeixi com en StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Copieu el codi de seguretat StatusNet aquí"; -$a->strings["Cancel Connection Process"] = "Cancel·lar el procés de connexió"; -$a->strings["Current StatusNet API is"] = "L'Actual StatusNet API és"; -$a->strings["Cancel StatusNet Connection"] = "Cancel·lar la connexió amb StatusNet"; -$a->strings["Currently connected to: "] = "Actualment connectat a: "; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Si està activat, tots els seus anuncis públics poden ser publicats en el compte StatusNet associat. Vostè pot optar per fer-ho per defecte (en aquest cas) o per cada missatge per separat en les opcions de comptabilització en escriure l'entrada."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Nota: A causa de les seves opcions de privacitat (Amaga els detalls del teu perfil dels espectadors desconeguts? ) el vincle potencialment inclòs en anuncis públics transmesos a StatusNet conduirà el visitant a una pàgina en blanc en la que informarà al visitants que l'accés al seu perfil s'ha restringit."; -$a->strings["Allow posting to StatusNet"] = "Permetre enviaments a StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "Enviar missatges públics a StatusNet per defecte"; -$a->strings["Mirror all posts from statusnet that are no replies or repeated messages"] = ""; -$a->strings["Shortening method that optimizes the post"] = ""; -$a->strings["Send linked #-tags and @-names to StatusNet"] = "Enviar enllaços #-etiquetes i @-noms a StatusNet"; -$a->strings["Clear OAuth configuration"] = "Esborrar configuració de OAuth"; -$a->strings["Site name"] = "Nom del lloc"; -$a->strings["API URL"] = "API URL"; -$a->strings["Consumer Secret"] = "Consumer Secret"; -$a->strings["Consumer Key"] = "Consumer Key"; diff --git a/sources/extend/addon/matrix/statusnet/lang/cs/strings.php b/sources/extend/addon/matrix/statusnet/lang/cs/strings.php deleted file mode 100644 index 74e31eeb..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/cs/strings.php +++ /dev/null @@ -1,33 +0,0 @@ -strings["Post to StatusNet"] = "Poslat příspěvek na StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Obraťte se na administratora webu.
Poskytnutý odkaz na API není platný."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "S cestou, kterou jste zadali, se nebylo možné spojit s API StatusNetu."; -$a->strings["StatusNet settings updated."] = "Nastavení StatusNetu aktualizováno."; -$a->strings["StatusNet Posting Settings"] = "Nastavení zasílání příspÄ›vků na StatusNet "; -$a->strings["Globally Available StatusNet OAuthKeys"] = "GlobálnÄ› dostupné StatusNet OAuth klíÄe"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Jsou dostupné pÅ™ednastavené OAuth páry klíÄů pro nÄ›které servery StatusNetu. Pokud používáte nÄ›který z nich, použijte toto pÅ™ihlášení. Pokud ne, neváhejte se pÅ™ipojit k jiné instanci StatusNet (viz níže)."; -$a->strings["Submit"] = "Odeslat"; -$a->strings["Provide your own OAuth Credentials"] = "UveÄte své vlastní OAuth pÅ™ihlaÅ¡ovací údaje"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Nenalezen žádný spotÅ™ebitelský páru klíÄů pro StatusNet. Zaregistrujte si svůj úÄet Friendica jako desktopový klient ve VaÅ¡em úÄtu StatusNet, zkopírujte si sem spotÅ™ebitelský páru klíÄů a vložte API base root.
PÅ™edtím, než si zaregistrujete Váš vlastní pár klíÄů OAuth, zjistÄ›te si od Friendica administrátora, zda-li již existuje pár klíÄů pro tuto instalaci Friendica pro VaÅ¡i oblíbenou StatusNet instalaci."; -$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key"; -$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret"; -$a->strings["Base API Path (remember the trailing /)"] = "Cesta k Base API (nezapomeňte na koncový /)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Chcete-li pÅ™ipojit k vaÅ¡emu úÄtu StatusNet kliknÄ›te na tlaÄítko níže, abyste dostati bezpeÄnostní kód ze StatusNetu, který musíte zkopírovat do vstupního pole níže a odelat formulář. Pouze VaÅ¡e veÅ™ejné příspÄ›vky budou zveÅ™ejnÄ›ny na StatusNetu."; -$a->strings["Log in with StatusNet"] = "PÅ™ihlásit se s StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Zkopírujte sem bezpeÄnostní kód ze StatusNet"; -$a->strings["Cancel Connection Process"] = "ZruÅ¡it pÅ™ipojování"; -$a->strings["Current StatusNet API is"] = "Aktuální StatusNet API je"; -$a->strings["Cancel StatusNet Connection"] = "ZruÅ¡it StatusNet pÅ™ipojení"; -$a->strings["Currently connected to: "] = "V souÄasné dobÄ› pÅ™ipojen k:"; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Je-li povoleno, vÅ¡echny VaÅ¡e veÅ™ejné příspÄ›vky mohou být zaslány na související StatusNet úÄet. Můžete si vybrat, zda-li toto bude výchozí nastavení (zde), nebo budete mít možnost si vybrat požadované chování pÅ™i psaní každého příspÄ›vku."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "UpozornÄ›ní: Z důvodů VaÅ¡eho nastavení ochrany soukromí ( Skrýt VaÅ¡e profilové detaily pÅ™ed neznámými Ätenáři?) -odkaz potenciálnÄ› zahrnutý ve VaÅ¡ich veÅ™ejných příspÄ›vcích poslaných do sítÄ› StatusNet pÅ™esmÄ›ruje návÅ¡tÄ›vníky na prázdnou stránku informující návÅ¡tÄ›vníky, že přístup k vaÅ¡emu profilu je omezen."; -$a->strings["Allow posting to StatusNet"] = "Povolit zasílání příspÄ›vků na StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "StandardnÄ› poslílat veÅ™ejné příspÄ›vky na StatusNet"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = "Poslat propojené #-tagy a @-jména na StatusNet"; -$a->strings["Clear OAuth configuration"] = "Vymazat konfiguraci OAuth"; -$a->strings["Site name"] = "Název webu"; -$a->strings["API URL"] = "API URL"; -$a->strings["Consumer Secret"] = "Consumer Secret"; -$a->strings["Consumer Key"] = "Consumer Key"; diff --git a/sources/extend/addon/matrix/statusnet/lang/de/strings.php b/sources/extend/addon/matrix/statusnet/lang/de/strings.php deleted file mode 100644 index 5b0c707f..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/de/strings.php +++ /dev/null @@ -1,34 +0,0 @@ -strings["Post to StatusNet"] = "Bei StatusNet veröffentlichen"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Bitte kontaktiere den Administrator des Servers.
Die angegebene API-URL ist nicht gültig."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden."; -$a->strings["StatusNet settings updated."] = "StatusNet Einstellungen aktualisiert."; -$a->strings["StatusNet Posting Settings"] = "StatusNet-Beitragseinstellungen"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "Verfügbare OAuth Schlüssel für StatusNet"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Für einige StatusNet Server sind voreingestellte OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende bitte diese Schlüssel. Falls nicht, stelle stattdessen eine Verbindung zu irgend einem anderen StatusNet Server her (siehe unten)."; -$a->strings["Submit"] = "Senden"; -$a->strings["Provide your own OAuth Credentials"] = "Eigene OAuth Schlüssel eintragen"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.
Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert."; -$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key"; -$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret"; -$a->strings["Base API Path (remember the trailing /)"] = "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Um dein Konto mit einem StatusNet-Konto zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine öffentlichen Nachrichten an StatusNet gesendet."; -$a->strings["Log in with StatusNet"] = "Bei StatusNet anmelden"; -$a->strings["Copy the security code from StatusNet here"] = "Kopiere den Sicherheitscode von StatusNet hier hin"; -$a->strings["Cancel Connection Process"] = "Verbindungsprozess abbrechen"; -$a->strings["Current StatusNet API is"] = "Derzeitige StatusNet-API-URL lautet"; -$a->strings["Cancel StatusNet Connection"] = "Verbindung zum StatusNet Server abbrechen"; -$a->strings["Currently connected to: "] = "Momentan verbunden mit: "; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert, können all deine öffentlichen Einträge auf dem verbundenen StatusNet-Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Hinweis: Aufgrund deiner Privatsphären-Einstellungen (Profil-Details vor unbekannten Betrachtern verbergen?) wird der Link, der eventuell an deinen StatusNet-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde."; -$a->strings["Allow posting to StatusNet"] = "Veröffentlichung bei StatusNet erlauben"; -$a->strings["Send public postings to StatusNet by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet"; -$a->strings["Mirror all posts from statusnet that are no replies or repeated messages"] = "Spiegle alle Beiträge von StatusNet die keine Antworten oder wiederholten Nachrichten sind"; -$a->strings["Shortening method that optimizes the post"] = "Kürzungsverfahren, das den Beitrag optimiert"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = "Sende verlinkte #-Tags und @-Namen nach StatusNet"; -$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen"; -$a->strings["Site name"] = "Seitenname"; -$a->strings["API URL"] = "API-URL"; -$a->strings["Consumer Secret"] = "Consumer Secret"; -$a->strings["Consumer Key"] = "Consumer Key"; diff --git a/sources/extend/addon/matrix/statusnet/lang/eo/strings.php b/sources/extend/addon/matrix/statusnet/lang/eo/strings.php deleted file mode 100644 index b0bbf349..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/eo/strings.php +++ /dev/null @@ -1,32 +0,0 @@ -strings["Post to StatusNet"] = "AfiÅi ĉe StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Bonvolu kontaki vian retejan administranton.
La API URL adreso ne validas."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Ni ne povis trovi la StatusNet API kun la vojo kiun vi entajpis."; -$a->strings["StatusNet settings updated."] = "StatusNet agordoj Äisdatigita."; -$a->strings["StatusNet Posting Settings"] = "Agordoj por StausNet afiÅoj"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "Äœeneralaj disponeblaj StatusNet OAuth Ålosiloj"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Disponeblas antaÅ­agorditaj Ålosilparoj por kelkaj StatusNet serviloj. Se via uzas iun de iu, bonvolu uzi unun de tiuj legitimaĵojn. Se ne, bonvolu konekti al iu alia StatusNet servilo (vidu malsupre)."; -$a->strings["Submit"] = "Sendi"; -$a->strings["Provide your own OAuth Credentials"] = "Provizi viajn proprajn OAuth legitimaĵojn"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Ne trovis klientajn Ålosilojn por StatusNet. Registru vian Friendica konton kiel klientkomputilo/desktop client en via StausNet konto. Kopiu la klientajn Ålosilojn ĉi tien kaj entajpu la baza API radiko.
AntaÅ­ vi registros viajn proprajn OAuth Ålosilojn, demandu al la administranto ĉu jam ekzistas Ålosiloj por ĉi-tiu Friendia retejo je via StatusNet retejo."; -$a->strings["OAuth Consumer Key"] = "OAuth Åœlosilo de Kliento"; -$a->strings["OAuth Consumer Secret"] = "OAuth Sekreto de Kliento"; -$a->strings["Base API Path (remember the trailing /)"] = "Baza vojo al la API (ne forgesu la finan /)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Por konekti al vian konton ĉe StatusNet, klaku la malsupran butonon por atingi sekurecan kodon de StatusNet, kiun vi devas alglui en la malsupra kampo kaj sendi la formon. Nur viaj publikaj afiÅoj estos afiÅota al StatusNet."; -$a->strings["Log in with StatusNet"] = "Ensaluti kun StatusNet."; -$a->strings["Copy the security code from StatusNet here"] = "Alglui la kodon de StatusNet ĉi tie:"; -$a->strings["Cancel Connection Process"] = "Nuligi Konektadon"; -$a->strings["Current StatusNet API is"] = "La nuna StatusNet API estas"; -$a->strings["Cancel StatusNet Connection"] = "Nuligi Konekton al StatusNet"; -$a->strings["Currently connected to: "] = "Konektita al:"; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Kiam Åaltita, ĉiuj publikaj afiÅoj de vi ankaÅ­ eblas esti afiÅota al la asociigita StatusNet konto. Vi povas elekti Äin defaÅ­lte (ĉi tie) au unuope por ĉiuj afiÅoj kiam vi skribos ilin."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Averto: LaÅ­ viaj privatecaj agordoj (KaÅi viajn profilajn detalojn al nekonataj spektantoj?), la ligilo en publikaj afiÅoj plusendata al StatusNet gvidas vizitontojn al malplena paÄo sciigante ilin ke atingo al via profilo estas lmitigita."; -$a->strings["Allow posting to StatusNet"] = "Permesi afiÅojn al StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "DefaÅ­lte sendi publikajn afiÅojn al StatusNet"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = "Sendi ligitajn #-etikedojn kaj @-nomon al StatusNet"; -$a->strings["Clear OAuth configuration"] = "ForviÅi OAuth agordojn"; -$a->strings["Site name"] = "Nomo de retejo"; -$a->strings["API URL"] = "API URL adreso"; -$a->strings["Consumer Secret"] = "Sekreto de kliento"; -$a->strings["Consumer Key"] = "Åœlosilo de kliento"; diff --git a/sources/extend/addon/matrix/statusnet/lang/es/strings.php b/sources/extend/addon/matrix/statusnet/lang/es/strings.php deleted file mode 100644 index c60fb374..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/es/strings.php +++ /dev/null @@ -1,32 +0,0 @@ -strings["Post to StatusNet"] = "Publicar en StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Por favor, contacta con el administrador de tu web.
La dirección API suministrada no es válida."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "No podemos contantar con StatusNet en la ruta que has especificado."; -$a->strings["StatusNet settings updated."] = "Actualición de la configuración de StatusNet."; -$a->strings["StatusNet Posting Settings"] = "Configuración de envío a StatusNet"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "StatusNet OAuthKeys disponibles para todos"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Existen pares de valores OAuthKey preconfigurados para algunos servidores. Si usas uno de ellos, por favor usa estas credenciales. De los contrario no dudes en conectar con cualquiera otra instancia de StatusNet (ver a continuación)."; -$a->strings["Submit"] = "Envíar"; -$a->strings["Provide your own OAuth Credentials"] = "Proporciona tus propias credenciales OAuth"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "No se ha encontrado ningún par de claves consumer para StatusNet. Registra tu cuenta de Friendica como un cliente de escritorio en tu cuenta de StatusNet, copia el par de claves consumer aquí e introduce la dirección de la API.
Antes de registrar tu propio par de claves OAuth pregunta a tu administrador si ya existe un par de claves para esa instalación de Friendica en tu instalación StatusNet favorita."; -$a->strings["OAuth Consumer Key"] = "Clave OAuth del usuario"; -$a->strings["OAuth Consumer Secret"] = "Secreto OAuth del usuario"; -$a->strings["Base API Path (remember the trailing /)"] = "Dirección de la API (recordar el / al final)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Para conectarte a tu cuenta de StatusNet haz clic en el botón abajo para obtener un PIN de StatusNet, que tienes que copiar en el cuadro de entrada y enviar el formulario. Solo tus publicaciones públicas se publicarán en StatusNet."; -$a->strings["Log in with StatusNet"] = "Inicia sesión en StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Copia el código de seguridad de StatusNet aquí"; -$a->strings["Cancel Connection Process"] = "Cancelar la conexión en proceso"; -$a->strings["Current StatusNet API is"] = "El estado actual de la API de StatusNet es"; -$a->strings["Cancel StatusNet Connection"] = "Cancelar conexión con StatusNet"; -$a->strings["Currently connected to: "] = "Actualmente conectado a:"; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Si lo habilitas todas tus publicaciones
públicas podrán ser publicadas en la cuenta asociada de StatusNet. Pudes elegir hacerlo por defecto (aquí) o para cada publicación individualmente en las opciones de publicacion cuando las escribes."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Nota: Debido a tus opciones de privacidad (¿Ocultar los detalles de tu perfil de espectadores desconocidos?) el vínculo potencialmente incluido en publicaciones públicas que se transmiten a StatusNet conducirá al visitante a una página en blanco que informa a los visitantes que el acceso a tu perfil es restringido."; -$a->strings["Allow posting to StatusNet"] = "Permitir publicaciones en StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "Enviar publicaciones públicas a StatusNet por defecto"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = "Enviar a StatusNet las #-etiquetas y @-nombres"; -$a->strings["Clear OAuth configuration"] = "Borrar la configuración de OAuth"; -$a->strings["Site name"] = "Nombre del sitio"; -$a->strings["API URL"] = "Dirección de la API"; -$a->strings["Consumer Secret"] = "Secreto del consumidor"; -$a->strings["Consumer Key"] = "Clave del consumidor"; diff --git a/sources/extend/addon/matrix/statusnet/lang/fr/strings.php b/sources/extend/addon/matrix/statusnet/lang/fr/strings.php deleted file mode 100644 index 7118173e..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/fr/strings.php +++ /dev/null @@ -1,32 +0,0 @@ -strings["Post to StatusNet"] = "Poster sur StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Merci de contacter l'administrateur du site.
L'URL d'API fournie est invalide."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Nous n'avons pas pu contacter l'API StatusNet avec le chemin saisi."; -$a->strings["StatusNet settings updated."] = "Réglages StatusNet mis-à-jour."; -$a->strings["StatusNet Posting Settings"] = "Réglages du connecteur StatusNet"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "Clés OAuth StatusNet universelles"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Ce sont des paires de clés OAuth préconfigurées pour certains serveurs StatusNet courants. Si vous utilisez l'un d'entre eux, merci de vous servir de ces clés. Autrement, vous pouvez vous connecter à n'importer quelle autre instance de StatusNet (voir ci-dessous)."; -$a->strings["Submit"] = "Envoyer"; -$a->strings["Provide your own OAuth Credentials"] = "Fournissez vos propres paramètres OAuth"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Pas de paire de clé trouvée pour StatusNet. Enregistrez votre compte Friendica comme un client \"desktop\" sur votre compte StatusNet, copiez la paire de clé ici et entrez la racine de l'API.
Avant d'enregistrer votre propre paire de clé, assurez-vous auprès de l'administrateur qu'il n'y a pas déjà une paire de clé pour cette instance de Friendica chez votre fournisseur StatusNet préféré."; -$a->strings["OAuth Consumer Key"] = "Clé de consommateur OAuth"; -$a->strings["OAuth Consumer Secret"] = "Secret d'utilisateur OAuth"; -$a->strings["Base API Path (remember the trailing /)"] = "Chemin de base de l'API (n'oubliez pas le / final)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Pour vous connecter à votre compte StatusNet, cliquez sur le bouton ci-dessous pour obtenir un code de sécurité de StatusNet, que vous aurez à coller dans la boîte ci-dessous. Ensuite, validez le formulaire. Seuls vos articles <strong>publics</strong> seront postés sur StatusNet."; -$a->strings["Log in with StatusNet"] = "Se connecter à StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Coller le code de sécurité de StatusNet ici"; -$a->strings["Cancel Connection Process"] = "Annuler le processus de connexion"; -$a->strings["Current StatusNet API is"] = "L'API StatusNet courante est"; -$a->strings["Cancel StatusNet Connection"] = "Annuler la connexion à StatusNet"; -$a->strings["Currently connected to: "] = "Actuellement connecté à: "; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "En cas d'activation, toutes vos notices publiques seront transmises au compte StatusNet associé. Vous pourrez choisir de le faire par défaut (ici), ou bien pour chaque notice séparément lors de sa rédaction."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Note: Du fait de vos réglages de vie privée (Cacher les détails de votre profil des visiteurs inconnus?), le lien potentiellement inclus dans les messages publics relayés vers StatusNet conduira les visiteurs vers une page blanche les informant que leur accès à votre profil a été restreint."; -$a->strings["Allow posting to StatusNet"] = "Autoriser la publication sur StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "Par défaut, envoyer les notices publiques à StatusNet"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = "Envoyer les liens vers les #-tags et les @-noms sur StatusNet"; -$a->strings["Clear OAuth configuration"] = "Effacer la configuration OAuth"; -$a->strings["Site name"] = "Nom du site"; -$a->strings["API URL"] = "URL de l'API"; -$a->strings["Consumer Secret"] = "Secret utilisateur"; -$a->strings["Consumer Key"] = "Clé utilisateur"; diff --git a/sources/extend/addon/matrix/statusnet/lang/is/strings.php b/sources/extend/addon/matrix/statusnet/lang/is/strings.php deleted file mode 100644 index 8a682499..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/is/strings.php +++ /dev/null @@ -1,32 +0,0 @@ -strings["Post to StatusNet"] = "Senda færslu á StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Hafðu samband við kerfisstjóra.
Uppgefin API slóð er ógild."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Ekki náðist í StatusNet API með slóð sem þú gafst upp."; -$a->strings["StatusNet settings updated."] = "StatusNet stillingar uppfærðar."; -$a->strings["StatusNet Posting Settings"] = "StatusNet færslu stillingar"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "StatusNet OAuthKey í boði á heimsvísu"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Það eru forstillt OAuth lykla pör í sumum StatusNet þjónum. Ef þú ert að nota slíkt par, notaðu þá þau auðkenni. Ef ekki þá er þér frjálst að tengjast hvaða öðrum StatusNet þjón (sjá fyrir neðan)."; -$a->strings["Submit"] = "Senda inn"; -$a->strings["Provide your own OAuth Credentials"] = "Gefðu upp eigin OAuth auðkenni"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = ""; -$a->strings["OAuth Consumer Key"] = "OAuth notenda lykill"; -$a->strings["OAuth Consumer Secret"] = "OAuth notenda leyndarmál"; -$a->strings["Base API Path (remember the trailing /)"] = "Grunn API slóð (muna eftir / í endann)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Til að tengjast StatusNet notandanum ýttu á takkann fyrir neðan, þá fæst öryggis lykill frá StatusNet sem þarf að afrita í svæðið fyrir neðan og senda inn. Aðeins opinberar færslur munu flæða yfir á StatusNet."; -$a->strings["Log in with StatusNet"] = "Innskrá með StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Afrita öryggis lykil frá StatusNet hingað"; -$a->strings["Cancel Connection Process"] = "Hætta við tengi ferli"; -$a->strings["Current StatusNet API is"] = "Núverandi StatusNet API er"; -$a->strings["Cancel StatusNet Connection"] = "Hætta við StatusNet tengingu"; -$a->strings["Currently connected to: "] = "Núna tengdur við:"; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Ef virkt þá geta allar opinberu stöðu meldingarnar þínar verið birtar á tengdri StatusNet síðu. Þú getur valið að gera þetta sjálfvirkt (hér) eða fyrir hvern póst í senn þegar hann er skrifaður."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = ""; -$a->strings["Allow posting to StatusNet"] = "Leyfa sendingu færslna til StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "Sjálfgefið senda opinberar færslur á StatusNet"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = ""; -$a->strings["Clear OAuth configuration"] = "Hreinsa OAuth stillingar"; -$a->strings["Site name"] = "Nafn síðu"; -$a->strings["API URL"] = "API slóð"; -$a->strings["Consumer Secret"] = "Notenda leyndarmál"; -$a->strings["Consumer Key"] = "Notenda lykill"; diff --git a/sources/extend/addon/matrix/statusnet/lang/it/strings.php b/sources/extend/addon/matrix/statusnet/lang/it/strings.php deleted file mode 100644 index e440885c..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/it/strings.php +++ /dev/null @@ -1,34 +0,0 @@ -strings["Post to StatusNet"] = "Invia a StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Contatta l'amministratore del sito.
L'URL delle API fornito non è valido."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Non possiamo conttattare le API di StatusNet con il percorso che hai inserito."; -$a->strings["StatusNet settings updated."] = "Impostazioni StatusNet aggiornate."; -$a->strings["StatusNet Posting Settings"] = "Impostazioni di invio a StatusNet"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "OAuthKeys globali di StatusNet"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Esistono coppie di chiavi OAuth precofigurate per alcuni server StatusNet. Se usi uno di questi server, per favore scegli queste credenziali. Altrimenti sei libero di collegarti a un'altra installazione di StatusNet (vedi sotto)."; -$a->strings["Submit"] = "Invia"; -$a->strings["Provide your own OAuth Credentials"] = "Fornisci le tue credenziali OAuth"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Nessuna coppia di chiavi consumer trovate per StatusNet. Registra il tuo account Friendica come un client desktop nel tuo account StatusNet, copia la coppia di chiavi consumer qui e inserisci l'url base delle API.
Prima di registrare la tua coppia di chiavi OAuth, chiedi all'amministratore se esiste già una coppia di chiavi per questo sito Friendica presso la tua installazione StatusNet preferita."; -$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key"; -$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret"; -$a->strings["Base API Path (remember the trailing /)"] = "Indirizzo di base per le API (ricorda la / alla fine)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Per collegare il tuo account StatusNet, clicca sul bottone per ottenere un codice di sicurezza da StatusNet, che dovrai copiare nel box sottostante e poi inviare la form. Solo i tuoi messaggi pubblici saranno inviati a StatusNet."; -$a->strings["Log in with StatusNet"] = "Accedi con StatuNet"; -$a->strings["Copy the security code from StatusNet here"] = "Copia il codice di sicurezza da StatusNet qui"; -$a->strings["Cancel Connection Process"] = "Annulla il processo di connessione"; -$a->strings["Current StatusNet API is"] = "Le API StatusNet correnti sono"; -$a->strings["Cancel StatusNet Connection"] = "Annulla la connessione a StatusNet"; -$a->strings["Currently connected to: "] = "Al momento connesso con:"; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se abilitato tutti i tuoi messaggi pubblici possono essere inviati all'account StatusNet associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Nota: A causa delle tue impostazioni di privacy(Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?) il link potenzialmente incluse nei messaggi pubblici inviati a StatusNet porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato."; -$a->strings["Allow posting to StatusNet"] = "Permetti l'invio a StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "Invia sempre i messaggi pubblici a StatusNet"; -$a->strings["Mirror all posts from statusnet that are no replies or repeated messages"] = ""; -$a->strings["Shortening method that optimizes the post"] = ""; -$a->strings["Send linked #-tags and @-names to StatusNet"] = ""; -$a->strings["Clear OAuth configuration"] = "Rimuovi la configurazione OAuth"; -$a->strings["Site name"] = "Nome del sito"; -$a->strings["API URL"] = "API URL"; -$a->strings["Consumer Secret"] = "Consumer Secret"; -$a->strings["Consumer Key"] = "Consumer Key"; diff --git a/sources/extend/addon/matrix/statusnet/lang/nb-no/strings.php b/sources/extend/addon/matrix/statusnet/lang/nb-no/strings.php deleted file mode 100644 index 91ad44e7..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/nb-no/strings.php +++ /dev/null @@ -1,32 +0,0 @@ -strings["Post to StatusNet"] = "Post til StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Vennligst kontakt administratoren på nettstedet ditt.
Den oppgitter API URL-en er ikke gyldig."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Vi kunne ikke kontakte StatusNet API-en med den banen du oppgav."; -$a->strings["StatusNet settings updated."] = "StatusNet-innstillinger er oppdatert."; -$a->strings["StatusNet Posting Settings"] = "Innstillinger for posting til StatusNet"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "Globalt tilgjengelige StatusNet OAuthKeys"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Det finnes ferdig konfigurerte OAuth nøkkelpar tilgjengelig for noen StatusNet-tjenere. Hvis du bruker en av disse, vennligst bruk disse som legitimasjon. Hvis ikke, så er du fri til å opprette en forbindelse til enhver annen StatusNet-forekomst (se nedenfor)."; -$a->strings["Submit"] = "Lagre"; -$a->strings["Provide your own OAuth Credentials"] = "Oppgi din egen OAuth-legitimasjon"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = ""; -$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key"; -$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret"; -$a->strings["Base API Path (remember the trailing /)"] = "Base API Path (husk / på slutten)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "For å koble din StatusNet-konto, klikk knappen under for å få en sikkerhetskode fra StatusNet som du må kopiere inn i tekstfeltet under, og send inn skjemaet. Det er bare dine offentlige meldinger som blir postet til StatusNet."; -$a->strings["Log in with StatusNet"] = "Logg inn med StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Kopier sikkerhetskoden fra StatusNet hit"; -$a->strings["Cancel Connection Process"] = "Avbryt forbindelsesprosessen"; -$a->strings["Current StatusNet API is"] = "Gjeldende StatusNet API er"; -$a->strings["Cancel StatusNet Connection"] = "Avbryt StatusNet-forbindelsen"; -$a->strings["Currently connected to: "] = "For øyeblikket tilkoblet til:"; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Aktivering gjør at alle dine offentlige innlegg kan postes til den tilknyttede StatusNet-kontoen. Du kan velge å gjøre dette som standard (her), eller for hvert enkelt innlegg separat i valgmulighetene for posting når du skriver et innlegg."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = ""; -$a->strings["Allow posting to StatusNet"] = "Tillat innlegg til StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "Send offentlige innlegg til StatusNet som standard"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = ""; -$a->strings["Clear OAuth configuration"] = "Fjern OAuth-konfigurasjon"; -$a->strings["Site name"] = "Nettstedets navn"; -$a->strings["API URL"] = "API URL"; -$a->strings["Consumer Secret"] = "Consumer Secret"; -$a->strings["Consumer Key"] = "Consumer Key"; diff --git a/sources/extend/addon/matrix/statusnet/lang/pl/strings.php b/sources/extend/addon/matrix/statusnet/lang/pl/strings.php deleted file mode 100644 index ef41e39d..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/pl/strings.php +++ /dev/null @@ -1,34 +0,0 @@ -strings["Post to StatusNet"] = "Wyślij do sieci StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Proszę się skontaktować z administratorem strony.
API URL nie jest poprawne"; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = ""; -$a->strings["StatusNet settings updated."] = "Ustawienia StatusNet zaktualizowane"; -$a->strings["StatusNet Posting Settings"] = "Ustawienia StatusNet"; -$a->strings["Globally Available StatusNet OAuthKeys"] = ""; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = ""; -$a->strings["Submit"] = "Potwierdź"; -$a->strings["Provide your own OAuth Credentials"] = ""; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = ""; -$a->strings["OAuth Consumer Key"] = ""; -$a->strings["OAuth Consumer Secret"] = ""; -$a->strings["Base API Path (remember the trailing /)"] = ""; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Aby uzyskać połączenie z kontem w serwisie StatusNet naciśnij przycisk poniżej aby otrzymać kod bezpieczeństwa od StatusNet, który musisz skopiować do pola poniżej i wysłać formularz. Tylko twoje publiczne posty będą publikowane na StatusNet."; -$a->strings["Log in with StatusNet"] = "Zaloguj się przez StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Tutaj skopiuj kod bezpieczeństwa z StatusNet"; -$a->strings["Cancel Connection Process"] = "Anuluj proces łączenia"; -$a->strings["Current StatusNet API is"] = "Aktualnym StatusNet API jest"; -$a->strings["Cancel StatusNet Connection"] = "Anuluj połączenie StatusNet"; -$a->strings["Currently connected to: "] = "Obecnie połączone z:"; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = ""; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = ""; -$a->strings["Allow posting to StatusNet"] = "Pozwól zamieszczać posty na StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = ""; -$a->strings["Mirror all posts from statusnet that are no replies or repeated messages"] = ""; -$a->strings["Shortening method that optimizes the post"] = ""; -$a->strings["Send linked #-tags and @-names to StatusNet"] = ""; -$a->strings["Clear OAuth configuration"] = ""; -$a->strings["Site name"] = "Nazwa strony"; -$a->strings["API URL"] = "Adres API"; -$a->strings["Consumer Secret"] = "Sekret konsumenta"; -$a->strings["Consumer Key"] = "Klucz konsumenta"; diff --git a/sources/extend/addon/matrix/statusnet/lang/pt-br/strings.php b/sources/extend/addon/matrix/statusnet/lang/pt-br/strings.php deleted file mode 100644 index f360e69b..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/pt-br/strings.php +++ /dev/null @@ -1,32 +0,0 @@ -strings["Post to StatusNet"] = "Publicar no StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "Por favor, entre em contato com o administrados do seu site.
A URL da API fornecida não é válida."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Não foi possível contactar a API do StatusNet a partir do caminho que você informou."; -$a->strings["StatusNet settings updated."] = "As configurações do StatusNet foram atualizadas."; -$a->strings["StatusNet Posting Settings"] = "Configurações de publicação no StatusNet"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "OAuthKeys do StatusNet disponíveis globalmente"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Existem pares de chaves OAuth para alguns servidores StatusNet disponíveis. Se você estiver usando algum desses servidores, por favor utilize essas credenciais. Caso contrário, sinta-se à vontade para conectar-se a qualquer outra instância do StatusNet (veja abaixo)."; -$a->strings["Submit"] = "Enviar"; -$a->strings["Provide your own OAuth Credentials"] = "Forneça suas próprias credenciais OAuth"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Nenhum par de chaves para StatusNet encontrado. Registre sua conta Friendica como um cliente de mesa (desktop) na sua conta StatusNet, copie o par de chaves aqui e forneça a raíz base da API.
Antes de registra seu próprio par de chaves OAuth pergunte ao administrador se já existe um par de chaves para essa instalação do Friendica na sua instalação favorita do StatusNet."; -$a->strings["OAuth Consumer Key"] = "Chave de consumidor OAuth"; -$a->strings["OAuth Consumer Secret"] = "Segredo de consumidor OAuth"; -$a->strings["Base API Path (remember the trailing /)"] = "Caminho base da API (lembre-se da / final)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Para conectar à sua conta StatusNet, clique no botão abaixo para obter um código de segurança do StatusNet, o qual você deve copiar na caixa de texto abaixo e clicar no botão para enviar o formulário. Somente suas publicações públicas serão enviadas para o StatusNet."; -$a->strings["Log in with StatusNet"] = "Autenticar-se no StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Copie o código de segurança do StatusNet aqui"; -$a->strings["Cancel Connection Process"] = "Cancelar o processo de conexão"; -$a->strings["Current StatusNet API is"] = "A API atual do StatusNet é"; -$a->strings["Cancel StatusNet Connection"] = "Cancelar a conexão com o StatusNet"; -$a->strings["Currently connected to: "] = "Atualmente conectado como: "; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se habilitado, todas as suas publicações públicas podem ser publicadas na sua conta StatusNet associada. Você pode escolher entre publicar tudo automaticamente (marcando aqui) ou selecionar o que será enviado individualmente (nas opções de publicação, durante o processo de escrita da mensagem)."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Aviso: Devido às suas configurações de privacidade (Ocultar os detalhes do seu perfil para pessoas desconhecidas?) o link potencialmente incluído nas publicações públicas encaminhadas para o StatusNet levarão o visitante a uma página contendo a informação de que o acesso ao seu perfil é restrito."; -$a->strings["Allow posting to StatusNet"] = "Permitir a publicação no StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "Enviar as publicações públicas para o StatusNet por padrão"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = ""; -$a->strings["Clear OAuth configuration"] = "Limpar a configuração OAuth"; -$a->strings["Site name"] = "Nome do site"; -$a->strings["API URL"] = "URL da API"; -$a->strings["Consumer Secret"] = "Segredo do consumidor"; -$a->strings["Consumer Key"] = "Chave do consumidor"; diff --git a/sources/extend/addon/matrix/statusnet/lang/ru/strings.php b/sources/extend/addon/matrix/statusnet/lang/ru/strings.php deleted file mode 100644 index 810d2583..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/ru/strings.php +++ /dev/null @@ -1,32 +0,0 @@ -strings["Post to StatusNet"] = "Отправить на StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "ПожалуйÑта, обратитеÑÑŒ к админиÑтратору Ñайта.
Предложенный URL API недейÑтвителен."; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Мы не Ñмогли ÑвÑзатьÑÑ Ñ API StatusNet Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð¼, который вы ввели."; -$a->strings["StatusNet settings updated."] = "ÐаÑтройки StatusNet обновлены."; -$a->strings["StatusNet Posting Settings"] = "ÐаÑтройка отправки Ñообщений на StatusNet"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "Глобально доÑтупные StatusNet OAuthKeys"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "ДоÑтупны предварительно Ñконфигурированные OAuth пары ключей Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñерверов StatusNet. ЕÑли вы иÑпользуете один из них, пожалуйÑта, иÑпользуйте Ñти учетные данные. ЕÑли нет, не ÑтеÑнÑйтеÑÑŒ подключитьÑÑ Ðº любому другому ÑкземплÑру StatusNet (Ñм. ниже)."; -$a->strings["Submit"] = "Подтвердить"; -$a->strings["Provide your own OAuth Credentials"] = "Укажите Ñвои ÑобÑтвенные Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ‡Ð¸Ñ OAuth"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = ""; -$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key"; -$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret"; -$a->strings["Base API Path (remember the trailing /)"] = "Путь базы API (помните о Ñлеше /)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "Чтобы подключитьÑÑ Ðº StatusNet аккаунту, нажмите на кнопку ниже, чтобы получить код безопаÑноÑти от StatusNet, который нужно Ñкопировать в поле ввода ниже, и отправить форму. Только ваши публичные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отправлÑÑ‚ÑŒÑÑ Ð½Ð° StatusNet."; -$a->strings["Log in with StatusNet"] = "Войдите Ñо StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Скопируйте код безопаÑноÑти от StatusNet здеÑÑŒ"; -$a->strings["Cancel Connection Process"] = "Отмена процеÑÑа подключениÑ"; -$a->strings["Current StatusNet API is"] = "Текущим StatusNet API ÑвлÑетÑÑ"; -$a->strings["Cancel StatusNet Connection"] = "Отмена StatusNet подключениÑ"; -$a->strings["Currently connected to: "] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñоединены Ñ: "; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "ЕÑли включено, то вÑе ваши общеÑтвенные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть отправлены на ÑоответÑтвующий аккаунт StatusNet. Ð’Ñ‹ можете Ñделать Ñто по умолчанию (здеÑÑŒ) или Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾ при напиÑании запиÑи."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = ""; -$a->strings["Allow posting to StatusNet"] = "Разрешить отправку на StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "ОтправлÑÑ‚ÑŒ публичные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° StatusNet по умолчанию"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = ""; -$a->strings["Clear OAuth configuration"] = "ОчиÑтить конфигурацию OAuth"; -$a->strings["Site name"] = "Ðазвание Ñайта"; -$a->strings["API URL"] = "API URL"; -$a->strings["Consumer Secret"] = "Consumer Secret"; -$a->strings["Consumer Key"] = "Consumer Key"; diff --git a/sources/extend/addon/matrix/statusnet/lang/sv/strings.php b/sources/extend/addon/matrix/statusnet/lang/sv/strings.php deleted file mode 100644 index 9b3fac7f..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/sv/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Post to StatusNet"] = "Lägg in på StatusNet"; -$a->strings["StatusNet Posting Settings"] = "Inställningar för inlägg på StatusNet"; -$a->strings["Submit"] = "Spara"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."; -$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key"; -$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret"; -$a->strings["Base API Path (remember the trailing /)"] = "Base API Path (remember the trailing /)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."; -$a->strings["Log in with StatusNet"] = "Logga in med StatusNet"; -$a->strings["Copy the security code from StatusNet here"] = "Ange säkerhetskoden från StatusNet här"; -$a->strings["Currently connected to: "] = "Ansluten till: "; -$a->strings["Clear OAuth configuration"] = "Clear OAuth configuration"; diff --git a/sources/extend/addon/matrix/statusnet/lang/zh-cn/strings.php b/sources/extend/addon/matrix/statusnet/lang/zh-cn/strings.php deleted file mode 100644 index 3c7b76d4..00000000 --- a/sources/extend/addon/matrix/statusnet/lang/zh-cn/strings.php +++ /dev/null @@ -1,34 +0,0 @@ -strings["Post to StatusNet"] = "å‘é€åˆ°StatusNet"; -$a->strings["Please contact your site administrator.
The provided API URL is not valid."] = "请è”系您的网站行政人员。
æ供的API URL无效。"; -$a->strings["We could not contact the StatusNet API with the Path you entered."] = "我们ä¸èƒ½è”ç³»StatusNet API在您输入的路径。"; -$a->strings["StatusNet settings updated."] = "StatusNet设置更新了。"; -$a->strings["StatusNet Posting Settings"] = "StatusNetå‘é€è®¾ç½®"; -$a->strings["Globally Available StatusNet OAuthKeys"] = "综åˆå¯ç”¨çš„StatusNet OAuthKeys"; -$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "有已ç»è£…é…çš„OAuth钥匙åŒäºŽæœ‰çš„StatusNetæœåŠ¡å™¨å¯ç”¨ã€‚如果您用那些之一,请用那个。å¦åˆ™éšä¾¿è¿žæŽ¥ä»»ä½•åˆ«çš„StatusNet(看下)。"; -$a->strings["Submit"] = "æ交"; -$a->strings["Provide your own OAuth Credentials"] = "æ供您自己的OAuthè¯ä»¶"; -$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.
Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "找ä¸åˆ°ã€Œconsumer keyã€åŒä¸ºStatusNet。注册您Friendica账户当「desktop clientã€åœ¨æ‚¨çš„StatusNet账户,粘贴「consumer keyã€åŒè¿™å„¿å’Œè¾“å…¥API基础根。
您登记您的OAuth钥匙åŒå‰é—®è¡Œæ”¿äººå‘˜å·²ç»æœ‰æ²¡æœ‰é’¥åŒ™åŒä¸ºè¿™ä¸ªFriendica安装在您最喜欢的StatusNet安装。"; -$a->strings["OAuth Consumer Key"] = "Oauth消费者钥匙"; -$a->strings["OAuth Consumer Secret"] = "Oauth消费者密ç "; -$a->strings["Base API Path (remember the trailing /)"] = "基础API地å€(注æ„最åŽçš„ï¼)"; -$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your public posts will be posted to StatusNet."] = "为连接您的StatusNet账户点击下按钮得到安全密ç ä»ŽStatusNet您è¦åœ¨è¾“入在下个æ å’Œæ交表å•ã€‚åªæ‚¨çš„公开文章被é€åˆ°StatusNet。"; -$a->strings["Log in with StatusNet"] = "用StatusNet登记"; -$a->strings["Copy the security code from StatusNet here"] = "å¤åˆ¶å®‰å…¨å¯†ç ä»ŽStatusNet这儿"; -$a->strings["Cancel Connection Process"] = "注销连接过程 "; -$a->strings["Current StatusNet API is"] = "现在StatusNet API是"; -$a->strings["Cancel StatusNet Connection"] = "注销StatusNet连接"; -$a->strings["Currently connected to: "] = "现在连接到:"; -$a->strings["If enabled all your public postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "如果使å¯ç”¨çš„都您公开的文章会被å‘é€åˆ°æœ‰å…³çš„StatusNet账户。您会选择默认地这样åšï¼ˆè¿™å„¿ï¼‰æˆ–个文章分开地写字时候选择在文章设置。"; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "注æ„: 由于您的éšç§è®¾ç½®(éšè—您的简介内容为生看者?)超链接å¯èƒ½åŒ…括在公文章转播到StatusNets会带领æ¥å®¢åˆ°ç©ºç™½é¡µè®²ä»–看您的简介被é™åˆ¶ã€‚"; -$a->strings["Allow posting to StatusNet"] = "许放在StatusNet"; -$a->strings["Send public postings to StatusNet by default"] = "默认å‘é€å…¬å¼€æ–‡ç« åœ¨StatusNet"; -$a->strings["Mirror all posts from statusnet that are no replies or repeated messages"] = "å¤åˆ¶æ‰€æœ‰æ–‡ç« ä»Žstatusnet除了回答或é‡å¤çš„通知以外"; -$a->strings["Shortening method that optimizes the post"] = "缩短方法优化文章"; -$a->strings["Send linked #-tags and @-names to StatusNet"] = "转播连接的#标签盒@å到StatusNet"; -$a->strings["Clear OAuth configuration"] = "清ç†å‡ºOAuth设置"; -$a->strings["Site name"] = "网页åå­—"; -$a->strings["API URL"] = "API URL"; -$a->strings["Consumer Secret"] = "密ç (Consumer Secret)"; -$a->strings["Consumer Key"] = "钥匙(Consumer Key)"; diff --git a/sources/extend/addon/matrix/statusnet/signinwithgnusocial.png b/sources/extend/addon/matrix/statusnet/signinwithgnusocial.png deleted file mode 100644 index 218e8e6f..00000000 Binary files a/sources/extend/addon/matrix/statusnet/signinwithgnusocial.png and /dev/null differ diff --git a/sources/extend/addon/matrix/statusnet/statusnet.css b/sources/extend/addon/matrix/statusnet/statusnet.css deleted file mode 100755 index 66a7cfde..00000000 --- a/sources/extend/addon/matrix/statusnet/statusnet.css +++ /dev/null @@ -1,7 +0,0 @@ -#statusnet-avatar { - float: left; - width: 48px; - height: 48px; - margin: 0px 15px 15px 0px; -} - diff --git a/sources/extend/addon/matrix/statusnet/statusnet.php b/sources/extend/addon/matrix/statusnet/statusnet.php deleted file mode 100755 index 8346e338..00000000 --- a/sources/extend/addon/matrix/statusnet/statusnet.php +++ /dev/null @@ -1,940 +0,0 @@ - - * Author: Michael Vogel - */ - -require_once('include/permissions.php'); - -/* GNU social Plugin for Hubzilla - * - * Author: Tobias Diekershoff - * tobias.diekershoff@gmx.net - * - * License:3-clause BSD license - * - * Configuration: - * After activating this addon, your user can configure their Twitter account settings - * from "Settings -> Feature settings". - * - * Requirements: PHP5, curl [Slinky library] - * - * Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/StatusNet_Plugin - */ - -/*** - * We have to alter the TwitterOAuth class a little bit to work with any GNU social/StatusNet - * installation abroad. Basically it's only make the API path variable and be happy. - * - * Thank you guys for the Twitter compatible API! - */ - -define('STATUSNET_DEFAULT_POLL_INTERVAL', 5); // given in minutes - -require_once('library/twitteroauth.php'); - -class StatusNetOAuth extends TwitterOAuth { - function get_maxlength() { - $config = $this->get($this->host . 'statusnet/config.json'); - return $config->site->textlimit; - } - function accessTokenURL() { return $this->host.'oauth/access_token'; } - function authenticateURL() { return $this->host.'oauth/authenticate'; } - function authorizeURL() { return $this->host.'oauth/authorize'; } - function requestTokenURL() { return $this->host.'oauth/request_token'; } - function __construct($apipath, $consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) { - parent::__construct($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret); - $this->host = $apipath; - } - /** - * Make an HTTP request - * - * @return API results - * - * Copied here from the twitteroauth library and complemented by applying the proxy settings of Hubzilla - */ - -function http($url, $method, $postfields = NULL) { - $this->http_info = array(); - $ci = curl_init(); - /* Curl settings */ - $prx = get_config('system','proxy'); - if(strlen($prx)) { - curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, 1); - curl_setopt($ci, CURLOPT_PROXY, $prx); - $prxusr = get_config('system','proxyuser'); - if(strlen($prxusr)) - curl_setopt($ci, CURLOPT_PROXYUSERPWD, $prxusr); - } - curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent); - curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout); - curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout); - curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE); - curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:')); - curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer); - curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader')); - curl_setopt($ci, CURLOPT_HEADER, FALSE); - - switch ($method) { - case 'POST': - curl_setopt($ci, CURLOPT_POST, TRUE); - if (!empty($postfields)) { - curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); - } - break; - case 'DELETE': - curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE'); - if (!empty($postfields)) { - $url = "{$url}?{$postfields}"; - } - } - - curl_setopt($ci, CURLOPT_URL, $url); - $response = curl_exec($ci); - $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); - $this->http_info = array_merge($this->http_info, curl_getinfo($ci)); - $this->url = $url; - curl_close ($ci); - return $response; - } -} - -function statusnet_load() { - // we need some hooks, for the configuration and for sending tweets - register_hook('feature_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings'); - register_hook('feature_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post'); - register_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook'); - register_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local'); - register_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets'); - register_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron'); - - logger("loaded statusnet"); -} - - -function statusnet_unload() { - unregister_hook('feature_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings'); - unregister_hook('feature_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post'); - unregister_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook'); - unregister_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local'); - unregister_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets'); - unregister_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron'); - -} - -function statusnet_jot_nets(&$a,&$b) { - - if((! local_channel()) || (! perm_is_allowed(local_channel(),'','view_stream'))) - return; - - $statusnet_post = get_pconfig(local_channel(),'statusnet','post'); - - if(intval($statusnet_post) == 1) { - $statusnet_defpost = get_pconfig(local_channel(),'statusnet','post_by_default'); - $selected = ((intval($statusnet_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '
' - . ' ' . t('Post to GNU social') . '
'; - } -} - -function statusnet_settings_post ($a,$post) { - if(! local_channel()) - return; - // don't check statusnet settings if statusnet submit button is not clicked - - if (!x($_POST,'statusnet-submit')) - return; - - if(isset($_POST['statusnet-disconnect'])) { - - /*** - * if the statusnet-disconnect checkbox is set, clear the statusnet configuration - */ - del_pconfig(local_channel(), 'statusnet', 'consumerkey'); - del_pconfig(local_channel(), 'statusnet', 'consumersecret'); - del_pconfig(local_channel(), 'statusnet', 'post'); - del_pconfig(local_channel(), 'statusnet', 'post_by_default'); - del_pconfig(local_channel(), 'statusnet', 'oauthtoken'); - del_pconfig(local_channel(), 'statusnet', 'oauthsecret'); - del_pconfig(local_channel(), 'statusnet', 'baseapi'); - del_pconfig(local_channel(), 'statusnet', 'post_taglinks'); - del_pconfig(local_channel(), 'statusnet', 'lastid'); - del_pconfig(local_channel(), 'statusnet', 'mirror_posts'); - del_pconfig(local_channel(), 'statusnet', 'intelligent_shortening'); - } - else { - - - if (isset($_POST['statusnet-preconf-apiurl'])) { - - - /*** - * If the user used one of the preconfigured GNU social server credentials - * use them. All the data are available in the global config. - * Check the API Url never the less and blame the admin if it's not working ^^ - */ - $globalsn = get_config('statusnet', 'sites'); - foreach ( $globalsn as $asn) { - if ($asn['apiurl'] == $_POST['statusnet-preconf-apiurl'] ) { - $apibase = $asn['apiurl']; - $x = z_fetch_url( $apibase . 'statusnet/version.xml', false, 0, array('novalidate' => true)); $c = $x['body']; - if (strlen($c) > 0) { - set_pconfig(local_channel(), 'statusnet', 'consumerkey', $asn['consumerkey'] ); - set_pconfig(local_channel(), 'statusnet', 'consumersecret', $asn['consumersecret'] ); - set_pconfig(local_channel(), 'statusnet', 'baseapi', $asn['apiurl'] ); - set_pconfig(local_channel(), 'statusnet', 'application_name', $asn['applicationname'] ); - } - else { - notice( t('Please contact your site administrator.
The provided API URL is not valid.').EOL.$asn['apiurl'].EOL ); - } - } - } - goaway($a->get_baseurl().'/settings/featured'); - } - else { - - if (isset($_POST['statusnet-consumersecret'])) { - - // check if we can reach the API of the GNU social server - // we'll check the API Version for that, if we don't get one we'll try to fix the path but will - // resign quickly after this one try to fix the path ;-) - $apibase = $_POST['statusnet-baseapi']; - $x = z_fetch_url( $apibase . 'statusnet/version.xml', false, 0, array('novalidate' => true) ); - $c = $x['body']; - if (strlen($c) > 0) { - // ok the API path is correct, let's save the settings - set_pconfig(local_channel(), 'statusnet', 'consumerkey', $_POST['statusnet-consumerkey']); - set_pconfig(local_channel(), 'statusnet', 'consumersecret', $_POST['statusnet-consumersecret']); - set_pconfig(local_channel(), 'statusnet', 'baseapi', $apibase ); - set_pconfig(local_channel(), 'statusnet', 'application_name', $_POST['statusnet-applicationname'] ); - } - else { - // the API path is not correct, maybe missing trailing / ? - $apibase = $apibase . '/'; - - $x = z_fetch_url( $apibase . 'statusnet/version.xml', false, 0, array('novalidate' => true) ); - $c = $x['body']; - if (strlen($c) > 0) { - // ok the API path is now correct, let's save the settings - set_pconfig(local_channel(), 'statusnet', 'consumerkey', $_POST['statusnet-consumerkey']); - set_pconfig(local_channel(), 'statusnet', 'consumersecret', $_POST['statusnet-consumersecret']); - set_pconfig(local_channel(), 'statusnet', 'baseapi', $apibase ); - } - else { - // still not the correct API base, let's do noting - notice( t('We could not contact the GNU social API with the Path you entered.').EOL ); - } - } - goaway($a->get_baseurl().'/settings/featured'); - } - else { - - if (isset($_POST['statusnet-pin'])) { - - // if the user supplied us with a PIN from GNU social, let the magic of OAuth happen - $api = get_pconfig(local_channel(), 'statusnet', 'baseapi'); - $ckey = get_pconfig(local_channel(), 'statusnet', 'consumerkey' ); - $csecret = get_pconfig(local_channel(), 'statusnet', 'consumersecret' ); - // the token and secret for which the PIN was generated were hidden in the settings - // form as token and token2, we need a new connection to Twitter using these token - // and secret to request a Access Token with the PIN - $connection = new StatusNetOAuth($api, $ckey, $csecret, $_POST['statusnet-token'], $_POST['statusnet-token2']); - $token = $connection->getAccessToken( $_POST['statusnet-pin'] ); - // ok, now that we have the Access Token, save them in the user config - set_pconfig(local_channel(),'statusnet', 'oauthtoken', $token['oauth_token']); - set_pconfig(local_channel(),'statusnet', 'oauthsecret', $token['oauth_token_secret']); - set_pconfig(local_channel(),'statusnet', 'post', 1); - set_pconfig(local_channel(),'statusnet', 'post_taglinks', 1); - // reload the Addon Settings page, if we don't do it see Bug #42 - goaway($a->get_baseurl().'/settings/featured'); - } - else { - // if no PIN is supplied in the POST variables, the user has changed the setting - // to post a dent for every new __public__ posting to the wall - set_pconfig(local_channel(),'statusnet','post',intval($_POST['statusnet-enable'])); - set_pconfig(local_channel(),'statusnet','post_by_default',intval($_POST['statusnet-default'])); - set_pconfig(local_channel(),'statusnet','post_taglinks',intval($_POST['statusnet-sendtaglinks'])); - set_pconfig(local_channel(), 'statusnet', 'mirror_posts', intval($_POST['statusnet-mirror'])); - set_pconfig(local_channel(), 'statusnet', 'intelligent_shortening', intval($_POST['statusnet-shortening'])); - info( t('GNU social settings updated.') . EOL); - } - } - } - } -} - -function statusnet_settings(&$a,&$s) { - if(! local_channel()) - return; - - $a->page['htmlhead'] .= '' . "\r\n"; - - /*** - * 1) Check that we have a base api url and a consumer key & secret - * 2) If no OAuthtoken & stuff is present, generate button to get some - * allow the user to cancel the connection process at this step - * 3) Checkbox for "Send public notices (respect size limitation) - */ - $api = get_pconfig(local_channel(), 'statusnet', 'baseapi'); - $ckey = get_pconfig(local_channel(), 'statusnet', 'consumerkey' ); - $csecret = get_pconfig(local_channel(), 'statusnet', 'consumersecret' ); - $otoken = get_pconfig(local_channel(), 'statusnet', 'oauthtoken' ); - $osecret = get_pconfig(local_channel(), 'statusnet', 'oauthsecret' ); - $enabled = get_pconfig(local_channel(), 'statusnet', 'post'); - $checked = (($enabled) ? 1 : false); - $defenabled = get_pconfig(local_channel(),'statusnet','post_by_default'); - $defchecked = (($defenabled) ? 1 : false); - //$shorteningenabled = get_pconfig(local_channel(),'statusnet','intelligent_shortening'); - //$shorteningchecked = (($shorteningenabled) ? 1 : false); - - if ( (!$ckey) && (!$csecret) ) { - /*** - * no consumer keys - */ - $globalsn = get_config('statusnet', 'sites'); - - /*** - * lets check if we have one or more globally configured GNU social - * server OAuth credentials in the configuration. If so offer them - * with a little explanation to the user as choice - otherwise - * ignore this option entirely. - */ - if (! $globalsn == null) { - $sc .= '

' . t('Globally Available GNU social OAuthKeys') . '

'; - $sc .= ''; - - foreach ($globalsn as $asn) { - $sc .= replace_macros(get_markup_template('field_radio.tpl'), array( - '$field' => array('statusnet-preconf-apiurl', $asn['sitename'], $asn['apiurl'], '') - )); - } - - $sc .= '
'; - $sc .= ''; - $sc .= '
'; - - } - - $sc .= '

' . t('Provide your own OAuth Credentials') . '

'; - $sc .= ''; - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('statusnet-consumerkey', t('OAuth Consumer Key'), '', '') - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('statusnet-consumersecret', t('OAuth Consumer Secret'), '', '') - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('statusnet-baseapi', t("Base API Path"), '', t("Remember the trailing /")) - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('statusnet-applicationname', t('GNU social application name'), '', '') - )); - - } else { - /*** - * ok we have a consumer key pair now look into the OAuth stuff - */ - if ( (!$otoken) && (!$osecret) ) { - - /*** - * the user has not yet connected the account to GNU social - * get a temporary OAuth key/secret pair and display a button with - * which the user can request a PIN to connect the account to a - * account at statusnet - */ - $connection = new StatusNetOAuth($api, $ckey, $csecret); - $request_token = $connection->getRequestToken('oob'); - $token = $request_token['oauth_token']; - - /*** - * make some nice form - */ - $sc .= ''; - $sc .= ''. t('Log in with GNU social') .''; - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('statusnet-pin', t('Copy the security code from GNU social here'), '', '') - )); - - $sc .= ''; - $sc .= ''; - - $sc .= '
'; - $sc .= ''; - $sc .= '
'; - - $sc .= '

'.t('Cancel Connection Process').'

'; - $sc .= ''; - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('statusnet-disconnect', t('Cancel GNU social Connection'), '', '', array(t('No'),t('Yes'))) - )); - - } else { - - /*** - * we have an OAuth key / secret pair for the user - * so let's give a chance to disable the postings to statusnet - */ - $connection = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret); - $details = $connection->get('account/verify_credentials'); - - $sc .= '

'. t('Currently connected to: ') .''.$details->screen_name.'
'.$details->description.'

'; - $sc .= '
'; - - if ($a->user['hidewall']) { - $sc .= ''; - } - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('statusnet-enable', t('Allow posting to GNU social'), $checked, t('If enabled your public postings can be posted to the associated Twitter account'), array(t('No'),t('Yes'))) - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('statusnet-default', t('Allow posting to GNU social'), $defchecked, t('If enabled your public postings will be posted to the associated Twitter account by default'), array(t('No'),t('Yes'))) - )); - - //FIXME: Doesn't seem to work. But maybe we don't want it all. - //$sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - // '$field' => array('statusnet-shortening', t('Shortening method that optimizes the post'), $shorteningchecked, '', array(t('No'),t('Yes'))) - //)); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('statusnet-disconnect', t('Clear OAuth configuration'), '', '', array(t('No'),t('Yes'))) - )); - - } - - } - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('statusnet', '' . t('GNU social Post Settings'), '', t('Submit')), - '$content' => $sc - )); - -} - - -function statusnet_post_local(&$a,&$b) { - if($b['edit']) - return; - - if((local_channel()) && (local_channel() == $b['uid']) && (! $b['item_private'])) { - - $statusnet_post = get_pconfig(local_channel(),'statusnet','post'); - $statusnet_enable = (($statusnet_post && x($_REQUEST,'statusnet_enable')) ? intval($_REQUEST['statusnet_enable']) : 0); - - // if API is used, default to the chosen settings - if($_REQUEST['api_source'] && intval(get_pconfig(local_channel(),'statusnet','post_by_default'))) - $statusnet_enable = 1; - - if(! $statusnet_enable) - return; - - if(strlen($b['postopts'])) - $b['postopts'] .= ','; - $b['postopts'] .= 'statusnet'; - } -} - -if (! function_exists( 'short_link' )) { -function short_link($url) { - require_once('library/slinky.php'); - $slinky = new Slinky( $url ); - $yourls_url = get_config('yourls','url1'); - if ($yourls_url) { - $yourls_username = get_config('yourls','username1'); - $yourls_password = get_config('yourls', 'password1'); - $yourls_ssl = get_config('yourls', 'ssl1'); - $yourls = new Slinky_YourLS(); - $yourls->set( 'username', $yourls_username ); - $yourls->set( 'password', $yourls_password ); - $yourls->set( 'ssl', $yourls_ssl ); - $yourls->set( 'yourls-url', $yourls_url ); - $slinky->set_cascade( array( $yourls, new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) ); - } - else { - // setup a cascade of shortening services - // try to get a short link from these services - // in the order ur1.ca, trim, id.gd, tinyurl - $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) ); - } - return $slinky->short(); -} }; - -function statusnet_shortenmsg($b, $max_char) { - require_once("include/bbcode.php"); - require_once("include/html2plain.php"); - - // Looking for the first image - $image = ''; - if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$b['body'],$matches)) - $image = $matches[3]; - - if ($image == '') - if(preg_match("/\[img\](.*?)\[\/img\]/is",$b['body'],$matches)) - $image = $matches[1]; - - $multipleimages = (strpos($b['body'], "[img") != strrpos($b['body'], "[img")); - - // When saved into the database the content is sent through htmlspecialchars - // That means that we have to decode all image-urls - $image = htmlspecialchars_decode($image); - - $body = $b["body"]; - if ($b["title"] != "") - $body = $b["title"]."\n\n".$body; - - if (strpos($body, "[bookmark") !== false) { - // splitting the text in two parts: - // before and after the bookmark - $pos = strpos($body, "[bookmark"); - $body1 = substr($body, 0, $pos); - $body2 = substr($body, $pos); - - // Removing all quotes after the bookmark - // they are mostly only the content after the bookmark. - $body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2); - $body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2); - $body = $body1.$body2; - } - - // Add some newlines so that the message could be cut better - $body = str_replace(array("[quote", "[bookmark", "[/bookmark]", "[/quote]"), - array("\n[quote", "\n[bookmark", "[/bookmark]\n", "[/quote]\n"), $body); - - // remove the recycle signs and the names since they aren't helpful on twitter - // recycle 1 - $recycle = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); - $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body); - // recycle 2 (Test) - $recycle = html_entity_decode("◌ ", ENT_QUOTES, 'UTF-8'); - $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body); - - // remove the share element - $body = preg_replace("/\[share(.*?)\](.*?)\[\/share\]/ism","\n\n$2\n\n",$body); - - // At first convert the text to html - $html = bbcode($body, false, false); - - // Then convert it to plain text - //$msg = trim($b['title']." \n\n".html2plain($html, 0, true)); - $msg = trim(html2plain($html, 0, true)); - $msg = html_entity_decode($msg,ENT_QUOTES,'UTF-8'); - - // Removing multiple newlines - while (strpos($msg, "\n\n\n") !== false) - $msg = str_replace("\n\n\n", "\n\n", $msg); - - // Removing multiple spaces - while (strpos($msg, " ") !== false) - $msg = str_replace(" ", " ", $msg); - - $origmsg = $msg; - - // Removing URLs - $msg = preg_replace('/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/i', "", $msg); - - $msg = trim($msg); - - $link = ''; - // look for bookmark-bbcode and handle it with priority - if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches)) - $link = $matches[1]; - - $multiplelinks = (strpos($b['body'], "[bookmark") != strrpos($b['body'], "[bookmark")); - - // If there is no bookmark element then take the first link - if ($link == '') { - $links = collecturls($html); - if (sizeof($links) > 0) { - reset($links); - $link = current($links); - } - $multiplelinks = (sizeof($links) > 1); - } - - $msglink = ""; - if ($multiplelinks) - $msglink = $b["plink"]; - else if ($link != "") - $msglink = $link; - else if ($multipleimages) - $msglink = $b["plink"]; - else if ($image != "") - $msglink = $image; - - if (($msglink == "") and strlen($msg) > $max_char) - $msglink = $b["plink"]; - - // If the message is short enough then don't modify it. (if the link exists in the original message) - if ((strlen(trim($origmsg)) <= $max_char) AND (strpos($origmsg, $msglink) OR ($msglink == ""))) - return(array("msg"=>trim($origmsg), "image"=>"")); - - if (strlen($msglink) > 20) - $msglink = short_link($msglink); - - if (strlen(trim($msg." ".$msglink)) > $max_char) { - $msg = substr($msg, 0, $max_char - (strlen($msglink))); - $lastchar = substr($msg, -1); - $msg = substr($msg, 0, -1); - $pos = strrpos($msg, "\n"); - if ($pos > 0) - $msg = substr($msg, 0, $pos); - else if ($lastchar != "\n") - $msg = substr($msg, 0, -3)."..."; - } - $msg = str_replace("\n", " ", $msg); - - // Removing multiple spaces - again - while (strpos($msg, " ") !== false) - $msg = str_replace(" ", " ", $msg); - - return(array("msg"=>trim($msg." ".$msglink), "image"=>$image)); -} - -function statusnet_post_hook(&$a,&$b) { - - /** - * Post to statusnet - */ - - if((! is_item_normal($b)) || $b['item_private'] || ($b['created'] !== $b['edited'])) - return; - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - if(! strstr($b['postopts'],'statusnet')) - return; - - if($b['parent'] != $b['id']) - return; - - // if posts comes from statusnet don't send it back - if($b['app'] == "StatusNet") - return; - - logger('statusnet post invoked'); - - load_pconfig($b['uid'], 'statusnet'); - - $api = get_pconfig($b['uid'], 'statusnet', 'baseapi'); - $ckey = get_pconfig($b['uid'], 'statusnet', 'consumerkey'); - $csecret = get_pconfig($b['uid'], 'statusnet', 'consumersecret'); - $otoken = get_pconfig($b['uid'], 'statusnet', 'oauthtoken'); - $osecret = get_pconfig($b['uid'], 'statusnet', 'oauthsecret'); - $intelligent_shortening = get_pconfig($b['uid'], 'statusnet', 'intelligent_shortening'); - - // Global setting overrides this - if (get_config('statusnet','intelligent_shortening')) - $intelligent_shortening = get_config('statusnet','intelligent_shortening'); - - if($ckey && $csecret && $otoken && $osecret) { - - require_once('include/bbcode.php'); - $dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret); - $max_char = $dent->get_maxlength(); // max. length for a dent - // we will only work with up to two times the length of the dent - // we can later send to GNU social. This way we can "gain" some - // information during shortening of potential links but do not - // shorten all the links in a 200000 character long essay. - - $tempfile = ""; - $intelligent_shortening = get_config('statusnet','intelligent_shortening'); - if (!$intelligent_shortening) { - if (! $b['title']=='') { - $tmp = $b['title'].": \n".$b['body']; - // $tmp = substr($tmp, 0, 4*$max_char); - } else { - $tmp = $b['body']; // substr($b['body'], 0, 3*$max_char); - } - // if [url=bla][img]blub.png[/img][/url] get blub.png - $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp); - // preserve links to images, videos and audios - $tmp = preg_replace( '/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism', '$3', $tmp); - $tmp = preg_replace( '/\[\\/?img(\\s+.*?\]|\])/i', '', $tmp); - $tmp = preg_replace( '/\[\\/?video(\\s+.*?\]|\])/i', '', $tmp); - $tmp = preg_replace( '/\[\\/?youtube(\\s+.*?\]|\])/i', '', $tmp); - $tmp = preg_replace( '/\[\\/?vimeo(\\s+.*?\]|\])/i', '', $tmp); - $tmp = preg_replace( '/\[\\/?audio(\\s+.*?\]|\])/i', '', $tmp); - $linksenabled = get_pconfig($b['uid'],'statusnet','post_taglinks'); - // if a #tag is linked, don't send the [url] over to SN - // that is, don't send if the option is not set in the - // connector settings - if ($linksenabled=='0') { - // #-tags - $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp); - // @-mentions - $tmp = preg_replace( '/@\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '@$2', $tmp); - // recycle 1 - $recycle = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); - $tmp = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', $recycle.'$2', $tmp); - // recycle 2 (test) - $recycle = html_entity_decode("◌ ", ENT_QUOTES, 'UTF-8'); - $tmp = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', $recycle.'$2', $tmp); - } - // preserve links to webpages - $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp); - $tmp = preg_replace( '/\[bookmark\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/bookmark\]/i', '$2 $1', $tmp); - // find all http or https links in the body of the entry and - // apply the shortener if the link is longer then 20 characters - if (( strlen($tmp)>$max_char ) && ( $max_char > 0 )) { - preg_match_all ( '/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/i', $tmp, $allurls ); - foreach ($allurls as $url) { - foreach ($url as $u) { - if (strlen($u)>20) { - $sl = short_link($u); - $tmp = str_replace( $u, $sl, $tmp ); - } - } - } - } - // ok, all the links we want to send out are save, now strip - // away the remaining bbcode - //$msg = strip_tags(bbcode($tmp, false, false)); - $msg = bbcode($tmp, false, false, true); - $msg = str_replace(array('
','
'),"\n",$msg); - $msg = strip_tags($msg); - - // quotes not working - let's try this - $msg = html_entity_decode($msg); - - if (( strlen($msg) > $max_char) && $max_char > 0) { - $shortlink = short_link( $b['plink'] ); - // the new message will be shortened such that "... $shortlink" - // will fit into the character limit - $msg = nl2br(substr($msg, 0, $max_char-strlen($shortlink)-4)); - $msg = str_replace(array('
','
'),' ',$msg); - $e = explode(' ', $msg); - // remove the last word from the cut down message to - // avoid sending cut words to the MicroBlog - array_pop($e); - $msg = implode(' ', $e); - $msg .= '... ' . $shortlink; - } - - $msg = trim($msg); - $postdata = array('status' => $msg); - } else { - $msgarr = statusnet_shortenmsg($b, $max_char); - $msg = $msgarr["msg"]; - $image = $msgarr["image"]; - if ($image != "") { - $imagedata = file_get_contents($image); - $tempfile = tempnam(get_config("system","temppath"), "upload"); - file_put_contents($tempfile, $imagedata); - $postdata = array("status"=>$msg, "media"=>"@".$tempfile); - } else - $postdata = array("status"=>$msg); - } - - // and now dent it :-) - if(strlen($msg)) { - //$result = $dent->post('statuses/update', array('status' => $msg)); - $result = $dent->post('statuses/update', $postdata); - logger('statusnet_post send, result: ' . print_r($result, true). - "\nmessage: ".$msg, LOGGER_DEBUG); - logger("Original post: ".print_r($b, true)."\nPost Data: ".print_r($postdata, true), LOGGER_DEBUG); - if ($result->error) { - logger('Send to GNU social failed: "' . $result->error . '"'); - } - } - if ($tempfile != "") - unlink($tempfile); - } -} - -function statusnet_plugin_admin_post(&$a){ - - $sites = array(); - - foreach($_POST['sitename'] as $id=>$sitename){ - $sitename=trim($sitename); - $apiurl=trim($_POST['apiurl'][$id]); - $secret=trim($_POST['secret'][$id]); - $key=trim($_POST['key'][$id]); - $applicationname = ((x($_POST, 'applicationname')) ? notags(trim($_POST['applicationname'][$id])):''); - if ($sitename!="" && - $apiurl!="" && - $secret!="" && - $key!="" && - !x($_POST['delete'][$id])){ - - $sites[] = Array( - 'sitename' => $sitename, - 'apiurl' => $apiurl, - 'consumersecret' => $secret, - 'consumerkey' => $key, - 'applicationname' => $applicationname - ); - } - } - - $sites = set_config('statusnet','sites', $sites); - -} - -function statusnet_plugin_admin(&$a, &$o){ - - $sites = get_config('statusnet','sites'); - $sitesform=array(); - if (is_array($sites)){ - foreach($sites as $id=>$s){ - $sitesform[] = Array( - 'sitename' => Array("sitename[$id]", "Site name", $s['sitename'], ""), - 'apiurl' => Array("apiurl[$id]", "Api url", $s['apiurl'], ""), - 'secret' => Array("secret[$id]", "Secret", $s['consumersecret'], ""), - 'key' => Array("key[$id]", "Key", $s['consumerkey'], ""), - 'applicationname' => Array("applicationname[$id]", "Application name", $s['applicationname'], ""), - 'delete' => Array("delete[$id]", "Delete", False , "Check to delete this preset"), - ); - } - } - /* empty form to add new site */ - $id++; - $sitesform[] = Array( - 'sitename' => Array("sitename[$id]", t("Site name"), "", ""), - 'apiurl' => Array("apiurl[$id]", t("API URL"), "", ""), - 'secret' => Array("secret[$id]", t("Consumer Secret"), "", ""), - 'key' => Array("key[$id]", t("Consumer Key"), "", ""), - 'applicationname' => Array("applicationname[$id]", t("Application name"), "", ""), - ); - - $t = get_markup_template( "admin.tpl", "addon/statusnet/" ); - $o = replace_macros($t, array( - '$submit' => t('Submit'), - '$sites' => $sitesform, - )); -} - -function statusnet_cron($a,$b) { - $last = get_config('statusnet','last_poll'); - - $poll_interval = intval(get_config('statusnet','poll_interval')); - if(! $poll_interval) - $poll_interval = STATUSNET_DEFAULT_POLL_INTERVAL; - - if($last) { - $next = $last + ($poll_interval * 60); - if($next > time()) { - logger('statusnet: poll intervall not reached'); - return; - } - } - logger('statusnet: cron_start'); - - $rand = db_getfunc('rand'); - - $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'statusnet' AND `k` = 'mirror_posts' AND `v` = '1' ORDER BY $rand "); - if(count($r)) { - foreach($r as $rr) { - logger('statusnet: fetching for user '.$rr['uid']); - statusnet_fetchtimeline($a, $rr['uid']); - } - } - - logger('statusnet: cron_end'); - - set_config('statusnet','last_poll', time()); -} - -function statusnet_fetchtimeline($a, $uid) { - $ckey = get_pconfig($uid, 'statusnet', 'consumerkey'); - $csecret = get_pconfig($uid, 'statusnet', 'consumersecret'); - $api = get_pconfig($uid, 'statusnet', 'baseapi'); - $otoken = get_pconfig($uid, 'statusnet', 'oauthtoken'); - $osecret = get_pconfig($uid, 'statusnet', 'oauthsecret'); - $lastid = get_pconfig($uid, 'statusnet', 'lastid'); - - // get the application name for the SN app - // 1st try personal config, then system config and fallback to the - // hostname of the node if neither one is set. - $application_name = get_pconfig( $uid, 'statusnet', 'application_name'); - if ($application_name == "") - $application_name = get_config('statusnet', 'application_name'); - if ($application_name == "") - $application_name = $a->get_hostname(); - - $connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret); - - $parameters = array("exclude_replies" => true, "trim_user" => true, "contributor_details" => false, "include_rts" => false); - - $first_time = ($lastid == ""); - - if ($lastid <> "") - $parameters["since_id"] = $lastid; - - $items = $connection->get('statuses/user_timeline', $parameters); - - if (!is_array($items)) - return; - - $posts = array_reverse($items); - - if (count($posts)) { - foreach ($posts as $post) { - if ($post->id > $lastid) - $lastid = $post->id; - - if ($first_time) - continue; - - if (is_object($post->retweeted_status)) - continue; - - if ($post->in_reply_to_status_id != "") - continue; - - if (!strpos($post->source, $application_name)) { - - $_REQUEST["type"] = "wall"; - $_REQUEST["api_source"] = true; - $_REQUEST["profile_uid"] = $uid; - $_REQUEST["source"] = "StatusNet"; - - //$_REQUEST["date"] = $post->created_at; - - $_REQUEST["body"] = $post->text; - if (is_string($post->place->name)) - $_REQUEST["location"] = $post->place->name; - - if (is_string($post->place->full_name)) - $_REQUEST["location"] = $post->place->full_name; - - if (is_array($post->geo->coordinates)) - $_REQUEST["coord"] = $post->geo->coordinates[0]." ".$post->geo->coordinates[1]; - - if (is_array($post->coordinates->coordinates)) - $_REQUEST["coord"] = $post->coordinates->coordinates[1]." ".$post->coordinates->coordinates[0]; - - //print_r($_REQUEST); - if ($_REQUEST["body"] != "") { - logger('statusnet: posting for user '.$uid); - - require_once('mod/item.php'); - item_post($a); - } - } - } - } - set_pconfig($uid, 'statusnet', 'lastid', $lastid); -} - diff --git a/sources/extend/addon/matrix/statusnet/view/tpl/admin.tpl b/sources/extend/addon/matrix/statusnet/view/tpl/admin.tpl deleted file mode 100644 index f8d14c69..00000000 --- a/sources/extend/addon/matrix/statusnet/view/tpl/admin.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{{foreach $sites as $s}} - {{include file="field_input.tpl" field=$s.sitename}} - {{include file="field_input.tpl" field=$s.apiurl}} - {{include file="field_input.tpl" field=$s.secret}} - {{include file="field_input.tpl" field=$s.key}} - {{include file="field_input.tpl" field=$s.applicationname}} - {{if $s.delete}} - {{include file="field_checkbox.tpl" field=$s.delete}} -
- {{else}} -

Fill this form to add a new site

- {{/if}} - -{{/foreach}} - - -
diff --git a/sources/extend/addon/matrix/superblock/superblock.css b/sources/extend/addon/matrix/superblock/superblock.css deleted file mode 100644 index e69de29b..00000000 diff --git a/sources/extend/addon/matrix/superblock/superblock.php b/sources/extend/addon/matrix/superblock/superblock.php deleted file mode 100644 index 3d34c749..00000000 --- a/sources/extend/addon/matrix/superblock/superblock.php +++ /dev/null @@ -1,207 +0,0 @@ - - * - */ - -function superblock_load() { - - register_hook('feature_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings'); - register_hook('feature_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post'); - register_hook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start'); - register_hook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu'); - register_hook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store'); - register_hook('directory_item', 'addon/superblock/superblock.php', 'superblock_directory_item'); - -} - - -function superblock_unload() { - - unregister_hook('feature_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings'); - unregister_hook('feature_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post'); - unregister_hook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start'); - unregister_hook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu'); - unregister_hook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store'); - unregister_hook('directory_item', 'addon/superblock/superblock.php', 'superblock_directory_item'); - -} - - - - - -function superblock_addon_settings(&$a,&$s) { - - if(! local_channel()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - //if(! array_key_exists('htmlhead',$a->page)) - //$a->page['htmlhead'] = ''; - //$a->page['htmlhead'] .= '' . "\r\n"; - - $words = get_pconfig(local_channel(),'system','blocked'); - if(! $words) - $words = ''; - - $sc .= replace_macros(get_markup_template('field_textarea.tpl'), array( - '$field' => array('superblock-words', t('Comma separated profile URLS to block'), htmlspecialchars($words), ''), - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('superblock', t('"Superblock" Settings'), '', t('Submit')), - '$content' => $sc - )); - - return; - -} - -function superblock_addon_settings_post(&$a,&$b) { - - if(! local_channel()) - return; - - if($_POST['superblock-submit']) { - set_pconfig(local_channel(),'system','blocked',trim($_POST['superblock-words'])); - info( t('SUPERBLOCK Settings saved.') . EOL); - } -} - -function superblock_enotify_store(&$a,&$b) { - - $words = get_pconfig($b['uid'],'system','blocked'); - if($words) { - $arr = explode(',',$words); - } - else { - return; - } - - $found = false; - if(count($arr)) { - foreach($arr as $word) { - if(! strlen(trim($word))) { - continue; - } - - if(strpos($b['sender_hash'],$word) !== false) { - $found = true; - break; - } - } - } - if($found) { - $b['abort'] = true; - } -} - - -function superblock_directory_item(&$a,&$b) { - - if(! local_channel()) - return; - - $words = get_pconfig(local_channel(),'system','blocked'); - if($words) { - $arr = explode(',',$words); - } - else { - return; - } - - - $found = false; - if(count($arr)) { - foreach($arr as $word) { - if(! strlen(trim($word))) { - continue; - } - - if(strpos($b['entry']['hash'],$word) !== false) { - $found = true; - break; - } - } - } - if($found) { - unset($b['entry']); - } -} - - -function superblock_conversation_start(&$a,&$b) { - - if(! local_channel()) - return; - - $words = get_pconfig(local_channel(),'system','blocked'); - if($words) { - $a->data['superblock'] = explode(',',$words); - } - - if(! array_key_exists('htmlhead',$a->page)) - $a->page['htmlhead'] = ''; - - $a->page['htmlhead'] .= <<< EOT - - - -EOT; - -} - -function superblock_item_photo_menu(&$a,&$b) { - - if(! local_channel()) - return; - - $blocked = false; - $author = $b['item']['author_xchan']; - if($a->channel['channel_hash'] == $author) - return; - - if(is_array($a->data['superblock'])) { - foreach($a->data['superblock'] as $bloke) { - if(link_compare($bloke,$author)) { - $blocked = true; - break; - } - } - } - - $b['menu'][ t('Block Completely')] = 'javascript:superblockBlock(\'' . $author . '\'); return false;'; -} - -function superblock_module() {} - - -function superblock_init(&$a) { - - if(! local_channel()) - return; - - $words = get_pconfig(local_channel(),'system','blocked'); - - if(array_key_exists('block',$_GET) && $_GET['block']) { - if(strlen($words)) - $words .= ','; - $words .= trim($_GET['block']); - } - - set_pconfig(local_channel(),'system','blocked',$words); - info( t('superblock settings updated') . EOL ); - killme(); -} diff --git a/sources/extend/addon/matrix/tictac/lang/C/messages.po b/sources/extend/addon/matrix/tictac/lang/C/messages.po deleted file mode 100644 index 5550d622..00000000 --- a/sources/extend/addon/matrix/tictac/lang/C/messages.po +++ /dev/null @@ -1,72 +0,0 @@ -# ADDON tictac -# Copyright (C) -# This file is distributed under the same license as the Friendica tictac addon package. -# -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-27 05:01-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: tictac.php:20 -msgid "Three Dimensional Tic-Tac-Toe" -msgstr "" - -#: tictac.php:53 -msgid "3D Tic-Tac-Toe" -msgstr "" - -#: tictac.php:58 -msgid "New game" -msgstr "" - -#: tictac.php:59 -msgid "New game with handicap" -msgstr "" - -#: tictac.php:60 -msgid "" -"Three dimensional tic-tac-toe is just like the traditional game except that " -"it is played on multiple levels simultaneously. " -msgstr "" - -#: tictac.php:61 -msgid "" -"In this case there are three levels. You win by getting three in a row on " -"any level, as well as up, down, and diagonally across the different levels." -msgstr "" - -#: tictac.php:63 -msgid "" -"The handicap game disables the center position on the middle level because " -"the player claiming this square often has an unfair advantage." -msgstr "" - -#: tictac.php:182 -msgid "You go first..." -msgstr "" - -#: tictac.php:187 -msgid "I'm going first this time..." -msgstr "" - -#: tictac.php:193 -msgid "You won!" -msgstr "" - -#: tictac.php:199 tictac.php:224 -msgid "\"Cat\" game!" -msgstr "" - -#: tictac.php:222 -msgid "I won!" -msgstr "" diff --git a/sources/extend/addon/matrix/tictac/lang/ca/strings.php b/sources/extend/addon/matrix/tictac/lang/ca/strings.php deleted file mode 100644 index 7bfc1c4f..00000000 --- a/sources/extend/addon/matrix/tictac/lang/ca/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Tres en línia Tridimensional"; -$a->strings["3D Tic-Tac-Toe"] = "Tres en línia 3D"; -$a->strings["New game"] = "Nou joc"; -$a->strings["New game with handicap"] = "Nou joc modificat"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "El joc del tres en línia tridimensional és com el joc tradicional, excepte que es juga en diversos nivells simultàniament."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "En aquest cas hi ha tres nivells. Vostè guanya per aconseguir tres en una fila en qualsevol nivell, així com dalt, baix i en diagonal a través dels diferents nivells."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "El joc modificat desactiva la posició central en el nivell mitjà perquè el jugador en aquesta posició té sovint un avantatge injust."; -$a->strings["You go first..."] = "Vostè va primer ..."; -$a->strings["I'm going first this time..."] = "Vaig primer aquesta vegada ..."; -$a->strings["You won!"] = "Has guanyat!"; -$a->strings["\"Cat\" game!"] = "Empat!"; -$a->strings["I won!"] = "Vaig guanyar!"; diff --git a/sources/extend/addon/matrix/tictac/lang/cs/strings.php b/sources/extend/addon/matrix/tictac/lang/cs/strings.php deleted file mode 100644 index d53b4bf9..00000000 --- a/sources/extend/addon/matrix/tictac/lang/cs/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "TrojrozmÄ›rné Tic-Tac-Toe"; -$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe"; -$a->strings["New game"] = "Nová hra"; -$a->strings["New game with handicap"] = "Nová hra s handicapem"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "TrojrozmÄ›rné tic-tac-toe je podobná této tradiÄní hÅ™e kromÄ› toho, že se hraje na více úrovních souÄasnÄ›."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "V tomto případÄ› existují tÅ™i úrovnÄ›. Vyhrajete tím, že dostane tÅ™i v Å™adÄ› na jakékoli úrovni, stejnÄ› jako nahoru, dolů a Å¡ikmo na různých úrovních."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Hra s handicapem zakáže centrální pozici na stÅ™ední úrovni, protože hrÃ¡Ä zaujímající tuto polohu má Äasto nespravedlivou výhodu."; -$a->strings["You go first..."] = "Vy zaÄnÄ›te ..."; -$a->strings["I'm going first this time..."] = "Tentokrát zaÄnu já..."; -$a->strings["You won!"] = "Vyhrál jste!"; -$a->strings["\"Cat\" game!"] = "\"KoÄiÄí\" hra!"; -$a->strings["I won!"] = "Vyhrál jsem!"; diff --git a/sources/extend/addon/matrix/tictac/lang/de/strings.php b/sources/extend/addon/matrix/tictac/lang/de/strings.php deleted file mode 100644 index ef3974fa..00000000 --- a/sources/extend/addon/matrix/tictac/lang/de/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe"; -$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe"; -$a->strings["New game"] = "Neues Spiel"; -$a->strings["New game with handicap"] = "Neues Handicap Spiel"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder diagonal auf verschiedenen Ebenen."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt, da der Spieler, der diese Ebene besitzt, oft einen unfairen Vorteil genießt."; -$a->strings["You go first..."] = "Du fängst an..."; -$a->strings["I'm going first this time..."] = "Diesmal fange ich an..."; -$a->strings["You won!"] = "Du gewinnst!"; -$a->strings["\"Cat\" game!"] = "Unentschieden!"; -$a->strings["I won!"] = "Ich gewinne!"; diff --git a/sources/extend/addon/matrix/tictac/lang/eo/strings.php b/sources/extend/addon/matrix/tictac/lang/eo/strings.php deleted file mode 100644 index 7d576ea1..00000000 --- a/sources/extend/addon/matrix/tictac/lang/eo/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Tri-dimensia Tiktakto"; -$a->strings["3D Tic-Tac-Toe"] = "3D Tiktakto"; -$a->strings["New game"] = "Nova ludo"; -$a->strings["New game with handicap"] = "Nova ludo kun handikapo"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Tri-dimensia tiktakto similas la tradician ludon, sed estas ludata sur pluraj ebenoj dum la sama tempo."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "Ĉi-kaze ekzistas tri ebenoj. Vi venkas vicigante tri signojn en una vico, en la sama ebeno, same kiel supren, malsupren aÅ­ diagonale, trans la ebenoj."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "La ludo kun handikapo malvalidigas la mezan pozicion sur la meza ebeno, ĉar la ludisto kio okupas ĉi tiun pozicion ĉiam havas avantaÄon."; -$a->strings["You go first..."] = "Estas via vico unue."; -$a->strings["I'm going first this time..."] = "Ĉi-tempe, unue estas mia vico."; -$a->strings["You won!"] = "Vi venkis!"; -$a->strings["\"Cat\" game!"] = "Sendecida ludo!"; -$a->strings["I won!"] = "Mi venkis!"; diff --git a/sources/extend/addon/matrix/tictac/lang/es/strings.php b/sources/extend/addon/matrix/tictac/lang/es/strings.php deleted file mode 100644 index 65a73531..00000000 --- a/sources/extend/addon/matrix/tictac/lang/es/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Tres en Raya tridimensional"; -$a->strings["3D Tic-Tac-Toe"] = "Tres en Raya 3D"; -$a->strings["New game"] = "Nueva partida"; -$a->strings["New game with handicap"] = "Nuevo juego con handicap"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Tres en Raya tridimensional es como el juego tradicional, excepto que se juega en varios niveles simultáneamente."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "En este caso hay tres niveles. Ganarás por conseguir tres en raya en cualquier nivel, así como arriba, abajo y en diagonal a través de los diferentes niveles."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "El juego con handicap desactiva la posición central en el nivel medio porque el jugador que la ocupa tiene a menudo una ventaja injusta."; -$a->strings["You go first..."] = "Comienzas tú..."; -$a->strings["I'm going first this time..."] = "Yo voy primero esta vez..."; -$a->strings["You won!"] = "¡Has ganado!"; -$a->strings["\"Cat\" game!"] = "¡Empate!"; -$a->strings["I won!"] = "¡He ganado!"; diff --git a/sources/extend/addon/matrix/tictac/lang/fr/strings.php b/sources/extend/addon/matrix/tictac/lang/fr/strings.php deleted file mode 100644 index 44a77c19..00000000 --- a/sources/extend/addon/matrix/tictac/lang/fr/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Morpion en trois dimensions"; -$a->strings["3D Tic-Tac-Toe"] = "Morpion 3D"; -$a->strings["New game"] = "Nouvelle partie"; -$a->strings["New game with handicap"] = "Nouvelle partie avec handicap"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Le morpion 3D, c'est comme la version traditionnelle. Sauf qu'on joue sur plusieurs étages en même temps."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "Dans le cas qui nous concerne, il y a trois étages. Vous gagnez en alignant trois coups dans n'importe quel étage, ainsi que verticalement ou en diagonale entre les étages."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Le handicap interdit la position centrale de l'étage du milieu, parce que le joueur qui prend cette case obtient souvent un avantage."; -$a->strings["You go first..."] = "À vous de jouer..."; -$a->strings["I'm going first this time..."] = "Je commence..."; -$a->strings["You won!"] = "Vous avez gagné!"; -$a->strings["\"Cat\" game!"] = "Match nul!"; -$a->strings["I won!"] = "J'ai gagné!"; diff --git a/sources/extend/addon/matrix/tictac/lang/is/strings.php b/sources/extend/addon/matrix/tictac/lang/is/strings.php deleted file mode 100644 index 81a1ac68..00000000 --- a/sources/extend/addon/matrix/tictac/lang/is/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Þrívíddar milla"; -$a->strings["3D Tic-Tac-Toe"] = "3D milla"; -$a->strings["New game"] = "Nýr leikur"; -$a->strings["New game with handicap"] = "Nýr leikur með forgjöf"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Þrívíddar milla er alveg einsog upphaflegi leikurinn nema spilað er á mörgum borðum í einu."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "à þessu tilviki þá eru þrjú borð. Þú vinnur með því að ná þremur í röð á hvaða borði sem er, upp, niður eða á ská yfir mörg borð."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Leikurinn með forgjöf slekkur á miðjunni á mið borðinu því sá sem nær þeim stað hefur yfir leitt yfirburði."; -$a->strings["You go first..."] = "Þú byrjar..."; -$a->strings["I'm going first this time..."] = "Ég byrja í þetta skiptið..."; -$a->strings["You won!"] = "Þú vannst!"; -$a->strings["\"Cat\" game!"] = "Jafntefli"; -$a->strings["I won!"] = "Ég vann!"; diff --git a/sources/extend/addon/matrix/tictac/lang/it/strings.php b/sources/extend/addon/matrix/tictac/lang/it/strings.php deleted file mode 100644 index 9323e8c0..00000000 --- a/sources/extend/addon/matrix/tictac/lang/it/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Tic-Tac-Toe tridimensionale"; -$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe"; -$a->strings["New game"] = "Nuova partita"; -$a->strings["New game with handicap"] = "Nuova partita con handicap"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Tic-tac-toe tridimensionale è come il gioco tradizionale, solo che si gioca su livelli multipli contemporaneamente."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "In questo caso ci sono tre livelli. Puoi vincere mettendo tre segni in fila su ogni livello, anche verso l'alto, il basso e diagonalmente anche attraverso i diversi livelli."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "L'handicap disabilita la casella centrale sul livello di mezzo, perchè il giocatore che si prende quella casella spesso ha un deciso vantaggio."; -$a->strings["You go first..."] = "Cominci tu..."; -$a->strings["I'm going first this time..."] = "Comincio io questa volta..."; -$a->strings["You won!"] = "Hai vinto!"; -$a->strings["\"Cat\" game!"] = "Stallo!"; -$a->strings["I won!"] = "Ho vinto!"; diff --git a/sources/extend/addon/matrix/tictac/lang/nb-no/strings.php b/sources/extend/addon/matrix/tictac/lang/nb-no/strings.php deleted file mode 100644 index 83f690c2..00000000 --- a/sources/extend/addon/matrix/tictac/lang/nb-no/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Tredimensjonal tre-pÃ¥-rad"; -$a->strings["3D Tic-Tac-Toe"] = "3D tre-pÃ¥-rad"; -$a->strings["New game"] = "Nytt spill"; -$a->strings["New game with handicap"] = "Nytt spill med handikapp"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Tredimensjonal tre-pÃ¥-rad er akkurat som det vanlige spillet, bortsett fra at det spilles pÃ¥ flere nivÃ¥er samtidig."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "I dette tilfellet er det tre nivÃ¥er. Du vinner ved Ã¥ fÃ¥ tre pÃ¥ rad pÃ¥ ethvert nivÃ¥, samt opp, ned og diagonalt pÃ¥ tvers av forskjellige nivÃ¥er."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Handicap-spillet skrur av midtposisjonen pÃ¥ det midtre nivÃ¥et, fordi spilleren som tar denne posisjonen ofte fÃ¥r en urettferdig fordel."; -$a->strings["You go first..."] = "Du starter først..."; -$a->strings["I'm going first this time..."] = "Jeg starter først denne gangen..."; -$a->strings["You won!"] = "Du vant!"; -$a->strings["\"Cat\" game!"] = "\"Katte\"-spill!"; -$a->strings["I won!"] = "Jeg vant!"; diff --git a/sources/extend/addon/matrix/tictac/lang/pl/strings.php b/sources/extend/addon/matrix/tictac/lang/pl/strings.php deleted file mode 100644 index 265178e6..00000000 --- a/sources/extend/addon/matrix/tictac/lang/pl/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Trójwymiarowy Kółko i krzyżyk"; -$a->strings["3D Tic-Tac-Toe"] = "Kółko i krzyżyk 3D"; -$a->strings["New game"] = "Nowa gra"; -$a->strings["New game with handicap"] = "Nowa gra z utrudnieniem"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Trójwymiarowy tic-tac-toe jest taki sam jak tradycyjna gra, nie liczÄ…c tego, że jest grana na kilku poziomach jednoczeÅ›nie."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "W tym przypadku sÄ… trzy poziomy. Wygrywasz poprzez zdobycie trójki w szeregu na którymkolwiek z poziomów zarówno u góry, na dole, jak i na ukos poprzez kilka różnych poziomów."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = ""; -$a->strings["You go first..."] = "Ty pierwszy..."; -$a->strings["I'm going first this time..."] = "Zaczynam..."; -$a->strings["You won!"] = "WygraÅ‚eÅ›!"; -$a->strings["\"Cat\" game!"] = "Gra \"Kot\"!"; -$a->strings["I won!"] = "WygraÅ‚em!"; diff --git a/sources/extend/addon/matrix/tictac/lang/pt-br/strings.php b/sources/extend/addon/matrix/tictac/lang/pt-br/strings.php deleted file mode 100644 index ea569f06..00000000 --- a/sources/extend/addon/matrix/tictac/lang/pt-br/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Jogo da Velha tridimensional"; -$a->strings["3D Tic-Tac-Toe"] = "Jogo da Velha 3D"; -$a->strings["New game"] = "Novo jogo"; -$a->strings["New game with handicap"] = "Novo jogo com limitador"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "O Jogo da Velha tridimensional é similar ao jogo tradicional, com a exceção que ele é jogado simultaneamente em múltiplos níveis."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "Neste caso, existem três níveis. Ganha quem conseguir alinhar três casas, não só no mesmo nível como também pra cima, pra baixo ou na diagonal entre os níveis."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "O jogo com limitador desabilita a posição central do nível do meio, uma vez que o jogador que obtém essa casa ganha uma vantagem desleal."; -$a->strings["You go first..."] = "Você começa..."; -$a->strings["I'm going first this time..."] = "Eu vou começar desta vez..."; -$a->strings["You won!"] = "Você ganhou!"; -$a->strings["\"Cat\" game!"] = "Empatamos!"; -$a->strings["I won!"] = "Eu ganhei!"; diff --git a/sources/extend/addon/matrix/tictac/lang/ru/strings.php b/sources/extend/addon/matrix/tictac/lang/ru/strings.php deleted file mode 100644 index cc8dae95..00000000 --- a/sources/extend/addon/matrix/tictac/lang/ru/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Трехмерные креÑтики-нолики"; -$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe"; -$a->strings["New game"] = "ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð°"; -$a->strings["New game with handicap"] = "ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð° Ñ Ð³Ð°Ð½Ð´Ð¸ÐºÐ°Ð¿Ð¾Ð¼"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Ð¢Ñ€ÐµÑ…Ð¼ÐµÑ€Ð½Ð°Ñ Ð¸Ð³Ñ€Ð° в креÑтики-нолики точно Ñ‚Ð°ÐºÐ°Ñ Ð¶Ðµ, как Ñ‚Ñ€Ð°Ð´Ð¸Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¸Ð³Ñ€Ð°, за иÑключением того, что она играетÑÑ Ð½Ð° неÑкольких уровнÑÑ… одновременно."; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "Ð’ Ñтом Ñлучае ÑущеÑтвуют три уровнÑ. Ð’Ñ‹ выиграете, поÑтавив три в Ñ€Ñд на любом уровне, а также вверх, вниз и по диагонали на разных уровнÑÑ…."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Игра Ñ Ð³Ð°Ð½Ð´Ð¸ÐºÐ°Ð¿Ð¾Ð¼ отключает центральное положение на Ñреднем уровне, потому что игрок, занимающий Ñту площадь, чаÑто имеет неÑправедливое преимущеÑтво."; -$a->strings["You go first..."] = "Ð’Ñ‹ хотите первым..."; -$a->strings["I'm going first this time..."] = "Я буду первым на Ñтот раз..."; -$a->strings["You won!"] = "Ð’Ñ‹ выиграли!"; -$a->strings["\"Cat\" game!"] = "Игра \"Кошка\"!"; -$a->strings["I won!"] = "Я выиграл!"; diff --git a/sources/extend/addon/matrix/tictac/lang/sv/strings.php b/sources/extend/addon/matrix/tictac/lang/sv/strings.php deleted file mode 100644 index 65f09512..00000000 --- a/sources/extend/addon/matrix/tictac/lang/sv/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "Tredimensionellt luffarschack"; -$a->strings["3D Tic-Tac-Toe"] = "3D-luffarschack"; -$a->strings["New game"] = "Ny spelomgång"; -$a->strings["New game with handicap"] = "Ny spelomgång med handikapp"; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Det tredimensionella luffarschacket är precis som vanligt luffarschack förutom att det spelas i flera nivåer samtidigt. "; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "Här är det tre nivåer. Man vinner om man får tre i rad på vilken nivå som helst, eller uppåt, nedåt eller diagonalt på flera nivåer."; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Om man spelar med handikapp så stängs mittenpositionen på mittennivån av eftersom spelare som väljer den positionen ofta får övertaget."; -$a->strings["You go first..."] = "Du börjar..."; -$a->strings["I'm going first this time..."] = "Jag börjar den här gången..."; -$a->strings["You won!"] = "Du vann!"; -$a->strings["\"Cat\" game!"] = "\"Cat\" game!"; -$a->strings["I won!"] = "Jag vann!"; diff --git a/sources/extend/addon/matrix/tictac/lang/zh-cn/strings.php b/sources/extend/addon/matrix/tictac/lang/zh-cn/strings.php deleted file mode 100644 index 9152e996..00000000 --- a/sources/extend/addon/matrix/tictac/lang/zh-cn/strings.php +++ /dev/null @@ -1,14 +0,0 @@ -strings["Three Dimensional Tic-Tac-Toe"] = "三维井字棋"; -$a->strings["3D Tic-Tac-Toe"] = "三维井字棋"; -$a->strings["New game"] = "新游æˆ"; -$a->strings["New game with handicap"] = "新游æˆä¸åˆ©æ¡ä»¶ "; -$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "三维井字棋跟传统的一样,除了完åŒæ—¶åœ¨å¤šæ°´å¹³ã€‚"; -$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "这游æˆæœ‰ä¸‰æ°´å¹³ã€‚您赢ç»è¿‡å®žçŽ°ä¸‰ä¸€è¿žåœ¨ä»»ä½•æ°´å¹³ï¼Œä¸äºšäºŽä¸Šï¼Œä¸‹ï¼Œå’Œå€¾æ–œè·¨è¶Šä¸‰æ°´å¹³ã€‚"; -$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "ä¸åˆ©æ¡ä»¶æ¸¸æˆä½¿ä¸­é—´ä½ç½®ä¸èƒ½ç”¨å› ä¸ºå ç”¨ç€é€‰æ‰‹å¸¸å¸¸æœ‰ä¸å¹³çš„好处。"; -$a->strings["You go first..."] = "您先下..."; -$a->strings["I'm going first this time..."] = "这次我先下..."; -$a->strings["You won!"] = "您赢了ï¼"; -$a->strings["\"Cat\" game!"] = "「猫å­ã€æ¸¸æˆï¼"; -$a->strings["I won!"] = "我赢了ï¼"; diff --git a/sources/extend/addon/matrix/tictac/tictac.apd b/sources/extend/addon/matrix/tictac/tictac.apd deleted file mode 100644 index e87f9802..00000000 --- a/sources/extend/addon/matrix/tictac/tictac.apd +++ /dev/null @@ -1,3 +0,0 @@ -url: $baseurl/tictac -name: Tic-Tac -photo: $baseurl/addon/tictac/tictac.png diff --git a/sources/extend/addon/matrix/tictac/tictac.php b/sources/extend/addon/matrix/tictac/tictac.php deleted file mode 100755 index 2922f9ca..00000000 --- a/sources/extend/addon/matrix/tictac/tictac.php +++ /dev/null @@ -1,665 +0,0 @@ - - */ - - -function tictac_load() { - register_hook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu'); -} - -function tictac_unload() { - unregister_hook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu'); - -} - -function tictac_app_menu($a,&$b) { - $b['app_menu'][] = ''; -} - - -function tictac_module() { - return; -} - - - - - -function tictac_content(&$a) { - - $o = ''; - - if($_POST['move']) { - $handicap = $a->argv[1]; - $mefirst = $a->argv[2]; - $dimen = $a->argv[3]; - $yours = $a->argv[4]; - $mine = $a->argv[5]; - - $yours .= $_POST['move']; - } - elseif($a->argc > 1) { - $handicap = $a->argv[1]; - $dimen = 3; - } - else { - $dimen = 3; - } - - $o .= '

' . t('3D Tic-Tac-Toe') . '


'; - - $t = new tictac($dimen,$handicap,$mefirst,$yours,$mine); - $o .= $t->play(); - - $o .= '' . t('New game') . '
'; - $o .= '' . t('New game with handicap') . '
'; - $o .= '

' . t('Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. '); - $o .= t('In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels.'); - $o .= '

'; - $o .= t('The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage.'); - $o .= '

'; - - return $o; - -} - -class tictac { - private $dimen; - private $first_move = true; - private $handicap = 0; - private $yours; - private $mine; - private $winning_play; - private $you; - private $me; - private $debug = 1; - private $crosses = array('011','101','110','112','121','211'); - -/* - '001','010','011','012','021', - '101','110','111','112','121', - '201','210','211','212','221'); -*/ - - private $corners = array( - '000','002','020','022', - '200','202','220','222'); - - private $planes = array( - array('000','001','002','010','011','012','020','021','022'), // horiz 1 - array('100','101','102','110','111','112','120','121','122'), // 2 - array('200','201','202','210','211','212','220','221','222'), // 3 - array('000','010','020','100','110','120','200','210','220'), // vert left - array('000','001','002','100','101','102','200','201','202'), // vert top - array('002','012','022','102','112','122','202','212','222'), // vert right - array('020','021','022','120','121','122','220','221','222'), // vert bot - array('010','011','012','110','111','112','210','211','212'), // left vertx - array('001','011','021','101','111','221','201','211','221'), // top vertx - array('000','001','002','110','111','112','220','221','222'), // diag top - array('020','021','022','110','111','112','200','201','202'), // diag bot - array('000','010','020','101','111','121','202','212','222'), // diag left - array('002','012','022','101','111','121','200','210','220'), // diag right - array('002','011','020','102','111','120','202','211','220'), // diag x - array('000','011','022','100','111','122','200','211','222') // diag x - - ); - - - private $winner = array( - array('000','001','002'), // board 0 winners - left corner across - array('000','010','020'), // down - array('000','011','022'), // diag - array('001','011','021'), // middle-top down - array('010','011','012'), // middle-left across - array('002','011','020'), // right-top diag - array('002','012','022'), // right-top down - array('020','021','022'), // bottom-left across - array('100','101','102'), // board 1 winners - array('100','110','120'), - array('100','111','122'), - array('101','111','121'), - array('110','111','112'), - array('102','111','120'), - array('102','112','122'), - array('120','121','122'), - array('200','201','202'), // board 2 winners - array('200','210','220'), - array('200','211','222'), - array('201','211','221'), - array('210','211','212'), - array('202','211','220'), - array('202','212','222'), - array('220','221','222'), - array('000','100','200'), // top-left corner 3d - array('000','101','202'), - array('000','110','220'), - array('000','111','222'), - array('001','101','201'), // top-middle 3d - array('001','111','221'), - array('002','102','202'), // top-right corner 3d - array('002','101','200'), - array('002','112','222'), - array('002','111','220'), - array('010','110','210'), // left-middle 3d - array('010','111','212'), - array('011','111','211'), // middle-middle 3d - array('012','112','212'), // right-middle 3d - array('012','111','210'), - array('020','120','220'), // bottom-left corner 3d - array('020','110','200'), - array('020','121','222'), - array('020','111','202'), - array('021','121','221'), // bottom-middle 3d - array('021','111','201'), - array('022','122','222'), // bottom-right corner 3d - array('022','121','220'), - array('022','112','202'), - array('022','111','200') - - ); - - function __construct($dimen,$handicap,$mefirst,$yours,$mine) { - $this->dimen = 3; - $this->handicap = (($handicap) ? 1 : 0); - $this->mefirst = (($mefirst) ? 1 : 0); - $this->yours = str_replace('XXX','',$yours); - $this->mine = $mine; - $this->you = $this->parse_moves('you'); - $this->me = $this->parse_moves('me'); - - if(strlen($yours)) - $this->first_move = false; - } - - function play() { - - if($this->first_move) { - if(rand(0,1) == 1) { - $o .= '
' . t('You go first...') . '

'; - $this->mefirst = 0; - $o .= $this->draw_board(); - return $o; - } - $o .= '
' . t('I\'m going first this time...') . '

'; - $this->mefirst = 1; - - } - - if($this->check_youwin()) { - $o .= '
' . t('You won!') . '

'; - $o .= $this->draw_board(); - return $o; - } - - if($this->fullboard()) - $o .= '
' . t('"Cat" game!') . '

'; - - $move = $this->winning_move(); - if(strlen($move)) { - $this->mine .= $move; - $this->me = $this->parse_moves('me'); - } - else { - $move = $this->defensive_move(); - if(strlen($move)) { - $this->mine .= $move; - $this->me = $this->parse_moves('me'); - } - else { - $move = $this->offensive_move(); - if(strlen($move)) { - $this->mine .= $move; - $this->me = $this->parse_moves('me'); - } - } - } - - if($this->check_iwon()) - $o .= '
' . t('I won!') . '

'; - if($this->fullboard()) - $o .= '
' . t('"Cat" game!') . '

'; - $o .= $this->draw_board(); - return $o; - } - - function parse_moves($player) { - if($player == 'me') - $str = $this->mine; - if($player == 'you') - $str = $this->yours; - $ret = array(); - while(strlen($str)) { - $ret[] = substr($str,0,3); - $str = substr($str,3); - } - return $ret; - } - - - function check_youwin() { - for($x = 0; $x < count($this->winner); $x ++) { - if(in_array($this->winner[$x][0],$this->you) && in_array($this->winner[$x][1],$this->you) && in_array($this->winner[$x][2],$this->you)) { - $this->winning_play = $this->winner[$x]; - return true; - } - } - return false; - } - function check_iwon() { - for($x = 0; $x < count($this->winner); $x ++) { - if(in_array($this->winner[$x][0],$this->me) && in_array($this->winner[$x][1],$this->me) && in_array($this->winner[$x][2],$this->me)) { - $this->winning_play = $this->winner[$x]; - return true; - } - } - return false; - } - function defensive_move() { - - for($x = 0; $x < count($this->winner); $x ++) { - if(($this->handicap) && in_array('111',$this->winner[$x])) - continue; - if(in_array($this->winner[$x][0],$this->you) && in_array($this->winner[$x][1],$this->you) && (! in_array($this->winner[$x][2],$this->me))) - return($this->winner[$x][2]); - if(in_array($this->winner[$x][0],$this->you) && in_array($this->winner[$x][2],$this->you) && (! in_array($this->winner[$x][1],$this->me))) - return($this->winner[$x][1]); - if(in_array($this->winner[$x][1],$this->you) && in_array($this->winner[$x][2],$this->you) && (! in_array($this->winner[$x][0],$this->me))) - return($this->winner[$x][0]); - } - return ''; - } - -function winning_move() { - - for($x = 0; $x < count($this->winner); $x ++) { - if(($this->handicap) && in_array('111',$this->winner[$x])) - continue; - if(in_array($this->winner[$x][0],$this->me) && in_array($this->winner[$x][1],$this->me) && (! in_array($this->winner[$x][2],$this->you))) - return($this->winner[$x][2]); - if(in_array($this->winner[$x][0],$this->me) && in_array($this->winner[$x][2],$this->me) && (! in_array($this->winner[$x][1],$this->you))) - return($this->winner[$x][1]); - if(in_array($this->winner[$x][1],$this->me) && in_array($this->winner[$x][2],$this->me) && (! in_array($this->winner[$x][0],$this->you))) - return($this->winner[$x][0]); - } - -} - - function offensive_move() { - - shuffle($this->planes); - shuffle($this->winner); - shuffle($this->corners); - shuffle($this->crosses); - - if(! count($this->me)) { - if($this->handicap) { - $p = $this->uncontested_plane(); - foreach($this->corners as $c) - if((in_array($c,$p)) - && (! $this->is_yours($c)) && (! $this->is_mine($c))) - return($c); - } - else { - if((! $this->marked_yours(1,1,1)) && (! $this->marked_mine(1,1,1))) - return '111'; - $p = $this->uncontested_plane(); - foreach($this->crosses as $c) - if((in_array($c,$p)) - && (! $this->is_yours($c)) && (! $this->is_mine($c))) - return($c); - } - } - - if($this->handicap) { - if(count($this->me) >= 1) { - if(count($this->get_corners($this->me)) == 1) { - if(in_array($this->me[0],$this->corners)) { - $p = $this->my_best_plane(); - foreach($this->winner as $w) { - if((in_array($w[0],$this->you)) - || (in_array($w[1],$this->you)) - || (in_array($w[2],$this->you))) - continue; - if(in_array($w[0],$this->corners) - && in_array($w[2],$this->corners) - && in_array($w[0],$p) && in_array($w[2],$p)) { - if($this->me[0] == $w[0]) - return($w[2]); - elseif($this->me[0] == $w[2]) - return($w[0]); - } - } - } - } - else { - $r = $this->get_corners($this->me); - if(count($r) > 1) { - $w1 = array(); $w2 = array(); - foreach($this->winner as $w) { - if(in_array('111',$w)) - continue; - if(($r[0] == $w[0]) || ($r[0] == $w[2])) - $w1[] = $w; - if(($r[1] == $w[0]) || ($r[1] == $w[2])) - $w2[] = $w; - } - if(count($w1) && count($w2)) { - foreach($w1 as $a) { - foreach($w2 as $b) { - if((in_array($a[0],$this->you)) - || (in_array($a[1],$this->you)) - || (in_array($a[2],$this->you)) - || (in_array($b[0],$this->you)) - || (in_array($b[1],$this->you)) - || (in_array($b[2],$this->you))) - continue; - if(($a[0] == $b[0]) && ! $this->is_mine($a[0])) { - return $a[0]; - } - elseif(($a[2] == $b[2]) && ! $this->is_mine($a[2])) { - return $a[2]; - } - } - } - } - } - } - } - } - - //&& (count($this->me) == 1) && (count($this->you) == 1) - // && in_array($this->you[0],$this->corners) - // && $this->is_neighbor($this->me[0],$this->you[0])) { - - // Yuck. You foiled my plan. Since you obviously aren't playing to win, - // I'll try again. You may keep me busy for a few rounds, but I'm - // gonna' get you eventually. - -// $p = $this->uncontested_plane(); - // foreach($this->crosses as $c) - // if(in_array($c,$p)) - // return($c); - -// } - - - // find all the winners containing my points. - $mywinners = array(); - foreach($this->winner as $w) - foreach($this->me as $m) - if((in_array($m,$w)) && (! in_array($w,$mywinners))) - $mywinners[] = $w; - - // find all the rules where my points are in the center. - $trythese = array(); - if(count($mywinners)) { - foreach($mywinners as $w) { - foreach($this->me as $m) { - if(($m == $w[1]) && ($this->uncontested_winner($w)) - && (! in_array($w,$trythese))) - $trythese[] = $w; - } - } - } - - $myplanes = array(); - for($p = 0; $p < count($this->planes); $p ++) { - if($this->handicap && in_array('111',$this->planes[$p])) - continue; - foreach($this->me as $m) - if((in_array($m,$this->planes[$p])) - && (! in_array($this->planes[$p],$myplanes))) - $myplanes[] = $this->planes[$p]; - } - shuffle($myplanes); - - // find all winners which share an endpoint, and which are uncontested - $candidates = array(); - if(count($trythese) && count($myplanes)) { - foreach($trythese as $t) { - foreach($this->winner as $w) { - if(! $this->uncontested_winner($w)) - continue; - if((in_array($t[0],$w)) || (in_array($t[2],$w))) { - foreach($myplanes as $p) - if(in_array($w[0],$p) && in_array($w[1],$p) && in_array($w[2],$p) && ($w[1] != $this->me[0])) - if(! in_array($w,$candidates)) - $candidates[] = $w; - } - } - } - } - - // Find out if we are about to force a win. - // Looking for two winning vectors with a common endpoint - // and where we own the middle of both - we are now going to - // grab the endpoint. The game isn't yet over but we've already won. - - if(count($candidates)) { - foreach($candidates as $c) { - if(in_array($c[1],$this->me)) { - // return endpoint - foreach($trythese as $t) - if($t[0] == $c[0]) - return($t[0]); - elseif($t[2] == $c[2]) - return($t[2]); - } - } - - // find opponents planes - $yourplanes = array(); - for($p = 0; $p < count($this->planes); $p ++) { - if($this->handicap && in_array('111',$this->planes[$p])) - continue; - if(in_array($this->you[0],$this->planes[$p])) - $yourplanes[] = $this->planes[$p]; - } - - shuffle($this->winner); - foreach($candidates as $c) { - - // We now have a list of winning strategy vectors for our second point - // Pick one that will force you into defensive mode. - // Pick a point close to you so we don't risk giving you two - // in a row when you block us. That would force *us* into - // defensive mode. - // We want: or: not: - // X|O| X| | X| | - // |O| O|O| |O| - // | | | | |O| - - if(count($this->you) == 1) { - foreach($this->winner as $w) { - if(in_array($this->me[0], $w) && in_array($c[1],$w) - && $this->uncontested_winner($w) - && $this->is_neighbor($this->you[0],$c[1])) { - return($c[1]); - } - } - } - } - - // You're somewhere else entirely or have made more than one move - // - any strategy vector which puts you on the defense will have to do - - foreach($candidates as $c) { - foreach($this->winner as $w) { - if(in_array($this->me[0], $w) && in_array($c[1],$w) - && $this->uncontested_winner($w)) { - return($c[1]); - } - } - } - } - - // worst case scenario, no strategy we can play, - // just find an empty space and take it - - for($x = 0; $x < $this->dimen; $x ++) - for($y = 0; $y < $this->dimen; $y ++) - for($z = 0; $z < $this->dimen; $z ++) - if((! $this->marked_yours($x,$y,$z)) - && (! $this->marked_mine($x,$y,$z))) { - if($this->handicap && $x == 1 && $y == 1 && $z == 1) - continue; - return(sprintf("%d%d%d",$x,$y,$z)); - } - - return ''; - } - - function marked_yours($x,$y,$z) { - $str = sprintf("%d%d%d",$x,$y,$z); - if(in_array($str,$this->you)) - return true; - return false; - } - - function marked_mine($x,$y,$z) { - $str = sprintf("%d%d%d",$x,$y,$z); - if(in_array($str,$this->me)) - return true; - return false; - } - - function is_yours($str) { - if(in_array($str,$this->you)) - return true; - return false; - } - - function is_mine($str) { - if(in_array($str,$this->me)) - return true; - return false; - } - - function get_corners($a) { - $total = array(); - if(count($a)) - foreach($a as $b) - if(in_array($b,$this->corners)) - $total[] = $b; - return $total; - } - - function uncontested_winner($w) { - if($this->handicap && in_array('111',$w)) - return false; - $contested = false; - if(count($this->you)) { - foreach($this->you as $you) - if(in_array($you,$w)) - $contested = true; - } - return (($contested) ? false : true); - } - - - function is_neighbor($p1,$p2) { - list($x1,$y1,$z1) = sscanf($p1, "%1d%1d%1d"); - list($x2,$y2,$z2) = sscanf($p2, "%1d%1d%1d"); - - if((($x1 == $x2) || ($x1 == $x2+1) || ($x1 == $x2-1)) && - (($y1 == $y2) || ($y1 == $y2+1) || ($y1 == $y2-1)) && - (($z1 == $z2) || ($z1 == $z2+1) || ($z1 == $z2-1))) - return true; - return false; - - } - - function my_best_plane() { - - $second_choice = array(); - shuffle($this->planes); - for($p = 0; $p < count($this->planes); $p ++ ) { - $contested = 0; - if($this->handicap && in_array('111',$this->planes[$p])) - continue; - if(! in_array($this->me[0],$this->planes[$p])) - continue; - foreach($this->you as $m) { - if(in_array($m,$this->planes[$p])) - $contested ++; - } - if(! $contested) - return($this->planes[$p]); - if($contested == 1) - $second_choice = $this->planes[$p]; - } - return $second_choice; - } - - - - - - - - function uncontested_plane() { - $freeplane = true; - shuffle($this->planes); - $pl = $this->planes; - - for($p = 0; $p < count($pl); $p ++ ) { - if($this->handicap && in_array('111',$pl[$p])) - continue; - foreach($this->you as $m) { - if(in_array($m,$pl[$p])) - $freeplane = false; - } - if(! $freeplane) { - $freeplane = true; - continue; - } - if($freeplane) - return($pl[$p]); - } - return array(); - } - - function fullboard() { - return false; - } - - function draw_board() { - if(! strlen($this->yours)) - $this->yours = 'XXX'; - $o .= "
handicap}/{$this->mefirst}/{$this->dimen}/{$this->yours}/{$this->mine}\" method=\"post\" />"; - for($x = 0; $x < $this->dimen; $x ++) { - $o .= ''; - for($y = 0; $y < $this->dimen; $y ++) { - $o .= ''; - for($z = 0; $z < $this->dimen; $z ++) { - $s = sprintf("%d%d%d",$x,$y,$z); - $winner = ((is_array($this->winning_play) && in_array($s,$this->winning_play)) ? " color: #FF0000; " : ""); - $bordertop = (($y != 0) ? " border-top: 2px solid #000;" : ""); - $borderleft = (($z != 0) ? " border-left: 2px solid #000;" : ""); - if($this->handicap && $x == 1 && $y == 1 && $z == 1) - $o .= ""; - elseif($this->marked_yours($x,$y,$z)) - $o .= ""; - elseif($this->marked_mine($x,$y,$z)) - $o .= ""; - else { - $val = sprintf("%d%d%d",$x,$y,$z); - $o .= ""; - } - } - $o .= ''; - } - $o .= '
 XO

'; - } - $o .= '
'; - return $o; - - } - - -} - diff --git a/sources/extend/addon/matrix/tictac/tictac.png b/sources/extend/addon/matrix/tictac/tictac.png deleted file mode 100644 index f3f25410..00000000 Binary files a/sources/extend/addon/matrix/tictac/tictac.png and /dev/null differ diff --git a/sources/extend/addon/matrix/torch/torch.apd b/sources/extend/addon/matrix/torch/torch.apd deleted file mode 100644 index 23ede68e..00000000 --- a/sources/extend/addon/matrix/torch/torch.apd +++ /dev/null @@ -1,3 +0,0 @@ -url: $baseurl/torch -name: Flashlight -photo: $baseurl/addon/torch/torch.png diff --git a/sources/extend/addon/matrix/torch/torch.php b/sources/extend/addon/matrix/torch/torch.php deleted file mode 100644 index d7eaa3a5..00000000 --- a/sources/extend/addon/matrix/torch/torch.php +++ /dev/null @@ -1,9 +0,0 @@ - -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. - ------------------------------------------------------------------------------- - -Licence for jquery-tourbus.min.js and jquery-tourbus.min.css -The MIT License (MIT) - -Copyright (c) 2014 Ryan Funduk - -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. diff --git a/sources/extend/addon/matrix/tour/README b/sources/extend/addon/matrix/tour/README deleted file mode 100644 index e995f9f8..00000000 --- a/sources/extend/addon/matrix/tour/README +++ /dev/null @@ -1,4 +0,0 @@ -Hubzilla addon for providing a tour of the user interface. Not really useful currently, more of a proof of concept. -Supports e.g. clicking on a menu to make sure the element being described is actually visible to the user. - -For testing, go to /tour/?reset=1 to show tour again after seeing it. diff --git a/sources/extend/addon/matrix/tour/jquery-tourbus.min.css b/sources/extend/addon/matrix/tour/jquery-tourbus.min.css deleted file mode 100644 index 26a07d84..00000000 --- a/sources/extend/addon/matrix/tour/jquery-tourbus.min.css +++ /dev/null @@ -1 +0,0 @@ -.tourbus-legs{display:none}.tourbus-leg{position:absolute;visibility:hidden;top:0;border:1px solid #E5E5E5;box-shadow:0 0 2px rgba(0,0,0,.15);border-radius:2px;background:#fff}.tourbus-leg-inner{padding:20px;position:relative;zoom:1}.tourbus-leg-inner:before,.tourbus-leg-inner:after{content:"\0020";display:block;height:0;overflow:hidden}.tourbus-leg-inner:after{clear:both}.tourbus-leg h1,.tourbus-leg h2,.tourbus-leg h3,.tourbus-leg h4,.tourbus-leg h5,.tourbus-leg h6{margin-top:0;padding-top:0}.tourbus-arrow:before,.tourbus-arrow:after{border:solid rgba(0,0,0,0);content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:transparent}.tourbus-arrow:after{border-width:14px}.tourbus-arrow:before{border-width:16px}.tourbus-arrow-right:after{border-right-color:#fff;margin-top:-14px;top:50%}.tourbus-arrow-left:after{border-left-color:#fff;margin-top:-14px;top:50%}.tourbus-arrow-bottom:after{border-bottom-color:#fff;margin-left:-14px;left:50%}.tourbus-arrow-top:after{border-top-color:#fff;margin-left:-14px;left:50%}.tourbus-arrow-right:before{border-right-color:#e5e5e5;margin-top:-16px;top:50%}.tourbus-arrow-left:before{border-left-color:#e5e5e5;margin-top:-16px;top:50%}.tourbus-arrow-bottom:before{border-bottom-color:#e5e5e5;margin-left:-16px;left:50%}.tourbus-arrow-top:before{border-top-color:#e5e5e5;margin-left:-16px;left:50%}.tourbus-arrow-right:after,.tourbus-arrow-right:before{right:100%}.tourbus-arrow-left:after,.tourbus-arrow-left:before{left:100%}.tourbus-arrow-bottom:after,.tourbus-arrow-bottom:before{bottom:100%}.tourbus-arrow-top:after,.tourbus-arrow-top:before{top:100%} \ No newline at end of file diff --git a/sources/extend/addon/matrix/tour/jquery-tourbus.min.js b/sources/extend/addon/matrix/tour/jquery-tourbus.min.js deleted file mode 100644 index d0744644..00000000 --- a/sources/extend/addon/matrix/tour/jquery-tourbus.min.js +++ /dev/null @@ -1 +0,0 @@ -(function e(t,i,s){function o(r,h){if(!i[r]){if(!t[r]){var l="function"==typeof require&&require;if(!h&&l)return l(r,!0);if(n)return n(r,!0);throw Error("Cannot find module '"+r+"'")}var u=i[r]={exports:{}};t[r][0].call(u.exports,function(i){var s=t[r][1][i];return o(s?s:i)},u,u.exports,e,t,i,s)}return i[r].exports}for(var n="function"==typeof require&&require,r=0;s.length>r;r++)o(s[r]);return o})({1:[function(t){(function(){var i,s,e,o,n,r=[].slice;i=jQuery,s=t("./modules/bus"),e=t("./modules/leg"),n=i.tourbus=function(){var t,s;return t=arguments.length>=1?r.call(arguments,0):[],s=t[0],o.hasOwnProperty(s)?t=t.slice(1):s instanceof i?s="build":"string"==typeof s?(s="build",t[0]=i(t[0])):i.error("Unknown method of $.tourbus --",t),o[s].apply(this,t)},i.fn.tourbus=function(){var t;return t=arguments.length>=1?r.call(arguments,0):[],this.each(function(){return t.unshift(i(this)),n.apply(null,["build"].concat(r.call(t))),this})},o={build:function(t,e){var o;return null==e&&(e={}),e=i.extend(!0,{},n.defaults,e),o=[],t instanceof i||(t=i(t)),t.each(function(){return o.push(new s(this,e))}),0===o.length&&i.error(""+t.selector+" was not found!"),1===o.length?o[0]:o},destroyAll:function(){var t,i,e,o;e=s._busses,o=[];for(i in e)t=e[i],o.push(t.destroy());return o},expose:function(t){return t.tourbus={Bus:s,Leg:e}}},n.defaults={debug:!1,autoDepart:!1,container:"body","class":null,startAt:0,onDepart:function(){return null},onStop:function(){return null},onLegStart:function(){return null},onLegEnd:function(){return null},leg:{"class":null,scrollTo:null,scrollSpeed:150,scrollContext:100,orientation:"bottom",align:"left",width:"auto",margin:10,top:null,left:null,zindex:9999,arrow:"50%"}}}).call(this)},{"./modules/bus":2,"./modules/leg":3}],2:[function(t,i){(function(){var s,e,o,n,r=[].slice;s=jQuery,o=t("./leg"),n=t("./utils"),i.exports=e=function(){function t(t,i){this.options=i,this.id=this.constructor.uniqueId(),this.elId="tourbus-"+this.id,this.constructor._busses[this.id]=this,this.$original=s(t),this.rawData=this.$original.data(),this.$container=s(n.dataProp(this.rawData.container,this.options.container)),this.$original.data({tourbus:this}),this.currentLegIndex=null,this.legs=[],this.legEls=this.$original.children("li"),this.totalLegs=this.legEls.length,this._configureElement(),this._setupEvents(),n.dataProp(this.rawData.autoDepart,this.options.autoDepart)&&this.$original.trigger("depart.tourbus"),this._log("built tourbus with el",""+t,"and options",this.options)}return t._busses={},t._tours=0,t.uniqueId=function(){return this._tours++},t.prototype.depart=function(){return this.running=!0,this.options.onDepart(this),this._log("departing",this),this.currentLegIndex=n.dataProp(this.rawData.startAt,this.options.startAt),this.showLeg()},t.prototype.stop=function(){return this.running?(s.each(this.legs,s.proxy(this.hideLeg,this)),this.currentLegIndex=null,this.options.onStop(this),this.running=!1):void 0},t.prototype.on=function(t,i,s){return this.$container.on(t,i,s)},t.prototype.currentLeg=function(){return null===this.currentLegIndex?null:this.legs[this.currentLegIndex]},t.prototype.buildLeg=function(t){var i,e,n;return i=s(this.legEls[t]),e=i.data(),this.legs[t]=n=new o({bus:this,original:i,target:e.el||"body",index:t,rawData:e}),n.render(),this.$el.append(n.$el),n._position(),n.hide(),n},t.prototype.showLeg=function(t){var i,s;return null==t&&(t=this.currentLegIndex),i=this.legs[t]||this.buildLeg(t),this._log("showLeg:",i),s=this.options.onLegStart(i,this),s!==!1&&i.show(),++t0&&!this.legs[t]?this.buildLeg(t):void 0},t.prototype.repositionLegs=function(){return s.each(this.legs,function(){return this.reposition()})},t.prototype.next=function(){return this.hideLeg(),this.currentLegIndex++,this.currentLegIndex>this.totalLegs-1?this.$original.trigger("stop.tourbus"):this.showLeg()},t.prototype.prev=function(){return this.hideLeg(),this.currentLegIndex--,0>this.currentLegIndex?this.$original.trigger("stop.tourbus"):this.showLeg()},t.prototype.destroy=function(){return s.each(this.legs,function(){return this.destroy()}),this.legs=[],delete this.constructor._busses[this.id],this._teardownEvents(),this.$original.removeData("tourbus"),this.$el.remove()},t.prototype._configureElement=function(){return this.$el=s("
"),this.el=this.$el[0],this.$el.attr({id:this.elId}),this.$el.addClass(n.dataProp(this.rawData["class"],this.options["class"])),this.$container.append(this.$el)},t.prototype._log=function(){return n.dataProp(this.rawData.debug,this.options.debug)?console.log.apply(console,["TOURBUS "+this.id+":"].concat(r.call(arguments))):void 0},t.prototype._setupEvents=function(){return this.$original.on("depart.tourbus",s.proxy(this.depart,this)),this.$original.on("stop.tourbus",s.proxy(this.stop,this)),this.$original.on("next.tourbus",s.proxy(this.next,this)),this.$original.on("prev.tourbus",s.proxy(this.prev,this))},t.prototype._teardownEvents=function(){return this.$original.off(".tourbus")},t}()}).call(this)},{"./leg":3,"./utils":4}],3:[function(t,i){(function(){var s,e,o,n;s=jQuery,o=t("./utils"),i.exports=e=function(){function t(t){if(this.options=t,this.$original=this.options.original,this.bus=this.options.bus,this.rawData=this.options.rawData,this.index=this.options.index,this.$target=s(this.options.target),this.id=""+this.bus.id+"-"+this.options.index,this.elId="tourbus-leg-"+this.id,this.visible=!1,0===this.$target.length)throw""+this.$target.selector+" is not an element!";this.content=this.$original.html(),this._setupOptions(),this._configureElement(),this._configureTarget(),this._configureScroll(),this._setupEvents(),this.bus._log("leg "+this.index+" made with options",this.options)}return t.prototype.render=function(){var t,i;return t="centered"===this.options.orientation?"":"tourbus-arrow",this.$el.addClass(" "+t+" tourbus-arrow-"+this.options.orientation+" "),i="
\n "+this.content+"\n
",this.$el.css({width:this.options.width,zIndex:this.options.zindex}).html(i),this},t.prototype.destroy=function(){return this.$el.remove(),this._teardownEvents()},t.prototype.reposition=function(){return this._configureTarget(),this._position()},t.prototype._position=function(){var t,i,s,e;return"centered"!==this.options.orientation&&(s={},i={top:"left",bottom:"left",left:"top",right:"top"},"number"==typeof this.options.arrow&&(this.options.arrow+="px"),s[i[this.options.orientation]]=this.options.arrow,e="#"+this.elId+".tourbus-arrow",this.bus._log("adding rule for "+this.elId,s),n(""+e+":before, "+e+":after",s)),t=this._offsets(),this.bus._log("setting offsets on leg",t),this.$el.css(t)},t.prototype.show=function(){return this.visible=!0,this.$el.css({visibility:"visible",opacity:1,zIndex:this.options.zindex}),this.scrollIntoView()},t.prototype.hide=function(){return this.visible=!1,this.bus.options.debug?this.$el.css({visibility:"visible",opacity:.4,zIndex:0}):this.$el.css({visibility:"hidden"})},t.prototype.scrollIntoView=function(){var t;if(this.willScroll)return t=o.dataProp(this.options.scrollTo,this.$el),this.bus._log("scrolling to",t,this.scrollSettings),s.scrollTo(t,this.scrollSettings)},t.prototype._setupOptions=function(){var t,i,s,e,n,r;for(i=this.bus.options.leg,t=["class","top","left","scrollTo","scrollSpeed","scrollContext","margin","arrow","align","width","zindex","orientation"],r=[],e=0,n=t.length;n>e;e++)s=t[e],r.push(this.options[s]=o.dataProp(this.rawData[s],i[s]));return r},t.prototype._configureElement=function(){return this.$el=s("
"),this.el=this.$el[0],this.$el.attr({id:this.elId}),this.$el.addClass(this.options["class"]),this.$el.css({zIndex:this.options.zindex})},t.prototype._setupEvents=function(){return this.$el.on("click",".tourbus-next",s.proxy(this.bus.next,this.bus)),this.$el.on("click",".tourbus-prev",s.proxy(this.bus.prev,this.bus)),this.$el.on("click",".tourbus-stop",s.proxy(this.bus.stop,this.bus))},t.prototype._teardownEvents=function(){return this.$el.off("click")},t.prototype._configureTarget=function(){return this.targetOffset=this.$target.offset(),o.dataProp(this.options.top,!1)&&(this.targetOffset.top=this.options.top),o.dataProp(this.options.left,!1)&&(this.targetOffset.left=this.options.left),this.targetWidth=this.$target.outerWidth(),this.targetHeight=this.$target.outerHeight()},t.prototype._configureScroll=function(){return this.willScroll=s.fn.scrollTo&&this.options.scrollTo!==!1,this.scrollSettings={offset:-this.options.scrollContext,easing:"linear",axis:"y",duration:this.options.scrollSpeed}},t.prototype._offsets=function(){var t,i,e,n,r,h,l,u;switch(e=this.$el.height(),n=this.$el.width(),r={},this.options.orientation){case"centered":l=s(window).height(),r.top=this.options.top,o.dataProp(r.top,!1)||(r.top=l/2-e/2),r.left=this.targetWidth/2-n/2;break;case"left":r.top=this.targetOffset.top,r.left=this.targetOffset.left-n-this.options.margin;break;case"right":r.top=this.targetOffset.top,r.left=this.targetOffset.left+this.targetWidth+this.options.margin;break;case"top":r.top=this.targetOffset.top-e-this.options.margin,r.left=this.targetOffset.left;break;case"bottom":r.top=this.targetOffset.top+this.targetHeight+this.options.margin,r.left=this.targetOffset.left}if(u={top:["left","right"],bottom:["left","right"],left:["top","bottom"],right:["top","bottom"]},o.include(this.options.orientation,u[this.options.align]))switch(this.options.align){case"right":r.left+=this.targetWidth-n;break;case"bottom":r.top+=this.targetHeight-e}else"center"===this.options.align&&(o.include(this.options.orientation,u.left)?(h=this.targetWidth/2,i=n/2,t="left"):(h=this.targetHeight/2,i=e/2,t="top"),h>i?r[t]+=h-i:r[t]-=i-h);return r},t}(),n=function(t){var i;return t.type="text/css",document.getElementsByTagName("head")[0].appendChild(t),i=document.styleSheets[document.styleSheets.length-1],function(t,e){var o,n;n=s.map(function(){var t;t=[];for(o in e)t.push(o);return t}(),function(t){return""+t+":"+e[t]}).join(";");try{i.insertRule?i.insertRule(""+t+" { "+n+" }",(i.cssRules||i.rules).length):i.addRule(t,n)}catch(r){}}}(document.createElement("style"))}).call(this)},{"./utils":4}],4:[function(t,i){(function(){i.exports={dataProp:function(t,i){return null===t||t===void 0?i:t},include:function(t,i){return-1!==$.inArray(t,i||[])}}}).call(this)},{}]},{},[1,2,3,4]); \ No newline at end of file diff --git a/sources/extend/addon/matrix/tour/jquery.scrollTo.min.js b/sources/extend/addon/matrix/tour/jquery.scrollTo.min.js deleted file mode 100644 index c613f628..00000000 --- a/sources/extend/addon/matrix/tour/jquery.scrollTo.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2007-2014 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com - * Licensed under MIT - * @author Ariel Flesler - * @version 1.4.14 - */ -;(function(k){'use strict';k(['jquery'],function($){var j=$.scrollTo=function(a,b,c){return $(window).scrollTo(a,b,c)};j.defaults={axis:'xy',duration:0,limit:!0};j.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(f,g,h){if(typeof g=='object'){h=g;g=0}if(typeof h=='function')h={onAfter:h};if(f=='max')f=9e9;h=$.extend({},j.defaults,h);g=g||h.duration;h.queue=h.queue&&h.axis.length>1;if(h.queue)g/=2;h.offset=both(h.offset);h.over=both(h.over);return this._scrollable().each(function(){if(f==null)return;var d=this,$elem=$(d),targ=f,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=win?$(targ):$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}var e=$.isFunction(h.offset)&&h.offset(d,targ)||h.offset;$.each(h.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=j.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(h.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=e[pos]||0;if(h.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*h.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(h.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&h.queue){if(old!=attr[key])animate(h.onAfterFirst);delete attr[key]}});animate(h.onAfter);function animate(a){$elem.animate(attr,g,h.easing,a&&function(){a.call(this,targ,h)})}}).end()};j.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}return j})}(typeof define==='function'&&define.amd?define:function(a,b){if(typeof module!=='undefined'&&module.exports){module.exports=b(require('jquery'))}else{b(jQuery)}})); diff --git a/sources/extend/addon/matrix/tour/tour.php b/sources/extend/addon/matrix/tour/tour.php deleted file mode 100644 index beebda84..00000000 --- a/sources/extend/addon/matrix/tour/tour.php +++ /dev/null @@ -1,179 +0,0 @@ - - * - */ - -// Make addon a proper module so that we can use tour_content, tour_post functions -function tour_module(){}; - -function tour_load() { - register_hook('page_header','addon/tour/tour.php','tour_alterheader'); - register_hook('page_end','addon/tour/tour.php','tour_addfooter'); - register_hook('register_account','addon/tour/tour.php','tour_register'); -} - -function tour_unload() { - unregister_hook('page_header','addon/tour/tour.php','tour_alterheader'); - unregister_hook('page_end','addon/tour/tour.php','tour_addfooter'); - unregister_hook('register_account','addon/tour/tour.php','tour_register'); -} - -function tour_alterheader($a, &$navHtml) { - // Add tourbus CSS - $a->page['htmlhead'] .= ''; -} - -function tour_content(&$a) { - // Being able to reset the state is useful during development - // Should either be exposed through proper UI for users, but probably not needed at all - - if($_REQUEST['reset']) { - $seen = ''; - set_pconfig(local_channel(),'tour','seen',''); - set_pconfig(local_channel(),'tour','showtour',1); - logger('Reset tour'); - } -} - -function tour_post() { - if(! local_channel()) - return; - - // Never show tour again - if(x($_POST,'showtour') !== false && $_POST['showtour'] == '0') { - set_pconfig(local_channel(),'tour','showtour',0); - } - - // Add the recently seen element to the list of things not to show again - $seen = get_pconfig(local_channel(),'tour','seen'); - if(x($_POST,'seen') && $_POST['seen']) - set_pconfig(local_channel(),'tour','seen',$seen . ',' . $_POST['seen']); // Todo: validate input -} - -function tour_addfooter($a,&$navHtml) { - if(!local_channel()) return; // Don't show tour to non-logged in users - - if(get_pconfig(local_channel(),'tour','showtour') != 1) - return; - - $content = '' . "\r\n"; - $content .= '' . "\r\n"; - - $seen = explode(',',get_pconfig(local_channel(),'tour','seen')); - - // TOOD: Check which elements are present on which pages, and only include the relevant stuff - $legs = array(); - - - // Nav elements - $legs[] = array('#avatar',t('Edit your profile and change settings.')); - $legs[] = array('#network_nav_btn',t('Click here to see activity from your connections.')); - $legs[] = array('#home_nav_btn',t('Click here to see your channel home.')); - $legs[] = array('#mail_nav_btn',t('You can access your private messages from here.')); - $legs[] = array('#events_nav_btn',t('Create new events here.')); - $legs[] = array('#connections_nav_btn',t('You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts.')); - $legs[] = array('#notifications_nav_btn',t('System notifications will arrive here')); - $legs[] = array('#nav-search-text',t('Search for content and users')); - $legs[] = array('#directory_nav_btn',t('Browse for new contacts')); - $legs[] = array('#apps_nav_btn',t('Launch installed apps')); - $legs[] = array('#help_nav_btn',t('Looking for help? Click here.')); - $legs[] = array('.net-update.show',t('New events have occurred in your network. Click here to see what has happened!')); - $legs[] = array('.mail-update.show',t('You have received a new private message. Click here to see from who!')); - $legs[] = array('.all_events-update.show',t('There are events this week. Click here too see which!')); - $legs[] = array('.intro-update.show',t('You have received a new introduction. Click here to see who!')); - $legs[] = array('.notify-update.show',t('There is a new system notification. Click here to see what has happened!')); - - // Posting stuff - $legs[] = array('#profile-jot-text',t('Click here to share text, images, videos and sound.')); - $legs[] = array('#jot-title',t('You can write an optional title for your update (good for long posts).'),'if($("#jot-title").css("display") == "none") { $("#profile-jot-text").trigger("click"); }'); - $legs[] = array('#jot-category',t('Entering some categories here makes it easier to find your post later.'),'if($("#jot-title").css("display") == "none") { $("#profile-jot-text").trigger("click"); }'); - $legs[] = array('#wall-image-upload',t('Share photos, links, location, etc.'),'if($("#jot-title").css("display") == "none") { $("#profile-jot-text").trigger("click"); }'); - $legs[] = array('#profile-expires',t('Only want to share content for a while? Make it expire at a certain date.'),'if($("#jot-title").css("display") == "none") { $("#profile-jot-text").trigger("click"); }'); - $legs[] = array('#profile-encrypt',t('You can password protect content.'),'if($("#jot-title").css("display") == "none") { $("#profile-jot-text").trigger("click"); }'); - $legs[] = array('#dbtn-acl',t('Choose who you share with.'),'if($("#jot-title").css("display") == "none") { $("#profile-jot-text").trigger("click"); }'); - /* Todo: Preview */ - $legs[] = array('#dbtn-submit',t('Click here when you are done.'),'if($("#jot-title").css("display") == "none") { $("#profile-jot-text").trigger("click"); }'); - - // Network - $legs[] = array('#main-slider',t('Adjust from which channels posts should be displayed.')); - $legs[] = array('#group-sidebar',t('Only show posts from channels in the specified collection.')); - - // Sidebar - - $legs[] = array('.tagblock',t('Easily find posts containing tags (keywords preceded by the "#" symbol).')); - $legs[] = array('#categories-sidebar',t('Easily find posts in given category.')); - $legs[] = array('#datebrowse-sidebar',t('Easily find posts by date.')); - $legs[] = array('.suggestions-sidebar',t('Suggested users who have volounteered to be shown as suggestions, and who we think you might find interesting.')); - $legs[] = array('#contacts-block',t('Here you see channels you have connected to.')); - $legs[] = array('.saved-search-widget',t('Save your search so you can repeat it at a later date.')); - - // Misc - $legs[] = array('.item-verified',t('If you see this icon you can be sure that the sender is who it say it is. It is normal that it is not always possible to verify the sender, so the icon will be missing sometimes. There is usually no need to worry about that.')); - $legs[] = array('.item-forged',t('Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!')); - - - $content .= "
    "; - - $steps = 0; - if(!in_array('tourintro', $seen)) { - $content .= "
  1. ".t('Welcome to Hubzilla! Would you like to see a tour of the UI?

    You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.

    You can also advance by pressing the return key')."

  2. "; - $steps = $steps + 1; - } - - foreach($legs as $leg) { - if(in_array($leg[0],$seen)) { - continue; - } - $click=''; - if(count($leg) > 2) - $click="data-click='$leg[2]'"; - $content .= "
  3. $leg[1]

  4. "; - $steps = $steps + 1; - } - - if($steps > 1 && !in_array('tourend',$seen)) { - $content .= "
  5. That's it for now! Continue to explore, and you'll get more help along the way.

  6. "; - - } - - $content .= '
'; -if($steps > 1) { -$content .= <<<'EOD' - -EOD; -} - - $navHtml .= $content; -} - -function tour_register($a, $uid) { - // Show tour for new users - set_pconfig($uid, 'tour', 'showtour', 1); -} -?> diff --git a/sources/extend/addon/matrix/twitter/LICENSE b/sources/extend/addon/matrix/twitter/LICENSE deleted file mode 100644 index 062cc888..00000000 --- a/sources/extend/addon/matrix/twitter/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/sources/extend/addon/matrix/twitter/README.md b/sources/extend/addon/matrix/twitter/README.md deleted file mode 100644 index 841f6be7..00000000 --- a/sources/extend/addon/matrix/twitter/README.md +++ /dev/null @@ -1,116 +0,0 @@ -Twitter Plugin -============== - -*Warning: Because Twitter currently blocks ur1.ca links, tweets with these links are not accepted by Twitter. This means that you can only crosspost short messages to Twitter. Other link shortening services didn't seem to work at all, so #pleaseFIX! [BTW: the question is if we need link shortening, because Twitter has its own nowadays.]* - ------------- - -Original main authors Tobias Diekershoff and Michael Vogel. Adapted for the Hubzilla by Mike Macgirvin. - -With this addon for the Hubzilla you can give your hub members the possibility to post -their *public* messages to Twitter. The messages will be strapped their rich -context and shortened to 140 characters length if necessary. If shortening of -the message was performed a link will be added to the tweet pointing to the -original message on your hub. - -There is a similar addon for forwarding public messages to -[GNU social (formerly StatusNet)](http://gnu.io/social/). - -Requirements ------------- - -To use this plugin you have to register an application for your Hubzilla -hub on Twitter with - -* read and write access -* don't set a callback URL -* we do not intend to use Twitter for login - -The registration can be done at [twitter.com/apps](https://apps.twitter.com/) and you need a Twitter -account for doing so. - -After you registered the application you get an OAuth API key / secret -pair that identifies your app, you will need them for configuration. - -The inclusion of a shorturl for the original posting in cases when the -message was longer than 140 characters requires it, that you have *PHP5+* and -*curl* on your server. - -Where to find -------------- - -In the [Red-addons git repository /twitter/](https://github.com/friendica/red-addons/tree/master/twitter). This directory -contains all required PHP files (including the [Twitter OAuth library][1] by Abraham -Williams, MIT licensed and the [Slinky library][2] by Beau Lebens, BSD license), -a CSS file for styling of the user configuration and an image to _Sign in with -Twitter_. - -[1]: https://github.com/abraham/twitteroauth -[2]: http://dentedreality.com.au/projects/slinky/ - -Configuration -============= - -Global Configuration --------------------- - -If you enabled an administrator account, please use the admin panel to configure -the Twitter relay. If you for any reason prefer to use the command line instead -of the admin panels, please refer to the Alternative Configuration below. - -Activate the plugin from the plugins section of your admin panel. When you have -done so, add your API key and API secret in the settings section of the -plugin page. - -When this is done your user can now configure their Twitter connection at -"Settings -> Connector Settings" and enable the forwarding of their *public* -messages to Twitter. - -Alternative Configuration -------------------------- - -* Go to the root of your Hubzilla installation and type after the prompt: - - util/config system addon - -* Press enter. You get a list of active addons. To activate this addon you have to add Twitter to this list and press enter: - - util/config system addon "plugin 1, plugin 2, etc, twitter" - -* Afterwards you need to add your OAuth API key / secret pair the same way (without the single quotes): - - util/config twitter consumerkey 'your API KEY here' - - util/config twitter consumersecret 'your API SECRET here' - - -Connector Options for the Channel -================================= - -When the OAuth API information is correctly entered into the admin configuration and a channel owner visits the "Connector Settings" page they can now connect to Twitter. To do so one has to follow the _Sign in with Twitter_ -button (the page will be opened in a new browser window/tab) and get a PIN from Twitter. This PIN has to be entered on the settings page. After submitting the PIN the plugin will get OAuth credentials and this channel has the privilege to cross-post their public posts to Twitter. - -After this step was successful the user now has the following config options. - -* **Allow posting to Twitter** If a channel owner wants to post their _public postings_ - to the associated Twitter account, they need to check this box. -* **Send public postings to Twitter by default** If a channel owner wants to have _all_ - their public postings being send to the associated Twitter account they need to check - this button as well. Otherwise they have to enable the relay of their postings - in the ACL dialog (click the lock button) before posting an entry. -* **Clear OAuth configuration** If a channel owner wants to remove the currently associated - Twitter account from their Hubzilla channel they have to check this box and - then hit the submit button. The saved settings will be deleted and they have - to reconfigure the Twitter connector to be able to relay their public - postings to a Twitter account. - -License -======= - -The _Twitter Connector_ is licensed under the [3-clause BSD license][3] see -the -LICENSE file in the addons directory. - -[3]: http://opensource.org/licenses/BSD-3-Clause - - diff --git a/sources/extend/addon/matrix/twitter/cacert.pem b/sources/extend/addon/matrix/twitter/cacert.pem deleted file mode 100644 index 99b310bc..00000000 --- a/sources/extend/addon/matrix/twitter/cacert.pem +++ /dev/null @@ -1,3895 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## - -# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $ - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 1 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy -MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE -NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i -o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq -kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 -RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 3 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy -MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD -VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS -xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi -up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 -mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd -k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq -WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM -XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC -lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h -cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp -Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h -cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp -Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx -nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC -wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA -ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK -1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk -LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E -bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ -rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ -Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB -FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N -y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h -a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc -D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- - -Verisign Class 2 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y -azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug -b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 -c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 -tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 -C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS -0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs -Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 -JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf -0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx -JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j -GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC -AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER -gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS -o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z -2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX -OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 2 -============================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE -ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT -DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn -2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 -BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx -JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e -uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 -jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia -78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm -V+GRMOrN ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -UTN-USER First-Network Applications -=================================== ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp -BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 -WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T -YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB -cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug -mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj -DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu -Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi -P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE -j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w -HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j -cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G -CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y -IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK -RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp -xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq -DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE ------END CERTIFICATE----- - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx -ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 -XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk -lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB -lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy -lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt -66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn -wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh -D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy -BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie -J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud -DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU -a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv -Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 -UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm -VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK -+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW -IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 -WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X -f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II -4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 -VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx -OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg -DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij -KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K -DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv -BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp -p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 -nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX -MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM -Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz -uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT -BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB -BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD -VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 -ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE -AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV -qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s -hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z -POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 -Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp -8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC -bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu -g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p -vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr -qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 1 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw -NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 -7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 -EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl -0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 -2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa -HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT -iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 -28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV -yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR -vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P -qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z -IRlXvVWa ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -TDC Internet Root CA -==================== ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE -ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx -NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu -ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j -xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL -znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc -5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 -otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI -AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM -VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM -MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe -UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb -O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU -Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -TDC OCES Root CA -================ ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE -ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 -MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH -nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 -zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV -iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde -dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO -3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB -5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k -ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm -cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp -Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM -MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 -+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 -NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 -A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc -A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 -AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 -AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Email Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 -BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 -OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx -FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx -ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz -dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx -B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 -om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG -TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl -yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE -AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV -HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll -bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne -xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ -5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV -NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ -w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -UTN USERFirst Object Root CA -============================ ------BEGIN CERTIFICATE----- -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb -BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz -NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx -HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy -dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR -loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ -w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu -lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 -RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL -BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 -ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly -c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw -DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw -NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO -PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE -qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG -hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Qualified (Class QA) Root -================================= ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn -eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 -bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 -LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 -dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP -aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV -CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e -8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb -m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ -0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM -0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 -YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh -biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p -a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz -YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg -YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg -ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov -L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr -Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 -aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg -YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 -IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 -DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN -wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg -W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc -R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR -5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Firmaprofesional Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT -GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp -Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA -ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL -MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT -OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 -ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V -j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH -lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf -3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 -NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww -KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG -AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf -wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm -7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG -VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- - -Wells Fargo Root CA -=================== ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl -bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv -MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX -x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 -E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 -OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j -sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj -YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF -BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD -ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv -m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 -tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG -EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy -dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 -MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln -aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC -IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM -MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF -NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe -AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC -b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn -7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN -cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp -WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 -haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY -MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw -HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 -MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn -jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ -MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H -VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl -vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl -OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 -1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq -nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy -x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Platinum CA - G2 -========================== ------BEGIN CERTIFICATE----- -MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT -BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw -HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM -U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu -669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF -eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne -WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo -j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6 -8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T -aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy -domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D -+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV -CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv -zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW -IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1 -Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3 -NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4 -U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8 -KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl -9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B -aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs -OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY -Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci -IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw -EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN -MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp -c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq -t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C -jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg -vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF -ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR -AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend -jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO -peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR -7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi -GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 -OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm -5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr -44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf -Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m -Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp -mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk -vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf -KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br -NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj -viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT -BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X -DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 -aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 -N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm -+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH -6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu -MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h -qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 -FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs -ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc -celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X -CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB -tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P -4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F -kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L -3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx -/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa -DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP -e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu -WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ -DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub -DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -S-TRUST Authentication and Encryption Root CA 2005 PN -===================================================== ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE -BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh -cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT -LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w -NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk -ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj -aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp -b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob -4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL -g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf -eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 -KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB -/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv -bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU -D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD -pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 -P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA -nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit -F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b -Hz2eBIPdltkdOpQ= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign CA -========== ------BEGIN CERTIFICATE----- -MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD -EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy -MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp -Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q -ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy -P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN -GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk -YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM -rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy -oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P -AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ -VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 -QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI -mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb -/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG -zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U -AGegcQCCSA== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg -QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe -Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt -IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by -X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b -gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr -eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ -TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy -Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn -uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI -qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm -ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 -Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW -Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t -FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm -zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k -XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT -bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU -RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK -1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt -2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ -Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 -AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) FÅ‘tanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ -5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn -vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj -CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil -e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR -OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI -CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 -48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi -trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 -qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB -AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC -ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA -A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz -+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj -f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN -kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk -CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF -URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb -CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h -oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV -IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD -T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 -MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG -A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk -WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD -YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew -MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb -m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk -HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT -xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 -3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 -2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq -TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz -4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU -9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg -aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP -eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk -zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 -ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI -KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq -nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE -I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp -MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o -tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -Verisign Class 1 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ -VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 -yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa -XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n -0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ -RjXZ+Hxb ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -TC TrustCenter Universal CA III -=============================== ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe -Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU -QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex -KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt -QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO -juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut -CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 -M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G -A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA -g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ -KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK -BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq -woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG -EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz -MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu -QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ -03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK -ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU -+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC -PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT -OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK -F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK -0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ -0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB -leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID -AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ -SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG -NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O -BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l -Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga -kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q -hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs -g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 -aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 -nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC -ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo -Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z -WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -Actalis Authentication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM -BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE -AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky -MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz -IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ -wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa -by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 -zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f -YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 -oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l -EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 -hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 -EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 -jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY -iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI -WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 -JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx -K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ -Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC -4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo -2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz -lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem -OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 -vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ -Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 -dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu -c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv -bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 -aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 -fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm -N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN -Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T -tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX -e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA -2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs -HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib -D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -StartCom Certification Authority G2 -=================================== ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE -ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O -o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG -4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi -Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul -Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs -O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H -vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L -nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS -FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa -z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ -KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk -J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ -JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG -/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc -nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld -blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc -l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm -7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm -obp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -Buypass Class 2 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X -DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 -g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn -9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b -/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU -CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff -awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI -zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn -Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX -Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs -M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI -osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S -aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd -DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD -LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 -oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC -wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS -CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN -rJgWVqA= ------END CERTIFICATE----- - -Buypass Class 3 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X -DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH -sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR -5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh -7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ -ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH -2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV -/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ -RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA -Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq -j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G -uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG -Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 -ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 -KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz -6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug -UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe -eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi -Cp/HuZc= ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- diff --git a/sources/extend/addon/matrix/twitter/codebird.php b/sources/extend/addon/matrix/twitter/codebird.php deleted file mode 100644 index 898dc710..00000000 --- a/sources/extend/addon/matrix/twitter/codebird.php +++ /dev/null @@ -1,1026 +0,0 @@ - - * @copyright 2010-2013 J.M. - * - * 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 3 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, see . - */ - -/** - * Define constants - */ -$constants = explode(' ', 'OBJECT ARRAY JSON'); -foreach ($constants as $i => $id) { - $id = 'CODEBIRD_RETURNFORMAT_' . $id; - defined($id) or define($id, $i); -} -$constants = array( - 'CURLE_SSL_CERTPROBLEM' => 58, - 'CURLE_SSL_CACERT' => 60, - 'CURLE_SSL_CACERT_BADFILE' => 77, - 'CURLE_SSL_CRL_BADFILE' => 82, - 'CURLE_SSL_ISSUER_ERROR' => 83 -); -foreach ($constants as $id => $i) { - defined($id) or define($id, $i); -} -unset($constants); -unset($i); -unset($id); - -/** - * A Twitter library in PHP. - * - * @package codebird - * @subpackage codebird-php - */ -class Codebird -{ - /** - * The current singleton instance - */ - private static $_instance = null; - - /** - * The OAuth consumer key of your registered app - */ - protected static $_oauth_consumer_key = null; - - /** - * The corresponding consumer secret - */ - protected static $_oauth_consumer_secret = null; - - /** - * The app-only bearer token. Used to authorize app-only requests - */ - protected static $_oauth_bearer_token = null; - - /** - * The API endpoint to use - */ - protected static $_endpoint = 'https://api.twitter.com/1.1/'; - - /** - * The API endpoint to use for OAuth requests - */ - protected static $_endpoint_oauth = 'https://api.twitter.com/'; - - /** - * The Request or access token. Used to sign requests - */ - protected $_oauth_token = null; - - /** - * The corresponding request or access token secret - */ - protected $_oauth_token_secret = null; - - /** - * The format of data to return from API calls - */ - protected $_return_format = CODEBIRD_RETURNFORMAT_OBJECT; - - /** - * The file formats that Twitter accepts as image uploads - */ - protected $_supported_media_files = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG); - - /** - * The current Codebird version - */ - protected $_version = '2.4.1'; - - /** - * Returns singleton class instance - * Always use this method unless you're working with multiple authenticated users at once - * - * @return Codebird The instance - */ - public static function getInstance() - { - if (self::$_instance == null) { - self::$_instance = new self; - } - return self::$_instance; - } - - /** - * Sets the OAuth consumer key and secret (App key) - * - * @param string $key OAuth consumer key - * @param string $secret OAuth consumer secret - * - * @return void - */ - public static function setConsumerKey($key, $secret) - { - self::$_oauth_consumer_key = $key; - self::$_oauth_consumer_secret = $secret; - } - - /** - * Sets the OAuth2 app-only auth bearer token - * - * @param string $token OAuth2 bearer token - * - * @return void - */ - public static function setBearerToken($token) - { - self::$_oauth_bearer_token = $token; - } - - /** - * Gets the current Codebird version - * - * @return string The version number - */ - public function getVersion() - { - return $this->_version; - } - - /** - * Sets the OAuth request or access token and secret (User key) - * - * @param string $token OAuth request or access token - * @param string $secret OAuth request or access token secret - * - * @return void - */ - public function setToken($token, $secret) - { - $this->_oauth_token = $token; - $this->_oauth_token_secret = $secret; - } - - /** - * Sets the format for API replies - * - * @param int $return_format One of these: - * CODEBIRD_RETURNFORMAT_OBJECT (default) - * CODEBIRD_RETURNFORMAT_ARRAY - * - * @return void - */ - public function setReturnFormat($return_format) - { - $this->_return_format = $return_format; - } - - /** - * Main API handler working on any requests you issue - * - * @param string $fn The member function you called - * @param array $params The parameters you sent along - * - * @return mixed The API reply encoded in the set return_format - */ - - public function __call($fn, $params) - { - // parse parameters - $apiparams = array(); - if (count($params) > 0) { - if (is_array($params[0])) { - $apiparams = $params[0]; - } else { - parse_str($params[0], $apiparams); - // remove auto-added slashes if on magic quotes steroids - if (get_magic_quotes_gpc()) { - foreach($apiparams as $key => $value) { - if (is_array($value)) { - $apiparams[$key] = array_map('stripslashes', $value); - } else { - $apiparams[$key] = stripslashes($value); - } - } - } - } - } - - // stringify null and boolean parameters - foreach ($apiparams as $key => $value) { - if (! is_scalar($value)) { - continue; - } - if (is_null($value)) { - $apiparams[$key] = 'null'; - } elseif (is_bool($value)) { - $apiparams[$key] = $value ? 'true' : 'false'; - } - } - - $app_only_auth = false; - if (count($params) > 1) { - $app_only_auth = !! $params[1]; - } - - // map function name to API method - $method = ''; - - // replace _ by / - $path = explode('_', $fn); - for ($i = 0; $i < count($path); $i++) { - if ($i > 0) { - $method .= '/'; - } - $method .= $path[$i]; - } - // undo replacement for URL parameters - $url_parameters_with_underscore = array('screen_name'); - foreach ($url_parameters_with_underscore as $param) { - $param = strtoupper($param); - $replacement_was = str_replace('_', '/', $param); - $method = str_replace($replacement_was, $param, $method); - } - - // replace AA by URL parameters - $method_template = $method; - $match = array(); - if (preg_match('/[A-Z_]{2,}/', $method, $match)) { - foreach ($match as $param) { - $param_l = strtolower($param); - $method_template = str_replace($param, ':' . $param_l, $method_template); - if (!isset($apiparams[$param_l])) { - for ($i = 0; $i < 26; $i++) { - $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template); - } - throw new \Exception( - 'To call the templated method "' . $method_template - . '", specify the parameter value for "' . $param_l . '".' - ); - } - $method = str_replace($param, $apiparams[$param_l], $method); - unset($apiparams[$param_l]); - } - } - - // replace A-Z by _a-z - for ($i = 0; $i < 26; $i++) { - $method = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method); - $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template); - } - - $httpmethod = $this->_detectMethod($method_template, $apiparams); - $multipart = $this->_detectMultipart($method_template); - - return $this->_callApi( - $httpmethod, - $method, - $method_template, - $apiparams, - $multipart, - $app_only_auth - ); - } - - /** - * Uncommon API methods - */ - - /** - * Gets the OAuth authenticate URL for the current request token - * - * @return string The OAuth authenticate URL - */ - public function oauth_authenticate($force_login = NULL, $screen_name = NULL) - { - if ($this->_oauth_token == null) { - throw new \Exception('To get the authenticate URL, the OAuth token must be set.'); - } - $url = self::$_endpoint_oauth . 'oauth/authenticate?oauth_token=' . $this->_url($this->_oauth_token); - if ($force_login) { - $url .= "&force_login=1"; - } - if ($screen_name) { - $url .= "&screen_name=" . $screen_name; - } - return $url; - } - - /** - * Gets the OAuth authorize URL for the current request token - * - * @return string The OAuth authorize URL - */ - public function oauth_authorize($force_login = NULL, $screen_name = NULL) - { - if ($this->_oauth_token == null) { - throw new \Exception('To get the authorize URL, the OAuth token must be set.'); - } - $url = self::$_endpoint_oauth . 'oauth/authorize?oauth_token=' . $this->_url($this->_oauth_token); - if ($force_login) { - $url .= "&force_login=1"; - } - if ($screen_name) { - $url .= "&screen_name=" . $screen_name; - } - return $url; - } - - /** - * Gets the OAuth bearer token - * - * @return string The OAuth bearer token - */ - - public function oauth2_token() - { - if (! function_exists('curl_init')) { - throw new \Exception('To make API requests, the PHP curl extension must be available.'); - } - if (self::$_oauth_consumer_key == null) { - throw new \Exception('To obtain a bearer token, the consumer key must be set.'); - } - $ch = false; - $post_fields = array( - 'grant_type' => 'client_credentials' - ); - $url = self::$_endpoint_oauth . 'oauth2/token'; - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); - curl_setopt($ch, CURLOPT_HEADER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); - curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem'); - - curl_setopt($ch, CURLOPT_USERPWD, self::$_oauth_consumer_key . ':' . self::$_oauth_consumer_secret); - curl_setopt($ch, CURLOPT_HTTPHEADER, array( - 'Expect:' - )); - $reply = curl_exec($ch); - - // certificate validation results - $validation_result = curl_errno($ch); - if (in_array( - $validation_result, - array( - CURLE_SSL_CERTPROBLEM, - CURLE_SSL_CACERT, - CURLE_SSL_CACERT_BADFILE, - CURLE_SSL_CRL_BADFILE, - CURLE_SSL_ISSUER_ERROR - ) - ) - ) { - throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.'); - } - - $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $reply = $this->_parseApiReply('oauth2/token', $reply); - switch ($this->_return_format) { - case CODEBIRD_RETURNFORMAT_ARRAY: - $reply['httpstatus'] = $httpstatus; - if ($httpstatus == 200) { - self::setBearerToken($reply['access_token']); - } - break; - case CODEBIRD_RETURNFORMAT_JSON: - if ($httpstatus == 200) { - $parsed = json_decode($reply); - self::setBearerToken($parsed->access_token); - } - break; - case CODEBIRD_RETURNFORMAT_OBJECT: - $reply->httpstatus = $httpstatus; - if ($httpstatus == 200) { - self::setBearerToken($reply->access_token); - } - break; - } - return $reply; - } - - /** - * Signing helpers - */ - - /** - * URL-encodes the given data - * - * @param mixed $data - * - * @return mixed The encoded data - */ - private function _url($data) - { - if (is_array($data)) { - return array_map(array( - $this, - '_url' - ), $data); - } elseif (is_scalar($data)) { - return str_replace(array( - '+', - '!', - '*', - "'", - '(', - ')' - ), array( - ' ', - '%21', - '%2A', - '%27', - '%28', - '%29' - ), rawurlencode($data)); - } else { - return ''; - } - } - - /** - * Gets the base64-encoded SHA1 hash for the given data - * - * @param string $data The data to calculate the hash from - * - * @return string The hash - */ - private function _sha1($data) - { - if (self::$_oauth_consumer_secret == null) { - throw new \Exception('To generate a hash, the consumer secret must be set.'); - } - if (!function_exists('hash_hmac')) { - throw new \Exception('To generate a hash, the PHP hash extension must be available.'); - } - return base64_encode(hash_hmac('sha1', $data, self::$_oauth_consumer_secret . '&' - . ($this->_oauth_token_secret != null ? $this->_oauth_token_secret : ''), true)); - } - - /** - * Generates a (hopefully) unique random string - * - * @param int optional $length The length of the string to generate - * - * @return string The random string - */ - protected function _nonce($length = 8) - { - if ($length < 1) { - throw new \Exception('Invalid nonce length.'); - } - return substr(md5(microtime(true)), 0, $length); - } - - /** - * Generates an OAuth signature - * - * @param string $httpmethod Usually either 'GET' or 'POST' or 'DELETE' - * @param string $method The API method to call - * @param array optional $params The API call parameters, associative - * - * @return string Authorization HTTP header - */ - protected function _sign($httpmethod, $method, $params = array()) - { - if (self::$_oauth_consumer_key == null) { - throw new \Exception('To generate a signature, the consumer key must be set.'); - } - $sign_params = array( - 'consumer_key' => self::$_oauth_consumer_key, - 'version' => '1.0', - 'timestamp' => time(), - 'nonce' => $this->_nonce(), - 'signature_method' => 'HMAC-SHA1' - ); - $sign_base_params = array(); - foreach ($sign_params as $key => $value) { - $sign_base_params['oauth_' . $key] = $this->_url($value); - } - if ($this->_oauth_token != null) { - $sign_base_params['oauth_token'] = $this->_url($this->_oauth_token); - } - $oauth_params = $sign_base_params; - foreach ($params as $key => $value) { - $sign_base_params[$key] = $this->_url($value); - } - ksort($sign_base_params); - $sign_base_string = ''; - foreach ($sign_base_params as $key => $value) { - $sign_base_string .= $key . '=' . $value . '&'; - } - $sign_base_string = substr($sign_base_string, 0, -1); - $signature = $this->_sha1($httpmethod . '&' . $this->_url($method) . '&' . $this->_url($sign_base_string)); - - $params = array_merge($oauth_params, array( - 'oauth_signature' => $signature - )); - ksort($params); - $authorization = 'Authorization: OAuth '; - foreach ($params as $key => $value) { - $authorization .= $key . '="' . $this->_url($value) . '", '; - } - return substr($authorization, 0, -2); - } - - /** - * Detects HTTP method to use for API call - * - * @param string $method The API method to call - * @param array $params The parameters to send along - * - * @return string The HTTP method that should be used - */ - protected function _detectMethod($method, $params) - { - // multi-HTTP method endpoints - switch($method) { - case 'account/settings': - $method = count($params) > 0 ? $method . '__post' : $method; - break; - } - - $httpmethods = array(); - $httpmethods['GET'] = array( - // Timelines - 'statuses/mentions_timeline', - 'statuses/user_timeline', - 'statuses/home_timeline', - 'statuses/retweets_of_me', - - // Tweets - 'statuses/retweets/:id', - 'statuses/show/:id', - 'statuses/oembed', - - // Search - 'search/tweets', - - // Direct Messages - 'direct_messages', - 'direct_messages/sent', - 'direct_messages/show', - - // Friends & Followers - 'friendships/no_retweets/ids', - 'friends/ids', - 'followers/ids', - 'friendships/lookup', - 'friendships/incoming', - 'friendships/outgoing', - 'friendships/show', - 'friends/list', - 'followers/list', - - // Users - 'account/settings', - 'account/verify_credentials', - 'blocks/list', - 'blocks/ids', - 'users/lookup', - 'users/show', - 'users/search', - 'users/contributees', - 'users/contributors', - 'users/profile_banner', - - // Suggested Users - 'users/suggestions/:slug', - 'users/suggestions', - 'users/suggestions/:slug/members', - - // Favorites - 'favorites/list', - - // Lists - 'lists/list', - 'lists/statuses', - 'lists/memberships', - 'lists/subscribers', - 'lists/subscribers/show', - 'lists/members/show', - 'lists/members', - 'lists/show', - 'lists/subscriptions', - - // Saved searches - 'saved_searches/list', - 'saved_searches/show/:id', - - // Places & Geo - 'geo/id/:place_id', - 'geo/reverse_geocode', - 'geo/search', - 'geo/similar_places', - - // Trends - 'trends/place', - 'trends/available', - 'trends/closest', - - // OAuth - 'oauth/authenticate', - 'oauth/authorize', - - // Help - 'help/configuration', - 'help/languages', - 'help/privacy', - 'help/tos', - 'application/rate_limit_status' - ); - $httpmethods['POST'] = array( - // Tweets - 'statuses/destroy/:id', - 'statuses/update', - 'statuses/retweet/:id', - 'statuses/update_with_media', - - // Direct Messages - 'direct_messages/destroy', - 'direct_messages/new', - - // Friends & Followers - 'friendships/create', - 'friendships/destroy', - 'friendships/update', - - // Users - 'account/settings__post', - 'account/update_delivery_device', - 'account/update_profile', - 'account/update_profile_background_image', - 'account/update_profile_colors', - 'account/update_profile_image', - 'blocks/create', - 'blocks/destroy', - 'account/update_profile_banner', - 'account/remove_profile_banner', - - // Favorites - 'favorites/destroy', - 'favorites/create', - - // Lists - 'lists/members/destroy', - 'lists/subscribers/create', - 'lists/subscribers/destroy', - 'lists/members/create_all', - 'lists/members/create', - 'lists/destroy', - 'lists/update', - 'lists/create', - 'lists/members/destroy_all', - - // Saved Searches - 'saved_searches/create', - 'saved_searches/destroy/:id', - - // Places & Geo - 'geo/place', - - // Spam Reporting - 'users/report_spam', - - // OAuth - 'oauth/access_token', - 'oauth/request_token', - 'oauth2/token', - 'oauth2/invalidate_token' - ); - foreach ($httpmethods as $httpmethod => $methods) { - if (in_array($method, $methods)) { - return $httpmethod; - } - } - throw new \Exception('Can\'t find HTTP method to use for "' . $method . '".'); - } - - /** - * Detects if API call should use multipart/form-data - * - * @param string $method The API method to call - * - * @return bool Whether the method should be sent as multipart - */ - protected function _detectMultipart($method) - { - $multiparts = array( - // Tweets - 'statuses/update_with_media', - - // Users - 'account/update_profile_background_image', - 'account/update_profile_image', - 'account/update_profile_banner' - ); - return in_array($method, $multiparts); - } - - /** - * Detect filenames in upload parameters, - * build multipart request from upload params - * - * @param string $method The API method to call - * @param array $params The parameters to send along - * - * @return void - */ - protected function _buildMultipart($method, $params) - { - // well, files will only work in multipart methods - if (! $this->_detectMultipart($method)) { - return; - } - - // only check specific parameters - $possible_files = array( - // Tweets - 'statuses/update_with_media' => 'media[]', - // Accounts - 'account/update_profile_background_image' => 'image', - 'account/update_profile_image' => 'image', - 'account/update_profile_banner' => 'banner' - ); - // method might have files? - if (! in_array($method, array_keys($possible_files))) { - return; - } - - $possible_files = explode(' ', $possible_files[$method]); - - $multipart_border = '--------------------' . $this->_nonce(); - $multipart_request = ''; - - foreach ($params as $key => $value) { - // is it an array? - if (is_array($value)) { - throw new \Exception('Using URL-encoded parameters is not supported for uploading media.'); - continue; - } - $multipart_request .= - '--' . $multipart_border . "\r\n" - . 'Content-Disposition: form-data; name="' . $key . '"'; - - // check for filenames - if (in_array($key, $possible_files)) { - if (// is it a file, a readable one? - @file_exists($value) - && @is_readable($value) - - // is it a valid image? - && $data = @getimagesize($value) - ) { - if (// is it a supported image format? - in_array($data[2], $this->_supported_media_files) - ) { - // try to read the file - ob_start(); - readfile($value); - $data = ob_get_contents(); - ob_end_clean(); - if (strlen($data) == 0) { - continue; - } - $value = $data; - } - } - - /* - $multipart_request .= - "\r\nContent-Transfer-Encoding: base64"; - $value = base64_encode($value); - */ - } - - $multipart_request .= - "\r\n\r\n" . $value . "\r\n"; - } - $multipart_request .= '--' . $multipart_border . '--'; - - return $multipart_request; - } - - - /** - * Builds the complete API endpoint url - * - * @param string $method The API method to call - * @param string $method_template The API method template to call - * - * @return string The URL to send the request to - */ - protected function _getEndpoint($method, $method_template) - { - if (substr($method, 0, 5) == 'oauth') { - $url = self::$_endpoint_oauth . $method; - } else { - $url = self::$_endpoint . $method . '.json'; - } - return $url; - } - - /** - * Calls the API using cURL - * - * @param string $httpmethod The HTTP method to use for making the request - * @param string $method The API method to call - * @param string $method_template The templated API method to call - * @param array optional $params The parameters to send along - * @param bool optional $multipart Whether to use multipart/form-data - * @param bool optional $app_only_auth Whether to use app-only bearer authentication - * - * @return mixed The API reply, encoded in the set return_format - */ - - protected function _callApi($httpmethod, $method, $method_template, $params = array(), $multipart = false, $app_only_auth = false) - { - if (! function_exists('curl_init')) { - throw new \Exception('To make API requests, the PHP curl extension must be available.'); - } - $url = $this->_getEndpoint($method, $method_template); - $ch = false; - if ($httpmethod == 'GET') { - $url_with_params = $url; - if (count($params) > 0) { - $url_with_params .= '?' . http_build_query($params); - } - $authorization = $this->_sign($httpmethod, $url, $params); - $ch = curl_init($url_with_params); - } else { - if ($multipart) { - $authorization = $this->_sign($httpmethod, $url, array()); - $params = $this->_buildMultipart($method_template, $params); - } else { - $authorization = $this->_sign($httpmethod, $url, $params); - $params = http_build_query($params); - } - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, $params); - } - if ($app_only_auth) { - if (self::$_oauth_consumer_key == null) { - throw new \Exception('To make an app-only auth API request, the consumer key must be set.'); - } - // automatically fetch bearer token, if necessary - if (self::$_oauth_bearer_token == null) { - $this->oauth2_token(); - } - $authorization = 'Authorization: Bearer ' . self::$_oauth_bearer_token; - } - $request_headers = array(); - if (isset($authorization)) { - $request_headers[] = $authorization; - $request_headers[] = 'Expect:'; - } - if ($multipart) { - $first_newline = strpos($params, "\r\n"); - $multipart_boundary = substr($params, 2, $first_newline - 2); - $request_headers[] = 'Content-Length: ' . strlen($params); - $request_headers[] = 'Content-Type: multipart/form-data; boundary=' - . $multipart_boundary; - } - - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); - curl_setopt($ch, CURLOPT_HEADER, 1); - curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); - curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem'); - - $reply = curl_exec($ch); - - // certificate validation results - $validation_result = curl_errno($ch); - if (in_array( - $validation_result, - array( - CURLE_SSL_CERTPROBLEM, - CURLE_SSL_CACERT, - CURLE_SSL_CACERT_BADFILE, - CURLE_SSL_CRL_BADFILE, - CURLE_SSL_ISSUER_ERROR - ) - ) - ) { - throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.'); - } - - $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $reply = $this->_parseApiReply($method_template, $reply); - if ($this->_return_format == CODEBIRD_RETURNFORMAT_OBJECT) { - $reply->httpstatus = $httpstatus; - } elseif ($this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY) { - $reply['httpstatus'] = $httpstatus; - } - return $reply; - } - - /** - * Parses the API reply to encode it in the set return_format - * - * @param string $method The method that has been called - * @param string $reply The actual reply, JSON-encoded or URL-encoded - * - * @return array|object The parsed reply - */ - protected function _parseApiReply($method, $reply) - { - // split headers and body - $headers = array(); - $reply = explode("\r\n\r\n", $reply, 4); - - // check if using proxy - if (substr($reply[0], 0, 35) === 'HTTP/1.1 200 Connection Established') { - array_shift($reply); - } elseif (count($reply) > 2) { - $headers = array_shift($reply); - $reply = array( - $headers, - implode("\r\n", $reply) - ); - } - - $headers_array = explode("\r\n", $reply[0]); - foreach ($headers_array as $header) { - $header_array = explode(': ', $header, 2); - $key = $header_array[0]; - $value = ''; - if (count($header_array) > 1) { - $value = $header_array[1]; - } - $headers[$key] = $value; - } - if (count($reply) > 1) { - $reply = $reply[1]; - } else { - $reply = ''; - } - - $need_array = $this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY; - if ($reply == '[]') { - switch ($this->_return_format) { - case CODEBIRD_RETURNFORMAT_ARRAY: - return array(); - case CODEBIRD_RETURNFORMAT_JSON: - return '{}'; - case CODEBIRD_RETURNFORMAT_OBJECT: - return new \stdClass; - } - } - $parsed = array(); - if (! $parsed = json_decode($reply, $need_array)) { - if ($reply) { - if (stripos($reply, '<' . '?xml version="1.0" encoding="UTF-8"?' . '>') === 0) { - // we received XML... - // since this only happens for errors, - // don't perform a full decoding - preg_match('/(.*)<\/request>/', $reply, $request); - preg_match('/(.*)<\/error>/', $reply, $error); - $parsed['request'] = htmlspecialchars_decode($request[1]); - $parsed['error'] = htmlspecialchars_decode($error[1]); - } else { - // assume query format - $reply = explode('&', $reply); - foreach ($reply as $element) { - if (stristr($element, '=')) { - list($key, $value) = explode('=', $element); - $parsed[$key] = $value; - } else { - $parsed['message'] = $element; - } - } - } - } - $reply = json_encode($parsed); - } - switch ($this->_return_format) { - case CODEBIRD_RETURNFORMAT_ARRAY: - return $parsed; - case CODEBIRD_RETURNFORMAT_JSON: - return $reply; - case CODEBIRD_RETURNFORMAT_OBJECT: - return (object) $parsed; - } - return $parsed; - } -} - -?> diff --git a/sources/extend/addon/matrix/twitter/lang/C/messages.po b/sources/extend/addon/matrix/twitter/lang/C/messages.po deleted file mode 100644 index fa058ba4..00000000 --- a/sources/extend/addon/matrix/twitter/lang/C/messages.po +++ /dev/null @@ -1,120 +0,0 @@ -# ADDON twitter -# Copyright (C) -# This file is distributed under the same license as the Friendica twitter addon package. -# -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-27 05:01-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: twitter.php:77 -msgid "Post to Twitter" -msgstr "" - -#: twitter.php:129 -msgid "Twitter settings updated." -msgstr "" - -#: twitter.php:157 -msgid "Twitter Posting Settings" -msgstr "" - -#: twitter.php:164 -msgid "" -"No consumer key pair for Twitter found. Please contact your site " -"administrator." -msgstr "" - -#: twitter.php:183 -msgid "" -"At this Friendica instance the Twitter plugin was enabled but you have not " -"yet connected your account to your Twitter account. To do so click the " -"button below to get a PIN from Twitter which you have to copy into the input " -"box below and submit the form. Only your public posts will " -"be posted to Twitter." -msgstr "" - -#: twitter.php:184 -msgid "Log in with Twitter" -msgstr "" - -#: twitter.php:186 -msgid "Copy the PIN from Twitter here" -msgstr "" - -#: twitter.php:191 twitter.php:229 twitter.php:556 -msgid "Submit" -msgstr "" - -#: twitter.php:200 -msgid "Currently connected to: " -msgstr "" - -#: twitter.php:201 -msgid "" -"If enabled all your public postings can be posted to the " -"associated Twitter account. You can choose to do so by default (here) or for " -"every posting separately in the posting options when writing the entry." -msgstr "" - -#: twitter.php:203 -msgid "" -"Note: Due your privacy settings (Hide your profile " -"details from unknown viewers?) the link potentially included in public " -"postings relayed to Twitter will lead the visitor to a blank page informing " -"the visitor that the access to your profile has been restricted." -msgstr "" - -#: twitter.php:206 -msgid "Allow posting to Twitter" -msgstr "" - -#: twitter.php:209 -msgid "Send public postings to Twitter by default" -msgstr "" - -#: twitter.php:213 -msgid "Mirror all posts from twitter that are no replies or retweets" -msgstr "" - -#: twitter.php:217 -msgid "Shortening method that optimizes the tweet" -msgstr "" - -#: twitter.php:221 -msgid "Send linked #-tags and @-names to Twitter" -msgstr "" - -#: twitter.php:226 -msgid "Clear OAuth configuration" -msgstr "" - -#: twitter.php:550 -msgid "Settings updated." -msgstr "" - -#: twitter.php:558 -msgid "Consumer key" -msgstr "" - -#: twitter.php:559 -msgid "Consumer secret" -msgstr "" - -#: twitter.php:560 -msgid "Name of the Twitter Application" -msgstr "" - -#: twitter.php:560 -msgid "set this to avoid mirroring postings from ~friendica back to ~friendica" -msgstr "" diff --git a/sources/extend/addon/matrix/twitter/lang/ca/strings.php b/sources/extend/addon/matrix/twitter/lang/ca/strings.php deleted file mode 100644 index 203c9a1f..00000000 --- a/sources/extend/addon/matrix/twitter/lang/ca/strings.php +++ /dev/null @@ -1,24 +0,0 @@ -strings["Post to Twitter"] = "Publica-ho al Twitter"; -$a->strings["Twitter settings updated."] = "La configuració de Twitter actualitzada."; -$a->strings["Twitter Posting Settings"] = "Configuració d'Enviaments per a Twitter"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No s'ha pogut emparellar cap clau \"consumer key\" per a Twitter. Si us plau, poseu-vos en contacte amb l'administrador del lloc."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "En aquesta instància Friendica el plugin Twitter va ser habilitat, però encara no ha connectat el compte al seu compte de Twitter. Per a això feu clic al botó de sota per obtenir un PIN de Twitter que ha de copiar a la casella de sota i enviar el formulari. Només els missatges públics es publicaran a Twitter."; -$a->strings["Log in with Twitter"] = "Accedeixi com en Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Copieu el codi PIN de Twitter aquí"; -$a->strings["Submit"] = "Enviar"; -$a->strings["Currently connected to: "] = "Actualment connectat a: "; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Si està activat, tots els seus anuncis públics poden ser publicats en el corresponent compte de Twitter. Vostè pot optar per fer-ho per defecte (en aquest cas) o per cada missatge per separat en les opcions de comptabilització en escriure l'entrada."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Nota: donada la seva configuració de privacitat ( Amaga els detalls del teu perfil dels espectadors desconeguts? ) el vincle potencialment inclòs en anuncis públics retransmesos a Twitter conduirà al visitant a una pàgina en blanc informar als visitants que l'accés al seu perfil s'ha restringit."; -$a->strings["Allow posting to Twitter"] = "Permetre anunci a Twitter"; -$a->strings["Send public postings to Twitter by default"] = "Enviar anuncis públics a Twitter per defecte"; -$a->strings["Mirror all posts from twitter that are no replies or retweets"] = ""; -$a->strings["Shortening method that optimizes the tweet"] = ""; -$a->strings["Send linked #-tags and @-names to Twitter"] = "Enviar enllaços #-etiquetes i @-noms a Twitter"; -$a->strings["Clear OAuth configuration"] = "Esborrar configuració de OAuth"; -$a->strings["Settings updated."] = "Ajustos actualitzats."; -$a->strings["Consumer key"] = "Consumer key"; -$a->strings["Consumer secret"] = "Consumer secret"; -$a->strings["Name of the Twitter Application"] = ""; -$a->strings["set this to avoid mirroring postings from ~friendica back to ~friendica"] = ""; diff --git a/sources/extend/addon/matrix/twitter/lang/cs/strings.php b/sources/extend/addon/matrix/twitter/lang/cs/strings.php deleted file mode 100644 index 1e4f927c..00000000 --- a/sources/extend/addon/matrix/twitter/lang/cs/strings.php +++ /dev/null @@ -1,21 +0,0 @@ -strings["Post to Twitter"] = "Poslat příspÄ›vek na Twitter"; -$a->strings["Twitter settings updated."] = "Nastavení Twitteru aktualizováno."; -$a->strings["Twitter Posting Settings"] = "Nastavení zasílání příspÄ›vků na Twitter "; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nenalezen žádný spotÅ™ebitelský páru klíÄů pro Twitter. ObraÅ¥te se na administrátora webu."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "Na této Friendica instanci je sice povolen Twitter plugin, ale vy jste si jeÅ¡tÄ› nenastavili svůj Twitter úÄet. Svůj úÄet si můžete nastavit kliknutím na tlaÄítko níže k získání PINu z VaÅ¡eho Twitteru, který si zkopírujte do níže uvedeného vstupního pole a odeÅ¡lete formulář. Pouze vaÅ¡e veÅ™ejné příspÄ›vky budou zaslány na Twitter."; -$a->strings["Log in with Twitter"] = "PÅ™ihlásit se s Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Zkopírujte sem PIN z Twitteru"; -$a->strings["Submit"] = "Odeslat"; -$a->strings["Currently connected to: "] = "V souÄasné dobÄ› pÅ™ipojen k:"; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Je-li povoleno, vÅ¡echny VaÅ¡e veÅ™ejné příspÄ›vky mohou být zaslány na související Twitter úÄet. Můžete si vybrat, zda-li toto bude výchozí nastavení (zde), nebo budete mít možnost si vybrat požadované chování pÅ™i psaní každého příspÄ›vku."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "UpozornÄ›ní: Z důvodů VaÅ¡eho nastavení ochrany soukromí ( Skrýt VaÅ¡e profilové detaily pÅ™ed neznámými Ätenáři?) -odkaz potenciálnÄ› zahrnutý ve VaÅ¡ich veÅ™ejných příspÄ›vcích poslaných do sítÄ› Twitter pÅ™esmÄ›ruje návÅ¡tÄ›vníky na prázdnou stránku informující návÅ¡tÄ›vníky, že přístup k vaÅ¡emu profilu je omezen."; -$a->strings["Allow posting to Twitter"] = "Povolit odesílání na Twitter"; -$a->strings["Send public postings to Twitter by default"] = "DefaultnÄ› zasílat veÅ™ejné komentáře na Twitter"; -$a->strings["Send linked #-tags and @-names to Twitter"] = "Poslat propojené #-tagy a @-jména na Twitter"; -$a->strings["Clear OAuth configuration"] = "Vymazat konfiguraci OAuth"; -$a->strings["Settings updated."] = "Nastavení aktualizováno."; -$a->strings["Consumer key"] = "Consumer key"; -$a->strings["Consumer secret"] = "Consumer secret"; diff --git a/sources/extend/addon/matrix/twitter/lang/de/strings.php b/sources/extend/addon/matrix/twitter/lang/de/strings.php deleted file mode 100644 index 29d0fde9..00000000 --- a/sources/extend/addon/matrix/twitter/lang/de/strings.php +++ /dev/null @@ -1,24 +0,0 @@ -strings["Post to Twitter"] = "Bei Twitter veröffentlichen"; -$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert."; -$a->strings["Twitter Posting Settings"] = "Twitter-Beitragseinstellungen"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur öffentliche Beiträge werden bei Twitter veröffentlicht."; -$a->strings["Log in with Twitter"] = "bei Twitter anmelden"; -$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her"; -$a->strings["Submit"] = "Senden"; -$a->strings["Currently connected to: "] = "Momentan verbunden mit: "; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert, können all deine öffentlichen Einträge auf dem verbundenen Twitter-Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Hinweis: Aufgrund deiner Privatsphären-Einstellungen (Profil-Details vor unbekannten Betrachtern verbergen?) wird der Link, der eventuell an an deinen Twitter-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde."; -$a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben"; -$a->strings["Send public postings to Twitter by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter"; -$a->strings["Mirror all posts from twitter that are no replies or retweets"] = "Spiegle alle Beiträge von Twitter die keine Antworten oder wiederholten Nachrichten sind"; -$a->strings["Shortening method that optimizes the tweet"] = "Kürzungsverfahren, das den Tweet optimiert"; -$a->strings["Send linked #-tags and @-names to Twitter"] = "Sende verlinkte #-Tags und @-Namen nach Twitter"; -$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen"; -$a->strings["Settings updated."] = "Einstellungen aktualisiert."; -$a->strings["Consumer key"] = "Consumer Key"; -$a->strings["Consumer secret"] = "Consumer Secret"; -$a->strings["Name of the Twitter Application"] = "Name der Twitter Anwendung"; -$a->strings["set this to avoid mirroring postings from ~friendica back to ~friendica"] = "Setze dies um eine Spiegelung von ~friendica zu ~friendica zu vermeiden"; diff --git a/sources/extend/addon/matrix/twitter/lang/eo/strings.php b/sources/extend/addon/matrix/twitter/lang/eo/strings.php deleted file mode 100644 index cce714e7..00000000 --- a/sources/extend/addon/matrix/twitter/lang/eo/strings.php +++ /dev/null @@ -1,20 +0,0 @@ -strings["Post to Twitter"] = "AfiÅi ĉe Twitter"; -$a->strings["Twitter settings updated."] = "Äœisdatigis Twitter agordojn."; -$a->strings["Twitter Posting Settings"] = "Agordoj por afiÅi ĉe Twitter"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ne trovis klientajn Ålosilojn por Twitter. Bonvolu kontakti vian retejan administranton."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "Je ĉi tiu Friendica retejo, la Twitter kromprogramo jam estas Åaltita, sed via konto anokoraÅ­ ne estas konektita kun via Twitter konto. Por fari tion, klaku la supran butonon por atingi nombrokodon de Twitter, kion vi kopiu en la supran eniga ĉelo, kaj sendu la formularon. Nur viaj publikaj afiÅoj estas plusendota al Twitter. "; -$a->strings["Log in with Twitter"] = "Ensaluti kun Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Alglui la PIN de Twitter ĉi tie"; -$a->strings["Submit"] = "Sendi"; -$a->strings["Currently connected to: "] = "Konektita al:"; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Kiam Åaltita, ĉiuj publikaj afiÅoj de vi ankaÅ­ eblas esti afiÅota al la asociigita Twitter konto. Vi povas elekti Äin defaÅ­lte (ĉi tie) au unuope por ĉiuj afiÅoj kiam vi skribos ilin."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Averto: LaÅ­ viaj privatecaj agordoj (KaÅi viajn profilajn detalojn al nekonataj spektantoj?), la ligilo en publikaj afiÅoj plusendata al Twitter gvidas vizitontojn al malplena paÄo sciigante ilin ke atingo al via profilo estas lmitigita."; -$a->strings["Allow posting to Twitter"] = "Permesi afiÅojn al Twitter"; -$a->strings["Send public postings to Twitter by default"] = "DefaÅ­lte sendi publikajn afiÅojn al Twitter"; -$a->strings["Send linked #-tags and @-names to Twitter"] = "Sendi ligitajn #-etikedojn kaj @-nomon al Twitter"; -$a->strings["Clear OAuth configuration"] = "ForviÅi OAuth agordojn"; -$a->strings["Settings updated."] = "Agordoj Äisdatigita."; -$a->strings["Consumer key"] = "Åœlosilo de Kliento"; -$a->strings["Consumer secret"] = "Sekreto de Kliento"; diff --git a/sources/extend/addon/matrix/twitter/lang/es/strings.php b/sources/extend/addon/matrix/twitter/lang/es/strings.php deleted file mode 100644 index 2169f393..00000000 --- a/sources/extend/addon/matrix/twitter/lang/es/strings.php +++ /dev/null @@ -1,20 +0,0 @@ -strings["Post to Twitter"] = "Publicar en Twitter"; -$a->strings["Twitter settings updated."] = "Actualización de la configuración de Twitter"; -$a->strings["Twitter Posting Settings"] = "Configuración de publicaciones en Twitter"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No se ha encontrado ningún par de claves para Twitter. Póngase en contacto con el administrador del sitio."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "En esta instalación de Friendica el módulo de Twitter está activo pero aún no has conectado tu cuenta con la de Twitter. Para hacerlo, pulsa en el siguiente botón para obtener un PIN de Twitter, que deberás introducir en la casilla de abajo y enviar el formulario. Unicamente el contenido público que publiques será publicado en Twitter."; -$a->strings["Log in with Twitter"] = "Acceder con Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Copia el PIN de Twitter aquí"; -$a->strings["Submit"] = "Envíar"; -$a->strings["Currently connected to: "] = "Actualmente conectado a:"; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Si lo habilitas todas tus publicaciones públicas serán publicadas en la cuenta de Twitter asociada. Puedes elegir hacerlo por defecto (aquí) o individualmente para cada publicación usando las opciones cuando escribas."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Nota: Debido a tus opciones de privacidad (¿Ocultar los detalles de tu perfil de espectadores desconocidos?) el vínculo potencialmente incluido en publicaciones públicas que se transmiten a Twitter conducirá al visitante a una página en blanco que informa a los visitantes que el acceso a tu perfil es restringido."; -$a->strings["Allow posting to Twitter"] = "Permitir publicar en Twitter"; -$a->strings["Send public postings to Twitter by default"] = "Enviar publicaciones públicas a Twitter por defecto"; -$a->strings["Send linked #-tags and @-names to Twitter"] = "Enviar a Twitter las #-etiquetas y @-nombres"; -$a->strings["Clear OAuth configuration"] = "Borrar la configuración de OAuth"; -$a->strings["Settings updated."] = "Configuración actualizada."; -$a->strings["Consumer key"] = "Clave del usuario"; -$a->strings["Consumer secret"] = "Secreto del usuario"; diff --git a/sources/extend/addon/matrix/twitter/lang/fr/strings.php b/sources/extend/addon/matrix/twitter/lang/fr/strings.php deleted file mode 100644 index 46cb2970..00000000 --- a/sources/extend/addon/matrix/twitter/lang/fr/strings.php +++ /dev/null @@ -1,20 +0,0 @@ -strings["Post to Twitter"] = "Poster sur Twitter"; -$a->strings["Twitter settings updated."] = "Réglages de Twitter mis-à-jour."; -$a->strings["Twitter Posting Settings"] = "Réglages du connecteur Twitter"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Pas de paire de clés pour Twitter. Merci de contacter l'administrateur du site."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "Sur cette instance de Friendica, le connecteur Twitter a été activé, mais vous n'avez pas encore connecté votre compte local à votre compte Twitter. Pour ce faire, cliquer sur le bouton ci-dessous. Vous obtiendrez alors un 'PIN' de Twitter, que vous devrez copier dans le champ ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront transmis à Twitter."; -$a->strings["Log in with Twitter"] = "Se connecter à Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Copier le PIN de Twitter ici"; -$a->strings["Submit"] = "Envoyer"; -$a->strings["Currently connected to: "] = "Actuellement connecté à: "; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "En cas d'activation, toutes vos notices publiques seront transmises au compte Twitter associé. Vous pourrez choisir de le faire par défaut (ici), ou bien pour chaque notice séparément lors de sa rédaction."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Note: Du fait de vos réglages de vie privée (Cacher les détails de votre profil des visiteurs inconnus?), le lien potentiellement inclus dans les messages publics relayés vers Twitter conduira les visiteurs vers une page blanche les informant que leur accès à votre profil a été restreint."; -$a->strings["Allow posting to Twitter"] = "Autoriser la publication sur Twitter"; -$a->strings["Send public postings to Twitter by default"] = "Envoyer les éléments publics sur Twitter par défaut"; -$a->strings["Send linked #-tags and @-names to Twitter"] = "Envoyer les liens vers les #-tags et les @-noms sur Twitter"; -$a->strings["Clear OAuth configuration"] = "Effacer la configuration OAuth"; -$a->strings["Settings updated."] = "Réglages mis à jour."; -$a->strings["Consumer key"] = "Clé utilisateur"; -$a->strings["Consumer secret"] = "Secret utilisateur"; diff --git a/sources/extend/addon/matrix/twitter/lang/is/strings.php b/sources/extend/addon/matrix/twitter/lang/is/strings.php deleted file mode 100644 index edd7809b..00000000 --- a/sources/extend/addon/matrix/twitter/lang/is/strings.php +++ /dev/null @@ -1,20 +0,0 @@ -strings["Post to Twitter"] = "Senda færslu á Twitter"; -$a->strings["Twitter settings updated."] = "Stillingar Twitter uppfærðar."; -$a->strings["Twitter Posting Settings"] = "Twitter færslu stillingar"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ekkert notenda lykils par fyrir Twitter fundið. Hafðu samband við kerfisstjórann."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = ""; -$a->strings["Log in with Twitter"] = "Innskrá með Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Afrita PIN frá Twitter hingað"; -$a->strings["Submit"] = "Senda inn"; -$a->strings["Currently connected to: "] = "Núna tengdur við:"; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Ef virkt þá geta allar opinberu stöðu meldingarnar þínar verið birtar á tengdri StatusNet síðu. Þú getur valið að gera þetta sjálfvirkt (hér) eða fyrir hvern póst í senn þegar hann er skrifaður."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = ""; -$a->strings["Allow posting to Twitter"] = "Leyfa færslum að flæða á Twitter"; -$a->strings["Send public postings to Twitter by default"] = "Senda sjálfgefið opinberar færslur á Twitter"; -$a->strings["Send linked #-tags and @-names to Twitter"] = ""; -$a->strings["Clear OAuth configuration"] = "Hreinsa OAuth stillingar"; -$a->strings["Settings updated."] = "Stillingar uppfærðar"; -$a->strings["Consumer key"] = "Lykill neytanda"; -$a->strings["Consumer secret"] = "Leyndarmál neytanda"; diff --git a/sources/extend/addon/matrix/twitter/lang/it/strings.php b/sources/extend/addon/matrix/twitter/lang/it/strings.php deleted file mode 100644 index a67a4c1d..00000000 --- a/sources/extend/addon/matrix/twitter/lang/it/strings.php +++ /dev/null @@ -1,24 +0,0 @@ -strings["Post to Twitter"] = "Invia a Twitter"; -$a->strings["Twitter settings updated."] = "Impostazioni di Twitter aggiornate."; -$a->strings["Twitter Posting Settings"] = "Impostazioni di invio a Twitter"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nessuna coppia di chiavi per Twitter trovata. Contatta l'amministratore del sito."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "Il plugin Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post pubblici saranno inviati a Twitter."; -$a->strings["Log in with Twitter"] = "Accedi con Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Copia il PIN da Twitter qui"; -$a->strings["Submit"] = "Invia"; -$a->strings["Currently connected to: "] = "Al momento connesso con:"; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se abilitato tutti i tuoi messaggi pubblici possono essere inviati all'account Twitter associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Nota: A causa delle tue impostazioni di privacy(Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?) il link potenzialmente incluse nei messaggi pubblici inviati a Twitter porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato."; -$a->strings["Allow posting to Twitter"] = "Permetti l'invio a Twitter"; -$a->strings["Send public postings to Twitter by default"] = "Invia sempre i messaggi pubblici a Twitter"; -$a->strings["Mirror all posts from twitter that are no replies or retweets"] = ""; -$a->strings["Shortening method that optimizes the tweet"] = ""; -$a->strings["Send linked #-tags and @-names to Twitter"] = ""; -$a->strings["Clear OAuth configuration"] = "Rimuovi la configurazione OAuth"; -$a->strings["Settings updated."] = "Impostazioni aggiornate."; -$a->strings["Consumer key"] = "Consumer key"; -$a->strings["Consumer secret"] = "Consumer secret"; -$a->strings["Name of the Twitter Application"] = ""; -$a->strings["set this to avoid mirroring postings from ~friendica back to ~friendica"] = ""; diff --git a/sources/extend/addon/matrix/twitter/lang/nb-no/strings.php b/sources/extend/addon/matrix/twitter/lang/nb-no/strings.php deleted file mode 100644 index 00a0f111..00000000 --- a/sources/extend/addon/matrix/twitter/lang/nb-no/strings.php +++ /dev/null @@ -1,20 +0,0 @@ -strings["Post to Twitter"] = "Post til Twitter"; -$a->strings["Twitter settings updated."] = "Twitter-innstilinger oppdatert."; -$a->strings["Twitter Posting Settings"] = "Innstillinger for posting til Twitter"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ingen \"consumer key pair\" for Twitter funnet. Vennligst kontakt stedets administrator."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "Ved denne Friendica-forekomsten er Twitter-tillegget aktivert, men du har ennÃ¥ ikke tilkoblet din konto til din Twitter-konto. For Ã¥ gjøre det, klikk pÃ¥ knappen nedenfor for Ã¥ fÃ¥ en PIN-kode fra Twitter som du mÃ¥ kopiere inn i feltet nedenfor og sende inn skjemaet. Bare dine offentlige innlegg vil bli lagt inn pÃ¥ Twitter. "; -$a->strings["Log in with Twitter"] = "Logg inn via Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Kopier PIN-kode fra Twitter hit"; -$a->strings["Submit"] = "Lagre"; -$a->strings["Currently connected to: "] = "For øyeblikket tilkoblet til:"; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Aktivering gjør at alle dine offentlige innlegg kan postes til den tilknyttede Twitter-kontoen. Du kan velge Ã¥ gjøre dette som standard (her), eller for hvert enkelt innlegg separat i valgmulighetene for posting nÃ¥r du skriver et innlegg."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = ""; -$a->strings["Allow posting to Twitter"] = "Tillat posting til Twitter"; -$a->strings["Send public postings to Twitter by default"] = "Send offentlige innlegg til Twitter som standard"; -$a->strings["Send linked #-tags and @-names to Twitter"] = ""; -$a->strings["Clear OAuth configuration"] = "Fjern OAuth-konfigurasjon"; -$a->strings["Settings updated."] = "Innstillinger oppdatert."; -$a->strings["Consumer key"] = "Consumer key"; -$a->strings["Consumer secret"] = "Consumer secret"; diff --git a/sources/extend/addon/matrix/twitter/lang/pl/strings.php b/sources/extend/addon/matrix/twitter/lang/pl/strings.php deleted file mode 100644 index 54d3acae..00000000 --- a/sources/extend/addon/matrix/twitter/lang/pl/strings.php +++ /dev/null @@ -1,24 +0,0 @@ -strings["Post to Twitter"] = "Post na Twitter"; -$a->strings["Twitter settings updated."] = "Zaktualizowano ustawienia Twittera."; -$a->strings["Twitter Posting Settings"] = "Ustawienia wpisów z Twittera"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nie znaleziono pary dla Twittera. ProszÄ™ skontaktować siÄ™ z admininstratorem strony."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = ""; -$a->strings["Log in with Twitter"] = "Zaloguj siÄ™ przez Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Skopiuj tutaj PIN z Twittera"; -$a->strings["Submit"] = "Potwierdź"; -$a->strings["Currently connected to: "] = "Obecnie poÅ‚Ä…czone z:"; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = ""; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = ""; -$a->strings["Allow posting to Twitter"] = "Zezwól na opublikowanie w serwisie Twitter"; -$a->strings["Send public postings to Twitter by default"] = ""; -$a->strings["Mirror all posts from twitter that are no replies or retweets"] = ""; -$a->strings["Shortening method that optimizes the tweet"] = ""; -$a->strings["Send linked #-tags and @-names to Twitter"] = ""; -$a->strings["Clear OAuth configuration"] = ""; -$a->strings["Settings updated."] = "Zaktualizowano ustawienia."; -$a->strings["Consumer key"] = "Klucz konsumenta"; -$a->strings["Consumer secret"] = "Sekret konsumenta"; -$a->strings["Name of the Twitter Application"] = ""; -$a->strings["set this to avoid mirroring postings from ~friendica back to ~friendica"] = ""; diff --git a/sources/extend/addon/matrix/twitter/lang/pt-br/strings.php b/sources/extend/addon/matrix/twitter/lang/pt-br/strings.php deleted file mode 100644 index 8ef9edeb..00000000 --- a/sources/extend/addon/matrix/twitter/lang/pt-br/strings.php +++ /dev/null @@ -1,20 +0,0 @@ -strings["Post to Twitter"] = "Publicar no Twitter"; -$a->strings["Twitter settings updated."] = "As atualizações do Twitter foram atualizadas."; -$a->strings["Twitter Posting Settings"] = "Configurações de publicação no Twitter"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Não foi encontrado nenhum par de chaves de consumidor para o Twitter. Por favor, entre em contato com o administrador do site."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "Nessa instância do Friendica o plugin Twitter foi habilitado mas você ainda não conectou sua conta à conta do Twitter. Para assim o fazer clique no botão abaixo para pegar o PIN do Twitter que você deverar copiar na caixa de entrada abaixo e enviar o formulário. Somente suas postagens públicas serão repostadas no Twitter."; -$a->strings["Log in with Twitter"] = "Autenticar-se no Twitter"; -$a->strings["Copy the PIN from Twitter here"] = "Copie o PIN do Twitter aqui"; -$a->strings["Submit"] = "Enviar"; -$a->strings["Currently connected to: "] = "Atualmente conectado como: "; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se habilitado, todas as suas publicações públicas podem ser publicadas na sua conta Twitter associada. Você pode escolher entre publicar tudo automaticamente (marcando aqui) ou selecionar o que será enviado individualmente (nas opções de publicação, durante o processo de escrita da mensagem)."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Aviso: Devido às suas configurações de privacidade (Ocultar os detalhes do seu perfil para pessoas desconhecidas?) o link potencialmente incluído nas publicações públicas encaminhadas para o Twitter levarão o visitante a uma página contendo a informação de que o acesso ao seu perfil é restrito."; -$a->strings["Allow posting to Twitter"] = "Permitir a publicação no Twitter"; -$a->strings["Send public postings to Twitter by default"] = "Enviar as publicações públicas automaticamente para o Twitter"; -$a->strings["Send linked #-tags and @-names to Twitter"] = ""; -$a->strings["Clear OAuth configuration"] = "Limpar a configuração OAuth"; -$a->strings["Settings updated."] = "As configurações foram atualizadas."; -$a->strings["Consumer key"] = "Chave de consumidor"; -$a->strings["Consumer secret"] = "Segredo de consumidor"; diff --git a/sources/extend/addon/matrix/twitter/lang/ru/strings.php b/sources/extend/addon/matrix/twitter/lang/ru/strings.php deleted file mode 100644 index 98112c88..00000000 --- a/sources/extend/addon/matrix/twitter/lang/ru/strings.php +++ /dev/null @@ -1,20 +0,0 @@ -strings["Post to Twitter"] = "Отправить в Твиттер"; -$a->strings["Twitter settings updated."] = "ÐаÑтройки Твиттера обновлены."; -$a->strings["Twitter Posting Settings"] = "ÐаÑтройка отправки Ñообщений в Твиттер"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ðе найдено пары потребительÑких ключей Ð´Ð»Ñ Ð¢Ð²Ð¸Ñ‚Ñ‚ÐµÑ€Ð°. ПожалуйÑта, обратитеÑÑŒ к админиÑтратору Ñайта."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = ""; -$a->strings["Log in with Twitter"] = "Войдите Ñ Ð¢Ð²Ð¸Ñ‚Ñ‚ÐµÑ€Ð¾Ð¼"; -$a->strings["Copy the PIN from Twitter here"] = "Скопируйте PIN Ñ Twitter здеÑÑŒ"; -$a->strings["Submit"] = "Подтвердить"; -$a->strings["Currently connected to: "] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñоединены Ñ: "; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "ЕÑли включено, то вÑе ваши общеÑтвенные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть отправлены на ÑвÑзанный аккаунт Твиттер. Ð’Ñ‹ можете Ñделать Ñто по умолчанию (здеÑÑŒ) или Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾ при напиÑании запиÑи."; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = ""; -$a->strings["Allow posting to Twitter"] = "Разрешить отправку Ñообщений на Twitter"; -$a->strings["Send public postings to Twitter by default"] = "ОтправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñех на Твиттер по умолчанию"; -$a->strings["Send linked #-tags and @-names to Twitter"] = ""; -$a->strings["Clear OAuth configuration"] = "ОчиÑтить конфигурацию OAuth"; -$a->strings["Settings updated."] = "ÐаÑтройки обновлены."; -$a->strings["Consumer key"] = "Consumer key"; -$a->strings["Consumer secret"] = "Consumer secret"; diff --git a/sources/extend/addon/matrix/twitter/lang/sv/strings.php b/sources/extend/addon/matrix/twitter/lang/sv/strings.php deleted file mode 100644 index 02cb3fdd..00000000 --- a/sources/extend/addon/matrix/twitter/lang/sv/strings.php +++ /dev/null @@ -1,11 +0,0 @@ -strings["Post to Twitter"] = "Lägg in på Twitter"; -$a->strings["Twitter Posting Settings"] = "Inställningar för inlägg på Twitter"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No consumer key pair for Twitter found. Please contact your site administrator."; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."; -$a->strings["Copy the PIN from Twitter here"] = "Ange PIN-koden från Twitter här"; -$a->strings["Submit"] = "Spara"; -$a->strings["Currently connected to: "] = "Ansluten till: "; -$a->strings["Clear OAuth configuration"] = "Clear OAuth configuration"; -$a->strings["Settings updated."] = "Inställningarna har uppdaterats."; diff --git a/sources/extend/addon/matrix/twitter/lang/zh-cn/strings.php b/sources/extend/addon/matrix/twitter/lang/zh-cn/strings.php deleted file mode 100644 index 9f8f7058..00000000 --- a/sources/extend/addon/matrix/twitter/lang/zh-cn/strings.php +++ /dev/null @@ -1,24 +0,0 @@ -strings["Post to Twitter"] = "å‘é€åˆ°åœ¨Twitter"; -$a->strings["Twitter settings updated."] = "Twitter设置更新了。"; -$a->strings["Twitter Posting Settings"] = "Twitterå‘é€è®¾ç½®"; -$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "找ä¸åˆ°Twitter的消费钥匙åŒã€‚请è”系您的网页行政人员。"; -$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your public posts will be posted to Twitter."] = "在这个Friendica网站使Twitteræ’件å¯ç”¨çš„å¯æ‚¨è¿˜æ²¡æœ‰æŠŠæ‚¨çš„账户和您Twitter账户连通。为这åšç‚¹å‡»ä¸‹è¾¹çš„按钮得到密ç ä»ŽTwitter您è¦ç²˜è´´åœ¨ä¸‹è¾¹çš„输入框和æ交。åªæ‚¨çš„公开文章被å‘é€åˆ°Twitter。"; -$a->strings["Log in with Twitter"] = "用Twitter登记"; -$a->strings["Copy the PIN from Twitter here"] = "å¤åˆ¶Twitter密ç è¿™å„¿"; -$a->strings["Submit"] = "æ交"; -$a->strings["Currently connected to: "] = "现在连接到:"; -$a->strings["If enabled all your public postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "如果使å¯ç”¨çš„都您公开的文章会被å‘é€åˆ°æœ‰å…³çš„Twitter账户。您会选择默认地这样åšï¼ˆè¿™å„¿ï¼‰æˆ–个文章分开地写字时候选择在文章设置。"; -$a->strings["Note: Due your privacy settings (Hide your profile details from unknown viewers?) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "注æ„:由于您的éšç§è®¾ç½®ï¼ˆéšè—您的简介内容为生人?)环节包括在转播到Twitterçš„æ¡æ–‡å¯èƒ½é€šç©ºç™½é¡µé€šçŸ¥çœ‹è€…看您的简介有é™ã€‚"; -$a->strings["Allow posting to Twitter"] = "å…许å‘é€åˆ°Twitter"; -$a->strings["Send public postings to Twitter by default"] = "默认地å‘é€å…¬å¼€æ–‡ç« åˆ°Twitter"; -$a->strings["Mirror all posts from twitter that are no replies or retweets"] = "å¤åˆ¶æ‰€æœ‰æ–‡ç« ä»Žtwitter除了回答或å¤å‡†æ–‡ä»¥å¤–"; -$a->strings["Shortening method that optimizes the tweet"] = "缩短方法优化缩短方法优化准文"; -$a->strings["Send linked #-tags and @-names to Twitter"] = "转播连接的#标签盒@å到Twitter"; -$a->strings["Clear OAuth configuration"] = "清ç†å‡ºOAuth设置"; -$a->strings["Settings updated."] = "设置跟新了"; -$a->strings["Consumer key"] = "钥匙(Consumer key)"; -$a->strings["Consumer secret"] = "密ç (Consumer secret)"; -$a->strings["Name of the Twitter Application"] = "Twitter应用å"; -$a->strings["set this to avoid mirroring postings from ~friendica back to ~friendica"] = "选择这个为é¿å…å¤åˆ¶æ–‡ç« ä»Ž~friendica回归~friendica"; diff --git a/sources/extend/addon/matrix/twitter/lighter.png b/sources/extend/addon/matrix/twitter/lighter.png deleted file mode 100755 index 297bb034..00000000 Binary files a/sources/extend/addon/matrix/twitter/lighter.png and /dev/null differ diff --git a/sources/extend/addon/matrix/twitter/twitter.css b/sources/extend/addon/matrix/twitter/twitter.css deleted file mode 100755 index 46b0992b..00000000 --- a/sources/extend/addon/matrix/twitter/twitter.css +++ /dev/null @@ -1,7 +0,0 @@ -#twitter-avatar { - float: left; - width: 48px; - height: 48px; - margin: 0px 15px 15px 0px; -} - diff --git a/sources/extend/addon/matrix/twitter/twitter.php b/sources/extend/addon/matrix/twitter/twitter.php deleted file mode 100755 index 3be0d164..00000000 --- a/sources/extend/addon/matrix/twitter/twitter.php +++ /dev/null @@ -1,912 +0,0 @@ - - * Author: Michael Vogel - * Author: Mike Macgirvin - * - * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * * copyright notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the distribution. - * * Neither the name of the nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/* Twitter Plugin for Hubzilla - * - * 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 Hubzilla 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. - * - * Activate the plugin from the plugins section of your admin panel. When you have - * done so, add your consumer key and consumer secret in the Plugin Features section - * of the admin page. A link to this section will appear on the sidebar of the admin page - * called 'twitter'. - * - * Alternatively: (old way - may not work any more) - * Add this key pair to your global .htconfig.php or use the admin panel. - * - * $a->config['twitter']['consumerkey'] = 'your consumer_key here'; - * $a->config['twitter']['consumersecret'] = 'your consumer_secret here'; - * - * Requirements: PHP5, curl [Slinky library] - */ - -define('TWITTER_DEFAULT_POLL_INTERVAL', 5); // given in minutes - -function twitter_load() { - // we need some hooks, for the configuration and for sending tweets - register_hook('feature_settings', 'addon/twitter/twitter.php', 'twitter_settings'); - register_hook('feature_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post'); - register_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local'); - register_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook'); - register_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets'); - - logger("installed twitter"); -} - - -function twitter_unload() { - unregister_hook('feature_settings', 'addon/twitter/twitter.php', 'twitter_settings'); - unregister_hook('feature_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post'); - unregister_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local'); - unregister_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook'); - unregister_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets'); - - logger("uninstalled twitter"); -} - -function twitter_jot_nets(&$a,&$b) { - if(! local_channel()) - return; - - $tw_post = get_pconfig(local_channel(),'twitter','post'); - if(intval($tw_post) == 1) { - $tw_defpost = get_pconfig(local_channel(),'twitter','post_by_default'); - $selected = ((intval($tw_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '
' . t('Post to Twitter') . '
'; - } -} - -function twitter_settings_post ($a,$post) { - if(! local_channel()) - return; - // don't check twitter settings if twitter submit button is not clicked - if (!x($_POST,'twitter-submit')) - return; - - if (isset($_POST['twitter-disconnect'])) { - /*** - * if the twitter-disconnect checkbox is set, clear the OAuth key/secret pair - * from the user configuration - */ - del_pconfig(local_channel(), 'twitter', 'consumerkey'); - del_pconfig(local_channel(), 'twitter', 'consumersecret'); - del_pconfig(local_channel(), 'twitter', 'oauthtoken'); - del_pconfig(local_channel(), 'twitter', 'oauthsecret'); - del_pconfig(local_channel(), 'twitter', 'post'); - del_pconfig(local_channel(), 'twitter', 'post_by_default'); - del_pconfig(local_channel(), 'twitter', 'post_taglinks'); - del_pconfig(local_channel(), 'twitter', 'lastid'); - del_pconfig(local_channel(), 'twitter', 'intelligent_shortening'); - del_pconfig(local_channel(), 'twitter', 'own_id'); - } else { - if (isset($_POST['twitter-pin'])) { - // if the user supplied us with a PIN from Twitter, let the magic of OAuth happen - logger('got a Twitter PIN'); - require_once('library/twitteroauth.php'); - $ckey = get_config('twitter', 'consumerkey'); - $csecret = get_config('twitter', 'consumersecret'); - // the token and secret for which the PIN was generated were hidden in the settings - // form as token and token2, we need a new connection to Twitter using these token - // and secret to request a Access Token with the PIN - $connection = new TwitterOAuth($ckey, $csecret, $_POST['twitter-token'], $_POST['twitter-token2']); - $token = $connection->getAccessToken( $_POST['twitter-pin'] ); - // ok, now that we have the Access Token, save them in the user config - set_pconfig(local_channel(),'twitter', 'oauthtoken', $token['oauth_token']); - set_pconfig(local_channel(),'twitter', 'oauthsecret', $token['oauth_token_secret']); - set_pconfig(local_channel(),'twitter', 'post', 1); - set_pconfig(local_channel(),'twitter', 'post_taglinks', 1); - // reload the Addon Settings page, if we don't do it see Friendica Bug #42 - goaway($a->get_baseurl().'/settings/featured'); - } else { - // if no PIN is supplied in the POST variables, the user has changed the setting - // to post a tweet for every new __public__ posting to the wall - set_pconfig(local_channel(),'twitter','post',intval($_POST['twitter-enable'])); - set_pconfig(local_channel(),'twitter','post_by_default',intval($_POST['twitter-default'])); - set_pconfig(local_channel(),'twitter','post_taglinks',intval($_POST['twitter-sendtaglinks'])); - set_pconfig(local_channel(),'twitter', 'mirror_posts', intval($_POST['twitter-mirror'])); - set_pconfig(local_channel(),'twitter', 'intelligent_shortening', intval($_POST['twitter-shortening'])); - set_pconfig(local_channel(),'twitter', 'import', intval($_POST['twitter-import'])); - set_pconfig(local_channel(),'twitter', 'create_user', intval($_POST['twitter-create_user'])); - info( t('Twitter settings updated.') . EOL); - }} -} -function twitter_settings(&$a,&$s) { - if(! local_channel()) - return; - $a->page['htmlhead'] .= '' . "\r\n"; - /*** - * 1) Check that we have global consumer key & secret - * 2) If no OAuthtoken & stuff is present, generate button to get some - * 3) Checkbox for "Send public notices (140 chars only) - */ - $ckey = get_config('twitter', 'consumerkey' ); - $csecret = get_config('twitter', 'consumersecret' ); - $otoken = get_pconfig(local_channel(), 'twitter', 'oauthtoken' ); - $osecret = get_pconfig(local_channel(), 'twitter', 'oauthsecret' ); - $enabled = get_pconfig(local_channel(), 'twitter', 'post'); - $checked = (($enabled) ? 1 : false); - $defenabled = get_pconfig(local_channel(),'twitter','post_by_default'); - $defchecked = (($defenabled) ? 1 : false); - //$shorteningenabled = get_pconfig(local_channel(),'twitter','intelligent_shortening'); - //$shorteningchecked = (($shorteningenabled) ? 1 : false); - - if ( (!$ckey) && (!$csecret) ) { - /*** - * no global consumer keys - * display warning and skip personal config - */ - $sc .= '
'; - $sc .= t('No consumer key pair for Twitter found. Please contact your site administrator.'); - $sc .= '
'; - } else { - /*** - * ok we have a consumer key pair now look into the OAuth stuff - */ - if ( (!$otoken) && (!$osecret) ) { - /*** - * the user has not yet connected the account to twitter... - * get a temporary OAuth key/secret pair and display a button with - * which the user can request a PIN to connect the account to a - * account at Twitter. - */ - require_once('library/twitteroauth.php'); - $connection = new TwitterOAuth($ckey, $csecret); - $request_token = $connection->getRequestToken(); - $token = $request_token['oauth_token']; - /*** - * make some nice form - */ - - $sc .= ''; - $sc .= '
'.t('Log in with Twitter').''; - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('twitter-pin', t('Copy the PIN from Twitter here'), '', '') - )); - - $sc .= ''; - $sc .= ''; - - $sc .= '
'; - $sc .= ''; - $sc .= '
'; - - } else { - /*** - * we have an OAuth key / secret pair for the user - * so let's give a chance to disable the postings to Twitter - */ - require_once('library/twitteroauth.php'); - $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret); - $details = $connection->get('account/verify_credentials'); - - $sc .= '

'. t('Currently connected to: ') .''.$details->screen_name.'
'.$details->description.'

'; - $sc .= '
'; - //FIXME no hidewall in Red - if ($a->user['hidewall']) { - $sc .= ''; - } - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('twitter-enable', t('Allow posting to Twitter'), $checked, t('If enabled your public postings can be posted to the associated Twitter account'), array(t('No'),t('Yes'))) - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('twitter-default', t('Send public postings to Twitter by default'), $defchecked, t('If enabled your public postings will be posted to the associated Twitter account by default'), array(t('No'),t('Yes'))) - )); - - //FIXME: Doesn't seem to work. But maybe we don't want this at all. - //$sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - // '$field' => array('twitter-shortening', t('Shortening method that optimizes the tweet'), $shorteningchecked, '', array(t('No'),t('Yes'))) - //)); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('twitter-disconnect', t('Clear OAuth configuration'), '', '', array(t('No'),t('Yes'))) - )); - - $sc .= '
'; - $sc .= ''; - $sc .= '
'; - } - } - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('', '' . t('Twitter Post Settings'), '', ''), - '$content' => $sc - )); - -} - - -function twitter_post_local(&$a,&$b) { - - if($b['edit']) - return; - - if((! local_channel()) || (local_channel() != $b['uid'])) - return; - - if($b['item_private'] || ($b['mid'] != $b['parent_mid'])) - return; - - - $twitter_post = intval(get_pconfig(local_channel(),'twitter','post')); - $twitter_enable = (($twitter_post && x($_REQUEST,'twitter_enable')) ? intval($_REQUEST['twitter_enable']) : 0); - - // if API is used, default to the chosen settings - if($_REQUEST['api_source'] && intval(get_pconfig(local_channel(),'twitter','post_by_default'))) - $twitter_enable = 1; - - if(! $twitter_enable) - return; - - if(strlen($b['postopts'])) - $b['postopts'] .= ','; - $b['postopts'] .= 'twitter'; - -} - -if (! function_exists('short_link')) { -function short_link ($url) { - require_once('library/slinky.php'); - $slinky = new Slinky( $url ); - $yourls_url = get_config('yourls','url1'); - if ($yourls_url) { - $yourls_username = get_config('yourls','username1'); - $yourls_password = get_config('yourls', 'password1'); - $yourls_ssl = get_config('yourls', 'ssl1'); - $yourls = new Slinky_YourLS(); - $yourls->set( 'username', $yourls_username ); - $yourls->set( 'password', $yourls_password ); - $yourls->set( 'ssl', $yourls_ssl ); - $yourls->set( 'yourls-url', $yourls_url ); - $slinky->set_cascade( array( $yourls, new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) ); - } - else { - // setup a cascade of shortening services - // try to get a short link from these services - // in the order ur1.ca, trim, id.gd, tinyurl - $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) ); - } - return $slinky->short(); -} }; - -function twitter_shortenmsg($b, $shortlink = false) { - require_once("include/api.php"); - require_once("include/bbcode.php"); - require_once("include/html2plain.php"); - - $max_char = 140; - -// $b['body'] = bb_CleanPictureLinks($b['body']); - - // Looking for the first image -// $cleaned_body = api_clean_plain_items($b['body']); - $cleaned_body = $b['body']; - $image = ''; - if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$cleaned_body,$matches)) - $image = $matches[3]; - - if ($image == '') - if(preg_match("/\[img\](.*?)\[\/img\]/is",$cleaned_body,$matches)) - $image = $matches[1]; - - $multipleimages = (strpos($cleaned_body, "[img") != strrpos($cleaned_body, "[img")); - - // When saved into the database the content is sent through htmlspecialchars - // That means that we have to decode all image-urls - $image = htmlspecialchars_decode($image); - - $body = $b["body"]; - if ($b["title"] != "") - $body = $b["title"]."\n\n".$body; - - if (strpos($body, "[bookmark") !== false) { - // splitting the text in two parts: - // before and after the bookmark - $pos = strpos($body, "[bookmark"); - $body1 = substr($body, 0, $pos); - $body2 = substr($body, $pos); - - // Removing all quotes after the bookmark - // they are mostly only the content after the bookmark. - $body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2); - $body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2); - $body = $body1.$body2; - } - - // Add some newlines so that the message could be cut better - $body = str_replace(array("[quote", "[bookmark", "[/bookmark]", "[/quote]"), - array("\n[quote", "\n[bookmark", "[/bookmark]\n", "[/quote]\n"), $body); - - // remove the recycle signs and the names since they aren't helpful on twitter - // recycle 1 - $recycle = html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); - $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body); - // recycle 2 (Test) - $recycle = html_entity_decode("◌ ", ENT_QUOTES, 'UTF-8'); - $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body); - - // remove the share element - //$body = preg_replace("/\[share(.*?)\](.*?)\[\/share\]/ism","\n\n$2\n\n",$body); - - // At first convert the text to html - $html = bbcode($body, false, false); - - // Then convert it to plain text - $msg = trim(html2plain($html, 0, true)); - $msg = html_entity_decode($msg,ENT_QUOTES,'UTF-8'); - - // Removing multiple newlines - while (strpos($msg, "\n\n\n") !== false) - $msg = str_replace("\n\n\n", "\n\n", $msg); - - // Removing multiple spaces - while (strpos($msg, " ") !== false) - $msg = str_replace(" ", " ", $msg); - - $origmsg = trim($msg); - - // Removing URLs - $msg = preg_replace('/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/i', "", $msg); - - $msg = trim($msg); - - $link = ''; - // look for bookmark-bbcode and handle it with priority - if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches)) - $link = $matches[1]; - - $multiplelinks = (strpos($b['body'], "[bookmark") != strrpos($b['body'], "[bookmark")); - - // If there is no bookmark element then take the first link -// if ($link == '') { -// $links = collecturls($html); - -// foreach($links AS $singlelink) { -// $img_str = fetch_url($singlelink); - -// $tempfile = tempnam(get_config("system","temppath"), "cache"); -// file_put_contents($tempfile, $img_str); -// $mime = image_type_to_mime_type(exif_imagetype($tempfile)); -// unlink($tempfile); - -// if (substr($mime, 0, 6) == "image/") { -// $image = $singlelink; -// unset($links[$singlelink]); -// } -// } - -// if (sizeof($links) > 0) { -// reset($links); -// $link = current($links); -// } -// $multiplelinks = (sizeof($links) > 1); -// } - - $msglink = ""; - if ($multiplelinks) - $msglink = $b["plink"]; - else if ($link != "") - $msglink = $link; - else if ($multipleimages) - $msglink = $b["plink"]; - else if ($image != "") - $msglink = $image; - - if (($msglink == "") and strlen($msg) > $max_char) - $msglink = $b["plink"]; - - // If the message is short enough then don't modify it. - if ((strlen($origmsg) <= $max_char) AND ($msglink == "")) - return(array("msg"=>$origmsg, "image"=>"")); - - // If the message is short enough and contains a picture then post the picture as well - if ((strlen($origmsg) <= ($max_char - 23)) AND strpos($origmsg, $msglink)) - return(array("msg"=>$origmsg, "image"=>$image)); - - // If the message is short enough and the link exists in the original message don't modify it as well - // -3 because of the bad shortener of twitter - if ((strlen($origmsg) <= ($max_char - 3)) AND strpos($origmsg, $msglink)) - return(array("msg"=>$origmsg, "image"=>"")); - - // Preserve the unshortened link - $orig_link = $msglink; - - // Just replace the message link with a 22 character long string - // Twitter calculates with this length - if (trim($msglink) <> '') - $msglink = "1234567890123456789012"; - - if (strlen(trim($msg." ".$msglink)) > ($max_char)) { - $msg = substr($msg, 0, ($max_char) - (strlen($msglink))); - $lastchar = substr($msg, -1); - $msg = substr($msg, 0, -1); - $pos = strrpos($msg, "\n"); - if ($pos > 0) - $msg = substr($msg, 0, $pos); - else if ($lastchar != "\n") - $msg = substr($msg, 0, -3)."..."; - - // if the post contains a picture and a link then the system tries to cut the post earlier. - // So the link and the picture can be posted. - if (($image != "") AND ($orig_link != $image)) { - $msg2 = substr($msg, 0, ($max_char - 20) - (strlen($msglink))); - $lastchar = substr($msg2, -1); - $msg2 = substr($msg2, 0, -1); - $pos = strrpos($msg2, "\n"); - if ($pos > 0) - $msg = substr($msg2, 0, $pos); - else if ($lastchar == "\n") - $msg = trim($msg2); - } - - } - // Removing multiple spaces - again - while (strpos($msg, " ") !== false) - $msg = str_replace(" ", " ", $msg); - - $msg = trim($msg); - - // Removing multiple newlines - //while (strpos($msg, "\n\n") !== false) - // $msg = str_replace("\n\n", "\n", $msg); - - // Looking if the link points to an image - $img_str = fetch_url($orig_link); - -// $tempfile = tempnam(get_config("system","temppath"), "cache"); -// file_put_contents($tempfile, $img_str); -// $mime = image_type_to_mime_type(exif_imagetype($tempfile)); -// unlink($tempfile); - - if (($image == $orig_link) OR (substr($mime, 0, 6) == "image/")) - return(array("msg"=>$msg, "image"=>$orig_link)); - else if (($image != $orig_link) AND ($image != "") AND (strlen($msg." ".$msglink) <= ($max_char - 23))) { - if ($shortlink) - $orig_link = short_link($orig_link); - - return(array("msg"=>$msg." ".$orig_link, "image"=>$image)); - } else { - if ($shortlink) - $orig_link = short_link($orig_link); - - return(array("msg"=>$msg." ".$orig_link, "image"=>"")); - } -} - -function twitter_action($a, $uid, $pid, $action) { - - $ckey = get_config('twitter', 'consumerkey'); - $csecret = get_config('twitter', 'consumersecret'); - $otoken = get_pconfig($uid, 'twitter', 'oauthtoken'); - $osecret = get_pconfig($uid, 'twitter', 'oauthsecret'); - - require_once("addon/twitter/codebird.php"); - - $cb = \Codebird\Codebird::getInstance(); - $cb->setConsumerKey($ckey, $csecret); - $cb->setToken($otoken, $osecret); - - $post = array('id' => $pid); - - logger("twitter_action '".$action."' ID: ".$pid." data: " . print_r($post, true), LOGGER_DATA); - - switch ($action) { - case "delete": - $result = $cb->statuses_destroy($post); - break; - case "like": - $result = $cb->favorites_create($post); - break; - case "unlike": - $result = $cb->favorites_destroy($post); - break; - } - logger("twitter_action '".$action."' send, result: " . print_r($result, true), LOGGER_DEBUG); -} - -function twitter_post_hook(&$a,&$b) { - - /** - * Post to Twitter - */ - - if((! is_item_normal($b)) || $b['item_private'] || ($b['created'] !== $b['edited'])) - return; - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - if(! strstr($b['postopts'],'twitter')) - return; - - if($b['parent'] != $b['id']) - return; - - - logger('twitter post invoked'); - - - load_pconfig($b['uid'], 'twitter'); - - $ckey = get_config('twitter', 'consumerkey'); - $csecret = get_config('twitter', 'consumersecret'); - $otoken = get_pconfig($b['uid'], 'twitter', 'oauthtoken'); - $osecret = get_pconfig($b['uid'], 'twitter', 'oauthsecret'); - $intelligent_shortening = get_pconfig($b['uid'], 'twitter', 'intelligent_shortening'); - - // Global setting overrides this - if (get_config('twitter','intelligent_shortening')) - $intelligent_shortening = get_config('twitter','intelligent_shortening'); - - if($ckey && $csecret && $otoken && $osecret) { - logger('twitter: we have customer key and oauth stuff, going to send.', LOGGER_DEBUG); - - // If it's a repeated message from twitter then do a native retweet and exit -// if (twitter_is_retweet($a, $b['uid'], $b['body'])) -// return; - - require_once('library/twitteroauth.php'); - require_once('include/bbcode.php'); - $tweet = new TwitterOAuth($ckey,$csecret,$otoken,$osecret); - - // in theory max char is 140 but T. uses t.co to make links - // longer so we give them 10 characters extra - if (!$intelligent_shortening) { - $max_char = 130; // max. length for a tweet - // we will only work with up to two times the length of the dent - // we can later send to Twitter. This way we can "gain" some - // information during shortening of potential links but do not - // shorten all the links in a 200000 character long essay. - if (! $b['title']=='') { - $tmp = $b['title'] . ' : '. $b['body']; - // $tmp = substr($tmp, 0, 4*$max_char); - } else { - $tmp = $b['body']; // substr($b['body'], 0, 3*$max_char); - } - // if [url=bla][img]blub.png[/img][/url] get blub.png - $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp); - $tmp = preg_replace( '/\[zrl\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[zmg\](\\w+.*?)\\[\\/zmg\]\\[\\/zrl\]/i', '$2', $tmp); - // preserve links to images, videos and audios - $tmp = preg_replace( '/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism', '$3', $tmp); - $tmp = preg_replace( '/\[\\/?img(\\s+.*?\]|\])/i', '', $tmp); - $tmp = preg_replace( '/\[zmg\=([0-9]*)x([0-9]*)\](.*?)\[\/zmg\]/ism', '$3', $tmp); - $tmp = preg_replace( '/\[\\/?zmg(\\s+.*?\]|\])/i', '', $tmp); - $tmp = preg_replace( '/\[\\/?video(\\s+.*?\]|\])/i', '', $tmp); - $tmp = preg_replace( '/\[\\/?youtube(\\s+.*?\]|\])/i', '', $tmp); - $tmp = preg_replace( '/\[\\/?vimeo(\\s+.*?\]|\])/i', '', $tmp); - $tmp = preg_replace( '/\[\\/?audio(\\s+.*?\]|\])/i', '', $tmp); - $linksenabled = get_pconfig($b['uid'],'twitter','post_taglinks'); - // if a #tag is linked, don't send the [url] over to SN - // that is, don't send if the option is not set in the - // connector settings - if ($linksenabled=='0') { - // #-tags - $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp); - // @-mentions - $tmp = preg_replace( '/@\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '@$2', $tmp); - $tmp = preg_replace( '/#\[zrl\=(\w+.*?)\](\w+.*?)\[\/zrl\]/i', '#$2', $tmp); - // @-mentions - $tmp = preg_replace( '/@\[zrl\=(\w+.*?)\](\w+.*?)\[\/zrl\]/i', '@$2', $tmp); - // recycle 1 - } - $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp); - - // find all http or https links in the body of the entry and - // apply the shortener if the link is longer then 20 characters - if (( strlen($tmp)>$max_char ) && ( $max_char > 0 )) { - preg_match_all ( '/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/i', $tmp, $allurls ); - foreach ($allurls as $url) { - foreach ($url as $u) { - if (strlen($u)>20) { - $sl = short_link($u); - $tmp = str_replace( $u, $sl, $tmp ); - } - } - } - } - // ok, all the links we want to send out are save, now strip - // away the remaining bbcode - //$msg = strip_tags(bbcode($tmp, false, false)); - $msg = bbcode($tmp, false, false); - $msg = str_replace(array('
','
'),"\n",$msg); - $msg = strip_tags($msg); - - // quotes not working - let's try this - $msg = html_entity_decode($msg); - if (( strlen($msg) > $max_char) && $max_char > 0) { - $shortlink = short_link( $b['plink'] ); - // the new message will be shortened such that "... $shortlink" - // will fit into the character limit - $msg = nl2br(substr($msg, 0, $max_char-strlen($shortlink)-4)); - $msg = str_replace(array('
','
'),' ',$msg); - $e = explode(' ', $msg); - // remove the last word from the cut down message to - // avoid sending cut words to the MicroBlog - array_pop($e); - $msg = implode(' ', $e); - $msg .= '... ' . $shortlink; - } - - $msg = trim($msg); - $image = ""; - } else { - $msgarr = twitter_shortenmsg($b); - $msg = $msgarr["msg"]; - $image = $msgarr["image"]; - } - - // and now tweet it :-) -// if(strlen($msg) and ($image != "")) { -// $img_str = z_fetch_url($image); - -// $tempfile = tempnam(get_config("system","temppath"), "cache"); -// file_put_contents($tempfile, $img_str); - - // Twitter had changed something so that the old library doesn't work anymore - // so we are using a new library for twitter - // To-Do: - // Switching completely to this library with all functions - require_once("addon/twitter/codebird.php"); - -// $cb = \Codebird\Codebird::getInstance(); -// $cb->setConsumerKey($ckey, $csecret); -// $cb->setToken($otoken, $osecret); - -// $post = array('status' => $msg, 'media[]' => $tempfile); - -// if ($iscomment) -// $post["in_reply_to_status_id"] = substr($orig_post["uri"], 9); - -// $result = $cb->statuses_updateWithMedia($post); -// unlink($tempfile); - -// logger('twitter_post_with_media send, result: ' . print_r($result, true), LOGGER_DEBUG); -// if ($result->errors OR $result->error) { -// logger('Send to Twitter failed: "' . print_r($result->errors, true) . '"'); - - // Workaround: Remove the picture link so that the post can be reposted without it -// $msg .= " ".$image; -// $image = ""; -// } elseif ($iscomment) { -// logger('twitter_post: Update extid '.$result->id_str." for post id ".$b['id']); -// q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d", -// dbesc("twitter::".$result->id_str), -// dbesc($result->text), -// intval($b['id']) -// ); -// } -// } - - if(strlen($msg) and ($image == "")) { - $url = 'statuses/update'; - $post = array('status' => $msg); - - if ($iscomment) - $post["in_reply_to_status_id"] = substr($orig_post["uri"], 9); - - $result = $tweet->post($url, $post); - logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG); - if ($result->errors) { - logger('Send to Twitter failed: "' . print_r($result->errors, true) . '"'); - - } -// elseif ($iscomment) { -// logger('twitter_post: Update extid '.$result->id_str." for post id ".$b['id']); -// q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d", -// dbesc("twitter::".$result->id_str), -// intval($b['id']) -// ); - //q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d", - // dbesc("twitter::".$result->id_str), - // dbesc($result->text), - // intval($b['id']) - //); -// } - } - } -} - -function twitter_plugin_admin_post(&$a){ - $consumerkey = ((x($_POST,'consumerkey')) ? notags(trim($_POST['consumerkey'])) : ''); - $consumersecret = ((x($_POST,'consumersecret')) ? notags(trim($_POST['consumersecret'])): ''); - set_config('twitter','consumerkey',$consumerkey); - set_config('twitter','consumersecret',$consumersecret); - info( t('Settings updated.'). EOL ); -} -function twitter_plugin_admin(&$a, &$o){ -logger('Twitter admin'); - $t = get_markup_template( "admin.tpl", "addon/twitter/" ); - - $o = replace_macros($t, array( - '$submit' => t('Submit Settings'), - // name, label, value, help, [extra values] - '$consumerkey' => array('consumerkey', t('API key'), get_config('twitter', 'consumerkey' ), ''), - '$consumersecret' => array('consumersecret', t('API secret'), get_config('twitter', 'consumersecret' ), '') - )); -} - - - -function twitter_expand_entities($a, $body, $item, $no_tags = false, $dontincludemedia) { - require_once("include/oembed.php"); - - $tags = ""; - - if (isset($item->entities->urls)) { - $type = ""; - $footerurl = ""; - $footerlink = ""; - $footer = ""; - - foreach ($item->entities->urls AS $url) { - if ($url->url AND $url->expanded_url AND $url->display_url) { - - $expanded_url = twitter_original_url($url->expanded_url); - - $oembed_data = oembed_fetch_url($expanded_url); - - // Quickfix: Workaround for URL with "[" and "]" in it - if (strpos($expanded_url, "[") OR strpos($expanded_url, "]")) - $expanded_url = $url->url; - - if ($type == "") - $type = $oembed_data->type; - - if ($oembed_data->type == "video") { - $body = str_replace($url->url, - "[video]".$expanded_url."[/video]", $body); - $dontincludemedia = true; - } elseif (($oembed_data->type == "photo") AND isset($oembed_data->url) AND !$dontincludemedia) { - $body = str_replace($url->url, - "[url=".$expanded_url."][img]".$oembed_data->url."[/img][/url]", - $body); - $dontincludemedia = true; - } elseif ($oembed_data->type != "link") - $body = str_replace($url->url, - "[url=".$expanded_url."]".$expanded_url."[/url]", - $body); - //"[url=".$expanded_url."]".$url->display_url."[/url]", - else { - $img_str = fetch_url($expanded_url, true, $redirects, 4); - - $tempfile = tempnam(get_config("system","temppath"), "cache"); - file_put_contents($tempfile, $img_str); - $mime = image_type_to_mime_type(exif_imagetype($tempfile)); - unlink($tempfile); - - if (substr($mime, 0, 6) == "image/") { - $type = "photo"; - $body = str_replace($url->url, "[img]".$expanded_url."[/img]", $body); - $dontincludemedia = true; - } else { - $type = $oembed_data->type; - $footerurl = $expanded_url; - $footerlink = "[url=".$expanded_url."]".$expanded_url."[/url]"; - //$footerlink = "[url=".$expanded_url."]".$url->display_url."[/url]"; - - $body = str_replace($url->url, $footerlink, $body); - } - } - } - } - - if ($footerurl != "") - $footer = twitter_siteinfo($footerurl, $dontincludemedia); - - if (($footerlink != "") AND (trim($footer) != "")) { - $removedlink = trim(str_replace($footerlink, "", $body)); - - if (strstr($body, $removedlink)) - $body = $removedlink; - - $body .= "\n\n[class=type-".$type."]".$footer."[/class]"; - } - - if ($no_tags) - return(array("body" => $body, "tags" => "")); - - $tags_arr = array(); - - foreach ($item->entities->hashtags AS $hashtag) { - $url = "#[url=".$a->get_baseurl()."/search?tag=".rawurlencode($hashtag->text)."]".$hashtag->text."[/url]"; - $tags_arr["#".$hashtag->text] = $url; - $body = str_replace("#".$hashtag->text, $url, $body); - } - - foreach ($item->entities->user_mentions AS $mention) { - $url = "@[url=https://twitter.com/".rawurlencode($mention->screen_name)."]".$mention->screen_name."[/url]"; - $tags_arr["@".$mention->screen_name] = $url; - $body = str_replace("@".$mention->screen_name, $url, $body); - } - - // it seems as if the entities aren't always covering all mentions. So the rest will be checked here - $tags = get_tags($body); - - if(count($tags)) { - foreach($tags as $tag) { - if (strstr(trim($tag), " ")) - continue; - - if(strpos($tag,'#') === 0) { - if(strpos($tag,'[url=')) - continue; - - // don't link tags that are already embedded in links - - if(preg_match('/\[(.*?)' . preg_quote($tag,'/') . '(.*?)\]/',$body)) - continue; - if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag,'/') . '(.*?)\)/',$body)) - continue; - - $basetag = str_replace('_',' ',substr($tag,1)); - $url = '#[url='.$a->get_baseurl().'/search?tag='.rawurlencode($basetag).']'.$basetag.'[/url]'; - $body = str_replace($tag,$url,$body); - $tags_arr["#".$basetag] = $url; - continue; - } elseif(strpos($tag,'@') === 0) { - if(strpos($tag,'[url=')) - continue; - - $basetag = substr($tag,1); - $url = '@[url=https://twitter.com/'.rawurlencode($basetag).']'.$basetag.'[/url]'; - $body = str_replace($tag,$url,$body); - $tags_arr["@".$basetag] = $url; - } - } - } - - - $tags = implode($tags_arr, ","); - - } - return(array("body" => $body, "tags" => $tags)); -} - diff --git a/sources/extend/addon/matrix/twitter/twitter.png b/sources/extend/addon/matrix/twitter/twitter.png deleted file mode 100644 index d0446d0a..00000000 Binary files a/sources/extend/addon/matrix/twitter/twitter.png and /dev/null differ diff --git a/sources/extend/addon/matrix/twitter/view/tpl/admin.tpl b/sources/extend/addon/matrix/twitter/view/tpl/admin.tpl deleted file mode 100644 index 9efcb065..00000000 --- a/sources/extend/addon/matrix/twitter/view/tpl/admin.tpl +++ /dev/null @@ -1,3 +0,0 @@ -{{include file="field_input.tpl" field=$consumerkey}} -{{include file="field_input.tpl" field=$consumersecret}} -
diff --git a/sources/extend/addon/matrix/upload_limits/upload_limits.php b/sources/extend/addon/matrix/upload_limits/upload_limits.php deleted file mode 100644 index d5c6be67..00000000 --- a/sources/extend/addon/matrix/upload_limits/upload_limits.php +++ /dev/null @@ -1,31 +0,0 @@ -' . t('Show Upload Limits') . ''; - - $o .= t('Hubzilla configured maximum size: ') . get_config('system','maximagesize') . EOL; - $o .= t('PHP upload_max_filesize: ') . ini_get('upload_max_filesize') . EOL; - $o .= t('PHP post_max_size (must be larger than upload_max_filesize): ') . ini_get('post_max_size') . EOL; - return $o; - -} diff --git a/sources/extend/addon/matrix/visage/visage.apd b/sources/extend/addon/matrix/visage/visage.apd deleted file mode 100644 index 7dcbf967..00000000 --- a/sources/extend/addon/matrix/visage/visage.apd +++ /dev/null @@ -1,5 +0,0 @@ -url: $baseurl/visage -requires: public_profile -name: Visitors -photo: $baseurl/addon/visage/visage.png - diff --git a/sources/extend/addon/matrix/visage/visage.css b/sources/extend/addon/matrix/visage/visage.css deleted file mode 100644 index e69de29b..00000000 diff --git a/sources/extend/addon/matrix/visage/visage.php b/sources/extend/addon/matrix/visage/visage.php deleted file mode 100755 index 86eb226d..00000000 --- a/sources/extend/addon/matrix/visage/visage.php +++ /dev/null @@ -1,182 +0,0 @@ - - * - */ - - -/** - * Visit $yoursite/visage - * Lots of room for improvement, turning into a widget, etc. - * The time of visit can be seen by hovering over the name (not the photo). This way I could re-use an existing template. - */ - - -function visage_load() { - - register_hook('magic_auth_success', 'addon/visage/visage.php', 'visage_magic_auth'); - register_hook('feature_settings', 'addon/visage/visage.php', 'visage_settings'); - register_hook('feature_settings_post', 'addon/visage/visage.php', 'visage_settings_post'); -} - - -function visage_unload() { - - unregister_hook('magic_auth_success', 'addon/visage/visage.php', 'visage_magic_auth'); - unregister_hook('feature_settings', 'addon/visage/visage.php', 'visage_settings'); - unregister_hook('feature_settings_post', 'addon/visage/visage.php', 'visage_settings_post'); - -} - - - -function visage_magic_auth($a, &$b) { - -// logger('visage: ' . print_r($b,true)); - - if((! strstr($b['url'],'/channel/')) && (! strstr($b['url'],'/profile/'))) { -// logger('visage: exiting: ' . $b['url']); - return; - } - - $p = preg_match('/http(.*?)(channel|profile)\/(.*?)($|[\/\?\&])/',$b['url'],$matches); - if(! $p) { -// logger('visage: no matching pattern'); - return; - } - -// logger('visage: matches ' . print_r($matches,true)); - - $nick = $matches[3]; - - if($_SERVER['HTTP_DNT'] === '1' || intval($_SESSION['DNT'])) - return; - - $c = q("select channel_id, channel_hash from channel where channel_address = '%s' limit 1", - dbesc($nick) - ); - - if(! $c) - return; - - $x = get_pconfig($c[0]['channel_id'],'visage','visitors'); - if(! is_array($x)) - $n = array(array($b['xchan']['xchan_hash'],datetime_convert())); - else { - $n = array(); - - for($z = ((count($x) > 24) ? count($x) - 24 : 0); $z < count($x); $z ++) - if($x[$z][0] != $b['xchan']['xchan_hash']) - $n[] = $x[$z]; - $n[] = array($b['xchan']['xchan_hash'],datetime_convert()); - } - -// logger('visage set: ' . print_r($n,true)); - - set_pconfig($c[0]['channel_id'],'visage','visitors',$n); - return; - -} - - -function visage_module() {} - -function visage_content(&$a) { - - if(! local_channel()) - return; - - - $o = '

' . t('Recent Channel/Profile Viewers') . '

'; - - $enabled = get_pconfig(local_channel(),'visage','enabled'); - - if(! $enabled) { - $o .= t('This plugin/addon has not been configured.') . EOL; - $o .= sprintf( t('Please visit the Visage settings on %s'), '' . t('your feature settings page') . ''); - return $o; - } - - // let's play fair. - - require_once('include/identity.php'); - - if(! is_public_profile()) - return $o; - - $x = get_pconfig(local_channel(),'visage','visitors'); - if((! $x) || (! is_array($x))) { - $o .= t('No entries.'); - return $o; - } - - $chans = ''; - for($n = 0; $n < count($x); $n ++) { - if($chans) - $chans .= ','; - $chans .= "'" . dbesc($x[$n][0]) . "'"; - } - if($chans) { - $r = q("select * from xchan where xchan_hash in ( $chans )"); - } - if($r) { - $tpl = get_markup_template('common_friends.tpl'); - - for($g = count($x) - 1; $g >= 0; $g --) { - foreach($r as $rr) { - if($x[$g][0] == $rr['xchan_hash']) - break; - } - - $o .= replace_macros($tpl,array( - '$url' => (($rr['xchan_flags'] & XCHAN_FLAGS_HIDDEN) ? z_root() : chanlink_url($rr['xchan_url'])), - '$name' => $rr['xchan_name'], - '$photo' => $rr['xchan_photo_m'], - '$tags' => (($rr['xchan_flags'] & XCHAN_FLAGS_HIDDEN) ? z_root() : chanlink_url($rr['xchan_url'])), - '$note' => relative_date($x[$g][1]) - )); - } - - $o .= cleardiv(); - } - - return $o; -} - - -function visage_settings(&$a,&$s) { - - if(! local_channel()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - //head_add_css('/addon/visage/visage.css'); - - /* Get the current state of our config variables */ - - $enabled = get_pconfig(local_channel(),'visage','enabled'); - $checked = (($enabled) ? 1 : false); - $css = (($enabled) ? '' : '-disabled'); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('visage', t('Enable Visage Visitor Logging'), $checked, '', array(t('No'),t('Yes'))), - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('visage', t('Visage Settings'), '', t('Submit')), - '$content' => $sc - )); -} - - -function visage_settings_post(&$a,&$b) { - - if(x($_POST,'visage-submit')) { - set_pconfig(local_channel(),'visage','enabled',intval($_POST['visage'])); - } - -} diff --git a/sources/extend/addon/matrix/visage/visage.png b/sources/extend/addon/matrix/visage/visage.png deleted file mode 100644 index bc7170b2..00000000 Binary files a/sources/extend/addon/matrix/visage/visage.png and /dev/null differ diff --git a/sources/extend/addon/matrix/wppost/lang/C/messages.po b/sources/extend/addon/matrix/wppost/lang/C/messages.po deleted file mode 100644 index 1763b2e3..00000000 --- a/sources/extend/addon/matrix/wppost/lang/C/messages.po +++ /dev/null @@ -1,62 +0,0 @@ -# ADDON wppost -# Copyright (C) -# This file is distributed under the same license as the Friendica wppost addon package. -# -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-02-27 05:01-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: wppost.php:42 -msgid "Post to Wordpress" -msgstr "" - -#: wppost.php:76 -msgid "WordPress Post Settings" -msgstr "" - -#: wppost.php:78 -msgid "Enable WordPress Post Plugin" -msgstr "" - -#: wppost.php:83 -msgid "WordPress username" -msgstr "" - -#: wppost.php:88 -msgid "WordPress password" -msgstr "" - -#: wppost.php:93 -msgid "WordPress API URL" -msgstr "" - -#: wppost.php:98 -msgid "Post to WordPress by default" -msgstr "" - -#: wppost.php:103 -msgid "Provide a backlink to the Friendica post" -msgstr "" - -#: wppost.php:110 -msgid "Submit" -msgstr "" - -#: wppost.php:201 -msgid "Post from Friendica" -msgstr "" - -#: wppost.php:207 -msgid "Read the original post and comment stream on Friendica" -msgstr "" diff --git a/sources/extend/addon/matrix/wppost/lang/ca/strings.php b/sources/extend/addon/matrix/wppost/lang/ca/strings.php deleted file mode 100644 index 2856b55c..00000000 --- a/sources/extend/addon/matrix/wppost/lang/ca/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "Publica-ho al Wordpress"; -$a->strings["WordPress Post Settings"] = "Configuració d'enviaments a WordPress"; -$a->strings["Enable WordPress Post Plugin"] = "Habilitar Configuració d'Enviaments a WordPress"; -$a->strings["WordPress username"] = "Nom d'usuari de WordPress"; -$a->strings["WordPress password"] = "Contrasenya de WordPress"; -$a->strings["WordPress API URL"] = "WordPress API URL"; -$a->strings["Post to WordPress by default"] = "Enviar a WordPress per defecte"; -$a->strings["Provide a backlink to the Friendica post"] = "Proveeix un retroenllaç al missatge de Friendica"; -$a->strings["Submit"] = "Enviar"; -$a->strings["Post from Friendica"] = "Enviament des de Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = "Llegeix el missatge original i el flux de comentaris en Friendica"; diff --git a/sources/extend/addon/matrix/wppost/lang/cs/strings.php b/sources/extend/addon/matrix/wppost/lang/cs/strings.php deleted file mode 100644 index 0fea0e0b..00000000 --- a/sources/extend/addon/matrix/wppost/lang/cs/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "PříspÄ›vky do WordPress"; -$a->strings["WordPress Post Settings"] = "WordPress Post nastavení"; -$a->strings["Enable WordPress Post Plugin"] = "Povolit rozšíření na WordPress"; -$a->strings["WordPress username"] = "WordPress uživatelské jméno"; -$a->strings["WordPress password"] = "WordPress heslo"; -$a->strings["WordPress API URL"] = "URL adresa API WordPress"; -$a->strings["Post to WordPress by default"] = "standardnÄ› posílat příspÄ›vky na WordPress"; -$a->strings["Provide a backlink to the Friendica post"] = "Poskytuje zpÄ›tný link na Friendica příspÄ›vek"; -$a->strings["Submit"] = "Odeslat"; -$a->strings["Post from Friendica"] = "PříspÄ›vek z Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = "PÅ™eÄíst si originální příspÄ›vek a komentáře na Friendica"; diff --git a/sources/extend/addon/matrix/wppost/lang/de/strings.php b/sources/extend/addon/matrix/wppost/lang/de/strings.php deleted file mode 100644 index 75f53382..00000000 --- a/sources/extend/addon/matrix/wppost/lang/de/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "Bei WordPress veröffentlichen"; -$a->strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen"; -$a->strings["Enable WordPress Post Plugin"] = "WordPress-Plugin aktivieren."; -$a->strings["WordPress username"] = "WordPress-Benutzername"; -$a->strings["WordPress password"] = "WordPress-Passwort"; -$a->strings["WordPress API URL"] = "WordPress-API-URL"; -$a->strings["Post to WordPress by default"] = "Standardmäßig auf WordPress veröffentlichen"; -$a->strings["Provide a backlink to the Friendica post"] = "Einen Link zurück zum Friendica-Beitrag hinzufügen"; -$a->strings["Submit"] = "Senden"; -$a->strings["Post from Friendica"] = "Beitrag via Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = "Den Originalbeitrag samt Kommentaren bei Friendica lesen"; diff --git a/sources/extend/addon/matrix/wppost/lang/eo/strings.php b/sources/extend/addon/matrix/wppost/lang/eo/strings.php deleted file mode 100644 index 7c786666..00000000 --- a/sources/extend/addon/matrix/wppost/lang/eo/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "AfiÅi al Wordpress"; -$a->strings["WordPress Post Settings"] = "Agordoj por WordPress afiÅojn"; -$a->strings["Enable WordPress Post Plugin"] = "Åœalti la Wordpress-afiÅo kromprogramon"; -$a->strings["WordPress username"] = "WordPress salutnomo"; -$a->strings["WordPress password"] = "WordPress pasvorto"; -$a->strings["WordPress API URL"] = "Wordpress API URL adreso"; -$a->strings["Post to WordPress by default"] = "DefaÅ­lte afiÅi al WordPress"; -$a->strings["Provide a backlink to the Friendica post"] = "Provizi re-ligilon al la Friendica afiÅo"; -$a->strings["Submit"] = "Sendi"; -$a->strings["Post from Friendica"] = "AfiÅo de Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = "Legi la originalan afiÅon kaj komentfluo ĉe Friendica"; diff --git a/sources/extend/addon/matrix/wppost/lang/es/strings.php b/sources/extend/addon/matrix/wppost/lang/es/strings.php deleted file mode 100644 index 1e01a2f4..00000000 --- a/sources/extend/addon/matrix/wppost/lang/es/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "Publicar en Wordpress"; -$a->strings["WordPress Post Settings"] = "Configuración de publicación en Wordpres"; -$a->strings["Enable WordPress Post Plugin"] = "Habilitar el módulo de publicación en Wordpress"; -$a->strings["WordPress username"] = "WordPress - nombre de usuario"; -$a->strings["WordPress password"] = "WordPress - contraseña"; -$a->strings["WordPress API URL"] = "WordPress - dirección API"; -$a->strings["Post to WordPress by default"] = "Publicar a WordPress por defecto"; -$a->strings["Provide a backlink to the Friendica post"] = "Añade un enlace de vuelta a la publicación de Friendica"; -$a->strings["Submit"] = "Envíar"; -$a->strings["Post from Friendica"] = "Publicado desde Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = "Leer la publicación original y los comentarios en Friendica"; diff --git a/sources/extend/addon/matrix/wppost/lang/fr/strings.php b/sources/extend/addon/matrix/wppost/lang/fr/strings.php deleted file mode 100644 index 9cd4456f..00000000 --- a/sources/extend/addon/matrix/wppost/lang/fr/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "Poster sur WordPress"; -$a->strings["WordPress Post Settings"] = "Réglages WordPress"; -$a->strings["Enable WordPress Post Plugin"] = "Activer l'extension WordPress"; -$a->strings["WordPress username"] = "Utilisateur WordPress"; -$a->strings["WordPress password"] = "Mot de passe WordPress"; -$a->strings["WordPress API URL"] = "URL de l'API WordPress"; -$a->strings["Post to WordPress by default"] = "Publier sur WordPress par défaut"; -$a->strings["Provide a backlink to the Friendica post"] = "Fournir un rétrolien vers le message sur Friendica"; -$a->strings["Submit"] = "Envoyer"; -$a->strings["Post from Friendica"] = "Publier depuis Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = "Lire le message d'origine et le flux des commentaires sur Friendica"; diff --git a/sources/extend/addon/matrix/wppost/lang/is/strings.php b/sources/extend/addon/matrix/wppost/lang/is/strings.php deleted file mode 100644 index 0b7f3fe7..00000000 --- a/sources/extend/addon/matrix/wppost/lang/is/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "Senda færslu á Wordpress"; -$a->strings["WordPress Post Settings"] = "Wordpress Post stillingar"; -$a->strings["Enable WordPress Post Plugin"] = "Kveikja á WordPress Post viðbót"; -$a->strings["WordPress username"] = "Wordpress aðgangsorð"; -$a->strings["WordPress password"] = "Wordpress aðgagnsorð"; -$a->strings["WordPress API URL"] = "Slóð á Wordpress API"; -$a->strings["Post to WordPress by default"] = "Leyfa færslum að flæða yfir á Wordpress sjálfgefið"; -$a->strings["Provide a backlink to the Friendica post"] = ""; -$a->strings["Submit"] = "Senda inn"; -$a->strings["Post from Friendica"] = "Færslur frá Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = ""; diff --git a/sources/extend/addon/matrix/wppost/lang/it/strings.php b/sources/extend/addon/matrix/wppost/lang/it/strings.php deleted file mode 100644 index afde8920..00000000 --- a/sources/extend/addon/matrix/wppost/lang/it/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "Pubblica su Wordpress"; -$a->strings["WordPress Post Settings"] = "Impostazioni invio a WordPress"; -$a->strings["Enable WordPress Post Plugin"] = "Abilita plugin \"invia a WordPress\""; -$a->strings["WordPress username"] = "nome utente WordPress"; -$a->strings["WordPress password"] = "password WordPress"; -$a->strings["WordPress API URL"] = "WordPress API URL"; -$a->strings["Post to WordPress by default"] = "Pubblica su WordPress di default"; -$a->strings["Provide a backlink to the Friendica post"] = ""; -$a->strings["Submit"] = "Invia"; -$a->strings["Post from Friendica"] = "Messaggio da Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = "Leggi il messaggio originale e i commenti su Friendica"; diff --git a/sources/extend/addon/matrix/wppost/lang/nb-no/strings.php b/sources/extend/addon/matrix/wppost/lang/nb-no/strings.php deleted file mode 100644 index 5c840e67..00000000 --- a/sources/extend/addon/matrix/wppost/lang/nb-no/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = ""; -$a->strings["WordPress Post Settings"] = ""; -$a->strings["Enable WordPress Post Plugin"] = ""; -$a->strings["WordPress username"] = ""; -$a->strings["WordPress password"] = ""; -$a->strings["WordPress API URL"] = ""; -$a->strings["Post to WordPress by default"] = ""; -$a->strings["Provide a backlink to the Friendica post"] = ""; -$a->strings["Submit"] = "Lagre"; -$a->strings["Post from Friendica"] = ""; -$a->strings["Read the original post and comment stream on Friendica"] = ""; diff --git a/sources/extend/addon/matrix/wppost/lang/pl/strings.php b/sources/extend/addon/matrix/wppost/lang/pl/strings.php deleted file mode 100644 index 201ead1d..00000000 --- a/sources/extend/addon/matrix/wppost/lang/pl/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "Opublikuj na Wordpress"; -$a->strings["WordPress Post Settings"] = "Ustawienia wpisów WorldPress"; -$a->strings["Enable WordPress Post Plugin"] = "WÅ‚Ä…cz plugin wpisów WorldPress"; -$a->strings["WordPress username"] = "nazwa użytkownika WordPress"; -$a->strings["WordPress password"] = "hasÅ‚o WordPress"; -$a->strings["WordPress API URL"] = "WordPress API URL"; -$a->strings["Post to WordPress by default"] = ""; -$a->strings["Provide a backlink to the Friendica post"] = ""; -$a->strings["Submit"] = "Potwierdź"; -$a->strings["Post from Friendica"] = "Post z Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = ""; diff --git a/sources/extend/addon/matrix/wppost/lang/pt-br/strings.php b/sources/extend/addon/matrix/wppost/lang/pt-br/strings.php deleted file mode 100644 index f614e7ad..00000000 --- a/sources/extend/addon/matrix/wppost/lang/pt-br/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "Postar no WordPress"; -$a->strings["WordPress Post Settings"] = "Configurações de postagem do WordPress"; -$a->strings["Enable WordPress Post Plugin"] = "Habilitar plugin de postagem do WordPress"; -$a->strings["WordPress username"] = "Usuário WordPress"; -$a->strings["WordPress password"] = "Senha WordPress"; -$a->strings["WordPress API URL"] = "URL da API do WordPress"; -$a->strings["Post to WordPress by default"] = "Postar para o WordPress como padrão"; -$a->strings["Provide a backlink to the Friendica post"] = ""; -$a->strings["Submit"] = "Enviar"; -$a->strings["Post from Friendica"] = "Postar do Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = ""; diff --git a/sources/extend/addon/matrix/wppost/lang/ru/strings.php b/sources/extend/addon/matrix/wppost/lang/ru/strings.php deleted file mode 100644 index f193addc..00000000 --- a/sources/extend/addon/matrix/wppost/lang/ru/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "Сообщение Ð´Ð»Ñ Wordpress"; -$a->strings["WordPress Post Settings"] = "ÐаÑтройки Ñообщений Ð´Ð»Ñ Wordpress"; -$a->strings["Enable WordPress Post Plugin"] = "Включить WordPress плагин Ñообщений"; -$a->strings["WordPress username"] = "WordPress Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"; -$a->strings["WordPress password"] = "WordPress паролъ"; -$a->strings["WordPress API URL"] = "WordPress API URL"; -$a->strings["Post to WordPress by default"] = "Сообщение WordPress по умолчанию"; -$a->strings["Provide a backlink to the Friendica post"] = ""; -$a->strings["Submit"] = "Подтвердить"; -$a->strings["Post from Friendica"] = "Сообщение от Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = ""; diff --git a/sources/extend/addon/matrix/wppost/lang/sv/strings.php b/sources/extend/addon/matrix/wppost/lang/sv/strings.php deleted file mode 100644 index 3ec569a7..00000000 --- a/sources/extend/addon/matrix/wppost/lang/sv/strings.php +++ /dev/null @@ -1,3 +0,0 @@ -strings["Submit"] = "Spara"; diff --git a/sources/extend/addon/matrix/wppost/lang/zh-cn/strings.php b/sources/extend/addon/matrix/wppost/lang/zh-cn/strings.php deleted file mode 100644 index 74db6306..00000000 --- a/sources/extend/addon/matrix/wppost/lang/zh-cn/strings.php +++ /dev/null @@ -1,13 +0,0 @@ -strings["Post to Wordpress"] = "å‘é€åˆ°Wordpress"; -$a->strings["WordPress Post Settings"] = "Wordpresså‘é€è®¾ç½®"; -$a->strings["Enable WordPress Post Plugin"] = "使Wordpresså‘é€æ’件å¯ç”¨"; -$a->strings["WordPress username"] = "Wordpress用户å"; -$a->strings["WordPress password"] = "Wordpress密ç "; -$a->strings["WordPress API URL"] = "WordPress API URL"; -$a->strings["Post to WordPress by default"] = "默认地å‘é€åˆ°Wordpress"; -$a->strings["Provide a backlink to the Friendica post"] = "输入åå‘链接到Friendica文章"; -$a->strings["Submit"] = "æ交"; -$a->strings["Post from Friendica"] = "文章从Friendica"; -$a->strings["Read the original post and comment stream on Friendica"] = "看原æ¥æ–‡ç« å’Œè¯„论溪æµåœ¨Friendica"; diff --git a/sources/extend/addon/matrix/wppost/wordpress-logo.png b/sources/extend/addon/matrix/wppost/wordpress-logo.png deleted file mode 100644 index 2f993180..00000000 Binary files a/sources/extend/addon/matrix/wppost/wordpress-logo.png and /dev/null differ diff --git a/sources/extend/addon/matrix/wppost/wppost.css b/sources/extend/addon/matrix/wppost/wppost.css deleted file mode 100755 index a5c97684..00000000 --- a/sources/extend/addon/matrix/wppost/wppost.css +++ /dev/null @@ -1,19 +0,0 @@ - - -#wppost-enable-label, #wppost-username-label, #wppost-password-label, -#wppost-blog-label, #wppost-bydefault-label, #wppost-forward-label { - float: left; - width: 350px; - margin-top: 10px; -} - -#wppost-checkbox, #wppost-username, #wppost-password, -#wppost-blog, #wppost-bydefault, #wppost-forward { - float: left; - margin-top: 10px; -} - -#wppost-submit, #settings-wordpress-wrapper { - margin-top: 15px; -} - diff --git a/sources/extend/addon/matrix/wppost/wppost.php b/sources/extend/addon/matrix/wppost/wppost.php deleted file mode 100755 index b3686fd2..00000000 --- a/sources/extend/addon/matrix/wppost/wppost.php +++ /dev/null @@ -1,411 +0,0 @@ - - */ - -require_once('include/permissions.php'); -require_once('library/IXR_Library.php'); - - -function wppost_load () { - register_hook('post_local', 'addon/wppost/wppost.php', 'wppost_post_local'); - register_hook('post_remote_end', 'addon/wppost/wppost.php', 'wppost_post_remote_end'); - register_hook('notifier_normal', 'addon/wppost/wppost.php', 'wppost_send'); - register_hook('jot_networks', 'addon/wppost/wppost.php', 'wppost_jot_nets'); - register_hook('feature_settings', 'addon/wppost/wppost.php', 'wppost_settings'); - register_hook('feature_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post'); - register_hook('drop_item', 'addon/wppost/wppost.php', 'wppost_drop_item'); -} - -function wppost_unload () { - unregister_hook('post_local', 'addon/wppost/wppost.php', 'wppost_post_local'); - unregister_hook('post_remote_end', 'addon/wppost/wppost.php', 'wppost_post_remote_end'); - unregister_hook('notifier_normal', 'addon/wppost/wppost.php', 'wppost_send'); - unregister_hook('jot_networks', 'addon/wppost/wppost.php', 'wppost_jot_nets'); - unregister_hook('feature_settings', 'addon/wppost/wppost.php', 'wppost_settings'); - unregister_hook('feature_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post'); - unregister_hook('drop_item', 'addon/wppost/wppost.php', 'wppost_drop_item'); -} - - -function wppost_jot_nets(&$a,&$b) { - if((! local_channel()) || (! perm_is_allowed(local_channel(),'','view_stream'))) - return; - - $wp_post = get_pconfig(local_channel(),'wppost','post'); - if(intval($wp_post) == 1) { - $wp_defpost = get_pconfig(local_channel(),'wppost','post_by_default'); - $selected = ((intval($wp_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '
' . t('Post to WordPress') . '
'; - - } -} - - -function wppost_settings(&$a,&$s) { - - if(! local_channel()) - return; - - /* Add our stylesheet to the page so we can make our settings look nice */ - - //head_add_css('/addon/wppost/wppost.css'); - - /* Get the current state of our config variables */ - - $enabled = get_pconfig(local_channel(),'wppost','post'); - - $checked = (($enabled) ? 1 : false); - - $fwd_enabled = get_pconfig(local_channel(), 'wppost','forward_comments'); - - $fwd_checked = (($fwd_enabled) ? 1 : false); - - $def_enabled = get_pconfig(local_channel(),'wppost','post_by_default'); - - $def_checked = (($def_enabled) ? 1 : false); - - $wp_username = get_pconfig(local_channel(), 'wppost', 'wp_username'); - $wp_password = z_unobscure(get_pconfig(local_channel(), 'wppost', 'wp_password')); - $wp_blog = get_pconfig(local_channel(), 'wppost', 'wp_blog'); - - - /* Add some HTML to the existing form */ - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('wppost', t('Enable WordPress Post Plugin'), $checked, '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('wp_username', t('WordPress username'), $wp_username, '') - )); - - $sc .= replace_macros(get_markup_template('field_password.tpl'), array( - '$field' => array('wp_password', t('WordPress password'), $wp_password, '') - )); - - $sc .= replace_macros(get_markup_template('field_input.tpl'), array( - '$field' => array('wp_blog', t('WordPress API URL'), $wp_blog, '') - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('wp_bydefault', t('Post to WordPress by default'), $def_checked, '', array(t('No'),t('Yes'))), - )); - - $sc .= replace_macros(get_markup_template('field_checkbox.tpl'), array( - '$field' => array('wp_forward_comments', t('Forward comments (requires hubzilla_wp plugin)'), $fwd_checked, '', array(t('No'),t('Yes'))), - )); - - $s .= replace_macros(get_markup_template('generic_addon_settings.tpl'), array( - '$addon' => array('wppost', '' . t('WordPress Post Settings'), '', t('Submit')), - '$content' => $sc - )); - -} - - -function wppost_settings_post(&$a,&$b) { - if(x($_POST,'wppost-submit')) { - set_pconfig(local_channel(),'wppost','post',intval($_POST['wppost'])); - set_pconfig(local_channel(),'wppost','post_by_default',intval($_POST['wp_bydefault'])); - set_pconfig(local_channel(),'wppost','wp_username',trim($_POST['wp_username'])); - set_pconfig(local_channel(),'wppost','wp_password',z_obscure(trim($_POST['wp_password']))); - set_pconfig(local_channel(),'wppost','wp_blog',trim($_POST['wp_blog'])); - set_pconfig(local_channel(),'wppost','forward_comments',trim($_POST['wp_forward_comments'])); - info( t('Wordpress Settings saved.') . EOL); - } -} - -function wppost_post_local(&$a,&$b) { - - // This can probably be changed to allow editing by pointing to a different API endpoint - - if($b['edit']) - return; - - if((! local_channel()) || (local_channel() != $b['uid'])) - return; - - if($b['item_private'] || $b['parent']) - return; - - $wp_post = intval(get_pconfig(local_channel(),'wppost','post')); - - $wp_enable = (($wp_post && x($_REQUEST,'wppost_enable')) ? intval($_REQUEST['wppost_enable']) : 0); - - if($_REQUEST['api_source'] && intval(get_pconfig(local_channel(),'wppost','post_by_default'))) - $wp_enable = 1; - - if(! $wp_enable) - return; - - if(strlen($b['postopts'])) - $b['postopts'] .= ','; - $b['postopts'] .= 'wppost'; -} - - - - -function wppost_send(&$a,&$b) { - - if((! is_item_normal($b)) || $b['item_private']) - return; - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - if(! strstr($b['postopts'],'wppost')) - return; - - $edited = (($b['created'] !== $b['edited']) ? true : false); - - if($b['parent'] != $b['id']) - return; - - logger('Wordpress xpost invoked', LOGGER_DEBUG); - - if($edited) { - $r = q("select * from item_id where service = 'wordpress' and iid = %d and uid = %d limit 1", - intval($b['id']), - intval($b['uid']) - ); - if(! $r) - return; - - $wp_post_id = intval(basename($r[0]['sid'])); - } - - $tags = null; - $categories = null; - - if(is_array($b['term']) && $b['term']) { - foreach($b['term'] as $term) { - if($term['type'] == TERM_CATEGORY) - $categories[] = $term['term']; - if($term['type'] == TERM_HASHTAG) - $tags[] = $term['term']; - } - } - - $terms_names = array(); - if($tags) - $terms_names['post_tag'] = $tags; - if($categories) - $terms_names['category'] = $categories; - - - - $wp_username = get_pconfig($b['uid'],'wppost','wp_username'); - $wp_password = z_unobscure(get_pconfig($b['uid'],'wppost','wp_password')); - $wp_blog = get_pconfig($b['uid'],'wppost','wp_blog'); - - if($wp_username && $wp_password && $wp_blog) { - - require_once('include/bbcode.php'); - - $data = array( - 'post_title' => trim($b['title']), - 'post_content' => bbcode($b['body']), - 'post_type' => 'post', - 'post_status' => 'publish', - 'comment_status' => 'open', - 'custom_fields' => array(array('key' => 'post_from_red', 'value' => '1')) - ); - if($terms_names) - $data['terms_names'] = $terms_names; - - - $client = new IXR_Client($wp_blog); - - - if($edited) - $res = $client->query('wp.editPost',1,$wp_username,$wp_password,$wp_post_id,$data); - else - $res = $client->query('wp.newPost',1,$wp_username,$wp_password,$data); - - if(! $res) { - logger('wppost: failed.'); - return; - } - - $post_id = $client->getResponse(); - - logger('wppost: returns post_id: ' . $post_id, LOGGER_DEBUG); - - if($edited) - return; - - if($post_id) { - q("insert into item_id ( iid, uid, sid, service ) values ( %d, %d, '%s','%s' )", - intval($b['id']), - intval($b['uid']), - dbesc(dirname($wp_blog) . '/' . $post_id), - dbesc('wordpress') - ); - } - } -} - - -function wppost_post_remote_end(&$a,&$b) { - - // We are only looking for public comments - - logger('wppost_post_remote_end'); - - if($b['mid'] === $b['parent_mid']) - return; - - if((! is_item_normal($b)) || $b['item_private']) - return; - - // Does the post owner have this plugin installed? - - $wp_post = intval(get_pconfig($b['uid'],'wppost','post')); - if(! $wp_post) - return; - - // Are we allowed to forward comments? - - $wp_forward_comments = intval(get_pconfig($b['uid'],'wppost','forward_comments')); - if(! $wp_forward_comments) - return; - - // how about our stream permissions? - - if(! perm_is_allowed($b['uid'],'','view_stream')) - return; - - // Now we have to get down and dirty. Was the parent shared with wordpress? - - $r = q("select * from item_id where service = 'wordpress' and iid = %d and uid = %d limit 1", - intval($b['parent']), - intval($b['uid']) - ); - if(! $r) - return; - - $wp_parent_id = intval(basename($r[0]['sid'])); - - $x = q("select * from xchan where xchan_hash = '%s' limit 1", - dbesc($b['author_xchan']) - ); - if(! $x) - return; - - logger('Wordpress xpost comment invoked', LOGGER_DEBUG); - - $edited = (($b['created'] !== $b['edited']) ? true : false); - - if($edited) { - $r = q("select * from item_id where service = 'wordpress' and iid = %d and uid = %d limit 1", - intval($b['id']), - intval($b['uid']) - ); - if(! $r) - return; - - $wp_comment_id = intval(basename($r[0]['sid'])); - } - - $wp_username = get_pconfig($b['uid'],'wppost','wp_username'); - $wp_password = z_unobscure(get_pconfig($b['uid'],'wppost','wp_password')); - $wp_blog = get_pconfig($b['uid'],'wppost','wp_blog'); - - if($wp_username && $wp_password && $wp_blog) { - - require_once('include/bbcode.php'); - - $data = array( - 'author' => $x[0]['xchan_name'], - 'author_email' => $x[0]['xchan_addr'], - 'author_url' => $x[0]['xchan_url'], - 'content' => bbcode($b['body']), - 'approved' => 1 - ); - if($edited) - $data['comment_id'] = $wp_comment_id; - else - $data['red_avatar'] = $x[0]['xchan_photo_m']; - - $client = new IXR_Client($wp_blog); - - // this will fail if the post_to_red plugin isn't installed on the wordpress site - - $res = $client->query('red.Comment',1,$wp_username,$wp_password,$wp_parent_id,$data); - - if(! $res) { - logger('wppost: comment failed.'); - return; - } - - - $post_id = $client->getResponse(); - - logger('wppost: comment returns post_id: ' . $post_id, LOGGER_DEBUG); - - // edited just returns true - - if($edited) - return; - - if($post_id) { - q("insert into item_id ( iid, uid, sid, service ) values ( %d, %d, '%s','%s' )", - intval($b['id']), - intval($b['uid']), - dbesc(dirname($wp_blog) . '/' . $post_id), - dbesc('wordpress') - ); - } - } -} - - - - - -function wppost_drop_item(&$a,&$b) { - - $wp_enabled = get_pconfig($b['item']['uid'],'wppost','post'); - if(! $wp_enabled) - return; - - $r = q("select * from item_id where service = 'wordpress' and iid = %d and uid = %d limit 1", - intval($b['item']['id']), - intval($b['item']['uid']) - ); - if(! $r) - return; - - $post_id = basename($r[0]['sid']); - - $wp_username = get_pconfig($b['item']['uid'],'wppost','wp_username'); - $wp_password = z_unobscure(get_pconfig($b['item']['uid'],'wppost','wp_password')); - $wp_blog = get_pconfig($b['item']['uid'],'wppost','wp_blog'); - - if($post_id && $wp_username && $wp_password && $wp_blog) { - - $client = new IXR_Client($wp_blog); - - if($b['item']['id'] == $b['item']['parent']) - $res = $client->query('wp.deletePost',1,$wp_username,$wp_password,$post_id); - else - $res = $client->query('wp.deleteComment',1,$wp_username,$wp_password,$post_id); - - if(! $res) { - logger('wppost: delete failed.'); - return; - } - - $result = intval($client->getResponse()); - - logger('wppost: delete post returns: ' . $result, LOGGER_DEBUG); - - } - -} diff --git a/sources/images/default_profile_photos/alpha/300.png b/sources/images/default_profile_photos/alpha/300.png index 17211ee2..9e36606b 100644 Binary files a/sources/images/default_profile_photos/alpha/300.png and b/sources/images/default_profile_photos/alpha/300.png differ diff --git a/sources/images/default_profile_photos/black_avatar_1/300.png b/sources/images/default_profile_photos/black_avatar_1/300.png index bc5b1979..00323ae5 100644 Binary files a/sources/images/default_profile_photos/black_avatar_1/300.png and b/sources/images/default_profile_photos/black_avatar_1/300.png differ diff --git a/sources/images/default_profile_photos/black_avatar_1/48.png b/sources/images/default_profile_photos/black_avatar_1/48.png index 7c7ed450..89def259 100644 Binary files a/sources/images/default_profile_photos/black_avatar_1/48.png and b/sources/images/default_profile_photos/black_avatar_1/48.png differ diff --git a/sources/images/default_profile_photos/black_avatar_1/80.png b/sources/images/default_profile_photos/black_avatar_1/80.png index 21108b00..ae41d20e 100644 Binary files a/sources/images/default_profile_photos/black_avatar_1/80.png and b/sources/images/default_profile_photos/black_avatar_1/80.png differ diff --git a/sources/images/default_profile_photos/black_avatar_2/300.png b/sources/images/default_profile_photos/black_avatar_2/300.png index 8ff3cbd4..57f729ea 100644 Binary files a/sources/images/default_profile_photos/black_avatar_2/300.png and b/sources/images/default_profile_photos/black_avatar_2/300.png differ diff --git a/sources/images/default_profile_photos/black_avatar_2/48.png b/sources/images/default_profile_photos/black_avatar_2/48.png index e7c37b74..07a52c48 100644 Binary files a/sources/images/default_profile_photos/black_avatar_2/48.png and b/sources/images/default_profile_photos/black_avatar_2/48.png differ diff --git a/sources/images/default_profile_photos/black_avatar_2/80.png b/sources/images/default_profile_photos/black_avatar_2/80.png index 9a484356..f55e7ebe 100644 Binary files a/sources/images/default_profile_photos/black_avatar_2/80.png and b/sources/images/default_profile_photos/black_avatar_2/80.png differ diff --git a/sources/images/default_profile_photos/blank/300.jpg b/sources/images/default_profile_photos/blank/300.jpg index 4024d6e8..6d039cd0 100644 Binary files a/sources/images/default_profile_photos/blank/300.jpg and b/sources/images/default_profile_photos/blank/300.jpg differ diff --git a/sources/images/default_profile_photos/blank/300.png b/sources/images/default_profile_photos/blank/300.png index 1edb25b7..dda9daa5 100644 Binary files a/sources/images/default_profile_photos/blank/300.png and b/sources/images/default_profile_photos/blank/300.png differ diff --git a/sources/images/default_profile_photos/hubzilla_avatar/300.png b/sources/images/default_profile_photos/hubzilla_avatar/300.png new file mode 100644 index 00000000..675b5732 Binary files /dev/null and b/sources/images/default_profile_photos/hubzilla_avatar/300.png differ diff --git a/sources/images/default_profile_photos/hubzilla_avatar/48.png b/sources/images/default_profile_photos/hubzilla_avatar/48.png new file mode 100644 index 00000000..ed35f353 Binary files /dev/null and b/sources/images/default_profile_photos/hubzilla_avatar/48.png differ diff --git a/sources/images/default_profile_photos/hubzilla_avatar/80.png b/sources/images/default_profile_photos/hubzilla_avatar/80.png new file mode 100644 index 00000000..86352d35 Binary files /dev/null and b/sources/images/default_profile_photos/hubzilla_avatar/80.png differ diff --git a/sources/images/default_profile_photos/rainbow_man/300.jpg b/sources/images/default_profile_photos/rainbow_man/300.jpg index fc0ec3d7..d1d35c7d 100644 Binary files a/sources/images/default_profile_photos/rainbow_man/300.jpg and b/sources/images/default_profile_photos/rainbow_man/300.jpg differ diff --git a/sources/images/default_profile_photos/rainbow_man/300.png b/sources/images/default_profile_photos/rainbow_man/300.png index 30a7e0ff..b8541ef4 100644 Binary files a/sources/images/default_profile_photos/rainbow_man/300.png and b/sources/images/default_profile_photos/rainbow_man/300.png differ diff --git a/sources/images/default_profile_photos/rainbow_man_trans/300.png b/sources/images/default_profile_photos/rainbow_man_trans/300.png index a0a23684..b715f67e 100644 Binary files a/sources/images/default_profile_photos/rainbow_man_trans/300.png and b/sources/images/default_profile_photos/rainbow_man_trans/300.png differ diff --git a/sources/images/default_profile_photos/red_avatar/300.png b/sources/images/default_profile_photos/red_avatar/300.png index 31d39a41..20928712 100644 Binary files a/sources/images/default_profile_photos/red_avatar/300.png and b/sources/images/default_profile_photos/red_avatar/300.png differ diff --git a/sources/images/default_profile_photos/red_avatar/48.png b/sources/images/default_profile_photos/red_avatar/48.png index cf42b51f..05c5561a 100644 Binary files a/sources/images/default_profile_photos/red_avatar/48.png and b/sources/images/default_profile_photos/red_avatar/48.png differ diff --git a/sources/images/default_profile_photos/red_avatar/80.png b/sources/images/default_profile_photos/red_avatar/80.png index 850c5993..19bede48 100644 Binary files a/sources/images/default_profile_photos/red_avatar/80.png and b/sources/images/default_profile_photos/red_avatar/80.png differ diff --git a/sources/images/default_profile_photos/red_koala/300.jpg b/sources/images/default_profile_photos/red_koala/300.jpg index e49343b1..b9c8ffea 100644 Binary files a/sources/images/default_profile_photos/red_koala/300.jpg and b/sources/images/default_profile_photos/red_koala/300.jpg differ diff --git a/sources/images/default_profile_photos/red_koala/300.png b/sources/images/default_profile_photos/red_koala/300.png index ee4a701d..8eab5e4b 100644 Binary files a/sources/images/default_profile_photos/red_koala/300.png and b/sources/images/default_profile_photos/red_koala/300.png differ diff --git a/sources/images/default_profile_photos/red_koala_trans/300.png b/sources/images/default_profile_photos/red_koala_trans/300.png index 4e51c80e..a76b2fff 100644 Binary files a/sources/images/default_profile_photos/red_koala_trans/300.png and b/sources/images/default_profile_photos/red_koala_trans/300.png differ diff --git a/sources/images/default_profile_photos/redmatrix_logo_smiley/300.png b/sources/images/default_profile_photos/redmatrix_logo_smiley/300.png index 7299c449..d0b18ea8 100644 Binary files a/sources/images/default_profile_photos/redmatrix_logo_smiley/300.png and b/sources/images/default_profile_photos/redmatrix_logo_smiley/300.png differ diff --git a/sources/images/hubzilla-banner.png b/sources/images/hubzilla-banner.png new file mode 100644 index 00000000..055a2a19 Binary files /dev/null and b/sources/images/hubzilla-banner.png differ diff --git a/sources/images/hubzilla_house_arrows.png b/sources/images/hubzilla_house_arrows.png new file mode 100644 index 00000000..56402a96 Binary files /dev/null and b/sources/images/hubzilla_house_arrows.png differ diff --git a/sources/images/hubzilla_logo_1.png b/sources/images/hubzilla_logo_1.png new file mode 100644 index 00000000..e6494bc5 Binary files /dev/null and b/sources/images/hubzilla_logo_1.png differ diff --git a/sources/images/hubzilla_logo_2.png b/sources/images/hubzilla_logo_2.png new file mode 100644 index 00000000..e235adc0 Binary files /dev/null and b/sources/images/hubzilla_logo_2.png differ diff --git a/sources/images/hubzilla_logo_3.png b/sources/images/hubzilla_logo_3.png new file mode 100644 index 00000000..1e32a737 Binary files /dev/null and b/sources/images/hubzilla_logo_3.png differ diff --git a/sources/images/hubzilla_logo_4.png b/sources/images/hubzilla_logo_4.png new file mode 100644 index 00000000..1e07fcd3 Binary files /dev/null and b/sources/images/hubzilla_logo_4.png differ diff --git a/sources/images/hubzilla_logo_5.png b/sources/images/hubzilla_logo_5.png new file mode 100644 index 00000000..ac5921fa Binary files /dev/null and b/sources/images/hubzilla_logo_5.png differ diff --git a/sources/images/hubzilla_logo_6.png b/sources/images/hubzilla_logo_6.png new file mode 100644 index 00000000..b6c8306b Binary files /dev/null and b/sources/images/hubzilla_logo_6.png differ diff --git a/sources/images/hz-16.png b/sources/images/hz-16.png new file mode 100644 index 00000000..37f467a7 Binary files /dev/null and b/sources/images/hz-16.png differ diff --git a/sources/images/hz-32.png b/sources/images/hz-32.png new file mode 100644 index 00000000..bbb107fd Binary files /dev/null and b/sources/images/hz-32.png differ diff --git a/sources/images/hz-64.png b/sources/images/hz-64.png new file mode 100644 index 00000000..f246413f Binary files /dev/null and b/sources/images/hz-64.png differ diff --git a/sources/images/hz-white-16.png b/sources/images/hz-white-16.png new file mode 100644 index 00000000..2f8f71c2 Binary files /dev/null and b/sources/images/hz-white-16.png differ diff --git a/sources/images/hz-white-32.png b/sources/images/hz-white-32.png new file mode 100644 index 00000000..0549ca85 Binary files /dev/null and b/sources/images/hz-white-32.png differ diff --git a/sources/images/hz-white-64.png b/sources/images/hz-white-64.png new file mode 100644 index 00000000..793a1578 Binary files /dev/null and b/sources/images/hz-white-64.png differ diff --git a/sources/include/AccessList.php b/sources/include/AccessList.php new file mode 100644 index 00000000..43f1de11 --- /dev/null +++ b/sources/include/AccessList.php @@ -0,0 +1,148 @@ +allow_cid = $channel['channel_allow_cid']; + $this->allow_gid = $channel['channel_allow_gid']; + $this->deny_cid = $channel['channel_deny_cid']; + $this->deny_gid = $channel['channel_deny_gid']; + } + else { + $this->allow_cid = ''; + $this->allow_gid = ''; + $this->deny_cid = ''; + $this->deny_gid = ''; + } + + $this->explicit = false; + } + + function get_explicit() { + return $this->explicit; + } + + /** + * Set AccessList from strings such as those in already + * existing stored data items + */ + + function set($arr,$explicit = true) { + $this->allow_cid = $arr['allow_cid']; + $this->allow_gid = $arr['allow_gid']; + $this->deny_cid = $arr['deny_cid']; + $this->deny_gid = $arr['deny_gid']; + + $this->explicit = $explicit; + } + + /** + * return an array consisting of the current + * access list components where the elements + * are directly storable. + */ + + function get() { + return array( + 'allow_cid' => $this->allow_cid, + 'allow_gid' => $this->allow_gid, + 'deny_cid' => $this->deny_cid, + 'deny_gid' => $this->deny_gid, + ); + } + + /** + * Set AccessList from arrays, such as those provided by + * acl_selector(). For convenience, a string (or non-array) input is + * assumed to be a comma-separated list and auto-converted into an array. + */ + + function set_from_array($arr,$explicit = true) { + $this->allow_cid = perms2str((is_array($arr['contact_allow'])) + ? $arr['contact_allow'] : explode(',',$arr['contact_allow'])); + $this->allow_gid = perms2str((is_array($arr['group_allow'])) + ? $arr['group_allow'] : explode(',',$arr['group_allow'])); + $this->deny_cid = perms2str((is_array($arr['contact_deny'])) + ? $arr['contact_deny'] : explode(',',$arr['contact_deny'])); + $this->deny_gid = perms2str((is_array($arr['group_deny'])) + ? $arr['group_deny'] : explode(',',$arr['group_deny'])); + + $this->explicit = $explicit; + } + + function is_private() { + return (($this->allow_cid || $this->allow_gid || $this->deny_cid || $this->deny_gid) ? true : false); + } + +} + +/** + * @brief Used to wrap ACL elements in angle brackets for storage. + * + * @param[in,out] array &$item + */ +function sanitise_acl(&$item) { + if (strlen($item)) + $item = '<' . notags(trim($item)) . '>'; + else + unset($item); +} + +/** + * @brief Convert an ACL array to a storable string. + * + * @param array $p + * @return array + */ +function perms2str($p) { + $ret = ''; + + if (is_array($p)) + $tmp = $p; + else + $tmp = explode(',', $p); + + if (is_array($tmp)) { + array_walk($tmp, 'sanitise_acl'); + $ret = implode('', $tmp); + } + + return $ret; +} + + +/** + * @brief Turn user/group ACLs stored as angle bracketed text into arrays. + * + * turn string array of angle-bracketed elements into string array + * e.g. "<123xyz><246qyo>" => array(123xyz,246qyo,sxo33e); + * + * @param string $s + * @return array + */ +function expand_acl($s) { + $ret = array(); + + if(strlen($s)) { + $t = str_replace('<','',$s); + $a = explode('>',$t); + foreach($a as $aa) { + if($aa) + $ret[] = $aa; + } + } + + return $ret; +} diff --git a/sources/include/Contact.php b/sources/include/Contact.php index 6b5f9388..8e22c608 100644 --- a/sources/include/Contact.php +++ b/sources/include/Contact.php @@ -174,9 +174,6 @@ function abook_toggle_flag($abook,$flag) { ); } - $a = get_app(); - if($a->data['abook']) - $a->data['abook']['abook_flags'] = $a->data['abook']['abook_flags'] ^ $flag; return $r; } @@ -322,6 +319,8 @@ function channel_remove($channel_id, $local = true, $unset_session=true) { q("DELETE FROM `pconfig` WHERE `uid` = %d", intval($channel_id)); q("DELETE FROM `spam` WHERE `uid` = %d", intval($channel_id)); + // @FIXME At this stage we need to remove the file resources located under /store/$nickname + q("delete from abook where abook_xchan = '%s' and abook_self = 1 ", dbesc($channel['channel_hash']) diff --git a/sources/include/DReport.php b/sources/include/DReport.php new file mode 100644 index 00000000..ef86c8cb --- /dev/null +++ b/sources/include/DReport.php @@ -0,0 +1,55 @@ +location = $location; + $this->sender = $sender; + $this->recipient = $recipient; + $this->message_id = $message_id; + $this->status = $status; + $this->date = datetime_convert(); + } + + function update($status) { + $this->status = $status; + $this->date = datetime_convert(); + } + + function addto_recipient($name) { + $this->recipient = $this->recipient . ' ' . $name; + } + + function addto_update($status) { + $this->status = $this->status . ' ' . $status; + } + + + function set($arr) { + $this->location = $arr['location']; + $this->sender = $arr['sender']; + $this->recipient = $arr['recipient']; + $this->message_id = $arr['message_id']; + $this->status = $arr['status']; + $this->date = $arr['date']; + } + + function get() { + return array( + 'location' => $this->location, + 'sender' => $this->sender, + 'recipient' => $this->recipient, + 'message_id' => $this->message_id, + 'status' => $this->status, + 'date' => $this->date + ); + } +} diff --git a/sources/include/Import/import_diaspora.php b/sources/include/Import/import_diaspora.php index fca9fa4f..a0f473b5 100644 --- a/sources/include/Import/import_diaspora.php +++ b/sources/include/Import/import_diaspora.php @@ -57,6 +57,10 @@ function import_diaspora($data) { $channel_id = $c['channel']['channel_id']; + // Hubzilla only: Turn on the Diaspora protocol so that follow requests will be sent. + + set_pconfig($channel_id,'system','diaspora_allowed','1'); + // todo - add auto follow settings, (and strip exif in hubzilla) $location = escape_tags($data['user']['profile']['location']); @@ -70,7 +74,6 @@ function import_diaspora($data) { ); if($data['user']['profile']['nsfw']) { - // fixme for hubzilla which doesn't use pageflags any more q("update channel set channel_pageflags = (channel_pageflags | %d) where channel_id = %d", intval(PAGE_ADULT), intval($channel_id) diff --git a/sources/include/ItemObject.php b/sources/include/ItemObject.php index d23c1c65..c5c2cb2e 100644 --- a/sources/include/ItemObject.php +++ b/sources/include/ItemObject.php @@ -278,14 +278,21 @@ class Item extends BaseObject { $children = $this->get_children(); + $has_tags = (($body['tags'] || $body['categories'] || $body['mentions'] || $body['attachments'] || $body['folders']) ? true : false); + $tmp_item = array( 'template' => $this->get_template(), 'mode' => $mode, 'type' => implode("",array_slice(explode("/",$item['verb']),-1)), - 'tags' => array(), - 'body' => $body, - 'text' => strip_tags($body), + 'body' => $body['html'], + 'tags' => $body['tags'], + 'categories' => $body['categories'], + 'mentions' => $body['mentions'], + 'attachments' => $body['attachments'], + 'folders' => $body['folders'], + 'text' => strip_tags($body['html']), 'id' => $this->get_id(), + 'mid' => $item['mid'], 'isevent' => $isevent, 'attend' => $attend, 'consensus' => $consensus, @@ -301,6 +308,7 @@ class Item extends BaseObject { 'vwall' => t('via Wall-To-Wall:'), 'profile_url' => $profile_link, 'item_photo_menu' => item_photo_menu($item), + 'dreport' => t('Delivery Report'), 'name' => $profile_name, 'thumb' => $profile_avatar, 'osparkle' => $osparkle, @@ -323,6 +331,8 @@ class Item extends BaseObject { 'owner_url' => $this->get_owner_url(), 'owner_photo' => $this->get_owner_photo(), 'owner_name' => $this->get_owner_name(), + 'photo' => $body['photo'], + 'has_tags' => $has_tags, // Item toolbar buttons 'like' => $like, diff --git a/sources/include/RedDAV/RedBrowser.php b/sources/include/RedDAV/RedBrowser.php index d74bba22..efea5d92 100644 --- a/sources/include/RedDAV/RedBrowser.php +++ b/sources/include/RedDAV/RedBrowser.php @@ -217,31 +217,6 @@ class RedBrowser extends DAV\Browser\Plugin { $f[] = $ft; } - // Storage and quota for the account (all channels of the owner of this directory)! - $limit = service_class_fetch($owner, 'attach_upload_limit'); - $r = q("SELECT SUM(filesize) AS total FROM attach WHERE aid = %d", - intval($this->auth->channel_account_id) - ); - $used = $r[0]['total']; - if ($used) { - $quotaDesc = t('%1$s used'); - $quotaDesc = sprintf($quotaDesc, - userReadableSize($used)); - } - if ($limit && $used) { - $quotaDesc = t('%1$s used of %2$s (%3$s%)'); - $quotaDesc = sprintf($quotaDesc, - userReadableSize($used), - userReadableSize($limit), - round($used / $limit, 1)); - } - - // prepare quota for template - $quota = array(); - $quota['used'] = $used; - $quota['limit'] = $limit; - $quota['desc'] = $quotaDesc; - $output = ''; if ($this->enablePost) { $this->server->broadcastEvent('onHTMLActionsPanel', array($parent, &$output)); @@ -249,7 +224,6 @@ class RedBrowser extends DAV\Browser\Plugin { $html .= replace_macros(get_markup_template('cloud.tpl'), array( '$header' => t('Files') . ": " . $this->escapeHTML($path) . "/", - '$quota' => $quota, '$total' => t('Total'), '$actionspanel' => $output, '$shared' => t('Shared'), @@ -298,11 +272,38 @@ class RedBrowser extends DAV\Browser\Plugin { if (get_class($node) === 'Sabre\\DAV\\SimpleCollection') return; + // Storage and quota for the account (all channels of the owner of this directory)! + $limit = service_class_fetch($owner, 'attach_upload_limit'); + $r = q("SELECT SUM(filesize) AS total FROM attach WHERE aid = %d", + intval($this->auth->channel_account_id) + ); + $used = $r[0]['total']; + if ($used) { + $quotaDesc = t('You are using %1$s of your available file storage.'); + $quotaDesc = sprintf($quotaDesc, + userReadableSize($used)); + } + if ($limit && $used) { + $quotaDesc = t('You are using %1$s of %2$s available file storage. (%3$s%)'); + $quotaDesc = sprintf($quotaDesc, + userReadableSize($used), + userReadableSize($limit), + round($used / $limit, 1) * 100); + } + + // prepare quota for template + $quota = array(); + $quota['used'] = $used; + $quota['limit'] = $limit; + $quota['desc'] = $quotaDesc; + $quota['warning'] = ((($limit) && ((round($used / $limit, 1) * 100) >= 90)) ? t('WARNING:') : ''); // 10485760 bytes = 100MB + $output .= replace_macros(get_markup_template('cloud_actionspanel.tpl'), array( '$folder_header' => t('Create new folder'), '$folder_submit' => t('Create'), '$upload_header' => t('Upload file'), - '$upload_submit' => t('Upload') + '$upload_submit' => t('Upload'), + '$quota' => $quota )); } diff --git a/sources/include/account.php b/sources/include/account.php index 5926e05c..b3a520fd 100644 --- a/sources/include/account.php +++ b/sources/include/account.php @@ -217,6 +217,8 @@ function create_account($arr) { $result['email'] = $email; $result['password'] = $password; + call_hooks('register_account',$result); + return $result; } diff --git a/sources/include/api.php b/sources/include/api.php index 36999233..16dbb569 100644 --- a/sources/include/api.php +++ b/sources/include/api.php @@ -8,6 +8,7 @@ require_once("html2plain.php"); require_once('include/security.php'); require_once('include/photos.php'); require_once('include/items.php'); +require_once('include/attach.php'); /* * @@ -619,6 +620,36 @@ require_once('include/items.php'); } api_register_func('api/red/channel/stream','api_channel_stream', true); + function api_attach_list(&$a,$type) { + logger('api_user: ' . api_user()); + json_return_and_die(attach_list_files(api_user(),get_observer_hash(),'','','','created asc')); + } + api_register_func('api/red/files','api_attach_list', true); + + + function api_file_detail(&$a,$type) { + if (api_user()===false) return false; + if(! $_REQUEST['file_id']) return false; + $r = q("select * from attach where uid = %d and hash = '%s' limit 1", + intval(api_user()), + dbesc($_REQUEST['file_id']) + ); + if($r) { + if($r[0]['is_dir']) + $r[0]['data'] = ''; + elseif(intval($r[0]['os_storage'])) + $r[0]['data'] = base64_encode(file_get_contents(dbunescbin($r[0]['data']))); + else + $r[0]['data'] = base64_encode(dbunescbin($r[0]['data'])); + + $ret = array('attach' => $r[0]); + json_return_and_die($ret); + } + killme(); + } + + api_register_func('api/red/file', 'api_file_detail', true); + function api_albums(&$a,$type) { json_return_and_die(photos_albums_list($a->get_channel(),$a->get_observer())); @@ -645,7 +676,27 @@ require_once('include/items.php'); if(array_key_exists('os_storage',$r[0]) && intval($r[0]['os_storage'])) $data = file_get_contents($data); $r[0]['data'] = base64_encode($data); - json_return_and_die($r[0]); + $ret = array('photo' => $r[0]); + $i = q("select id from item where uid = %d and resource_type = 'photo' and resource_id = '%s' limit 1", + intval(local_channel()), + dbesc($_REQUEST['photo_id']) + ); + if($i) { + $ii = q("select * from item where parent = %d order by id", + intval($i[0]['id']) + ); + if($ii) { + xchan_query($ii,true,0); + $ii = fetch_post_tags($ii,true); + if($ii) { + $ret['item'] = array(); + foreach($ii as $iii) + $ret['item'][] = encode_item($iii,true); + } + } + } + + json_return_and_die($ret); } killme(); } @@ -876,6 +927,55 @@ require_once('include/items.php'); api_register_func('api/red/item/new','red_item_new', true); + function red_item(&$a, $type) { + + if (api_user() === false) { + logger('api_red_item_new: no user'); + return false; + } + + if($_REQUEST['mid']) { + $arr = array('mid' => $_REQUEST['mid']); + } + elseif($_REQUEST['item_id']) { + $arr = array('item_id' => $_REQUEST['item_id']); + } + else + json_return_and_die(array()); + + $arr['start'] = 0; + $arr['records'] = 999999; + $arr['item_type'] = '*'; + + $i = items_fetch($arr,$a->get_channel(),get_observer_hash()); + + if(! $i) + json_return_and_die(array()); + + $ret = array(); + $tmp = array(); + $str = ''; + foreach($i as $ii) { + $tmp[] = encode_item($ii,true); + if($str) + $str .= ','; + $str .= $ii['id']; + } + $ret['item'] = $tmp; + if($str) { + $r = q("select item_id.*, item.mid from item_id left join item on item_id.iid = item.id where item.id in ( $str ) "); + + if($r) + $ret['item_id'] = $r; + } + + json_return_and_die($ret); + } + + api_register_func('api/red/item/full','red_item', true); + + + function api_get_status($xchan_hash) { require_once('include/security.php'); @@ -1387,7 +1487,7 @@ require_once('include/items.php'); * */ -// FIXME + function api_statuses_mentions(&$a, $type){ if (api_user()===false) return false; @@ -1412,39 +1512,25 @@ require_once('include/items.php'); $myurl = str_replace(array('www.','.'),array('','\\.'),$myurl); $diasp_url = str_replace('/channel/','/u/',$myurl); - if (get_config('system','use_fulltext_engine')) - $sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where (MATCH(`author-link`) AGAINST ('".'"%s"'."' in boolean mode) or MATCH(`tag`) AGAINST ('".'"%s"'."' in boolean mode) or MATCH(tag) AGAINST ('".'"%s"'."' in boolean mode))) ", - dbesc(protect_sprintf($myurl)), - dbesc(protect_sprintf($myurl)), - dbesc(protect_sprintf($diasp_url)) - ); - else - $sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where ( `author-link` like '%s' or `tag` like '%s' or tag like '%s' )) ", - dbesc(protect_sprintf('%' . $myurl)), - dbesc(protect_sprintf('%' . $myurl . ']%')), - dbesc(protect_sprintf('%' . $diasp_url . ']%')) - ); - + $sql_extra .= " AND item_mentionsme = 1 "; if ($max_id > 0) - $sql_extra .= ' AND `item`.`id` <= '.intval($max_id); + $sql_extra .= " AND item.id <= " . intval($max_id) . " "; - $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, - `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, - `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`, - `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` - FROM `item`, `contact` - WHERE `item`.`uid` = %d - AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0 - AND `contact`.`id` = `item`.`contact-id` - AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - $sql_extra - AND `item`.`id`>%d - ORDER BY `item`.`received` DESC LIMIT %d ,%d ", - intval($user_info['uid']), + require_once('include/security.php'); + $item_normal = item_normal(); + + $r = q("select * from item where uid = " . intval(api_user()) . " + $item_normal $sql_extra + AND id > %d group by mid + order by received desc LIMIT %d OFFSET %d ", intval($since_id), - intval($start), intval($count) + intval($count), + intval($start) ); + xchan_query($r,true); + + $ret = api_format_items($r,$user_info); diff --git a/sources/include/apps.php b/sources/include/apps.php index 50464110..0a62dc5a 100644 --- a/sources/include/apps.php +++ b/sources/include/apps.php @@ -130,7 +130,7 @@ function translate_system_apps(&$arr) { 'Address Book' => t('Address Book'), 'Login' => t('Login'), 'Channel Manager' => t('Channel Manager'), - 'Matrix' => t('Matrix'), + 'Grid' => t('Grid'), 'Settings' => t('Settings'), 'Files' => t('Files'), 'Webpages' => t('Webpages'), @@ -176,14 +176,19 @@ function app_render($papp,$mode = 'view') { $installed = false; - if(! $papp['photo']) - $papp['photo'] = z_root() . '/' . get_default_profile_photo(80); - if(! $papp) return; + if(! $papp['photo']) + $papp['photo'] = z_root() . '/' . get_default_profile_photo(80); + + + $papp['papp'] = papp_encode($papp); + if(! strstr($papp['url'],'://')) + $papp['url'] = z_root() . ((strpos($papp['url'],'/') === 0) ? '' : '/') . $papp['url']; + foreach($papp as $k => $v) { if(strpos($v,'http') === 0 && $k != 'papp') $papp[$k] = zid($v); @@ -264,18 +269,37 @@ function app_install($uid,$app) { else $x = app_store($app); - if($x['success']) - return $x['app_id']; + if($x['success']) { + $r = q("select * from app where app_id = '%s' and app_channel = %d limit 1", + dbesc($x['app_id']), + intval($uid) + ); + if($r) + build_sync_packet($uid,array('app' => $r[0])); + return $x['app_id']; + } return false; } function app_destroy($uid,$app) { + + if($uid && $app['guid']) { + + $x = q("select * from app where app_id = '%s' and app_channel = %d limit 1", + dbesc($app['guid']), + intval($uid) + ); + $x[0]['app_deleted'] = 1; + + $r = q("delete from app where app_id = '%s' and app_channel = %d", dbesc($app['guid']), intval($uid) ); + + build_sync_packet($uid,array('app' => $x)); } } @@ -325,7 +349,7 @@ function app_store($arr) { return $ret; if($arr['photo'] && ! strstr($arr['photo'],z_root())) { - $x = import_profile_photo($arr['photo'],get_observer_hash(),true); + $x = import_xchan_photo($arr['photo'],get_observer_hash(),true); $arr['photo'] = $x[1]; } @@ -342,7 +366,9 @@ function app_store($arr) { $darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : ''); $darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : ''); - $r = q("insert into app ( app_id, app_sig, app_author, app_name, app_desc, app_url, app_photo, app_version, app_channel, app_addr, app_price, app_page, app_requires ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s' )", + $created = datetime_convert(); + + $r = q("insert into app ( app_id, app_sig, app_author, app_name, app_desc, app_url, app_photo, app_version, app_channel, app_addr, app_price, app_page, app_requires, app_created, app_edited ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s' )", dbesc($darray['app_id']), dbesc($darray['app_sig']), dbesc($darray['app_author']), @@ -355,7 +381,9 @@ function app_store($arr) { dbesc($darray['app_addr']), dbesc($darray['app_price']), dbesc($darray['app_page']), - dbesc($darray['app_requires']) + dbesc($darray['app_requires']), + dbesc($created), + dbesc($created) ); if($r) { $ret['success'] = true; @@ -378,7 +406,7 @@ function app_update($arr) { return $ret; if($arr['photo'] && ! strstr($arr['photo'],z_root())) { - $x = import_profile_photo($arr['photo'],get_observer_hash(),true); + $x = import_xchan_photo($arr['photo'],get_observer_hash(),true); $arr['photo'] = $x[1]; } @@ -393,7 +421,9 @@ function app_update($arr) { $darray['app_page'] = ((x($arr,'page')) ? escape_tags($arr['page']) : ''); $darray['app_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : ''); - $r = q("update app set app_sig = '%s', app_author = '%s', app_name = '%s', app_desc = '%s', app_url = '%s', app_photo = '%s', app_version = '%s', app_addr = '%s', app_price = '%s', app_page = '%s', app_requires = '%s' where app_id = '%s' and app_channel = %d", + $edited = datetime_convert(); + + $r = q("update app set app_sig = '%s', app_author = '%s', app_name = '%s', app_desc = '%s', app_url = '%s', app_photo = '%s', app_version = '%s', app_addr = '%s', app_price = '%s', app_page = '%s', app_requires = '%s', app_edited = '%s' where app_id = '%s' and app_channel = %d", dbesc($darray['app_sig']), dbesc($darray['app_author']), dbesc($darray['app_name']), @@ -405,6 +435,7 @@ function app_update($arr) { dbesc($darray['app_price']), dbesc($darray['app_page']), dbesc($darray['app_requires']), + dbesc($edited), dbesc($darray['app_id']), intval($darray['app_channel']) ); diff --git a/sources/include/attach.php b/sources/include/attach.php index 71fad86a..f95feed2 100644 --- a/sources/include/attach.php +++ b/sources/include/attach.php @@ -181,7 +181,7 @@ function attach_list_files($channel_id, $observer, $hash = '', $filename = '', $ $ret = array('success' => false); - if(! perm_is_allowed($channel_id,$observer, 'read_storage')) { + if(! perm_is_allowed($channel_id,$observer, 'view_storage')) { $ret['message'] = t('Permission denied.'); return $ret; } @@ -203,7 +203,7 @@ function attach_list_files($channel_id, $observer, $hash = '', $filename = '', $ // Retrieve all columns except 'data' - $r = q("select id, aid, uid, hash, filename, filetype, filesize, revision, folder, os_storage, is_dir, is_photo, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d $sql_extra $orderby $limit", + $r = q("select id, aid, uid, hash, filename, filetype, filesize, revision, folder, os_storage, is_dir, is_photo, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d $sql_extra ORDER BY $orderby $limit", intval($channel_id) ); @@ -405,6 +405,8 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { require_once('include/photos.php'); + call_hooks('photo_upload_begin',$arr); + $ret = array('success' => false); $channel_id = $channel['channel_id']; $sql_options = ''; @@ -413,10 +415,21 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { $newalbum = (($arr) ? $arr['newalbum'] : ''); $hash = (($arr && $arr['hash']) ? $arr['hash'] : null); $upload_path = (($arr && $arr['directory']) ? $arr['directory'] : ''); + $visible = (($arr && $arr['visible']) ? $arr['visible'] : ''); - logger('arr: ' . print_r($arr,true)); + $observer = array(); - if(! perm_is_allowed($channel_id,get_observer_hash(), 'write_storage')) { + if($observer_hash) { + $x = q("select * from xchan where xchan_hash = '%s' limit 1", + dbesc($observer_hash) + ); + if($x) + $observer = $x[0]; + } + + logger('arr: ' . print_r($arr,true)); + + if(! perm_is_allowed($channel_id,$observer_hash, 'write_storage')) { $ret['message'] = t('Permission denied.'); return $ret; } @@ -434,16 +447,57 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { // revise or update must provide $arr['hash'] of the thing to revise/update - if($options !== 'update') { - if(! x($_FILES,'userfile')) { - $ret['message'] = t('No source file.'); - return $ret; + // By default remove $src when finished + + $remove_when_processed = true; + + if($options === 'import') { + $src = $arr['src']; + $filename = $arr['filename']; + $filesize = @filesize($src); + + $hash = $arr['resource_id']; + + if(array_key_exists('hash',$arr)) + $hash = $arr['hash']; + if(array_key_exists('type',$arr)) + $type = $arr['type']; + + if($arr['preserve_original']) + $remove_when_processed = false; + + // if importing a directory, just do it now and go home - we're done. + + if(array_key_exists('is_dir',$arr) && intval($arr['is_dir'])) { + $x = attach_mkdir($channel,$observer_hash,$arr); + if($x['message']) + logger('import_directory: ' . $x['message']); + return; } + } + elseif($options !== 'update') { + $f = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => ''); - $src = $_FILES['userfile']['tmp_name']; - $filename = basename($_FILES['userfile']['name']); - $filesize = intval($_FILES['userfile']['size']); + call_hooks('photo_upload_file',$f); + call_hooks('attach_upload_file',$f); + if (x($f,'src') && x($f,'filesize')) { + $src = $f['src']; + $filename = $f['filename']; + $filesize = $f['filesize']; + $type = $f['type']; + + } else { + + if(! x($_FILES,'userfile')) { + $ret['message'] = t('No source file.'); + return $ret; + } + + $src = $_FILES['userfile']['tmp_name']; + $filename = basename($_FILES['userfile']['name']); + $filesize = intval($_FILES['userfile']['size']); + } } $existing_size = 0; @@ -480,21 +534,38 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { - + $def_extension = ''; $is_photo = 0; $gis = @getimagesize($src); logger('getimagesize: ' . print_r($gis,true), LOGGER_DATA); if(($gis) && ($gis[2] === IMAGETYPE_GIF || $gis[2] === IMAGETYPE_JPEG || $gis[2] === IMAGETYPE_PNG)) { $is_photo = 1; + if($gis[2] === IMAGETYPE_GIF) + $def_extension = '.gif'; + if($gis[2] === IMAGETYPE_JPEG) + $def_extension = '.jpg'; + if($gis[2] === IMAGETYPE_PNG) + $def_extension = '.png'; + } $pathname = ''; if($is_photo) { - if($newalbum) + if($newalbum) { $pathname = filepath_macro($newalbum); - else + } + elseif(array_key_exists('folder',$arr)) { + $x = q("select filename from attach where hash = '%s' and uid = %d limit 1", + dbesc($arr['folder']), + intval($channel['channel_id']) + ); + if($x) + $pathname = $x[0]['filename']; + } + else { $pathname = filepath_macro($album); + } } else { $pathname = filepath_macro($upload_path); @@ -524,10 +595,10 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { } } else { - $folder_hash = ''; + $folder_hash = ((($arr) && array_key_exists('folder',$arr)) ? $arr['folder'] : ''); } - if(! $options) { + if((! $options) || ($options === 'import')) { // A freshly uploaded file. Check for duplicate and resolve with the channel's overwrite settings. @@ -544,9 +615,18 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { $hash = $x[0]['hash']; } else { + if(strpos($filename,'.') !== false) { + $basename = substr($filename,0,strrpos($filename,'.')); + $ext = substr($filename,strrpos($filename,'.')); + } + else { + $basename = $filename; + $ext = $def_extension; + } + $r = q("select filename from attach where ( filename = '%s' OR filename like '%s' ) and folder = '%s' ", - dbesc($filename), - dbesc($filename . '(%)'), + dbesc($basename . $ext), + dbesc($basename . '(%)' . $ext), dbesc($folder_hash) ); @@ -556,7 +636,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { do { $found = false; foreach($r as $rr) { - if($rr['filename'] === $filename . '(' . $x . ')') { + if($rr['filename'] === $basename . '(' . $x . ')' . $ext) { $found = true; break; } @@ -565,8 +645,10 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { $x++; } while($found); - $filename = $filename . '(' . $x . ')'; + $filename = $basename . '(' . $x . ')' . $ext; } + else + $filename = $basename . $ext; } } } @@ -580,7 +662,9 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { if(($maxfilesize) && ($filesize > $maxfilesize)) { $ret['message'] = sprintf( t('File exceeds size limit of %d'), $maxfilesize); - @unlink($src); + if($remove_when_processed) + @unlink($src); + call_hooks('photo_upload_end',$ret); return $ret; } @@ -592,11 +676,14 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { ); if(($r) && (($r[0]['total'] + $filesize) > ($limit - $existing_size))) { $ret['message'] = upgrade_message(true) . sprintf(t("You have reached your limit of %1$.0f Mbytes attachment storage."), $limit / 1024000); - @unlink($src); + if($remove_when_processed) + @unlink($src); + + call_hooks('photo_upload_end',$ret); return $ret; } } - $mimetype = z_mime_content_type($filename); + $mimetype = ((isset($type) && $type) ? $type : z_mime_content_type($filename)); } $os_basepath = 'store/' . $channel['channel_address'] . '/' ; @@ -614,7 +701,15 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { if($src) @file_put_contents($os_basepath . $os_relpath,@file_get_contents($src)); - $created = datetime_convert(); + if(array_key_exists('created', $arr)) + $created = $arr['created']; + else + $created = datetime_convert(); + + if(array_key_exists('edited', $arr)) + $edited = $arr['edited']; + else + $edited = $created; if($options === 'replace') { $r = q("update attach set filename = '%s', filetype = '%s', folder = '%s', filesize = %d, os_storage = %d, is_photo = %d, data = '%s', edited = '%s' where id = %d and uid = %d", @@ -671,6 +766,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { ); } else { + $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, folder, filesize, revision, os_storage, is_photo, data, created, edited, allow_cid, allow_gid,deny_cid, deny_gid ) VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ", intval($channel['channel_account_id']), @@ -695,7 +791,8 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { } if($is_photo) { - $args = array( 'source' => $source, 'visible' => 0, 'resource_id' => $hash, 'album' => basename($pathname), 'os_path' => $os_basepath . $os_relpath, 'filename' => $filename, 'getimagesize' => $gis, 'directory' => $direct); + + $args = array( 'source' => $source, 'visible' => $visible, 'resource_id' => $hash, 'album' => basename($pathname), 'os_path' => $os_basepath . $os_relpath, 'filename' => $filename, 'getimagesize' => $gis, 'directory' => $direct); if($arr['contact_allow']) $args['contact_allow'] = $arr['contact_allow']; if($arr['group_allow']) @@ -704,17 +801,32 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { $args['contact_deny'] = $arr['contact_deny']; if($arr['group_deny']) $args['group_deny'] = $arr['group_deny']; - $p = photo_upload($channel,get_app()->get_observer(),$args); + if(array_key_exists('allow_cid',$arr)) + $args['allow_cid'] = $arr['allow_cid']; + if(array_key_exists('allow_gid',$arr)) + $args['allow_gid'] = $arr['allow_gid']; + if(array_key_exists('deny_cid',$arr)) + $args['deny_cid'] = $arr['deny_cid']; + if(array_key_exists('deny_gid',$arr)) + $args['deny_gid'] = $arr['deny_gid']; + + $args['created'] = $created; + $args['edited'] = $edited; + if($arr['item']) + $args['item'] = $arr['item']; + + $p = photo_upload($channel,$observer,$args); if($p['success']) { $ret['body'] = $p['body']; } } - if($options !== 'update') + if(($options !== 'update') && ($remove_when_processed)) @unlink($src); if(! $r) { $ret['message'] = t('File upload failed. Possible system limit or action terminated.'); + call_hooks('photo_upload_end',$ret); return $ret; } @@ -727,13 +839,17 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { if(! $r) { $ret['message'] = t('Stored file could not be verified. Upload failed.'); + call_hooks('photo_upload_end',$ret); return $ret; } $ret['success'] = true; $ret['data'] = $r[0]; - + if(! $is_photo) { + // This would've been called already with a success result in photos_upload() if it was a photo. + call_hooks('photo_upload_end',$ret); + } return $ret; } @@ -878,7 +994,6 @@ function attach_mkdir($channel, $observer_hash, $arr = null) { intval($channel['channel_id']), dbesc($lfile) ); - if(! $r) { logger('attach_mkdir: hash ' . $lfile . ' not found in ' . $lpath); $ret['message'] = t('Path not found.'); @@ -1051,7 +1166,7 @@ function attach_mkdirp($channel, $observer_hash, $arr = null) { */ function attach_change_permissions($channel_id, $resource, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $recurse = false) { - $r = q("select hash, flags, is_dir from attach where hash = '%s' and uid = %d limit 1", + $r = q("select hash, flags, is_dir, is_photo from attach where hash = '%s' and uid = %d limit 1", dbesc($resource), intval($channel_id) ); @@ -1081,6 +1196,16 @@ function attach_change_permissions($channel_id, $resource, $allow_cid, $allow_gi dbesc($resource), intval($channel_id) ); + if($r[0]['is_photo']) { + $x = q("update photo set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where resource_id = '%s' and uid = %d", + dbesc($allow_cid), + dbesc($allow_gid), + dbesc($deny_cid), + dbesc($deny_gid), + dbesc($resource), + intval($channel_id) + ); + } } /** @@ -1104,7 +1229,7 @@ function attach_delete($channel_id, $resource, $is_photo = 0) { $channel_address = (($c) ? $c[0]['channel_address'] : 'notfound'); $photo_sql = (($is_photo) ? " and is_photo = 1 " : ''); - $r = q("SELECT hash, flags, is_dir, folder FROM attach WHERE hash = '%s' AND uid = %d $photo_sql limit 1", + $r = q("SELECT hash, flags, is_dir, is_photo, folder FROM attach WHERE hash = '%s' AND uid = %d $photo_sql limit 1", dbesc($resource), intval($channel_id) ); @@ -1150,6 +1275,21 @@ function attach_delete($channel_id, $resource, $is_photo = 0) { intval($channel_id) ); + if($r[0]['is_photo']) { + $x = q("select id, item_hidden from item where resource_id = '%s' and resource_type = 'photo' and uid = %d", + dbesc($resource), + intval($channel_id) + ); + if($x) { + drop_item($x[0]['id'],false,(($x[0]['item_hidden']) ? DROPITEM_NORMAL : DROPITEM_PHASE1),true); + + q("DELETE FROM photo WHERE uid = %d AND resource_id = '%s'", + intval($channel_id), + dbesc($resource) + ); + } + } + // update the parent folder's lastmodified timestamp $e = q("UPDATE attach SET edited = '%s' WHERE hash = '%s' AND uid = %d", dbesc(datetime_convert()), diff --git a/sources/include/bb2diaspora.php b/sources/include/bb2diaspora.php index 69212808..95de43ec 100644 --- a/sources/include/bb2diaspora.php +++ b/sources/include/bb2diaspora.php @@ -305,6 +305,21 @@ function bb2diaspora_itembody($item, $force_update = false) { $matches = array(); + //if we have a photo item just prepend the photo bbcode to item['body'] + $is_photo = (($item['obj_type'] == ACTIVITY_OBJ_PHOTO) ? true : false); + if($is_photo) { + $object = json_decode($item['object'],true); + $photo = array( + 'url' => rawurldecode($object['id']), + 'link' => rawurldecode(get_rel_link($object['link'],'alternate')), + 'width' => $object['width'], + 'height' => $object['height'] + ); + + $photo_bb = '[zrl=' . $photo['link'] . ']' . '[zmg=' . $photo['width'] . 'x' . $photo['height'] . ']' . $photo['url'] . '[/zmg]' . '[/zrl]'; + $item['body'] = (($item['body']) ? $photo_bb . $item['body'] : $photo_bb); + } + if(($item['diaspora_meta']) && (! $force_update)) { $diaspora_meta = json_decode($item['diaspora_meta'],true); if($diaspora_meta) { diff --git a/sources/include/bbcode.php b/sources/include/bbcode.php index 66bf6b5e..1092c08a 100644 --- a/sources/include/bbcode.php +++ b/sources/include/bbcode.php @@ -437,7 +437,7 @@ function bb_observer($Text) { // BBcode 2 HTML was written by WAY2WEB.net - // extended to work with Mistpark/Friendica/Red - Mike Macgirvin + // extended to work with Mistpark/Friendica/Redmatrix/Hubzilla - Mike Macgirvin function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false) { @@ -570,7 +570,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false) $urlchars = '[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,\@]'; if (strpos($Text,'http') !== false) { - $Text = preg_replace("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/$urlchars+)/ism", '$1$2', $Text); + $Text = preg_replace("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/$urlchars+)/ism", '$1$2', $Text); } if (strpos($Text,'[/share]') !== false) { @@ -582,21 +582,21 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false) } } if (strpos($Text,'[/url]') !== false) { - $Text = preg_replace("/\#\^\[url\]([$URLSearchString]*)\[\/url\]/ism", '#^$1', $Text); - $Text = preg_replace("/\#\^\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '#^$2', $Text); - $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '$1', $Text); - $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$2', $Text); + $Text = preg_replace("/\#\^\[url\]([$URLSearchString]*)\[\/url\]/ism", '#^$1', $Text); + $Text = preg_replace("/\#\^\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '#^$2', $Text); + $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '$1', $Text); + $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$2', $Text); } if (strpos($Text,'[/zrl]') !== false) { - $Text = preg_replace("/\#\^\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '#^$1', $Text); - $Text = preg_replace("/\#\^\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '#^$2', $Text); - $Text = preg_replace("/\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '$1', $Text); - $Text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '$2', $Text); + $Text = preg_replace("/\#\^\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '#^$1', $Text); + $Text = preg_replace("/\#\^\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '#^$2', $Text); + $Text = preg_replace("/\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '$1', $Text); + $Text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '$2', $Text); } // Perform MAIL Search if (strpos($Text,'[/mail]') !== false) { - $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '$1', $Text); - $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '$2', $Text); + $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '$1', $Text); + $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '$2', $Text); } // leave open the posibility of [map=something] @@ -885,17 +885,17 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false) // if video couldn't be embedded, link to it instead. if (strpos($Text,'[/video]') !== false) { - $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '$1', $Text); + $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '$1', $Text); } if (strpos($Text,'[/audio]') !== false) { - $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '$1', $Text); + $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '$1', $Text); } if (strpos($Text,'[/zvideo]') !== false) { - $Text = preg_replace("/\[zvideo\](.*?)\[\/zvideo\]/", '$1', $Text); + $Text = preg_replace("/\[zvideo\](.*?)\[\/zvideo\]/", '$1', $Text); } if (strpos($Text,'[/zaudio]') !== false) { - $Text = preg_replace("/\[zaudio\](.*?)\[\/zaudio\]/", '$1', $Text); + $Text = preg_replace("/\[zaudio\](.*?)\[\/zaudio\]/", '$1', $Text); } if ($tryoembed){ @@ -904,7 +904,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false) } } else { if (strpos($Text,'[/iframe]') !== false) { - $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '$1', $Text); + $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '$1', $Text); } } diff --git a/sources/include/chat.php b/sources/include/chat.php index 05bb02bb..81c5c5d6 100644 --- a/sources/include/chat.php +++ b/sources/include/chat.php @@ -91,6 +91,8 @@ function chatroom_destroy($channel,$arr) { return $ret; } + build_sync_packet($channel['channel_id'],array('chatroom' => $r)); + q("delete from chatroom where cr_id = %d", intval($r[0]['cr_id']) ); diff --git a/sources/include/checksites.php b/sources/include/checksites.php new file mode 100644 index 00000000..e9c08c20 --- /dev/null +++ b/sources/include/checksites.php @@ -0,0 +1,62 @@ + 1) && ($argv[1])) + $site_id = $argv[1]; + + if($site_id) + $sql_options = " and site_url = '" . dbesc($argv[1]) . "' "; + + $days = intval(get_config('system','sitecheckdays')); + if($days < 1) + $days = 30; + + $r = q("select * from site where site_dead = 0 and site_update < %s - INTERVAL %s and site_type = %d $sql_options ", + db_utcnow(), db_quoteinterval($days . ' DAY'), + intval(SITE_TYPE_ZOT) + ); + + if(! $r) + return; + + foreach($r as $rr) { + if(! strcasecmp($rr['site_url'],z_root())) + continue; + + $x = ping_site($rr['site_url']); + if($x['success']) { + logger('checksites: ' . $rr['site_url']); + q("update site set site_update = '%s' where site_url = '%s' ", + dbesc(datetime_convert()), + dbesc($rr['site_url']) + ); + } + else { + logger('marking dead site: ' . $x['message']); + q("update site set site_dead = 1 where site_url = '%s' ", + dbesc($rr['site_url']) + ); + } + } + + return; +} + +if (array_search(__file__,get_included_files())===0){ + checksites_run($argv,$argc); + killme(); +} diff --git a/sources/include/conversation.php b/sources/include/conversation.php index e5842925..ebbc6684 100644 --- a/sources/include/conversation.php +++ b/sources/include/conversation.php @@ -395,7 +395,9 @@ function count_descendants($item) { * @brief Check if the activity of the item is visible. * * likes (etc.) can apply to other things besides posts. Check if they are post - * children, in which case we handle them specially. + * children, in which case we handle them specially. Activities which are unrecognised + * as having special meaning and hidden will be treated as posts or comments and visible + * in the stream. * * @param array $item * @return boolean @@ -403,12 +405,21 @@ function count_descendants($item) { function visible_activity($item) { $hidden_activities = array(ACTIVITY_LIKE, ACTIVITY_DISLIKE, ACTIVITY_AGREE, ACTIVITY_DISAGREE, ACTIVITY_ABSTAIN, ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE); + $post_types = array(ACTIVITY_OBJ_NOTE,ACTIVITY_OBJ_COMMENT,basename(ACTIVITY_OBJ_NOTE),basename(ACTIVITY_OBJ_COMMENT)); + foreach ($hidden_activities as $act) { if ((activity_match($item['verb'], $act)) && ($item['mid'] != $item['parent_mid'])) { return false; } } + // In order to share edits with networks which have no concept of editing, we'll create + // separate activities to indicate the edit. Our network will not require them, since our + // edits are automatically applied and the activity indicated. + + if(($item['verb'] === ACTIVITY_UPDATE) && (in_array($item['obj_type'],$post_types))) + return false; + return true; } @@ -618,11 +629,6 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $ if($item['author-link'] && (! $item['author-name'])) $profile_name = $item['author-link']; - - $tags=array(); - $hashtags = array(); - $mentions = array(); - $sp = false; $profile_link = best_link_url($item,$sp); if($sp) @@ -667,14 +673,17 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $ $unverified = ''; - $tags=array(); - $terms = get_terms_oftype($item['term'],array(TERM_HASHTAG,TERM_MENTION,TERM_UNKNOWN)); - if(count($terms)) - foreach($terms as $tag) - $tags[] = format_term_for_display($tag); +// $tags=array(); +// $terms = get_terms_oftype($item['term'],array(TERM_HASHTAG,TERM_MENTION,TERM_UNKNOWN)); +// if(count($terms)) +// foreach($terms as $tag) +// $tags[] = format_term_for_display($tag); $body = prepare_body($item,true); + $is_photo = ((($item['resource_type'] == 'photo') && (feature_enabled($profile_owner,'large_photos'))) ? true : false); + $has_tags = (($body['tags'] || $body['categories'] || $body['mentions'] || $body['attachments'] || $body['folders']) ? true : false); + $tmp_item = array( 'template' => $tpl, 'toplevel' => 'toplevel_item', @@ -688,10 +697,12 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $ 'lock' => $lock, 'thumb' => $profile_avatar, 'title' => $item['title'], - 'body' => $body, - 'tags' => $tags, - 'hashtags' => $hashtags, - 'mentions' => $mentions, + 'body' => $body['html'], + 'tags' => $body['tags'], + 'categories' => $body['categories'], + 'mentions' => $body['mentions'], + 'attachments' => $body['attachments'], + 'folders' => $body['folders'], 'verified' => $verified, 'unverified' => $unverified, 'forged' => $forged, @@ -701,7 +712,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $ 'has_folders' => ((count($folders)) ? 'true' : ''), 'categories' => $categories, 'folders' => $folders, - 'text' => strip_tags($body), + 'text' => strip_tags($body['html']), 'ago' => relative_date($item['created']), 'app' => $item['app'], 'str_app' => sprintf( t('from %s'), $item['app']), @@ -727,6 +738,8 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $ 'previewing' => $previewing, 'wait' => t('Please wait'), 'thread_level' => 1, + 'is_photo' => $is_photo, + 'has_tags' => $has_tags, ); $arr = array('item' => $item, 'output' => $tmp_item); @@ -932,9 +945,9 @@ function item_photo_menu($item){ t("View Status") => $status_link, t("View Profile") => $profile_link, t("View Photos") => $photos_link, - t("Matrix Activity") => $posts_link, + t("Activity/Posts") => $posts_link, t("Connect") => $follow_url, - t("Edit Contact") => $contact_url, + t("Edit Connection") => $contact_url, t("Send PM") => $pm_url, t("Poke") => $poke_link ); @@ -1126,6 +1139,7 @@ function status_editor($a, $x, $popup = false) { '$newpost' => 'true', '$baseurl' => $a->get_baseurl(true), '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), + '$pretext' => ((x($x,'pretext')) ? $x['pretext'] : ''), '$geotag' => $geotag, '$nickname' => $x['nickname'], '$ispublic' => t('Visible to everybody'), @@ -1402,7 +1416,7 @@ function prepare_page($item) { '$auth_url' => (($naked) ? '' : zid($item['author']['xchan_url'])), '$date' => (($naked) ? '' : datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'Y-m-d H:i')), '$title' => smilies(bbcode($item['title'])), - '$body' => $body, + '$body' => $body['html'], '$preview' => $preview, '$link' => $link, )); diff --git a/sources/include/deliver.php b/sources/include/deliver.php index 5ab44a62..11c1b249 100644 --- a/sources/include/deliver.php +++ b/sources/include/deliver.php @@ -15,7 +15,10 @@ function deliver_run($argv, $argc) { logger('deliver: invoked: ' . print_r($argv,true), LOGGER_DATA); + for($x = 1; $x < $argc; $x ++) { + + $dresult = null; $r = q("select * from outq where outq_hash = '%s' limit 1", dbesc($argv[$x]) ); @@ -26,6 +29,8 @@ function deliver_run($argv, $argc) { * If not, reduce the outq_priority. */ + $base = ''; + $h = parse_url($r[0]['outq_posturl']); if($h) { $base = $h['scheme'] . '://' . $h['host'] . (($h['port']) ? ':' . $h['port'] : ''); @@ -50,18 +55,45 @@ function deliver_run($argv, $argc) { continue; } } + else { + + // zot sites should all have a site record, unless they've been dead for as long as + // your site has existed. Since we don't know for sure what these sites are, + // call them unknown + + q("insert into site (site_url, site_update, site_dead, site_type) values ('%s','%s',0,%d) ", + dbesc($base), + dbesc(datetime_convert()), + intval(($r[0]['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN) + ); + } } } // "post" queue driver - used for diaspora and friendica-over-diaspora communications. if($r[0]['outq_driver'] === 'post') { + + $result = z_post_url($r[0]['outq_posturl'],$r[0]['outq_msg']); if($result['success'] && $result['return_code'] < 300) { logger('deliver: queue post success to ' . $r[0]['outq_posturl'], LOGGER_DEBUG); + if($base) { + q("update site set site_update = '%s', site_dead = 0 where site_url = '%s' ", + dbesc(datetime_convert()), + dbesc($base) + ); + } + q("update dreport set dreport_result = '%s', dreport_time = '%s' where dreport_queue = '%s' limit 1", + dbesc('accepted for delivery'), + dbesc(datetime_convert()), + dbesc($argv[$x]) + ); + $y = q("delete from outq where outq_hash = '%s'", dbesc($argv[$x]) ); + } else { logger('deliver: queue post returned ' . $result['return_code'] . ' from ' . $r[0]['outq_posturl'],LOGGER_DEBUG); @@ -92,17 +124,37 @@ function deliver_run($argv, $argc) { $m = json_decode($r[0]['outq_msg'],true); if(array_key_exists('message_list',$m)) { foreach($m['message_list'] as $mm) { - $msg = array('body' => json_encode(array('pickup' => array(array('notify' => $notify,'message' => $mm))))); + $msg = array('body' => json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify,'message' => $mm))))); zot_import($msg,z_root()); } } else { - $msg = array('body' => json_encode(array('pickup' => array(array('notify' => $notify,'message' => $m))))); - zot_import($msg,z_root()); + $msg = array('body' => json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify,'message' => $m))))); + $dresult = zot_import($msg,z_root()); } $r = q("delete from outq where outq_hash = '%s'", dbesc($argv[$x]) ); + if($dresult && is_array($dresult)) { + foreach($dresult as $xx) { + if(is_array($xx) && array_key_exists('message_id',$xx)) { + if(delivery_report_is_storable($xx)) { + q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ", + dbesc($xx['message_id']), + dbesc($xx['location']), + dbesc($xx['recipient']), + dbesc($xx['status']), + dbesc(datetime_convert($xx['date'])), + dbesc($xx['sender']) + ); + } + } + } + } + + q("delete from dreport where dreport_queue = '%s' limit 1", + dbesc($argv[$x]) + ); } } else { diff --git a/sources/include/deliver_hooks.php b/sources/include/deliver_hooks.php new file mode 100644 index 00000000..f0d6ba1b --- /dev/null +++ b/sources/include/deliver_hooks.php @@ -0,0 +1,29 @@ + 0 and site_url != '%s' and ( site_realm = '%s' or site_realm = '') ", + $r = q("select * from site where (site_flags & %d) > 0 and site_url != '%s' and site_type = %d and ( site_realm = '%s' or site_realm = '') ", intval(DIRECTORY_MODE_PRIMARY|DIRECTORY_MODE_SECONDARY), dbesc(z_root()), + intval(SITE_TYPE_ZOT), dbesc($realm) ); } else { - $r = q("select * from site where (site_flags & %d) > 0 and site_url != '%s' and site_realm like '%s' ", + $r = q("select * from site where (site_flags & %d) > 0 and site_url != '%s' and site_realm like '%s' and site_type = %d ", intval(DIRECTORY_MODE_PRIMARY|DIRECTORY_MODE_SECONDARY), dbesc(z_root()), - dbesc(protect_sprintf('%' . $realm . '%')) + dbesc(protect_sprintf('%' . $realm . '%')), + intval(SITE_TYPE_ZOT) ); } @@ -176,9 +178,10 @@ function sync_directories($dirmode) { 'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch', 'site_realm' => DIRECTORY_REALM, 'site_valid' => 1 + ); $x = q("insert into site ( site_url, site_flags, site_update, site_directory, site_realm, site_valid ) - values ( '%s', %d', '%s', '%s', '%s' ) ", + values ( '%s', %d, '%s', '%s', '%s', %d ) ", dbesc($r[0]['site_url']), intval($r[0]['site_flags']), dbesc($r[0]['site_update']), @@ -187,9 +190,10 @@ function sync_directories($dirmode) { intval($r[0]['site_valid']) ); - $r = q("select * from site where (site_flags & %d) > 0 and site_url != '%s'", + $r = q("select * from site where (site_flags & %d) > 0 and site_url != '%s' and site_type = %d ", intval(DIRECTORY_MODE_PRIMARY|DIRECTORY_MODE_SECONDARY), - dbesc(z_root()) + dbesc(z_root()), + intval(SITE_TYPE_ZOT) ); } if (! $r) diff --git a/sources/include/enotify.php b/sources/include/enotify.php index d0228bf5..bbddcdd1 100644 --- a/sources/include/enotify.php +++ b/sources/include/enotify.php @@ -97,7 +97,7 @@ function notification($params) { if ($params['type'] == NOTIFY_MAIL) { logger('notification: mail'); - $subject = sprintf( t('[Red:Notify] New mail received at %s'),$sitename); + $subject = sprintf( t('[Hubzilla:Notify] New mail received at %s'),$sitename); $preamble = sprintf( t('%1$s, %2$s sent you a new private message at %3$s.'),$recip['channel_name'], $sender['xchan_name'],$sitename); $epreamble = sprintf( t('%1$s sent you %2$s.'),'[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]', '[zrl=$itemlink]' . t('a private message') . '[/zrl]'); @@ -183,7 +183,7 @@ function notification($params) { // Before this we have the name of the replier on the subject rendering // differents subjects for messages on the same thread. - $subject = sprintf( t('[Red:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']); + $subject = sprintf( t('[Hubzilla:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']); $preamble = sprintf( t('%1$s, %2$s commented on an item/conversation you have been following.'), $recip['channel_name'], $sender['xchan_name']); $epreamble = $dest_str; @@ -193,7 +193,7 @@ function notification($params) { } if($params['type'] == NOTIFY_WALL) { - $subject = sprintf( t('[Red:Notify] %s posted to your profile wall') , $sender['xchan_name']); + $subject = sprintf( t('[Hubzilla:Notify] %s posted to your profile wall') , $sender['xchan_name']); $preamble = sprintf( t('%1$s, %2$s posted to your profile wall at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename); @@ -221,7 +221,7 @@ function notification($params) { return; } - $subject = sprintf( t('[Red:Notify] %s tagged you') , $sender['xchan_name']); + $subject = sprintf( t('[Hubzilla:Notify] %s tagged you') , $sender['xchan_name']); $preamble = sprintf( t('%1$s, %2$s tagged you at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename); $epreamble = sprintf( t('%1$s, %2$s [zrl=%3$s]tagged you[/zrl].') , $recip['channel_name'], @@ -235,7 +235,7 @@ function notification($params) { } if ($params['type'] == NOTIFY_POKE) { - $subject = sprintf( t('[Red:Notify] %1$s poked you') , $sender['xchan_name']); + $subject = sprintf( t('[Hubzilla:Notify] %1$s poked you') , $sender['xchan_name']); $preamble = sprintf( t('%1$s, %2$s poked you at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename); $epreamble = sprintf( t('%1$s, %2$s [zrl=%2$s]poked you[/zrl].') , $recip['channel_name'], @@ -253,7 +253,7 @@ function notification($params) { } if ($params['type'] == NOTIFY_TAGSHARE) { - $subject = sprintf( t('[Red:Notify] %s tagged your post') , $sender['xchan_name']); + $subject = sprintf( t('[Hubzilla:Notify] %s tagged your post') , $sender['xchan_name']); $preamble = sprintf( t('%1$s, %2$s tagged your post at %3$s') , $recip['channel_name'],$sender['xchan_name'], $sitename); $epreamble = sprintf( t('%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]') , $recip['channel_name'], @@ -267,7 +267,7 @@ function notification($params) { } if ($params['type'] == NOTIFY_INTRO) { - $subject = sprintf( t('[Red:Notify] Introduction received')); + $subject = sprintf( t('[Hubzilla:Notify] Introduction received')); $preamble = sprintf( t('%1$s, you\'ve received an new connection request from \'%2$s\' at %3$s'), $recip['channel_name'], $sender['xchan_name'], $sitename); $epreamble = sprintf( t('%1$s, you\'ve received [zrl=%2$s]a new connection request[/zrl] from %3$s.'), $recip['channel_name'], @@ -282,7 +282,7 @@ function notification($params) { } if ($params['type'] == NOTIFY_SUGGEST) { - $subject = sprintf( t('[Red:Notify] Friend suggestion received')); + $subject = sprintf( t('[Hubzilla:Notify] Friend suggestion received')); $preamble = sprintf( t('%1$s, you\'ve received a friend suggestion from \'%2$s\' at %3$s'), $recip['channel_name'], $sender['xchan_name'], $sitename); $epreamble = sprintf( t('%1$s, you\'ve received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from %4$s.'), $recip['channel_name'], @@ -315,9 +315,12 @@ function notification($params) { 'epreamble' => $epreamble, 'body' => $body, 'sitelink' => $sitelink, + 'sitename' => $sitename, 'tsitelink' => $tsitelink, 'hsitelink' => $hsitelink, - 'itemlink' => $itemlink + 'itemlink' => $itemlink, + 'sender' => $sender, + 'recipient' => $recip ); call_hooks('enotify', $h); @@ -505,7 +508,7 @@ function notification($params) { $private_activity = true; case NOTIFY_MAIL: $datarray['textversion'] = $datarray['htmlversion'] = $datarray['title'] = ''; - $datarray['subject'] = preg_replace('/' . preg_quote(t('[Red:Notify]')) . '/','$0*',$datarray['subject']); + $datarray['subject'] = preg_replace('/' . preg_quote(t('[Hubzilla:Notify]')) . '/','$0*',$datarray['subject']); break; default: break; diff --git a/sources/include/event.php b/sources/include/event.php index c468420c..e303ad23 100644 --- a/sources/include/event.php +++ b/sources/include/event.php @@ -446,6 +446,20 @@ function event_addtocal($item_id, $uid) { intval($channel['channel_id']) ); + $item['resource_id'] = $event['event_hash']; + $item['resource_type'] = 'event'; + + $i = array($item); + xchan_query($i); + $sync_item = fetch_post_tags($i); + $z = q("select * from event where event_hash = '%s' and uid = %d limit 1", + dbesc($event['event_hash']), + intval($channel['channel_id']) + ); + if($z) { + build_sync_packet($channel['channel_id'],array('event_item' => array(encode_item($sync_item[0],true)),'event' => $z)); + } + return true; } } @@ -512,13 +526,17 @@ function event_import_ical($ical, $uid) { // logger('dtstart: ' . var_export($dtstart,true)); - if(($dtstart->timezone_type == 2) || (($dtstart->timezone_type == 3) && ($dtstart->timezone === 'UTC'))) { - $ev['adjust'] = 1; + + switch($dtstart->timezone_type) { + case VObject\Property\DateTime::UTC : + $ev['adjust'] = 0; + break; + case VObject\Property\DateTime::LOCALTZ : + default: + $ev['adjust'] = 1; + break; } - else { - $ev['adjust'] = 0; - } - + $ev['start'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC', $dtstart->format(\DateTime::W3C)); @@ -737,12 +755,15 @@ function event_store_item($arr, $event) { } } + + $item_arr = array(); $prefix = ''; // $birthday = false; if($event['type'] === 'birthday') { - $prefix = t('This event has been added to your calendar.'); + if(! is_sys_channel($arr['uid'])) + $prefix = t('This event has been added to your calendar.'); // $birthday = true; // The event is created on your own site by the system, but appears to belong @@ -778,7 +799,12 @@ function event_store_item($arr, $event) { $private = (($arr['allow_cid'] || $arr['allow_gid'] || $arr['deny_cid'] || $arr['deny_gid']) ? 1 : 0); - q("UPDATE item SET title = '%s', body = '%s', object = '%s', allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', edited = '%s', item_flags = %d, item_private = %d, obj_type = '%s' WHERE id = %d AND uid = %d", + // @FIXME can only update sig if we have the author's channel on this site + // Until fixed, set it to nothing so it won't give us signature errors + + $sig = ''; + + q("UPDATE item SET title = '%s', body = '%s', object = '%s', allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', edited = '%s', sig = '%s', item_flags = %d, item_private = %d, obj_type = '%s' WHERE id = %d AND uid = %d", dbesc($arr['summary']), dbesc($prefix . format_event_bbcode($arr)), dbesc($object), @@ -787,6 +813,7 @@ function event_store_item($arr, $event) { dbesc($arr['deny_cid']), dbesc($arr['deny_gid']), dbesc($arr['edited']), + dbesc($sig), intval($r[0]['item_flags']), intval($private), dbesc(ACTIVITY_OBJ_EVENT), @@ -953,4 +980,4 @@ function tasks_fetch($arr) { return $ret; -} \ No newline at end of file +} diff --git a/sources/include/externals.php b/sources/include/externals.php index 3b6d170d..18c034bb 100644 --- a/sources/include/externals.php +++ b/sources/include/externals.php @@ -28,9 +28,10 @@ function externals_run($argv, $argc){ } else { $randfunc = db_getfunc('RAND'); - $r = q("select site_url, site_pull from site where site_url != '%s' and site_flags != %d order by $randfunc limit 1", + $r = q("select site_url, site_pull from site where site_url != '%s' and site_flags != %d and site_type = %d order by $randfunc limit 1", dbesc(z_root()), - intval(DIRECTORY_MODE_STANDALONE) + intval(DIRECTORY_MODE_STANDALONE), + intval(SITE_TYPE_ZOT) ); if($r) $url = $r[0]['site_url']; diff --git a/sources/include/features.php b/sources/include/features.php index a6c4757c..993a2e33 100644 --- a/sources/include/features.php +++ b/sources/include/features.php @@ -55,7 +55,7 @@ function get_features() { t('Post Composition Features'), // array('richtext', t('Richtext Editor'), t('Enable richtext editor'),false), array('markdown', t('Use Markdown'), t('Allow use of "Markdown" to format posts'),false), - array('large_photos', t('Large Photos'), t('Include large (640px) photo thumbnails in posts. If not enabled, use small (320px) photo thumbnails'),false), + array('large_photos', t('Large Photos'), t('Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails'),false), array('channel_sources', t('Channel Sources'), t('Automatically import channel content from other channels or feeds'),false), array('content_encrypt', t('Even More Encryption'), t('Allow optional encryption of content end-to-end with a shared secret key'),false), array('consensus_tools', t('Enable voting tools'), t('Provide a class of post which others can vote on'),false), diff --git a/sources/include/follow.php b/sources/include/follow.php index 96013874..40ad2c29 100644 --- a/sources/include/follow.php +++ b/sources/include/follow.php @@ -133,27 +133,27 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) $their_perms = 0; $xchan_hash = ''; + $r = q("select * from xchan where xchan_hash = '%s' or xchan_url = '%s' limit 1", dbesc($url), dbesc($url) ); + if(! $r) { // attempt network auto-discovery if(strpos($url,'@') && (! $is_http)) { - $r = discover_by_webbie($url); + $d = discover_by_webbie($url); } elseif($is_http) { - $r = discover_by_url($url); - $r['allowed'] = intval(get_config('system','feed_contacts')); - } - if($r) { - $r['channel_id'] = $uid; - call_hooks('follow_allow',$r); - if(! $r['allowed']) { + if(get_config('system','feed_contacts')) + $d = discover_by_url($url); + else { $result['message'] = t('Protocol disabled.'); return $result; } + } + if($d) { $r = q("select * from xchan where xchan_hash = '%s' or xchan_url = '%s' limit 1", dbesc($url), dbesc($url) @@ -172,6 +172,16 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) return $result; } + $x = array('channel_id' => $uid, 'follow_address' => $url, 'xchan' => $r[0], 'allowed' => 1); + + call_hooks('follow_allow',$x); + + if(! $x['allowed']) { + $result['message'] = t('Protocol disabled.'); + return $result; + } + + if((local_channel()) && $uid == local_channel()) { $aid = get_account_id(); $hash = get_observer_hash(); @@ -251,7 +261,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) ); if($r) { $result['abook'] = $r[0]; - proc_run('php', 'include/notifier.php', 'permission_update', $result['abook']['abook_id']); + proc_run('php', 'include/notifier.php', 'permission_create', $result['abook']['abook_id']); } $arr = array('channel_id' => $uid, 'abook' => $result['abook']); diff --git a/sources/include/gprobe.php b/sources/include/gprobe.php index 48c1c8e1..d8d893d9 100644 --- a/sources/include/gprobe.php +++ b/sources/include/gprobe.php @@ -14,6 +14,9 @@ function gprobe_run($argv, $argc){ $url = hex2bin($argv[1]); + if(! strpos($url,'@')) + return; + $r = q("select * from xchan where xchan_addr = '%s' limit 1", dbesc($url) ); diff --git a/sources/include/hubloc.php b/sources/include/hubloc.php index 515223f5..a1171b0e 100644 --- a/sources/include/hubloc.php +++ b/sources/include/hubloc.php @@ -16,7 +16,9 @@ function is_matrix_url($url) { function prune_hub_reinstalls() { - $r = q("select site_url from site where true"); + $r = q("select site_url from site where site_type = %d", + intval(SITE_TYPE_ZOT) + ); if($r) { foreach($r as $rr) { $x = q("select count(*) as t, hubloc_sitekey, max(hubloc_connected) as c from hubloc where hubloc_url = '%s' group by hubloc_sitekey order by c", @@ -230,7 +232,7 @@ function xchan_store($arr) { if(! $r) return $r; - $photos = import_profile_photo($arr['photo'],$arr['hash']); + $photos = import_xchan_photo($arr['photo'],$arr['hash']); $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'", dbesc(datetime_convert()), dbesc($photos[0]), @@ -275,4 +277,34 @@ function xchan_fetch($arr) { $ret[str_replace('xchan_','',$k)] = $v; } return $ret; -} \ No newline at end of file +} + + + +function ping_site($url) { + + $ret = array('success' => false); + + $sys = get_sys_channel(); + + $m = zot_build_packet($sys,'ping'); + $r = zot_zot($url . '/post',$m); + if(! $r['success']) { + $ret['message'] = 'no answer from ' . $url; + return $ret; + } + $packet_result = json_decode($r['body'],true); + if(! $packet_result['success']) { + $ret['message'] = 'packet failure from ' . $url; + return $ret; + } + + if($packet_result['success']) { + $ret['success'] = true; + } + else { + $ret['message'] = 'unknown error from ' . $url; + } + + return $ret; +} diff --git a/sources/include/identity.php b/sources/include/identity.php index 871d8570..0c4a9df4 100644 --- a/sources/include/identity.php +++ b/sources/include/identity.php @@ -5,7 +5,7 @@ require_once('include/zot.php'); require_once('include/crypto.php'); - +require_once('include/menu.php'); /** * @brief Called when creating a new channel. @@ -427,7 +427,7 @@ function create_identity($arr) { } } - call_hooks('register_account', $newuid); + call_hooks('create_identity', $newuid); proc_run('php','include/directory.php', $ret['channel']['channel_id']); } @@ -555,23 +555,106 @@ function identity_basic_export($channel_id, $items = false) { if($r) $ret['term'] = $r; - $r = q("select * from obj where obj_channel = %d", + + // add psuedo-column obj_baseurl to aid in relocations + + $r = q("select obj.*, '%s' as obj_baseurl from obj where obj_channel = %d", + dbesc(z_root()), intval($channel_id) ); if($r) $ret['obj'] = $r; + $r = q("select * from app where app_channel = %d", + intval($channel_id) + ); + if($r) + $ret['app'] = $r; + + $r = q("select * from chatroom where cr_uid = %d", + intval($channel_id) + ); + if($r) + $ret['chatroom'] = $r; + + + $r = q("select * from event where uid = %d", + intval($channel_id) + ); + if($r) + $ret['event'] = $r; + + $r = q("select * from item where resource_type = 'event' and uid = %d", + intval($channel_id) + ); + if($r) { + $ret['event_item'] = array(); + xchan_query($r); + $r = fetch_post_tags($r,true); + foreach($r as $rr) + $ret['event_item'][] = encode_item($rr,true); + } + + $x = menu_list($channel_id); + if($x) { + $ret['menu'] = array(); + for($y = 0; $y < count($x); $y ++) { + $m = menu_fetch($x[$y]['menu_name'],$channel_id,$ret['channel']['channel_hash']); + if($m) + $ret['menu'][] = menu_element($m); + } + } + + $x = menu_list($channel_id); + if($x) { + $ret['menu'] = array(); + for($y = 0; $y < count($x); $y ++) { + $m = menu_fetch($x[$y]['menu_name'],$channel_id,$ret['channel']['channel_hash']); + if($m) + $ret['menu'][] = menu_element($m); + } + } + + $addon = array('channel_id' => $channel_id,'data' => $ret); + call_hooks('identity_basic_export',$addon); + $ret = $addon['data']; + + if(! $items) return $ret; - $r = q("select likes.*, item.mid from likes left join item on likes.iid = item.id where likes.channel_id = %d", + $r = q("select * from likes where channel_id = %d", intval($channel_id) ); if($r) $ret['likes'] = $r; + + $r = q("select * from conv where uid = %d", + intval($channel_id) + ); + if($r) { + for($x = 0; $x < count($r); $x ++) { + $r[$x]['subject'] = base64url_decode(str_rot47($r[$x]['subject'])); + } + $ret['conv'] = $r; + } + + + $r = q("select * from mail where mail.uid = %d", + intval($channel_id) + ); + if($r) { + $m = array(); + foreach($r as $rr) { + xchan_mail_query($rr); + $m[] = mail_encode($rr,true); + } + $ret['mail'] = $m; + } + $r = q("select item_id.*, item.mid from item_id left join item on item_id.iid = item.id where item_id.uid = %d", intval($channel_id) ); @@ -583,14 +666,17 @@ function identity_basic_export($channel_id, $items = false) { /** @warning this may run into memory limits on smaller systems */ - /** export one year of posts. If you want to export and import all posts you have to start with + + /** export three months of posts. If you want to export and import all posts you have to start with * the first year and export/import them in ascending order. + * + * Don't export linked resource items. we'll have to pull those out separately. */ - $r = q("select * from item where item_wall = 1 and item_deleted = 0 and uid = %d and created > %s - INTERVAL %s", + $r = q("select * from item where item_wall = 1 and item_deleted = 0 and uid = %d and created > %s - INTERVAL %s and resource_type = '' order by created", intval($channel_id), db_utcnow(), - db_quoteinterval('1 YEAR') + db_quoteinterval('3 MONTH') ); if($r) { $ret['item'] = array(); @@ -624,7 +710,7 @@ function identity_export_year($channel_id,$year,$month = 0) { else $maxdate = datetime_convert('UTC','UTC',$year+1 . '-01-01 00:00:00'); - $r = q("select * from item where item_wall = 1 and item_deleted = 0 and uid = %d and created >= '%s' and created < '%s' order by created", + $r = q("select * from item where item_wall = 1 and item_deleted = 0 and uid = %d and created >= '%s' and created < '%s' and resource_type = '' order by created", intval($channel_id), dbesc($mindate), dbesc($maxdate) @@ -638,7 +724,6 @@ function identity_export_year($channel_id,$year,$month = 0) { $ret['item'][] = encode_item($rr,true); } - $r = q("select item_id.*, item.mid from item_id left join item on item_id.iid = item.id where item_id.uid = %d and item.created >= '%s' and item.created < '%s' order by created ", intval($channel_id), @@ -673,7 +758,7 @@ function identity_export_year($channel_id,$year,$month = 0) { */ function profile_load(&$a, $nickname, $profile = '') { - logger('profile_load: ' . $nickname . (($profile) ? ' profile: ' . $profile : '')); +// logger('profile_load: ' . $nickname . (($profile) ? ' profile: ' . $profile : '')); $user = q("select channel_id from channel where channel_address = '%s' and channel_removed = 0 limit 1", dbesc($nickname) @@ -936,7 +1021,8 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) { $marital = ((x($profile,'marital') == 1) ? t('Status:') : False); $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False); $profile['online'] = (($profile['online_status'] === 'online') ? t('Online Now') : False); - logger('online: ' . $profile['online']); + +// logger('online: ' . $profile['online']); if(! perm_is_allowed($profile['uid'],((is_array($observer)) ? $observer['xchan_hash'] : ''),'view_profile')) { $block = true; diff --git a/sources/include/import.php b/sources/include/import.php new file mode 100644 index 00000000..0fd1ab2a --- /dev/null +++ b/sources/include/import.php @@ -0,0 +1,871 @@ + $hubloc['hubloc_guid'], + 'guid_sig' => $hubloc['hubloc_guid_sig'], + 'url' => $hubloc['hubloc_url'], + 'url_sig' => $hubloc['hubloc_url_sig'] + ); + if(($hubloc['hubloc_hash'] === $channel['channel_hash']) && intval($hubloc['hubloc_primary']) && ($seize)) + $hubloc['hubloc_primary'] = 0; + + if(! zot_gethub($arr)) { + unset($hubloc['hubloc_id']); + dbesc_array($hubloc); + + $r = dbq("INSERT INTO hubloc (`" + . implode("`, `", array_keys($hubloc)) + . "`) VALUES ('" + . implode("', '", array_values($hubloc)) + . "')" + ); + } + } + } +} + + + +function import_objs($channel,$objs) { + + if($channel && $objs) { + foreach($objs as $obj) { + + // if it's the old term format - too hard to support + if(! $obj['obj_created']) + continue; + + $baseurl = $obj['obj_baseurl']; + unset($obj['obj_id']); + unset($obj['obj_baseurl']); + + $obj['obj_channel'] = $channel['channel_id']; + + if($baseurl && (strpos($obj['obj_url'],$baseurl . '/thing/') !== false)) { + $obj['obj_url'] = str_replace($baseurl,z_root(),$obj['obj_url']); + } + + if($obj['obj_imgurl']) { + $x = import_xchan_photo($obj['obj_imgurl'],$channel['channel_hash'],true); + $obj['obj_imgurl'] = $x[0]; + } + + dbesc_array($obj); + + $r = dbq("INSERT INTO obj (`" + . implode("`, `", array_keys($obj)) + . "`) VALUES ('" + . implode("', '", array_values($obj)) + . "')" + ); + } + } +} + +function sync_objs($channel,$objs) { + + if($channel && $objs) { + foreach($objs as $obj) { + + if(array_key_exists('obj_deleted',$obj) && $obj['obj_deleted'] && $obj['obj_obj']) { + q("delete from obj where obj_obj = '%s' and obj_channel = %d limit 1", + dbesc($obj['obj_obj']), + intval($channel['channel_id']) + ); + continue; + } + + // if it's the old term format - too hard to support + if(! $obj['obj_created']) + continue; + + $baseurl = $obj['obj_baseurl']; + unset($obj['obj_id']); + unset($obj['obj_baseurl']); + + $obj['obj_channel'] = $channel['channel_id']; + + if($baseurl && (strpos($obj['obj_url'],$baseurl . '/thing/') !== false)) { + $obj['obj_url'] = str_replace($baseurl,z_root(),$obj['obj_url']); + } + + $exists = false; + + $x = q("select * from obj where obj_obj = '%s' and obj_channel = %d limit 1", + dbesc($obj['obj_obj']), + intval($channel['channel_id']) + ); + if($x) { + if($x[0]['obj_edited'] >= $obj['obj_edited']) + continue; + + $exists = true; + } + + if($obj['obj_imgurl']) { + $x = import_xchan_photo($obj['obj_imgurl'],$channel['channel_hash'],true); + $obj['obj_imgurl'] = $x[0]; + } + + $hash = $obj['obj_obj']; + + if($exists) { + unset($obj['obj_obj']); + foreach($obj as $k => $v) { + $r = q("UPDATE obj SET `%s` = '%s' WHERE obj_obj = '%s' AND obj_channel = %d", + dbesc($k), + dbesc($v), + dbesc($hash), + intval($channel['channel_id']) + ); + } + } + else { + + dbesc_array($obj); + + $r = dbq("INSERT INTO obj (`" + . implode("`, `", array_keys($obj)) + . "`) VALUES ('" + . implode("', '", array_values($obj)) + . "')" + ); + } + } + } +} + + + + + +function import_apps($channel,$apps) { + + if($channel && $apps) { + foreach($apps as $app) { + + unset($app['id']); + unset($app['app_channel']); + + $app['app_channel'] = $channel['channel_id']; + + if($app['app_photo']) { + $x = import_xchan_photo($app['app_photo'],$channel['channel_hash'],true); + $app['app_photo'] = $x[0]; + } + + dbesc_array($app); + $r = dbq("INSERT INTO app (`" + . implode("`, `", array_keys($app)) + . "`) VALUES ('" + . implode("', '", array_values($app)) + . "')" + ); + } + } +} + + + +function sync_apps($channel,$apps) { + + if($channel && $apps) { + foreach($apps as $app) { + + if(array_key_exists('app_deleted',$app) && $app['app_deleted'] && $app['app_id']) { + q("delete from app where app_id = '%s' and app_channel = %d limit 1", + dbesc($app['app_id']), + intval($channel['channel_id']) + ); + continue; + } + + unset($app['id']); + unset($app['app_channel']); + + if(! $app['app_created'] || $app['app_created'] === NULL_DATE) + $app['app_created'] = datetime_convert(); + if(! $app['app_edited'] || $app['app_edited'] === NULL_DATE) + $app['app_edited'] = datetime_convert(); + + $app['app_channel'] = $channel['channel_id']; + + if($app['app_photo']) { + $x = import_xchan_photo($app['app_photo'],$channel['channel_hash'],true); + $app['app_photo'] = $x[0]; + } + + $exists = false; + + $x = q("select * from app where app_id = '%s' and app_channel = %d limit 1", + dbesc($app['app_id']), + intval($channel['channel_id']) + ); + if($x) { + if($x[0]['app_edited'] >= $app['app_edited']) + continue; + $exists = true; + } + $hash = $app['app_id']; + + if($exists) { + unset($app['app_id']); + foreach($app as $k => $v) { + $r = q("UPDATE app SET `%s` = '%s' WHERE app_id = '%s' AND app_channel = %d", + dbesc($k), + dbesc($v), + dbesc($hash), + intval($channel['channel_id']) + ); + } + } + else { + dbesc_array($app); + $r = dbq("INSERT INTO app (`" + . implode("`, `", array_keys($app)) + . "`) VALUES ('" + . implode("', '", array_values($app)) + . "')" + ); + } + } + } +} + + + +function import_chatrooms($channel,$chatrooms) { + + if($channel && $chatrooms) { + foreach($chatrooms as $chatroom) { + + if(! $chatroom['cr_name']) + continue; + + unset($chatroom['cr_id']); + unset($chatroom['cr_aid']); + unset($chatroom['cr_uid']); + + $chatroom['cr_aid'] = $channel['channel_account_id']; + $chatroom['cr_uid'] = $channel['channel_id']; + + dbesc_array($chatroom); + $r = dbq("INSERT INTO chatroom (`" + . implode("`, `", array_keys($chatroom)) + . "`) VALUES ('" + . implode("', '", array_values($chatroom)) + . "')" + ); + } + } +} + + + +function sync_chatrooms($channel,$chatrooms) { + + if($channel && $chatrooms) { + foreach($chatrooms as $chatroom) { + + if(! $chatroom['cr_name']) + continue; + + if(array_key_exists('cr_deleted',$chatroom) && $chatroom['cr_deleted']) { + q("delete from chatroom where cr_name = '%s' and cr_uid = %d limit 1", + dbesc($chatroom['cr_name']), + intval($channel['channel_id']) + ); + continue; + } + + + unset($chatroom['cr_id']); + unset($chatroom['cr_aid']); + unset($chatroom['cr_uid']); + + if(! $chatroom['cr_created'] || $chatroom['cr_created'] === NULL_DATE) + $chatroom['cr_created'] = datetime_convert(); + if(! $chatroom['cr_edited'] || $chatroom['cr_edited'] === NULL_DATE) + $chatroom['cr_edited'] = datetime_convert(); + + $chatroom['cr_aid'] = $channel['channel_account_id']; + $chatroom['cr_uid'] = $channel['channel_id']; + + $exists = false; + + $x = q("select * from chatroom where cr_name = '%s' and cr_uid = %d limit 1", + dbesc($chatroom['cr_name']), + intval($channel['channel_id']) + ); + if($x) { + if($x[0]['cr_edited'] >= $chatroom['cr_edited']) + continue; + $exists = true; + } + $name = $chatroom['cr_name']; + + if($exists) { + foreach($chatroom as $k => $v) { + $r = q("UPDATE chatroom SET `%s` = '%s' WHERE cr_name = '%s' AND cr_uid = %d", + dbesc($k), + dbesc($v), + dbesc($name), + intval($channel['channel_id']) + ); + } + } + else { + dbesc_array($chatroom); + $r = dbq("INSERT INTO chatroom (`" + . implode("`, `", array_keys($chatroom)) + . "`) VALUES ('" + . implode("', '", array_values($chatroom)) + . "')" + ); + } + } + } +} + + + +function import_items($channel,$items) { + + if($channel && $items) { + $allow_code = false; + $r = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id + where channel_id = %d limit 1", + intval($channel['channel_id']) + ); + if($r) { + if(($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($r[0]['channel_pageflags'] & PAGE_ALLOWCODE)) { + $allow_code = true; + } + } + + foreach($items as $i) { + $item = get_item_elements($i,$allow_code); + if(! $item) + continue; + + $r = q("select id, edited from item where mid = '%s' and uid = %d limit 1", + dbesc($item['mid']), + intval($channel['channel_id']) + ); + if($r) { + if($item['edited'] > $r[0]['edited']) { + $item['id'] = $r[0]['id']; + $item['uid'] = $channel['channel_id']; + item_store_update($item); + continue; + } + } + else { + $item['aid'] = $channel['channel_account_id']; + $item['uid'] = $channel['channel_id']; + $item_result = item_store($item); + } + + } + } +} + + +function sync_items($channel,$items) { + import_items($channel,$items); +} + + + +function import_item_ids($channel,$itemids) { + if($channel && $itemids) { + foreach($itemids as $i) { + $r = q("select id from item where mid = '%s' and uid = %d limit 1", + dbesc($i['mid']), + intval($channel['channel_id']) + ); + if(! $r) + continue; + $z = q("select * from item_id where service = '%s' and sid = '%s' and iid = %d and uid = %d limit 1", + dbesc($i['service']), + dbesc($i['sid']), + intval($r[0]['id']), + intval($channel['channel_id']) + ); + if(! $z) { + q("insert into item_id (iid,uid,sid,service) values(%d,%d,'%s','%s')", + intval($r[0]['id']), + intval($channel['channel_id']), + dbesc($i['sid']), + dbesc($i['service']) + ); + } + } + } +} + +function import_events($channel,$events) { + + if($channel && $events) { + foreach($events as $event) { + unset($event['id']); + $event['aid'] = $channel['channel_account_id']; + $event['uid'] = $channel['channel_id']; + + dbesc_array($event); + $r = dbq("INSERT INTO event (`" + . implode("`, `", array_keys($event)) + . "`) VALUES ('" + . implode("', '", array_values($event)) + . "')" + ); + } + } +} + + +function sync_events($channel,$events) { + + if($channel && $events) { + foreach($events as $event) { + + if((! $event['event_hash']) || (! $event['start'])) + continue; + + if($event['event_deleted']) { + $r = q("delete from event where event_hash = '%s' and uid = %d limit 1", + dbesc($event['event_hash']), + intval($channel['channel_id']) + ); + continue; + } + + unset($event['id']); + $event['aid'] = $channel['channel_account_id']; + $event['uid'] = $channel['channel_id']; + + $exists = false; + + $x = q("select * from event where event_hash = '%s' and uid = %d limit 1", + dbesc($event['event_hash']), + intval($channel['channel_id']) + ); + if($x) { + if($x[0]['edited'] >= $event['edited']) + continue; + $exists = true; + } + + if($exists) { + foreach($event as $k => $v) { + $r = q("UPDATE event SET `%s` = '%s' WHERE event_hash = '%s' AND uid = %d", + dbesc($k), + dbesc($v), + dbesc($event['event_hash']), + intval($channel['channel_id']) + ); + } + } + else { + dbesc_array($event); + $r = dbq("INSERT INTO event (`" + . implode("`, `", array_keys($event)) + . "`) VALUES ('" + . implode("', '", array_values($event)) + . "')" + ); + } + } + } +} + + +function import_menus($channel,$menus) { + + if($channel && $menus) { + foreach($menus as $menu) { + $m = array(); + $m['menu_channel_id'] = $channel['channel_id']; + $m['menu_name'] = $menu['pagetitle']; + $m['menu_desc'] = $menu['desc']; + if($menu['created']) + $m['menu_created'] = datetime_convert($menu['created']); + if($menu['edited']) + $m['menu_edited'] = datetime_convert($menu['edited']); + + $m['menu_flags'] = 0; + if($menu['flags']) { + if(in_array('bookmark',$menu['flags'])) + $m['menu_flags'] |= MENU_BOOKMARK; + if(in_array('system',$menu['flags'])) + $m['menu_flags'] |= MENU_SYSTEM; + + } + + $menu_id = menu_create($m); + + if($menu_id) { + if(is_array($menu['items'])) { + foreach($menu['items'] as $it) { + $mitem = array(); + + $mitem['mitem_link'] = str_replace('[baseurl]',z_root(),$it['link']); + $mitem['mitem_desc'] = escape_tags($it['desc']); + $mitem['mitem_order'] = intval($it['order']); + if(is_array($it['flags'])) { + $mitem['mitem_flags'] = 0; + if(in_array('zid',$it['flags'])) + $mitem['mitem_flags'] |= MENU_ITEM_ZID; + if(in_array('new-window',$it['flags'])) + $mitem['mitem_flags'] |= MENU_ITEM_NEWWIN; + if(in_array('chatroom',$it['flags'])) + $mitem['mitem_flags'] |= MENU_ITEM_CHATROOM; + } + menu_add_item($menu_id,$channel['channel_id'],$mitem); + } + } + } + } + } +} + + +function sync_menus($channel,$menus) { + + if($channel && $menus) { + foreach($menus as $menu) { + $m = array(); + $m['menu_channel_id'] = $channel['channel_id']; + $m['menu_name'] = $menu['pagetitle']; + $m['menu_desc'] = $menu['desc']; + if($menu['created']) + $m['menu_created'] = datetime_convert($menu['created']); + if($menu['edited']) + $m['menu_edited'] = datetime_convert($menu['edited']); + + $m['menu_flags'] = 0; + if($menu['flags']) { + if(in_array('bookmark',$menu['flags'])) + $m['menu_flags'] |= MENU_BOOKMARK; + if(in_array('system',$menu['flags'])) + $m['menu_flags'] |= MENU_SYSTEM; + + } + + $editing = false; + + $r = q("select * from menu where menu_name = '%s' and menu_channel_id = %d limit 1", + dbesc($m['menu_name']), + intval($channel['channel_id']) + ); + if($r) { + if($r[0]['menu_edited'] >= $m['menu_edited']) + continue; + if($menu['menu_deleted']) { + menu_delete_id($r[0]['menu_id'],$channel['channel_id']); + continue; + } + $menu_id = $r[0]['menu_id']; + $m['menu_id'] = $r[0]['menu_id']; + $x = menu_edit($m); + if(! $x) + continue; + $editing = true; + } + if(! $editing) { + $menu_id = menu_create($m); + } + if($menu_id) { + if($editing) { + // don't try syncing - just delete all the entries and start over + q("delete from menu_item where mitem_menu_id = %d", + intval($menu_id) + ); + } + + if(is_array($menu['items'])) { + foreach($menu['items'] as $it) { + $mitem = array(); + + $mitem['mitem_link'] = str_replace('[baseurl]',z_root(),$it['link']); + $mitem['mitem_desc'] = escape_tags($it['desc']); + $mitem['mitem_order'] = intval($it['order']); + if(is_array($it['flags'])) { + $mitem['mitem_flags'] = 0; + if(in_array('zid',$it['flags'])) + $mitem['mitem_flags'] |= MENU_ITEM_ZID; + if(in_array('new-window',$it['flags'])) + $mitem['mitem_flags'] |= MENU_ITEM_NEWWIN; + if(in_array('chatroom',$it['flags'])) + $mitem['mitem_flags'] |= MENU_ITEM_CHATROOM; + } + menu_add_item($menu_id,$channel['channel_id'],$mitem); + } + } + } + } + } +} + + + +function import_likes($channel,$likes) { + if($channel && $likes) { + foreach($likes as $like) { + if($like['deleted']) { + q("delete from likes where liker = '%s' and likee = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s'", + dbesc($like['liker']), + dbesc($like['likee']), + dbesc($like['verb']), + dbesc($like['target_type']), + dbesc($like['target_id']) + ); + continue; + } + + unset($like['id']); + unset($like['iid']); + $like['channel_id'] = $channel['channel_id']; + $r = q("select * from likes where liker = '%s' and likee = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s' and i_mid = '%s'", + dbesc($like['liker']), + dbesc($like['likee']), + dbesc($like['verb']), + dbesc($like['target_type']), + dbesc($like['target_id']), + dbesc($like['i_mid']) + ); + if($r) + continue; + + dbesc_array($like); + $r = dbq("INSERT INTO likes (`" + . implode("`, `", array_keys($like)) + . "`) VALUES ('" + . implode("', '", array_values($like)) + . "')" ); + } + } +} + +function import_conv($channel,$convs) { + if($channel && $convs) { + foreach($convs as $conv) { + if($conv['deleted']) { + q("delete from conv where guid = '%s' and uid = %d limit 1", + dbesc($conv['guid']), + intval($channel['channel_id']) + ); + continue; + } + + unset($conv['id']); + + $conv['uid'] = $channel['channel_id']; + $conv['subject'] = str_rot47(base64url_encode($conv['subject'])); + + $r = q("select id from conv where guid = '%s' and uid = %d limit 1", + dbesc($conv['guid']), + intval($channel['channel_id']) + ); + if($r) + continue; + + dbesc_array($conv); + $r = dbq("INSERT INTO conv (`" + . implode("`, `", array_keys($conv)) + . "`) VALUES ('" + . implode("', '", array_values($conv)) + . "')" ); + } + } +} + + + +function import_mail($channel,$mails) { + if($channel && $mails) { + foreach($mails as $mail) { + if(array_key_exists('flags',$mail) && in_array('deleted',$mail['flags'])) { + q("delete from mail where mid = '%s' and uid = %d limit 1", + dbesc($mail['message_id']), + intval($channel['channel_id']) + ); + continue; + } + if(array_key_exists('flags',$mail) && in_array('recalled',$mail['flags'])) { + q("update mail set mail_recalled = 1 where mid = '%s' and uid = %d limit 1", + dbesc($mail['message_id']), + intval($channel['channel_id']) + ); + continue; + } + + $m = get_mail_elements($mail); + if(! $m) + continue; + + $m['aid'] = $channel['channel_account_id']; + $m['uid'] = $channel['channel_id']; + mail_store($m); + } + } +} + + + + + + diff --git a/sources/include/importdoc.php b/sources/include/importdoc.php new file mode 100755 index 00000000..10f86869 --- /dev/null +++ b/sources/include/importdoc.php @@ -0,0 +1,41 @@ +get_hostname())) return true; @@ -831,10 +833,14 @@ function title_is_body($title, $body) { } -function get_item_elements($x) { +function get_item_elements($x,$allow_code = false) { $arr = array(); - $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'],ENT_COMPAT,'UTF-8',false) : ''); + + if($allow_code) + $arr['body'] = $x['body']; + else + $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'],ENT_COMPAT,'UTF-8',false) : ''); $key = get_config('system','pubkey'); @@ -1125,7 +1131,7 @@ function import_author_rss($x) { if($r && $x['photo']) { - $photos = import_profile_photo($x['photo']['src'],$x['url']); + $photos = import_xchan_photo($x['photo']['src'],$x['url']); if($photos) { /** @bug $arr is undefined in this SQL query */ @@ -1170,7 +1176,7 @@ function import_author_unknown($x) { ); if($r && $x['photo']) { - $photos = import_profile_photo($x['photo']['src'],$x['url']); + $photos = import_xchan_photo($x['photo']['src'],$x['url']); if($photos) { /** @bug $arr is undefined in this SQL query */ @@ -1307,7 +1313,7 @@ function encode_item($item,$mirror = false) { $x['comment_scope'] = $c_scope; if($item['term']) - $x['tags'] = encode_item_terms($item['term']); + $x['tags'] = encode_item_terms($item['term'],$mirror); if($item['diaspora_meta']) { $z = json_decode($item['diaspora_meta'],true); @@ -1399,11 +1405,16 @@ function encode_item_xchan($xchan) { return $ret; } -function encode_item_terms($terms) { +function encode_item_terms($terms,$mirror = false) { $ret = array(); $allowed_export_terms = array( TERM_UNKNOWN, TERM_HASHTAG, TERM_MENTION, TERM_CATEGORY, TERM_BOOKMARK ); + if($mirror) { + $allowed_export_terms[] = TERM_PCATEGORY; + $allowed_export_terms[] = TERM_FILE; + } + if($terms) { foreach($terms as $term) { if(in_array($term['type'],$allowed_export_terms)) @@ -1548,7 +1559,7 @@ function encode_item_flags($item) { return $ret; } -function encode_mail($item) { +function encode_mail($item,$extended = false) { $x = array(); $x['type'] = 'mail'; $x['encoding'] = 'zot'; @@ -1581,6 +1592,18 @@ function encode_mail($item) { $x['body'] = ''; } + if($extended) { + $x['conv_guid'] = $item['conv_guid']; + if(intval($item['mail_deleted'])) + $x['flags'][] = 'deleted'; + if(intval($item['mail_replied'])) + $x['flags'][] = 'replied'; + if(intval($item['mail_isreply'])) + $x['flags'][] = 'isreply'; + if(intval($item['mail_seen'])) + $x['flags'][] = 'seen'; + } + return $x; } @@ -1593,6 +1616,8 @@ function get_mail_elements($x) { $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'], ENT_COMPAT,'UTF-8',false) : ''); $arr['title'] = (($x['title'])? htmlspecialchars($x['title'],ENT_COMPAT,'UTF-8',false) : ''); + $arr['conv_guid'] = (($x['conv_guid'])? htmlspecialchars($x['conv_guid'],ENT_COMPAT,'UTF-8',false) : ''); + $arr['created'] = datetime_convert('UTC','UTC',$x['created']); if((! array_key_exists('expires',$x)) || ($x['expires'] === NULL_DATE)) $arr['expires'] = NULL_DATE; @@ -1605,6 +1630,18 @@ function get_mail_elements($x) { if(in_array('recalled',$x['flags'])) { $arr['mail_recalled'] = 1; } + if(in_array('replied',$x['flags'])) { + $arr['mail_replied'] = 1; + } + if(in_array('isreply',$x['flags'])) { + $arr['mail_isreply'] = 1; + } + if(in_array('seen',$x['flags'])) { + $arr['mail_seen'] = 1; + } + if(in_array('deleted',$x['flags'])) { + $arr['mail_deleted'] = 1; + } } $key = get_config('system','pubkey'); @@ -1619,6 +1656,7 @@ function get_mail_elements($x) { if($arr['created'] > datetime_convert()) $arr['created'] = datetime_convert(); + $arr['mid'] = (($x['message_id']) ? htmlspecialchars($x['message_id'], ENT_COMPAT,'UTF-8',false) : ''); $arr['parent_mid'] = (($x['message_parent']) ? htmlspecialchars($x['message_parent'], ENT_COMPAT,'UTF-8',false) : ''); @@ -3320,7 +3358,7 @@ function start_delivery_chain($channel, $item, $item_id, $parent) { dbesc($title), dbesc($body), intval($item_wall), - $intval($item_origin), + intval($item_origin), intval($item_id) ); @@ -3431,6 +3469,8 @@ function post_is_importable($item,$abook) { if($exclude) { foreach($exclude as $word) { $word = trim($word); + if(! $word) + continue; if(substr($word,0,1) === '#' && $tags) { foreach($tags as $t) if(($t['type'] == TERM_HASHTAG) && (($t['term'] === substr($word,1)) || (substr($word,1) === '*'))) @@ -3450,6 +3490,8 @@ function post_is_importable($item,$abook) { if($include) { foreach($include as $word) { $word = trim($word); + if(! $word) + continue; if(substr($word,0,1) === '#' && $tags) { foreach($tags as $t) if(($t['type'] == TERM_HASHTAG) && (($t['term'] === substr($word,1)) || (substr($word,1) === '*'))) @@ -3495,6 +3537,7 @@ function mail_store($arr) { $arr['title'] = ((x($arr,'title')) ? trim($arr['title']) : ''); $arr['parent_mid'] = ((x($arr,'parent_mid')) ? notags(trim($arr['parent_mid'])) : ''); $arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : ''); + $arr['conv_guid'] = ((x($arr,'conv_guid')) ? trim($arr['conv_guid']) : ''); $arr['mail_flags'] = ((x($arr,'mail_flags')) ? intval($arr['mail_flags']) : 0 ); @@ -3507,11 +3550,17 @@ function mail_store($arr) { dbesc($arr['mid']), intval($arr['channel_id']) ); + if($r) { logger('mail_store: duplicate item ignored. ' . print_r($arr,true)); return 0; } + if(! $r && $arr['mail_recalled'] == 1) { + logger('mail_store: recalled item not found. ' . print_r($arr,true)); + return 0; + } + call_hooks('post_mail',$arr); if(x($arr,'cancel')) { @@ -4366,7 +4415,7 @@ function delete_item_lowlevel($item, $stage = DROPITEM_NORMAL, $force = false) { ); } else { - $r = q("UPDATE item set item_deleted = 1, changed = '%s', edited = '%s' where if = %d", + $r = q("UPDATE item set item_deleted = 1, changed = '%s', edited = '%s' where id = %d", dbesc(datetime_convert()), dbesc(datetime_convert()), intval($item['id']) @@ -4403,6 +4452,18 @@ function delete_item_lowlevel($item, $stage = DROPITEM_NORMAL, $force = false) { intval($item['uid']) ); + // remove delivery reports + + $c = q("select channel_hash from channel where channel_id = %d limit 1", + intval($item['uid']) + ); + if($c) { + q("delete from dreport where dreport_xchan = '%s' and dreport_mid = '%s'", + dbesc($c[0]['channel_hash']), + dbesc($item['mid']) + ); + } + // network deletion request. Keep the message structure so that we can deliver delete notifications. // Come back after several days (or perhaps a month) to do the lowlevel delete (DROPITEM_PHASE2). @@ -4630,10 +4691,12 @@ function zot_feed($uid,$observer_hash,$arr) { $items = array(); - /** @FIXME fix this part for PostgreSQL */ + /** @FIXME re-unite these SQL statements. There is no need for them to be separate. The mySQL is convoluted with misuse of group by. As it stands, there is a slight difference where the postgres version doesn't remove the duplicate parents up to 100. In practice this doesn't matter. It could be made to match behavior by adding "distinct on (parent) " to the front of the selection list, at a not-worth-it performance penalty (page temp results to disk). duplicates are still ignored in the in() clause, you just get less than 100 parents if there are many children. */ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) { - return array(); + $groupby = ''; + } else { + $groupby = 'GROUP BY parent'; } $item_normal = item_normal(); @@ -4643,7 +4706,7 @@ function zot_feed($uid,$observer_hash,$arr) { WHERE uid != %d $item_normal AND item_wall = 1 - and item_private = 0 $sql_extra GROUP BY parent ORDER BY created ASC $limit", + and item_private = 0 $sql_extra $groupby ORDER BY created ASC $limit", intval($uid) ); } @@ -4651,7 +4714,7 @@ function zot_feed($uid,$observer_hash,$arr) { $r = q("SELECT parent, created, postopts from item WHERE uid = %d $item_normal AND item_wall = 1 - $sql_extra GROUP BY parent ORDER BY created ASC $limit", + $sql_extra $groupby ORDER BY created ASC $limit", intval($uid) ); } @@ -4722,6 +4785,12 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C if($arr['wall']) $sql_options .= " and item_wall = 1 "; + + if($arr['item_id']) + $sql_options .= " and parent = " . intval($arr['item_id']) . " "; + + if($arr['mid']) + $sql_options .= " and parent_mid = '" . dbesc($arr['mid']) . "' "; $sql_extra = " AND item.parent IN ( SELECT parent FROM item WHERE item_thread_top = 1 $sql_options ) "; @@ -4848,11 +4917,15 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C require_once('include/security.php'); $sql_extra .= item_permissions_sql($channel['channel_id'],$observer_hash); + if($arr['pages']) $item_restrict = " AND item_type = " . ITEM_TYPE_WEBPAGE . " "; else $item_restrict = " AND item_type = 0 "; + if($arr['item_type'] === '*') + $item_restrict = ''; + if ($arr['nouveau'] && ($client_mode & CLIENT_MODE_LOAD) && $channel) { // "New Item View" - show all items unthreaded in reverse created date order diff --git a/sources/include/language.php b/sources/include/language.php index 7dbe3dd0..59979aa8 100644 --- a/sources/include/language.php +++ b/sources/include/language.php @@ -120,7 +120,11 @@ function load_translation_table($lang, $install = false) { global $a; $a->strings = array(); - if(file_exists("view/$lang/strings.php")) { + + if(file_exists("view/$lang/hstrings.php")) { + include("view/$lang/hstrings.php"); + } + elseif(file_exists("view/$lang/strings.php")) { include("view/$lang/strings.php"); } @@ -129,7 +133,10 @@ function load_translation_table($lang, $install = false) { if ($plugins !== false) { foreach($plugins as $p) { $name = $p['name']; - if(file_exists("addon/$name/lang/$lang/strings.php")) { + if(file_exists("addon/$name/lang/$lang/hstrings.php")) { + include("addon/$name/lang/$lang/hstrings.php"); + } + elseif(file_exists("addon/$name/lang/$lang/strings.php")) { include("addon/$name/lang/$lang/strings.php"); } } @@ -139,7 +146,10 @@ function load_translation_table($lang, $install = false) { // Allow individual strings to be over-ridden on this site // Either for the default language or for all languages - if(file_exists("view/local-$lang/strings.php")) { + if(file_exists("view/local-$lang/hstrings.php")) { + include("view/local-$lang/hstrings.php"); + } + elseif(file_exists("view/local-$lang/strings.php")) { include("view/local-$lang/strings.php"); } } diff --git a/sources/include/menu.php b/sources/include/menu.php index d20df1d6..07537251 100644 --- a/sources/include/menu.php +++ b/sources/include/menu.php @@ -3,9 +3,10 @@ require_once('include/security.php'); require_once('include/bbcode.php'); + function menu_fetch($name,$uid,$observer_xchan) { - $sql_options = permissions_sql($uid); + $sql_options = permissions_sql($uid,$observer_xchan); $r = q("select * from menu where menu_channel_id = %d and menu_name = '%s' limit 1", intval($uid), @@ -237,7 +238,6 @@ function menu_edit($arr) { return false; } - $r = q("select * from menu where menu_id = %d and menu_channel_id = %d limit 1", intval($menu_id), intval($menu_channel_id) @@ -299,19 +299,18 @@ function menu_add_item($menu_id, $uid, $arr) { $channel = get_app()->get_channel(); } - $str_group_allow = perms2str($arr['group_allow']); - $str_contact_allow = perms2str($arr['contact_allow']); - $str_group_deny = perms2str($arr['group_deny']); - $str_contact_deny = perms2str($arr['contact_deny']); + $acl = new AccessList($channel); + $acl->set_from_array($arr); + $p = $acl->get(); $r = q("insert into menu_item ( mitem_link, mitem_desc, mitem_flags, allow_cid, allow_gid, deny_cid, deny_gid, mitem_channel_id, mitem_menu_id, mitem_order ) values ( '%s', '%s', %d, '%s', '%s', '%s', '%s', %d, %d, %d ) ", dbesc($mitem_link), dbesc($mitem_desc), intval($mitem_flags), - dbesc($str_contact_allow), - dbesc($str_group_allow), - dbesc($str_contact_deny), - dbesc($str_group_deny), + dbesc($p['allow_cid']), + dbesc($p['allow_gid']), + dbesc($p['deny_cid']), + dbesc($p['deny_gid']), intval($uid), intval($menu_id), intval($mitem_order) @@ -341,19 +340,19 @@ function menu_edit_item($menu_id, $uid, $arr) { $channel = get_app()->get_channel(); } - $str_group_allow = perms2str($arr['group_allow']); - $str_contact_allow = perms2str($arr['contact_allow']); - $str_group_deny = perms2str($arr['group_deny']); - $str_contact_deny = perms2str($arr['contact_deny']); + $acl = new AccessList($channel); + $acl->set_from_array($arr); + $p = $acl->get(); + $r = q("update menu_item set mitem_link = '%s', mitem_desc = '%s', mitem_flags = %d, allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', mitem_order = %d where mitem_channel_id = %d and mitem_menu_id = %d and mitem_id = %d", dbesc($mitem_link), dbesc($mitem_desc), intval($mitem_flags), - dbesc($str_contact_allow), - dbesc($str_group_allow), - dbesc($str_contact_deny), - dbesc($str_group_deny), + dbesc($p['allow_cid']), + dbesc($p['allow_gid']), + dbesc($p['deny_cid']), + dbesc($p['deny_gid']), intval($mitem_order), intval($uid), intval($menu_id), @@ -388,3 +387,14 @@ function menu_del_item($menu_id,$uid,$item_id) { return $r; } +function menu_sync_packet($uid,$observer_hash,$menu_id,$delete = false) { + $r = menu_fetch_id($menu_id,$uid); + if($r) { + $m = menu_fetch($r['menu_name'],$uid,$observer_hash); + if($m) { + if($delete) + $m['menu_delete'] = 1; + build_sync_packet($uid,array('menu' => array(menu_element($m)))); + } + } +} diff --git a/sources/include/message.php b/sources/include/message.php index 5720d2da..820d814b 100644 --- a/sources/include/message.php +++ b/sources/include/message.php @@ -28,8 +28,6 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' // $expires = datetime_convert(date_default_timezone_get(),'UTC',$expires); - - if($uid) { $r = q("select * from channel where channel_id = %d limit 1", intval($uid) @@ -49,17 +47,20 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' // look for any existing conversation structure + $conv_guid = ''; + if(strlen($replyto)) { - $r = q("select convid from mail where channel_id = %d and ( mid = '%s' or parent_mid = '%s' ) limit 1", + $r = q("select conv_guid from mail where channel_id = %d and ( mid = '%s' or parent_mid = '%s' ) limit 1", intval(local_channel()), dbesc($replyto), dbesc($replyto) ); - if($r) - $convid = $r[0]['convid']; + if($r) { + $conv_guid = $r[0]['conv_guid']; + } } - if(! $convid) { + if(! $conv_guid) { // create a new conversation @@ -75,13 +76,16 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' $handles = $recip_handle . ';' . $sender_handle; + if($subject) + $nsubject = str_rot47(base64url_encode($subject)); + $r = q("insert into conv (uid,guid,creator,created,updated,subject,recips) values(%d, '%s', '%s', '%s', '%s', '%s', '%s') ", intval(local_channel()), dbesc($conv_guid), dbesc($sender_handle), dbesc(datetime_convert()), dbesc(datetime_convert()), - dbesc($subject), + dbesc($nsubject), dbesc($handles) ); @@ -89,16 +93,28 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' dbesc($conv_guid), intval(local_channel()) ); - if($r) - $convid = $r[0]['id']; + if($r) { + $retconv = $r[0]; + $retconv['subject'] = base64url_decode(str_rot47($retconv['subject'])); + } } - if(! $convid) { + if(! $retconv) { + $r = q("select * from conv where guid = '%s' and uid = %d limit 1", + dbesc($conv_guid), + intval(local_channel()) + ); + if($r) { + $retconv = $r[0]; + $retconv['subject'] = base64url_decode(str_rot47($retconv['subject'])); + } + } + + if(! $retconv) { $ret['message'] = 'conversation not found'; return $ret; } - // generate a unique message_id do { @@ -170,10 +186,10 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' - $r = q("INSERT INTO mail ( account_id, convid, mail_obscured, channel_id, from_xchan, to_xchan, title, body, attach, mid, parent_mid, created, expires ) - VALUES ( %d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", + $r = q("INSERT INTO mail ( account_id, conv_guid, mail_obscured, channel_id, from_xchan, to_xchan, title, body, attach, mid, parent_mid, created, expires ) + VALUES ( %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )", intval($channel['channel_account_id']), - intval($convid), + dbesc($conv_guid), intval(1), intval($channel['channel_id']), dbesc($channel['channel_hash']), @@ -193,8 +209,11 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' dbesc($mid), intval($channel['channel_id']) ); - if($r) + if($r) { $post_id = $r[0]['id']; + $retmail = $r[0]; + xchan_mail_query($retmail); + } else { $ret['message'] = t('Stored post could not be verified.'); return $ret; @@ -212,6 +231,12 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' intval($channel['channel_id']), dbesc('<' . $channel['channel_hash'] . '>') ); + $r = q("UPDATE attach SET allow_cid = '%s' WHERE hash = '%s' AND is_photo = 1 and uid = %d and allow_cid = '%s'", + dbesc('<' . $recipient . '>'), + dbesc($image_uri), + intval($channel['channel_id']), + dbesc('<' . $channel['channel_hash'] . '>') + ); } } @@ -232,6 +257,9 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=' $ret['success'] = true; $ret['message_item'] = intval($post_id); + $ret['conv'] = $retconv; + $ret['mail'] = $retmail; + return $ret; } @@ -252,18 +280,30 @@ function private_messages_list($uid, $mailbox = '', $start = 0, $numitems = 0) { ); if(! $x) return array(); - if($mailbox === 'inbox') - $where = " and sender_xchan != '" . dbesc($x[0]['channel_hash']) . "' "; - elseif($mailbox === 'outbox') - $where = " and sender_xchan = '" . dbesc($x[0]['channel_hash']) . "' "; + + $channel_hash = dbesc($x[0]['channel_hash']); + $local_channel = intval(local_channel()); + + switch($mailbox) { + + case 'inbox': + $sql = "SELECT * FROM mail WHERE channel_id = $local_channel AND from_xchan != '$channel_hash' ORDER BY created DESC $limit"; + break; + + case 'outbox': + $sql = "SELECT * FROM mail WHERE channel_id = $local_channel AND from_xchan = '$channel_hash' ORDER BY created DESC $limit"; + break; + + case 'combined': + $sql = "SELECT * FROM ( SELECT * FROM mail WHERE channel_id = $local_channel ORDER BY created DESC $limit ) AS temp_table GROUP BY parent_mid ORDER BY created DESC"; + break; + + } + } - // For different orderings, consider applying usort on the results. We thought of doing that - // inside this function or having some preset sorts, but don't wish to limit app developers. - - $r = q("SELECT * from mail WHERE channel_id = %d $where order by created desc $limit", - intval(local_channel()) - ); + $r = q($sql); + if(! $r) { return array(); } @@ -345,30 +385,67 @@ function private_messages_fetch_message($channel_id, $messageitem_id, $updatesee function private_messages_drop($channel_id, $messageitem_id, $drop_conversation = false) { - if($drop_conversation) { - // find the parent_id - $p = q("SELECT parent_mid FROM mail WHERE id = %d AND channel_id = %d LIMIT 1", - intval($messageitem_id), + + $x = q("select * from mail where id = %d and channel_id = %d limit 1", + intval($messageitem_id), + intval($channel_id) + ); + if(! $x) + return false; + + $conversation = null; + + if($x[0]['conv_guid']) { + $y = q("select * from conv where guid = '%s' and uid = %d limit 1", + dbesc($x[0]['conv_guid']), intval($channel_id) ); - if($p) { - $r = q("DELETE FROM mail WHERE parent_mid = '%s' AND channel_id = %d ", - dbesc($p[0]['parent_mid']), - intval($channel_id) - ); - if($r) - return true; + if($y) { + $conversation = $y[0]; + $conversation['subject'] = base64url_decode(str_rot47($conversation['subject'])); } } + + if($drop_conversation) { + $m = array(); + $m['conv'] = array($conversation); + $m['conv'][0]['deleted'] = 1; + + $z = q("select * from mail where parent_mid = '%s' and channel_id = %d", + dbesc($x[0]['parent_mid']), + intval($channel_id) + ); + if($z) { + q("delete from conv where guid = '%s' and uid = %d limit 1", + dbesc($x[0]['conv_guid']), + intval($channel_id) + ); + $m['mail'] = array(); + foreach($z as $zz) { + xchan_mail_query($zz); + $zz['mail_deleted'] = 1; + $m['mail'][] = encode_mail($zz,true); + } + q("DELETE FROM mail WHERE parent_mid = '%s' AND channel_id = %d ", + dbesc($x[0]['parent_mid']), + intval($channel_id) + ); + } + build_sync_packet($channel_id,$m); + return true; + } else { + xchan_mail_query($x[0]); + $x[0]['mail_deleted'] = true; $r = q("DELETE FROM mail WHERE id = %d AND channel_id = %d", intval($messageitem_id), intval($channel_id) ); - if($r) - return true; + build_sync_packet($channel_id,array('mail' => array(encode_mail($x,true)))); + return true; } return false; + } @@ -427,4 +504,4 @@ function private_messages_fetch_conversation($channel_id, $messageitem_id, $upda return $messages; -} \ No newline at end of file +} diff --git a/sources/include/nav.php b/sources/include/nav.php index 898805bb..1630c473 100644 --- a/sources/include/nav.php +++ b/sources/include/nav.php @@ -94,9 +94,8 @@ EOT; require_once('include/chat.php'); $has_chats = chatroom_list_count(local_channel()); - if($has_chats) { - $nav['usermenu'][] = Array('chat/' . $channel['channel_address'],t('Chat'),"",t('Your chatrooms'),'chat_nav_btn'); - } + $nav['usermenu'][] = Array('chat/' . $channel['channel_address'] . (($has_chats) ? '' : '/new'), t('Chat'),"",t('Your chatrooms'),'chat_nav_btn'); + require_once('include/menu.php'); $has_bookmarks = menu_list_count(local_channel(),'',MENU_BOOKMARK) + menu_list_count(local_channel(),'',MENU_SYSTEM|MENU_BOOKMARK); @@ -172,8 +171,8 @@ EOT; if(local_channel()) { - $nav['network'] = array('network', t('Matrix'), "", t('Your matrix'),'network_nav_btn'); - $nav['network']['mark'] = array('', t('Mark all matrix notifications seen'), '',''); + $nav['network'] = array('network', t('Grid'), "", t('Your grid'),'network_nav_btn'); + $nav['network']['mark'] = array('', t('Mark all grid notifications seen'), '',''); $nav['home'] = array('channel/' . $channel['channel_address'], t('Channel Home'), "", t('Channel home'),'home_nav_btn'); $nav['home']['mark'] = array('', t('Mark all channel notifications seen'), '',''); @@ -186,11 +185,11 @@ EOT; $nav['notifications']['all']=array('notifications/system', t('See all notifications'), "", ""); $nav['notifications']['mark'] = array('', t('Mark all system notifications seen'), '',''); - $nav['messages'] = array('message', t('Mail'), "", t('Private mail'),'mail_nav_btn'); - $nav['messages']['all']=array('message', t('See all private messages'), "", ""); + $nav['messages'] = array('mail/combined', t('Mail'), "", t('Private mail'),'mail_nav_btn'); + $nav['messages']['all']=array('mail/combined', t('See all private messages'), "", ""); $nav['messages']['mark'] = array('', t('Mark all private messages seen'), '',''); - $nav['messages']['inbox'] = array('message', t('Inbox'), "", t('Inbox')); - $nav['messages']['outbox']= array('message/sent', t('Outbox'), "", t('Outbox')); + $nav['messages']['inbox'] = array('mail/inbox', t('Inbox'), "", t('Inbox')); + $nav['messages']['outbox']= array('mail/outbox', t('Outbox'), "", t('Outbox')); $nav['messages']['new'] = array('mail/new', t('New Message'), "", t('New Message')); diff --git a/sources/include/network.php b/sources/include/network.php index ef92e013..c67c019e 100644 --- a/sources/include/network.php +++ b/sources/include/network.php @@ -586,7 +586,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false) if(substr($mtch[1],0,1) == '=') { $owidth = intval(substr($mtch[2],1)); - if(intval($owidth) > 0 && intval($owidth) < 640) + if(intval($owidth) > 0 && intval($owidth) < 1024) continue; } @@ -624,9 +624,9 @@ function scale_external_images($s, $include_link = true, $scale_replace = false) $orig_width = $ph->getWidth(); $orig_height = $ph->getHeight(); - if($orig_width > 640 || $orig_height > 640) { + if($orig_width > 1024 || $orig_height > 1024) { $tag = (($match[1] == 'z') ? 'zmg' : 'img'); - $ph->scaleImage(640); + $ph->scaleImage(1024); $new_width = $ph->getWidth(); $new_height = $ph->getHeight(); logger('scale_external_images: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], LOGGER_DEBUG); @@ -1035,7 +1035,7 @@ function discover_by_url($url,$arr = null) { dbesc(datetime_convert()) ); - $photos = import_profile_photo($photo,$guid); + $photos = import_xchan_photo($photo,$guid); $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'", dbesc(datetime_convert()), dbesc($photos[0]), @@ -1053,16 +1053,20 @@ function discover_by_webbie($webbie) { $webbie = strtolower($webbie); - $x = webfinger_rfc7033($webbie); + $x = webfinger_rfc7033($webbie,true); if($x && array_key_exists('links',$x) && $x['links']) { foreach($x['links'] as $link) { if(array_key_exists('rel',$link) && $link['rel'] == 'http://purl.org/zot/protocol') { logger('discover_by_webbie: zot found for ' . $webbie, LOGGER_DEBUG); - $z = z_fetch_url($link['href']); - if($z['success']) { - $j = json_decode($z['body'],true); - $i = import_xchan($j); - return true; + if(array_key_exists('zot',$x) && $x['zot']['success']) + $i = import_xchan($x['zot']); + else { + $z = z_fetch_url($link['href']); + if($z['success']) { + $j = json_decode($z['body'],true); + $i = import_xchan($j); + return true; + } } } } @@ -1137,6 +1141,8 @@ function discover_by_webbie($webbie) { if($hcard) { $vcard = scrape_vcard($hcard); $vcard['nick'] = substr($webbie,0,strpos($webbie,'@')); + if(! $vcard['fn']) + $vcard['fn'] = $webbie; } $r = q("select * from xchan where xchan_hash = '%s' limit 1", @@ -1192,7 +1198,7 @@ function discover_by_webbie($webbie) { dbescdate(datetime_convert()) ); } - $photos = import_profile_photo($vcard['photo'],$addr); + $photos = import_xchan_photo($vcard['photo'],$addr); $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'", dbescdate(datetime_convert('UTC','UTC',$arr['photo_updated'])), dbesc($photos[0]), @@ -1280,7 +1286,7 @@ LSIeXnd14lQYK/uxW/8cTFjcmddsKxeXysoQxbSa9VdDK+KkpZdgYXYrTTofXs6v+ } -function webfinger_rfc7033($webbie) { +function webfinger_rfc7033($webbie,$zot = false) { if(! strpos($webbie,'@')) @@ -1290,7 +1296,7 @@ function webfinger_rfc7033($webbie) { $resource = 'acct:' . $webbie; - $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?resource=' . $resource); + $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=1' : '')); if($s['success']) $j = json_decode($s['body'],true); @@ -1671,13 +1677,40 @@ function format_and_send_email($sender,$xchan,$item) { 'additionalMailHeader' => '', )); +} +function do_delivery($deliveries) { + + if(! (is_array($deliveries) && count($deliveries))) + return; + + $interval = ((get_config('system','delivery_interval') !== false) + ? intval(get_config('system','delivery_interval')) : 2 ); + + $deliveries_per_process = intval(get_config('system','delivery_batch_count')); + + if($deliveries_per_process <= 0) + $deliveries_per_process = 1; + $deliver = array(); + foreach($deliveries as $d) { + $deliver[] = $d; + if(count($deliver) >= $deliveries_per_process) { + proc_run('php','include/deliver.php',$deliver); + $deliver = array(); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); + } + } + // catch any stragglers + if($deliver) + proc_run('php','include/deliver.php',$deliver); + } diff --git a/sources/include/notifier.php b/sources/include/notifier.php index 62aea410..385062f0 100644 --- a/sources/include/notifier.php +++ b/sources/include/notifier.php @@ -96,7 +96,19 @@ function notifier_run($argv, $argc){ require_once('include/identity.php'); $sys = get_sys_channel(); - if($cmd == 'permission_update') { + $deliveries = array(); + + $dead_hubs = array(); + + $dh = q("select site_url from site where site_dead = 1"); + if(dh) { + foreach($dh as $dead) { + $dead_hubs[] = $dead['site_url']; + } + } + + + if($cmd == 'permission_update' || $cmd == 'permission_create') { // Get the recipient $r = q("select abook.*, hubloc.* from abook left join hubloc on hubloc_hash = abook_xchan @@ -113,8 +125,16 @@ function notifier_run($argv, $argc){ intval($r[0]['abook_channel']) ); if($s) { - $perm_update = array('sender' => $s[0], 'recipient' => $r[0], 'success' => false); - call_hooks('permissions_update',$perm_update); + $perm_update = array('sender' => $s[0], 'recipient' => $r[0], 'success' => false, 'deliveries' => ''); + + if($cmd == 'permission_create') + call_hooks('permissions_create',$perm_update); + else + call_hooks('permissions_update',$perm_update); + + if($perm_update['success'] && $perm_update['deliveries']) + $deliveries[] = $perm_update['deliveries']; + if(! $perm_update['success']) { // send a refresh message to each hub they have registered here $h = q("select * from hubloc where hubloc_hash = '%s' @@ -125,36 +145,40 @@ function notifier_run($argv, $argc){ ); if($h) { foreach($h as $hh) { + if(in_array($hh['hubloc_url'],$dead_hubs)) { + logger('skipping dead hub: ' . $hh['hubloc_url'], LOGGER_DEBUG); + continue; + } + $data = zot_build_packet($s[0],'refresh',array(array( 'guid' => $hh['hubloc_guid'], 'guid_sig' => $hh['hubloc_guid_sig'], 'url' => $hh['hubloc_url']) )); if($data) { - $result = zot_zot($hh['hubloc_callback'],$data); - - // if immediate delivery failed, stick it in the queue to try again later. - - if(! $result['success']) { - $hash = random_string(); - q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) - values ( '%s', %d, %d, '%s', '%s', %d, '%s', '%s', '%s', '%s' )", - dbesc($hash), - intval($s[0]['channel_account_id']), - intval($s[0]['channel_id']), - dbesc('zot'), - dbesc($hh['hubloc_callback']), - intval(1), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($data), - dbesc('') - ); - } + $hash = random_string(); + q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) + values ( '%s', %d, %d, '%s', '%s', %d, '%s', '%s', '%s', '%s' )", + dbesc($hash), + intval($s[0]['channel_account_id']), + intval($s[0]['channel_id']), + dbesc('zot'), + dbesc($hh['hubloc_callback']), + intval(1), + dbesc(datetime_convert()), + dbesc(datetime_convert()), + dbesc($data), + dbesc('') + ); + $deliveries[] = $hash; } - } + } + } } + + if($deliveries) + do_delivery($deliveries); } } return; @@ -486,20 +510,6 @@ function notifier_run($argv, $argc){ if($details) { foreach($details as $d) { - // If the recipient is federated from a traditional network they won't be able to - // handle nomadic identity. If we're publishing from a site that they aren't - // directly connected with, ignore them. - - // FIXME: make sure we run through a notifier loop on the hub they're connected - // with if this post comes in from a different hub - so that we will deliver to them. - - // On the down side, these channels will stop working if the hub they connected with - // goes down permanently, as they are (doh) not nomadic. - - if(($d['xchan_instance_url']) && ($d['xchan_instance_url'] != z_root())) - continue; - - $recip_list[] = $d['xchan_addr'] . ' (' . $d['xchan_hash'] . ')'; if($private) $env_recips[] = array('guid' => $d['xchan_guid'],'guid_sig' => $d['xchan_guid_sig'],'hash' => $d['xchan_hash']); @@ -526,31 +536,10 @@ function notifier_run($argv, $argc){ // Now we have collected recipients (except for external mentions, FIXME) // Let's reduce this to a set of hubs. - logger('notifier: hub choice: ' . intval($relay_to_owner) . ' ' . intval($private) . ' ' . $cmd, LOGGER_DEBUG); - - // FIXME: I think we need to remove the private bit or this clause will never execute. Needs more coffee to think it through. - // We may in fact have to send it to clones in case the one we pick recently died. - - if($relay_to_owner && (! $private) && ($cmd !== 'relay')) { - - // If sending a followup to the post owner, only send it to one channel clone - to avoid race conditions. - // In this case we'll pick the most recently contacted hub, as their primary might be down and the most - // recently contacted has the best chance of being alive. - - // For private posts or uplinks we have to do things differently as only the sending clone will have the recipient list. - // We have to send to all clone channels of the owner to find out who has the definitive list. Posts with - // item_private set (but no ACL list) will return empty recipients (except for the sender and owner) in - // collect_recipients() above. The end result is we should get only one delivery per delivery chain if we - // aren't the owner or author. - - - $r = q("select * from hubloc - where hubloc_hash in (" . implode(',',$recipients) . ") order by hubloc_connected desc limit 1"); - } - else { - $r = q("select * from hubloc where hubloc_hash in (" . implode(',',$recipients) . ") - and hubloc_error = 0 and hubloc_deleted = 0"); - } + $r = q("select * from hubloc where hubloc_hash in (" . implode(',',$recipients) . ") + and hubloc_error = 0 and hubloc_deleted = 0" + ); + if(! $r) { logger('notifier: no hubs'); @@ -560,6 +549,7 @@ function notifier_run($argv, $argc){ $hubs = $r; + /** * Reduce the hubs to those that are unique. For zot hubs, we need to verify uniqueness by the sitekey, since it may have been * a re-install which has not yet been detected and pruned. @@ -574,6 +564,11 @@ function notifier_run($argv, $argc){ foreach($hubs as $hub) { + if(in_array($hub['hubloc_url'],$dead_hubs)) { + logger('skipping dead hub: ' . $hub['hubloc_url'], LOGGER_DEBUG); + continue; + } + if($hub['hubloc_network'] == 'zot') { if(! in_array($hub['hubloc_sitekey'],$keys)) { $hublist[] = $hub['hubloc_host']; @@ -592,15 +587,6 @@ function notifier_run($argv, $argc){ logger('notifier: will notify/deliver to these hubs: ' . print_r($hublist,true), LOGGER_DEBUG); - $interval = ((get_config('system','delivery_interval') !== false) - ? intval(get_config('system','delivery_interval')) : 2 ); - - $deliveries_per_process = intval(get_config('system','delivery_batch_count')); - - if($deliveries_per_process <= 0) - $deliveries_per_process = 1; - - $deliver = array(); foreach($dhubs as $hub) { @@ -626,11 +612,16 @@ function notifier_run($argv, $argc){ 'request' => $request, 'normal_mode' => $normal_mode, 'packet_type' => $packet_type, - 'walltowall' => $walltowall + 'walltowall' => $walltowall, + 'queued' => array() ); call_hooks('notifier_hub',$narr); + if($narr['queued']) { + foreach($narr['queued'] as $pq) + $deliveries[] = $pq; + } continue; } @@ -683,28 +674,33 @@ function notifier_run($argv, $argc){ dbesc($n), dbesc(json_encode($encoded_item)) ); + // only create delivery reports for normal undeleted items + if(array_key_exists('postopts',$target_item) && (! $target_item['item_deleted'])) { + q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan, dreport_queue ) values ( '%s','%s','%s','%s','%s','%s','%s' ) ", + dbesc($target_item['mid']), + dbesc($hub['hubloc_host']), + dbesc($hub['hubloc_host']), + dbesc('queued'), + dbesc(datetime_convert()), + dbesc($channel['channel_hash']), + dbesc($hash) + ); + } } - $deliver[] = $hash; - if(count($deliver) >= $deliveries_per_process) { - proc_run('php','include/deliver.php',$deliver); - $deliver = array(); - if($interval) - @time_sleep_until(microtime(true) + (float) $interval); - } + $deliveries[] = $hash; + } + + if($normal_mode) { + $x = q("select * from hook where hook = 'notifier_normal'"); + if($x) + proc_run('php','include/deliver_hooks.php', $target_item['id']); } - // catch any stragglers - - if(count($deliver)) { - proc_run('php','include/deliver.php',$deliver); - } + if($deliveries) + do_delivery($deliveries); logger('notifier: basic loop complete.', LOGGER_DEBUG); - - if($normal_mode) - call_hooks('notifier_normal',$target_item); - call_hooks('notifier_end',$target_item); diff --git a/sources/include/photo/photo_driver.php b/sources/include/photo/photo_driver.php index 553e77ed..32b9bd30 100644 --- a/sources/include/photo/photo_driver.php +++ b/sources/include/photo/photo_driver.php @@ -557,14 +557,14 @@ function guess_image_type($filename, $headers = '') { } -function import_profile_photo($photo,$xchan,$thing = false) { +function import_xchan_photo($photo,$xchan,$thing = false) { $a = get_app(); $flags = (($thing) ? PHOTO_THING : PHOTO_XCHAN); $album = (($thing) ? 'Things' : 'Contact Photos'); - logger('import_profile_photo: updating channel photo from ' . $photo . ' for ' . $xchan, LOGGER_DEBUG); + logger('import_xchan_photo: updating channel photo from ' . $photo . ' for ' . $xchan, LOGGER_DEBUG); if($thing) $hash = photo_new_resource(); @@ -591,68 +591,86 @@ function import_profile_photo($photo,$xchan,$thing = false) { if(! $type) $type = 'image/jpeg'; + $result = z_fetch_url($photo,true); - if($result['success']) + if($result['success']) { $img_str = $result['body']; - } - $img = photo_factory($img_str, $type); - if($img->is_valid()) { - $width = $img->getWidth(); - $height = $img->getHeight(); - - if($width && $height) { - if(($width / $height) > 1.2) { - // crop out the sides - $margin = $width - $height; - $img->cropImage(300,($margin / 2),0,$height,$height); + $h = explode("\n",$result['header']); + if($h) { + foreach($h as $hl) { + if(stristr($hl,'content-type:')) { + if(! stristr($hl,'image/')) { + $photo_failure = true; + } + } + } } - elseif(($height / $width) > 1.2) { - // crop out the bottom - $margin = $height - $width; - $img->cropImage(300,0,0,$width,$width); - - } - else { - $img->scaleImageSquare(300); - } - } - else - $photo_failure = true; - - $p = array('xchan' => $xchan,'resource_id' => $hash, 'filename' => basename($photo), 'album' => $album, 'photo_usage' => $flags, 'scale' => 4); - - $r = $img->save($p); - - if($r === false) - $photo_failure = true; - - $img->scaleImage(80); - $p['scale'] = 5; - - $r = $img->save($p); - - if($r === false) - $photo_failure = true; - - $img->scaleImage(48); - $p['scale'] = 6; - - $r = $img->save($p); - - if($r === false) - $photo_failure = true; - - $photo = $a->get_baseurl() . '/photo/' . $hash . '-4'; - $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5'; - $micro = $a->get_baseurl() . '/photo/' . $hash . '-6'; } else { - logger('import_profile_photo: invalid image from ' . $photo); $photo_failure = true; } + + if(! $photo_failure) { + $img = photo_factory($img_str, $type); + if($img->is_valid()) { + $width = $img->getWidth(); + $height = $img->getHeight(); + + if($width && $height) { + if(($width / $height) > 1.2) { + // crop out the sides + $margin = $width - $height; + $img->cropImage(300,($margin / 2),0,$height,$height); + } + elseif(($height / $width) > 1.2) { + // crop out the bottom + $margin = $height - $width; + $img->cropImage(300,0,0,$width,$width); + + } + else { + $img->scaleImageSquare(300); + } + + } + else + $photo_failure = true; + + $p = array('xchan' => $xchan,'resource_id' => $hash, 'filename' => basename($photo), 'album' => $album, 'photo_usage' => $flags, 'scale' => 4); + + $r = $img->save($p); + + if($r === false) + $photo_failure = true; + + $img->scaleImage(80); + $p['scale'] = 5; + + $r = $img->save($p); + + if($r === false) + $photo_failure = true; + + $img->scaleImage(48); + $p['scale'] = 6; + + $r = $img->save($p); + + if($r === false) + $photo_failure = true; + + $photo = $a->get_baseurl() . '/photo/' . $hash . '-4'; + $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5'; + $micro = $a->get_baseurl() . '/photo/' . $hash . '-6'; + } + else { + logger('import_xchan_photo: invalid image from ' . $photo); + $photo_failure = true; + } + } if($photo_failure) { $photo = $a->get_baseurl() . '/' . get_default_profile_photo(); $thumb = $a->get_baseurl() . '/' . get_default_profile_photo(80); diff --git a/sources/include/photos.php b/sources/include/photos.php index cb7fabc9..a203b9b6 100644 --- a/sources/include/photos.php +++ b/sources/include/photos.php @@ -27,23 +27,13 @@ function photo_upload($channel, $observer, $args) { return $ret; } - call_hooks('photo_upload_begin', $args); +// call_hooks('photo_upload_begin', $args); /* * Determine the album to use */ $album = $args['album']; -// $newalbum = $args['newalbum']; - -// logger('photo_upload: album= ' . $album . ' newalbum= ' . $newalbum , LOGGER_DEBUG); - -// if(! $album) { -// if($newalbum) -// $album = $newalbum; -// else -// $album = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y-m'); -// } if(intval($args['visible']) || $args['visible'] === 'true') $visible = 1; @@ -52,32 +42,23 @@ function photo_upload($channel, $observer, $args) { // Set to default channel permissions. If the parent directory (album) has permissions set, // use those instead. If we have specific permissions supplied, they take precedence over - // all other settings. - - $str_group_allow = $channel['channel_allow_gid']; - $str_contact_allow = $channel['channel_allow_cid']; - $str_group_deny = $channel['channel_deny_gid']; - $str_contact_deny = $channel['channel_deny_cid']; - - if($args['directory']) { - $str_group_allow = $args['directory']['allow_gid']; - $str_contact_allow = $args['directory']['allow_cid']; - $str_group_deny = $args['directory']['deny_gid']; - $str_contact_deny = $args['directory']['deny_cid']; - } + // all other settings. 'allow_cid' being passed from an external source takes priority over channel settings. + // ...messy... needs re-factoring once the photos/files integration stabilises + $acl = new AccessList($channel); + if(array_key_exists('directory',$args) && $args['directory']) + $acl->set($args['directory']); + if(array_key_exists('allow_cid',$args)) + $acl->set($args); if( (array_key_exists('group_allow',$args)) || (array_key_exists('contact_allow',$args)) || (array_key_exists('group_deny',$args)) || (array_key_exists('contact_deny',$args))) { - - $str_group_allow = perms2str(((is_array($args['group_allow'])) ? $args['group_allow'] : explode(',',$args['group_allow']))); - $str_contact_allow = perms2str(((is_array($args['contact_allow'])) ? $args['contact_allow'] : explode(',',$args['contact_allow']))); - $str_group_deny = perms2str(((is_array($args['group_deny'])) ? $args['group_deny'] : explode(',',$args['group_deny']))); - $str_contact_deny = perms2str(((is_array($args['contact_deny'])) ? $args['contact_deny'] : explode(',',$args['contact_deny']))); - + $acl->set_from_array($args); } + $ac = $acl->get(); + $os_storage = 0; if($args['os_path'] && $args['getimagesize']) { @@ -103,7 +84,7 @@ function photo_upload($channel, $observer, $args) { } else { $f = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => ''); - call_hooks('photo_upload_file',$f); +// call_hooks('photo_upload_file',$f); if (x($f,'src') && x($f,'filesize')) { $src = $f['src']; @@ -191,8 +172,8 @@ function photo_upload($channel, $observer, $args) { $p = array('aid' => $account_id, 'uid' => $channel_id, 'xchan' => $visitor, 'resource_id' => $photo_hash, 'filename' => $filename, 'album' => $album, 'scale' => 0, 'photo_usage' => PHOTO_NORMAL, - 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_group_allow, - 'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny, + 'allow_cid' => $ac['allow_cid'], 'allow_gid' => $ac['allow_gid'], + 'deny_cid' => $ac['deny_cid'], 'deny_gid' => $ac['deny_gid'], 'os_storage' => $os_storage, 'os_path' => $args['os_path'] ); if($args['created']) @@ -204,31 +185,44 @@ function photo_upload($channel, $observer, $args) { if($args['description']) $p['description'] = $args['description']; - $r1 = $ph->save($p); - if(! $r1) + $r0 = $ph->save($p); + $r0width = $ph->getWidth(); + $r0height = $ph->getHeight(); + if(! $r0) $errors = true; - unset($p['os_storage']); unset($p['os_path']); - if(($width > 640 || $height > 640) && (! $errors)) { - $ph->scaleImage(640); - $p['scale'] = 1; - $r2 = $ph->save($p); - $smallest = 1; - if(! $r2) - $errors = true; - } + if(($width > 1024 || $height > 1024) && (! $errors)) + $ph->scaleImage(1024); - if(($width > 320 || $height > 320) && (! $errors)) { + $p['scale'] = 1; + $r1 = $ph->save($p); + $r1width = $ph->getWidth(); + $r1height = $ph->getHeight(); + if(! $r1) + $errors = true; + + if(($width > 640 || $height > 640) && (! $errors)) + $ph->scaleImage(640); + + $p['scale'] = 2; + $r2 = $ph->save($p); + $r2width = $ph->getWidth(); + $r2height = $ph->getHeight(); + if(! $r2) + $errors = true; + + if(($width > 320 || $height > 320) && (! $errors)) $ph->scaleImage(320); - $p['scale'] = 2; - $r3 = $ph->save($p); - $smallest = 2; - if(! $r3) - $errors = true; - } + + $p['scale'] = 3; + $r3 = $ph->save($p); + $r3width = $ph->getWidth(); + $r3height = $ph->getHeight(); + if(! $r3) + $errors = true; if($errors) { q("delete from photo where resource_id = '%s' and uid = %d", @@ -241,15 +235,6 @@ function photo_upload($channel, $observer, $args) { return $ret; } - // This will be the width and height of the smallest representation - - $width_x_height = $ph->getWidth() . 'x' . $ph->getHeight(); - - $mid = item_message_id(); - - // Create item container - - $item_hidden = (($visible) ? 0 : 1 ); $lat = $lon = null; @@ -261,66 +246,132 @@ function photo_upload($channel, $observer, $args) { } } - $title = ''; - $mid = item_message_id(); + $title = (($args['filename']) ? $args['filename'] : ''); - $arr = array(); + $large_photos = feature_enabled($channel['channel_id'], 'large_photos'); - if($lat && $lon) - $arr['coord'] = $lat . ' ' . $lon; + if($large_photos) { + $scale = 1; + $width = $r1width; + $height = $r1height; + $tag = (($r1) ? '[zmg=' . $width . 'x' . $height . ']' : '[zmg]'); - $arr['aid'] = $account_id; - $arr['uid'] = $channel_id; - $arr['mid'] = $mid; - $arr['parent_mid'] = $mid; - $arr['item_hidden'] = $item_hidden; - $arr['resource_type'] = 'photo'; - $arr['resource_id'] = $photo_hash; - $arr['owner_xchan'] = $channel['channel_hash']; - $arr['author_xchan'] = $observer['xchan_hash']; - $arr['title'] = $title; - $arr['allow_cid'] = $str_contact_allow; - $arr['allow_gid'] = $str_group_allow; - $arr['deny_cid'] = $str_contact_deny; - $arr['deny_gid'] = $str_group_deny; - $arr['verb'] = ACTIVITY_POST; - $arr['item_wall'] = 1; - $arr['item_origin'] = 1; - $arr['item_thread_top'] = 1; + // Create item object + $href = rawurlencode(z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo_hash); + $url = rawurlencode(z_root() . "/photo/{$photo_hash}-{$scale}.".$ph->getExt()); - $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid']; + $link = array(); + $link[] = array( + 'rel' => 'alternate', + 'type' => 'text/html', + 'href' => $href + ); - // We should also put a width_x_height on large photos. Left as an exercise for - // devs looking fo simple stuff to fix. - - $larger = feature_enabled($channel['channel_id'], 'large_photos'); - if($larger) { - $tag = '[zmg]'; - if($r2) - $smallest = 1; - else - $smallest = 0; + $object = array( + 'type' => ACTIVITY_OBJ_PHOTO, + 'title' => $title, + 'id' => $url, + 'link' => $link, + 'width' => $width, + 'height' => $height + ); } else { - if ($width_x_height) - $tag = '[zmg=' . $width_x_height. ']'; - else - $tag = '[zmg]'; + $scale = 2; + $width = $r2width; + $height = $r2height; + $tag = (($r2) ? '[zmg=' . $width . 'x' . $height . ']' : '[zmg]'); } - $arr['body'] = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo_hash . ']' - . $tag . z_root() . "/photo/{$photo_hash}-{$smallest}.".$ph->getExt() . '[/zmg]' - . '[/zrl]'; + $body = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo_hash . ']' + . $tag . z_root() . "/photo/{$photo_hash}-{$scale}.".$ph->getExt() . '[/zmg]' + . '[/zrl]'; - $result = item_store($arr); - $item_id = $result['item_id']; + // Create item container - if($visible) - proc_run('php', "include/notifier.php", 'wall-new', $item_id); + if($args['item']) { + foreach($args['item'] as $i) { + + $item = get_item_elements($i); + $force = false; + + if($item['mid'] === $item['parent_mid']) { + + $item['body'] = (($object) ? '' : $body); + $item['obj_type'] = (($object) ? ACTIVITY_OBJ_PHOTO : ''); + $item['object'] = (($object) ? json_encode($object) : ''); + + if($item['author_xchan'] === $channel['channel_hash']) { + $item['sig'] = base64url_encode(rsa_sign($item['body'],$channel['channel_prvkey'])); + $item['item_verified'] = 1; + } + else { + $item['sig'] = ''; + } + $force = true; + + } + $r = q("select id, edited from item where mid = '%s' and uid = %d limit 1", + dbesc($item['mid']), + intval($channel['channel_id']) + ); + if($r) { + if(($item['edited'] > $r[0]['edited']) || $force) { + $item['id'] = $r[0]['id']; + $item['uid'] = $channel['channel_id']; + item_store_update($item); + continue; + } + } + else { + $item['aid'] = $channel['channel_account_id']; + $item['uid'] = $channel['channel_id']; + $item_result = item_store($item); + } + } + } + else { + $mid = item_message_id(); + + $arr = array(); + + if($lat && $lon) + $arr['coord'] = $lat . ' ' . $lon; + + $arr['aid'] = $account_id; + $arr['uid'] = $channel_id; + $arr['mid'] = $mid; + $arr['parent_mid'] = $mid; + $arr['item_hidden'] = $item_hidden; + $arr['resource_type'] = 'photo'; + $arr['resource_id'] = $photo_hash; + $arr['owner_xchan'] = $channel['channel_hash']; + $arr['author_xchan'] = $observer['xchan_hash']; + $arr['title'] = $title; + $arr['allow_cid'] = $ac['allow_cid']; + $arr['allow_gid'] = $ac['allow_gid']; + $arr['deny_cid'] = $ac['deny_cid']; + $arr['deny_gid'] = $ac['deny_gid']; + $arr['verb'] = ACTIVITY_POST; + $arr['obj_type'] = (($object) ? ACTIVITY_OBJ_PHOTO : ''); + $arr['object'] = (($object) ? json_encode($object) : ''); + $arr['item_wall'] = 1; + $arr['item_origin'] = 1; + $arr['item_thread_top'] = 1; + $arr['item_private'] = intval($acl->is_private()); + $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid']; + $arr['body'] = (($object) ? '' : $body); + + $result = item_store($arr); + $item_id = $result['item_id']; + + if($visible) + proc_run('php', "include/notifier.php", 'wall-new', $item_id); + } $ret['success'] = true; $ret['item'] = $arr; - $ret['body'] = $arr['body']; + $ret['body'] = $body; $ret['resource_id'] = $photo_hash; $ret['photoitem_id'] = $item_id; diff --git a/sources/include/poller.php b/sources/include/poller.php index f44298a9..031fb453 100644 --- a/sources/include/poller.php +++ b/sources/include/poller.php @@ -175,6 +175,12 @@ function poller_run($argv, $argc){ logger('regdir: ' . print_r(z_fetch_url(get_directory_primary() . '/regdir?f=&url=' . urlencode(z_root()) . '&realm=' . urlencode(get_directory_realm())),true)); } + // Check for dead sites + proc_run('php', 'include/checksites.php'); + + // update searchable doc indexes + proc_run('php', 'include/importdoc.php'); + /** * End Cron Weekly */ @@ -195,6 +201,17 @@ function poller_run($argv, $argc){ db_utcnow(), db_quoteinterval('30 DAY') ); + // expire old delivery reports + + $keep_reports = intval(get_config('system','expire_delivery_reports')); + if($keep_reports === 0) + $keep_reports = 30; + + q("delete from dreport where dreport_time < %s - INTERVAL %s", + db_utcnow(), + db_quoteinterval($keep_reports . ' DAY') + ); + // expire any expired accounts downgrade_accounts(); @@ -232,7 +249,7 @@ function poller_run($argv, $argc){ if($r) { require_once('include/photo/photo_driver.php'); foreach($r as $rr) { - $photos = import_profile_photo($rr['xchan_photo_l'],$rr['xchan_hash']); + $photos = import_xchan_photo($rr['xchan_photo_l'],$rr['xchan_hash']); $x = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'", dbesc($photos[0]), diff --git a/sources/include/queue.php b/sources/include/queue.php index 7d2ad3b2..71ac50c8 100644 --- a/sources/include/queue.php +++ b/sources/include/queue.php @@ -22,6 +22,25 @@ function queue_run($argv, $argc){ logger('queue: start'); + + // delete all queue items more than 3 days old + // but first mark these sites dead if we haven't heard from them in a month + + $r = q("select outq_posturl from outq where outq_created < %s - INTERVAL %s", + db_utcnow(), db_quoteinterval('3 DAY') + ); + if($r) { + foreach($r as $rr) { + $site_url = ''; + $h = parse_url($rr['outq_posturl']); + $desturl = $h['scheme'] . '://' . $h['host'] . (($h['port']) ? ':' . $h['port'] : ''); + q("update site set site_dead = 1 where site_dead = 0 and site_url = '%s' and site_update < %s - INTERVAL %s", + dbesc($desturl), + db_utcnow(), db_quoteinterval('1 MONTH') + ); + } + } + $r = q("DELETE FROM outq WHERE outq_created < %s - INTERVAL %s", db_utcnow(), db_quoteinterval('3 DAY') ); @@ -69,15 +88,34 @@ function queue_run($argv, $argc){ return; foreach($r as $rr) { + + $dresult = null; + if(in_array($rr['outq_posturl'],$deadguys)) continue; + $base = ''; + $h = parse_url($rr['outq_posturl']); + if($h) + $base = $h['scheme'] . '://' . $h['host'] . (($h['port']) ? ':' . $h['port'] : ''); + if($rr['outq_driver'] === 'post') { $result = z_post_url($rr['outq_posturl'],$rr['outq_msg']); if($result['success'] && $result['return_code'] < 300) { logger('queue: queue post success to ' . $rr['outq_posturl'], LOGGER_DEBUG); + if($base) { + q("update site set site_update = '%s', site_dead = 0 where site_url = '%s' ", + dbesc(datetime_convert()), + dbesc($base) + ); + } + q("update dreport set dreport_result = '%s', dreport_time = '%s' where dreport_queue = '%s' limit 1", + dbesc('accepted for delivery'), + dbesc(datetime_convert()), + dbesc($rr['outq_hash']) + ); $y = q("delete from outq where outq_hash = '%s'", - dbesc($rr['ouq_hash']) + dbesc($rr['outq_hash']) ); } else { @@ -86,6 +124,7 @@ function queue_run($argv, $argc){ dbesc(datetime_convert()), dbesc($rr['outq_hash']) ); + $deadguys[] = $rr['outq_posturl']; } continue; } diff --git a/sources/include/security.php b/sources/include/security.php index 7cc93fc0..9a25d9e0 100644 --- a/sources/include/security.php +++ b/sources/include/security.php @@ -245,6 +245,9 @@ function item_permissions_sql($owner_id, $remote_observer = null) { $observer = (($remote_observer) ? $remote_observer : get_observer_hash()); if($observer) { + + $s = scopes_sql($owner_id,$observer); + $groups = init_groups_visitor($observer); $gs = '<<>>'; // should be impossible to match @@ -255,9 +258,9 @@ function item_permissions_sql($owner_id, $remote_observer = null) { } $regexop = db_getfunc('REGEXP'); $sql = sprintf( - " AND ( NOT (deny_cid like '%s' OR deny_gid $regexop '%s') - AND ( allow_cid like '%s' OR allow_gid $regexop '%s' OR ( allow_cid = '' AND allow_gid = '') ) - ) + " AND (( NOT (deny_cid like '%s' OR deny_gid $regexop '%s') + AND ( allow_cid like '%s' OR allow_gid $regexop '%s' OR ( allow_cid = '' AND allow_gid = '' AND item_private = 0 )) + ) OR ( item_private = 1 $s )) ", dbesc(protect_sprintf( '%<' . $observer . '>%')), dbesc($gs), @@ -270,6 +273,39 @@ function item_permissions_sql($owner_id, $remote_observer = null) { return $sql; } +/** + * Remote visitors also need to be checked against the public_scope parameter if item_private is set. + * This function checks the various permutations of that field for any which apply to this observer. + * + */ + + + +function scopes_sql($uid,$observer) { + $str = " and ( public_policy = 'authenticated' "; + if(! is_foreigner($observer)) + $str .= " or public_policy = 'network: red' "; + if(local_channel()) + $str .= " or public_policy = 'site: " . get_app()->get_hostname() . "' "; + + $ab = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1", + dbesc($observer), + intval($uid) + ); + if(! $ab) + return $str . " ) "; + if($ab[0]['abook_pending']) + $str .= " or public_policy = 'any connections' "; + $str .= " or public_policy = 'contacts' ) "; + return $str; +} + + + + + + + /** * @param string $observer_hash * @@ -291,7 +327,7 @@ function public_permissions_sql($observer_hash) { $regexop = db_getfunc('REGEXP'); $sql = sprintf( " OR (( NOT (deny_cid like '%s' OR deny_gid $regexop '%s') - AND ( allow_cid like '%s' OR allow_gid $regexop '%s' OR ( allow_cid = '' AND allow_gid = '') ) + AND ( allow_cid like '%s' OR allow_gid $regexop '%s' OR ( allow_cid = '' AND allow_gid = '' AND item_private = 0 ) ) )) ", dbesc(protect_sprintf( '%<' . $observer_hash . '>%')), diff --git a/sources/include/session.php b/sources/include/session.php index 31b3f061..92004bc1 100644 --- a/sources/include/session.php +++ b/sources/include/session.php @@ -98,9 +98,6 @@ function ref_session_destroy ($id) { function ref_session_gc($expire) { q("DELETE FROM session WHERE expire < %d", dbesc(time())); - if (! get_config('system', 'innodb')) - db_optimizetable('session'); - return true; } diff --git a/sources/include/taxonomy.php b/sources/include/taxonomy.php index b57cfc5c..e68b9659 100644 --- a/sources/include/taxonomy.php +++ b/sources/include/taxonomy.php @@ -185,7 +185,7 @@ function dir_tagadelic($count = 0) { $count = intval($count); // Fetch tags - $r = q("select xtag_term, count(xtag_term) as total from xtag + $r = q("select xtag_term, count(xtag_term) as total from xtag where xtag_flags = 0 group by xtag_term order by total desc %s", ((intval($count)) ? "limit $count" : '') ); @@ -341,7 +341,7 @@ function get_things($profile_hash,$uid) { $sql_extra = (($profile_hash) ? " and obj_page = '" . $profile_hash . "' " : ''); - $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and uid = %d and obj_type = %d $sql_extra order by obj_verb, term", + $r = q("select * from obj where obj_channel = %d and obj_type = %d $sql_extra order by obj_verb, obj_term", intval($uid), intval(TERM_OBJ_THING) ); @@ -357,8 +357,8 @@ function get_things($profile_hash,$uid) { foreach($r as $rr) { $rr['profile_name'] = ''; - if(! in_array($rr['term_hash'],$profile_hashes)) - $profile_hashes[] = $rr['term_hash']; + if(! in_array($rr['obj_obj'],$profile_hashes)) + $profile_hashes[] = $rr['obj_obj']; } stringify_array_elms($profile_hashes); if(! $profile_hash) { @@ -390,7 +390,7 @@ function get_things($profile_hash,$uid) { $l = q("select xchan_name, xchan_url from likes left join xchan on likee = xchan_hash where target_type = '%s' and target_id = '%s' and channel_id = %d", dbesc(ACTIVITY_OBJ_THING), - dbesc($rr['term_hash']), + dbesc($rr['obj_obj']), intval($uid) ); @@ -400,7 +400,7 @@ function get_things($profile_hash,$uid) { if(! $things[$rr['obj_verb']]) $things[$rr['obj_verb']] = array(); - $things[$rr['obj_verb']][] = array('term' => $rr['term'],'url' => $rr['url'],'img' => $rr['imgurl'], 'profile' => $rr['profile_name'],'term_hash' => $rr['term_hash'], 'likes' => $l,'like_count' => count($l),'like_label' => tt('Like','Likes',count($l),'noun')); + $things[$rr['obj_verb']][] = array('term' => $rr['obj_term'],'url' => $rr['obj_url'],'img' => $rr['obj_imgurl'], 'profile' => $rr['profile_name'],'term_hash' => $rr['obj_obj'], 'likes' => $l,'like_count' => count($l),'like_label' => tt('Like','Likes',count($l),'noun')); } $sorted_things = array(); if($things) { diff --git a/sources/include/text.php b/sources/include/text.php index f27a9ce6..11062a1b 100644 --- a/sources/include/text.php +++ b/sources/include/text.php @@ -72,10 +72,6 @@ function notags($string) { // return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string)); } -// use this on "body" or "content" input where angle chars shouldn't be removed, -// and allow them to be safely displayed. - - /** * use this on "body" or "content" input where angle chars shouldn't be removed, @@ -458,63 +454,7 @@ function alt_pager(&$a, $i, $more = '', $less = '') { } -/** - * @brief Turn user/group ACLs stored as angle bracketed text into arrays. - * - * turn string array of angle-bracketed elements into string array - * e.g. "<123xyz><246qyo>" => array(123xyz,246qyo,sxo33e); - * - * @param string $s - * @return array - */ -function expand_acl($s) { - $ret = array(); - if(strlen($s)) { - $t = str_replace('<','',$s); - $a = explode('>',$t); - foreach($a as $aa) { - if($aa) - $ret[] = $aa; - } - } - - return $ret; -} - -/** - * @brief Used to wrap ACL elements in angle brackets for storage. - * - * @param[in,out] array &$item - */ -function sanitise_acl(&$item) { - if (strlen($item)) - $item = '<' . notags(trim($item)) . '>'; - else - unset($item); -} - -/** - * @brief Convert an ACL array to a storable string. - * - * @param array $p - * @return array - */ -function perms2str($p) { - $ret = ''; - - if (is_array($p)) - $tmp = $p; - else - $tmp = explode(',', $p); - - if (is_array($tmp)) { - array_walk($tmp, 'sanitise_acl'); - $ret = implode('', $tmp); - } - - return $ret; -} /** * @brief Generate a guaranteed unique (for this domain) item ID for ATOM. @@ -1276,36 +1216,15 @@ function theme_attachments(&$item) { if(is_array($arr) && count($arr)) { $attaches = array(); foreach($arr as $r) { - $icon = ''; - $icontype = substr($r['type'],0,strpos($r['type'],'/')); - /** - * @FIXME This should probably be a giant "if" statement in the - * template so that we don't have icon names embedded in php code. - */ - - switch($icontype) { - case 'video': - $icon = 'icon-facetime-video'; - break; - case 'audio': - $icon = 'icon-volume-up'; - break; - case 'image': - $icon = 'icon-picture'; - break; - case 'text': - $icon = 'icon-align-justify'; - break; - default: - $icon = 'icon-question'; - break; - } - - $title = htmlspecialchars($r['title'], ENT_COMPAT,'UTF-8'); - if(! $title) - $title = t('unknown.???'); - $title .= ' ' . (($r['length']) ? $r['length'] . ' ' . t('bytes') : ''); + $icon = getIconFromType($r['type']); + $label = (($r['title']) ? urldecode(htmlspecialchars($r['title'], ENT_COMPAT, 'UTF-8')) : t('Unknown Attachment')); + + //some feeds provide an attachment where title an empty space + if($label == ' ') + $label = t('Unknown Attachment'); + + $title = t('Attachment') . ' - ' . (($r['length']) ? userReadableSize($r['length']) : t('Size Unknown')); require_once('include/identity.php'); if(is_foreigner($item['author_xchan'])) @@ -1313,14 +1232,14 @@ function theme_attachments(&$item) { else $url = z_root() . '/magic?f=&hash=' . $item['author_xchan'] . '&dest=' . $r['href'] . '/' . $r['revision']; - $s .= '' . $icon . ''; - $attaches[] = array('title' => $title, 'url' => $url, 'icon' => $icon ); + //$s .= '' . $icon . ''; + $attaches[] = array('label' => $label, 'url' => $url, 'icon' => $icon, 'title' => $title); } - } - $s = replace_macros(get_markup_template('item_attach.tpl'), array( - '$attaches' => $attaches - )); + $s = replace_macros(get_markup_template('item_attach.tpl'), array( + '$attaches' => $attaches + )); + } return $s; } @@ -1339,11 +1258,12 @@ function format_categories(&$item,$writeable) { $removelink = (($writeable) ? z_root() . '/filerm/' . $item['id'] . '?f=&cat=' . urlencode($t['term']) : ''); $categories[] = array('term' => $term, 'writeable' => $writeable, 'removelink' => $removelink, 'url' => zid($t['url'])); } + + $s = replace_macros(get_markup_template('item_categories.tpl'),array( + '$remove' => t('remove category'), + '$categories' => $categories + )); } - $s = replace_macros(get_markup_template('item_categories.tpl'),array( - '$remove' => t('remove category'), - '$categories' => $categories - )); return $s; } @@ -1354,6 +1274,7 @@ function format_categories(&$item,$writeable) { * @param[in] array &$item * @return string HTML link of hashtag */ + function format_hashtags(&$item) { $s = ''; @@ -1414,11 +1335,12 @@ function format_filer(&$item) { $removelink = z_root() . '/filerm/' . $item['id'] . '?f=&term=' . urlencode($t['term']); $categories[] = array('term' => $term, 'removelink' => $removelink); } + + $s = replace_macros(get_markup_template('item_filer.tpl'),array( + '$remove' => t('remove from file'), + '$categories' => $categories + )); } - $s = replace_macros(get_markup_template('item_filer.tpl'),array( - '$remove' => t('remove from file'), - '$categories' => $categories - )); return $s; } @@ -1441,6 +1363,7 @@ function generate_named_map($location) { function prepare_body(&$item,$attach = false) { + require_once('include/identity.php'); // if($item['html']) { // $s = bb_observer($item['html']); @@ -1451,9 +1374,24 @@ function prepare_body(&$item,$attach = false) { $s = prepare_text($item['body'],$item['mimetype'], false); // } - $prep_arr = array('item' => $item, 'html' => $s); + $is_photo = (($item['obj_type'] === ACTIVITY_OBJ_PHOTO) ? true : false); + $photo = ''; + + if($is_photo) { + $object = json_decode($item['object'],true); + $photo = ''; + } + + $prep_arr = array( + 'item' => $item, + 'html' => $s, + 'photo' => $photo + ); + call_hooks('prepare_body', $prep_arr); + $s = $prep_arr['html']; + $photo = $prep_arr['photo']; // q("update item set html = '%s' where id = %d", // dbesc($s), @@ -1469,21 +1407,21 @@ function prepare_body(&$item,$attach = false) { if($x) { $s = preg_replace('/\
/','$0' . $x,$s); } - } + } - $s .= theme_attachments($item); + $attachments = theme_attachments($item); $writeable = ((get_observer_hash() == $item['owner_xchan']) ? true : false); - $s .= format_hashtags($item); + $tags = format_hashtags($item); if($item['resource_type']) - $s .= format_mentions($item); + $mentions = format_mentions($item); - $s .= format_categories($item,$writeable); + $categories = format_categories($item,$writeable); if(local_channel() == $item['uid']) - $s .= format_filer($item); + $filer = format_filer($item); $s = sslify($s); @@ -1516,9 +1454,22 @@ function prepare_body(&$item,$attach = false) { $s = substr($s, 0, $pos).$authorreplace.substr($s, $pos+strlen($authorsearch)); } - $prep_arr = array('item' => $item, 'html' => $s); + $prep_arr = array( + 'item' => $item, + 'photo' => $photo, + 'html' => $s, + 'categories' => $categories, + 'folders' => $filer, + 'tags' => $tags, + 'mentions' => $mentions, + 'attachments' => $attachments + ); + call_hooks('prepare_body_final', $prep_arr); - return $prep_arr['html']; + + unset($prep_arr['item']); + + return $prep_arr; } /** @@ -1746,14 +1697,14 @@ function mimetype_select($channel_id, $current = 'text/bbcode') { function lang_selector() { global $a; - $langs = glob('view/*/strings.php'); + $langs = glob('view/*/hstrings.php'); $lang_options = array(); $selected = ""; if(is_array($langs) && count($langs)) { $langs[] = ''; - if(! in_array('view/en/strings.php',$langs)) + if(! in_array('view/en/hstrings.php',$langs)) $langs[] = 'view/en/'; asort($langs); foreach($langs as $l) { @@ -2035,15 +1986,15 @@ function xchan_query(&$items,$abook = true,$effective_uid = 0) { if(count($arr)) { if($abook) { $chans = q("select * from xchan left join hubloc on hubloc_hash = xchan_hash left join abook on abook_xchan = xchan_hash and abook_channel = %d - where xchan_hash in (" . implode(',', $arr) . ") and hubloc_primary = 1", + where xchan_hash in (" . protect_sprintf(implode(',', $arr)) . ") and hubloc_primary = 1", intval($item['uid']) ); } else { $chans = q("select xchan.*,hubloc.* from xchan left join hubloc on hubloc_hash = xchan_hash - where xchan_hash in (" . implode(',', $arr) . ") and hubloc_primary = 1"); + where xchan_hash in (" . protect_sprintf(implode(',', $arr)) . ") and hubloc_primary = 1"); } - $xchans = q("select * from xchan where xchan_hash in (" . implode(',',$arr) . ") and xchan_network in ('rss','unknown')"); + $xchans = q("select * from xchan where xchan_hash in (" . protect_sprintf(implode(',',$arr)) . ") and xchan_network in ('rss','unknown')"); if(! $chans) $chans = $xchans; else @@ -2281,7 +2232,7 @@ function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag, $d } if($tag == '#getzot') { $basetag = 'getzot'; - $url = 'https://redmatrix.me'; + $url = 'http://hubzilla.org'; $newtag = '#[zrl=' . $url . ']' . $basetag . '[/zrl]'; $body = str_replace($tag,$newtag,$body); $replaced = true; @@ -2550,6 +2501,7 @@ function linkify_tags($a, &$body, $uid, $diaspora = false) { * * @param string $type mime type * @return string + * @todo rename to get_icon_from_type() */ function getIconFromType($type) { $iconMap = array( @@ -2602,6 +2554,7 @@ function getIconFromType($type) { * * @param int $size filesize in bytes * @return string human readable formatted filesize + * @todo rename to user_readable_size() */ function userReadableSize($size) { $ret = ''; @@ -2624,3 +2577,47 @@ function str_rot47($str) { '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~', 'PQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO'); } + + +function string_replace($old,$new,&$s) { + + $x = str_replace($old,$new,$s); + $replaced = false; + if($x !== $s) { + $replaced = true; + } + $s = $x; + return $replaced; +} + + +function json_url_replace($old,$new,&$s) { + + $old = str_replace('/','\\/',$old); + $new = str_replace('/','\\/',$new); + + $x = str_replace($old,$new,$s); + $replaced = false; + if($x !== $s) { + $replaced = true; + } + $s = $x; + return $replaced; +} + + +function item_url_replace($channel,&$item,$old,$new) { + + if($item['attach']) + json_url_replace($old,$new,$item['attach']); + if($item['object']) + json_url_replace($old,$new,$item['object']); + if($item['target']) + json_url_replace($old,$new,$item['target']); + + if(string_replace($old,$new,$item['body'])) { + $item['sig'] = base64url_encode(rsa_sign($item['body'],$channel['channel_prvkey'])); + $item['item_verified'] = 1; + } + +} diff --git a/sources/include/widgets.php b/sources/include/widgets.php index 5e70730a..3e6fdb04 100644 --- a/sources/include/widgets.php +++ b/sources/include/widgets.php @@ -562,13 +562,23 @@ function widget_mailmenu($arr) { return; $a = get_app(); + return replace_macros(get_markup_template('message_side.tpl'), array( - '$title' => t('Messages'), - '$tabs'=> array(), - '$check'=>array( - 'label' => t('Check Mail'), - 'url' => $a->get_baseurl(true) . '/message', - 'sel' => (argv(1) == ''), + '$title' => t('Private Mail Menu'), + '$combined'=>array( + 'label' => t('Combined View'), + 'url' => $a->get_baseurl(true) . '/mail/combined', + 'sel' => (argv(1) == 'combined'), + ), + '$inbox'=>array( + 'label' => t('Inbox'), + 'url' => $a->get_baseurl(true) . '/mail/inbox', + 'sel' => (argv(1) == 'inbox'), + ), + '$outbox'=>array( + 'label' => t('Outbox'), + 'url' => $a->get_baseurl(true) . '/mail/outbox', + 'sel' => (argv(1) == 'outbox'), ), '$new'=>array( 'label' => t('New Message'), @@ -578,6 +588,80 @@ function widget_mailmenu($arr) { )); } + +function widget_conversations($arr) { + if (! local_channel()) + return; + + $a = get_app(); + + if(argc() > 1) { + + switch(argv(1)) { + case 'combined': + $mailbox = 'combined'; + $header = t('Conversations'); + break; + case 'inbox': + $mailbox = 'inbox'; + $header = t('Received Messages'); + break; + case 'outbox': + $mailbox = 'outbox'; + $header = t('Sent Messages'); + break; + default: + $mailbox = 'combined'; + $header = t('Conversations'); + break; + } + + require_once('include/message.php'); + + // private_messages_list() can do other more complicated stuff, for now keep it simple + $r = private_messages_list(local_channel(), $mailbox, $a->pager['start'], $a->pager['itemspage']); + + if(! $r) { + info( t('No messages.') . EOL); + return $o; + } + + $messages = array(); + + foreach($r as $rr) { + + $messages[] = array( + 'mailbox' => $mailbox, + 'id' => $rr['id'], + 'from_name' => $rr['from']['xchan_name'], + 'from_url' => chanlink_hash($rr['from_xchan']), + 'from_photo' => $rr['from']['xchan_photo_s'], + 'to_name' => $rr['to']['xchan_name'], + 'to_url' => chanlink_hash($rr['to_xchan']), + 'to_photo' => $rr['to']['xchan_photo_s'], + 'subject' => (($rr['seen']) ? $rr['title'] : '' . $rr['title'] . ''), + 'delete' => t('Delete conversation'), + 'body' => $rr['body'], + 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')), + 'seen' => $rr['seen'], + 'selected' => ((argv(2)) ? (argv(2) == $rr['id']) : ($r[0]['id'] == $rr['id'])) + ); + } + + $tpl = get_markup_template('mail_head.tpl'); + $o .= replace_macros($tpl, array( + '$header' => $header, + '$messages' => $messages + )); + + $o .= alt_pager($a,count($r)); + + } + + return $o; +} + + function widget_design_tools($arr) { $a = get_app(); @@ -594,6 +678,7 @@ function widget_design_tools($arr) { return design_tools(); } + function widget_findpeople($arr) { return findpeople_widget(); } @@ -1007,7 +1092,9 @@ function widget_forums($arr) { $perms_sql = item_permissions_sql(local_channel()) . item_normal(); - $r1 = q("select * from abook left join xchan on abook_xchan = xchan_hash where xchan_pubforum = 1 and abook_channel = %d order by xchan_name $limit ", + $r1 = q("select * from abook left join xchan on abook_xchan = xchan_hash where ( xchan_pubforum = 1 or ((abook_their_perms & %d ) != 0 and (abook_their_perms & %d ) = 0) ) and abook_channel = %d order by xchan_name $limit ", + intval(PERMS_W_TAGWALL), + intval(PERMS_W_STREAM), intval(local_channel()) ); if(! $r1) @@ -1034,7 +1121,7 @@ function widget_forums($arr) { foreach($r1 as $rr) { if($unseen && (! intval($rr['unseen']))) continue; - $o .= '
  • ' . ((intval($rr['unseen'])) ? intval($rr['unseen']) : '') . ' ' . $rr['xchan_name'] . '
  • '; + $o .= '
  • ' . ((intval($rr['unseen'])) ? intval($rr['unseen']) : '') . ' ' . $rr['xchan_name'] . '
  • '; } $o .= '
    '; } @@ -1063,3 +1150,74 @@ function widget_tasklist($arr) { } + +function widget_helpindex($arr) { + $o .= '
    ' . '

    ' . t('Documentation') . '

    '; + $o .= '
    '; + return $o; + +} + + + +function widget_admin($arr) { + + /* + * Side bar links + */ + + if(! is_site_admin()) { + return login(false); + } + + + $a = get_app(); + $o = ''; + + // array( url, name, extra css classes ) + + $aside = array( + 'site' => array(z_root() . '/admin/site/', t('Site'), 'site'), + 'users' => array(z_root() . '/admin/users/', t('Accounts'), 'users'), + 'channels' => array(z_root() . '/admin/channels/', t('Channels'), 'channels'), + 'plugins' => array(z_root() . '/admin/plugins/', t('Plugins'), 'plugins'), + 'themes' => array(z_root() . '/admin/themes/', t('Themes'), 'themes'), + 'queue' => array(z_root() . '/admin/queue', t('Inspect queue'), 'queue'), + 'profs' => array(z_root() . '/admin/profs', t('Profile Config'), 'profs'), + 'dbsync' => array(z_root() . '/admin/dbsync/', t('DB updates'), 'dbsync') + + ); + + /* get plugins admin page */ + + $r = q("SELECT * FROM addon WHERE plugin_admin = 1"); + + $aside['plugins_admin'] = array(); + if($r) { + foreach ($r as $h){ + $plugin = $h['name']; + $aside['plugins_admin'][] = array(z_root() . '/admin/plugins/' . $plugin, $plugin, 'plugin'); + // temp plugins with admin + $a->plugins_admin[] = $plugin; + } + } + + $aside['logs'] = array(z_root() . '/admin/logs/', t('Logs'), 'logs'); + + $o .= replace_macros(get_markup_template('admin_aside.tpl'), array( + '$admin' => $aside, + '$admtxt' => t('Admin'), + '$plugadmtxt' => t('Plugin Features'), + '$logtxt' => t('Logs'), + '$h_pending' => t('User registrations waiting for confirmation'), + '$admurl'=> z_root() . '/admin/' + )); + + return $o; + +} diff --git a/sources/include/zot.php b/sources/include/zot.php index 17330838..793eb6b3 100644 --- a/sources/include/zot.php +++ b/sources/include/zot.php @@ -11,6 +11,7 @@ require_once('include/crypto.php'); require_once('include/items.php'); require_once('include/hubloc.php'); +require_once('include/DReport.php'); /** @@ -294,12 +295,26 @@ function zot_refresh($them, $channel = null, $force = false) { if ($them['hubloc_url']) { $url = $them['hubloc_url']; } else { - $r = q("select hubloc_url, hubloc_flags from hubloc where hubloc_hash = '%s'", - dbesc($them['xchan_hash']) - ); + $r = null; + + // if they re-installed the server we could end up with the wrong record - pointing to the old install. + // We'll order by reverse id to try and pick off the newest one first and hopefully end up with the + // correct hubloc. If this doesn't work we may have to re-write this section to try them all. + + if(array_key_exists('xchan_addr',$them) && $them['xchan_addr']) { + $r = q("select hubloc_url, hubloc_primary from hubloc where hubloc_addr = '%s' order by hubloc_id desc", + dbesc($them['xchan_addr']) + ); + } + if(! $r) { + $r = q("select hubloc_url, hubloc_primary from hubloc where hubloc_hash = '%s' order by hubloc_id desc", + dbesc($them['xchan_hash']) + ); + } + if ($r) { foreach ($r as $rr) { - if ($rr['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) { + if (intval($rr['hubloc_primary'])) { $url = $rr['hubloc_url']; break; } @@ -384,11 +399,6 @@ function zot_refresh($them, $channel = null, $force = false) { } } - $r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 limit 1", - dbesc($x['hash']), - intval($channel['channel_id']) - ); - if(array_key_exists('profile',$j) && array_key_exists('next_birthday',$j['profile'])) { $next_birthday = datetime_convert('UTC','UTC',$j['profile']['next_birthday']); } @@ -396,8 +406,15 @@ function zot_refresh($them, $channel = null, $force = false) { $next_birthday = NULL_DATE; } + $r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 limit 1", + dbesc($x['hash']), + intval($channel['channel_id']) + ); + if($r) { + // connection exists + // if the dob is the same as what we have stored (disregarding the year), keep the one // we have as we may have updated the year after sending a notification; and resetting // to the one we just received would cause us to create duplicated events. @@ -439,6 +456,9 @@ function zot_refresh($them, $channel = null, $force = false) { } } else { + + // new connection + $role = get_pconfig($channel['channel_id'],'system','permissions_role'); if($role) { $xx = get_role_perms($role); @@ -473,20 +493,17 @@ function zot_refresh($them, $channel = null, $force = false) { if($y) { logger("New introduction received for {$channel['channel_name']}"); $new_perms = get_all_perms($channel['channel_id'],$x['hash']); - if($new_perms != $previous_perms) { - // Send back a permissions update if permissions have changed - $z = q("select * from abook where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 limit 1", - dbesc($x['hash']), - intval($channel['channel_id']) - ); - if($z) - proc_run('php','include/notifier.php','permission_update',$z[0]['abook_id']); - } - $new_connection = q("select abook_id, abook_pending from abook where abook_channel = %d and abook_xchan = '%s' order by abook_created desc limit 1", - intval($channel['channel_id']), - dbesc($x['hash']) + + // Send a clone sync packet and a permissions update if permissions have changed + + $new_connection = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_xchan = '%s' and abook_channel = %d and abook_self = 0 order by abook_created desc limit 1", + dbesc($x['hash']), + intval($channel['channel_id']) ); + if($new_connection) { + if($new_perms != $previous_perms) + proc_run('php','include/notifier.php','permission_create',$new_connection[0]['abook_id']); require_once('include/enotify.php'); notification(array( 'type' => NOTIFY_INTRO, @@ -494,12 +511,17 @@ function zot_refresh($them, $channel = null, $force = false) { 'to_xchan' => $channel['channel_hash'], 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id'], )); - } + + if($their_perms & PERMS_R_STREAM) { + if(($channel['channel_w_stream'] & PERMS_PENDING) + || (! intval($new_connection[0]['abook_pending'])) ) + proc_run('php','include/onepoll.php',$new_connection[0]['abook_id']); + } - if($new_connection && ($their_perms & PERMS_R_STREAM)) { - if(($channel['channel_w_stream'] & PERMS_PENDING) - || (! intval($new_connection[0]['abook_pending'])) ) - proc_run('php','include/onepoll.php',$new_connection[0]['abook_id']); + unset($new_connection[0]['abook_id']); + unset($new_connection[0]['abook_account']); + unset($new_connection[0]['abook_channel']); + build_sync_packet($channel['channel_id'], array('abook' => $new_connection)); } } } @@ -527,7 +549,7 @@ function zot_refresh($them, $channel = null, $force = false) { * @returns array|null null if site is blacklisted or not found, otherwise an * array with an hubloc record */ -function zot_gethub($arr) { +function zot_gethub($arr,$multiple = false) { if($arr['guid'] && $arr['guid_sig'] && $arr['url'] && $arr['url_sig']) { @@ -546,18 +568,20 @@ function zot_gethub($arr) { return null; } + $limit = (($multiple) ? '' : ' limit 1 '); + $r = q("select * from hubloc where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_url = '%s' and hubloc_url_sig = '%s' - limit 1", + $limit", dbesc($arr['guid']), dbesc($arr['guid_sig']), dbesc($arr['url']), dbesc($arr['url_sig']) ); - if($r && count($r)) { + if($r) { logger('zot_gethub: found', LOGGER_DEBUG); - return $r[0]; + return (($multiple) ? $r : $r[0]); } } logger('zot_gethub: not found: ' . print_r($arr,true), LOGGER_DEBUG); @@ -801,7 +825,7 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { ); } } else { - $photos = import_profile_photo($arr['photo'], $xchan_hash); + $photos = import_xchan_photo($arr['photo'], $xchan_hash); } if ($photos) { if ($photos[4]) { @@ -878,7 +902,7 @@ function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) { $r = q("delete from xprof where xprof_hash = '%s'", dbesc($xchan_hash) ); - $r = q("delete from xtag where xtag_hash = '%s'", + $r = q("delete from xtag where xtag_hash = '%s' and xtag_flags = 0", dbesc($xchan_hash) ); } @@ -939,9 +963,28 @@ function zot_process_response($hub, $arr, $outq) { logger('zot_process_response: headers: ' . print_r($arr['header'],true), LOGGER_DATA); } + if(is_array($x) && array_key_exists('delivery_report',$x) && is_array($x['delivery_report'])) { + foreach($x['delivery_report'] as $xx) { + if(is_array($xx) && array_key_exists('message_id',$xx) && delivery_report_is_storable($xx)) { + q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ", + dbesc($xx['message_id']), + dbesc($xx['location']), + dbesc($xx['recipient']), + dbesc($xx['status']), + dbesc(datetime_convert($xx['date'])), + dbesc($xx['sender']) + ); + } + } + } + + q("delete from dreport where dreport_queue = '%s' limit 1", + dbesc($outq['outq_hash']) + ); + // update the timestamp for this site - q("update site set site_update = '%s' where site_url = '%s'", + q("update site set site_dead = 0, site_update = '%s' where site_url = '%s'", dbesc(datetime_convert()), dbesc(dirname($hub)) ); @@ -962,7 +1005,7 @@ function zot_process_response($hub, $arr, $outq) { ); } - logger('zot_process_response: ' . print_r($x,true), LOGGER_DATA); + logger('zot_process_response: ' . print_r($x,true), LOGGER_DEBUG); } /** @@ -986,27 +1029,38 @@ function zot_fetch($arr) { $url = $arr['sender']['url'] . $arr['callback']; - $ret_hub = zot_gethub($arr['sender']); - if(! $ret_hub) { + // set $multiple param on zot_gethub() to return all matching hubs + // This allows us to recover from re-installs when a redundant (but invalid) hubloc for + // this identity is widely dispersed throughout the network. + + $ret_hubs = zot_gethub($arr['sender'],true); + if(! $ret_hubs) { logger('zot_fetch: no hub: ' . print_r($arr['sender'],true)); return; } - $data = array( - 'type' => 'pickup', - 'url' => z_root(), - 'callback_sig' => base64url_encode(rsa_sign(z_root() . '/post',get_config('system','prvkey'))), - 'callback' => z_root() . '/post', - 'secret' => $arr['secret'], - 'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey'))) - ); + foreach($ret_hubs as $ret_hub) { + $data = array( + 'type' => 'pickup', + 'url' => z_root(), + 'callback_sig' => base64url_encode(rsa_sign(z_root() . '/post',get_config('system','prvkey'))), + 'callback' => z_root() . '/post', + 'secret' => $arr['secret'], + 'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey'))) + ); - $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey'])); + $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey'])); - $fetch = zot_zot($url,$datatosend); - $result = zot_import($fetch, $arr['sender']['url']); + $fetch = zot_zot($url,$datatosend); + + $result = zot_import($fetch, $arr['sender']['url']); + + if($result) + return $result; + } + + return; - return $result; } /** @@ -1045,6 +1099,12 @@ function zot_import($arr, $sender_url) { $data = json_decode(crypto_unencapsulate($data,get_config('system','prvkey')),true); } + if(! $data['success']) { + if($data['message']) + logger('remote pickup failed: ' . $data['message']); + return false; + } + $incoming = $data['pickup']; $return = array(); @@ -1498,6 +1558,8 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ $result = array(); + $result['site'] = z_root(); + // We've validated the sender. Now make sure that the sender is the owner or author if(! $public) { @@ -1507,18 +1569,40 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ } } + foreach($deliveries as $d) { $local_public = $public; + + $DR = new DReport(z_root(),$sender['hash'],$d['hash'],$arr['mid']); + $r = q("select * from channel where channel_hash = '%s' limit 1", dbesc($d['hash']) ); if(! $r) { - $result[] = array($d['hash'], 'recipients not found'); + $DR->update('recipient not found'); + $result[] = $DR->get(); continue; } $channel = $r[0]; + $DR->addto_recipient($channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>'); + + /** + * @FIXME: Somehow we need to block normal message delivery from our clones, as the delivered + * message doesn't have ACL information in it as the cloned copy does. That copy + * will normally arrive first via sync delivery, but this isn't guaranteed. + * There's a chance the current delivery could take place before the cloned copy arrives + * hence the item could have the wrong ACL and *could* be used in subsequent deliveries or + * access checks. So far all attempts at identifying this situation precisely + * have caused issues with delivery of relayed comments. + */ + +// if(($d['hash'] === $sender['hash']) && ($sender['url'] !== z_root()) && (! $relay)) { +// $DR->update('self delivery ignored'); +// $result[] = $DR->get(); +// continue; +// } // allow public postings to the sys channel regardless of permissions, but not // for comments travelling upstream. Wait and catch them on the way down. @@ -1554,7 +1638,8 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ if((! perm_is_allowed($channel['channel_id'],$sender['hash'],$perm)) && (! $tag_delivery) && (! $local_public)) { logger("permission denied for delivery to channel {$channel['channel_id']} {$channel['channel_address']}"); - $result[] = array($d['hash'],'permission denied',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update('permission denied'); + $result[] = $DR->get(); continue; } @@ -1571,7 +1656,8 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ intval($channel['channel_id']) ); if(! $r) { - $result[] = array($d['hash'],'comment parent not found',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update('comment parent not found'); + $result[] = $DR->get(); // We don't seem to have a copy of this conversation or at least the parent // - so request a copy of the entire conversation to date. @@ -1626,7 +1712,8 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ if($last_hop && $last_hop != $sender['hash']) { logger('comment route mismatch: parent route = ' . $r[0]['route'] . ' expected = ' . $current_route, LOGGER_DEBUG); logger('comment route mismatch: parent msg = ' . $r[0]['id'],LOGGER_DEBUG); - $result[] = array($d['hash'],'comment route mismatch',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update('comment route mismatch'); + $result[] = $DR->get(); continue; } @@ -1637,10 +1724,9 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ } } - - $ab = q("select abook.* from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d - and abook_self = 0", - intval($channel['channel_id']) + $ab = q("select * from abook where abook_channel = %d and abook_xchan = '%s'", + intval($channel['channel_id']), + dbesc($arr['owner_xchan']) ); $abook = (($ab) ? $ab[0] : null); @@ -1656,12 +1742,14 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ $arr['uid'] = $channel['channel_id']; $item_id = delete_imported_item($sender,$arr,$channel['channel_id'],$relay); - $result[] = array($d['hash'],(($item_id) ? 'deleted' : 'delete_failed'),$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update(($item_id) ? 'deleted' : 'delete_failed'); + $result[] = $DR->get(); if($relay && $item_id) { logger('process_delivery: invoking relay'); proc_run('php','include/notifier.php','relay',intval($item_id)); - $result[] = array($d['hash'],'relayed',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update('relayed'); + $result[] = $DR->get(); } continue; @@ -1677,7 +1765,9 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ if(intval($r[0]['item_deleted'])) { // It was deleted locally. - $result[] = array($d['hash'],'update ignored',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update('update ignored'); + $result[] = $DR->get(); + continue; } // Maybe it has been edited? @@ -1685,17 +1775,21 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ $arr['id'] = $r[0]['id']; $arr['uid'] = $channel['channel_id']; if(($arr['mid'] == $arr['parent_mid']) && (! post_is_importable($arr,$abook))) { - $result[] = array($d['hash'],'update ignored',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update('update ignored'); + $result[] = $DR->get(); } else { update_imported_item($sender,$arr,$r[0],$channel['channel_id']); - $result[] = array($d['hash'],'updated',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update('updated'); + $result[] = $DR->get(); if(! $relay) add_source_route($item_id,$sender['hash']); } } else { - $result[] = array($d['hash'],'update ignored',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update('update ignored'); + $result[] = $DR->get(); + // We need this line to ensure wall-to-wall comments are relayed (by falling through to the relay bit), // and at the same time not relay any other relayable posts more than once, because to do so is very wasteful. @@ -1716,7 +1810,8 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ $item_id = 0; if(($arr['mid'] == $arr['parent_mid']) && (! post_is_importable($arr,$abook))) { - $result[] = array($d['hash'],'post ignored',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update('post ignored'); + $result[] = $DR->get(); } else { $item_result = item_store($arr); @@ -1728,14 +1823,16 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $ if(! $relay) add_source_route($item_id,$sender['hash']); } - $result[] = array($d['hash'],(($item_id) ? 'posted' : 'storage failed:' . $item_result['message']),$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->update(($item_id) ? 'posted' : 'storage failed: ' . $item_result['message']); + $result[] = $DR->get(); } } if($relay && $item_id) { logger('process_delivery: invoking relay'); proc_run('php','include/notifier.php','relay',intval($item_id)); - $result[] = array($d['hash'],'relayed',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']); + $DR->addto_update('relayed'); + $result[] = $DR->get(); } } @@ -1863,8 +1960,7 @@ function delete_imported_item($sender, $item, $uid, $relay) { $item_found = false; $post_id = 0; - - $r = q("select id, item_deleted from item where ( author_xchan = '%s' or owner_xchan = '%s' or source_xchan = '%s' ) + $r = q("select id, author_xchan, owner_xchan, source_xchan, item_deleted from item where ( author_xchan = '%s' or owner_xchan = '%s' or source_xchan = '%s' ) and mid = '%s' and uid = %d limit 1", dbesc($sender['hash']), dbesc($sender['hash']), @@ -1872,6 +1968,7 @@ function delete_imported_item($sender, $item, $uid, $relay) { dbesc($item['mid']), intval($uid) ); + if ($r) { if ($r[0]['author_xchan'] === $sender['hash'] || $r[0]['owner_xchan'] === $sender['hash'] || $r[0]['source_xchan'] === $sender['hash']) $ownership_valid = true; @@ -1945,20 +2042,26 @@ function process_mail_delivery($sender, $arr, $deliveries) { } foreach($deliveries as $d) { + + $DR = new DReport(z_root(),$sender['hash'],$d['hash'],$arr['mid']); + $r = q("select * from channel where channel_hash = '%s' limit 1", dbesc($d['hash']) ); if(! $r) { - $result[] = array($d['hash'],'not found'); + $DR->update('recipient not found'); + $result[] = $DR->get(); continue; } $channel = $r[0]; + $DR->addto_recipient($channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>'); if(! perm_is_allowed($channel['channel_id'],$sender['hash'],'post_mail')) { logger("permission denied for mail delivery {$channel['channel_id']}"); - $result[] = array($d['hash'],'permission denied',$channel['channel_name'],$arr['mid']); + $DR->update('permission denied'); + $result[] = $DR->get(); continue; } @@ -1972,11 +2075,13 @@ function process_mail_delivery($sender, $arr, $deliveries) { intval($r[0]['id']), intval($channel['channel_id']) ); - $result[] = array($d['hash'],'mail recalled',$channel['channel_name'],$arr['mid']); + $DR->update('mail recalled'); + $result[] = $DR->get(); logger('mail_recalled'); } else { - $result[] = array($d['hash'],'duplicate mail received',$channel['channel_name'],$arr['mid']); + $DR->update('duplicate mail received'); + $result[] = $DR->get(); logger('duplicate mail received'); } continue; @@ -1985,7 +2090,8 @@ function process_mail_delivery($sender, $arr, $deliveries) { $arr['account_id'] = $channel['channel_account_id']; $arr['channel_id'] = $channel['channel_id']; $item_id = mail_store($arr); - $result[] = array($d['hash'],'mail delivered',$channel['channel_name'],$arr['mid']); + $DR->update('mail delivered'); + $result[] = $DR->get(); } } @@ -2207,7 +2313,7 @@ function sync_locations($sender, $arr, $absolute = false) { dbesc(datetime_convert()), intval($r[0]['hubloc_id']) ); - $r[0]['hubloc_flags'] = $r[0]['hubloc_flags'] ^ HUBLOC_FLAGS_PRIMARY; + $r[0]['hubloc_primary'] = intval($location['primary']); hubloc_change_primary($r[0]); $what .= 'primary_hub '; $changed = true; @@ -2227,7 +2333,7 @@ function sync_locations($sender, $arr, $absolute = false) { // Absolute sync - make sure the current primary is correctly reflected in the xchan $pr = hubloc_change_primary($r[0]); if($pr) { - $what .= 'xchan_primary'; + $what .= 'xchan_primary '; $changed = true; } } @@ -2306,6 +2412,9 @@ function sync_locations($sender, $arr, $absolute = false) { } } } + else { + logger('No locations to sync!'); + } $ret['change_message'] = $what; $ret['changed'] = $changed; @@ -2491,7 +2600,7 @@ function import_directory_profile($hash, $profile, $addr, $ud_flags = UPDATE_FLA function import_directory_keywords($hash, $keywords) { $existing = array(); - $r = q("select * from xtag where xtag_hash = '%s'", + $r = q("select * from xtag where xtag_hash = '%s' and xtag_flags = 0", dbesc($hash) ); @@ -2509,14 +2618,14 @@ function import_directory_keywords($hash, $keywords) { foreach($existing as $x) { if(! in_array($x, $clean)) - $r = q("delete from xtag where xtag_hash = '%s' and xtag_term = '%s'", + $r = q("delete from xtag where xtag_hash = '%s' and xtag_term = '%s' and xtag_flags = 0", dbesc($hash), dbesc($x) ); } foreach($clean as $x) { if(! in_array($x, $existing)) { - $r = q("insert into xtag ( xtag_hash, xtag_term) values ( '%s' ,'%s' )", + $r = q("insert into xtag ( xtag_hash, xtag_term, xtag_flags) values ( '%s' ,'%s', 0 )", dbesc($hash), dbesc($x) ); @@ -2630,6 +2739,7 @@ function import_site($arr, $pubkey) { $sellpage = htmlspecialchars($arr['sellpage'],ENT_COMPAT,'UTF-8',false); $site_location = htmlspecialchars($arr['location'],ENT_COMPAT,'UTF-8',false); $site_realm = htmlspecialchars($arr['realm'],ENT_COMPAT,'UTF-8',false); + $site_project = htmlspecialchars($arr['project'],ENT_COMPAT,'UTF-8',false); // You can have one and only one primary directory per realm. // Downgrade any others claiming to be primary. As they have @@ -2648,13 +2758,15 @@ function import_site($arr, $pubkey) { || ($siterecord['site_sellpage'] != $sellpage) || ($siterecord['site_location'] != $site_location) || ($siterecord['site_register'] != $register_policy) + || ($siterecord['site_project'] != $site_project) || ($siterecord['site_realm'] != $site_realm)) { $update = true; // logger('import_site: input: ' . print_r($arr,true)); // logger('import_site: stored: ' . print_r($siterecord,true)); - $r = q("update site set site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s', site_realm = '%s' + + $r = q("update site set site_dead = 0, site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s', site_realm = '%s', site_type = %d, site_project = '%s' where site_url = '%s'", dbesc($site_location), intval($site_directory), @@ -2664,6 +2776,8 @@ function import_site($arr, $pubkey) { dbesc(datetime_convert()), dbesc($sellpage), dbesc($site_realm), + intval(SITE_TYPE_ZOT), + dbesc($site_project), dbesc($url) ); if(! $r) { @@ -2672,7 +2786,7 @@ function import_site($arr, $pubkey) { } else { // update the timestamp to indicate we communicated with this site - q("update site set site_update = '%s' where site_url = '%s'", + q("update site set site_dead = 0, site_update = '%s' where site_url = '%s'", dbesc(datetime_convert()), dbesc($url) ); @@ -2680,8 +2794,9 @@ function import_site($arr, $pubkey) { } else { $update = true; - $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage, site_realm ) - values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s', '%s' )", + + $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage, site_realm, site_type, site_project ) + values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s', '%s', %d, '%s' )", dbesc($site_location), dbesc($url), intval($access_policy), @@ -2690,7 +2805,9 @@ function import_site($arr, $pubkey) { dbesc($directory_url), intval($register_policy), dbesc($sellpage), - dbesc($site_realm) + dbesc($site_realm), + intval(SITE_TYPE_ZOT), + dbesc($site_project) ); if(! $r) { logger('import_site: record create failed. ' . print_r($arr,true)); @@ -2732,7 +2849,10 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { $channel = $r[0]; - $h = q("select * from hubloc where hubloc_hash = '%s'", + if(intval($channel['channel_removed'])) + return; + + $h = q("select * from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0", dbesc($channel['channel_hash']) ); @@ -2782,7 +2902,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { // don't pass these elements, they should not be synchronised - $disallowed = array('channel_id','channel_account_id','channel_primary','channel_prvkey','channel_address'); + $disallowed = array('channel_id','channel_account_id','channel_primary','channel_prvkey','channel_address','channel_deleted','channel_removed','channel_system'); if(in_array($k,$disallowed)) continue; @@ -2842,6 +2962,8 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) { */ function process_channel_sync_delivery($sender, $arr, $deliveries) { + require_once('include/import.php'); + /** @FIXME this will sync red structures (channel, pconfig and abook). Eventually we need to make this application agnostic. */ $result = array(); @@ -2874,13 +2996,55 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) { } } + if(array_key_exists('obj',$arr) && $arr['obj']) + sync_objs($channel,$arr['obj']); + + if(array_key_exists('likes',$arr) && $arr['likes']) + import_likes($channel,$arr['likes']); + + if(array_key_exists('app',$arr) && $arr['app']) + sync_apps($channel,$arr['app']); + + if(array_key_exists('chatroom',$arr) && $arr['chatroom']) + sync_chatrooms($channel,$arr['chatroom']); + + if(array_key_exists('conv',$arr) && $arr['conv']) + import_conv($channel,$arr['conv']); + + if(array_key_exists('mail',$arr) && $arr['mail']) + import_mail($channel,$arr['mail']); + + if(array_key_exists('event',$arr) && $arr['event']) + sync_events($channel,$arr['event']); + + if(array_key_exists('event_item',$arr) && $arr['event_item']) + sync_items($channel,$arr['event_item']); + + if(array_key_exists('item',$arr) && $arr['item']) + sync_items($channel,$arr['item']); + + if(array_key_exists('item_id',$arr) && $arr['item_id']) + sync_items($channel,$arr['item_id']); + + if(array_key_exists('menu',$arr) && $arr['menu']) + sync_menus($channel,$arr['menu']); + if(array_key_exists('channel',$arr) && is_array($arr['channel']) && count($arr['channel'])) { - if(array_key_exists('channel_page_flags',$arr['channel']) && intval($arr['channel']['channel_pageflags'])) { - $arr['channel']['channel_removed'] = (($arr['channel']['channel_pageflags'] & 0x8000) ? 1 : 0); - $arr['channel']['channel_system'] = (($arr['channel']['channel_pageflags'] & 0x1000) ? 1 : 0); + + if(array_key_exists('channel_pageflags',$arr['channel']) && intval($arr['channel']['channel_pageflags'])) { + // These flags cannot be sync'd. + // remove the bits from the incoming flags. + + // These correspond to PAGE_REMOVED and PAGE_SYSTEM on redmatrix + + if($arr['channel']['channel_pageflags'] & 0x8000) + $arr['channel']['channel_pageflags'] = $arr['channel']['channel_pageflags'] - 0x8000; + if($arr['channel']['channel_pageflags'] & 0x1000) + $arr['channel']['channel_pageflags'] = $arr['channel']['channel_pageflags'] - 0x1000; + } - $disallowed = array('channel_id','channel_account_id','channel_primary','channel_prvkey', 'channel_address', 'channel_notifyflags'); + $disallowed = array('channel_id','channel_account_id','channel_primary','channel_prvkey', 'channel_address', 'channel_notifyflags', 'channel_removed', 'channel_deleted', 'channel_system'); $clean = array(); foreach($arr['channel'] as $k => $v) { @@ -2911,6 +3075,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) { $total_feeds ++; } + $disallowed = array('abook_id','abook_account','abook_channel','abook_rating','abook_rating_text'); foreach($arr['abook'] as $abook) { @@ -2999,7 +3164,6 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) { foreach($clean as $k => $v) { if($k == 'abook_dob') $v = dbescdate($v); - $r = dbq("UPDATE abook set " . dbesc($k) . " = '" . dbesc($v) . "' where abook_xchan = '" . dbesc($clean['abook_xchan']) . "' and abook_channel = " . intval($channel['channel_id'])); } @@ -3192,7 +3356,29 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) { } } - $result[] = array($d['hash'],'channel sync updated',$channel['channel_name'],''); + + if(array_key_exists('item',$arr) && $arr['item']) + sync_items($channel,$arr['item']); + + if(array_key_exists('item_id',$arr) && $arr['item_id']) + sync_items($channel,$arr['item_id']); + + $addon = array('channel' => $channel,'data' => $arr); + call_hooks('process_channel_sync_delivery',$addon); + + // we should probably do this for all items, but usually we only send one. + + require_once('include/DReport.php'); + + if(array_key_exists('item',$arr) && is_array($arr['item'][0])) { + $DR = new DReport(z_root(),$d['hash'],$d['hash'],$arr['item'][0]['message_id'],'channel sync processed'); + $DR->addto_recipient($channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>'); + } + else + $DR = new DReport(z_root(),$d['hash'],$d['hash'],'sync packet','channel sync delivered'); + + $result[] = $DR->get(); + } return $result; @@ -3347,3 +3533,401 @@ function zot_process_message_request($data) { return $ret; } + + +function zotinfo($arr) { + + $ret = array('success' => false); + + $zhash = ((x($arr,'guid_hash')) ? $arr['guid_hash'] : ''); + $zguid = ((x($arr,'guid')) ? $arr['guid'] : ''); + $zguid_sig = ((x($arr,'guid_sig')) ? $arr['guid_sig'] : ''); + $zaddr = ((x($arr,'address')) ? $arr['address'] : ''); + $ztarget = ((x($arr,'target')) ? $arr['target'] : ''); + $zsig = ((x($arr,'target_sig')) ? $arr['target_sig'] : ''); + $zkey = ((x($arr,'key')) ? $arr['key'] : ''); + $mindate = ((x($arr,'mindate')) ? $arr['mindate'] : ''); + $feed = ((x($arr,'feed')) ? intval($arr['feed']) : 0); + + if($ztarget) { + if((! $zkey) || (! $zsig) || (! rsa_verify($ztarget,base64url_decode($zsig),$zkey))) { + logger('zfinger: invalid target signature'); + $ret['message'] = t("invalid target signature"); + return($ret); + } + } + + $r = null; + + if(strlen($zhash)) { + $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash + where channel_hash = '%s' limit 1", + dbesc($zhash) + ); + } + elseif(strlen($zguid) && strlen($zguid_sig)) { + $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash + where channel_guid = '%s' and channel_guid_sig = '%s' limit 1", + dbesc($zguid), + dbesc($zguid_sig) + ); + } + elseif(strlen($zaddr)) { + if(strpos($zaddr,'[system]') === false) { /* normal address lookup */ + $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash + where ( channel_address = '%s' or xchan_addr = '%s' ) limit 1", + dbesc($zaddr), + dbesc($zaddr) + ); + } + + else { + + /** + * The special address '[system]' will return a system channel if one has been defined, + * Or the first valid channel we find if there are no system channels. + * + * This is used by magic-auth if we have no prior communications with this site - and + * returns an identity on this site which we can use to create a valid hub record so that + * we can exchange signed messages. The precise identity is irrelevant. It's the hub + * information that we really need at the other end - and this will return it. + * + */ + + $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash + where channel_system = 1 order by channel_id limit 1"); + if(! $r) { + $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash + where channel_removed = 0 order by channel_id limit 1"); + } + } + } + else { + $ret['message'] = 'Invalid request'; + return($ret); + } + + if(! $r) { + $ret['message'] = 'Item not found.'; + return($ret); + } + + $e = $r[0]; + + $id = $e['channel_id']; + + $sys_channel = (intval($e['channel_system']) ? true : false); + $special_channel = (($e['channel_pageflags'] & PAGE_PREMIUM) ? true : false); + $adult_channel = (($e['channel_pageflags'] & PAGE_ADULT) ? true : false); + $censored = (($e['channel_pageflags'] & PAGE_CENSORED) ? true : false); + $searchable = (($e['channel_pageflags'] & PAGE_HIDDEN) ? false : true); + $deleted = (intval($e['xchan_deleted']) ? true : false); + + if($deleted || $censored || $sys_channel) + $searchable = false; + + $public_forum = false; + + $role = get_pconfig($e['channel_id'],'system','permissions_role'); + if($role === 'forum' || $role === 'repository') { + $public_forum = true; + } + else { + // check if it has characteristics of a public forum based on custom permissions. + $t = q("select abook_my_perms from abook where abook_channel = %d and abook_self = 1 limit 1", + intval($e['channel_id']) + ); + if(($t) && (($t[0]['abook_my_perms'] & PERMS_W_TAGWALL) && (! ($t[0]['abook_my_perms'] & PERMS_W_STREAM)))) + $public_forum = true; + } + + + // This is for birthdays and keywords, but must check access permissions + $p = q("select * from profile where uid = %d and is_default = 1", + intval($e['channel_id']) + ); + + $profile = array(); + + if($p) { + + if(! intval($p[0]['publish'])) + $searchable = false; + + $profile['description'] = $p[0]['pdesc']; + $profile['birthday'] = $p[0]['dob']; + if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],$e['channel_timezone'])) !== '')) + $profile['next_birthday'] = $bd; + + if($age = age($p[0]['dob'],$e['channel_timezone'],'')) + $profile['age'] = $age; + $profile['gender'] = $p[0]['gender']; + $profile['marital'] = $p[0]['marital']; + $profile['sexual'] = $p[0]['sexual']; + $profile['locale'] = $p[0]['locality']; + $profile['region'] = $p[0]['region']; + $profile['postcode'] = $p[0]['postal_code']; + $profile['country'] = $p[0]['country_name']; + $profile['about'] = $p[0]['about']; + $profile['homepage'] = $p[0]['homepage']; + $profile['hometown'] = $p[0]['hometown']; + + if($p[0]['keywords']) { + $tags = array(); + $k = explode(' ',$p[0]['keywords']); + if($k) { + foreach($k as $kk) { + if(trim($kk," \t\n\r\0\x0B,")) { + $tags[] = trim($kk," \t\n\r\0\x0B,"); + } + } + } + if($tags) + $profile['keywords'] = $tags; + } + } + + $ret['success'] = true; + + // Communication details + + $ret['guid'] = $e['xchan_guid']; + $ret['guid_sig'] = $e['xchan_guid_sig']; + $ret['key'] = $e['xchan_pubkey']; + $ret['name'] = $e['xchan_name']; + $ret['name_updated'] = $e['xchan_name_date']; + $ret['address'] = $e['xchan_addr']; + $ret['photo_mimetype'] = $e['xchan_photo_mimetype']; + $ret['photo'] = $e['xchan_photo_l']; + $ret['photo_updated'] = $e['xchan_photo_date']; + $ret['url'] = $e['xchan_url']; + $ret['connections_url']= (($e['xchan_connurl']) ? $e['xchan_connurl'] : z_root() . '/poco/' . $e['channel_address']); + $ret['target'] = $ztarget; + $ret['target_sig'] = $zsig; + $ret['searchable'] = $searchable; + $ret['adult_content'] = $adult_channel; + $ret['public_forum'] = $public_forum; + if($deleted) + $ret['deleted'] = $deleted; + + // premium or other channel desiring some contact with potential followers before connecting. + // This is a template - %s will be replaced with the follow_url we discover for the return channel. + + if($special_channel) + $ret['connect_url'] = z_root() . '/connect/' . $e['channel_address']; + + // This is a template for our follow url, %s will be replaced with a webbie + + $ret['follow_url'] = z_root() . '/follow?f=&url=%s'; + + $ztarget_hash = (($ztarget && $zsig) + ? make_xchan_hash($ztarget,$zsig) + : '' ); + + $permissions = get_all_perms($e['channel_id'],$ztarget_hash,false); + + if($ztarget_hash) { + $permissions['connected'] = false; + $b = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1", + dbesc($ztarget_hash), + intval($e['channel_id']) + ); + if($b) + $permissions['connected'] = true; + } + + $ret['permissions'] = (($ztarget && $zkey) ? crypto_encapsulate(json_encode($permissions),$zkey) : $permissions); + + if($permissions['view_profile']) + $ret['profile'] = $profile; + + // array of (verified) hubs this channel uses + + $x = zot_encode_locations($e); + if($x) + $ret['locations'] = $x; + + $ret['site'] = array(); + $ret['site']['url'] = z_root(); + $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),$e['channel_prvkey'])); + + $dirmode = get_config('system','directory_mode'); + if(($dirmode === false) || ($dirmode == DIRECTORY_MODE_NORMAL)) + $ret['site']['directory_mode'] = 'normal'; + + if($dirmode == DIRECTORY_MODE_PRIMARY) + $ret['site']['directory_mode'] = 'primary'; + elseif($dirmode == DIRECTORY_MODE_SECONDARY) + $ret['site']['directory_mode'] = 'secondary'; + elseif($dirmode == DIRECTORY_MODE_STANDALONE) + $ret['site']['directory_mode'] = 'standalone'; + if($dirmode != DIRECTORY_MODE_NORMAL) + $ret['site']['directory_url'] = z_root() . '/dirsearch'; + + + // hide detailed site information if you're off the grid + + if($dirmode != DIRECTORY_MODE_STANDALONE) { + + $register_policy = intval(get_config('system','register_policy')); + + if($register_policy == REGISTER_CLOSED) + $ret['site']['register_policy'] = 'closed'; + if($register_policy == REGISTER_APPROVE) + $ret['site']['register_policy'] = 'approve'; + if($register_policy == REGISTER_OPEN) + $ret['site']['register_policy'] = 'open'; + + + $access_policy = intval(get_config('system','access_policy')); + + if($access_policy == ACCESS_PRIVATE) + $ret['site']['access_policy'] = 'private'; + if($access_policy == ACCESS_PAID) + $ret['site']['access_policy'] = 'paid'; + if($access_policy == ACCESS_FREE) + $ret['site']['access_policy'] = 'free'; + if($access_policy == ACCESS_TIERED) + $ret['site']['access_policy'] = 'tiered'; + + $ret['site']['accounts'] = account_total(); + + require_once('include/identity.php'); + $ret['site']['channels'] = channel_total(); + + + $ret['site']['version'] = PLATFORM_NAME . ' ' . RED_VERSION . '[' . DB_UPDATE_VERSION . ']'; + + $ret['site']['admin'] = get_config('system','admin_email'); + + $a = get_app(); + + $visible_plugins = array(); + if(is_array($a->plugins) && count($a->plugins)) { + $r = q("select * from addon where hidden = 0"); + if($r) + foreach($r as $rr) + $visible_plugins[] = $rr['name']; + } + + $ret['site']['plugins'] = $visible_plugins; + $ret['site']['sitehash'] = get_config('system','location_hash'); + $ret['site']['sitename'] = get_config('system','sitename'); + $ret['site']['sellpage'] = get_config('system','sellpage'); + $ret['site']['location'] = get_config('system','site_location'); + $ret['site']['realm'] = get_directory_realm(); + $ret['site']['project'] = PLATFORM_NAME; + + } + + check_zotinfo($e,$x,$ret); + + + call_hooks('zot_finger',$ret); + return($ret); + +} + + +function check_zotinfo($channel,$locations,&$ret) { + + +// logger('locations: ' . print_r($locations,true),LOGGER_DATA); + + // This function will likely expand as we find more things to detect and fix. + // 1. Because magic-auth is reliant on it, ensure that the system channel has a valid hubloc + // Force this to be the case if anything is found to be wrong with it. + + // @FIXME ensure that the system channel exists in the first place and has an xchan + + if($channel['channel_system']) { + // the sys channel must have a location (hubloc) + $valid_location = false; + if((count($locations) === 1) && ($locations[0]['primary']) && (! $locations[0]['deleted'])) { + if((rsa_verify($locations[0]['url'],base64url_decode($locations[0]['url_sig']),$channel['channel_pubkey'])) + && ($locations[0]['sitekey'] === get_config('system','pubkey')) + && ($locations[0]['url'] === z_root())) + $valid_location = true; + else + logger('sys channel: invalid url signature'); + } + + if((! $locations) || (! $valid_location)) { + + logger('System channel locations are not valid. Attempting repair.'); + + // Don't trust any existing records. Just get rid of them, but only do this + // for the sys channel as normal channels will be trickier. + + q("delete from hubloc where hubloc_hash = '%s'", + dbesc($channel['channel_hash']) + ); + $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_primary, + hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey, hubloc_network ) + values ( '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s' )", + dbesc($channel['channel_guid']), + dbesc($channel['channel_guid_sig']), + dbesc($channel['channel_hash']), + dbesc($channel['channel_address'] . '@' . get_app()->get_hostname()), + intval(1), + dbesc(z_root()), + dbesc(base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey']))), + dbesc(get_app()->get_hostname()), + dbesc(z_root() . '/post'), + dbesc(get_config('system','pubkey')), + dbesc('zot') + ); + if($r) { + $x = zot_encode_locations($channel); + if($x) { + $ret['locations'] = $x; + } + } + else { + logger('Unable to store sys hub location'); + } + } + } +} + +function delivery_report_is_storable($dr) { + + call_hooks('dreport_is_storable',$dr); + + // let plugins accept or reject - if neither, continue on + if(array_key_exists('accept',$dr) && intval($dr['accept'])) + return true; + if(array_key_exists('reject',$dr) && intval($dr['reject'])) + return false; + + if(! ($dr['sender'])) + return false; + + // Is the sender one of our channels? + + $c = q("select channel_id from channel where channel_hash = '%s' limit 1", + dbesc($dr['sender']) + ); + if(! $c) + return false; + + // is the recipient one of our connections, or do we want to store every report? + + $r = explode(' ', $dr['recipient']); + $rxchan = $r[0]; + $pcf = get_pconfig($c[0]['channel_id'],'system','dreport_store_all'); + if($pcf) + return true; + + $r = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1", + dbesc($rxchan), + intval($c[0]['channel_id']) + ); + if($r) + return true; + + return false; + +} + + diff --git a/sources/install/INSTALL.txt b/sources/install/INSTALL.txt index 65df17fd..c8151052 100644 --- a/sources/install/INSTALL.txt +++ b/sources/install/INSTALL.txt @@ -147,7 +147,12 @@ use SSL, your webserver must not listen on port 443 at all. 3. Create an empty database and note the access details (hostname, username, -password, database name). +password, database name). The MySQL client libraries will fallback to socket +communication if the hostname is 'localhost' and some people have reported +issues with the socket implementation. Use it if your requirements mandate. +Otherwise if the database is served on the local server, use '127.0.0.1' for +the hostname. See https://dev.mysql.com/doc/refman/5.0/en/connecting.html +for more information. 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 diff --git a/sources/doc/install/sample-lighttpd.conf b/sources/install/sample-lighttpd.conf similarity index 100% rename from sources/doc/install/sample-lighttpd.conf rename to sources/install/sample-lighttpd.conf diff --git a/sources/doc/install/sample-nginx.conf b/sources/install/sample-nginx.conf similarity index 100% rename from sources/doc/install/sample-nginx.conf rename to sources/install/sample-nginx.conf diff --git a/sources/install/schema_mysql.sql b/sources/install/schema_mysql.sql index aaeab4f8..3dab6c82 100644 --- a/sources/install/schema_mysql.sql +++ b/sources/install/schema_mysql.sql @@ -108,6 +108,8 @@ CREATE TABLE IF NOT EXISTS `app` ( `app_price` char(255) NOT NULL DEFAULT '', `app_page` char(255) NOT NULL DEFAULT '', `app_requires` char(255) NOT NULL DEFAULT '', + `app_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `app_edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`), KEY `app_id` (`app_id`), KEY `app_name` (`app_name`), @@ -115,7 +117,9 @@ CREATE TABLE IF NOT EXISTS `app` ( KEY `app_photo` (`app_photo`), KEY `app_version` (`app_version`), KEY `app_channel` (`app_channel`), - KEY `app_price` (`app_price`) + KEY `app_price` (`app_price`), + KEY `app_created` (`app_created`), + KEY `app_edited` (`app_edited`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `attach` ( @@ -346,6 +350,25 @@ CREATE TABLE IF NOT EXISTS `conv` ( KEY `updated` (`updated`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `dreport` ( + `dreport_id` int(11) NOT NULL AUTO_INCREMENT, + `dreport_channel` int(11) NOT NULL DEFAULT '0', + `dreport_mid` char(255) NOT NULL DEFAULT '', + `dreport_site` char(255) NOT NULL DEFAULT '', + `dreport_recip` char(255) NOT NULL DEFAULT '', + `dreport_result` char(255) NOT NULL DEFAULT '', + `dreport_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `dreport_xchan` char(255) NOT NULL DEFAULT '', + `dreport_queue` char(255) NOT NULL DEFAULT '', + PRIMARY KEY (`dreport_id`), + KEY `dreport_mid` (`dreport_mid`), + KEY `dreport_site` (`dreport_site`), + KEY `dreport_time` (`dreport_time`), + KEY `dreport_xchan` (`dreport_xchan`), + KEY `dreport_queue` (`dreport_queue`), + KEY `dreport_channel` (`dreport_channel`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + CREATE TABLE IF NOT EXISTS `event` ( `id` int(11) NOT NULL AUTO_INCREMENT, `aid` int(10) unsigned NOT NULL DEFAULT '0', @@ -373,6 +396,7 @@ CREATE TABLE IF NOT EXISTS `event` ( `event_repeat` text NOT NULL, `event_sequence` smallint(6) NOT NULL DEFAULT '0', `event_priority` smallint(6) NOT NULL DEFAULT '0', + `event_vdata` text NOT NULL, PRIMARY KEY (`id`), KEY `uid` (`uid`), KEY `type` (`type`), @@ -688,6 +712,7 @@ CREATE TABLE IF NOT EXISTS `likes` ( `liker` char(128) NOT NULL DEFAULT '', `likee` char(128) NOT NULL DEFAULT '', `iid` int(11) unsigned NOT NULL DEFAULT '0', + `i_mid` char(255) NOT NULL DEFAULT '', `verb` char(255) NOT NULL DEFAULT '', `target_type` char(255) NOT NULL DEFAULT '', `target_id` char(128) NOT NULL DEFAULT '', @@ -696,6 +721,7 @@ CREATE TABLE IF NOT EXISTS `likes` ( KEY `liker` (`liker`), KEY `likee` (`likee`), KEY `iid` (`iid`), + KEY `i_mid` (`i_mid`), KEY `verb` (`verb`), KEY `target_type` (`target_type`), KEY `channel_id` (`channel_id`), @@ -705,6 +731,7 @@ CREATE TABLE IF NOT EXISTS `likes` ( CREATE TABLE IF NOT EXISTS `mail` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `convid` int(10) unsigned NOT NULL DEFAULT '0', + `conv_guid` char(255) NOT NULL DEFAULT '', `mail_flags` int(10) unsigned NOT NULL DEFAULT '0', `from_xchan` char(255) NOT NULL DEFAULT '', `to_xchan` char(255) NOT NULL DEFAULT '', @@ -735,6 +762,7 @@ CREATE TABLE IF NOT EXISTS `mail` ( KEY `parent_mid` (`parent_mid`), KEY `expires` (`expires`), KEY `convid` (`convid`), + KEY `conv_guid` (`conv_guid`), KEY `mail_deleted` (`mail_deleted`), KEY `mail_replied` (`mail_replied`), KEY `mail_isreply` (`mail_isreply`), @@ -821,6 +849,11 @@ CREATE TABLE IF NOT EXISTS `obj` ( `obj_type` int(10) unsigned NOT NULL DEFAULT '0', `obj_obj` char(255) NOT NULL DEFAULT '', `obj_channel` int(10) unsigned NOT NULL DEFAULT '0', + `obj_term` char(255) NOT NULL DEFAULT '', + `obj_url` char(255) NOT NULL DEFAULT '', + `obj_imgurl` char(255) NOT NULL DEFAULT '', + `obj_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `obj_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, @@ -830,6 +863,11 @@ CREATE TABLE IF NOT EXISTS `obj` ( KEY `obj_page` (`obj_page`), KEY `obj_type` (`obj_type`), KEY `obj_channel` (`obj_channel`), + KEY `obj_term` (`obj_term`), + KEY `obj_url` (`obj_url`), + KEY `obj_imgurl` (`obj_imgurl`), + KEY `obj_created` (`obj_created`), + KEY `obj_edited` (`obj_edited`), KEY `obj_obj` (`obj_obj`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; @@ -1095,6 +1133,8 @@ CREATE TABLE IF NOT EXISTS `site` ( `site_realm` char(255) NOT NULL DEFAULT '', `site_valid` smallint NOT NULL DEFAULT '0', `site_dead` smallint NOT NULL DEFAULT '0', + `site_type` smallint NOT NULL DEFAULT '0', + `site_project` char(255) NOT NULL DEFAULT '', PRIMARY KEY (`site_url`), KEY `site_flags` (`site_flags`), KEY `site_update` (`site_update`), @@ -1105,7 +1145,9 @@ CREATE TABLE IF NOT EXISTS `site` ( KEY `site_pull` (`site_pull`), KEY `site_realm` (`site_realm`), KEY `site_valid` (`site_valid`), - KEY `site_dead` (`site_dead`) + KEY `site_dead` (`site_dead`), + KEY `site_type` (`site_type`), + KEY `site_project` (`site_project`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `source` ( diff --git a/sources/install/schema_postgres.sql b/sources/install/schema_postgres.sql index da5a503e..70a7a576 100644 --- a/sources/install/schema_postgres.sql +++ b/sources/install/schema_postgres.sql @@ -107,6 +107,8 @@ CREATE TABLE "app" ( "app_price" text NOT NULL DEFAULT '', "app_page" text NOT NULL DEFAULT '', "app_requires" text NOT NULL DEFAULT '', + "app_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', + "app_edited" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', PRIMARY KEY ("id") ); create index "app_id" on app ("app_id"); @@ -116,6 +118,8 @@ create index "app_photo" on app ("app_photo"); create index "app_version" on app ("app_version"); create index "app_channel" on app ("app_channel"); create index "app_price" on app ("app_price"); +create index "app_created" on app ("app_created"); +create index "app_edited" on app ("app_edited"); CREATE TABLE "attach" ( "id" serial NOT NULL, "aid" bigint NOT NULL DEFAULT '0', @@ -337,6 +341,30 @@ CREATE TABLE "conv" ( create index "conv_created_idx" on conv ("created"); create index "conv_updated_idx" on conv ("updated"); +CREATE TABLE IF NOT EXISTS "dreport" ( + "dreport_id" int(11) NOT NULL, + "dreport_channel" int(11) NOT NULL DEFAULT '0', + "dreport_mid" char(255) NOT NULL DEFAULT '', + "dreport_site" char(255) NOT NULL DEFAULT '', + "dreport_recip" char(255) NOT NULL DEFAULT '', + "dreport_result" char(255) NOT NULL DEFAULT '', + "dreport_time" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', + "dreport_xchan" char(255) NOT NULL DEFAULT '', + "dreport_queue" char(255) NOT NULL DEFAULT '', + PRIMARY KEY ("dreport_id") +); + +create index "dreport_mid" on dreport ("dreport_mid"); +create index "dreport_site" on dreport ("dreport_site"); +create index "dreport_time" on dreport ("dreport_time"); +create index "dreport_xchan" on dreport ("dreport_xchan"); +create index "dreport_queue" on dreport ("dreport_queue"); +create index "dreport_channel" on dreport ("dreport_channel"); + + + + + CREATE TABLE "event" ( "id" serial NOT NULL, "aid" bigint NOT NULL DEFAULT '0', @@ -364,6 +392,7 @@ CREATE TABLE "event" ( "event_repeat" text NOT NULL, "event_sequence" smallint NOT NULL DEFAULT '0', "event_priority" smallint NOT NULL DEFAULT '0', + "event_vdata" text NOT NULL, PRIMARY KEY ("id") ); create index "event_uid_idx" on event ("uid"); @@ -681,6 +710,7 @@ CREATE TABLE "likes" ( "liker" char(128) NOT NULL DEFAULT '', "likee" char(128) NOT NULL DEFAULT '', "iid" bigint NOT NULL DEFAULT '0', + "i_mid" char(255) NOT NULL DEFAULT '', "verb" text NOT NULL DEFAULT '', "target_type" text NOT NULL DEFAULT '', "target_id" char(128) NOT NULL DEFAULT '', @@ -691,12 +721,14 @@ create index "likes_channel_id" on likes ("channel_id"); create index "likes_liker" on likes ("liker"); create index "likes_likee" on likes ("likee"); create index "likes_iid" on likes ("iid"); +create index "likes_i_mid" on likes ("i_mid"); create index "likes_verb" on likes ("verb"); create index "likes_target_type" on likes ("target_type"); create index "likes_target_id" on likes ("target_id"); CREATE TABLE "mail" ( "id" serial NOT NULL, "convid" bigint NOT NULL DEFAULT '0', + "conv_guid" text NOT NULL, "mail_flags" bigint NOT NULL DEFAULT '0', "from_xchan" text NOT NULL DEFAULT '', "to_xchan" text NOT NULL DEFAULT '', @@ -719,6 +751,7 @@ CREATE TABLE "mail" ( PRIMARY KEY ("id") ); create index "mail_convid" on mail ("convid"); +create index "mail_conv_guid" on mail ("conv_guid"); create index "mail_created" on mail ("created"); create index "mail_flags" on mail ("mail_flags"); create index "mail_account_id" on mail ("account_id"); @@ -810,6 +843,11 @@ CREATE TABLE "obj" ( "obj_type" bigint NOT NULL DEFAULT '0', "obj_obj" text NOT NULL DEFAULT '', "obj_channel" bigint NOT NULL DEFAULT '0', + "obj_term" char(255) NOT NULL DEFAULT '', + "obj_url" char(255) NOT NULL DEFAULT '', + "obj_imgurl" char(255) NOT NULL DEFAULT '', + "obj_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', + "obj_edited" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00', "allow_cid" text NOT NULL, "allow_gid" text NOT NULL, "deny_cid" text NOT NULL, @@ -822,6 +860,11 @@ create index "obj_page" on obj ("obj_page"); create index "obj_type" on obj ("obj_type"); create index "obj_channel" on obj ("obj_channel"); create index "obj_obj" on obj ("obj_obj"); +create index "obj_term" on obj ("obj_term"); +create index "obj_url" on obj ("obj_url"); +create index "obj_imgurl" on obj ("obj_imgurl"); +create index "obj_created" on obj ("obj_created"); +create index "obj_edited" on obj ("obj_edited"); CREATE TABLE "outq" ( "outq_hash" text NOT NULL, @@ -1081,6 +1124,8 @@ CREATE TABLE "site" ( "site_realm" text NOT NULL DEFAULT '', "site_valid" smallint NOT NULL DEFAULT '0', "site_dead" smallint NOT NULL DEFAULT '0', + "site_type" smallint NOT NULL DEFAULT '0', + "site_project" text NOT NULL DEFAULT '', PRIMARY KEY ("site_url") ); create index "site_flags" on site ("site_flags"); @@ -1092,6 +1137,8 @@ create index "site_sellpage" on site ("site_sellpage"); create index "site_realm" on site ("site_realm"); create index "site_valid" on site ("site_valid"); create index "site_dead" on site ("site_dead"); +create index "site_type" on site ("site_type"); +create index "site_project" on site ("site_project"); CREATE TABLE "source" ( "src_id" serial NOT NULL, diff --git a/sources/install/update.php b/sources/install/update.php index 9aca14d2..d6b54346 100644 --- a/sources/install/update.php +++ b/sources/install/update.php @@ -1,6 +1,6 @@ ../cacert.pem + +to generate the master file in /library/cacert.pem + + diff --git a/sources/library/certs/cacert.pem b/sources/library/certs/cacert.pem index fa9df81f..1ff34f9b 100644 --- a/sources/library/certs/cacert.pem +++ b/sources/library/certs/cacert.pem @@ -1,7 +1,7 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla downloaded on: Wed Sep 3 03:12:03 2014 +## Certificate data from Mozilla as of: Wed Sep 2 18:30:34 2015 ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates @@ -13,66 +13,11 @@ ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## -## Conversion done with mk-ca-bundle.pl verison 1.22. -## SHA1: c4540021427a6fa29e5f50db9f12d48c97d33889 +## Conversion done with mk-ca-bundle.pl version 1.25. +## SHA1: ed3c0bbfb7912bcc00cd2033b0cb85c98d10559c ## -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - Equifax Secure CA ================= -----BEGIN CERTIFICATE----- @@ -93,25 +38,6 @@ BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 70+sB3c4 -----END CERTIFICATE----- -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- @@ -248,40 +174,6 @@ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - AddTrust Low-Value Services Root ================================ -----BEGIN CERTIFICATE----- @@ -527,59 +419,6 @@ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - Visa eCommerce Root =================== -----BEGIN CERTIFICATE----- @@ -1777,33 +1616,6 @@ JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk vQ== -----END CERTIFICATE----- -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - TC TrustCenter Universal CA I ============================= -----BEGIN CERTIFICATE----- @@ -2421,28 +2233,6 @@ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- @@ -3892,3 +3682,307 @@ ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO kI26oQ== -----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G3 +================================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y +olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t +x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy +EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K +Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur +mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 +1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp +07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo +FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE +41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu +yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq +KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 +v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA +8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b +8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r +mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq +1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI +JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV +tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- diff --git a/sources/library/readmore.js/readmore.js b/sources/library/readmore.js/readmore.js index e790ceb7..d4c1cf72 100644 --- a/sources/library/readmore.js/readmore.js +++ b/sources/library/readmore.js/readmore.js @@ -62,7 +62,7 @@ function setBoxHeights(element) { var el = element, - expandedHeight = el.outerHeight(), + expandedHeight = el.outerHeight(true), cssMaxHeight = parseInt(el.css({maxHeight: ''}).css('max-height').replace(/[^-\d\.]/g, ''), 10), defaultHeight = element.data('defaultHeight'); diff --git a/sources/mod/admin.php b/sources/mod/admin.php index 89207e4f..aaf00b14 100644 --- a/sources/mod/admin.php +++ b/sources/mod/admin.php @@ -84,48 +84,6 @@ function admin_content(&$a) { return login(false); } - /* - * Side bar links - */ - - // array( url, name, extra css classes ) - - $aside = array( - 'site' => array($a->get_baseurl(true)."/admin/site/", t("Site") , "site"), - 'users' => array($a->get_baseurl(true)."/admin/users/", t("Accounts") , "users"), - 'channels' => array($a->get_baseurl(true)."/admin/channels/", t("Channels") , "channels"), - 'plugins' => array($a->get_baseurl(true)."/admin/plugins/", t("Plugins") , "plugins"), - 'themes' => array($a->get_baseurl(true)."/admin/themes/", t("Themes") , "themes"), - 'queue' => array(z_root() . '/admin/queue', t('Inspect queue'), 'queue'), -// 'hubloc' => array($a->get_baseurl(true)."/admin/hubloc/", t("Server") , "server"), - 'profs' => array(z_root() . '/admin/profs', t('Profile Config'), 'profs'), - 'dbsync' => array($a->get_baseurl(true)."/admin/dbsync/", t('DB updates'), "dbsync") - - ); - - /* get plugins admin page */ - - $r = q("SELECT * FROM addon WHERE plugin_admin = 1"); - $aside['plugins_admin'] = array(); - foreach ($r as $h){ - $plugin = $h['name']; - $aside['plugins_admin'][] = array($a->get_baseurl(true) . '/admin/plugins/' . $plugin, $plugin, 'plugin'); - // temp plugins with admin - $a->plugins_admin[] = $plugin; - } - - $aside['logs'] = Array($a->get_baseurl(true)."/admin/logs/", t("Logs"), "logs"); - - $t = get_markup_template("admin_aside.tpl"); - $a->page['aside'] .= replace_macros( $t, array( - '$admin' => $aside, - '$admtxt' => t('Admin'), - '$plugadmtxt' => t('Plugin Features'), - '$logtxt' => t('Logs'), - '$h_pending' => t('User registrations waiting for confirmation'), - '$admurl'=> $a->get_baseurl(true)."/admin/" - )); - /* * Page content @@ -296,6 +254,7 @@ function admin_page_site_post(&$a){ $proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : ''); $timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60); $delivery_interval = ((x($_POST,'delivery_interval'))? intval(trim($_POST['delivery_interval'])) : 0); + $delivery_batch_count = ((x($_POST,'delivery_batch_count') && $_POST['delivery_batch_count'] > 0)? intval(trim($_POST['delivery_batch_count'])) : 1); $poll_interval = ((x($_POST,'poll_interval')) ? intval(trim($_POST['poll_interval'])) : 0); $maxloadavg = ((x($_POST,'maxloadavg')) ? intval(trim($_POST['maxloadavg'])) : 50); $feed_contacts = ((x($_POST,'feed_contacts')) ? intval($_POST['feed_contacts']) : 0); @@ -303,6 +262,7 @@ function admin_page_site_post(&$a){ set_config('system', 'feed_contacts', $feed_contacts); set_config('system', 'delivery_interval', $delivery_interval); + set_config('system', 'delivery_batch_count', $delivery_batch_count); set_config('system', 'poll_interval', $poll_interval); set_config('system', 'maxloadavg', $maxloadavg); set_config('system', 'frontpage', $frontpage); @@ -372,10 +332,10 @@ function admin_page_site(&$a) { /* Installed langs */ $lang_choices = array(); - $langs = glob('view/*/strings.php'); + $langs = glob('view/*/hstrings.php'); if(is_array($langs) && count($langs)) { - if(! in_array('view/en/strings.php',$langs)) + if(! in_array('view/en/hstrings.php',$langs)) $langs[] = 'view/en/'; asort($langs); foreach($langs as $l) { @@ -484,6 +444,7 @@ function admin_page_site(&$a) { '$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""), '$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")), '$delivery_interval' => array('delivery_interval', t("Delivery interval"), (x(get_config('system','delivery_interval'))?get_config('system','delivery_interval'):2), t("Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers.")), + '$delivery_batch_count' => array('delivery_batch_count', t('Deliveries per process'),(x(get_config('system','delivery_batch_count'))?get_config('system','delivery_batch_count'):1), t("Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5.")), '$poll_interval' => array('poll_interval', t("Poll interval"), (x(get_config('system','poll_interval'))?get_config('system','poll_interval'):2), t("Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval.")), '$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")), '$default_expire_days' => array('default_expire_days', t('Expiration period in days for imported (matrix/network) content'), intval(get_config('system','default_expire_days')), t('0 for no expiration of imported content')), diff --git a/sources/mod/channel.php b/sources/mod/channel.php index d1064e93..0af2666c 100644 --- a/sources/mod/channel.php +++ b/sources/mod/channel.php @@ -153,7 +153,6 @@ function channel_content(&$a, $update = 0, $load = false) { else $page_mode = 'client'; - $abook_uids = " and abook.abook_channel = " . intval($a->profile['profile_uid']) . " "; $simple_update = (($update) ? " AND item_unseen = 1 " : ''); @@ -174,7 +173,7 @@ function channel_content(&$a, $update = 0, $load = false) { $r = q("SELECT distinct parent AS `item_id`, created from item left join abook on ( item.owner_xchan = abook.abook_xchan $abook_uids ) WHERE uid = %d $item_normal - AND item_wall = 1 AND item_unseen = 1 + AND item_wall = 1 $simple_update AND (abook.abook_blocked = 0 or abook.abook_flags is null) $sql_extra ORDER BY created DESC", @@ -260,9 +259,6 @@ function channel_content(&$a, $update = 0, $load = false) { } - - - if((! $update) && (! $load)) { // This is ugly, but we can't pass the profile_uid through the session to the ajax updater, diff --git a/sources/mod/chat.php b/sources/mod/chat.php index c54d2931..79a5c050 100644 --- a/sources/mod/chat.php +++ b/sources/mod/chat.php @@ -54,20 +54,24 @@ function chat_post(&$a) { goaway(z_root() . '/chat/' . $channel['channel_address']); } + $acl = new AccessList($channel); + $acl->set_from_array($_REQUEST); - $arr = array('name' => $room); - $arr['allow_gid'] = perms2str($_REQUEST['group_allow']); - $arr['allow_cid'] = perms2str($_REQUEST['contact_allow']); - $arr['deny_gid'] = perms2str($_REQUEST['group_deny']); - $arr['deny_cid'] = perms2str($_REQUEST['contact_deny']); + $arr = $acl->get(); + $arr['name'] = $room; + $arr['expire'] = intval($_POST['chat_expire']); + if(intval($arr['expire']) < 0) + $arr['expire'] = 0; chatroom_create($channel,$arr); - $x = q("select cr_id from chatroom where cr_name = '%s' and cr_uid = %d limit 1", + $x = q("select * from chatroom where cr_name = '%s' and cr_uid = %d limit 1", dbesc($room), intval(local_channel()) ); + build_sync_packet(0, array('chatroom' => $x)); + if($x) goaway(z_root() . '/chat/' . $channel['channel_address'] . '/' . $x[0]['cr_id']); @@ -158,7 +162,10 @@ function chat_content(&$a) { intval($a->profile['profile_uid']) ); if($x) { - $private = ((($x[0]['allow_cid']) || ($x[0]['allow_gid']) || ($x[0]['deny_cid']) || ($x[0]['deny_gid'])) ? true : false); + $acl = new AccessList(false); + $acl->set($x[0]); + + $private = $acl->is_private(); $room_name = $x[0]['cr_name']; if($bookmark_link) $bookmark_link .= '&url=' . z_root() . '/chat/' . argv(1) . '/' . argv(2) . '&title=' . urlencode($x[0]['cr_name']) . (($private) ? '&private=1' : '') . '&ischat=1'; @@ -192,20 +199,15 @@ function chat_content(&$a) { if(local_channel() && argc() > 2 && argv(2) === 'new') { - - - $channel_acl = array( - 'allow_cid' => $channel['channel_allow_cid'], - 'allow_gid' => $channel['channel_allow_gid'], - 'deny_cid' => $channel['channel_deny_cid'], - 'deny_gid' => $channel['channel_deny_gid'] - ); + $acl = new AccessList($channel); + $channel_acl = $acl->get(); require_once('include/acl_selectors.php'); $o = replace_macros(get_markup_template('chatroom_new.tpl'),array( '$header' => t('New Chatroom'), '$name' => array('room_name',t('Chatroom Name'),'', ''), + '$chat_expire' => array('chat_expire',t('Expiration of chats (minutes)'),120,''), '$permissions' => t('Permissions'), '$acl' => populate_acl($channel_acl,false), '$submit' => t('Submit') diff --git a/sources/mod/cloud.php b/sources/mod/cloud.php index 7f6dc096..efb33f93 100644 --- a/sources/mod/cloud.php +++ b/sources/mod/cloud.php @@ -73,6 +73,8 @@ function cloud_init(&$a) { $server->addPlugin($lockPlugin); +/* This next bit should no longer be needed... */ + // The next section of code allows us to bypass prompting for http-auth if a // FILE is being accessed anonymously and permissions allow this. This way // one can create hotlinks to public media files in their cloud and anonymous @@ -83,24 +85,24 @@ function cloud_init(&$a) { // In order to avoid prompting for passwords for viewing a DIRECTORY, add // the URL query parameter 'davguest=1'. - $isapublic_file = false; - $davguest = ((x($_SESSION, 'davguest')) ? true : false); +// $isapublic_file = false; +// $davguest = ((x($_SESSION, 'davguest')) ? true : false); - if ((! $auth->observer) && ($_SERVER['REQUEST_METHOD'] === 'GET')) { - try { - $x = RedFileData('/' . $a->cmd, $auth); - if($x instanceof RedDAV\RedFile) - $isapublic_file = true; - } - catch (Exception $e) { - $isapublic_file = false; - } - } +// if ((! $auth->observer) && ($_SERVER['REQUEST_METHOD'] === 'GET')) { +// try { +// $x = RedFileData('/' . $a->cmd, $auth); +// if($x instanceof RedDAV\RedFile) +// $isapublic_file = true; +// } +// catch (Exception $e) { +// $isapublic_file = false; +// } +// } - if ((! $auth->observer) && (! $isapublic_file) && (! $davguest)) { - logger('mod_cloud: auth exception'); - http_status_exit(401, 'Permission denied.'); - } +// if ((! $auth->observer) && (! $isapublic_file) && (! $davguest)) { +// logger('mod_cloud: auth exception'); +// http_status_exit(401, 'Permission denied.'); +// } require_once('include/RedDAV/RedBrowser.php'); // provide a directory view for the cloud in Hubzilla diff --git a/sources/mod/connections.php b/sources/mod/connections.php index 2f1a1fdf..2060ca85 100644 --- a/sources/mod/connections.php +++ b/sources/mod/connections.php @@ -19,143 +19,6 @@ function connections_init(&$a) { } -function connections_post(&$a) { - - if(! local_channel()) - return; - - $contact_id = intval(argv(1)); - if(! $contact_id) - return; - - $orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1", - intval($contact_id), - intval(local_channel()) - ); - - if(! $orig_record) { - notice( t('Could not access contact record.') . EOL); - goaway(z_root() . '/connections'); - return; // NOTREACHED - } - - call_hooks('contact_edit_post', $_POST); - - $profile_id = $_POST['profile_assign']; - if($profile_id) { - $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND `uid` = %d LIMIT 1", - dbesc($profile_id), - intval(local_channel()) - ); - if(! count($r)) { - notice( t('Could not locate selected profile.') . EOL); - return; - } - } - - $hidden = intval($_POST['hidden']); - - $priority = intval($_POST['poll']); - if($priority > 5 || $priority < 0) - $priority = 0; - - $closeness = intval($_POST['closeness']); - if($closeness < 0) - $closeness = 99; - - $abook_my_perms = 0; - - foreach($_POST as $k => $v) { - if(strpos($k,'perms_') === 0) { - $abook_my_perms += $v; - } - } - - $new_friend = false; - - if(($_REQUEST['pending']) && intval($orig_record[0]['abook_pending'])) { - $new_friend = true; - } - - $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_pending = %d - where abook_id = %d AND abook_channel = %d", - dbesc($profile_id), - intval($abook_my_perms), - intval($closeness), - intval(1 - intval($new_friend)), - intval($contact_id), - intval(local_channel()) - ); - - if($r) - info( t('Connection updated.') . EOL); - else - notice( t('Failed to update connection record.') . EOL); - - if((x($a->data,'abook')) && $a->data['abook']['abook_my_perms'] != $abook_my_perms - && (! intval($a->data['abook']['abook_self']))) { - proc_run('php', 'include/notifier.php', 'permission_update', $contact_id); - } - - if($new_friend) { - $channel = $a->get_channel(); - $default_group = $channel['channel_default_group']; - if($default_group) { - require_once('include/group.php'); - $g = group_rec_byhash(local_channel(),$default_group); - if($g) - group_add_member(local_channel(),'',$a->data['abook_xchan'],$g['id']); - } - - - - // Check if settings permit ("post new friend activity" is allowed, and - // friends in general or this friend in particular aren't hidden) - // and send out a new friend activity - // TODO - - // pull in a bit of content if there is any to pull in - proc_run('php','include/onepoll.php',$contact_id); - - } - - // Refresh the structure in memory with the new data - - $r = q("SELECT abook.*, xchan.* - FROM abook left join xchan on abook_xchan = xchan_hash - WHERE abook_channel = %d and abook_id = %d LIMIT 1", - intval(local_channel()), - intval($contact_id) - ); - if($r) { - $a->data['abook'] = $r[0]; - } - - if($new_friend) { - $arr = array('channel_id' => local_channel(), 'abook' => $a->data['abook']); - call_hooks('accept_follow', $arr); - } - - connections_clone($a); - - return; - -} - -function connections_clone(&$a) { - - if(! array_key_exists('abook',$a->data)) - return; - $clone = $a->data['abook']; - - unset($clone['abook_id']); - unset($clone['abook_account']); - unset($clone['abook_channel']); - - build_sync_packet(0 /* use the current local_channel */, array('abook' => array($clone))); -} - - function connections_content(&$a) { $sort_type = 0; diff --git a/sources/mod/connedit.php b/sources/mod/connedit.php index 866f8361..65eba885 100644 --- a/sources/mod/connedit.php +++ b/sources/mod/connedit.php @@ -190,7 +190,7 @@ function connedit_post(&$a) { } } - $abook_pending = $new_friend ? 0 : $orig_record[0]['abook_pending']; + $abook_pending = (($new_friend) ? 0 : $orig_record[0]['abook_pending']); $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_pending = %d, abook_incl = '%s', abook_excl = '%s' @@ -214,7 +214,6 @@ function connedit_post(&$a) { } - if($r) info( t('Connection updated.') . EOL); else @@ -222,7 +221,7 @@ function connedit_post(&$a) { if($a->poi && $a->poi['abook_my_perms'] != $abook_my_perms && (! intval($a->poi['abook_self']))) { - proc_run('php', 'include/notifier.php', 'permission_update', $contact_id); + proc_run('php', 'include/notifier.php', (($new_friend) ? 'permission_create' : 'permission_update'), $contact_id); } if($new_friend) { @@ -314,6 +313,17 @@ function connedit_clone(&$a) { if(! $a->poi) return; + + $r = q("SELECT abook.*, xchan.* + FROM abook left join xchan on abook_xchan = xchan_hash + WHERE abook_channel = %d and abook_id = %d LIMIT 1", + intval(local_channel()), + intval($a->poi['abook_id']) + ); + if($r) { + $a->poi = $r[0]; + } + $clone = $a->poi; unset($clone['abook_id']); diff --git a/sources/mod/dirsearch.php b/sources/mod/dirsearch.php index 132ed252..937564a7 100644 --- a/sources/mod/dirsearch.php +++ b/sources/mod/dirsearch.php @@ -398,13 +398,15 @@ function list_public_sites() { $rand = db_getfunc('rand'); $realm = get_directory_realm(); if($realm == DIRECTORY_REALM) { - $r = q("select * from site where site_access != 0 and site_register !=0 and ( site_realm = '%s' or site_realm = '') order by $rand", - dbesc($realm) + $r = q("select * from site where site_access != 0 and site_register !=0 and ( site_realm = '%s' or site_realm = '') and site_type = %d order by $rand", + dbesc($realm), + intval(SITE_TYPE_ZOT) ); } else { - $r = q("select * from site where site_access != 0 and site_register !=0 and site_realm = '%s' order by $rand", - dbesc($realm) + $r = q("select * from site where site_access != 0 and site_register !=0 and site_realm = '%s' and site_type = %d order by $rand", + dbesc($realm), + intval(SITE_TYPE_ZOT) ); } @@ -434,9 +436,9 @@ function list_public_sites() { $register = 'closed'; if(strpos($rr['site_url'],'https://') !== false) - $ret['sites'][] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location']); + $ret['sites'][] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project']); else - $insecure[] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location']); + $insecure[] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project']); } if($insecure) { $ret['sites'] = array_merge($ret['sites'],$insecure); diff --git a/sources/mod/dreport.php b/sources/mod/dreport.php new file mode 100644 index 00000000..c320bf0e --- /dev/null +++ b/sources/mod/dreport.php @@ -0,0 +1,138 @@ +get_channel(); + + $mid = ((argc() > 1) ? argv(1) : ''); + + if($mid === 'mail') { + $table = 'mail'; + $mid = ((argc() > 2) ? argv(2) : ''); + } + + + if(! $mid) { + notice( t('Invalid message') . EOL); + return; + } + + switch($table) { + case 'item': + $i = q("select id from item where mid = '%s' and author_xchan = '%s' ", + dbesc($mid), + dbesc($channel['channel_hash']) + ); + break; + case 'mail': + $i = q("select id from mail where mid = '%s' and from_xchan = '%s'", + dbesc($mid), + dbesc($channel['channel_hash']) + ); + break; + default: + break; + } + + if(! $i) { + notice( t('Permission denied') . EOL); + return; + } + + $r = q("select * from dreport where dreport_xchan = '%s' and dreport_mid = '%s'", + dbesc($channel['channel_hash']), + dbesc($mid) + ); + + if(! $r) { + notice( t('no results') . EOL); + return; + } + + + $o .= '

    ' . sprintf( t('Delivery report for %1$s'),substr($mid,0,32)) . '...' . '

    '; + $o .= ''; + + for($x = 0; $x < count($r); $x++ ) { + $r[$x]['name'] = escape_tags(substr($r[$x]['dreport_recip'],strpos($r[$x]['dreport_recip'],' '))); + + // This has two purposes: 1. make the delivery report strings translateable, and + // 2. assign an ordering to item delivery results so we can group them and provide + // a readable report with more interesting events listed toward the top and lesser + // interesting items towards the bottom + + switch($r[$x]['dreport_result']) { + case 'channel sync processed': + $r[$x]['gravity'] = 0; + $r[$x]['dreport_result'] = t('channel sync processed'); + break; + case 'queued': + $r[$x]['gravity'] = 2; + $r[$x]['dreport_result'] = t('queued'); + break; + case 'posted': + $r[$x]['gravity'] = 3; + $r[$x]['dreport_result'] = t('posted'); + break; + case 'accepted for delivery': + $r[$x]['gravity'] = 4; + $r[$x]['dreport_result'] = t('accepted for delivery'); + break; + case 'updated': + $r[$x]['gravity'] = 5; + $r[$x]['dreport_result'] = t('updated'); + case 'update ignored': + $r[$x]['gravity'] = 6; + $r[$x]['dreport_result'] = t('update ignored'); + break; + case 'permission denied': + $r[$x]['dreport_result'] = t('permission denied'); + $r[$x]['gravity'] = 6; + break; + case 'recipient not found': + $r[$x]['dreport_result'] = t('recipient not found'); + break; + case 'mail recalled': + $r[$x]['dreport_result'] = t('mail recalled'); + break; + case 'duplicate mail received': + $r[$x]['dreport_result'] = t('duplicate mail received'); + break; + case 'mail delivered': + $r[$x]['dreport_result'] = t('mail delivered'); + break; + default: + $r[$x]['gravity'] = 1; + break; + } + } + + usort($r,'dreport_gravity_sort'); + + + foreach($r as $rr) { + $o .= ''; + } + $o .= '
    ' . $rr['name'] . '' . escape_tags($rr['dreport_result']) . '' . escape_tags($rr['dreport_time']) . '
    '; + + return $o; + + + +} + +function dreport_gravity_sort($a,$b) { + if($a['gravity'] == $b['gravity']) { + if($a['name'] === $b['name']) + return strcmp($a['dreport_time'],$b['dreport_time']); + return strcmp($a['name'],$b['name']); + } + return (($a['gravity'] > $b['gravity']) ? 1 : (-1)); +} \ No newline at end of file diff --git a/sources/mod/editblock.php b/sources/mod/editblock.php index b4d954ef..9269676b 100644 --- a/sources/mod/editblock.php +++ b/sources/mod/editblock.php @@ -111,6 +111,7 @@ function editblock_content(&$a) { $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array( '$baseurl' => $a->get_baseurl(), '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), + '$pretext' => '', '$ispublic' => ' ', // t('Visible to everybody'), '$geotag' => '', '$nickname' => $channel['channel_address'], diff --git a/sources/mod/editlayout.php b/sources/mod/editlayout.php index 6ea7f410..fc68cfe3 100644 --- a/sources/mod/editlayout.php +++ b/sources/mod/editlayout.php @@ -105,6 +105,7 @@ function editlayout_content(&$a) { $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array( '$baseurl' => $a->get_baseurl(), '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), + '$pretext' => '', '$ispublic' => ' ', // t('Visible to everybody'), '$geotag' => $geotag, '$nickname' => $channel['channel_address'], diff --git a/sources/mod/editpost.php b/sources/mod/editpost.php index daca7c15..1bee16ee 100644 --- a/sources/mod/editpost.php +++ b/sources/mod/editpost.php @@ -47,6 +47,7 @@ function editpost_content(&$a) { $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array( '$baseurl' => $a->get_baseurl(), '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), + '$pretext' => '', '$ispublic' => ' ', // t('Visible to everybody'), '$geotag' => $geotag, '$nickname' => $channel['channel_address'], @@ -128,7 +129,7 @@ function editpost_content(&$a) { '$consensus' => intval($itm[0]['item_consensus']), '$wait' => t('Please wait'), '$permset' => t('Permission settings'), - '$ptyp' => $itm[0]['type'], + '$ptyp' => $itm[0]['obj_type'], '$content' => undo_post_tagging($itm[0]['body']), '$post_id' => $post_id, '$parent' => (($itm[0]['parent'] != $itm[0]['id']) ? $itm[0]['parent'] : ''), diff --git a/sources/mod/editwebpage.php b/sources/mod/editwebpage.php index 974e8cc3..0192fd9c 100644 --- a/sources/mod/editwebpage.php +++ b/sources/mod/editwebpage.php @@ -146,6 +146,7 @@ function editwebpage_content(&$a) { $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array( '$baseurl' => $a->get_baseurl(), '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), + '$pretext' => '', '$ispublic' => ' ', // t('Visible to everybody'), '$geotag' => $geotag, '$nickname' => $channel['channel_address'], diff --git a/sources/mod/events.php b/sources/mod/events.php index 15fed9df..d76602a3 100755 --- a/sources/mod/events.php +++ b/sources/mod/events.php @@ -41,16 +41,11 @@ function events_post(&$a) { $categories = escape_tags(trim($_POST['category'])); - - // only allow editing your own events. if(($xchan) && ($xchan !== get_observer_hash())) return; - // The default setting for the `private` field in event_store() is false, so mirror that - $private_event = false; - if($start_text) { $start = $start_text; } @@ -119,6 +114,8 @@ function events_post(&$a) { $channel = $a->get_channel(); + $acl = new AccessList(false); + if($event_id) { $x = q("select * from event where id = %d and uid = %d limit 1", intval($event_id), @@ -132,44 +129,33 @@ function events_post(&$a) { } return; } + + $acl->set($x[0]); + + $created = $x[0]['created']; + $edited = datetime_convert(); + if($x[0]['allow_cid'] === '<' . $channel['channel_hash'] . '>' && $x[0]['allow_gid'] === '' && $x[0]['deny_cid'] === '' && $x[0]['deny_gid'] === '') { $share = false; } else { $share = true; - $str_group_allow = $x[0]['allow_gid']; - $str_contact_allow = $x[0]['allow_cid']; - $str_group_deny = $x[0]['deny_gid']; - $str_contact_deny = $x[0]['deny_cid']; - - if(strlen($str_group_allow) || strlen($str_contact_allow) - || strlen($str_group_deny) || strlen($str_contact_deny)) { - $private_event = true; - } } } else { + $created = $edited = datetime_convert(); if($share) { - $str_group_allow = perms2str($_POST['group_allow']); - $str_contact_allow = perms2str($_POST['contact_allow']); - $str_group_deny = perms2str($_POST['group_deny']); - $str_contact_deny = perms2str($_POST['contact_deny']); - - if(strlen($str_group_allow) || strlen($str_contact_allow) - || strlen($str_group_deny) || strlen($str_contact_deny)) { - $private_event = true; - } + $acl->set_from_array($_POST); } else { - $str_contact_allow = '<' . $channel['channel_hash'] . '>'; - $str_group_allow = $str_contact_deny = $str_group_deny = ''; - $private_event = true; + $acl->set(array('allow_cid' => '<' . $channel['channel_hash'] . '>', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '')); } } $post_tags = array(); $channel = $a->get_channel(); + $ac = $acl->get(); if(strlen($categories)) { $cats = explode(',',$categories); @@ -196,11 +182,11 @@ function events_post(&$a) { $datarray['uid'] = local_channel(); $datarray['account'] = get_account_id(); $datarray['event_xchan'] = $channel['channel_hash']; - $datarray['allow_cid'] = $str_contact_allow; - $datarray['allow_gid'] = $str_group_allow; - $datarray['deny_cid'] = $str_contact_deny; - $datarray['deny_gid'] = $str_group_deny; - $datarray['private'] = (($private_event) ? 1 : 0); + $datarray['allow_cid'] = $ac['allow_cid']; + $datarray['allow_gid'] = $ac['allow_gid']; + $datarray['deny_cid'] = $ac['deny_cid']; + $datarray['deny_gid'] = $ac['deny_gid']; + $datarray['private'] = (($acl->is_private()) ? 1 : 0); $datarray['id'] = $event_id; $datarray['created'] = $created; $datarray['edited'] = $edited; @@ -219,6 +205,23 @@ function events_post(&$a) { $item_id = event_store_item($datarray,$event); + if($item_id) { + $r = q("select * from item where id = %d", + intval($item_id) + ); + if($r) { + xchan_query($r); + $sync_item = fetch_post_tags($r); + $z = q("select * from event where event_hash = '%s' and uid = %d limit 1", + dbesc($r[0]['resource_id']), + intval($channel['channel_id']) + ); + if($z) { + build_sync_packet($channel['channel_id'],array('event_item' => array(encode_item($sync_item[0],true)),'event' => $z)); + } + } + } + if($share) proc_run('php',"include/notifier.php","event","$item_id"); @@ -542,6 +545,9 @@ function events_content(&$a) { dbesc($event_id), intval(local_channel()) ); + + $sync_event = $r[0]; + if($r) { $r = q("delete from event where event_hash = '%s' and uid = %d limit 1", dbesc($event_id), @@ -552,6 +558,9 @@ function events_content(&$a) { dbesc($event_id), intval(local_channel()) ); + $sync_event['event_deleted'] = 1; + build_sync_packet(0,array('event' => array($sync_event))); + info( t('Event removed') . EOL); } else { @@ -655,12 +664,9 @@ function events_content(&$a) { require_once('include/acl_selectors.php'); - $perm_defaults = array( - 'allow_cid' => $channel['channel_allow_cid'], - 'allow_gid' => $channel['channel_allow_gid'], - 'deny_cid' => $channel['channel_deny_cid'], - 'deny_gid' => $channel['channel_deny_gid'] - ); + $acl = new AccessList($channel); + $perm_defaults = $acl->get(); + $tpl = get_markup_template('event_form.tpl'); diff --git a/sources/mod/filestorage.php b/sources/mod/filestorage.php index 9787c038..7ba8c180 100644 --- a/sources/mod/filestorage.php +++ b/sources/mod/filestorage.php @@ -28,20 +28,20 @@ function filestorage_post(&$a) { return; } - $str_group_allow = perms2str($_REQUEST['group_allow']); - $str_contact_allow = perms2str($_REQUEST['contact_allow']); - $str_group_deny = perms2str($_REQUEST['group_deny']); - $str_contact_deny = perms2str($_REQUEST['contact_deny']); - $channel = $a->get_channel(); + + $acl = new AccessList($channel); + $acl->set_from_array($_REQUEST); + $x = $acl->get(); + $cloudPath = get_parent_cloudpath($channel_id, $channel['channel_address'], $resource); //get the object before permissions change so we can catch eventual former allowed members $object = get_file_activity_object($channel_id, $resource, $cloudPath); - attach_change_permissions($channel_id, $resource, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny, $recurse); + attach_change_permissions($channel_id, $resource, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], $recurse); - file_activity($channel_id, $object, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny, 'post', $notify); + file_activity($channel_id, $object, $x['allow_cid'], $x['allow_gid'], $x['deny_cid'], $x['deny_gid'], 'post', $notify); goaway($cloudPath); } diff --git a/sources/mod/help.php b/sources/mod/help.php index 809313a3..16ec069a 100644 --- a/sources/mod/help.php +++ b/sources/mod/help.php @@ -12,9 +12,6 @@ - - - function load_doc_file($s) { $lang = get_app()->language; if(! isset($lang)) @@ -32,21 +29,6 @@ function load_doc_file($s) { } function find_doc_file($s) { - - // If the file was edited more recently than we've stored a copy in the database, use the file. - // The stored database item will be searchable, the file won't be. - - $r = q("select item.* from item left join item_id on item.id = item_id.iid where service = 'docfile' and - sid = '%s' and item_type = %d limit 1", - dbesc($s), - intval(ITEM_TYPE_DOC) - ); - - if($r) { - if(file_exists($s) && (filemtime($s) > datetime_convert('UTC','UTC',$r[0]['edited'],'U'))) - return file_get_contents($s); - return($r[0]['body']); - } if(file_exists($s)) return file_get_contents($s); return ''; @@ -56,12 +38,9 @@ function search_doc_files($s) { $a = get_app(); - $itemspage = get_pconfig(local_channel(),'system','itemspage'); - $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20)); - $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval($a->pager['itemspage']), intval($a->pager['start'])); - - // If the file was edited more recently than we've stored a copy in the database, use the file. - // The stored database item will be searchable, the file won't be. + $itemspage = get_pconfig(local_channel(),'system','itemspage'); + $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20)); + $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval($a->pager['itemspage']), intval($a->pager['start'])); $regexop = db_getfunc('REGEXP'); @@ -72,11 +51,10 @@ function search_doc_files($s) { ); $r = fetch_post_tags($r,true); - require_once('include/html2plain.php'); for($x = 0; $x < count($r); $x ++) { - $r[$x]['text'] = html2plain(prepare_text($r[$x]['body'],$r[$x]['mimetype'], true)); + $r[$x]['text'] = $r[$x]['body']; $r[$x]['rank'] = 0; if($r[$x]['term']) { @@ -89,16 +67,20 @@ function search_doc_files($s) { if(stristr($r[$x]['sid'],$s)) $r[$x]['rank'] ++; $r[$x]['rank'] += substr_count(strtolower($r[$x]['text']),strtolower($s)); + // bias the results to the observer's native language + if($r[$x]['lang'] === $a->language) + $r[$x]['rank'] = $r[$x]['rank'] + 10; + } usort($r,'doc_rank_sort'); return $r; } -function doc_rank_sort($a,$b) { - if($a['rank'] == $b['rank']) +function doc_rank_sort($s1,$s2) { + if($s1['rank'] == $s2['rank']) return 0; - return (($a['rank'] < $b['rank']) ? 1 : (-1)); + return (($s1['rank'] < $s2['rank']) ? 1 : (-1)); } @@ -118,14 +100,17 @@ function store_doc_file($s) { if(strpos($s,'.md')) - $item['mimetype'] = 'text/markdown'; + $mimetype = 'text/markdown'; elseif(strpos($s,'.html')) - $item['mimetype'] = 'text/html'; + $mimetype = 'text/html'; else - $item['mimetype'] = 'text/bbcode'; + $mimetype = 'text/bbcode'; + require_once('include/html2plain.php'); + + $item['body'] = html2plain(prepare_text(file_get_contents($s),$mimetype, true)); + $item['mimetype'] = 'text/plain'; - $item['body'] = file_get_contents($s); $item['plink'] = z_root() . '/' . str_replace('doc','help',$s); $item['owner_xchan'] = $item['author_xchan'] = $sys['channel_hash']; $item['item_type'] = ITEM_TYPE_DOC; @@ -158,9 +143,12 @@ function help_content(&$a) { nav_set_selected('help'); if($_REQUEST['search']) { + + $o .= '

    ' . t('Documentation Search') . ' - ' . htmlspecialchars($_REQUEST['search']) . '

    '; + $r = search_doc_files($_REQUEST['search']); if($r) { - $o .= '
      '; + $o .= '
        '; foreach($r as $rr) { $dirname = dirname($rr['sid']); $fname = basename($rr['sid']); diff --git a/sources/mod/home.php b/sources/mod/home.php index 242b2dce..bf2463bb 100644 --- a/sources/mod/home.php +++ b/sources/mod/home.php @@ -59,12 +59,14 @@ function home_content(&$a, $update = 0, $load = false) { return $o; } } + if(strpos($frontpage,'http') !== 0) + $frontpage = z_root() . '/' . $frontpage; if(intval(get_config('system','mirror_frontpage'))) { - $o = '' . t('$Projectname') . ''; + $o = '' . t('$Projectname') . ''; echo $o; killme(); } - goaway(z_root() . '/' . $frontpage); + goaway($frontpage); } diff --git a/sources/mod/hostxrd.php b/sources/mod/hostxrd.php index ef86f2dd..0e18c133 100644 --- a/sources/mod/hostxrd.php +++ b/sources/mod/hostxrd.php @@ -2,7 +2,8 @@ function hostxrd_init(&$a) { header('Access-Control-Allow-Origin: *'); - header("Content-type: text/xml"); + header("Content-type: application/xrd+xml"); + logger('hostxrd',LOGGER_DEBUG); $tpl = get_markup_template('xrd_host.tpl'); $x = replace_macros(get_markup_template('xrd_host.tpl'), array( diff --git a/sources/mod/import.php b/sources/mod/import.php index deee0c6e..72d8f92e 100644 --- a/sources/mod/import.php +++ b/sources/mod/import.php @@ -6,6 +6,8 @@ require_once('include/Contact.php'); require_once('include/zot.php'); require_once('include/identity.php'); +require_once('include/import.php'); + function import_post(&$a) { @@ -118,125 +120,47 @@ function import_post(&$a) { // import channel if(array_key_exists('channel',$data)) { - $channel = $data['channel']; if($completed < 1) { + $channel = import_channel($data['channel']); - if(! array_key_exists('channel_system',$channel)) { - $channel['channel_system'] = (($channel['channel_pageflags'] & 0x1000) ? 1 : 0); - $channel['channel_removed'] = (($channel['channel_pageflags'] & 0x8000) ? 1 : 0); - } - - $r = q("select * from channel where (channel_guid = '%s' or channel_hash = '%s' or channel_address = '%s' ) limit 1", - dbesc($channel['channel_guid']), - dbesc($channel['channel_hash']), - dbesc($channel['channel_address']) - ); - - // We should probably also verify the hash - - if($r) { - if($r[0]['channel_guid'] === $channel['channel_guid'] || $r[0]['channel_hash'] === $channel['channel_hash']) { - logger('mod_import: duplicate channel. ', print_r($channel,true)); - notice( t('Cannot create a duplicate channel identifier on this system. Import failed.') . EOL); - return; - } - else { - // try at most ten times to generate a unique address. - $x = 0; - $found_unique = false; - do { - $tmp = $channel['channel_address'] . mt_rand(1000,9999); - $r = q("select * from channel where channel_address = '%s' limit 1", - dbesc($tmp) - ); - if(! $r) { - $channel['channel_address'] = $tmp; - $found_unique = true; - break; - } - $x ++; - } while ($x < 10); - if(! $found_unique) { - logger('mod_import: duplicate channel. randomisation failed.', print_r($channel,true)); - notice( t('Unable to create a unique channel address. Import failed.') . EOL); - return; - } - } - } - - unset($channel['channel_id']); - $channel['channel_account_id'] = get_account_id(); - $channel['channel_primary'] = (($seize) ? 1 : 0); - - dbesc_array($channel); - - $r = dbq("INSERT INTO channel (`" - . implode("`, `", array_keys($channel)) - . "`) VALUES ('" - . implode("', '", array_values($channel)) - . "')" ); - - if(! $r) { - logger('mod_import: channel clone failed. ', print_r($channel,true)); - notice( t('Channel clone failed. Import failed.') . EOL); - return; - } - + } + else { $r = q("select * from channel where channel_account_id = %d and channel_guid = '%s' limit 1", intval(get_account_id()), - $channel['channel_guid'] // Already dbesc'd + dbesc($channel['channel_guid']) ); - if(! $r) { - logger('mod_import: channel not found. ', print_r($channel,true)); - notice( t('Cloned channel not found. Import failed.') . EOL); - return; - } - // reset - $channel = $r[0]; - - set_default_login_identity(get_account_id(),$channel['channel_id'],false); - logger('import step 1'); - $_SESSION['import_step'] = 1; - ref_session_write(session_id(), serialize($_SESSION)); + if($r) + $channel = $r[0]; } - } - else { - $r = q("select * from channel where channel_account_id = %d and channel_guid = '%s' limit 1", - intval(get_account_id()), - dbesc($channel['channel_guid']) - ); - if($r) - $channel = $r[0]; - else { + if(! $channel) { logger('mod_import: channel not found. ', print_r($channel,true)); notice( t('Cloned channel not found. Import failed.') . EOL); return; } } - if($completed < 2) { + if(! $channel) + $channel = $a->get_channel(); + + if(! $channel) { + logger('mod_import: channel not found. ', print_r($channel,true)); + notice( t('No channel. Import failed.') . EOL); + return; + } - $configs = $data['config']; - if($configs) { - foreach($configs as $config) { - unset($config['id']); - $config['uid'] = $channel['channel_id']; - dbesc_array($config); - $r = dbq("INSERT INTO pconfig (`" - . implode("`, `", array_keys($config)) - . "`) VALUES ('" - . implode("', '", array_values($config)) - . "')" ); - } + + if($completed < 2) { + if(is_array($data['config'])) { + import_config($channel,$data['config']); } + logger('import step 2'); $_SESSION['import_step'] = 2; ref_session_write(session_id(), serialize($_SESSION)); } - if($completed < 3) { if($data['photo']) { @@ -244,28 +168,9 @@ function import_post(&$a) { import_channel_photo(base64url_decode($data['photo']['data']),$data['photo']['type'],get_account_id(),$channel['channel_id']); } - $profiles = $data['profile']; - if($profiles) { - foreach($profiles as $profile) { - unset($profile['id']); - $profile['aid'] = get_account_id(); - $profile['uid'] = $channel['channel_id']; + if(is_array($data['profile'])) + import_profiles($channel,$data['profile']); - // we are going to reset all profile photos to the original - // somebody will have to fix this later and put all the applicable photos into the export - - $profile['photo'] = z_root() . '/photo/profile/l/' . $channel['channel_id']; - $profile['thumb'] = z_root() . '/photo/profile/m/' . $channel['channel_id']; - - - dbesc_array($profile); - $r = dbq("INSERT INTO profile (`" - . implode("`, `", array_keys($profile)) - . "`) VALUES ('" - . implode("', '", array_values($profile)) - . "')" ); - } - } logger('import step 3'); $_SESSION['import_step'] = 3; ref_session_write(session_id(), serialize($_SESSION)); @@ -273,37 +178,10 @@ function import_post(&$a) { if($completed < 4) { - $hublocs = $data['hubloc']; - if($hublocs) { - foreach($hublocs as $hubloc) { - if(! array_key_exists('hubloc_primary',$hublocs)) { - $hubloc['hubloc_primary'] = (($hubloc['hubloc_flags'] & 0x0001) ? 1 : 0); - $hubloc['hubloc_orphancheck'] = (($hubloc['hubloc_flags'] & 0x0004) ? 1 : 0); - $hubloc['hubloc_error'] = (($hubloc['hubloc_status'] & 0x0003) ? 1 : 0); - $hubloc['hubloc_deleted'] = (($hubloc['hubloc_flags'] & 0x1000) ? 1 : 0); - } + if(is_array($data['hubloc'])) { + import_hublocs($channel,$data['hubloc'],$seize); - $arr = array( - 'guid' => $hubloc['hubloc_guid'], - 'guid_sig' => $hubloc['guid_sig'], - 'url' => $hubloc['hubloc_url'], - 'url_sig' => $hubloc['hubloc_url_sig'] - ); - if(($hubloc['hubloc_hash'] === $channel['channel_hash']) && intval($hubloc['hubloc_primary']) && ($seize)) - $hubloc['hubloc_primary'] = 0; - - if(! zot_gethub($arr)) { - unset($hubloc['hubloc_id']); - dbesc_array($hubloc); - - $r = dbq("INSERT INTO hubloc (`" - . implode("`, `", array_keys($hubloc)) - . "`) VALUES ('" - . implode("', '", array_values($hubloc)) - . "')" ); - } - } } logger('import step 4'); $_SESSION['import_step'] = 4; @@ -384,6 +262,13 @@ function import_post(&$a) { $xchans = $data['xchan']; if($xchans) { foreach($xchans as $xchan) { + + $hash = make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_guid_sig']); + if($xchan['xchan_network'] === 'zot' && $hash !== $xchan['xchan_hash']) { + logger('forged xchan: ' . print_r($xchan,true)); + continue; + } + if(! array_key_exists('xchan_hidden',$xchan)) { $xchan['xchan_hidden'] = (($xchan['xchan_flags'] & 0x0001) ? 1 : 0); $xchan['xchan_orphan'] = (($xchan['xchan_flags'] & 0x0002) ? 1 : 0); @@ -410,7 +295,7 @@ function import_post(&$a) { require_once('include/photo/photo_driver.php'); - $photos = import_profile_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']); + $photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']); if($photos[4]) $photodate = NULL_DATE; else @@ -435,7 +320,7 @@ function import_post(&$a) { -// FIXME - ensure we have an xchan if somebody is trying to pull a fast one + // FIXME - ensure we have an xchan if somebody is trying to pull a fast one if($completed < 8) { $friends = 0; @@ -544,65 +429,49 @@ function import_post(&$a) { ref_session_write(session_id(), serialize($_SESSION)); } + if(is_array($data['obj'])) + import_objs($channel,$data['obj']); + + if(is_array($data['likes'])) + import_likes($channel,$data['likes']); + + if(is_array($data['app'])) + import_apps($channel,$data['app']); + + if(is_array($data['chatroom'])) + import_chatrooms($channel,$data['chatroom']); + + if(is_array($data['conv'])) + import_conv($channel,$data['conv']); + + if(is_array($data['mail'])) + import_mail($channel,$data['mail']); + + if(is_array($data['event'])) + import_events($channel,$data['event']); + + if(is_array($data['event_item'])) + import_items($channel,$data['event_item']); + + if(is_array($data['menu'])) + import_menus($channel,$data['menu']); + + $addon = array('channel' => $channel,'data' => $data); + call_hooks('import_channel',$addon); + $saved_notification_flags = notifications_off($channel['channel_id']); - if($import_posts && array_key_exists('item',$data) && $data['item']) { - - foreach($data['item'] as $i) { - $item = get_item_elements($i); - - $r = q("select id, edited from item where mid = '%s' and uid = %d limit 1", - dbesc($item['mid']), - intval($channel['channel_id']) - ); - if($r) { - if($item['edited'] > $r[0]['edited']) { - $item['id'] = $r[0]['id']; - $item['uid'] = $channel['channel_id']; - item_store_update($item); - continue; - } - } - else { - $item['aid'] = $channel['channel_account_id']; - $item['uid'] = $channel['channel_id']; - $item_result = item_store($item); - } - - } - - } + if($import_posts && array_key_exists('item',$data) && $data['item']) + import_items($channel,$data['item']); notifications_on($channel['channel_id'],$saved_notification_flags); - if(array_key_exists('item_id',$data) && $data['item_id']) { - foreach($data['item_id'] as $i) { - $r = q("select id from item where mid = '%s' and uid = %d limit 1", - dbesc($i['mid']), - intval($channel['channel_id']) - ); - if(! $r) - continue; - $z = q("select * from item_id where service = '%s' and sid = '%s' and iid = %d and uid = %d limit 1", - dbesc($i['service']), - dbesc($i['sid']), - intval($r[0]['id']), - intval($channel['channel_id']) - ); - if(! $z) { - q("insert into item_id (iid,uid,sid,service) values(%d,%d,'%s','%s')", - intval($r[0]['id']), - intval($channel['channel_id']), - dbesc($i['sid']), - dbesc($i['service']) - ); - } - } - } + + if(array_key_exists('item_id',$data) && $data['item_id']) + import_item_ids($channel,$data['item_id']); - -// FIXME - ensure we have a self entry if somebody is trying to pull a fast one + // FIXME - ensure we have a self entry if somebody is trying to pull a fast one // send out refresh requests // notify old server that it may no longer be primary. diff --git a/sources/mod/import_items.php b/sources/mod/import_items.php index 1e54c0de..6b97939c 100644 --- a/sources/mod/import_items.php +++ b/sources/mod/import_items.php @@ -1,5 +1,6 @@ $r[0]['edited']) { - $item['id'] = $r[0]['id']; - $item['uid'] = $channel['channel_id']; - item_store_update($item); - continue; - } - } - else { - $item['aid'] = $channel['channel_account_id']; - $item['uid'] = $channel['channel_id']; - $item_result = item_store($item); - } - - } - + import_items($channel,$data['item']); } notifications_on($channel['channel_id'],$saved_notification_flags); if(array_key_exists('item_id',$data) && $data['item_id']) { - foreach($data['item_id'] as $i) { - $r = q("select id from item where mid = '%s' and uid = %d limit 1", - dbesc($i['mid']), - intval($channel['channel_id']) - ); - if(! $r) - continue; - $z = q("select * from item_id where service = '%s' and sid = '%s' and iid = %d and uid = %d limit 1", - dbesc($i['service']), - dbesc($i['sid']), - intval($r[0]['id']), - intval($channel['channel_id']) - ); - if(! $z) { - q("insert into item_id (iid,uid,sid,service) values(%d,%d,'%s','%s')", - intval($r[0]['id']), - intval($channel['channel_id']), - dbesc($i['sid']), - dbesc($i['service']) - ); - } - } + import_item_ids($channel,$data['item_id']); } info( t('Import completed') . EOL); diff --git a/sources/mod/invite.php b/sources/mod/invite.php index 1fdfbacc..46fa7b41 100644 --- a/sources/mod/invite.php +++ b/sources/mod/invite.php @@ -73,7 +73,7 @@ function invite_post(&$a) { $account = $a->get_account(); - $res = mail($recip, sprintf( t('Please join us on Red'), $a->config['sitename']), + $res = mail($recip, sprintf( t('Please join us on $Projectname'), $a->config['sitename']), $nmessage, "From: " . $account['account_email'] . "\n" . 'Content-type: text/plain; charset=UTF-8' . "\n" diff --git a/sources/mod/item.php b/sources/mod/item.php index ff6a834e..32c417c5 100644 --- a/sources/mod/item.php +++ b/sources/mod/item.php @@ -107,7 +107,6 @@ function item_post(&$a) { $layout_mid = ((x($_REQUEST,'layout_mid')) ? escape_tags($_REQUEST['layout_mid']): ''); $plink = ((x($_REQUEST,'permalink')) ? escape_tags($_REQUEST['permalink']) : ''); $obj_type = ((x($_REQUEST,'obj_type')) ? escape_tags($_REQUEST['obj_type']) : ACTIVITY_OBJ_NOTE); - // allow API to bulk load a bunch of imported items with sending out a bunch of posts. $nopush = ((x($_REQUEST,'nopush')) ? intval($_REQUEST['nopush']) : 0); @@ -305,6 +304,8 @@ function item_post(&$a) { } } + $acl = new AccessList($channel); + $public_policy = ((x($_REQUEST,'public_policy')) ? escape_tags($_REQUEST['public_policy']) : map_scope($channel['channel_r_stream'],true)); if($webpage) @@ -316,28 +317,17 @@ function item_post(&$a) { $private = 0; // webpages are allowed to change ACLs after the fact. Normal conversation items aren't. if($webpage) { - $str_group_allow = perms2str($_REQUEST['group_allow']); - $str_contact_allow = perms2str($_REQUEST['contact_allow']); - $str_group_deny = perms2str($_REQUEST['group_deny']); - $str_contact_deny = perms2str($_REQUEST['contact_deny']); + $acl->set_from_array($_REQUEST); } else { - $str_group_allow = $orig_post['allow_gid']; - $str_contact_allow = $orig_post['allow_cid']; - $str_group_deny = $orig_post['deny_gid']; - $str_contact_deny = $orig_post['deny_cid']; + $acl->set($orig_post); $public_policy = $orig_post['public_policy']; $private = $orig_post['item_private']; } - if((strlen($str_group_allow)) - || strlen($str_contact_allow) - || strlen($str_group_deny) - || strlen($str_contact_deny) - || strlen($public_policy) - || $private) { + if($private || $public_policy || $acl->is_private()) $private = 1; - } + $location = $orig_post['location']; $coord = $orig_post['coord']; @@ -381,38 +371,23 @@ function item_post(&$a) { } else { + if(! $walltowall) { + if((array_key_exists('contact_allow',$_REQUEST)) + || (array_key_exists('group_allow',$_REQUEST)) + || (array_key_exists('contact_deny',$_REQUEST)) + || (array_key_exists('group_deny',$_REQUEST))) { + $acl->set_from_array($_REQUEST); + } + elseif(! $api_source) { - // if coming from the API and no privacy settings are set, - // use the user default permissions - as they won't have - // been supplied via a form. + // if no ACL has been defined and we aren't using the API, the form + // didn't send us any parameters. This means there's no ACL or it has + // been reset to the default audience. + // If $api_source is set and there are no ACL parameters, we default + // to the channel permissions which were set in the ACL contructor. - if(($api_source) - && (! array_key_exists('contact_allow',$_REQUEST)) - && (! array_key_exists('group_allow',$_REQUEST)) - && (! array_key_exists('contact_deny',$_REQUEST)) - && (! array_key_exists('group_deny',$_REQUEST))) { - $str_group_allow = $channel['channel_allow_gid']; - $str_contact_allow = $channel['channel_allow_cid']; - $str_group_deny = $channel['channel_deny_gid']; - $str_contact_deny = $channel['channel_deny_cid']; - } - elseif($walltowall) { - - // use the channel owner's default permissions - - $str_group_allow = $channel['channel_allow_gid']; - $str_contact_allow = $channel['channel_allow_cid']; - $str_group_deny = $channel['channel_deny_gid']; - $str_contact_deny = $channel['channel_deny_cid']; - } - else { - - // use the posted permissions - - $str_group_allow = perms2str($_REQUEST['group_allow']); - $str_contact_allow = perms2str($_REQUEST['contact_allow']); - $str_group_deny = perms2str($_REQUEST['group_deny']); - $str_contact_deny = perms2str($_REQUEST['contact_deny']); + $acl->set(array('allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '')); + } } @@ -424,33 +399,15 @@ function item_post(&$a) { $body .= trim($_REQUEST['attachment']); $postopts = ''; - $private = ( - ( strlen($str_group_allow) - || strlen($str_contact_allow) - || strlen($str_group_deny) - || strlen($str_contact_deny) - || strlen($public_policy) - ) ? 1 : 0); + $private = intval($acl->is_private() || ($public_policy)); // If this is a comment, set the permissions from the parent. if($parent_item) { $private = 0; - - if(($parent_item['item_private']) - || strlen($parent_item['allow_cid']) - || strlen($parent_item['allow_gid']) - || strlen($parent_item['deny_cid']) - || strlen($parent_item['deny_gid']) - || strlen($parent_item['public_policy'])) { - $private = (($parent_item['item_private']) ? $parent_item['item_private'] : 1); - } - + $acl->set($parent_item); + $private = intval($acl->is_private() || $parent_item['item_private']); $public_policy = $parent_item['public_policy']; - $str_contact_allow = $parent_item['allow_cid']; - $str_group_allow = $parent_item['allow_gid']; - $str_contact_deny = $parent_item['deny_cid']; - $str_group_deny = $parent_item['deny_gid']; $owner_hash = $parent_item['owner_xchan']; } @@ -505,6 +462,11 @@ function item_post(&$a) { } } + $gacl = $acl->get(); + $str_contact_allow = $gacl['allow_cid']; + $str_group_allow = $gacl['allow_gid']; + $str_contact_deny = $gacl['deny_cid']; + $str_group_deny = $gacl['deny_gid']; if($mimetype === 'text/bbcode') { @@ -569,9 +531,6 @@ function item_post(&$a) { $body = preg_replace_callback('/\[img(.*?)\](.*?)\[\/img\]/ism','red_zrlify_img_callback',$body); - - - $body = bb_translate_video($body); /** @@ -692,6 +651,7 @@ function item_post(&$a) { $item_unseen = ((local_channel() != $profile_uid) ? 1 : 0); $item_wall = (($post_type === 'wall' || $post_type === 'wall-comment') ? 1 : 0); $item_origin = (($origin) ? 1 : 0); + $item_consensus = (($consensus) ? 1 : 0); // determine if this is a wall post @@ -856,6 +816,19 @@ function item_post(&$a) { update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid); + if(! $parent) { + $r = q("select * from item where id = %d", + intval($post_id) + ); + if($r) { + xchan_query($r); + $sync_item = fetch_post_tags($r); + $rid = q("select * from item_id where iid = %d", + intval($post_id) + ); + build_sync_packet($uid,array('item' => array(encode_item($sync_item[0],true)),'item_id' => $rid)); + } + } if(! $nopush) proc_run('php', "include/notifier.php", 'edit_post', $post_id); @@ -935,14 +908,28 @@ function item_post(&$a) { // NOTREACHED } - if($parent) { + + update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid); + + if(($parent) && ($parent != $post_id)) { // Store the comment signature information in case we need to relay to Diaspora $ditem = $datarray; $ditem['author'] = $observer; store_diaspora_comment_sig($ditem,$channel,$parent_item, $post_id, (($walltowall_comment) ? 1 : 0)); } - - update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid); + else { + $r = q("select * from item where id = %d", + intval($post_id) + ); + if($r) { + xchan_query($r); + $sync_item = fetch_post_tags($r); + $rid = q("select * from item_id where iid = %d", + intval($post_id) + ); + build_sync_packet($uid,array('item' => array(encode_item($sync_item[0],true)),'item_id' => $rid)); + } + } $datarray['id'] = $post_id; $datarray['llink'] = $a->get_baseurl() . '/display/' . $channel['channel_address'] . '/' . $post_id; @@ -954,6 +941,11 @@ function item_post(&$a) { logger('post_complete'); + + + + + // figure out how to return, depending on from whence we came if($api_source) diff --git a/sources/mod/like.php b/sources/mod/like.php index 9077adbd..ce8bc306 100755 --- a/sources/mod/like.php +++ b/sources/mod/like.php @@ -117,8 +117,7 @@ function like_content(&$a) { } elseif($obj_type == 'thing') { - $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' - and obj_type = %d and term_hash = '%s' limit 1", + $r = q("select * from obj where obj_type = %d and obj_obj = '%s' limit 1", intval(TERM_OBJ_THING), dbesc(argv(2)) ); @@ -146,18 +145,18 @@ function like_content(&$a) { $links = array(); $links[] = array('rel' => 'alternate', 'type' => 'text/html', - 'href' => z_root() . '/thing/' . $r[0]['term_hash']); + 'href' => z_root() . '/thing/' . $r[0]['obj_obj']); if($r[0]['imgurl']) - $links[] = array('rel' => 'photo', 'href' => $r[0]['imgurl']); + $links[] = array('rel' => 'photo', 'href' => $r[0]['obj_imgurl']); $target = json_encode(array( 'type' => $tgttype, - 'title' => $r[0]['term'], - 'id' => z_root() . '/thing/' . $r[0]['term_hash'], + 'title' => $r[0]['obj_term'], + 'id' => z_root() . '/thing/' . $r[0]['obj_obj'], 'link' => $links )); - $plink = '[zrl=' . z_root() . '/thing/' . $r[0]['term_hash'] . ']' . $r[0]['term'] . '[/zrl]'; + $plink = '[zrl=' . z_root() . '/thing/' . $r[0]['obj_obj'] . ']' . $r[0]['obj_term'] . '[/zrl]'; } @@ -220,13 +219,23 @@ function like_content(&$a) { ); if($z) { + $z[0]['deleted'] = 1; + build_sync_packet($ch[0]['channel_id'],array('likes' => $z)); + q("delete from likes where id = %d limit 1", intval($z[0]['id']) ); - drop_item($z[0]['iid'],false); - if($interactive) { - notice( t('Previous action reversed.') . EOL); - return $o; + if($z[0]['i_mid']) { + $r = q("select id from item where mid = '%s' and uid = %d limit 1", + dbesc($z[0]['i_mid']), + intval($ch[0]['channel_id']) + ); + if($r) + drop_item($r[0]['id'],false); + if($interactive) { + notice( t('Previous action reversed.') . EOL); + return $o; + } } killme(); } @@ -480,17 +489,29 @@ function like_content(&$a) { if($extended_like) { - $r = q("insert into likes (channel_id,liker,likee,iid,verb,target_type,target_id,target) values (%d,'%s','%s',%d,'%s','%s','%s','%s')", + $r = q("insert into likes (channel_id,liker,likee,iid,i_mid,verb,target_type,target_id,target) values (%d,'%s','%s',%d,'%s','%s','%s','%s','%s')", intval($ch[0]['channel_id']), dbesc($observer['xchan_hash']), dbesc($ch[0]['channel_hash']), intval($post_id), + dbesc($mid), dbesc($activity), - dbesc(($tgttype)?$tgttype:$objtype), + dbesc(($tgttype)? $tgttype : $objtype), dbesc($obj_id), - dbesc(json_encode(($target)?$target:$object)) + dbesc(($target) ? $target : $object) ); - }; + $r = q("select * from likes where liker = '%s' and likee = '%s' and i_mid = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s' ", + dbesc($observer['xchan_hash']), + dbesc($ch[0]['channel_hash']), + dbesc($mid), + dbesc($activity), + dbesc(($tgttype)? $tgttype : $objtype), + dbesc($obj_id) + ); + if($r) + build_sync_packet($ch[0]['channel_id'],array('likes' => $r)); + + } proc_run('php',"include/notifier.php","like","$post_id"); diff --git a/sources/mod/urlinfo.php b/sources/mod/linkinfo.php similarity index 87% rename from sources/mod/urlinfo.php rename to sources/mod/linkinfo.php index 6b9be3f6..c3df1305 100644 --- a/sources/mod/urlinfo.php +++ b/sources/mod/linkinfo.php @@ -1,29 +1,180 @@ - - - -

        Shiny Trinket

        - -

        Shiny trinkets are shiny.

        - -*/ -if(!function_exists('deletenode')) { - function deletenode(&$doc, $node) - { - $xpath = new DomXPath($doc); - $list = $xpath->query("//".$node); - foreach ($list as $child) - $child->parentNode->removeChild($child); +function linkinfo_content(&$a) { + + logger('linkinfo: ' . print_r($_REQUEST,true)); + + $text = null; + $str_tags = ''; + + + $br = "\n"; + + if(x($_GET,'binurl')) + $url = trim(hex2bin($_GET['binurl'])); + else + $url = trim($_GET['url']); + + if((substr($url,0,1) != '/') && (substr($url,0,4) != 'http')) + $url = 'http://' . $url; + + + if($_GET['title']) + $title = strip_tags(trim($_GET['title'])); + + if($_GET['description']) + $text = strip_tags(trim($_GET['description'])); + + if($_GET['tags']) { + $arr_tags = str_getcsv($_GET['tags']); + if(count($arr_tags)) { + array_walk($arr_tags,'arr_add_hashes'); + $str_tags = $br . implode(' ',$arr_tags) . $br; + } } + + logger('linkinfo: ' . $url); + + $result = z_fetch_url($url,false,0,array('novalidate' => true, 'nobody' => true)); + if($result['success']) { + $hdrs=array(); + $h = explode("\n",$result['header']); + foreach ($h as $l) { + list($k,$v) = array_map("trim", explode(":", trim($l), 2)); + $hdrs[$k] = $v; + } + if (array_key_exists('Content-Type', $hdrs)) + $type = $hdrs['Content-Type']; + if($type) { + $zrl = is_matrix_url($url); + if(stripos($type,'image/') !== false) { + if($zrl) + echo $br . '[zmg]' . $url . '[/zmg]' . $br; + else + echo $br . '[img]' . $url . '[/img]' . $br; + killme(); + } + if(stripos($type,'video/') !== false) { + if($zrl) + echo $br . '[zvideo]' . $url . '[/zvideo]' . $br; + else + echo $br . '[video]' . $url . '[/video]' . $br; + killme(); + } + if(stripos($type,'audio/') !== false) { + if($zrl) + echo $br . '[zaudio]' . $url . '[/zaudio]' . $br; + else + echo $br . '[audio]' . $url . '[/audio]' . $br; + killme(); + } + } + } + + $template = $br . '#^[url=%s]%s[/url]%s' . $br; + + $arr = array('url' => $url, 'text' => ''); + + call_hooks('parse_link', $arr); + + if(strlen($arr['text'])) { + echo $arr['text']; + killme(); + } + + $x = oembed_process($url); + if($x) { + echo $x; + killme(); + } + + if($url && $title && $text) { + + $text = $br . '[quote]' . trim($text) . '[/quote]' . $br; + + $title = str_replace(array("\r","\n"),array('',''),$title); + + $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags; + + logger('linkinfo (unparsed): returns: ' . $result); + + echo $result; + killme(); + } + + $siteinfo = parseurl_getsiteinfo($url); + + // If this is a Red site, use zrl rather than url so they get zids sent to them by default + + if( x($siteinfo,'generator') && (strpos($siteinfo['generator'],PLATFORM_NAME . ' ') === 0)) + $template = str_replace('url','zrl',$template); + + if($siteinfo["title"] == "") { + echo sprintf($template,$url,$url,'') . $str_tags; + killme(); + } else { + $text = $siteinfo["text"]; + $title = $siteinfo["title"]; + } + + $image = ""; + + if(sizeof($siteinfo["images"]) > 0){ + /* Execute below code only if image is present in siteinfo */ + + $total_images = 0; + $max_images = get_config('system','max_bookmark_images'); + if($max_images === false) + $max_images = 2; + else + $max_images = intval($max_images); + + foreach ($siteinfo["images"] as $imagedata) { + if ($url) { + $image .= sprintf('[url=%s]', $url); + } + $image .= '[img='.$imagedata["width"].'x'.$imagedata["height"].']'.$imagedata["src"].'[/img]'; + if ($url) { + $image .= '[/url]'; + } + $image .= "\n"; + $total_images ++; + if($max_images && $max_images >= $total_images) + break; + } + } + + if(strlen($text)) { + $text = $br.'[quote]'.trim($text).'[/quote]'.$br ; + } + + if($image) { + $text = $br.$br.$image.$text; + } + $title = str_replace(array("\r","\n"),array('',''),$title); + + $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags; + + logger('linkinfo: returns: ' . $result, LOGGER_DEBUG); + + echo trim($result); + killme(); + +} + + +function deletexnode(&$doc, $node) { + $xpath = new DomXPath($doc); + $list = $xpath->query("//".$node); + foreach ($list as $child) + $child->parentNode->removeChild($child); } function completeurl($url, $scheme) { @@ -53,6 +204,7 @@ function completeurl($url, $scheme) { return($complete); } + function parseurl_getsiteinfo($url) { $siteinfo = array(); @@ -70,17 +222,17 @@ function parseurl_getsiteinfo($url) { $doc = new DOMDocument(); @$doc->loadHTML($body); - deletenode($doc, 'style'); - deletenode($doc, 'script'); - deletenode($doc, 'option'); - deletenode($doc, 'h1'); - deletenode($doc, 'h2'); - deletenode($doc, 'h3'); - deletenode($doc, 'h4'); - deletenode($doc, 'h5'); - deletenode($doc, 'h6'); - deletenode($doc, 'ol'); - deletenode($doc, 'ul'); + deletexnode($doc, 'style'); + deletexnode($doc, 'script'); + deletexnode($doc, 'option'); + deletexnode($doc, 'h1'); + deletexnode($doc, 'h2'); + deletexnode($doc, 'h3'); + deletexnode($doc, 'h4'); + deletexnode($doc, 'h5'); + deletexnode($doc, 'h6'); + deletexnode($doc, 'ol'); + deletexnode($doc, 'ul'); $xpath = new DomXPath($doc); @@ -215,169 +367,3 @@ function parseurl_getsiteinfo($url) { return($siteinfo); } - -function arr_add_hashes(&$item,$k) { - $item = '#' . $item; -} - -function urlinfo_content(&$a) { - - logger('urlinfo: ' . print_r($_REQUEST,true)); - - $text = null; - $str_tags = ''; - - - $br = "\n"; - - if(x($_GET,'binurl')) - $url = trim(hex2bin($_GET['binurl'])); - else - $url = trim($_GET['url']); - - if((substr($url,0,1) != '/') && (substr($url,0,4) != 'http')) - $url = 'http://' . $url; - - - if($_GET['title']) - $title = strip_tags(trim($_GET['title'])); - - if($_GET['description']) - $text = strip_tags(trim($_GET['description'])); - - if($_GET['tags']) { - $arr_tags = str_getcsv($_GET['tags']); - if(count($arr_tags)) { - array_walk($arr_tags,'arr_add_hashes'); - $str_tags = $br . implode(' ',$arr_tags) . $br; - } - } - - logger('urlinfo: ' . $url); - - $result = z_fetch_url($url,false,0,array('novalidate' => true, 'nobody' => true)); - if($result['success']) { - $hdrs=array(); - $h = explode("\n",$result['header']); - foreach ($h as $l) { - list($k,$v) = array_map("trim", explode(":", trim($l), 2)); - $hdrs[$k] = $v; - } - if (array_key_exists('Content-Type', $hdrs)) - $type = $hdrs['Content-Type']; - if($type) { - $zrl = is_matrix_url($url); - if(stripos($type,'image/') !== false) { - if($zrl) - echo $br . '[zmg]' . $url . '[/zmg]' . $br; - else - echo $br . '[img]' . $url . '[/img]' . $br; - killme(); - } - if(stripos($type,'video/') !== false) { - if($zrl) - echo $br . '[zvideo]' . $url . '[/zvideo]' . $br; - else - echo $br . '[video]' . $url . '[/video]' . $br; - killme(); - } - if(stripos($type,'audio/') !== false) { - if($zrl) - echo $br . '[zaudio]' . $url . '[/zaudio]' . $br; - else - echo $br . '[audio]' . $url . '[/audio]' . $br; - killme(); - } - } - } - - $template = $br . '#^[url=%s]%s[/url]%s' . $br; - - $arr = array('url' => $url, 'text' => ''); - - call_hooks('parse_link', $arr); - - if(strlen($arr['text'])) { - echo $arr['text']; - killme(); - } - - $x = oembed_process($url); - if($x) { - echo $x; - killme(); - } - - if($url && $title && $text) { - - - $text = $br . '[quote]' . trim($text) . '[/quote]' . $br; - - $title = str_replace(array("\r","\n"),array('',''),$title); - - $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags; - - logger('urlinfo (unparsed): returns: ' . $result); - - echo $result; - killme(); - } - - $siteinfo = parseurl_getsiteinfo($url); - - // If this is a Red site, use zrl rather than url so they get zids sent to them by default - - if( x($siteinfo,'generator') && (strpos($siteinfo['generator'],PLATFORM_NAME . ' ') === 0)) - $template = str_replace('url','zrl',$template); - - if($siteinfo["title"] == "") { - echo sprintf($template,$url,$url,'') . $str_tags; - killme(); - } else { - $text = $siteinfo["text"]; - $title = $siteinfo["title"]; - } - - $image = ""; - - if(sizeof($siteinfo["images"]) > 0){ - /* Execute below code only if image is present in siteinfo */ - - $total_images = 0; - $max_images = get_config('system','max_bookmark_images'); - if($max_images === false) - $max_images = 2; - else - $max_images = intval($max_images); - - foreach ($siteinfo["images"] as $imagedata) { - if ($url) { - $image .= sprintf('[url=%s]', $url); - } - $image .= '[img='.$imagedata["width"].'x'.$imagedata["height"].']'.$imagedata["src"].'[/img]'; - if ($url) { - $image .= '[/url]'; - } - $image .= "\n"; - $total_images ++; - if($max_images && $max_images >= $total_images) - break; - } - } - - if(strlen($text)) { - $text = $br.'[quote]'.trim($text).'[/quote]'.$br ; - } - - if($image) { - $text = $br.$br.$image.$text; - } - $title = str_replace(array("\r","\n"),array('',''),$title); - - $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags; - - logger('urlinfo: returns: ' . $result, LOGGER_DEBUG); - - echo trim($result); - killme(); -} diff --git a/sources/mod/locs.php b/sources/mod/locs.php index 3f8bd902..3c6a5da6 100644 --- a/sources/mod/locs.php +++ b/sources/mod/locs.php @@ -50,8 +50,17 @@ function locs_post(&$a) { return; } if(intval($r[0]['hubloc_primary'])) { - notice( t('Primary location cannot be removed.') . EOL); - return; + $x = q("select hubloc_id from hubloc where hubloc_primary = 1 and hubloc_hash = '%s'", + dbesc($channel['channel_hash']) + ); + if(! $x) { + notice( t('Location lookup failed.')); + return; + } + if(count($x) == 1) { + notice( t('Please select another location to become primary before removing the primary location.') . EOL); + return; + } } $r = q("update hubloc set hubloc_deleted = 1 where hubloc_id = %d and hubloc_hash = '%s'", @@ -91,8 +100,6 @@ function locs_content(&$a) { $r[$x]['deleted'] = (intval($r[$x]['hubloc_deleted']) ? true : false); } - - $o = replace_macros(get_markup_template('locmanage.tpl'), array( '$header' => t('Manage Channel Locations'), '$loc' => t('Location (address)'), diff --git a/sources/mod/mail.php b/sources/mod/mail.php index 152db323..884c4156 100644 --- a/sources/mod/mail.php +++ b/sources/mod/mail.php @@ -97,11 +97,15 @@ function mail_post(&$a) { $ret = send_message(0, $recipient, $body, $subject, $replyto, $expires); - if(! $ret['success']) { + if($ret['success']) { + xchan_mail_query($ret['mail']); + build_sync_packet(0,array('conv' => array($ret['conv']),'mail' => array(encode_mail($ret['mail'],true)))); + } + else { notice($ret['message']); } - goaway(z_root() . '/message'); + goaway(z_root() . '/mail/combined'); } @@ -125,43 +129,60 @@ function mail_content(&$a) { $tpl = get_markup_template('mail_head.tpl'); $header = replace_macros($tpl, array( - '$messages' => t('Messages'), - '$tab_content' => $tab_content + '$header' => t('Messages'), )); - if((argc() == 3) && (argv(1) === 'drop')) { - if(! intval(argv(2))) + if((argc() == 4) && (argv(2) === 'drop')) { + if(! intval(argv(3))) return; - $cmd = argv(1); - - $r = private_messages_drop(local_channel(), argv(2)); + $cmd = argv(2); + $mailbox = argv(1); + $r = private_messages_drop(local_channel(), argv(3)); if($r) { - info( t('Message deleted.') . EOL ); + //info( t('Message deleted.') . EOL ); } - goaway($a->get_baseurl(true) . '/message' ); + goaway($a->get_baseurl(true) . '/mail/' . $mailbox); } - if((argc() == 3) && (argv(1) === 'recall')) { - if(! intval(argv(2))) + if((argc() == 4) && (argv(2) === 'recall')) { + if(! intval(argv(3))) return; - $cmd = argv(1); + $cmd = argv(2); + $mailbox = argv(1); $r = q("update mail set mail_recalled = 1 where id = %d and channel_id = %d", - intval(argv(2)), + intval(argv(3)), intval(local_channel()) ); - proc_run('php','include/notifier.php','mail',intval(argv(2))); + $x = q("select * from mail where id = %d and channel_id = %d", + intval(argv(3)), + intval(local_channel()) + ); + if($x) { + build_sync_packet(local_channel(),array('mail' => encode_mail($x[0],true))); + } + + proc_run('php','include/notifier.php','mail',intval(argv(3))); if($r) { info( t('Message recalled.') . EOL ); } - goaway($a->get_baseurl(true) . '/message' ); + goaway($a->get_baseurl(true) . '/mail/' . $mailbox . '/' . argv(3)); } + if((argc() == 4) && (argv(2) === 'dropconv')) { + if(! intval(argv(3))) + return; + $cmd = argv(2); + $mailbox = argv(1); + $r = private_messages_drop(local_channel(), argv(3), true); + if($r) + info( t('Conversation removed.') . EOL ); + goaway($a->get_baseurl(true) . '/mail/' . $mailbox); + } + if((argc() > 1) && (argv(1) === 'new')) { - $o .= $header; - $plaintext = true; $tpl = get_markup_template('msg-header.tpl'); @@ -176,68 +197,48 @@ function mail_content(&$a) { $a->page['htmlhead'] .= $header; - - $preselect = (isset($a->argv[2])?array($a->argv[2]):false); - $prename = $preurl = $preid = ''; - + $prename = ''; + $preid = ''; + if(x($_REQUEST,'hash')) { + $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and abook_xchan = '%s' limit 1", intval(local_channel()), dbesc($_REQUEST['hash']) ); - if($r) { - $prename = $r[0]['xchan_name']; - $preurl = $r[0]['xchan_url']; - $preid = $r[0]['abook_id']; - $preselect = array($preid); + + if(!$r) { + $r = q("select * from xchan where xchan_hash = '%s' and xchan_network = 'zot' limit 1", + dbesc($_REQUEST['hash']) + ); } - } - - if($preselect) { - $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash - where abook_channel = %d and abook_id = %d limit 1", - intval(local_channel()), - intval(argv(2)) - ); if($r) { - $prename = $r[0]['xchan_name']; + $prename = (($r[0]['abook_id']) ? $r[0]['xchan_name'] : $r[0]['xchan_addr']); $preurl = $r[0]['xchan_url']; - $preid = $r[0]['abook_id']; + $preid = (($r[0]['abook_id']) ? ($r[0]['xchan_hash']) : ''); + } + else { + notice( t('Requested channel is not in this network') . EOL ); } - } - $prefill = (($preselect) ? $prename : ''); - - if(! $prefill) { - if(array_key_exists('to',$_REQUEST)) - $prefill = $_REQUEST['to']; } - // the ugly select box - - $select = contact_select('messageto','message-to-select', $preselect, 4, true, false, false, 10); - $tpl = get_markup_template('prv_message.tpl'); $o .= replace_macros($tpl,array( + '$new' => true, '$header' => t('Send Private Message'), '$to' => t('To:'), - '$showinputs' => 'true', - '$prefill' => $prefill, - '$autocomp' => $autocomp, + '$prefill' => $prename, '$preid' => $preid, '$subject' => t('Subject:'), '$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''), '$text' => ((x($_REQUEST,'body')) ? htmlspecialchars($_REQUEST['body'], ENT_COMPAT, 'UTF-8') : ''), - '$readonly' => '', '$yourmessage' => t('Your message:'), - '$select' => $select, '$parent' => '', - '$upload' => t('Upload photo'), '$attach' => t('Attach file'), '$insert' => t('Insert web link'), - '$wait' => t('Please wait'), '$submit' => t('Send'), '$defexpire' => '', '$feature_expire' => ((feature_enabled(local_channel(),'content_expire')) ? true : false), @@ -245,124 +246,137 @@ function mail_content(&$a) { '$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false), '$encrypt' => t('Encrypt text'), '$cipher' => $cipher, - - )); return $o; } + switch(argv(1)) { + case 'combined': + $mailbox = 'combined'; + break; + case 'inbox': + $mailbox = 'inbox'; + break; + case 'outbox': + $mailbox = 'outbox'; + break; + default: + $mailbox = 'combined'; + break; + } - if((argc() > 1) && (intval(argv(1)))) { + $last_message = private_messages_list(local_channel(), $mailbox, 0, 1); - $o .= $header; + $mid = ((argc() > 2) && (intval(argv(2)))) ? argv(2) : $last_message[0]['id']; - $plaintext = true; + $plaintext = true; -// if( local_channel() && feature_enabled(local_channel(),'richtext') ) -// $plaintext = false; - - $messages = private_messages_fetch_conversation(local_channel(), argv(1), true); - - if(! $messages) { - info( t('Message not found.') . EOL); - return $o; - } - - if($messages[0]['to_xchan'] === $channel['channel_hash']) - $a->poi = $messages[0]['from']; - else - $a->poi = $messages[0]['to']; - -// require_once('include/Contact.php'); - -// $a->set_widget('mail_conversant',vcard_from_xchan($a->poi,$get_observer_hash,'mail')); +// if( local_channel() && feature_enabled(local_channel(),'richtext') ) +// $plaintext = false; - $tpl = get_markup_template('msg-header.tpl'); + + if($mailbox == 'combined') { + $messages = private_messages_fetch_conversation(local_channel(), $mid, true); + } + else { + $messages = private_messages_fetch_message(local_channel(), $mid, true); + } + + if(! $messages) { + //info( t('Message not found.') . EOL); + return; + } + + if($messages[0]['to_xchan'] === $channel['channel_hash']) + $a->poi = $messages[0]['from']; + else + $a->poi = $messages[0]['to']; + +// require_once('include/Contact.php'); + +// $a->set_widget('mail_conversant',vcard_from_xchan($a->poi,$get_observer_hash,'mail')); + + + $tpl = get_markup_template('msg-header.tpl'); - $a->page['htmlhead'] .= replace_macros($tpl, array( - '$nickname' => $channel['channel_address'], - '$baseurl' => $a->get_baseurl(true), - '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), - '$linkurl' => t('Please enter a link URL:'), - '$expireswhen' => t('Expires YYYY-MM-DD HH:MM') - )); + $a->page['htmlhead'] .= replace_macros($tpl, array( + '$nickname' => $channel['channel_address'], + '$baseurl' => $a->get_baseurl(true), + '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'), + '$linkurl' => t('Please enter a link URL:'), + '$expireswhen' => t('Expires YYYY-MM-DD HH:MM') + )); + $mails = array(); - $mails = array(); - $seen = 0; - $unknown = false; + $seen = 0; + $unknown = false; - foreach($messages as $message) { + foreach($messages as $message) { - $s = theme_attachments($message); + $s = theme_attachments($message); - $mails[] = array( - 'id' => $message['id'], - 'from_name' => $message['from']['xchan_name'], - 'from_url' => chanlink_hash($message['from_xchan']), - 'from_photo' => $message['from']['xchan_photo_m'], - 'to_name' => $message['to']['xchan_name'], - 'to_url' => chanlink_hash($message['to_xchan']), - 'to_photo' => $message['to']['xchan_photo_m'], - 'subject' => $message['title'], - 'body' => smilies(bbcode($message['body']) . $s), - 'delete' => t('Delete message'), - 'recall' => t('Recall message'), - 'can_recall' => (($channel['channel_hash'] == $message['from_xchan']) ? true : false), - 'is_recalled' => (intval($message['mail_recalled']) ? t('Message has been recalled.') : ''), - 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'), - ); + $mails[] = array( + 'mailbox' => $mailbox, + 'id' => $message['id'], + 'mid' => $message['mid'], + 'from_name' => $message['from']['xchan_name'], + 'from_url' => chanlink_hash($message['from_xchan']), + 'from_photo' => $message['from']['xchan_photo_s'], + 'to_name' => $message['to']['xchan_name'], + 'to_url' => chanlink_hash($message['to_xchan']), + 'to_photo' => $message['to']['xchan_photo_s'], + 'subject' => $message['title'], + 'body' => smilies(bbcode($message['body']) . $s), + 'delete' => t('Delete message'), + 'dreport' => t('Delivery report'), + 'recall' => t('Recall message'), + 'can_recall' => (($channel['channel_hash'] == $message['from_xchan']) ? true : false), + 'is_recalled' => (intval($message['mail_recalled']) ? t('Message has been recalled.') : ''), + 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'), + ); - $seen = $message['seen']; + $seen = $message['seen']; - } - - $recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to' : 'from'); - -// FIXME - move this HTML to template - - $select = $message[$recp]['xchan_name'] . ''; - $parent = ''; - - $tpl = get_markup_template('mail_display.tpl'); - $o = replace_macros($tpl, array( - '$prvmsg_header' => t('Private Conversation'), - '$thread_id' => $a->argv[1], - '$thread_subject' => $message['title'], - '$thread_seen' => $seen, - '$delete' => t('Delete conversation'), - '$canreply' => (($unknown) ? false : '1'), - '$unknown_text' => t("No secure communications available. You may be able to respond from the sender's profile page."), - '$mails' => $mails, - - // reply - '$header' => t('Send Reply'), - '$to' => t('To:'), - '$showinputs' => '', - '$subject' => t('Subject:'), - '$subjtxt' => $message['title'], - '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ', - '$yourmessage' => t('Your message:'), - '$text' => '', - '$select' => $select, - '$parent' => $parent, - '$upload' => t('Upload photo'), - '$attach' => t('Attach file'), - '$insert' => t('Insert web link'), - '$submit' => t('Submit'), - '$wait' => t('Please wait'), - '$defexpire' => '', - '$feature_expire' => ((feature_enabled(local_channel(),'content_expire')) ? true : false), - '$expires' => t('Set expiration date'), - '$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false), - '$encrypt' => t('Encrypt text'), - '$cipher' => $cipher, - - )); - - return $o; } + $recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to' : 'from'); + + $tpl = get_markup_template('mail_display.tpl'); + $o = replace_macros($tpl, array( + '$mailbox' => $mailbox, + '$prvmsg_header' => $message['title'], + '$thread_id' => $mid, + '$thread_subject' => $message['title'], + '$thread_seen' => $seen, + '$delete' => t('Delete Conversation'), + '$canreply' => (($unknown) ? false : '1'), + '$unknown_text' => t("No secure communications available. You may be able to respond from the sender's profile page."), + '$mails' => $mails, + + // reply + '$header' => t('Send Reply'), + '$to' => t('To:'), + '$reply' => true, + '$subject' => t('Subject:'), + '$subjtxt' => $message['title'], + '$yourmessage' => sprintf(t('Your message for %s (%s):'), $message[$recp]['xchan_name'], $message[$recp]['xchan_addr']), + '$text' => '', + '$parent' => $message['parent_mid'], + '$recphash' => $message[$recp]['xchan_hash'], + '$attach' => t('Attach file'), + '$insert' => t('Insert web link'), + '$submit' => t('Submit'), + '$defexpire' => '', + '$feature_expire' => ((feature_enabled(local_channel(),'content_expire')) ? true : false), + '$expires' => t('Set expiration date'), + '$feature_encrypt' => ((feature_enabled(local_channel(),'content_encrypt')) ? true : false), + '$encrypt' => t('Encrypt text'), + '$cipher' => $cipher, + )); + + return $o; + } diff --git a/sources/mod/menu.php b/sources/mod/menu.php index 7763c4ed..bfc45ade 100644 --- a/sources/mod/menu.php +++ b/sources/mod/menu.php @@ -37,6 +37,7 @@ function menu_post(&$a) { $_REQUEST['menu_id'] = intval(argv(1)); $r = menu_edit($_REQUEST); if($r) { + menu_sync_packet($uid,get_observer_hash(),$menu_id); //info( t('Menu updated.') . EOL); goaway(z_root() . '/mitem/' . $menu_id . (($a->is_sys) ? '?f=&sys=1' : '')); } @@ -45,7 +46,9 @@ function menu_post(&$a) { } else { $r = menu_create($_REQUEST); - if($r) { + if($r) { + menu_sync_packet($uid,get_observer_hash(),$r); + //info( t('Menu created.') . EOL); goaway(z_root() . '/mitem/' . $r . (($a->is_sys) ? '?f=&sys=1' : '')); } @@ -56,6 +59,8 @@ function menu_post(&$a) { } + + function menu_content(&$a) { $uid = local_channel(); @@ -121,6 +126,7 @@ function menu_content(&$a) { if(intval(argv(1))) { if(argc() == 3 && argv(2) == 'drop') { + menu_sync_packet($uid,get_observer_hash(),intval(argv(1)),true); $r = menu_delete_id(intval(argv(1)),$uid); if(!$r) notice( t('Menu could not be deleted.'). EOL); diff --git a/sources/mod/message.php b/sources/mod/message.php index 9cf4b698..73239d2c 100644 --- a/sources/mod/message.php +++ b/sources/mod/message.php @@ -24,13 +24,7 @@ function message_content(&$a) { if(! $cipher) $cipher = 'aes256'; - - $tpl = get_markup_template('mail_head.tpl'); - $header = replace_macros($tpl, array( - '$messages' => t('Messages'), - '$tab_content' => $tab_content - )); - +/* if((argc() == 3) && (argv(1) === 'dropconv')) { if(! intval(argv(2))) return; @@ -38,44 +32,73 @@ function message_content(&$a) { $r = private_messages_drop(local_channel(), argv(2), true); if($r) info( t('Conversation removed.') . EOL ); - goaway($a->get_baseurl(true) . '/message' ); + goaway($a->get_baseurl(true) . '/mail/combined' ); } - if(argc() == 1) { - // list messages + if(argc() == 2) { - $o .= $header; + switch(argv(1)) { + case 'combined': + $mailbox = 'combined'; + $header = t('Conversations'); + break; + case 'inbox': + $mailbox = 'inbox'; + $header = t('Received Messages'); + break; + case 'outbox': + $mailbox = 'outbox'; + $header = t('Sent Messages'); + break; + default: + break; + } // private_messages_list() can do other more complicated stuff, for now keep it simple - $r = private_messages_list(local_channel(), '', $a->pager['start'], $a->pager['itemspage']); + $r = private_messages_list(local_channel(), $mailbox, $a->pager['start'], $a->pager['itemspage']); if(! $r) { info( t('No messages.') . EOL); return $o; } - $tpl = get_markup_template('mail_list.tpl'); + $messages = array(); + foreach($r as $rr) { - - $o .= replace_macros($tpl, array( - '$id' => $rr['id'], - '$from_name' => $rr['from']['xchan_name'], - '$from_url' => chanlink_hash($rr['from_xchan']), - '$from_photo' => $rr['from']['xchan_photo_s'], - '$to_name' => $rr['to']['xchan_name'], - '$to_url' => chanlink_hash($rr['to_xchan']), - '$to_photo' => $rr['to']['xchan_photo_s'], - '$subject' => (($rr['seen']) ? $rr['title'] : '' . $rr['title'] . ''), - '$delete' => t('Delete conversation'), - '$body' => smilies(bbcode($rr['body'])), - '$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')), - '$seen' => $rr['seen'] - )); + + $messages[] = array( + 'id' => $rr['id'], + 'from_name' => $rr['from']['xchan_name'], + 'from_url' => chanlink_hash($rr['from_xchan']), + 'from_photo' => $rr['from']['xchan_photo_s'], + 'to_name' => $rr['to']['xchan_name'], + 'to_url' => chanlink_hash($rr['to_xchan']), + 'to_photo' => $rr['to']['xchan_photo_s'], + 'subject' => (($rr['seen']) ? $rr['title'] : '' . $rr['title'] . ''), + 'delete' => t('Delete conversation'), + 'body' => smilies(bbcode($rr['body'])), + 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')), + 'seen' => $rr['seen'] + ); } + + + $tpl = get_markup_template('mail_head.tpl'); + $o = replace_macros($tpl, array( + '$header' => $header, + '$messages' => $messages + )); + + $o .= alt_pager($a,count($r)); + return $o; + + return; + } +*/ - + return; } diff --git a/sources/mod/mitem.php b/sources/mod/mitem.php index bc93165a..d6572bd5 100644 --- a/sources/mod/mitem.php +++ b/sources/mod/mitem.php @@ -64,6 +64,7 @@ function mitem_post(&$a) { $_REQUEST['mitem_id'] = $mitem_id; $r = menu_edit_item($_REQUEST['menu_id'],$uid,$_REQUEST); if($r) { + menu_sync_packet($uid,get_observer_hash(),$_REQUEST['menu_id']); //info( t('Menu element updated.') . EOL); goaway(z_root() . '/mitem/' . $_REQUEST['menu_id'] . (($a->is_sys) ? '?f=&sys=1' : '')); } @@ -74,6 +75,7 @@ function mitem_post(&$a) { else { $r = menu_add_item($_REQUEST['menu_id'],$uid,$_REQUEST); if($r) { + menu_sync_packet($uid,get_observer_hash(),$_REQUEST['menu_id']); //info( t('Menu element added.') . EOL); if($_REQUEST['submit']) { goaway(z_root() . '/menu' . (($a->is_sys) ? '?f=&sys=1' : '')); @@ -125,12 +127,7 @@ function mitem_content(&$a) { $menu_names[] = $menus['menu_name']; } - $perm_defaults = array( - 'allow_cid' => $channel['channel_allow_cid'], - 'allow_gid' => $channel['channel_allow_gid'], - 'deny_cid' => $channel['channel_deny_cid'], - 'deny_gid' => $channel['channel_deny_gid'] - ); + $acl = new AccessList($channel); $lockstate = (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'); @@ -151,7 +148,7 @@ function mitem_content(&$a) { '$menu_id' => $a->data['menu']['menu_id'], '$permissions' => t('Menu Item Permissions'), '$permdesc' => t("\x28click to open/close\x29"), - '$aclselect' => populate_acl($perm_defaults,false), + '$aclselect' => populate_acl($acl->get(),false), '$mitem_desc' => array('mitem_desc', t('Link Name'), '', 'Visible name of the link','*'), '$mitem_link' => array('mitem_link', t('Link or Submenu Target'), '', t('Enter URL of the link or select a menu name to create a submenu'), '*', 'list="menu-names"'), '$usezid' => array('usezid', t('Use magic-auth if available'), true, '', array(t('No'), t('Yes'))), @@ -207,7 +204,9 @@ function mitem_content(&$a) { $lockstate = (($mitem['allow_cid'] || $mitem['allow_gid'] || $mitem['deny_cid'] || $mitem['deny_gid']) ? 'lock' : 'unlock'); if(argc() == 4 && argv(3) == 'drop') { + menu_sync_packet($uid,get_observer_hash(),$mitem['mitem_menu_id']); $r = menu_del_item($mitem['mitem_menu_id'], $uid, intval(argv(2))); + menu_sync_packet($uid,get_observer_hash(),$mitem['mitem_menu_id']); if($r) info( t('Menu item deleted.') . EOL); else diff --git a/sources/mod/network.php b/sources/mod/network.php index d5e30568..53de975a 100644 --- a/sources/mod/network.php +++ b/sources/mod/network.php @@ -115,6 +115,8 @@ function network_content(&$a, $update = 0, $load = false) { $file = ((x($_GET,'file')) ? $_GET['file'] : ''); + $deftag = ''; + if(x($_GET,'search') || x($_GET,'file')) $nouveau = true; if($cid) { @@ -130,7 +132,10 @@ function network_content(&$a, $update = 0, $load = false) { goaway($a->get_baseurl(true) . '/network'); // NOTREACHED } - $def_acl = array('allow_cid' => '<' . $r[0]['abook_xchan'] . '>'); + if($_GET['pf'] === '1') + $deftag = '@' . t('forum') . '+' . intval($cid) . '+'; + else + $def_acl = array('allow_cid' => '<' . $r[0]['abook_xchan'] . '>'); } if(! $update) { @@ -153,17 +158,21 @@ function network_content(&$a, $update = 0, $load = false) { 'deny_gid' => $channel['channel_deny_gid'] ); + $private_editing = ((($group || $cid) && (! intval($_GET['pf']))) ? true : false); + $x = array( 'is_owner' => true, 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''), 'default_location' => $channel['channel_location'], 'nickname' => $channel['channel_address'], - 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'), - 'acl' => populate_acl((($group || $cid) ? $def_acl : $channel_acl)), - 'bang' => (($group || $cid) ? '!' : ''), + 'lockstate' => (($private_editing || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'), + 'acl' => populate_acl((($private_editing) ? $def_acl : $channel_acl)), + 'bang' => (($private_editing) ? '!' : ''), 'visitor' => true, 'profile_uid' => local_channel() ); + if($deftag) + $x['pretext'] = $deftag; $status_editor = status_editor($a,$x); $o .= $status_editor; @@ -223,7 +232,7 @@ function network_content(&$a, $update = 0, $load = false) { if($r) { $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval(local_channel()) . " AND ( author_xchan = '" . dbesc($r[0]['abook_xchan']) . "' or owner_xchan = '" . dbesc($r[0]['abook_xchan']) . "' ) $item_normal ) "; $title = replace_macros(get_markup_template("section_title.tpl"),array( - '$title' => t('Connection: ') . $r[0]['xchan_name'] + '$title' => '' . urlencode($r[0]['xchan_name']) . ' ' . $r[0]['xchan_name'] . '' )); $o = $tabs; $o .= $title; diff --git a/sources/mod/openid.php b/sources/mod/openid.php index 70da2690..b9ca672a 100644 --- a/sources/mod/openid.php +++ b/sources/mod/openid.php @@ -155,7 +155,7 @@ function openid_content(&$a) { ); if($r) { - $photos = import_profile_photo($pphoto,$url); + $photos = import_xchan_photo($pphoto,$url); if($photos) { $z = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s'", diff --git a/sources/mod/photos.php b/sources/mod/photos.php index dc70e4f9..7cd972d8 100644 --- a/sources/mod/photos.php +++ b/sources/mod/photos.php @@ -85,6 +85,7 @@ function photos_post(&$a) { $owner_record = $s[0]; + $acl = new AccessList($a->data['channel']); if((argc() > 3) && (argv(2) === 'album')) { @@ -148,8 +149,9 @@ function photos_post(&$a) { if($r) { foreach($r as $i) { attach_delete($page_owner_uid, $i['resource_id'], 1 ); - drop_item($i['id'],false,DROPITEM_PHASE1,true /* force removal of linked items */); - proc_run('php','include/notifier.php','drop',$i['id']); + // This is now being done in attach_delete() + // drop_item($i['id'],false,DROPITEM_PHASE1,true /* force removal of linked items */); + // proc_run('php','include/notifier.php','drop',$i['id']); } } @@ -181,10 +183,12 @@ function photos_post(&$a) { ); if($r) { + q("DELETE FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'", intval($page_owner_uid), dbesc($r[0]['resource_id']) ); + attach_delete($page_owner_uid, $r[0]['resource_id'], 1 ); $i = q("SELECT * FROM `item` WHERE `resource_id` = '%s' AND resource_type = 'photo' and `uid` = %d LIMIT 1", @@ -200,6 +204,7 @@ function photos_post(&$a) { goaway($a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/album/' . $_SESSION['album_return']); } + if(($a->argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) { @@ -208,10 +213,9 @@ function photos_post(&$a) { $item_id = ((x($_POST,'item_id')) ? intval($_POST['item_id']) : 0); $albname = ((x($_POST,'albname')) ? notags(trim($_POST['albname'])) : ''); $is_nsfw = ((x($_POST,'adult')) ? intval($_POST['adult']) : 0); - $str_group_allow = perms2str($_POST['group_allow']); - $str_contact_allow = perms2str($_POST['contact_allow']); - $str_group_deny = perms2str($_POST['group_deny']); - $str_contact_deny = perms2str($_POST['contact_deny']); + + $acl->set_from_array($_POST); + $perm = $acl->get(); $resource_id = $a->argv[2]; @@ -228,15 +232,46 @@ function photos_post(&$a) { intval($page_owner_uid) ); if(count($r)) { - $ph = photo_factory(dbunescbin($r[0]['data']), $r[0]['type']); + $d = (($r[0]['os_storage']) ? @file_get_contents($r[0]['data']) : dbunescbin($r[0]['data'])); + $ph = photo_factory($d, $r[0]['type']); if($ph->is_valid()) { $rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 ); $ph->rotate($rotate_deg); $width = $ph->getWidth(); $height = $ph->getHeight(); + + if(intval($r[0]['os_storage'])) { + @file_put_contents($r[0]['data'],$ph->imageString()); + $data = $r[0]['data']; + $fsize = @filesize($r[0]['data']); + q("update attach set filesize = %d where hash = '%s' and uid = %d limit 1", + intval($fsize), + dbesc($resource_id), + intval($page_owner_uid) + ); + } + else { + $data = $ph->imageString(); + $fsize = strlen($data); + } - $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 0", + $x = q("update photo set data = '%s', `size` = %d, height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 0", + dbescbin($data), + intval($fsize), + intval($height), + intval($width), + dbesc($resource_id), + intval($page_owner_uid) + ); + + if($width > 1024 || $height > 1024) + $ph->scaleImage(1024); + + $width = $ph->getWidth(); + $height = $ph->getHeight(); + + $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 1", dbescbin($ph->imageString()), intval($height), intval($width), @@ -244,38 +279,40 @@ function photos_post(&$a) { intval($page_owner_uid) ); - if($width > 640 || $height > 640) { + + if($width > 640 || $height > 640) $ph->scaleImage(640); - $width = $ph->getWidth(); - $height = $ph->getHeight(); - - $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 1", - dbescbin($ph->imageString()), - intval($height), - intval($width), - dbesc($resource_id), - intval($page_owner_uid) - ); - } - if($width > 320 || $height > 320) { + $width = $ph->getWidth(); + $height = $ph->getHeight(); + + $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 2", + dbescbin($ph->imageString()), + intval($height), + intval($width), + dbesc($resource_id), + intval($page_owner_uid) + ); + + + if($width > 320 || $height > 320) $ph->scaleImage(320); - $width = $ph->getWidth(); - $height = $ph->getHeight(); - $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 2", - dbescbin($ph->imageString()), - intval($height), - intval($width), - dbesc($resource_id), - intval($page_owner_uid) - ); - } + $width = $ph->getWidth(); + $height = $ph->getHeight(); + + $x = q("update photo set data = '%s', height = %d, width = %d where `resource_id` = '%s' and uid = %d and scale = 3", + dbescbin($ph->imageString()), + intval($height), + intval($width), + dbesc($resource_id), + intval($page_owner_uid) + ); } } } - $p = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `uid` = %d ORDER BY `scale` DESC", + $p = q("SELECT type, is_nsfw, description, resource_id, scale, allow_cid, allow_gid, deny_cid, deny_gid FROM photo WHERE resource_id = '%s' AND uid = %d ORDER BY scale DESC", dbesc($resource_id), intval($page_owner_uid) ); @@ -284,10 +321,10 @@ function photos_post(&$a) { $r = q("UPDATE `photo` SET `description` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d", dbesc($desc), - dbesc($str_contact_allow), - dbesc($str_group_allow), - dbesc($str_contact_deny), - dbesc($str_group_deny), + dbesc($perm['allow_cid']), + dbesc($perm['allow_gid']), + dbesc($perm['deny_cid']), + dbesc($perm['deny_gid']), dbesc($resource_id), intval($page_owner_uid) ); @@ -331,20 +368,20 @@ function photos_post(&$a) { // make sure the linked item has the same permissions as the photo regardless of any other changes $x = q("update item set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d where id = %d", - dbesc($str_contact_allow), - dbesc($str_group_allow), - dbesc($str_contact_deny), - dbesc($str_group_deny), - intval($item_private), + dbesc($perm['allow_cid']), + dbesc($perm['allow_gid']), + dbesc($perm['deny_cid']), + dbesc($perm['deny_gid']), + intval($acl->is_private()), intval($item_id) ); // make sure the attach has the same permissions as the photo regardless of any other changes $x = q("update attach set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where hash = '%s' and uid = %d and is_photo = 1", - dbesc($str_contact_allow), - dbesc($str_group_allow), - dbesc($str_contact_deny), - dbesc($str_group_deny), + dbesc($perm['allow_cid']), + dbesc($perm['allow_gid']), + dbesc($perm['deny_cid']), + dbesc($perm['deny_gid']), dbesc($resource_id), intval($page_owner_uid) ); @@ -418,11 +455,11 @@ function photos_post(&$a) { $_REQUEST['source'] = 'photos'; require_once('include/attach.php'); - if(!local_channel()) { + if(! local_channel()) { $_REQUEST['contact_allow'] = expand_acl($channel['channel_allow_cid']); - $_REQUEST['group_allow'] = expand_acl($channel['channel_allow_gid']); - $_REQUEST['contact_deny'] = expand_acl($channel['channel_deny_cid']); - $_REQUEST['group_deny'] = expand_acl($channel['channel_deny_gid']); + $_REQUEST['group_allow'] = expand_acl($channel['channel_allow_gid']); + $_REQUEST['contact_deny'] = expand_acl($channel['channel_deny_cid']); + $_REQUEST['group_deny'] = expand_acl($channel['channel_deny_gid']); } $r = attach_store($a->channel,get_observer_hash(), '', $_REQUEST); @@ -557,14 +594,10 @@ function photos_content(&$a) { if($_is_owner) { $channel = $a->get_channel(); - $channel_acl = array( - 'allow_cid' => $channel['channel_allow_cid'], - 'allow_gid' => $channel['channel_allow_gid'], - 'deny_cid' => $channel['channel_deny_cid'], - 'deny_gid' => $channel['channel_deny_gid'] - ); + $acl = new AccessList($channel); + $channel_acl = $acl->get(); - $lockstate = (($channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'); + $lockstate = (($acl->is_private()) ? 'lock' : 'unlock'); } $aclselect = (($_is_owner) ? populate_acl($channel_acl,false) : ''); @@ -773,7 +806,7 @@ function photos_content(&$a) { // fetch image, item containing image, then comments - $ph = q("SELECT aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,`type`,height,width,`size`,scale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s' + $ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,`type`,height,width,`size`,scale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s' $sql_extra ORDER BY `scale` ASC ", intval($owner_uid), dbesc($datum) @@ -985,13 +1018,13 @@ function photos_content(&$a) { $likebuttons = ''; if($can_post || $can_comment) { - $likebuttons = replace_macros($like_tpl,array( - '$id' => $link_item['id'], - '$likethis' => t("I like this \x28toggle\x29"), - '$nolike' => t("I don't like this \x28toggle\x29"), - '$share' => t('Share'), - '$wait' => t('Please wait') - )); + $likebuttons = array( + 'id' => $link_item['id'], + 'likethis' => t("I like this \x28toggle\x29"), + 'nolike' => t("I don't like this \x28toggle\x29"), + 'share' => t('Share'), + 'wait' => t('Please wait') + ); } $comments = ''; @@ -1150,7 +1183,7 @@ function photos_content(&$a) { $photo_tpl = get_markup_template('photo_view.tpl'); $o .= replace_macros($photo_tpl, array( - '$id' => $link_item['id'], //$ph[0]['id'], + '$id' => $ph[0]['id'], '$album' => $album_e, '$tools' => $tools, '$lock' => $lockstate[1], diff --git a/sources/mod/post.php b/sources/mod/post.php index dfda7db9..00e599b4 100644 --- a/sources/mod/post.php +++ b/sources/mod/post.php @@ -117,7 +117,7 @@ function post_init(&$a) { } // Try and find a hubloc for the person attempting to auth - $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc limit 1", + $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc", dbesc($address) ); @@ -128,7 +128,7 @@ function post_init(&$a) { $j = json_decode($ret['body'], true); if ($j) import_xchan($j); - $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc limit 1", + $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc", dbesc($address) ); } @@ -144,152 +144,159 @@ function post_init(&$a) { goaway($desturl); } - logger('mod_zot: auth request received from ' . $x[0]['hubloc_addr'] ); - // check credentials and access + foreach($x as $xx) { + logger('mod_zot: auth request received from ' . $xx['hubloc_addr'] ); - // If they are already authenticated and haven't changed credentials, - // we can save an expensive network round trip and improve performance. + // check credentials and access - $remote = remote_channel(); - $result = null; - $remote_service_class = ''; - $remote_level = 0; - $remote_hub = $x[0]['hubloc_url']; - $DNT = 0; + // If they are already authenticated and haven't changed credentials, + // we can save an expensive network round trip and improve performance. - // Also check that they are coming from the same site as they authenticated with originally. + $remote = remote_channel(); + $result = null; + $remote_service_class = ''; + $remote_level = 0; + $remote_hub = $xx['hubloc_url']; + $DNT = 0; - $already_authed = ((($remote) && ($x[0]['hubloc_hash'] == $remote) && ($x[0]['hubloc_url'] === $_SESSION['remote_hub'])) ? true : false); - if($delegate && $delegate !== $_SESSION['delegate_channel']) - $already_authed = false; + // Also check that they are coming from the same site as they authenticated with originally. - $j = array(); + $already_authed = ((($remote) && ($xx['hubloc_hash'] == $remote) && ($xx['hubloc_url'] === $_SESSION['remote_hub'])) ? true : false); + if($delegate && $delegate !== $_SESSION['delegate_channel']) + $already_authed = false; - if (! $already_authed) { + $j = array(); - // Auth packets MUST use ultra top-secret hush-hush mode - e.g. the entire packet is encrypted using the site private key - // The actual channel sending the packet ($c[0]) is not important, but this provides a generic zot packet with a sender - // which can be verified + if (! $already_authed) { + + // Auth packets MUST use ultra top-secret hush-hush mode - e.g. the entire packet is encrypted using the site private key + // The actual channel sending the packet ($c[0]) is not important, but this provides a generic zot packet with a sender + // which can be verified - $p = zot_build_packet($c[0],$type = 'auth_check', array(array('guid' => $x[0]['hubloc_guid'],'guid_sig' => $x[0]['hubloc_guid_sig'])), $x[0]['hubloc_sitekey'], $sec); - if ($test) { - $ret['message'] .= 'auth check packet created using sitekey ' . $x[0]['hubloc_sitekey'] . EOL; - $ret['message'] .= 'packet contents: ' . $p . EOL; - } - - $result = zot_zot($x[0]['hubloc_callback'],$p); - - if (! $result['success']) { - logger('mod_zot: auth_check callback failed.'); + $p = zot_build_packet($c[0],$type = 'auth_check', array(array('guid' => $xx['hubloc_guid'],'guid_sig' => $xx['hubloc_guid_sig'])), $xx['hubloc_sitekey'], $sec); if ($test) { - $ret['message'] .= 'auth check request to your site returned .' . print_r($result, true) . EOL; - json_return_and_die($ret); + $ret['message'] .= 'auth check packet created using sitekey ' . $xx['hubloc_sitekey'] . EOL; + $ret['message'] .= 'packet contents: ' . $p . EOL; } - goaway($desturl); - } - $j = json_decode($result['body'], true); - if (! $j) { - logger('mod_zot: auth_check json data malformed.'); - if($test) { - $ret['message'] .= 'json malformed: ' . $result['body'] . EOL; - json_return_and_die($ret); - } - } - } + $result = zot_zot($xx['hubloc_callback'],$p); - if ($test) { - $ret['message'] .= 'auth check request returned .' . print_r($j, true) . EOL; - } - - if ($already_authed || $j['success']) { - if ($j['success']) { - // legit response, but we do need to check that this wasn't answered by a man-in-middle - if (! rsa_verify($sec . $x[0]['xchan_hash'],base64url_decode($j['confirm']),$x[0]['xchan_pubkey'])) { - logger('mod_zot: auth: final confirmation failed.'); + if (! $result['success']) { + logger('mod_zot: auth_check callback failed.'); if ($test) { - $ret['message'] .= 'final confirmation failed. ' . $sec . print_r($j,true) . print_r($x[0],true); - json_return_and_die($ret); + $ret['message'] .= 'auth check request to your site returned .' . print_r($result, true) . EOL; + continue; } - - goaway($desturl); + continue; } - if (array_key_exists('service_class',$j)) - $remote_service_class = $j['service_class']; - if (array_key_exists('level',$j)) - $remote_level = $j['level']; - if (array_key_exists('DNT',$j)) - $DNT = $j['DNT']; - } - // everything is good... maybe - if(local_channel()) { - - // tell them to logout if they're logged in locally as anything but the target remote account - // in which case just shut up because they don't need to be doing this at all. - - if ($a->channel['channel_hash'] != $x[0]['xchan_hash']) { - logger('mod_zot: auth: already authenticated locally as somebody else.'); - notice( t('Remote authentication blocked. You are logged into this site locally. Please logout and retry.') . EOL); - if ($test) { - $ret['message'] .= 'already logged in locally with a conflicting identity.' . EOL; - json_return_and_die($ret); + $j = json_decode($result['body'], true); + if (! $j) { + logger('mod_zot: auth_check json data malformed.'); + if($test) { + $ret['message'] .= 'json malformed: ' . $result['body'] . EOL; + continue; } } - goaway($desturl); } - // log them in - if ($test) { - $ret['success'] = true; - $ret['message'] .= 'Authentication Success!' . EOL; - json_return_and_die($ret); + $ret['message'] .= 'auth check request returned .' . print_r($j, true) . EOL; } - $delegation_success = false; - if ($delegate) { - $r = q("select * from channel left join xchan on channel_hash = xchan_hash where xchan_addr = '%s' limit 1", - dbesc($delegate) - ); - if ($r && intval($r[0]['channel_id'])) { - $allowed = perm_is_allowed($r[0]['channel_id'],$x[0]['xchan_hash'],'delegate'); - if ($allowed) { - $_SESSION['delegate_channel'] = $r[0]['channel_id']; - $_SESSION['delegate'] = $x[0]['xchan_hash']; - $_SESSION['account_id'] = intval($r[0]['channel_account_id']); - require_once('include/security.php'); - change_channel($r[0]['channel_id']); - $delegation_success = true; + if ($already_authed || $j['success']) { + if ($j['success']) { + // legit response, but we do need to check that this wasn't answered by a man-in-middle + if (! rsa_verify($sec . $xx['xchan_hash'],base64url_decode($j['confirm']),$xx['xchan_pubkey'])) { + logger('mod_zot: auth: final confirmation failed.'); + if ($test) { + $ret['message'] .= 'final confirmation failed. ' . $sec . print_r($j,true) . print_r($xx,true); + continue; + } + + continue; + } + if (array_key_exists('service_class',$j)) + $remote_service_class = $j['service_class']; + if (array_key_exists('level',$j)) + $remote_level = $j['level']; + if (array_key_exists('DNT',$j)) + $DNT = $j['DNT']; + } + // everything is good... maybe + if(local_channel()) { + + // tell them to logout if they're logged in locally as anything but the target remote account + // in which case just shut up because they don't need to be doing this at all. + + if ($a->channel['channel_hash'] != $xx['xchan_hash']) { + logger('mod_zot: auth: already authenticated locally as somebody else.'); + notice( t('Remote authentication blocked. You are logged into this site locally. Please logout and retry.') . EOL); + if ($test) { + $ret['message'] .= 'already logged in locally with a conflicting identity.' . EOL; + continue; + } + } + continue; + } + + // log them in + + if ($test) { + $ret['success'] = true; + $ret['message'] .= 'Authentication Success!' . EOL; + json_return_and_die($ret); + } + + $delegation_success = false; + if ($delegate) { + $r = q("select * from channel left join xchan on channel_hash = xchan_hash where xchan_addr = '%s' limit 1", + dbesc($delegate) + ); + if ($r && intval($r[0]['channel_id'])) { + $allowed = perm_is_allowed($r[0]['channel_id'],$xx['xchan_hash'],'delegate'); + if ($allowed) { + $_SESSION['delegate_channel'] = $r[0]['channel_id']; + $_SESSION['delegate'] = $xx['xchan_hash']; + $_SESSION['account_id'] = intval($r[0]['channel_account_id']); + require_once('include/security.php'); + change_channel($r[0]['channel_id']); + $delegation_success = true; + } } } + + $_SESSION['authenticated'] = 1; + if (! $delegation_success) { + $_SESSION['visitor_id'] = $xx['xchan_hash']; + $_SESSION['my_url'] = $xx['xchan_url']; + $_SESSION['my_address'] = $address; + $_SESSION['remote_service_class'] = $remote_service_class; + $_SESSION['remote_level'] = $remote_level; + $_SESSION['remote_hub'] = $remote_hub; + $_SESSION['DNT'] = $DNT; + } + + $arr = array('xchan' => $xx, 'url' => $desturl, 'session' => $_SESSION); + call_hooks('magic_auth_success',$arr); + $a->set_observer($xx); + require_once('include/security.php'); + $a->set_groups(init_groups_visitor($_SESSION['visitor_id'])); + info(sprintf( t('Welcome %s. Remote authentication successful.'),$xx['xchan_name'])); + logger('mod_zot: auth success from ' . $xx['xchan_addr']); + } + else { + if ($test) { + $ret['message'] .= 'auth failure. ' . print_r($_REQUEST,true) . print_r($j,true) . EOL; + continue; + } + logger('mod_zot: magic-auth failure - not authenticated: ' . $xx['xchan_addr']); } - $_SESSION['authenticated'] = 1; - if (! $delegation_success) { - $_SESSION['visitor_id'] = $x[0]['xchan_hash']; - $_SESSION['my_url'] = $x[0]['xchan_url']; - $_SESSION['my_address'] = $address; - $_SESSION['remote_service_class'] = $remote_service_class; - $_SESSION['remote_level'] = $remote_level; - $_SESSION['remote_hub'] = $remote_hub; - $_SESSION['DNT'] = $DNT; + if ($test) { + $ret['message'] .= 'auth failure fallthrough ' . print_r($_REQUEST,true) . print_r($j,true) . EOL; + continue; } - - $arr = array('xchan' => $x[0], 'url' => $desturl, 'session' => $_SESSION); - call_hooks('magic_auth_success',$arr); - $a->set_observer($x[0]); - require_once('include/security.php'); - $a->set_groups(init_groups_visitor($_SESSION['visitor_id'])); - info(sprintf( t('Welcome %s. Remote authentication successful.'),$x[0]['xchan_name'])); - logger('mod_zot: auth success from ' . $x[0]['xchan_addr']); - } - else { - if($test) { - $ret['message'] .= 'auth failure. ' . print_r($_REQUEST,true) . print_r($j,true) . EOL; - json_return_and_die($ret); - } - logger('mod_zot: magic-auth failure - not authenticated: ' . $x[0]['xchan_addr']); } /** @@ -299,14 +306,13 @@ function post_init(&$a) { * But z_root() probably isn't where you really want to go. */ - if ($test) { - $ret['message'] .= 'auth failure fallthrough ' . print_r($_REQUEST,true) . print_r($j,true) . EOL; - json_return_and_die($ret); - } - if(strstr($desturl,z_root() . '/rmagic')) goaway(z_root()); + if ($test) { + json_return_and_die($ret); + } + goaway($desturl); } } diff --git a/sources/mod/profile_photo.php b/sources/mod/profile_photo.php index 13923a65..7067a9f7 100644 --- a/sources/mod/profile_photo.php +++ b/sources/mod/profile_photo.php @@ -92,12 +92,15 @@ function profile_photo_post(&$a) { $is_default_profile = 1; if($_REQUEST['profile']) { - $r = q("select id, is_default from profile where id = %d and uid = %d limit 1", + $r = q("select id, profile_guid, is_default, gender from profile where id = %d and uid = %d limit 1", intval($_REQUEST['profile']), intval(local_channel()) ); - if(($r) && (! intval($r[0]['is_default']))) - $is_default_profile = 0; + if($r) { + $profile = $r[0]; + if(! intval($profile['is_default'])) + $is_default_profile = 0; + } } @@ -130,7 +133,7 @@ function profile_photo_post(&$a) { if($r) { $base_image = $r[0]; - $base_image['data'] = dbunescbin($base_image['data']); + $base_image['data'] = (($r[0]['os_storage']) ? @file_get_contents($base_image['data']) : dbunescbin($base_image['data'])); $im = photo_factory($base_image['data'], $base_image['type']); if($im->is_valid()) { @@ -167,6 +170,8 @@ function profile_photo_post(&$a) { return; } + $channel = $a->get_channel(); + // If setting for the default profile, unset the profile photo flag from any other photos I own if($is_default_profile) { @@ -177,6 +182,9 @@ function profile_photo_post(&$a) { dbesc($base_image['resource_id']), intval(local_channel()) ); + + send_profile_photo_activity($channel,$base_image,$profile); + } else { $r = q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d", @@ -190,7 +198,6 @@ function profile_photo_post(&$a) { // We'll set the updated profile-photo timestamp even if it isn't the default profile, // so that browsers will do a cache update unconditionally - $channel = $a->get_channel(); $r = q("UPDATE xchan set xchan_photo_mimetype = '%s', xchan_photo_date = '%s' where xchan_hash = '%s'", @@ -206,7 +213,9 @@ function profile_photo_post(&$a) { // Now copy profile-permissions to pictures, to prevent privacyleaks by automatically created folder 'Profile Pictures' - profile_photo_set_profile_perms($_REQUEST['profile']); + profile_photo_set_profile_perms($_REQUEST['profile']); + + } else @@ -238,16 +247,19 @@ function profile_photo_post(&$a) { notice( t('Image upload failed.') . EOL ); return; } + $os_storage = false; + foreach($i as $ii) { if(intval($ii['scale']) < 2) { $smallest = intval($ii['scale']); + $os_storage = intval($ii['os_storage']); $imagedata = $ii['data']; $filetype = $ii['type']; } } } -// $imagedata = @file_get_contents($src); + $imagedata = (($os_storage) ? @file_get_contents($imagedata) : $imagedata); $ph = photo_factory($imagedata, $filetype); if(! $ph->is_valid()) { @@ -259,6 +271,59 @@ function profile_photo_post(&$a) { } +function send_profile_photo_activity($channel,$photo,$profile) { + + // for now only create activities for the default profile + + if(! intval($profile['is_default'])) + return; + + $arr = array(); + $arr['item_thread_top'] = 1; + $arr['item_origin'] = 1; + $arr['item_wall'] = 1; + $arr['obj_type'] = ACTIVITY_OBJ_PHOTO; + $arr['verb'] = ACTIVITY_UPDATE; + + $arr['object'] = json_encode(array( + 'type' => $arr['obj_type'], + 'id' => z_root() . '/photo/profile/l/' . $channel['channel_id'], + 'link' => array('rel' => 'photo', 'type' => $photo['type'], 'href' => z_root() . '/photo/profile/l/' . $channel['channel_id']) + )); + + if(stripos($profile['gender'],t('female')) !== false) + $t = t('%1$s updated her %2$s'); + elseif(stripos($profile['gender'],t('male')) !== false) + $t = t('%1$s updated his %2$s'); + else + $t = t('%1$s updated their %2$s'); + + $ptext = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']' . t('profile photo') . '[/zrl]'; + + $ltext = '[zrl=' . z_root() . '/profile/' . $channel['channel_address'] . ']' . '[zmg=150x150]' . z_root() . '/photo/' . $photo['resource_id'] . '-4[/zmg][/zrl]'; + + $arr['body'] = sprintf($t,$channel['channel_name'],$ptext) . "\n\n" . $ltext; + + $acl = new AccessList($channel); + $x = $acl->get(); + $arr['allow_cid'] = $x['allow_cid']; + + $arr['allow_gid'] = $x['allow_gid']; + $arr['deny_cid'] = $x['deny_cid']; + $arr['deny_gid'] = $x['deny_gid']; + + $arr['uid'] = $channel['channel_id']; + $arr['aid'] = $channel['channel_account_id']; + + $arr['owner_xchan'] = $channel['channel_hash']; + $arr['author_xchan'] = $channel['channel_hash']; + + post_activity_item($arr); + + +} + + /* @brief Generate content of profile-photo view * * @param $a Current application @@ -332,7 +397,7 @@ function profile_photo_content(&$a) { goaway($a->get_baseurl() . '/profiles'); } - $r = q("SELECT `data`, `type` FROM photo WHERE id = %d and uid = %d limit 1", + $r = q("SELECT `data`, `type`, resource_id, os_storage FROM photo WHERE id = %d and uid = %d limit 1", intval($r[0]['id']), intval(local_channel()) @@ -342,9 +407,31 @@ function profile_photo_content(&$a) { return; } - $ph = photo_factory(dbunescbin($r[0]['data']), $r[0]['type']); - // go ahead as if we have just uploaded a new photo to crop - profile_photo_crop_ui_head($a, $ph); + if(intval($r[0]['os_storage'])) + $data = @file_get_contents($r[0]['data']); + else + $data = dbunescbin($r[0]['data']); + + $ph = photo_factory($data, $r[0]['type']); + $smallest = 0; + if($ph->is_valid()) { + // go ahead as if we have just uploaded a new photo to crop + $i = q("select resource_id, scale from photo where resource_id = '%s' and uid = %d order by scale", + dbesc($r[0]['resource_id']), + intval(local_channel()) + ); + + if($i) { + $hash = $i[0]['resource_id']; + foreach($i as $ii) { + if(intval($ii['scale']) < 2) { + $smallest = intval($ii['scale']); + } + } + } + } + + profile_photo_crop_ui_head($a, $ph, $hash, $smallest); } $profiles = q("select id, profile_name as name, is_default from profile where uid = %d", diff --git a/sources/mod/public.php b/sources/mod/public.php index 2106be7a..45edda6c 100644 --- a/sources/mod/public.php +++ b/sources/mod/public.php @@ -22,7 +22,7 @@ function public_content(&$a, $update = 0, $load = false) { $maxheight = get_config('system','home_divmore_height'); if(! $maxheight) - $maxheight = 75; + $maxheight = 400; $o .= '
        ' . "\r\n"; $o .= " @@ -40,7 +40,7 @@ {{/foreach}} - +
        {{else}}

        {{$no_pending}}

        @@ -79,10 +79,10 @@ {{/foreach}} - +
        {{else}} NO USERS?!? {{/if}} -
    \ No newline at end of file + diff --git a/sources/view/tpl/app.tpl b/sources/view/tpl/app.tpl index cebc17d4..3394cd2a 100644 --- a/sources/view/tpl/app.tpl +++ b/sources/view/tpl/app.tpl @@ -1,19 +1,25 @@
    - -
    {{$app.name}}
    -
    -{{if $app.type !== 'system'}} -{{if $purchase}} - -{{/if}} -{{if $install || $update || $delete }} -
    - -{{if $install}}{{/if}} -{{if $edit}}{{/if}} -{{if $delete}}{{/if}} -
    -{{/if}} -{{/if}} + + {{if $app.type !== 'system'}} + {{if $purchase}} +
    + +
    + {{/if}} + {{if $install || $update || $delete }} +
    +
    + + {{if $install}}{{/if}} + {{if $edit}}{{/if}} + {{if $delete}}{{/if}} +
    +
    + {{/if}} + {{/if}}
    diff --git a/sources/view/tpl/bookmarkedchats.tpl b/sources/view/tpl/bookmarkedchats.tpl index 7635bb82..ab4372c2 100644 --- a/sources/view/tpl/bookmarkedchats.tpl +++ b/sources/view/tpl/bookmarkedchats.tpl @@ -1,7 +1,7 @@ {{if $rooms}}

    {{$header}}

    -
      +
    + {{if $quota.limit || $quota.used}}{{/if}} diff --git a/sources/view/tpl/cloud_header.tpl b/sources/view/tpl/cloud_header.tpl index c75815d0..076fa16c 100644 --- a/sources/view/tpl/cloud_header.tpl +++ b/sources/view/tpl/cloud_header.tpl @@ -4,8 +4,8 @@ {{if $is_owner}}  {{$shared}} {{/if}} - - + +
    {{/if}}

    {{$header}}

    diff --git a/sources/view/tpl/conv_item.tpl b/sources/view/tpl/conv_item.tpl index 30a007bd..760d64db 100755 --- a/sources/view/tpl/conv_item.tpl +++ b/sources/view/tpl/conv_item.tpl @@ -8,51 +8,75 @@
    -
    -
    - {{$item.name}} + {{if $item.photo}} +
    + {{$item.photo}} +
    + {{/if}} +
    +
    +
    + {{$item.name}} +
    +
    -
    -
    - {{if $item.title}} -
    -

    {{if $item.title_tosource}}{{if $item.plink}}{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}{{/if}}{{/if}}

    -
    - {{/if}} - {{if $item.lock}} - - {{/if}} -
    - {{$item.name}}{{if $item.owner_url}} {{$item.via}} {{$item.owner_name}}{{/if}} -
    -
    - {{if $item.verified}} {{elseif $item.forged}} {{/if}}{{if $item.location}}{{$item.location}}, {{/if}}{{$item.localtime}}{{if $item.editedtime}} {{$item.editedtime}}{{/if}}{{if $item.expiretime}} {{$item.expiretime}}{{/if}}{{if $item.editedtime}} {{/if}} {{if $item.app}}{{$item.str_app}}{{/if}} + {{if $item.title}} +
    +

    {{if $item.title_tosource}}{{if $item.plink}}{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}{{/if}}{{/if}}

    +
    + {{/if}} + {{if $item.lock}} + + {{/if}} +
    + {{$item.name}}{{if $item.owner_url}} {{$item.via}} {{$item.owner_name}}{{/if}} +
    +
    + {{if $item.verified}} {{elseif $item.forged}} {{/if}}{{if $item.location}}{{$item.location}}, {{/if}}{{$item.localtime}}{{if $item.editedtime}} {{$item.editedtime}}{{/if}}{{if $item.expiretime}} {{$item.expiretime}}{{/if}}{{if $item.editedtime}} {{/if}} {{if $item.app}}{{$item.str_app}}{{/if}} +
    +
    + + {{if $item.body}}
    -
    {{$item.body}} - {{if $item.tags}} -
    - {{foreach $item.tags as $tag}} - {{$tag}} - {{/foreach}} -
    - {{/if}} - {{if $item.has_cats}} -
    - {{$item.txt_cats}} {{foreach $item.categories as $cat}}{{$cat.name}} [{{$remove}}] {{if $cat.last}}{{else}}, {{/if}}{{/foreach}} -
    - {{/if}} - {{if $item.has_folders}} -
    - {{$item.txt_folders}} {{foreach $item.folders as $cat}}{{$cat.name}} [{{$remove}}] {{if $cat.last}}{{else}}, {{/if}}{{/foreach}} -
    - {{/if}}
    +
    + {{/if}} + {{if $item.has_tags}} +
    + {{if $item.mentions}} +
    + {{$item.mentions}} +
    + {{/if}} + {{if $item.tags}} +
    + {{$item.tags}} +
    + {{/if}} + {{if $item.categories}} +
    + {{$item.categories}} +
    + {{/if}} + {{if $item.folders}} +
    + {{$item.folders}} +
    + {{/if}} + {{if $item.attachments}} +
    + {{$item.attachments}} +
    + {{/if}} +
    +
    + {{/if}}
    {{if $item.like}} @@ -123,6 +147,11 @@ {{if $item.item_photo_menu}} {{$item.item_photo_menu}} + + {{if $item.edpost}} +
  • {{$item.dreport}}
  • + {{/if}} + {{/if}}
    @@ -162,6 +191,7 @@ {{/foreach}}
    {{/if}} +
    diff --git a/sources/view/tpl/conv_list.tpl b/sources/view/tpl/conv_list.tpl index 5487d593..a3fb642c 100755 --- a/sources/view/tpl/conv_list.tpl +++ b/sources/view/tpl/conv_list.tpl @@ -8,51 +8,73 @@
    -
    -
    - {{$item.name}} + {{if $item.photo}} +
    + {{$item.photo}} +
    + {{/if}} +
    +
    +
    + {{$item.name}} +
    +
    -
    + {{if $item.title}} +
    +

    {{if $item.title_tosource}}{{if $item.plink}}{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}{{/if}}{{/if}}

    +
    + {{/if}} + {{if $item.lock}} + + {{/if}} +
    + {{$item.name}}{{if $item.owner_url}} {{$item.via}} {{$item.owner_name}}{{/if}} +
    +
    + {{if $item.verified}} {{elseif $item.forged}} {{/if}}{{if $item.location}}{{$item.location}}, {{/if}}{{$item.localtime}}{{if $item.editedtime}} {{$item.editedtime}}{{/if}}{{if $item.expiretime}} {{$item.expiretime}}{{/if}}{{if $item.editedtime}} {{/if}} {{if $item.app}}{{$item.str_app}}{{/if}} +
    +
    - {{if $item.title}} -
    -

    {{if $item.title_tosource}}{{if $item.plink}}{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}{{/if}}{{/if}}

    -
    - {{/if}} - {{if $item.lock}} - - {{/if}} -
    - {{$item.name}}{{if $item.owner_url}} {{$item.via}} {{$item.owner_name}}{{/if}} -
    -
    - {{if $item.verified}} {{elseif $item.forged}} {{/if}}{{if $item.location}}{{$item.location}}, {{/if}}{{$item.localtime}}{{if $item.editedtime}} {{$item.editedtime}}{{/if}}{{if $item.expiretime}} {{$item.expiretime}}{{/if}}{{if $item.editedtime}} {{/if}} {{if $item.app}}{{$item.str_app}}{{/if}} -
    -
    -
    -
    +
    +
    {{$item.body}} - {{if $item.tags}} -
    - {{foreach $item.tags as $tag}} - {{$tag}} - {{/foreach}} -
    - {{/if}} - {{if $item.has_cats}} -
    - {{$item.txt_cats}} {{foreach $item.categories as $cat}}{{$cat.name}} [{{$remove}}] {{if $cat.last}}{{else}}, {{/if}}{{/foreach}} -
    - {{/if}} - {{if $item.has_folders}} -
    - {{$item.txt_folders}} {{foreach $item.folders as $cat}}{{$cat.name}} [{{$remove}}] {{if $cat.last}}{{else}}, {{/if}}{{/foreach}} -
    - {{/if}}
    +
    + {{if $item.has_tags}} +
    + {{if $item.mentions}} +
    + {{$item.mentions}} +
    + {{/if}} + {{if $item.tags}} +
    + {{$item.tags}} +
    + {{/if}} + {{if $item.categories}} +
    + {{$item.categories}} +
    + {{/if}} + {{if $item.folders}} +
    + {{$item.folders}} +
    + {{/if}} + {{if $item.attachments}} +
    + {{$item.attachments}} +
    + {{/if}} +
    +
    + {{/if}} +
    {{if $item.like}} @@ -176,6 +198,7 @@ {{/foreach}} {{/if}}
    +
    diff --git a/sources/view/tpl/cropbody.tpl b/sources/view/tpl/cropbody.tpl index 4794c0b8..01d9a24a 100755 --- a/sources/view/tpl/cropbody.tpl +++ b/sources/view/tpl/cropbody.tpl @@ -27,8 +27,8 @@ previewWrap: 'previewWrap', minWidth: 300, minHeight: 300, - maxWidth: 640, - maxHeight: 640, + maxWidth: 1024, + maxHeight: 1024, ratioDim: { x: 100, y:100 }, displayOnInit: true, onEndCrop: onEndCrop diff --git a/sources/view/tpl/email_notify_html.tpl b/sources/view/tpl/email_notify_html.tpl index ae3e8c01..a2159c88 100755 --- a/sources/view/tpl/email_notify_html.tpl +++ b/sources/view/tpl/email_notify_html.tpl @@ -7,7 +7,7 @@ - + diff --git a/sources/view/tpl/item_attach.tpl b/sources/view/tpl/item_attach.tpl index eeea2596..7638f39e 100644 --- a/sources/view/tpl/item_attach.tpl +++ b/sources/view/tpl/item_attach.tpl @@ -1,8 +1,5 @@ -
    {{if $attaches}} -
    - {{foreach $attaches as $a}} - - {{/foreach}} -
    +{{foreach $attaches as $a}} + {{$a.label}} +{{/foreach}} {{/if}} diff --git a/sources/view/tpl/item_categories.tpl b/sources/view/tpl/item_categories.tpl index ec2639a6..eea0e0b8 100644 --- a/sources/view/tpl/item_categories.tpl +++ b/sources/view/tpl/item_categories.tpl @@ -1,7 +1,7 @@ {{if $categories}}
    {{foreach $categories as $cat}} - {{if $cat.url}}{{$cat.term}}{{else}}{{$cat.term}}{{/if}} +{{if $cat.url}}{{$cat.term}}{{else}}{{$cat.term}}{{/if}} {{/foreach}}
    {{/if}} diff --git a/sources/view/tpl/jot-header.tpl b/sources/view/tpl/jot-header.tpl index 424d856e..7e12c6bb 100755 --- a/sources/view/tpl/jot-header.tpl +++ b/sources/view/tpl/jot-header.tpl @@ -3,6 +3,7 @@ var editor = false; var textlen = 0; var plaintext = '{{$editselect}}'; +var pretext = '{{$pretext}}'; function initEditor(cb){ if (editor==false){ @@ -21,6 +22,8 @@ function initEditor(cb){ }); $(".jothidden").show(); if (typeof cb!="undefined") cb(); + if(pretext.length) + addeditortext(pretext); return; } tinyMCE.init({ @@ -191,7 +194,7 @@ function enableOnUser(){ if(reply && reply.length) { reply = bin2hex(reply); $('#profile-rotator').spin('tiny'); - $.get('{{$baseurl}}/urlinfo?f=&binurl=' + reply, function(data) { + $.get('{{$baseurl}}/linkinfo?f=&binurl=' + reply, function(data) { addeditortext(data); $('#profile-rotator').spin(false); }); @@ -258,7 +261,7 @@ function enableOnUser(){ if(reply && reply.length) { reply = bin2hex(reply); $('#profile-rotator').spin('tiny'); - $.get('{{$baseurl}}/urlinfo?f=&binurl=' + reply, function(data) { + $.get('{{$baseurl}}/linkinfo?f=&binurl=' + reply, function(data) { if (!editor) $("#profile-jot-text").val(""); initEditor(function(){ addeditortext(data); diff --git a/sources/view/tpl/jot.tpl b/sources/view/tpl/jot.tpl index 100dd15b..e61d75fe 100755 --- a/sources/view/tpl/jot.tpl +++ b/sources/view/tpl/jot.tpl @@ -3,7 +3,7 @@ {{if $parent}} {{/if}} - + @@ -47,19 +47,19 @@
    - - - - -
    diff --git a/sources/view/tpl/locmanage.tpl b/sources/view/tpl/locmanage.tpl index 40f91a8b..4ace457e 100644 --- a/sources/view/tpl/locmanage.tpl +++ b/sources/view/tpl/locmanage.tpl @@ -12,15 +12,15 @@ function drophub(id) {
    {{$product}}
    {{$product}}
    {{$preamble}}
    {{foreach $hubs as $hub}} +{{if ! $hub.deleted }} +{{$hub.hubloc_url}} ({{$hub.hubloc_addr}}) - + +{{/if}} {{/foreach}}
    {{$loc}}{{$mkprm}}{{$drop}}
    -{{if $hub.deleted}}{{/if}} -{{$hub.hubloc_url}} ({{$hub.hubloc_addr}}){{if $hub.deleted}}{{/if}} - -{{if $hub.primary}}{{else}}{{/if}} +{{if $hub.primary}}{{else}}{{/if}} {{if $hub.primary}}{{else}}{{if ! $hub.deleted}}{{/if}}{{/if}}
    diff --git a/sources/view/tpl/mail_conv.tpl b/sources/view/tpl/mail_conv.tpl index ec8f8c1e..4f54f1a6 100755 --- a/sources/view/tpl/mail_conv.tpl +++ b/sources/view/tpl/mail_conv.tpl @@ -1,18 +1,41 @@ -
    +
    - {{$mail.from_name}} -
    {{$mail.from_name}}
    + {{$mail.from_name}}
    -
    +
    {{if $mail.is_recalled}}{{$mail.is_recalled}}{{/if}} -
    {{$mail.date}}
    -
    {{$mail.subject}}
    -
    {{$mail.body}}
    -
    - {{if $mail.can_recall}} -
    - {{/if}} -
    + +
    {{$mail.date}}
    +
    +
    +
    +
    + {{$mail.body}} +
    +
    + +
    +
    +
    -
    -
    diff --git a/sources/view/tpl/mail_display.tpl b/sources/view/tpl/mail_display.tpl index 523a9160..24e76357 100755 --- a/sources/view/tpl/mail_display.tpl +++ b/sources/view/tpl/mail_display.tpl @@ -1,12 +1,20 @@ -

    {{$prvmsg_header}}

    -{{foreach $mails as $mail}} - {{include file="mail_conv.tpl"}} -{{/foreach}} +
    + {{if $mailbox == 'combined'}} + {{$delete}} + {{/if}} +

    {{$prvmsg_header}}

    +
    +
    +
    + {{foreach $mails as $mail}} + {{include file="mail_conv.tpl"}} + {{/foreach}} -{{if $canreply}} -{{include file="prv_message.tpl"}} -{{else}} -{{$unknown_text}} -{{/if}} + {{if $canreply}} + {{include file="prv_message.tpl"}} + {{else}} + {{$unknown_text}} + {{/if}} +
    diff --git a/sources/view/tpl/mail_head.tpl b/sources/view/tpl/mail_head.tpl index 1cd7145e..d52fa40e 100755 --- a/sources/view/tpl/mail_head.tpl +++ b/sources/view/tpl/mail_head.tpl @@ -1,3 +1,8 @@ -

    {{$messages}}

    - -{{$tab_content}} +
    +

    {{$header}}

    + +
    diff --git a/sources/view/tpl/mail_list.tpl b/sources/view/tpl/mail_list.tpl index 1d499e12..fc9b5afa 100755 --- a/sources/view/tpl/mail_list.tpl +++ b/sources/view/tpl/mail_list.tpl @@ -1,8 +1,7 @@ -
    - {{$from_name}} - {{$from_name}} - {{$subject}} - {{$date}} - -
     
    -
    +
  • + + {{$message.subject}}
    + {{$message.from_name}} > {{$message.to_name}}
    + {{$message.date}} +
    +
  • diff --git a/sources/view/tpl/message_side.tpl b/sources/view/tpl/message_side.tpl index 3e32eae1..6ea63c21 100755 --- a/sources/view/tpl/message_side.tpl +++ b/sources/view/tpl/message_side.tpl @@ -1,14 +1,9 @@

    {{$title}}

    - {{if $tabs}} - - {{/if}}
    diff --git a/sources/view/tpl/msg-header.tpl b/sources/view/tpl/msg-header.tpl index 20d0dd91..3407e152 100755 --- a/sources/view/tpl/msg-header.tpl +++ b/sources/view/tpl/msg-header.tpl @@ -48,17 +48,6 @@ else