Merge branch 'develop' of https://github.com/gerhard6380/friendica into develop
This commit is contained in:
commit
c73d961198
236 changed files with 32715 additions and 26533 deletions
56
Vagrantfile
vendored
56
Vagrantfile
vendored
|
@ -5,12 +5,15 @@ server_timezone = "UTC"
|
||||||
|
|
||||||
public_folder = "/vagrant"
|
public_folder = "/vagrant"
|
||||||
|
|
||||||
Vagrant.configure("2") do |config|
|
Vagrant.configure(2) do |config|
|
||||||
|
|
||||||
# Set server to Ubuntu 12.04
|
# Set server to Ubuntu 14.04
|
||||||
config.vm.box = "precise64"
|
config.vm.box = "ubuntu/trusty64"
|
||||||
|
|
||||||
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
|
# Disable automatic box update checking. If you disable this, then
|
||||||
|
# boxes will only be checked for updates when the user runs
|
||||||
|
# `vagrant box outdated`. This is not recommended.
|
||||||
|
# config.vm.box_check_update = false
|
||||||
|
|
||||||
# Create a hostname, don't forget to put it to the `hosts` file
|
# Create a hostname, don't forget to put it to the `hosts` file
|
||||||
# This will point to the server's default virtual host
|
# This will point to the server's default virtual host
|
||||||
|
@ -20,40 +23,21 @@ Vagrant.configure("2") do |config|
|
||||||
# Create a static IP
|
# Create a static IP
|
||||||
config.vm.network :private_network, ip: server_ip
|
config.vm.network :private_network, ip: server_ip
|
||||||
|
|
||||||
# If using VirtualBox
|
# Share a folder between host and guest
|
||||||
config.vm.provider :virtualbox do |vb|
|
config.vm.synced_folder "./", "/vagrant/", owner: "www-data", group: "vagrant"
|
||||||
|
|
||||||
# Set server memory
|
|
||||||
vb.customize ["modifyvm", :id, "--memory", server_memory]
|
|
||||||
|
|
||||||
# Set the timesync threshold to 10 seconds, instead of the default 20 minutes.
|
|
||||||
# If the clock gets more than 15 minutes out of sync (due to your laptop going
|
|
||||||
# to sleep for instance, then some 3rd party services will reject requests.
|
|
||||||
vb.customize ["guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 10000]
|
|
||||||
|
|
||||||
# Prevent VMs running on Ubuntu to lose internet connection
|
|
||||||
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
|
|
||||||
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
|
|
||||||
|
|
||||||
|
# Provider-specific configuration so you can fine-tune various
|
||||||
|
# backing providers for Vagrant. These expose provider-specific options.
|
||||||
|
config.vm.provider "virtualbox" do |vb|
|
||||||
|
# # Display the VirtualBox GUI when booting the machine
|
||||||
|
# vb.gui = true
|
||||||
|
#
|
||||||
|
# # Customize the amount of memory on the VM:
|
||||||
|
vb.memory = server_memory
|
||||||
end
|
end
|
||||||
|
|
||||||
# If using VMWare Fusion
|
# Enable provisioning with a shell script.
|
||||||
config.vm.provider "vmware_fusion" do |vb, override|
|
|
||||||
override.vm.box_url = "http://files.vagrantup.com/precise64_vmware.box"
|
|
||||||
|
|
||||||
# Set server memory
|
|
||||||
vb.vmx["memsize"] = server_memory
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
####
|
|
||||||
# Local Scripts
|
|
||||||
# Any local scripts you may want to run post-provisioning.
|
|
||||||
# Add these to the same directory as the Vagrantfile.
|
|
||||||
##########
|
|
||||||
|
|
||||||
config.vm.synced_folder "./", "/vagrant/", :owner=> 'www-data', :group=>'vagrant', :mount_options => ['dmode=775', 'fmode=775']
|
|
||||||
config.vm.provision "shell", path: "./util/vagrant_provision.sh"
|
config.vm.provision "shell", path: "./util/vagrant_provision.sh"
|
||||||
|
# run: "always"
|
||||||
|
# run: "once"
|
||||||
end
|
end
|
||||||
|
|
87
boot.php
87
boot.php
|
@ -17,9 +17,9 @@ require_once('include/dbstructure.php');
|
||||||
|
|
||||||
define ( 'FRIENDICA_PLATFORM', 'Friendica');
|
define ( 'FRIENDICA_PLATFORM', 'Friendica');
|
||||||
define ( 'FRIENDICA_CODENAME', 'Lily of the valley');
|
define ( 'FRIENDICA_CODENAME', 'Lily of the valley');
|
||||||
define ( 'FRIENDICA_VERSION', '3.4.2' );
|
define ( 'FRIENDICA_VERSION', '3.4.3-dev' );
|
||||||
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
|
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
|
||||||
define ( 'DB_UPDATE_VERSION', 1188 );
|
define ( 'DB_UPDATE_VERSION', 1191 );
|
||||||
define ( 'EOL', "<br />\r\n" );
|
define ( 'EOL', "<br />\r\n" );
|
||||||
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
|
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
|
||||||
|
|
||||||
|
@ -163,7 +163,8 @@ define ( 'NETWORK_TWITTER', 'twit'); // Twitter
|
||||||
define ( 'NETWORK_DIASPORA2', 'dspc'); // Diaspora connector
|
define ( 'NETWORK_DIASPORA2', 'dspc'); // Diaspora connector
|
||||||
define ( 'NETWORK_STATUSNET', 'stac'); // Statusnet connector
|
define ( 'NETWORK_STATUSNET', 'stac'); // Statusnet connector
|
||||||
define ( 'NETWORK_APPNET', 'apdn'); // app.net
|
define ( 'NETWORK_APPNET', 'apdn'); // app.net
|
||||||
|
define ( 'NETWORK_NEWS', 'nntp'); // Network News Transfer Protocol
|
||||||
|
define ( 'NETWORK_ICALENDAR', 'ical'); // iCalendar
|
||||||
define ( 'NETWORK_PHANTOM', 'unkn'); // Place holder
|
define ( 'NETWORK_PHANTOM', 'unkn'); // Place holder
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -190,6 +191,8 @@ $netgroup_ids = array(
|
||||||
NETWORK_DIASPORA2 => (-15),
|
NETWORK_DIASPORA2 => (-15),
|
||||||
NETWORK_STATUSNET => (-16),
|
NETWORK_STATUSNET => (-16),
|
||||||
NETWORK_APPNET => (-17),
|
NETWORK_APPNET => (-17),
|
||||||
|
NETWORK_NEWS => (-18),
|
||||||
|
NETWORK_ICALENDAR => (-19),
|
||||||
|
|
||||||
NETWORK_PHANTOM => (-127),
|
NETWORK_PHANTOM => (-127),
|
||||||
);
|
);
|
||||||
|
@ -270,6 +273,10 @@ define ( 'NAMESPACE_ATOM1', 'http://www.w3.org/2005/Atom' );
|
||||||
|
|
||||||
define ( 'ACTIVITY_LIKE', NAMESPACE_ACTIVITY_SCHEMA . 'like' );
|
define ( 'ACTIVITY_LIKE', NAMESPACE_ACTIVITY_SCHEMA . 'like' );
|
||||||
define ( 'ACTIVITY_DISLIKE', NAMESPACE_DFRN . '/dislike' );
|
define ( 'ACTIVITY_DISLIKE', NAMESPACE_DFRN . '/dislike' );
|
||||||
|
define ( 'ACTIVITY_ATTEND', NAMESPACE_ZOT . '/activity/attendyes' );
|
||||||
|
define ( 'ACTIVITY_ATTENDNO', NAMESPACE_ZOT . '/activity/attendno' );
|
||||||
|
define ( 'ACTIVITY_ATTENDMAYBE', NAMESPACE_ZOT . '/activity/attendmaybe' );
|
||||||
|
|
||||||
define ( 'ACTIVITY_OBJ_HEART', NAMESPACE_DFRN . '/heart' );
|
define ( 'ACTIVITY_OBJ_HEART', NAMESPACE_DFRN . '/heart' );
|
||||||
|
|
||||||
define ( 'ACTIVITY_FRIEND', NAMESPACE_ACTIVITY_SCHEMA . 'make-friend' );
|
define ( 'ACTIVITY_FRIEND', NAMESPACE_ACTIVITY_SCHEMA . 'make-friend' );
|
||||||
|
@ -408,6 +415,7 @@ if(! class_exists('App')) {
|
||||||
public $videoheight = 350;
|
public $videoheight = 350;
|
||||||
public $force_max_items = 0;
|
public $force_max_items = 0;
|
||||||
public $theme_thread_allow = true;
|
public $theme_thread_allow = true;
|
||||||
|
public $theme_events_in_profile = true;
|
||||||
|
|
||||||
// An array for all theme-controllable parameters
|
// An array for all theme-controllable parameters
|
||||||
// Mostly unimplemented yet. Only options 'stylesheet' and
|
// Mostly unimplemented yet. Only options 'stylesheet' and
|
||||||
|
@ -1432,8 +1440,46 @@ if(! function_exists('proc_run')) {
|
||||||
if(! $arr['run_cmd'])
|
if(! $arr['run_cmd'])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(count($args) && $args[0] === 'php')
|
if(count($args) && $args[0] === 'php') {
|
||||||
|
|
||||||
|
if (get_config("system", "worker")) {
|
||||||
|
$argv = $args;
|
||||||
|
array_shift($argv);
|
||||||
|
|
||||||
|
$parameters = json_encode($argv);
|
||||||
|
$found = q("SELECT `id` FROM `workerqueue` WHERE `parameter` = '%s'",
|
||||||
|
dbesc($parameters));
|
||||||
|
|
||||||
|
if (!$found)
|
||||||
|
q("INSERT INTO `workerqueue` (`parameter`, `created`, `priority`)
|
||||||
|
VALUES ('%s', '%s', %d)",
|
||||||
|
dbesc($parameters),
|
||||||
|
dbesc(datetime_convert()),
|
||||||
|
intval(0));
|
||||||
|
|
||||||
|
// Should we quit and wait for the poller to be called as a cronjob?
|
||||||
|
if (get_config("system", "worker_dont_fork"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Checking number of workers
|
||||||
|
$workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'");
|
||||||
|
|
||||||
|
// Get number of allowed number of worker threads
|
||||||
|
$queues = intval(get_config("system", "worker_queues"));
|
||||||
|
|
||||||
|
if ($queues == 0)
|
||||||
|
$queues = 4;
|
||||||
|
|
||||||
|
// If there are already enough workers running, don't fork another one
|
||||||
|
if ($workers[0]["workers"] >= $queues)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Now call the poller to execute the jobs that we just added to the queue
|
||||||
|
$args = array("php", "include/poller.php", "no_cron");
|
||||||
|
}
|
||||||
|
|
||||||
$args[0] = ((x($a->config,'php_path')) && (strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
|
$args[0] = ((x($a->config,'php_path')) && (strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
|
||||||
|
}
|
||||||
|
|
||||||
// add baseurl to args. cli scripts can't construct it
|
// add baseurl to args. cli scripts can't construct it
|
||||||
$args[] = $a->get_baseurl();
|
$args[] = $a->get_baseurl();
|
||||||
|
@ -1441,9 +1487,8 @@ if(! function_exists('proc_run')) {
|
||||||
for($x = 0; $x < count($args); $x ++)
|
for($x = 0; $x < count($args); $x ++)
|
||||||
$args[$x] = escapeshellarg($args[$x]);
|
$args[$x] = escapeshellarg($args[$x]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$cmdline = implode($args," ");
|
$cmdline = implode($args," ");
|
||||||
|
|
||||||
if(get_config('system','proc_windows'))
|
if(get_config('system','proc_windows'))
|
||||||
proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo,dirname(__FILE__)));
|
proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo,dirname(__FILE__)));
|
||||||
else
|
else
|
||||||
|
@ -1620,7 +1665,7 @@ if(! function_exists('load_contact_links')) {
|
||||||
if(! $uid || x($a->contacts,'empty'))
|
if(! $uid || x($a->contacts,'empty'))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$r = q("SELECT `id`,`network`,`url`,`thumb` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `thumb` != ''",
|
$r = q("SELECT `id`,`network`,`url`,`thumb`, `rel` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `thumb` != ''",
|
||||||
intval($uid)
|
intval($uid)
|
||||||
);
|
);
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
|
@ -1860,3 +1905,31 @@ if(!function_exists('exif_imagetype')) {
|
||||||
return($size[2]);
|
return($size[2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function validate_include(&$file) {
|
||||||
|
$orig_file = $file;
|
||||||
|
|
||||||
|
$file = realpath($file);
|
||||||
|
|
||||||
|
if (strpos($file, getcwd()) !== 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$file = str_replace(getcwd()."/", "", $file, $count);
|
||||||
|
if ($count != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ($orig_file !== $file)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$valid = false;
|
||||||
|
if (strpos($file, "include/") === 0)
|
||||||
|
$valid = true;
|
||||||
|
|
||||||
|
if (strpos($file, "addon/") === 0)
|
||||||
|
$valid = true;
|
||||||
|
|
||||||
|
if (!$valid)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
18
database.sql
18
database.sql
|
@ -1,6 +1,6 @@
|
||||||
-- ------------------------------------------
|
-- ------------------------------------------
|
||||||
-- Friendica 3.4.1 (Lily of the valley)
|
-- Friendica 3.4.2 (Lily of the valley)
|
||||||
-- DB_UPDATE_VERSION 1188
|
-- DB_UPDATE_VERSION 1190
|
||||||
-- ------------------------------------------
|
-- ------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@ -317,6 +317,7 @@ CREATE TABLE IF NOT EXISTS `gcontact` (
|
||||||
`gender` varchar(32) NOT NULL DEFAULT '',
|
`gender` varchar(32) NOT NULL DEFAULT '',
|
||||||
`community` tinyint(1) NOT NULL DEFAULT 0,
|
`community` tinyint(1) NOT NULL DEFAULT 0,
|
||||||
`network` varchar(255) NOT NULL DEFAULT '',
|
`network` varchar(255) NOT NULL DEFAULT '',
|
||||||
|
`addr` varchar(255) NOT NULL DEFAULT '',
|
||||||
`generation` tinyint(3) NOT NULL DEFAULT 0,
|
`generation` tinyint(3) NOT NULL DEFAULT 0,
|
||||||
`server_url` varchar(255) NOT NULL DEFAULT '',
|
`server_url` varchar(255) NOT NULL DEFAULT '',
|
||||||
INDEX `nurl` (`nurl`),
|
INDEX `nurl` (`nurl`),
|
||||||
|
@ -1020,3 +1021,16 @@ CREATE TABLE IF NOT EXISTS `userd` (
|
||||||
INDEX `username` (`username`)
|
INDEX `username` (`username`)
|
||||||
) DEFAULT CHARSET=utf8;
|
) DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TABLE workerqueue
|
||||||
|
--
|
||||||
|
CREATE TABLE IF NOT EXISTS `workerqueue` (
|
||||||
|
`id` int(11) NOT NULL auto_increment PRIMARY KEY,
|
||||||
|
`parameter` text NOT NULL,
|
||||||
|
`priority` tinyint(3) unsigned NOT NULL DEFAULT 0,
|
||||||
|
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||||
|
`pid` int(11) NOT NULL DEFAULT 0,
|
||||||
|
`executed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||||
|
INDEX `created` (`created`)
|
||||||
|
) DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ At first you have to activate the addon.
|
||||||
|
|
||||||
Now add your Jabber/XMPP name, the domain/server (without "http"; just "jappix.com").
|
Now add your Jabber/XMPP name, the domain/server (without "http"; just "jappix.com").
|
||||||
For „Jabber BOSH Host“ you could use "https://bind.jappix.com/".
|
For „Jabber BOSH Host“ you could use "https://bind.jappix.com/".
|
||||||
|
Note that you need another BOSH server if you do not use jappix.com for your XMPP account.
|
||||||
You can find further information in the „Configuration Help“-section below this fields.
|
You can find further information in the „Configuration Help“-section below this fields.
|
||||||
At last you have enter your password (there are some more optional options, you can choose).
|
At last you have enter your password (there are some more optional options, you can choose).
|
||||||
Finish these steps with "send" to save the entries.
|
Finish these steps with "send" to save the entries.
|
||||||
|
|
|
@ -54,6 +54,8 @@ Have a look at our [issue tracker](https://github.com/friendica/friendica) on gi
|
||||||
* Try to reproduce a bug that needs more inquries and write down what you find out.
|
* Try to reproduce a bug that needs more inquries and write down what you find out.
|
||||||
* If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed.
|
* If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed.
|
||||||
* Fix a bug if you can. Please make the pull request against the *develop* branch of the repository.
|
* Fix a bug if you can. Please make the pull request against the *develop* branch of the repository.
|
||||||
|
* There is a *Junior Job* label for issues we think might be a good point to start with.
|
||||||
|
But you don't have to limit yourself to those issues.
|
||||||
|
|
||||||
###Web interface
|
###Web interface
|
||||||
|
|
||||||
|
|
|
@ -87,8 +87,8 @@ However their conversations with your friends will still be visible in your stre
|
||||||
If you remove a contact completely, they can send you another friend request.
|
If you remove a contact completely, they can send you another friend request.
|
||||||
Blocked contacts cannot do this. They cannot communicate with you directly, only through friends.
|
Blocked contacts cannot do this. They cannot communicate with you directly, only through friends.
|
||||||
|
|
||||||
**Ignored contacts** are included in delivery - they will receive your posts.
|
**Ignored contacts** are included in delivery - they will receive your posts and private messages.
|
||||||
However we do not import their posts to you.
|
However we do not import their posts or private messages to you.
|
||||||
Like blocking, you will still see this person's comments to posts made by your friends.
|
Like blocking, you will still see this person's comments to posts made by your friends.
|
||||||
|
|
||||||
A plugin called "blockem" can be installed to collapse/hide all posts from a particular person in your stream if you desire complete blocking of an individual, including his/her conversations with your other friends.
|
A plugin called "blockem" can be installed to collapse/hide all posts from a particular person in your stream if you desire complete blocking of an individual, including his/her conversations with your other friends.
|
||||||
|
|
|
@ -10,7 +10,7 @@ Friendica Documentation and Resources
|
||||||
* [BBCode tag reference](help/BBCode)
|
* [BBCode tag reference](help/BBCode)
|
||||||
* [Comment, sort and delete posts](help/Text_comment)
|
* [Comment, sort and delete posts](help/Text_comment)
|
||||||
* [Profiles](help/Profiles)
|
* [Profiles](help/Profiles)
|
||||||
* [Accesskey reference](help/Accesskeys
|
* [Accesskey reference](help/Accesskeys)
|
||||||
* [Events](help/events)
|
* [Events](help/events)
|
||||||
* You and other users
|
* You and other users
|
||||||
* [Connectors](help/Connectors)
|
* [Connectors](help/Connectors)
|
||||||
|
@ -30,9 +30,11 @@ Friendica Documentation and Resources
|
||||||
* [Install](help/Install)
|
* [Install](help/Install)
|
||||||
* [Settings](help/Settings)
|
* [Settings](help/Settings)
|
||||||
* [Installing Connectors (Twitter/GNU Social)](help/Installing-Connectors)
|
* [Installing Connectors (Twitter/GNU Social)](help/Installing-Connectors)
|
||||||
|
* [Install an ejabberd server (XMPP chat) with synchronized credentials](help/install-ejabberd)
|
||||||
* [Message Flow](help/Message-Flow)
|
* [Message Flow](help/Message-Flow)
|
||||||
* [Using SSL with Friendica](help/SSL)
|
* [Using SSL with Friendica](help/SSL)
|
||||||
* [Twitter/GNU Social API Functions](help/api)
|
* [Twitter/GNU Social API Functions](help/api)
|
||||||
|
* [Config values that can only be set in .htconfig.php](help/htconfig)
|
||||||
|
|
||||||
**Developer Manual**
|
**Developer Manual**
|
||||||
|
|
||||||
|
@ -53,4 +55,5 @@ Friendica Documentation and Resources
|
||||||
**About**
|
**About**
|
||||||
|
|
||||||
* [Site/Version Info](friendica)
|
* [Site/Version Info](friendica)
|
||||||
|
* [Friendica Credits](credits)
|
||||||
|
|
||||||
|
|
|
@ -10,9 +10,11 @@ Not every PHP/MySQL hosting provider will be able to support Friendica.
|
||||||
Many will.
|
Many will.
|
||||||
But **please** review the requirements and confirm these with your hosting provider prior to installation.
|
But **please** review the requirements and confirm these with your hosting provider prior to installation.
|
||||||
|
|
||||||
Also if you encounter installation issues, please let us know via the [helper]() or the [developer]() forum or [file an issue](https://github.com/friendica/friendica/issues).
|
Also if you encounter installation issues, please let us know via the [helper](http://helpers.pyxis.uberspace.de/profile/helpers) or the [developer](https://friendika.openmindspace.org/profile/friendicadevelopers) forum or [file an issue](https://github.com/friendica/friendica/issues).
|
||||||
Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future.
|
Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future.
|
||||||
Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
|
Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
|
||||||
|
If you do not have a Friendica account yet, you can register a temporary one at [tryfriendica.de](https://tryfriendica.de) and join the forums mentioned above from there.
|
||||||
|
The account will expire after 7 days, but you can ask the server admin to keep your account longer, should the problem not be resolved after that.
|
||||||
|
|
||||||
Before you begin: Choose a domain name or subdomain name for your server.
|
Before you begin: Choose a domain name or subdomain name for your server.
|
||||||
Put some thought into this. Changing it after installation is currently not supported.
|
Put some thought into this. Changing it after installation is currently not supported.
|
||||||
|
@ -29,7 +31,7 @@ Requirements
|
||||||
* curl, gd, mysql, hash and openssl extensions
|
* curl, gd, mysql, hash and openssl extensions
|
||||||
* some form of email server or email gateway such that PHP mail() works
|
* some form of email server or email gateway such that PHP mail() works
|
||||||
* mcrypt (optional; used for server-to-server message encryption)
|
* mcrypt (optional; used for server-to-server message encryption)
|
||||||
* Mysql 5.x
|
* Mysql 5.x or an equivalant alternative for MySQL (MariaDB etc.)
|
||||||
* the ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks (Windows) (Note: other options are presented in Section 7 of this document.)
|
* the ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks (Windows) (Note: other options are presented in Section 7 of this document.)
|
||||||
* Installation into a top-level domain or sub-domain (without a directory/path component in the URL) is preferred. Directory paths will not be as convenient to use and have not been thoroughly tested.
|
* Installation into a top-level domain or sub-domain (without a directory/path component in the URL) is preferred. Directory paths will not be as convenient to use and have not been thoroughly tested.
|
||||||
* If your hosting provider doesn't allow Unix shell access, you might have trouble getting everything to work.
|
* If your hosting provider doesn't allow Unix shell access, you might have trouble getting everything to work.
|
||||||
|
@ -114,6 +116,8 @@ Change it to read
|
||||||
|
|
||||||
and save your changes.
|
and save your changes.
|
||||||
|
|
||||||
|
Once you have installed Friendica and created an admin account as part of the process, you can access the admin panel of your installation and do most of the server wide configuration from there
|
||||||
|
|
||||||
Updating your installation with git
|
Updating your installation with git
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -122,6 +126,10 @@ You can get the latest changes at any time with
|
||||||
cd mywebsite
|
cd mywebsite
|
||||||
git pull
|
git pull
|
||||||
|
|
||||||
|
The default branch to use it the ``master`` branch, which is the stable version of Friendica.
|
||||||
|
If you want to use and test bleeding edge code please checkout the ``develop`` branch.
|
||||||
|
The new features and fixes will be merged from ``develop`` into ``master`` when they are stable approx four times a year.
|
||||||
|
|
||||||
The addon tree has to be updated separately like so:
|
The addon tree has to be updated separately like so:
|
||||||
|
|
||||||
cd mywebsite/addon
|
cd mywebsite/addon
|
||||||
|
|
|
@ -271,6 +271,16 @@ $b is an array, params to mail()
|
||||||
is called after the navigational menu is build in include/nav.php.
|
is called after the navigational menu is build in include/nav.php.
|
||||||
$b is an array containing $nav from nav.php.
|
$b is an array containing $nav from nav.php.
|
||||||
|
|
||||||
|
###'template_vars'
|
||||||
|
is called before vars are passed to the template engine to render the page.
|
||||||
|
The registered function can add,change or remove variables passed to template.
|
||||||
|
$b is an array with:
|
||||||
|
|
||||||
|
'template' => filename of template
|
||||||
|
'vars' => array of vars passed to template
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Complete list of hook callbacks
|
Complete list of hook callbacks
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
208
doc/SSL.md
208
doc/SSL.md
|
@ -3,166 +3,104 @@ Using SSL with Friendica
|
||||||
|
|
||||||
* [Home](help)
|
* [Home](help)
|
||||||
|
|
||||||
If you are running your own Friendica site, you may want to use SSL (https) to encrypt communication between yourself and your server (communication between servers is encrypted anyway).
|
Disclaimer
|
||||||
|
---
|
||||||
|
**This document has been updated in November 2015.
|
||||||
|
SSL encryption is relevant for security.
|
||||||
|
This means that recommended settings change fast.
|
||||||
|
Keep your setup up to date and do not rely on this document being updated as fast as technologies change!**
|
||||||
|
|
||||||
To do that on a domain of your own, you have to obtain a certificate from a trusted organization (so-called self-signed certificates that are popular among geeks don’t work very well with Friendica, because they can cause disturbances in other people's browsers).
|
Intro
|
||||||
|
---
|
||||||
|
If you are running your own Friendica site, you may want to use SSL (https) to encrypt communication between servers and between yourself and your server.
|
||||||
|
|
||||||
If you are reading this document before actually installing Friendica, you might want to consider a very simple option: Go for a shared hosting account without your own domain name. That way, your address will be something like yourname.yourprovidersname.com, which isn't very fancy compared to yourname.com. But it will still be your very own site, and you will usually be able to hitch a lift on your provider's SSL certificate. That means that you won't need to configure SSL at all - it will simply work out of the box when people type https instead of http.
|
There are basically two sorts of SSL certificates: Self-signed certificates and certificates signed by a certificate authority (CA).
|
||||||
|
Technically, both provide the same valid encryption.
|
||||||
|
There is a problem with self-signed certificates though:
|
||||||
|
They are neither installed in browsers nor on other servers.
|
||||||
|
That is why they provoke warnings about "mistrusted certificates".
|
||||||
|
This is confusing and disturbing.
|
||||||
|
|
||||||
If that isn't your idea of doing things, read on...
|
For this reason, we recommend to get a certificate signed by a CA.
|
||||||
|
Normally, you have to pay for them - and they are valid for a limited period of time (e.g. a year or two).
|
||||||
|
|
||||||
**Shared hosts**
|
There are ways to get a trusted certificate for free.
|
||||||
|
|
||||||
If you are using a shared host on a domain of your own, your provider may well offer to obtain and install the certificate for you. You will then only need to apply and pay for it – and everything will be set up. If that is the case for you, the rest of this document need not concern you at all. Just make sure the certificate is for the address that Friendica uses: e.g. myownfriendica.com or friendica.myserver.com.
|
Chose your domain name
|
||||||
|
---
|
||||||
|
|
||||||
The above ought to be the most common scenario for Friendica sites, making the rest of this article superfluous for most people.
|
Your SSL certificate will be valid for a domain or even only for a subdomain.
|
||||||
|
Make your final decision about your domain resp. subdomain *before* ordering the certificate.
|
||||||
|
Once you have it, changing the domain name means getting a new certificate.
|
||||||
|
|
||||||
**Obtaining a certificate yourself**
|
Shared hosts
|
||||||
|
---
|
||||||
|
|
||||||
Alternatively, a few shared hosting providers may ask you to obtain and upload the certificate yourself.
|
If your Friendica instance is running on a shared hosting platform, you should first check with your hosting provider.
|
||||||
|
They have instructions for you on how to do it there.
|
||||||
|
You can always order a paid certificate with your provider.
|
||||||
|
They will either install it for you or provide an easy way to upload the certificate and the key via a web interface.
|
||||||
|
|
||||||
The next section describes the process of acquiring a certificate from StartSSL. The good thing about StartSSL is that you can get an entry-level, but perfectly sufficient certificate for free. That’s not the case with most other certificate issuers - so we will be concentrating on StartSSL in this document If you want to use a certificate from a different source, you will have to follow the instructions given by that organization. We can't cover every possibility here.
|
|
||||||
|
|
||||||
Installing your certificate - once you have obtained it - depends on your provider’s way of doing things. But for shared hosts, there will usually be an easy web tool for this.
|
It might be worth asking if your provider would install a certificate you provide yourself, to save money.
|
||||||
|
If so, read on.
|
||||||
|
|
||||||
Note: Your certificate is usually restricted to one subdomain. When you apply for the certificate, make sure it’s for the domain and subdomain Friendica uses: e.g. myownfriendica.com or friendica.myserver.com.
|
Getting a free StartSSL certificate
|
||||||
|
---
|
||||||
|
StartSSL is a certificate authority that issues certificates for free.
|
||||||
|
They are valid for a year and are sufficient for our purposes.
|
||||||
|
|
||||||
**Getting a free StartSSL certificate**
|
### Step 1: Create a client certificate
|
||||||
|
|
||||||
StartSSL’s website attempts to guide you through the process of obtaining a free certificate, but some people end up frustrated. We really recommend working your way through the steps on the site very slowly and carefully. Don't take things for granted - read every word before proceeding and don't close the browser window until everything is working. That said, there are three main stumbling blocks that can confuse users:
|
When you initially sign up with StartSSL, you receive a certificate that is installed in your browser.
|
||||||
|
You need it for the login on startssl.com, also when coming back to the site later.
|
||||||
|
It has nothing to do with the SSL certificate for your server.
|
||||||
|
|
||||||
When you initially sign up with StartSSL, the first certificate you receive is simply installed in your browser (though you should also store it somewhere safe, so that you can reinstall it in any other browser at a later date, for instance when you need to renew something). This authentication certificate is only used for logging on to the StartSSL website – it has nothing to do with the certificate you will need for your server. As a first-timer with StartSSL, start here: https://www.startssl.com/?app=12 and choose the Express Lane option to get that browser authentication certificate. Then seamlessly continue to the process of acquiring the desired certificate for your server (the one you actually came for). You can change the website’s language if that makes things easier for you.
|
### Step 2: Validate your email address and your domain
|
||||||
|
|
||||||
When you are first prompted for a domain to certify, you need to enter your top-level domain – not the subdomain Friendica uses. In the next step, you will be able to specify that subdomain. So if you have friendica.yourname.com on your server, you first enter yourname.com – and specify the subdomain friendica later.
|
To continue you have to prove that you own the email address you specified and the domain that you want a certificate for.
|
||||||
|
Specify your email address, request a validation link via email from the "validations wizard".
|
||||||
|
Same procedure for the domain validation.
|
||||||
|
|
||||||
Don’t quit too fast when you have received your personal web server certificate at the end of the procedure. Depending on your server software, you will also require one or two generic files for use with this free StartSSL certificate. These are sub.class1.server.ca.pem and ca.pem. If you have already overlooked this step, you can download those files here: http://www.startssl.com/?app=21 But once again, the very best way of doing things is not to quit the StartSSL site until you are completely done and your https certificate is up and working.
|
### Step 3: Request the certificate
|
||||||
|
|
||||||
**Virtual private and dedicated servers (using StartSSL free)**
|
Go to the "certificates wizard".
|
||||||
|
Choose the target web server.
|
||||||
|
When you are first prompted for a domain to certify, you need to enter your main domain, e.g. example.com.
|
||||||
|
In the next step, you will be able to specify a subdomain for Friendica, if needed.
|
||||||
|
Example: If you have friendica.example.com, you first enter example.com, then specify the subdomain friendica later.
|
||||||
|
|
||||||
The rest of this document is slightly more complicated, but it’s only for people running Friendica on a virtual private or dedicated server. Everyone else can stop reading at this point.
|
If you know how to generate an openssl key and a certificate signing request (csr) yourself, do so.
|
||||||
|
Paste the csr into your browser to get it signed by StartSSL.
|
||||||
|
|
||||||
Follow the instructions here ( http://www.startssl.com/?app=20 ) to configure the web server you are using (e.g. Apache) for your certificate.
|
If you do not know how to generate a key and a csr, accept StartSSL's offer to generate it for you.
|
||||||
|
This means: StartSSL has the key to your encryption but it is better than no certificate at all.
|
||||||
|
Download your certificate from the website.
|
||||||
|
(Or in the second case: Download your certificate and your key.)
|
||||||
|
|
||||||
To illustrate the necessary changes, we will now assume you are running Apache. In essence, you can simply create a second httpd.conf entry for Friendica.
|
To install your certificate on a server, you need one or two extra files: sub.class1.server.ca.pem and ca.pem, delivered by startssl.com
|
||||||
|
Go to the "Tool box" section and download "Class 1 Intermediate Server CA" and "StartCom Root CA (PEM encoded)".
|
||||||
|
|
||||||
To do this, you copy the existing one and change the end of the first line to read :443> instead of :80>, then add the following lines to that entry, as also shown in StartSSL’s instructions:
|
If you want to send your certificate to your hosting provider, they need the certificate, the key and probably at least the intermediate server CA.
|
||||||
|
To be sure, send those three and the ca.pem file.
|
||||||
|
**You should send them to your provider via an encrypted channel!**
|
||||||
|
|
||||||
SSLEngine on
|
If you run your own server, upload the files and check out the Mozilla wiki link below.
|
||||||
SSLProtocol all -SSLv2
|
|
||||||
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
|
|
||||||
|
|
||||||
SSLCertificateFile /usr/local/apache/conf/ssl.crt
|
Let's encrypt
|
||||||
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key
|
---
|
||||||
SSLCertificateChainFile /usr/local/apache/conf/sub.class1.server.ca.pem
|
|
||||||
SSLCACertificateFile /usr/local/apache/conf/ca.pem
|
|
||||||
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
|
|
||||||
CustomLog /usr/local/apache/logs/ssl_request_log \
|
|
||||||
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
|
|
||||||
|
|
||||||
(Note that the directory /usr/local/apache/conf/ may not exist on your machine. For Debian, for instance, the directory might be /etc/apache2/ - in which you can create an ssl subdirectory if it doesn’t already exist. Then you have /etc/apache2/ssl/… instead of /usr/local/apache/conf/…)
|
If you run your own server and you control your name server, the "Let's encrypt" initiative might become an interesting alternative.
|
||||||
|
Their offer is not ready, yet.
|
||||||
|
Check out [their website](https://letsencrypt.org/) for status updates.
|
||||||
|
|
||||||
You thus end up with two entries for your Friendica site - one for simple http and one for https.
|
Web server settings
|
||||||
|
---
|
||||||
|
|
||||||
Note to those who want to force SSL: Don't redirect to SSL in your Apache settings. Friendica's own admin panel has a special setting for SSL policy. Please use this facility instead.
|
Visit the [Mozilla's wiki](https://wiki.mozilla.org/Security/Server_Side_TLS) for instructions on how to configure a secure webserver.
|
||||||
|
They provide recommendations for [different web servers](https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Server_Configurations).
|
||||||
|
|
||||||
**Mixing certificates on Apache – StartSSL and others (self-signed)**
|
Test your SSL settings
|
||||||
|
---
|
||||||
|
|
||||||
Many people using a virtual private or dedicated server will be running more than Friendica on it. They will probably want to use SSL for other sites they run on the server, too. To achieve this, they may wish to employ more than one certificate with a single IP – for instance, a trusted one for Friendica and a self-signed certificate for personal stuff (possibly a wildcard certificate covering arbitrary subdomains).
|
When you are done, visit the test site [SSL Labs](https://www.ssllabs.com/ssltest/) to have them check if you succeeded.
|
||||||
|
|
||||||
For this to work, Apache offers a NameVirtualHost directive. You can see how to use it in httpd.conf in the following pattern. Note that wildcards (*) in httpd.conf break the NameVirtualHost method – you can’t use them in this new configuration. In other words, no more *80> or *443>. And you really must specify the IP, too, even if you only have one. Also note that you will soon be needing two additional NameVirtualHost lines at the top of the file to cater for IPv6.
|
|
||||||
|
|
||||||
NameVirtualHost 12.123.456.1:443
|
|
||||||
NameVirtualHost 12.123.456.1:80
|
|
||||||
|
|
||||||
<VirtualHost www.anywhere.net:80>
|
|
||||||
DocumentRoot /var/www/anywhere
|
|
||||||
Servername www.anywhere.net
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
||||||
<VirtualHost www.anywhere.net:443>
|
|
||||||
DocumentRoot /var/www/anywhere
|
|
||||||
Servername www.anywhere.net
|
|
||||||
SSLEngine On
|
|
||||||
<pointers to a an eligible cert>
|
|
||||||
<more ssl stuff >
|
|
||||||
<other stuff>
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
||||||
<VirtualHost www.somewhere-else.net:80>
|
|
||||||
DocumentRoot /var/www/somewhere-else
|
|
||||||
Servername www.somewhere-else.net
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
||||||
<VirtualHost www.somewhere-else:443>
|
|
||||||
DocumentRoot /var/www/somewhere-else
|
|
||||||
Servername www.somewhere-else.net
|
|
||||||
SSLEngine On
|
|
||||||
<pointers to another eligible cert>
|
|
||||||
<more ssl stuff >
|
|
||||||
<other stuff>
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
||||||
Of course, you may optionally be using other places like the sites-available directory to configure Apache, in which case only some of this information need be in httpd.conf or ports.conf - specifically, the NameVirtualHost lines must be there. But if you're savvy about alternatives like that, you will probably be able to figure out the details yourself.
|
|
||||||
|
|
||||||
Just restart Apache when you're done, whichever way you decide to do it.
|
|
||||||
|
|
||||||
**StartSSL on Nginx**
|
|
||||||
|
|
||||||
First, update to the latest Friendica code. Then follow the above instructions to get your free certificate. But instead of following the Apache installation instructions, do this:
|
|
||||||
|
|
||||||
Upload your certificate. It doesn't matter where to, as long as Nginx can find it. Some people use /home/randomlettersandnumbers to keep it in out of paranoia, but you can put it anywhere, so we'll call it /foo/bar.
|
|
||||||
|
|
||||||
You can remove the password if you like. This is probably bad practice, but if you don't, you'll have to enter the password every time you restart nginx. To remove it:
|
|
||||||
|
|
||||||
openssl rsa -in ssl.key-pass -out ssl.key
|
|
||||||
|
|
||||||
Now, grab the helper certificate:
|
|
||||||
|
|
||||||
wget http://www.startssl.com/certs/sub.class1.server.ca.pem
|
|
||||||
|
|
||||||
Now you need to merge the files:
|
|
||||||
|
|
||||||
cat ssl.crt sub.class1.server.ca.pem > ssl.crt
|
|
||||||
|
|
||||||
In some configurations there is a bug, and this doesn't quite work properly. You may now need to edit ssl.crt, so:
|
|
||||||
|
|
||||||
nano /foo/bar/ssl.crt
|
|
||||||
|
|
||||||
You'll see two certificates in the same file. Halfway down, you may see:
|
|
||||||
|
|
||||||
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
|
|
||||||
|
|
||||||
This is bad. You need to see:
|
|
||||||
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
|
|
||||||
You can enter the carriage return manually if the bug is present on your system. Note there is a single carriage return for -----BEGIN CERTIFICATE----- to start on a new line. There is no empty line.
|
|
||||||
|
|
||||||
Now you need to tell Nginx about the certs.
|
|
||||||
|
|
||||||
In /etc/nginx/sites-available/foo.com.conf you need something like:
|
|
||||||
|
|
||||||
server {
|
|
||||||
|
|
||||||
listen 80;
|
|
||||||
|
|
||||||
listen 443 ssl;
|
|
||||||
|
|
||||||
listen [::]:80;
|
|
||||||
|
|
||||||
listen [::]:443 ipv6only=on ssl;
|
|
||||||
|
|
||||||
ssl_certificate /foo/bar/ssl.crt;
|
|
||||||
|
|
||||||
ssl_certificate_key /foo/bar/ssl.key;
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
Now, restart nginx:
|
|
||||||
|
|
||||||
/etc/init.d/nginx restart
|
|
||||||
|
|
||||||
And that's it.
|
|
||||||
|
|
||||||
For multiple domains, we have it easier than Apache users: Just repeat the above for each certificate, and keep it in it's own {server...} section.
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ Config:
|
||||||
|
|
||||||
This configures the URL to update the global directory, and is supplied in the default configuration.
|
This configures the URL to update the global directory, and is supplied in the default configuration.
|
||||||
The undocumented part is that if this is not set, the global directory is completely unavailable to the application.
|
The undocumented part is that if this is not set, the global directory is completely unavailable to the application.
|
||||||
This allows a private community to be completely isolated from the global mistpark network.
|
This allows a private community to be completely isolated from the global network.
|
||||||
|
|
||||||
$a->config['system']['directory'] = 'http://dir.friendi.ca';
|
$a->config['system']['directory'] = 'http://dir.friendi.ca';
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,12 @@ Getting started
|
||||||
|
|
||||||
[Vagrant](https://www.vagrantup.com/) is a virtualization solution for developers.
|
[Vagrant](https://www.vagrantup.com/) is a virtualization solution for developers.
|
||||||
No need to setup up a webserver, database etc. before actually starting.
|
No need to setup up a webserver, database etc. before actually starting.
|
||||||
Vagrant creates a virtual machine (an Ubuntu 12.04) for you that you can just run inside VirtualBox and start to work directly on Friendica.
|
Vagrant creates a virtual machine (an Ubuntu 14.04) for you that you can just run inside VirtualBox and start to work directly on Friendica.
|
||||||
|
|
||||||
What you need to do:
|
What you need to do:
|
||||||
|
|
||||||
1. Install VirtualBox and vagrant.
|
1. Install VirtualBox and vagrant.
|
||||||
|
Please use an up-to-date vagrant version from https://www.vagrantup.com/downloads.html.
|
||||||
2. Git clone your Friendica repository.
|
2. Git clone your Friendica repository.
|
||||||
Inside, you'll find a "Vagrantfile" and some scripts in the utils folder.
|
Inside, you'll find a "Vagrantfile" and some scripts in the utils folder.
|
||||||
3. Run "vagrant up" from inside the friendica clone.
|
3. Run "vagrant up" from inside the friendica clone.
|
||||||
|
@ -20,8 +22,10 @@ Be patient: When it runs for the first time, it downloads an Ubuntu Server image
|
||||||
5. Open 192.168.22.10 in a browser.
|
5. Open 192.168.22.10 in a browser.
|
||||||
The mysql database is called "friendica", the mysql user and password both are "root".
|
The mysql database is called "friendica", the mysql user and password both are "root".
|
||||||
6. Work on Friendica's code in your git clone on your machine (not in the VM).
|
6. Work on Friendica's code in your git clone on your machine (not in the VM).
|
||||||
|
Your local working directory is set up as a shared directory with the VM (/vagrant).
|
||||||
7. Check the changes in your browser in the VM.
|
7. Check the changes in your browser in the VM.
|
||||||
Debug via the "vagrant ssh" login.
|
Debug via the "vagrant ssh" login.
|
||||||
|
Find the Friendica log file /vagrant/logfile.out.
|
||||||
8. Commit and push your changes directly back to Github.
|
8. Commit and push your changes directly back to Github.
|
||||||
|
|
||||||
If you want to stop vagrant after finishing your work, run the following command
|
If you want to stop vagrant after finishing your work, run the following command
|
||||||
|
@ -40,3 +44,10 @@ You will then have the following accounts to login:
|
||||||
* friendica2 and friendica3 are conntected. friendica4 and friendica5 are connected.
|
* friendica2 and friendica3 are conntected. friendica4 and friendica5 are connected.
|
||||||
|
|
||||||
For further documentation of vagrant, please see [the vagrant*docs*](https://docs.vagrantup.com/v2/).
|
For further documentation of vagrant, please see [the vagrant*docs*](https://docs.vagrantup.com/v2/).
|
||||||
|
|
||||||
|
**Important notice:**
|
||||||
|
If you already had an Ubuntu 12.04 Vagrant VM, please run
|
||||||
|
|
||||||
|
$> vagrant destroy
|
||||||
|
|
||||||
|
before starting the new 14.04 machine.
|
||||||
|
|
|
@ -70,7 +70,7 @@ Trage nun Deinen Jabber/XMPP Namen ein, ebenfalls die entsprechende Domain bzw.
|
||||||
Um das JavaScript Applet zum Chatten im Browser verwenden zu können, benötigst du einen BOSH Proxy.
|
Um das JavaScript Applet zum Chatten im Browser verwenden zu können, benötigst du einen BOSH Proxy.
|
||||||
Entweder betreibst du deinen eigenen (s. Dokumentation deines XMPP Servers) oder du verwendest einen öffentlichen BOSH Proxy.
|
Entweder betreibst du deinen eigenen (s. Dokumentation deines XMPP Servers) oder du verwendest einen öffentlichen BOSH Proxy.
|
||||||
Beachte aber, dass der Betreiber dieses Proxies den kompletten Datenverkehr über den Proxy mitlesen kann.
|
Beachte aber, dass der Betreiber dieses Proxies den kompletten Datenverkehr über den Proxy mitlesen kann.
|
||||||
Siehe dazu auch die „Configuration Help“ weiter unten.
|
Siehe dazu auch die „Configuration Help“ unter den Eingabefeldern.
|
||||||
Gebe danach noch Dein Passwort an, und damit ist eigentlich schon fast alles geschafft.
|
Gebe danach noch Dein Passwort an, und damit ist eigentlich schon fast alles geschafft.
|
||||||
Die weiteren Einstellmöglichkeiten bleiben Dir überlassen, sind also optional.
|
Die weiteren Einstellmöglichkeiten bleiben Dir überlassen, sind also optional.
|
||||||
Jetzt noch auf „senden“ klicken und fertig.
|
Jetzt noch auf „senden“ klicken und fertig.
|
||||||
|
|
|
@ -13,6 +13,11 @@ Die Anleitung unter [http://help.github.com/fork-a-repo/](http://help.github.com
|
||||||
|
|
||||||
Gehe dann nach getaner Arbeit zu Deiner Github-Seite und erstelle eine "Pull request", um Deine Änderungen in das Hauptprojekt einzugliedern (merge).
|
Gehe dann nach getaner Arbeit zu Deiner Github-Seite und erstelle eine "Pull request", um Deine Änderungen in das Hauptprojekt einzugliedern (merge).
|
||||||
|
|
||||||
|
Solltest du keine Idee haben, an welcher Stelle du einsteigen könntest.
|
||||||
|
Wir haben einige Aufgaben auf github mit dem Schlagwort *Junior Job* versehen.
|
||||||
|
Bei diesen Aufgaben gehen wir davon aus, dass sie geeignete Einstiegsstellen sind.
|
||||||
|
Du musst dich aber natürlich nicht mit diesen Aufgaben beschäftigen um den Friendica Code zu verbeesern.
|
||||||
|
|
||||||
**Wichtig**
|
**Wichtig**
|
||||||
|
|
||||||
Bitte hole Dir alle Änderungen aus dem Projektverzeichnis und führe sie mit Deiner Arbeit zusammen, **bevor** Du Deine "pull request" erstellst. Wir behalten es uns vor, Patches abzulehnen, die eine große Anzahl an Fehlern hervorrufen.
|
Bitte hole Dir alle Änderungen aus dem Projektverzeichnis und führe sie mit Deiner Arbeit zusammen, **bevor** Du Deine "pull request" erstellst. Wir behalten es uns vor, Patches abzulehnen, die eine große Anzahl an Fehlern hervorrufen.
|
||||||
|
|
|
@ -100,9 +100,9 @@ Wenn Du einen Kontakt komplett löschst, können sie Dir eine neue Freundschafts
|
||||||
Blockierte Kontakte können das nicht machen.
|
Blockierte Kontakte können das nicht machen.
|
||||||
Sie können nicht mit Dir direkt kommunizieren, nur über Freunde.
|
Sie können nicht mit Dir direkt kommunizieren, nur über Freunde.
|
||||||
|
|
||||||
Ignorierte Kontakte können weiterhin Beiträge von Dir erhalten.
|
Ignorierte Kontakte können weiterhin Beiträge und private Nachrichten von Dir erhalten.
|
||||||
Deren Beiträge werden allerdings nicht importiert. W
|
Deren Beiträge und private Nachrichten werden allerdings nicht importiert.
|
||||||
ie bei blockierten Beiträgen siehst Du auch hier weiterhin die Kommentare dieser Person zu anderen Beiträgen Deiner Freunde.
|
Wie bei blockierten Beiträgen siehst Du auch hier weiterhin die Kommentare dieser Person zu anderen Beiträgen Deiner Freunde.
|
||||||
|
|
||||||
[Ein Plugin namens "blockem" kann installiert werden, um alle Beiträge einer bestimmten Person in Deinem Stream zu verstecken bzw. zu verkürzen.
|
[Ein Plugin namens "blockem" kann installiert werden, um alle Beiträge einer bestimmten Person in Deinem Stream zu verstecken bzw. zu verkürzen.
|
||||||
Dabei werden auch Kommentare dieser Person in Beiträgen Deiner Freunde blockiert.]
|
Dabei werden auch Kommentare dieser Person in Beiträgen Deiner Freunde blockiert.]
|
||||||
|
|
|
@ -32,11 +32,13 @@ Friendica - Dokumentation und Ressourcen
|
||||||
* [Konfigurationen](help/Settings)
|
* [Konfigurationen](help/Settings)
|
||||||
* [Plugins](help/Plugins)
|
* [Plugins](help/Plugins)
|
||||||
* [Konnektoren (Connectors) installieren (Twitter/GNU Social)](help/Installing-Connectors)
|
* [Konnektoren (Connectors) installieren (Twitter/GNU Social)](help/Installing-Connectors)
|
||||||
|
* [Installation eines ejabberd Servers (XMPP-Chat) mit synchronisierten Anmeldedaten](help/install-ejabberd) (EN)
|
||||||
* [Nachrichtenfluss](help/Message-Flow)
|
* [Nachrichtenfluss](help/Message-Flow)
|
||||||
* [Betreibe deine Seite mit einem SSL-Zertifikat](help/SSL)
|
* [Betreibe deine Seite mit einem SSL-Zertifikat](help/SSL)
|
||||||
* [Entwickler](help/Developers)
|
* [Entwickler](help/Developers)
|
||||||
* [Twitter/GNU Social API Functions](help/api) (EN)
|
* [Twitter/GNU Social API Functions](help/api) (EN)
|
||||||
* [Translation of Friendica](help/translations) (EN)
|
* [Translation of Friendica](help/translations) (EN)
|
||||||
|
* [Konfigurationswerte, die nur in der .htconfig.php gesetzt werden können](help/htconfig) (EN)
|
||||||
|
|
||||||
**Entwickler Dokumentation**
|
**Entwickler Dokumentation**
|
||||||
|
|
||||||
|
@ -58,4 +60,5 @@ Friendica - Dokumentation und Ressourcen
|
||||||
**Über diese Seite**
|
**Über diese Seite**
|
||||||
|
|
||||||
* [Seite/Friendica-Version](friendica)
|
* [Seite/Friendica-Version](friendica)
|
||||||
|
* [Mitwirkenden bei Friendica](credits)
|
||||||
|
|
||||||
|
|
238
doc/de/SSL.md
238
doc/de/SSL.md
|
@ -3,216 +3,124 @@ Friendica mit SSL nutzen
|
||||||
|
|
||||||
* [Zur Startseite der Hilfe](help)
|
* [Zur Startseite der Hilfe](help)
|
||||||
|
|
||||||
Wenn du deine eigene Friendica-Seite betreibst, willst du vielleicht SSL (https) nutzen, um die Kommunikation zwischen dir und deinem Server zu verschlüsseln (die Kommunikation zwischen den Servern ist bereits verschlüsselt).
|
Disclaimer
|
||||||
|
---
|
||||||
|
**Dieses Dokument wurde im November 2015 aktualisiert.
|
||||||
|
SSL-Verschlüsselung ist sicherheitskritisch.
|
||||||
|
Das bedeutet, dass sich die empfohlenen Einstellungen schnell verändern.
|
||||||
|
Halte deine Installation auf dem aktuellen Stand und verlasse dich nicht darauf, dass dieses Dokument genau so schnell aktualisiert wird, wie sich Technologien verändern!**
|
||||||
|
|
||||||
Wenn du das auf deiner eigenen Domain machen willst, musst du ein Zertifikat von einer anerkannten Organisation beschaffen (sogenannte selbst-signierte Zertifikate, die unter Computerfreaks beliebt sind, arbeiten nicht sehr gut mit Friendica, weil sie Warnungen im Browser hervorrufen können).
|
Einleitung
|
||||||
|
---
|
||||||
|
|
||||||
Wenn du dieses Dokument liest, bevor du Friendica installierst, kannst du eine sehr einfache Option in Betracht ziehen: suche dir ein geteiltes Hosting-Angebot (shared hosting) ohne eigene Domain.
|
Wenn du deine eigene Friendica-Seite betreibst, willst du vielleicht SSL (https) nutzen, um die Kommunikation zwischen den Servern und zwischen dir und deinem Server zu verschlüsseln.
|
||||||
Dadurch wirst du eine Adresse in der Form deinName.deinAnbietername.de erhalten, was nicht so schön wie deinName.de ist.
|
|
||||||
Aber es wird trotzdem deine ganz persönliche Seite sein und du wirst unter Umständen die Möglichkeit haben, das SSL-Zertifikat deines Anbieters mitzubenutzen.
|
|
||||||
Das bedeutet, dass du SSL überhaupt nicht konfigurieren musst - es wird einfach sofort funktionieren, wenn die Besucher deiner Seite https statt http eingeben.
|
|
||||||
|
|
||||||
Wenn dir diese Lösung nicht gefällt, lies weiter...
|
Dafür gibt es grundsätzlich zwei Arten von SSL-Zertifikaten: Selbst-signierte Zertifikate und Zertifikate, die von einer Zertifizierungsstelle (CA) unterschrieben sind.
|
||||||
|
Technisch gesehen sorgen beide für valide Verschlüsselung.
|
||||||
|
Mit selbst-signierten Zertifikaten gibt es jedoch ein Problem:
|
||||||
|
Sie sind weder in Browsern noch auf anderen Servern installiert.
|
||||||
|
Deshalb führen sie zu Warnungen über "nicht vertrauenswürdige Zertifikate".
|
||||||
|
Das ist verwirrend und stört sehr.
|
||||||
|
|
||||||
**Geteilte Hosting-Angebote/Shared hosts**
|
Aus diesem Grund empfehlen wir, dass du dir ein von einer CA unterschriebenes Zertifikat besorgst.
|
||||||
|
Normalerweise kosten sie Geld - und sind nur für eine begrenzte Zeit gültig (z.B. ein Jahr oder zwei).
|
||||||
|
|
||||||
Wenn du ein geteiltes Hosting-Angebot mit einer eigenen Domain nutzt, dann wird dir dein Anbieter ggf. anbieten, dir das Zertifikat zu besorgen und zu installieren.
|
Es gibt aber Möglichkeiten, ein vertrauenswürdiges Zertifikat umsonst zu bekommen.
|
||||||
Du musst es nur beantragen und bezahlen und alles wird eingerichtet.
|
|
||||||
Wenn das die Lösung für dich ist, musst du das weitere Dokument nicht lesen.
|
|
||||||
Gehe nur sicher, dass das Zertifikat auch für die Domain gilt, die du für Friendica nutzt: z.B. meinfriendica.de oder friendica.meinserver.de.
|
|
||||||
|
|
||||||
Das Vorangehende wird die häufigste Art sein, eine Friendica-Seite zu betreiben, so dass der Rest des Artikels für die meisten Leute nicht von Bedeutung ist.
|
Wähle deinen Domainnamen
|
||||||
|
---
|
||||||
|
|
||||||
**Beschaffe dir das Zertifikat selbst**
|
Dein SSL-Zertifikat wird für eine bestimmte Domain gültig sein oder sogar nur für eine Subdomain.
|
||||||
|
Entscheide dich endgültig für einen Domainnamen, *bevor* du ein Zertifikat bestellst.
|
||||||
|
Wenn du das Zertifikat hast, brauchst du ein neues, wenn du den Domainnamen ändern möchtest.
|
||||||
|
|
||||||
Alternativ kannst du dir auch selbst ein Zertifikat besorgen und hochladen, falls dein Anbieter das unterstützt.
|
Gehosteter Webspace
|
||||||
|
---
|
||||||
|
|
||||||
Der nächste Abschnitt beschreibt den Ablauf, um ein Zertifikat von StartSSL zu erhalten.
|
Wenn deine Friendica-Instanz auf einem gehosteten Webspace läuft, solltest du dich bei deinem Hosting-Provider informieren.
|
||||||
Das Gute an StartSSL ist, dass du kostenlos ein einfaches, aber perfekt ausreichendes Zertifikat erhältst.
|
Dort bekommst du Instruktionen, wie es dort läuft.
|
||||||
Das ist bei vielen anderen Anbietern nicht so, weshalb wir uns in diesem Dokument auf StartSSL konzentrieren werden.
|
Du kannst bei deinem Provider immer ein kostenpflichtiges Zertifikat bestellen.
|
||||||
Wenn du ein Zertifikat eines anderen Anbieters nutzen willst, musst du die Vorgaben dieser Organisation befolgen.
|
Sie installieren es für dich oder haben in der Weboberfläche eine einfache Upload-Möglichkeit für Zertifikat und Schlüssel.
|
||||||
Wir können hier nicht jede Möglichkeit abdecken.
|
|
||||||
|
|
||||||
Die Installation deines erhaltenen Zertifikats hängt von den Vorgaben deines Anbieters ab.
|
Um Geld zu sparen, kann es sich lohnen, dort auch nachzufragen, ob sie ein anderes Zertifikat, das du selbst beschaffst, für dich installieren würden.
|
||||||
Aber generell nutzen solche Anbieter ein einfaches Web-Tool, um die Einrichtung zu unterstützen.
|
Wenn ja, dann lies weiter.
|
||||||
|
|
||||||
Beachte: dein Zertifikat gilt gewöhnlich nur für eine Subdomain.
|
Ein kostenloses StartSSL-Zertifikat besorgen
|
||||||
Wenn du dein Zertifikat beantragst, sorge dafür, dass es für die Domain und die Subdomain gilt, die du für Friendica nutzt: z.B. meinfriendica.de oder friendica.meinserver.de.
|
---
|
||||||
|
|
||||||
**Erhalte ein kostenloses StartSSL-Zertifikat**
|
StartSSL ist eine Zertifizierungsstelle, die kostenlose Zertifikate ausstellt.
|
||||||
|
Sie sind für ein Jahr gültig und genügen für unsere Zwecke.
|
||||||
|
|
||||||
Die Webseite von StartSSL führt dich durch den Erstellungsprozess, aber manche Leute haben hier trotzdem Probleme.
|
### Schritt 1: Client-Zertifikat erstellen
|
||||||
Wir empfehlen dir ausdrücklich, die Installationsanleitung Schritt für Schritt langsam und sorgfältig zu befolgen.
|
|
||||||
Lese dir jedes Wort durch und schließe deinen Browser erst, wenn alles läuft.
|
|
||||||
Es heißt, dass es drei Schritte gibt, die den Nutzer verwirren können:
|
|
||||||
|
|
||||||
Wenn du dich erstmals bei StartSSL anmeldest, erhältst du ein erstes Zertifikat, dass sich einfach in deinem Browser installiert.
|
Wenn du dich erstmalig bei StartSSL anmeldest, erhältst du ein Zertifikat, das in deinem Browser installiert wird.
|
||||||
Dieses Zertifikat solltest du zur Sicherheit irgendwo speichern, so dass du es für einen neuen Browser neu installieren kannst, wenn du z.B. etwas erneuern musst.
|
Du brauchst es, um dich bei StartSSL einzuloggen, auch wenn du später wiederkommst.
|
||||||
Dieses Authentifizierungszertifikat wird nur für das Login benötigt und hat nichts mit dem Zertifikat zu tun, dass du später für deinen Server benötigst.
|
Dieses Client-Zertifikat hat nichts mit dem SSL-Zertifikat für deinen Server zu tun.
|
||||||
Als Anfänger mit StartSSL kannst du [hier starten](https://www.startssl.com/?lang=de) und die "Express Lane" nutzen, um dein Browser-Zertifikiat zu erhalten.
|
|
||||||
Im nächsten Schritt kannst du die Einrichtung deines Zertifikats fortsetzen.
|
|
||||||
|
|
||||||
Wenn du zuerst nach einer Domain für dein Zertifikat gefragt wirst, musst du die Top-Level-Domain angeben, nicht die Subdomain, die Friendica nutzt.
|
### Schritt 2: Email-Adresse und Domain validieren
|
||||||
Im nächsten Schritt kannst du dann die Subdomain spezifizieren.
|
|
||||||
Wenn du also friendica.deinName.de auf deinem Server hast, musst du zuerst deinName.de angeben.
|
|
||||||
|
|
||||||
Höre nicht zu früh auf, wenn du am Ende der Einrichtung dein persönliches Server-Zertifikat erhalten hast.
|
Um fortzufahren musst du beweisen, dass du die Email-Adresse, die du angegeben hast, und die Domain, für die du das Zertifikat möchtest, besitzt.
|
||||||
Abhängig von deiner Server-Software benötigst du ein oder zwei generische Dateien, die du mit deinem kostenlosen StartSSL-Zertifikat nutzen musst.
|
Gehe in den "Validation wizard" und fordere einen Bestätigungslink per Mail an.
|
||||||
Diese Dateien sind sub.class1.server.ca.pem und ca.pem.
|
Dasselbe machst du auch für die Validierung der Domain.
|
||||||
Wenn du diesen Schritt bereits übersprungen hast, kannst du die Dateien hier finden: [http://www.startssl.com/?app=21](http://www.startssl.com/?app=21).
|
|
||||||
Aber am besten funktioniert es, wenn du StartSSL nicht beendest, bevor du den Vorgang komplett abgeschlossen hast und dein https-Zertifikat hochgeladen ist und funktioniert.
|
|
||||||
|
|
||||||
**Virtuelle private und dedizierte Server (mit StartSSL free)**
|
### Schritt 3: Das Zertifikat bestellen
|
||||||
|
|
||||||
Der Rest dieses Dokuments ist etwas komplizierter, aber es ist auch nur für Personen, die Friendica auf einem virtuellen oder dedizierten Server nutzen.
|
Gehe in den "Certificate wizard".
|
||||||
Jeder andere kann an dieser Stelle mit dem Lesen aufhören.
|
Wähle das Target Webserver.
|
||||||
|
Bei der ersten Abfrage der Domain gibst du deine Hauptdomain an.
|
||||||
|
Im nächsten Schritt kannst du eine Subdomain hinzufügen.
|
||||||
|
Ein Beispiel: Wenn die Adresse der Friendica-Instanz friendica.beispiel.net lautet, gibst du zuerst beispiel.net an und danach friendica.
|
||||||
|
|
||||||
Folge den weiteren Anleitungen [hier](http://www.startssl.com/?app=20), um den Webserver, den du benutzt (z.B. Apache), für dein Zertifikat einzurichten.
|
Wenn du weißt, wie man einen openssl-Schlüssel und einen Certificate Signing Request (CSR) erstellt, tu das.
|
||||||
|
Kopiere den CSR in den Browser, um ihn von StartSSL signiert zu bekommen.
|
||||||
|
|
||||||
Um die nötigen Schritte zu verdeutlichen, setzen wir nun voraus, dass Apache aktiv ist.
|
Wenn du nicht weißt, wie man Schlüssel und CSR erzeugt, nimm das Angebot von StartSSL an, beides für dich zu generieren.
|
||||||
Im Wesentlichen kannst du einfach einen zweiten httpd.conf-Eintrag für Friendica erstellen.
|
Das bedeutet: StartSSL hat den Schlüssel zu deiner SSL-Verschlüsselung, aber das ist immer noch besser als gar kein Zertifikat.
|
||||||
|
Lade dein Zertifikat von der Website herunter.
|
||||||
|
(Oder im zweiten Fall: Lade Zertifikat und Schlüssel herunter.)
|
||||||
|
|
||||||
Um das zu machen, kopiere den existierenden Eintrag und ändere das Ende der ersten Zeile auf "lesen" :443> anstelle von :80> und trage dann die folgenden Zeilen ein, wie du es auch in der Anleitung von StartSSL finden kannst:
|
Um dein Zertifikat auf einem Webserver zu installieren, brauchst du noch ein oder zwei andere Dateien: sub.class1.server.ca.pem und ca.pem, auch von StartSSL.
|
||||||
|
Gehe in die Rubrik "Tool box" und lade "Class 1 Intermediate Server CA" und "StartCom Root CA (PEM encoded)" herunter.
|
||||||
|
|
||||||
SSLEngine on
|
Wenn du dein Zertifikat zu deinem Hosting-Provider schicken möchtest, brauchen Sie mindestens Zertifikat und Schlüssel.
|
||||||
SSLProtocol all -SSLv2
|
Schick zur Sicherheit alle vier Dateien hin.
|
||||||
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
|
**Du solltest sie auf einem verschlüsselten Weg hinschicken!**
|
||||||
|
|
||||||
SSLCertificateFile /usr/local/apache/conf/ssl.crt
|
Wenn du deinen eigenen Server betreibst, lade die Dateien hoch und besuche das Mozilla-Wiki (Link unten).
|
||||||
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key
|
|
||||||
SSLCertificateChainFile /usr/local/apache/conf/sub.class1.server.ca.pem
|
|
||||||
SSLCACertificateFile /usr/local/apache/conf/ca.pem
|
|
||||||
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
|
|
||||||
CustomLog /usr/local/apache/logs/ssl_request_log \
|
|
||||||
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
|
|
||||||
|
|
||||||
(Beachte, dass das Verzeichnis /usr/local/apache/conf/ möglicherweise nicht in deinem System existiert.
|
Let's encrypt
|
||||||
In Debian ist der Pfad bspw. /etc/apache2/, in dem du ein SSL-Unterverzeichnis erstellen kannst, wenn dieses noch nicht vorhanden ist.
|
---
|
||||||
Dann hast du /etc/apache2/ssl/… statt /usr/local/apache/conf/…)
|
|
||||||
|
|
||||||
Du solltest nun zwei Einträgen für deine Friendica-Seite haben - einen für einfaches http und eines für https.
|
Wenn du einen eigenen Server betreibst und den Nameserver kontrollierst, könnte auch die Initiative "Let's encrypt" interessant für dich werden.
|
||||||
|
Momentan ist deren Angebot noch nicht fertig.
|
||||||
|
Auf der [Website](https://letsencrypt.org/) kannst du dich über den Stand informieren.
|
||||||
|
|
||||||
Ein Hinweis für diejenigen, die SSL steuern wollen: setze keine Weiterleitung deines SSL in deine Apache-Einstellung. Friendicas Admin-Panel hat eine spezielle Einstellung für die SSL-Methode.
|
Webserver-Einstellungen
|
||||||
Bitte nutze diese Einstellungen.
|
---
|
||||||
|
|
||||||
**Vermische Zertifikate in Apache – StartSSL und andere (selbst-signierte)**
|
Im [Wiki von Mozilla](https://wiki.mozilla.org/Security/Server_Side_TLS) gibt es Anleitungen für die Konfiguration sicherer Webserver.
|
||||||
|
Dort findest du Empfehlungen, die auf [verschiedene Webserver](https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Server_Configurations) zugeschnitten sind.
|
||||||
|
|
||||||
Viele Leute nutzen einen virtuellen privaten oder einen dedizierten Server, um mehr als Friendica darauf laufen zu lassen.
|
Teste deine SSL-Einstellungen
|
||||||
Sie wollen möglicherweise SSL auch für andere Seiten nutzen, die auf dem Server liegen.
|
---
|
||||||
Um das zu erreichen, wollen sie mehrere Zertifikate für eine IP nutzen, z.B. ein Zertifikat eines anerkannten Anbieters für Friendica und ein selbst-signiertes für eine persönliche Inhalte (möglw. ein Wildcard-Zertifikat für mehrere Subdomains).
|
|
||||||
|
|
||||||
Um das zum Laufen zu bringen, bietet Apache eine NameVirtualHost-Direktive.
|
Wenn du fertig bist, kannst du auf der Testseite [SSL-Labs](https://www.ssllabs.com/ssltest/) prüfen lassen, ob Du alles richtig gemacht hast.
|
||||||
Du findest Informationen zur Nutzung in httpd.conf in den folgenden Ausschnitten.
|
|
||||||
Beachte, dass Wildcards (*) in httpd.conf dazu führen, dass die NameVirtualHost-Methode nicht funktioniert; du kannst diese in dieser neuen Konfiguration nicht nutzen.
|
|
||||||
Das bedeutet, dass *80> oder *443> nicht funktionieren.
|
|
||||||
Und du musst unbedingt die IP definieren, selbst wenn du nur eine hast.
|
|
||||||
Beachte außerdem, dass du bald zwei Zeilen zu Beginn der Datei hinzufügen musst, um NameVirtualHost für IPv6 vorzubereiten.
|
|
||||||
|
|
||||||
NameVirtualHost 12.123.456.1:443
|
|
||||||
NameVirtualHost 12.123.456.1:80
|
|
||||||
|
|
||||||
<VirtualHost www.anywhere.net:80>
|
|
||||||
DocumentRoot /var/www/anywhere
|
|
||||||
Servername www.anywhere.net
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
||||||
<VirtualHost www.anywhere.net:443>
|
|
||||||
DocumentRoot /var/www/anywhere
|
|
||||||
Servername www.anywhere.net
|
|
||||||
SSLEngine On
|
|
||||||
<pointers to a an eligible cert>
|
|
||||||
<more ssl stuff >
|
|
||||||
<other stuff>
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
||||||
<VirtualHost www.somewhere-else.net:80>
|
|
||||||
DocumentRoot /var/www/somewhere-else
|
|
||||||
Servername www.somewhere-else.net
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
||||||
<VirtualHost www.somewhere-else:443>
|
|
||||||
DocumentRoot /var/www/somewhere-else
|
|
||||||
Servername www.somewhere-else.net
|
|
||||||
SSLEngine On
|
|
||||||
<pointers to another eligible cert>
|
|
||||||
<more ssl stuff >
|
|
||||||
<other stuff>
|
|
||||||
</VirtualHost>
|
|
||||||
|
|
||||||
Natürlich kannst du auch andere Verzeichnisse auf deinem Server nutzen, um Apache zu konfigurieren.
|
|
||||||
In diesem Fall müssen nur einige Zeilen in httpd.conf oder ports.conf angepasst werden - vor allem die NameVirtualHost-Zeilen.
|
|
||||||
Aber wenn du sicher im Umgang mit solchen Alternativen bist, wirst du sicherlich die nötigen Anpassungen herausfinden.
|
|
||||||
|
|
||||||
Starte dein Apache abschließend neu.
|
|
||||||
|
|
||||||
**StartSSL auf Nginx**
|
|
||||||
|
|
||||||
Führe zunächst ein Update auf den neuesten Friendica-Code durch.
|
|
||||||
Folge dann der Anleitung oben, um dein kostenloses Zertifikat zu erhalten.
|
|
||||||
Aber statt der Apache-Installationsanleitung zu folgen, mache das Folgende:
|
|
||||||
|
|
||||||
Lade dein Zertifikat hoch.
|
|
||||||
Es ist nicht wichtig, wohin du es lädst, solange Nginx es finden kann.
|
|
||||||
Einige Leute nutzen /home/verschiedeneNummernundBuchstaben, du kannst aber auch z.B. etwas wie /foo/bar nutzen.
|
|
||||||
|
|
||||||
Du kannst das Passwort entfernen, wenn du willst.
|
|
||||||
Es ist zwar möglicherweise nicht die beste Wahl, aber wenn du es nicht machst, wirst du das Passwort immer wieder eingeben müssen, wenn du Ngingx neustartest.
|
|
||||||
Um es zu entfernen, gebe Folgendes ein:
|
|
||||||
|
|
||||||
openssl rsa -in ssl.key-pass -out ssl.key
|
|
||||||
|
|
||||||
Nun hole dir das Hifs-Zertifikat:
|
|
||||||
|
|
||||||
wget http://www.startssl.com/certs/sub.class1.server.ca.pem
|
|
||||||
|
|
||||||
Nun vereinige die Dateien:
|
|
||||||
|
|
||||||
cat ssl.crt sub.class1.server.ca.pem > ssl.crt
|
|
||||||
|
|
||||||
In manchen Konfigurationen ist ein Bug enthalten, weshalb diese Schritte nicht ordentlich arbeiten.
|
|
||||||
Du musst daher ggf. ssl.crt bearbeiten:
|
|
||||||
|
|
||||||
nano /foo/bar/ssl.crt
|
|
||||||
|
|
||||||
Du wirst zwei Zertifikate in der gleichen Date sehen. In der Mitte findest du:
|
|
||||||
|
|
||||||
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
|
|
||||||
|
|
||||||
Das ist schlecht. Du brauchst die folgenden Einträge:
|
|
||||||
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
|
|
||||||
|
|
||||||
Du kannst den Zeilenumbruch manuell eingeben, falls dein System vom Bug betroffen ist.
|
|
||||||
Beachte, dass nach -----BEGIN CERTIFICATE----- nur ein Zeilenumbruch ist.
|
|
||||||
Es gibt keine leere Zeile zwischen beiden Einträgen.
|
|
||||||
|
|
||||||
Nun musst du Nginx über die Zertifikate informieren.
|
|
||||||
|
|
||||||
In /etc/nginx/sites-available/foo.com.conf benötigst du etwas wie:
|
|
||||||
|
|
||||||
server {
|
|
||||||
|
|
||||||
listen 80;
|
|
||||||
|
|
||||||
listen 443 ssl;
|
|
||||||
|
|
||||||
listen [::]:80;
|
|
||||||
|
|
||||||
listen [::]:443 ipv6only=on ssl;
|
|
||||||
|
|
||||||
ssl_certificate /foo/bar/ssl.crt;
|
|
||||||
|
|
||||||
ssl_certificate_key /foo/bar/ssl.key;
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
Nun starte Nginx neu:
|
|
||||||
|
|
||||||
/etc/init.d/nginx restart
|
|
||||||
|
|
||||||
Und das war es schon.
|
|
||||||
|
|
||||||
Für multiple Domains ist es mit Nginx einfacher als mit Apache.
|
|
||||||
Du musst du oben genannten Schritte nur für jedes Zertifikat wiederholen und die spezifischen Informationen im eigenen {server...}-Bereich spezifizieren.
|
|
||||||
|
|
|
@ -53,9 +53,21 @@ In the descirption and location field you can use BBCode to format the text.
|
||||||
When you *Share* the event it will be posted to your wall with the access permissions you've selected.
|
When you *Share* the event it will be posted to your wall with the access permissions you've selected.
|
||||||
But before you do, you can also *preview* the event in a pop-up box.
|
But before you do, you can also *preview* the event in a pop-up box.
|
||||||
|
|
||||||
|
### Interaction with Events
|
||||||
|
|
||||||
|
When you publish an event, you can choose who shall receive it, as with a regular new posting.
|
||||||
|
The recipients will see the posting about the event in their network-stream.
|
||||||
|
Additionally it will be added to their calendar and thus be shown in their events overview page.
|
||||||
|
|
||||||
|
Recipients of the event-posting can comment or dis-/like the event, as with a regular posting, but also announce that they will attend, not attend or may-be attend the event with a single click.
|
||||||
|
|
||||||
### Addons
|
### Addons
|
||||||
|
|
||||||
#### OpenStreetMap
|
#### OpenStreetMap
|
||||||
|
|
||||||
If this addon is activated on you friendica node, the content of the location field will be mathced with the identification service of OSM when you submit the event.
|
If this addon is activated on you friendica node, the content of the location field will be mathced with the identification service of OSM when you submit the event.
|
||||||
Should OSM find anything matching, a map for the location will be embedded automatically at the end of the events view.
|
Should OSM find anything matching, a map for the location will be embedded automatically at the end of the events view.
|
||||||
|
|
||||||
|
#### Calendar Export
|
||||||
|
|
||||||
|
If this addon is activated the public events you have created will be published in ical or csv file. The URL of the published file is ``example.com/cal/nickname/export/format`` (where format is either ical of csv).
|
98
doc/htconfig.md
Normal file
98
doc/htconfig.md
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
Config values that can only be set in .htconfig.php
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
There are some config values that haven't found their way into the administration page. This has several reasons. Maybe they are part of a
|
||||||
|
current development that isn't considered stable and will be added later in the administration page when it is considered safe. Or it triggers
|
||||||
|
something that isn't expected to be of public interest. Or it is for testing purposes only.
|
||||||
|
|
||||||
|
**Attention:** Please be warned that you shouldn't use one of these values without the knowledge what it could trigger. Especially don't do that with
|
||||||
|
undocumented values.
|
||||||
|
|
||||||
|
The header of the section describes the category, the value is the parameter. Example: To set the directory value please add this
|
||||||
|
line to your .htconfig.php:
|
||||||
|
|
||||||
|
$a->config['system']['directory'] = 'http://dir.friendi.ca';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Jabber ##
|
||||||
|
* debug (Boolean) - Enable debug level for the jabber account synchronisation.
|
||||||
|
* logfile - Logfile for the jabber account synchronisation.
|
||||||
|
|
||||||
|
## System ##
|
||||||
|
|
||||||
|
* birthday_input_format - Default value is "ymd".
|
||||||
|
* block_local_dir (Boolean) - Blocks the access to the directory of the local users.
|
||||||
|
* default_service_class -
|
||||||
|
* delivery_batch_count - Number of deliveries per process. Default value is 1. (Disabled when using the worker)
|
||||||
|
* diaspora_test (Boolean) - For development only. Disables the message transfer.
|
||||||
|
* directory - The path to global directory. If not set then "http://dir.friendi.ca" is used.
|
||||||
|
* disable_email_validation (Boolean) - Disables the check if a mail address is in a valid format and can be resolved via DNS.
|
||||||
|
* disable_url_validation (Boolean) - Disables the DNS lookup of an URL.
|
||||||
|
* event_input_format - Default value is "ymd".
|
||||||
|
* ignore_cache (Boolean) - For development only. Disables the item cache.
|
||||||
|
* like_no_comment (Boolean) - Don't update the "commented" value of an item when it is liked.
|
||||||
|
* local_block (Boolean) - Used in conjunction with "block_public".
|
||||||
|
* local_search (Boolean) - Blocks the search for not logged in users to prevent crawlers from blocking your system.
|
||||||
|
* max_contact_queue - Default value is 500.
|
||||||
|
* max_batch_queue - Default value is 1000.
|
||||||
|
* no_oembed (Boolean) - Don't use OEmbed to fetch more information about a link.
|
||||||
|
* no_oembed_rich_content (Boolean) - Don't show the rich content (e.g. embedded PDF).
|
||||||
|
* no_smilies (Boolean) - Don't show smilies.
|
||||||
|
* no_view_full_size (Boolean) - Don't add the link "View full size" under a resized image.
|
||||||
|
* optimize_items (Boolean) - Triggers an SQL command to optimize the item table before expiring items.
|
||||||
|
* ostatus_poll_timeframe - Defines how old an item can be to try to complete the conversation with it.
|
||||||
|
* paranoia (Boolean) - Log out users if their IP address changed.
|
||||||
|
* permit_crawling (Boolean) - Restricts the search for not logged in users to one search per minute.
|
||||||
|
* png_quality - Default value is 8.
|
||||||
|
* proc_windows (Boolean) - Should be enabled if Friendica is running under Windows.
|
||||||
|
* proxy_cache_time - Time after which the cache is cleared. Default value is one day.
|
||||||
|
* pushpoll_frequency -
|
||||||
|
* qsearch_limit - Default value is 100.
|
||||||
|
* relay_server - Experimental Diaspora feature. Address of the relay server where public posts should be send to. For example https://podrelay.net
|
||||||
|
* relay_subscribe (Boolean) - Enables the receiving of public posts from the relay. They will be included in the search and on the community page when it is set up to show all public items.
|
||||||
|
* relay_scope - Can be "all" or "tags". "all" means that every public post should be received. "tags" means that only posts witt selected tags should be received.
|
||||||
|
* relay_server_tags - Comma separated list of tags for the "tags" subscription (see "relay_scrope")
|
||||||
|
* relay_user_tags (Boolean) - If enabled, the tags from the saved searches will used for the "tags" subscription in addition to the "relay_server_tags".
|
||||||
|
* remove_multiplicated_lines (Boolean) - If enabled, multiple linefeeds in items are stripped to a single one.
|
||||||
|
* show_unsupported_addons (Boolean) - Show all addons including the unsupported ones.
|
||||||
|
* show_unsupported_themes (Boolean) - Show all themes including the unsupported ones.
|
||||||
|
* throttle_limit_day - Maximum number of posts that a user can send per day with the API.
|
||||||
|
* throttle_limit_week - Maximum number of posts that a user can send per week with the API.
|
||||||
|
* throttle_limit_month - Maximum number of posts that a user can send per month with the API.
|
||||||
|
* wall-to-wall_share (Boolean) - Displays forwarded posts like "wall-to-wall" posts.
|
||||||
|
* worker (Boolean) - (Experimental) Use the worker system instead of calling several background processes. Reduces the overall load and speeds up item delivery.
|
||||||
|
* worker_dont_fork (Boolean) - if enabled, the workers are only called from the poller process. Useful on systems that permit the use of "proc_open".
|
||||||
|
* worker_queues - Number of parallel workers. Default value is 10 queues.
|
||||||
|
* xrd_timeout - Timeout for fetching the XRD links. Default value is 20 seconds.
|
||||||
|
|
||||||
|
## service_class ##
|
||||||
|
|
||||||
|
* upgrade_link -
|
||||||
|
|
||||||
|
## experimentals ##
|
||||||
|
|
||||||
|
* exp_themes (Boolean) - Show experimental themes as well.
|
||||||
|
|
||||||
|
## theme ##
|
||||||
|
|
||||||
|
* hide_eventlist (Boolean) - Don't show the birthdays and events on the profile and network page
|
||||||
|
|
||||||
|
# Administrator Options #
|
||||||
|
|
||||||
|
Enabling the admin panel for an account, and thus making the account holder
|
||||||
|
admin of the node, is done by setting the variable
|
||||||
|
|
||||||
|
$a->config['admin_email'] = "someone@example.com";
|
||||||
|
|
||||||
|
where you have to match the email address used for the account with the one you
|
||||||
|
enter to the .htconfig file. If more then one account should be able to access
|
||||||
|
the admin panel, seperate the email addresses with a comma.
|
||||||
|
|
||||||
|
$a->config['admin_email'] = "someone@example.com,someonelese@example.com";
|
||||||
|
|
||||||
|
If you want to have a more personalized closing line for the notification
|
||||||
|
emails you can set a variable for the admin_name.
|
||||||
|
|
||||||
|
$a->config['admin_name'] = "Marvin";
|
||||||
|
|
45
doc/install-ejabberd.md
Normal file
45
doc/install-ejabberd.md
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
Install an ejabberd with synchronized credentials
|
||||||
|
=================================================
|
||||||
|
|
||||||
|
* [Home](help)
|
||||||
|
|
||||||
|
[Ejabberd](https://www.ejabberd.im/) is a chat server that uses XMPP as messaging protocol that you can use with a large amount of clients. In conjunction
|
||||||
|
with the "xmpp" addon it can be used for a web based chat solution for your users.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
- Change it's owner to whichever user is running the server, ie. ejabberd
|
||||||
|
|
||||||
|
$ chown ejabberd:ejabberd /path/to/friendica/include/auth_ejabberd.php
|
||||||
|
|
||||||
|
- Change the access mode so it is readable only to the user ejabberd and has exec
|
||||||
|
|
||||||
|
$ chmod 700 /path/to/friendica/include/auth_ejabberd.php
|
||||||
|
|
||||||
|
- Edit your ejabberd.cfg file, comment out your auth_method and add:
|
||||||
|
|
||||||
|
{auth_method, external}.
|
||||||
|
{extauth_program, "/path/to/friendica/include/auth_ejabberd.php"}.
|
||||||
|
|
||||||
|
- Disable the module "mod_register" and disable the registration:
|
||||||
|
|
||||||
|
{access, register, [{deny, all}]}.
|
||||||
|
|
||||||
|
- Enable BOSH:
|
||||||
|
- Enable the module "mod_http_bind"
|
||||||
|
- Edit this line:
|
||||||
|
|
||||||
|
{5280, ejabberd_http, [captcha, http_poll, http_bind]}
|
||||||
|
|
||||||
|
- In your apache configuration for your site add this line:
|
||||||
|
|
||||||
|
ProxyPass /http-bind http://127.0.0.1:5280/http-bind retry=0
|
||||||
|
|
||||||
|
- Restart your ejabberd service, you should be able to login with your friendica credentials
|
||||||
|
|
||||||
|
Other hints
|
||||||
|
-----------
|
||||||
|
- if a user has a space or a @ in the nickname, the user has to replace these characters:
|
||||||
|
- " " (space) is replaced with "%20"
|
||||||
|
- "@" is replaced with "(a)"
|
|
@ -30,6 +30,7 @@ Friendica Documentation and Resources
|
||||||
* [Settings](help/Settings)
|
* [Settings](help/Settings)
|
||||||
* [Plugins](help/Plugins)
|
* [Plugins](help/Plugins)
|
||||||
* [Installing Connectors (Twitter/GNU Social)](help/Installing-Connectors)
|
* [Installing Connectors (Twitter/GNU Social)](help/Installing-Connectors)
|
||||||
|
* [Install an ejabberd server (XMPP chat) with synchronized credentials](help/install-ejabberd)
|
||||||
* [Message Flow](help/Message-Flow)
|
* [Message Flow](help/Message-Flow)
|
||||||
* [Using SSL with Friendica](help/SSL)
|
* [Using SSL with Friendica](help/SSL)
|
||||||
* [Developers](help/Developers)
|
* [Developers](help/Developers)
|
||||||
|
|
BIN
images/icons.png
BIN
images/icons.png
Binary file not shown.
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
|
@ -191,6 +191,100 @@ function unmark_for_death($contact) {
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
function get_contact_details_by_url($url, $uid = -1) {
|
||||||
|
require_once("mod/proxy.php");
|
||||||
|
require_once("include/bbcode.php");
|
||||||
|
|
||||||
|
if ($uid == -1)
|
||||||
|
$uid = local_user();
|
||||||
|
|
||||||
|
$r = q("SELECT `id` AS `gid`, `url`, `name`, `nick`, `addr`, `photo`, `location`, `about`, `keywords`, `gender`, `community`, `network` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
|
||||||
|
dbesc(normalise_link($url)));
|
||||||
|
|
||||||
|
if ($r) {
|
||||||
|
$profile = $r[0];
|
||||||
|
|
||||||
|
if ((($profile["addr"] == "") OR ($profile["name"] == "")) AND
|
||||||
|
in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)))
|
||||||
|
proc_run('php',"include/update_gcontact.php", $profile["gid"]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$r = q("SELECT `url`, `name`, `nick`, `avatar` AS `photo`, `location`, `about` FROM `unique_contacts` WHERE `url` = '%s'",
|
||||||
|
dbesc(normalise_link($url)));
|
||||||
|
|
||||||
|
if (count($r)) {
|
||||||
|
$profile = $r[0];
|
||||||
|
$profile["keywords"] = "";
|
||||||
|
$profile["gender"] = "";
|
||||||
|
$profile["community"] = false;
|
||||||
|
$profile["network"] = "";
|
||||||
|
$profile["addr"] = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetching further contact data from the contact table
|
||||||
|
$r = q("SELECT `id`, `uid`, `url`, `network`, `name`, `nick`, `addr`, `location`, `about`, `keywords`, `gender`, `photo`, `addr`, `forum`, `prv`, `bd` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `network` = '%s'",
|
||||||
|
dbesc(normalise_link($url)), intval($uid), dbesc($profile["network"]));
|
||||||
|
|
||||||
|
if (!count($r))
|
||||||
|
$r = q("SELECT `id`, `uid`, `url`, `network`, `name`, `nick`, `addr`, `location`, `about`, `keywords`, `gender`, `photo`, `addr`, `forum`, `prv`, `bd` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d",
|
||||||
|
dbesc(normalise_link($url)), intval($uid));
|
||||||
|
|
||||||
|
if (!count($r))
|
||||||
|
$r = q("SELECT `id`, `uid`, `url`, `network`, `name`, `nick`, `addr`, `location`, `about`, `keywords`, `gender`, `photo`, `addr`, `forum`, `prv`, `bd` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0",
|
||||||
|
dbesc(normalise_link($url)));
|
||||||
|
|
||||||
|
if ($r) {
|
||||||
|
if (isset($r[0]["url"]) AND $r[0]["url"])
|
||||||
|
$profile["url"] = $r[0]["url"];
|
||||||
|
if (isset($r[0]["name"]) AND $r[0]["name"])
|
||||||
|
$profile["name"] = $r[0]["name"];
|
||||||
|
if (isset($r[0]["nick"]) AND $r[0]["nick"] AND ($profile["nick"] == ""))
|
||||||
|
$profile["nick"] = $r[0]["nick"];
|
||||||
|
if (isset($r[0]["addr"]) AND $r[0]["addr"] AND ($profile["addr"] == ""))
|
||||||
|
$profile["addr"] = $r[0]["addr"];
|
||||||
|
if (isset($r[0]["photo"]) AND $r[0]["photo"])
|
||||||
|
$profile["photo"] = $r[0]["photo"];
|
||||||
|
if (isset($r[0]["location"]) AND $r[0]["location"])
|
||||||
|
$profile["location"] = $r[0]["location"];
|
||||||
|
if (isset($r[0]["about"]) AND $r[0]["about"])
|
||||||
|
$profile["about"] = $r[0]["about"];
|
||||||
|
if (isset($r[0]["keywords"]) AND $r[0]["keywords"])
|
||||||
|
$profile["keywords"] = $r[0]["keywords"];
|
||||||
|
if (isset($r[0]["gender"]) AND $r[0]["gender"])
|
||||||
|
$profile["gender"] = $r[0]["gender"];
|
||||||
|
if (isset($r[0]["forum"]) OR isset($r[0]["prv"]))
|
||||||
|
$profile["community"] = ($r[0]["forum"] OR $r[0]["prv"]);
|
||||||
|
if (isset($r[0]["network"]) AND $r[0]["network"])
|
||||||
|
$profile["network"] = $r[0]["network"];
|
||||||
|
if (isset($r[0]["addr"]) AND $r[0]["addr"])
|
||||||
|
$profile["addr"] = $r[0]["addr"];
|
||||||
|
if (isset($r[0]["bd"]) AND $r[0]["bd"])
|
||||||
|
$profile["bd"] = $r[0]["bd"];
|
||||||
|
if ($r[0]["uid"] == 0)
|
||||||
|
$profile["cid"] = 0;
|
||||||
|
else
|
||||||
|
$profile["cid"] = $r[0]["id"];
|
||||||
|
} else
|
||||||
|
$profile["cid"] = 0;
|
||||||
|
|
||||||
|
if (isset($profile["photo"]))
|
||||||
|
$profile["photo"] = proxy_url($profile["photo"], false, PROXY_SIZE_SMALL);
|
||||||
|
|
||||||
|
if (isset($profile["location"]))
|
||||||
|
$profile["location"] = bbcode($profile["location"]);
|
||||||
|
|
||||||
|
if (isset($profile["about"]))
|
||||||
|
$profile["about"] = bbcode($profile["about"]);
|
||||||
|
|
||||||
|
if (($profile["cid"] == 0) AND ($profile["network"] == NETWORK_DIASPORA)) {
|
||||||
|
$profile["location"] = "";
|
||||||
|
$profile["about"] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return($profile);
|
||||||
|
}
|
||||||
|
|
||||||
if(! function_exists('contact_photo_menu')){
|
if(! function_exists('contact_photo_menu')){
|
||||||
function contact_photo_menu($contact) {
|
function contact_photo_menu($contact) {
|
||||||
|
|
||||||
|
@ -219,24 +313,32 @@ function contact_photo_menu($contact) {
|
||||||
$status_link = $profile_link . "?url=status";
|
$status_link = $profile_link . "?url=status";
|
||||||
$photos_link = $profile_link . "?url=photos";
|
$photos_link = $profile_link . "?url=photos";
|
||||||
$profile_link = $profile_link . "?url=profile";
|
$profile_link = $profile_link . "?url=profile";
|
||||||
$pm_url = $a->get_baseurl() . '/message/new/' . $contact['id'];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (in_array($contact["network"], array(NETWORK_DFRN, NETWORK_DIASPORA)))
|
||||||
|
$pm_url = $a->get_baseurl() . '/message/new/' . $contact['id'];
|
||||||
|
|
||||||
|
if ($contact["network"] == NETWORK_DFRN)
|
||||||
$poke_link = $a->get_baseurl() . '/poke/?f=&c=' . $contact['id'];
|
$poke_link = $a->get_baseurl() . '/poke/?f=&c=' . $contact['id'];
|
||||||
|
|
||||||
$contact_url = $a->get_baseurl() . '/contacts/' . $contact['id'];
|
$contact_url = $a->get_baseurl() . '/contacts/' . $contact['id'];
|
||||||
$posts_link = $a->get_baseurl() . '/network/0?nets=all&cid=' . $contact['id'];
|
$posts_link = $a->get_baseurl() . '/network/0?nets=all&cid=' . $contact['id'];
|
||||||
$contact_drop_link = $a->get_baseurl() . "/contacts/" . $contact['id'] . '/drop?confirm=1';
|
$contact_drop_link = $a->get_baseurl() . "/contacts/" . $contact['id'] . '/drop?confirm=1';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* menu array:
|
||||||
|
* "name" => [ "Label", "link", (bool)Should the link opened in a new tab? ]
|
||||||
|
*/
|
||||||
$menu = Array(
|
$menu = Array(
|
||||||
'poke' => array(t("Poke"), $poke_link),
|
'status' => array(t("View Status"), $status_link, true),
|
||||||
'status' => array(t("View Status"), $status_link),
|
'profile' => array(t("View Profile"), $profile_link, true),
|
||||||
'profile' => array(t("View Profile"), $profile_link),
|
'photos' => array(t("View Photos"), $photos_link,true),
|
||||||
'photos' => array(t("View Photos"), $photos_link),
|
'network' => array(t("Network Posts"), $posts_link,false),
|
||||||
'network' => array(t("Network Posts"), $posts_link),
|
'edit' => array(t("Edit Contact"), $contact_url, false),
|
||||||
'edit' => array(t("Edit Contact"), $contact_url),
|
'drop' => array(t("Drop Contact"), $contact_drop_link, false),
|
||||||
'drop' => array(t("Drop Contact"), $contact_drop_link),
|
'pm' => array(t("Send PM"), $pm_url, false),
|
||||||
'pm' => array(t("Send PM"), $pm_url),
|
'poke' => array(t("Poke"), $poke_link, false),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -244,25 +346,13 @@ function contact_photo_menu($contact) {
|
||||||
|
|
||||||
call_hooks('contact_photo_menu', $args);
|
call_hooks('contact_photo_menu', $args);
|
||||||
|
|
||||||
/* $o = "";
|
$menucondensed = array();
|
||||||
foreach($menu as $k=>$v){
|
|
||||||
if ($v!="") {
|
foreach ($menu AS $menuname=>$menuitem)
|
||||||
if(($k !== t("Network Posts")) && ($k !== t("Send PM")) && ($k !== t('Edit Contact')))
|
if ($menuitem[1] != "")
|
||||||
$o .= "<li><a target=\"redir\" href=\"$v\">$k</a></li>\n";
|
$menucondensed[$menuname] = $menuitem;
|
||||||
else
|
|
||||||
$o .= "<li><a href=\"$v\">$k</a></li>\n";
|
return $menucondensed;
|
||||||
}
|
|
||||||
}
|
|
||||||
return $o;*/
|
|
||||||
foreach($menu as $k=>$v){
|
|
||||||
if ($v[1]!="") {
|
|
||||||
if(($v[0] !== t("Network Posts")) && ($v[0] !== t("Send PM")) && ($v[0] !== t('Edit Contact')))
|
|
||||||
$menu[$k][2] = 1;
|
|
||||||
else
|
|
||||||
$menu[$k][2] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $menu;
|
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -371,12 +371,11 @@ class Photo {
|
||||||
if( (! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg') )
|
if( (! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg') )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$exif = @exif_read_data($filename);
|
$exif = @exif_read_data($filename,null,true);
|
||||||
|
|
||||||
if(! $exif)
|
if(! $exif)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$ort = $exif['Orientation'];
|
$ort = $exif['IFD0']['Orientation'];
|
||||||
|
|
||||||
switch($ort)
|
switch($ort)
|
||||||
{
|
{
|
||||||
|
@ -413,6 +412,10 @@ class Photo {
|
||||||
$this->rotate(90);
|
$this->rotate(90);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// logger('exif: ' . print_r($exif,true));
|
||||||
|
return $exif;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -407,7 +407,7 @@ function probe_url($url, $mode = PROBE_NORMAL, $level = 1) {
|
||||||
$pubkey = $diaspora_key;
|
$pubkey = $diaspora_key;
|
||||||
$diaspora = true;
|
$diaspora = true;
|
||||||
}
|
}
|
||||||
if($link['@attributes']['rel'] === 'http://ostatus.org/schema/1.0/subscribe') {
|
if(($link['@attributes']['rel'] === 'http://ostatus.org/schema/1.0/subscribe') AND ($mode == PROBE_NORMAL)) {
|
||||||
$diaspora = false;
|
$diaspora = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -552,7 +552,7 @@ function probe_url($url, $mode = PROBE_NORMAL, $level = 1) {
|
||||||
if($network !== NETWORK_ZOT && $network !== NETWORK_DFRN && $network !== NETWORK_MAIL) {
|
if($network !== NETWORK_ZOT && $network !== NETWORK_DFRN && $network !== NETWORK_MAIL) {
|
||||||
if($diaspora)
|
if($diaspora)
|
||||||
$network = NETWORK_DIASPORA;
|
$network = NETWORK_DIASPORA;
|
||||||
elseif($has_lrdd)
|
elseif($has_lrdd AND ($notify))
|
||||||
$network = NETWORK_OSTATUS;
|
$network = NETWORK_OSTATUS;
|
||||||
|
|
||||||
if(strpos($url,'@'))
|
if(strpos($url,'@'))
|
||||||
|
@ -652,9 +652,10 @@ function probe_url($url, $mode = PROBE_NORMAL, $level = 1) {
|
||||||
$feed->set_raw_data(($xml) ? $xml : '<?xml version="1.0" encoding="utf-8" ?><xml></xml>');
|
$feed->set_raw_data(($xml) ? $xml : '<?xml version="1.0" encoding="utf-8" ?><xml></xml>');
|
||||||
|
|
||||||
$feed->init();
|
$feed->init();
|
||||||
if($feed->error())
|
if($feed->error()) {
|
||||||
logger('probe_url: scrape_feed: Error parsing XML: ' . $feed->error());
|
logger('probe_url: scrape_feed: Error parsing XML: ' . $feed->error());
|
||||||
|
$network = NETWORK_PHANTOM;
|
||||||
|
}
|
||||||
|
|
||||||
if(! x($vcard,'photo'))
|
if(! x($vcard,'photo'))
|
||||||
$vcard['photo'] = $feed->get_image_url();
|
$vcard['photo'] = $feed->get_image_url();
|
||||||
|
@ -778,6 +779,9 @@ function probe_url($url, $mode = PROBE_NORMAL, $level = 1) {
|
||||||
|
|
||||||
$baseurl = rtrim($baseurl, "/");
|
$baseurl = rtrim($baseurl, "/");
|
||||||
|
|
||||||
|
if(strpos($url,'@') AND ($addr == "") AND ($network == NETWORK_DFRN))
|
||||||
|
$addr = str_replace('acct:', '', $url);
|
||||||
|
|
||||||
$vcard['fn'] = notags($vcard['fn']);
|
$vcard['fn'] = notags($vcard['fn']);
|
||||||
$vcard['nick'] = str_replace(' ','',notags($vcard['nick']));
|
$vcard['nick'] = str_replace(' ','',notags($vcard['nick']));
|
||||||
|
|
||||||
|
|
|
@ -392,7 +392,6 @@ function acl_lookup(&$a, $out_type = 'json') {
|
||||||
if(!local_user())
|
if(!local_user())
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
|
|
||||||
$start = (x($_REQUEST,'start')?$_REQUEST['start']:0);
|
$start = (x($_REQUEST,'start')?$_REQUEST['start']:0);
|
||||||
$count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
|
$count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
|
||||||
$search = (x($_REQUEST,'search')?$_REQUEST['search']:"");
|
$search = (x($_REQUEST,'search')?$_REQUEST['search']:"");
|
||||||
|
@ -492,7 +491,7 @@ function acl_lookup(&$a, $out_type = 'json') {
|
||||||
$groups[] = array(
|
$groups[] = array(
|
||||||
"type" => "g",
|
"type" => "g",
|
||||||
"photo" => "images/twopeople.png",
|
"photo" => "images/twopeople.png",
|
||||||
"name" => $g['name'],
|
"name" => htmlentities($g['name']),
|
||||||
"id" => intval($g['id']),
|
"id" => intval($g['id']),
|
||||||
"uids" => array_map("intval", explode(",",$g['uids'])),
|
"uids" => array_map("intval", explode(",",$g['uids'])),
|
||||||
"link" => '',
|
"link" => '',
|
||||||
|
@ -545,9 +544,9 @@ function acl_lookup(&$a, $out_type = 'json') {
|
||||||
$x['data'] = array();
|
$x['data'] = array();
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
foreach($r as $g) {
|
foreach($r as $g) {
|
||||||
$x['photos'][] = proxy_url($g['micro']);
|
$x['photos'][] = proxy_url($g['micro'], false, PROXY_SIZE_MICRO);
|
||||||
$x['links'][] = $g['url'];
|
$x['links'][] = $g['url'];
|
||||||
$x['suggestions'][] = $g['name'];
|
$x['suggestions'][] = htmlentities($g['name']);
|
||||||
$x['data'][] = intval($g['id']);
|
$x['data'][] = intval($g['id']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -559,12 +558,12 @@ function acl_lookup(&$a, $out_type = 'json') {
|
||||||
foreach($r as $g){
|
foreach($r as $g){
|
||||||
$contacts[] = array(
|
$contacts[] = array(
|
||||||
"type" => "c",
|
"type" => "c",
|
||||||
"photo" => proxy_url($g['micro']),
|
"photo" => proxy_url($g['micro'], false, PROXY_SIZE_MICRO),
|
||||||
"name" => $g['name'],
|
"name" => htmlentities($g['name']),
|
||||||
"id" => intval($g['id']),
|
"id" => intval($g['id']),
|
||||||
"network" => $g['network'],
|
"network" => $g['network'],
|
||||||
"link" => $g['url'],
|
"link" => $g['url'],
|
||||||
"nick" => ($g['attag']) ? $g['attag'] : $g['nick'],
|
"nick" => htmlentities(($g['attag']) ? $g['attag'] : $g['nick']),
|
||||||
"forum" => $g['forum']
|
"forum" => $g['forum']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -604,12 +603,12 @@ function acl_lookup(&$a, $out_type = 'json') {
|
||||||
// /nickname
|
// /nickname
|
||||||
$unknow_contacts[] = array(
|
$unknow_contacts[] = array(
|
||||||
"type" => "c",
|
"type" => "c",
|
||||||
"photo" => proxy_url($row['author-avatar']),
|
"photo" => proxy_url($row['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||||
"name" => $row['author-name'],
|
"name" => htmlentities($row['author-name']),
|
||||||
"id" => '',
|
"id" => '',
|
||||||
"network" => "unknown",
|
"network" => "unknown",
|
||||||
"link" => $row['author-link'],
|
"link" => $row['author-link'],
|
||||||
"nick" => $nick,
|
"nick" => htmlentities($nick),
|
||||||
"forum" => false
|
"forum" => false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -285,7 +285,7 @@
|
||||||
* Unique contact to contact url.
|
* Unique contact to contact url.
|
||||||
*/
|
*/
|
||||||
function api_unique_id_to_url($id){
|
function api_unique_id_to_url($id){
|
||||||
$r = q("SELECT url FROM unique_contacts WHERE id=%d LIMIT 1",
|
$r = q("SELECT `url` FROM `unique_contacts` WHERE `id`=%d LIMIT 1",
|
||||||
intval($id));
|
intval($id));
|
||||||
if ($r)
|
if ($r)
|
||||||
return ($r[0]["url"]);
|
return ($r[0]["url"]);
|
||||||
|
@ -390,9 +390,9 @@
|
||||||
$r = array();
|
$r = array();
|
||||||
|
|
||||||
if ($url != "")
|
if ($url != "")
|
||||||
$r = q("SELECT * FROM unique_contacts WHERE url='%s' LIMIT 1", $url);
|
$r = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", $url);
|
||||||
elseif ($nick != "")
|
elseif ($nick != "")
|
||||||
$r = q("SELECT * FROM unique_contacts WHERE nick='%s' LIMIT 1", $nick);
|
$r = q("SELECT * FROM `unique_contacts` WHERE `nick`='%s' LIMIT 1", $nick);
|
||||||
|
|
||||||
if ($r) {
|
if ($r) {
|
||||||
// If no nick where given, extract it from the address
|
// If no nick where given, extract it from the address
|
||||||
|
@ -505,14 +505,14 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetching unique id
|
// Fetching unique id
|
||||||
$r = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
|
$r = q("SELECT id FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
|
||||||
|
|
||||||
// If not there, then add it
|
// If not there, then add it
|
||||||
if (count($r) == 0) {
|
if (count($r) == 0) {
|
||||||
q("INSERT INTO unique_contacts (url, name, nick, avatar) VALUES ('%s', '%s', '%s', '%s')",
|
q("INSERT INTO `unique_contacts` (`url`, `name`, `nick`, `avatar`) VALUES ('%s', '%s', '%s', '%s')",
|
||||||
dbesc(normalise_link($uinfo[0]['url'])), dbesc($uinfo[0]['name']),dbesc($uinfo[0]['nick']), dbesc($uinfo[0]['micro']));
|
dbesc(normalise_link($uinfo[0]['url'])), dbesc($uinfo[0]['name']),dbesc($uinfo[0]['nick']), dbesc($uinfo[0]['micro']));
|
||||||
|
|
||||||
$r = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
|
$r = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url'])));
|
||||||
}
|
}
|
||||||
|
|
||||||
$network_name = network_to_name($uinfo[0]['network'], $uinfo[0]['url']);
|
$network_name = network_to_name($uinfo[0]['network'], $uinfo[0]['url']);
|
||||||
|
@ -539,7 +539,8 @@
|
||||||
'verified' => true,
|
'verified' => true,
|
||||||
'statusnet_blocking' => false,
|
'statusnet_blocking' => false,
|
||||||
'notifications' => false,
|
'notifications' => false,
|
||||||
'statusnet_profile_url' => $a->get_baseurl()."/contacts/".$uinfo[0]['cid'],
|
//'statusnet_profile_url' => $a->get_baseurl()."/contacts/".$uinfo[0]['cid'],
|
||||||
|
'statusnet_profile_url' => $uinfo[0]['url'],
|
||||||
'uid' => intval($uinfo[0]['uid']),
|
'uid' => intval($uinfo[0]['uid']),
|
||||||
'cid' => intval($uinfo[0]['cid']),
|
'cid' => intval($uinfo[0]['cid']),
|
||||||
'self' => $uinfo[0]['self'],
|
'self' => $uinfo[0]['self'],
|
||||||
|
@ -552,32 +553,44 @@
|
||||||
|
|
||||||
function api_item_get_user(&$a, $item) {
|
function api_item_get_user(&$a, $item) {
|
||||||
|
|
||||||
$author = q("SELECT * FROM unique_contacts WHERE url='%s' LIMIT 1",
|
$author = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
|
||||||
dbesc(normalise_link($item['author-link'])));
|
dbesc(normalise_link($item['author-link'])));
|
||||||
|
|
||||||
if (count($author) == 0) {
|
if (count($author) == 0) {
|
||||||
q("INSERT INTO unique_contacts (url, name, avatar) VALUES ('%s', '%s', '%s')",
|
q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`) VALUES ('%s', '%s', '%s')",
|
||||||
dbesc(normalise_link($item["author-link"])), dbesc($item["author-name"]), dbesc($item["author-avatar"]));
|
dbesc(normalise_link($item["author-link"])), dbesc($item["author-name"]), dbesc($item["author-avatar"]));
|
||||||
|
|
||||||
$author = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
|
$author = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
|
||||||
dbesc(normalise_link($item['author-link'])));
|
dbesc(normalise_link($item['author-link'])));
|
||||||
} else if ($item["author-link"].$item["author-name"] != $author[0]["url"].$author[0]["name"]) {
|
} else if ($item["author-link"].$item["author-name"] != $author[0]["url"].$author[0]["name"]) {
|
||||||
q("UPDATE unique_contacts SET name = '%s', avatar = '%s' WHERE url = '%s'",
|
$r = q("SELECT `id` FROM `unique_contacts` WHERE `name` = '%s' AND `avatar` = '%s' AND url = '%s'",
|
||||||
dbesc($item["author-name"]), dbesc($item["author-avatar"]), dbesc(normalise_link($item["author-link"])));
|
dbesc($item["author-name"]), dbesc($item["author-avatar"]),
|
||||||
|
dbesc(normalise_link($item["author-link"])));
|
||||||
|
|
||||||
|
if (!$r)
|
||||||
|
q("UPDATE `unique_contacts` SET `name` = '%s', `avatar` = '%s' WHERE `url` = '%s'",
|
||||||
|
dbesc($item["author-name"]), dbesc($item["author-avatar"]),
|
||||||
|
dbesc(normalise_link($item["author-link"])));
|
||||||
}
|
}
|
||||||
|
|
||||||
$owner = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
|
$owner = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
|
||||||
dbesc(normalise_link($item['owner-link'])));
|
dbesc(normalise_link($item['owner-link'])));
|
||||||
|
|
||||||
if (count($owner) == 0) {
|
if (count($owner) == 0) {
|
||||||
q("INSERT INTO unique_contacts (url, name, avatar) VALUES ('%s', '%s', '%s')",
|
q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`) VALUES ('%s', '%s', '%s')",
|
||||||
dbesc(normalise_link($item["owner-link"])), dbesc($item["owner-name"]), dbesc($item["owner-avatar"]));
|
dbesc(normalise_link($item["owner-link"])), dbesc($item["owner-name"]), dbesc($item["owner-avatar"]));
|
||||||
|
|
||||||
$owner = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
|
$owner = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1",
|
||||||
dbesc(normalise_link($item['owner-link'])));
|
dbesc(normalise_link($item['owner-link'])));
|
||||||
} else if ($item["owner-link"].$item["owner-name"] != $owner[0]["url"].$owner[0]["name"]) {
|
} else if ($item["owner-link"].$item["owner-name"] != $owner[0]["url"].$owner[0]["name"]) {
|
||||||
q("UPDATE unique_contacts SET name = '%s', avatar = '%s' WHERE url = '%s'",
|
$r = q("SELECT `id` FROM `unique_contacts` WHERE `name` = '%s' AND `avatar` = '%s' AND url = '%s'",
|
||||||
dbesc($item["owner-name"]), dbesc($item["owner-avatar"]), dbesc(normalise_link($item["owner-link"])));
|
dbesc($item["owner-name"]), dbesc($item["owner-avatar"]),
|
||||||
|
dbesc(normalise_link($item["owner-link"])));
|
||||||
|
|
||||||
|
if (!$r)
|
||||||
|
q("UPDATE `unique_contacts` SET `name` = '%s', `avatar` = '%s' WHERE `url` = '%s'",
|
||||||
|
dbesc($item["owner-name"]), dbesc($item["owner-avatar"]),
|
||||||
|
dbesc(normalise_link($item["owner-link"])));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comments in threads may appear as wall-to-wall postings.
|
// Comments in threads may appear as wall-to-wall postings.
|
||||||
|
@ -914,14 +927,18 @@
|
||||||
|
|
||||||
logger('api_status_show: user_info: '.print_r($user_info, true), LOGGER_DEBUG);
|
logger('api_status_show: user_info: '.print_r($user_info, true), LOGGER_DEBUG);
|
||||||
|
|
||||||
|
if ($type == "raw")
|
||||||
|
$privacy_sql = "AND `item`.`allow_cid`='' AND `item`.`allow_gid`='' AND `item`.`deny_cid`='' AND `item`.`deny_gid`=''";
|
||||||
|
else
|
||||||
|
$privacy_sql = "";
|
||||||
|
|
||||||
// get last public wall message
|
// get last public wall message
|
||||||
$lastwall = q("SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`author-link` AS `item-author`
|
$lastwall = q("SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`author-link` AS `item-author`
|
||||||
FROM `item`, `item` as `i`
|
FROM `item`, `item` as `i`
|
||||||
WHERE `item`.`contact-id` = %d AND `item`.`uid` = %d
|
WHERE `item`.`contact-id` = %d AND `item`.`uid` = %d
|
||||||
AND ((`item`.`author-link` IN ('%s', '%s')) OR (`item`.`owner-link` IN ('%s', '%s')))
|
AND ((`item`.`author-link` IN ('%s', '%s')) OR (`item`.`owner-link` IN ('%s', '%s')))
|
||||||
AND `i`.`id` = `item`.`parent`
|
AND `i`.`id` = `item`.`parent`
|
||||||
AND `item`.`type`!='activity'
|
AND `item`.`type`!='activity' $privacy_sql
|
||||||
AND `item`.`allow_cid`='' AND `item`.`allow_gid`='' AND `item`.`deny_cid`='' AND `item`.`deny_gid`=''
|
|
||||||
ORDER BY `item`.`created` DESC
|
ORDER BY `item`.`created` DESC
|
||||||
LIMIT 1",
|
LIMIT 1",
|
||||||
intval($user_info['cid']),
|
intval($user_info['cid']),
|
||||||
|
@ -944,7 +961,7 @@
|
||||||
$in_reply_to_status_id= intval($lastwall['parent']);
|
$in_reply_to_status_id= intval($lastwall['parent']);
|
||||||
$in_reply_to_status_id_str = (string) intval($lastwall['parent']);
|
$in_reply_to_status_id_str = (string) intval($lastwall['parent']);
|
||||||
|
|
||||||
$r = q("SELECT * FROM unique_contacts WHERE `url` = '%s'", dbesc(normalise_link($lastwall['item-author'])));
|
$r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($lastwall['item-author'])));
|
||||||
if ($r) {
|
if ($r) {
|
||||||
if ($r[0]['nick'] == "")
|
if ($r[0]['nick'] == "")
|
||||||
$r[0]['nick'] = api_get_nick($r[0]["url"]);
|
$r[0]['nick'] = api_get_nick($r[0]["url"]);
|
||||||
|
@ -967,7 +984,7 @@
|
||||||
$in_reply_to_screen_name = NULL;
|
$in_reply_to_screen_name = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
$converted = api_convert_item($item);
|
$converted = api_convert_item($lastwall);
|
||||||
|
|
||||||
$status_info = array(
|
$status_info = array(
|
||||||
'created_at' => api_date($lastwall['created']),
|
'created_at' => api_date($lastwall['created']),
|
||||||
|
@ -1013,6 +1030,8 @@
|
||||||
unset($status_info["user"]["self"]);
|
unset($status_info["user"]["self"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger('status_info: '.print_r($status_info, true), LOGGER_DEBUG);
|
||||||
|
|
||||||
if ($type == "raw")
|
if ($type == "raw")
|
||||||
return($status_info);
|
return($status_info);
|
||||||
|
|
||||||
|
@ -1064,7 +1083,7 @@
|
||||||
$in_reply_to_status_id = intval($lastwall['parent']);
|
$in_reply_to_status_id = intval($lastwall['parent']);
|
||||||
$in_reply_to_status_id_str = (string) intval($lastwall['parent']);
|
$in_reply_to_status_id_str = (string) intval($lastwall['parent']);
|
||||||
|
|
||||||
$r = q("SELECT * FROM unique_contacts WHERE `url` = '%s'", dbesc(normalise_link($reply[0]['item-author'])));
|
$r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($reply[0]['item-author'])));
|
||||||
if ($r) {
|
if ($r) {
|
||||||
if ($r[0]['nick'] == "")
|
if ($r[0]['nick'] == "")
|
||||||
$r[0]['nick'] = api_get_nick($r[0]["url"]);
|
$r[0]['nick'] = api_get_nick($r[0]["url"]);
|
||||||
|
@ -1076,7 +1095,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$converted = api_convert_item($item);
|
$converted = api_convert_item($lastwall);
|
||||||
|
|
||||||
$user_info['status'] = array(
|
$user_info['status'] = array(
|
||||||
'text' => $converted["text"],
|
'text' => $converted["text"],
|
||||||
|
@ -1125,9 +1144,9 @@
|
||||||
$userlist = array();
|
$userlist = array();
|
||||||
|
|
||||||
if (isset($_GET["q"])) {
|
if (isset($_GET["q"])) {
|
||||||
$r = q("SELECT id FROM unique_contacts WHERE name='%s'", dbesc($_GET["q"]));
|
$r = q("SELECT id FROM `unique_contacts` WHERE `name`='%s'", dbesc($_GET["q"]));
|
||||||
if (!count($r))
|
if (!count($r))
|
||||||
$r = q("SELECT id FROM unique_contacts WHERE nick='%s'", dbesc($_GET["q"]));
|
$r = q("SELECT `id` FROM `unique_contacts` WHERE `nick`='%s'", dbesc($_GET["q"]));
|
||||||
|
|
||||||
if (count($r)) {
|
if (count($r)) {
|
||||||
foreach ($r AS $user) {
|
foreach ($r AS $user) {
|
||||||
|
@ -2170,7 +2189,7 @@
|
||||||
intval(api_user()),
|
intval(api_user()),
|
||||||
intval($in_reply_to_status_id));
|
intval($in_reply_to_status_id));
|
||||||
if ($r) {
|
if ($r) {
|
||||||
$r = q("SELECT * FROM unique_contacts WHERE `url` = '%s'", dbesc(normalise_link($r[0]['author-link'])));
|
$r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($r[0]['author-link'])));
|
||||||
|
|
||||||
if ($r) {
|
if ($r) {
|
||||||
if ($r[0]['nick'] == "")
|
if ($r[0]['nick'] == "")
|
||||||
|
@ -2429,7 +2448,7 @@
|
||||||
|
|
||||||
$stringify_ids = (x($_REQUEST,'stringify_ids')?$_REQUEST['stringify_ids']:false);
|
$stringify_ids = (x($_REQUEST,'stringify_ids')?$_REQUEST['stringify_ids']:false);
|
||||||
|
|
||||||
$r = q("SELECT unique_contacts.id FROM contact, unique_contacts WHERE contact.nurl = unique_contacts.url AND `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra",
|
$r = q("SELECT `unique_contact`.`id` FROM contact, `unique_contacts` WHERE contact.nurl = unique_contacts.url AND `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra",
|
||||||
intval(api_user())
|
intval(api_user())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -2831,15 +2850,29 @@ function api_share_as_retweet(&$item) {
|
||||||
|
|
||||||
function api_get_nick($profile) {
|
function api_get_nick($profile) {
|
||||||
/* To-Do:
|
/* To-Do:
|
||||||
- remove trailing jung from profile url
|
- remove trailing junk from profile url
|
||||||
- pump.io check has to check the website
|
- pump.io check has to check the website
|
||||||
*/
|
*/
|
||||||
|
|
||||||
$nick = "";
|
$nick = "";
|
||||||
|
|
||||||
|
$r = q("SELECT `nick` FROM `gcontact` WHERE `nurl` = '%s'",
|
||||||
|
dbesc(normalise_link($profile)));
|
||||||
|
if ($r)
|
||||||
|
$nick = $r[0]["nick"];
|
||||||
|
|
||||||
|
if (!$nick == "") {
|
||||||
|
$r = q("SELECT `nick` FROM `contact` WHERE `uid` = 0 AND `nurl` = '%s'",
|
||||||
|
dbesc(normalise_link($profile)));
|
||||||
|
if ($r)
|
||||||
|
$nick = $r[0]["nick"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$nick == "") {
|
||||||
$friendica = preg_replace("=https?://(.*)/profile/(.*)=ism", "$2", $profile);
|
$friendica = preg_replace("=https?://(.*)/profile/(.*)=ism", "$2", $profile);
|
||||||
if ($friendica != $profile)
|
if ($friendica != $profile)
|
||||||
$nick = $friendica;
|
$nick = $friendica;
|
||||||
|
}
|
||||||
|
|
||||||
if (!$nick == "") {
|
if (!$nick == "") {
|
||||||
$diaspora = preg_replace("=https?://(.*)/u/(.*)=ism", "$2", $profile);
|
$diaspora = preg_replace("=https?://(.*)/u/(.*)=ism", "$2", $profile);
|
||||||
|
@ -2877,8 +2910,8 @@ function api_get_nick($profile) {
|
||||||
//}
|
//}
|
||||||
|
|
||||||
if ($nick != "") {
|
if ($nick != "") {
|
||||||
q("UPDATE unique_contacts SET nick = '%s' WHERE url = '%s'",
|
q("UPDATE `unique_contacts` SET `nick` = '%s' WHERE `nick` != '%s' AND url = '%s'",
|
||||||
dbesc($nick), dbesc(normalise_link($profile)));
|
dbesc($nick), dbesc($nick), dbesc(normalise_link($profile)));
|
||||||
return($nick);
|
return($nick);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ class exAuth
|
||||||
// ovdje provjeri je li korisnik OK
|
// ovdje provjeri je li korisnik OK
|
||||||
$sUser = str_replace(array("%20", "(a)"), array(" ", "@"), $aCommand[1]);
|
$sUser = str_replace(array("%20", "(a)"), array(" ", "@"), $aCommand[1]);
|
||||||
$this->writeDebugLog("[debug] checking isuser for ". $sUser);
|
$this->writeDebugLog("[debug] checking isuser for ". $sUser);
|
||||||
$sQuery = "select * from user where nickname='". $db->escape($sUser) ."'";
|
$sQuery = "SELECT `uid` FROM `user` WHERE `nickname`='". $db->escape($sUser) ."'";
|
||||||
$this->writeDebugLog("[debug] using query ". $sQuery);
|
$this->writeDebugLog("[debug] using query ". $sQuery);
|
||||||
if ($oResult = q($sQuery)){
|
if ($oResult = q($sQuery)){
|
||||||
if ($oResult) {
|
if ($oResult) {
|
||||||
|
@ -120,7 +120,7 @@ class exAuth
|
||||||
$this->writeLog("[exAuth] invalid user: ". $sUser);
|
$this->writeLog("[exAuth] invalid user: ". $sUser);
|
||||||
fwrite(STDOUT, pack("nn", 2, 0));
|
fwrite(STDOUT, pack("nn", 2, 0));
|
||||||
}
|
}
|
||||||
$oResult->close();
|
//$oResult->close();
|
||||||
} else {
|
} else {
|
||||||
$this->writeLog("[MySQL] invalid query: ". $sQuery);
|
$this->writeLog("[MySQL] invalid query: ". $sQuery);
|
||||||
fwrite(STDOUT, pack("nn", 2, 0));
|
fwrite(STDOUT, pack("nn", 2, 0));
|
||||||
|
@ -136,10 +136,14 @@ class exAuth
|
||||||
// ovdje provjeri prijavu
|
// ovdje provjeri prijavu
|
||||||
$sUser = str_replace(array("%20", "(a)"), array(" ", "@"), $aCommand[1]);
|
$sUser = str_replace(array("%20", "(a)"), array(" ", "@"), $aCommand[1]);
|
||||||
$this->writeDebugLog("[debug] doing auth for ". $sUser);
|
$this->writeDebugLog("[debug] doing auth for ". $sUser);
|
||||||
$sQuery = "select * from user where password='".hash('whirlpool',$aCommand[3])."' and nickname='". $db->escape($sUser) ."'";
|
//$sQuery = "SELECT `uid`, `password` FROM `user` WHERE `password`='".hash('whirlpool',$aCommand[3])."' AND `nickname`='". $db->escape($sUser) ."'";
|
||||||
|
$sQuery = "SELECT `uid`, `password` FROM `user` WHERE `nickname`='". $db->escape($sUser) ."'";
|
||||||
$this->writeDebugLog("[debug] using query ". $sQuery);
|
$this->writeDebugLog("[debug] using query ". $sQuery);
|
||||||
if ($oResult = q($sQuery)){
|
if ($oResult = q($sQuery)){
|
||||||
if ($oResult) {
|
$uid = $oResult[0]["uid"];
|
||||||
|
$Error = ($oResult[0]["password"] != hash('whirlpool',$aCommand[3]));
|
||||||
|
/*
|
||||||
|
if ($oResult[0]["password"] == hash('whirlpool',$aCommand[3])) {
|
||||||
// korisnik OK
|
// korisnik OK
|
||||||
$this->writeLog("[exAuth] authentificated user ". $sUser ."@". $aCommand[2]);
|
$this->writeLog("[exAuth] authentificated user ". $sUser ."@". $aCommand[2]);
|
||||||
fwrite(STDOUT, pack("nn", 2, 1));
|
fwrite(STDOUT, pack("nn", 2, 1));
|
||||||
|
@ -149,9 +153,24 @@ class exAuth
|
||||||
fwrite(STDOUT, pack("nn", 2, 0));
|
fwrite(STDOUT, pack("nn", 2, 0));
|
||||||
}
|
}
|
||||||
$oResult->close();
|
$oResult->close();
|
||||||
|
*/
|
||||||
} else {
|
} else {
|
||||||
$this->writeLog("[MySQL] invalid query: ". $sQuery);
|
$this->writeLog("[MySQL] invalid query: ". $sQuery);
|
||||||
|
$Error = true;
|
||||||
|
$uid = -1;
|
||||||
|
}
|
||||||
|
if ($Error) {
|
||||||
|
$oConfig = q("SELECT `v` FROM `pconfig` WHERE `uid`=%d AND `cat` = 'xmpp' AND `k`='password' LIMIT 1;", intval($uid));
|
||||||
|
$this->writeLog("[exAuth] got password ".$oConfig[0]["v"]);
|
||||||
|
$Error = ($aCommand[3] != $oConfig[0]["v"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($Error) {
|
||||||
|
$this->writeLog("[exAuth] authentification failed for user ". $sUser ."@". $aCommand[2]);
|
||||||
fwrite(STDOUT, pack("nn", 2, 0));
|
fwrite(STDOUT, pack("nn", 2, 0));
|
||||||
|
} else {
|
||||||
|
$this->writeLog("[exAuth] authentificated user ". $sUser ."@". $aCommand[2]);
|
||||||
|
fwrite(STDOUT, pack("nn", 2, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2,7 +2,23 @@
|
||||||
require_once("include/oembed.php");
|
require_once("include/oembed.php");
|
||||||
require_once('include/event.php');
|
require_once('include/event.php');
|
||||||
require_once('include/map.php');
|
require_once('include/map.php');
|
||||||
|
require_once('mod/proxy.php');
|
||||||
|
|
||||||
|
function bb_PictureCacheExt($matches) {
|
||||||
|
if (strpos($matches[3], "data:image/") === 0)
|
||||||
|
return ($matches[0]);
|
||||||
|
|
||||||
|
$matches[3] = proxy_url($matches[3]);
|
||||||
|
return "[img=".$matches[1]."x".$matches[2]."]".$matches[3]."[/img]";
|
||||||
|
}
|
||||||
|
|
||||||
|
function bb_PictureCache($matches) {
|
||||||
|
if (strpos($matches[1], "data:image/") === 0)
|
||||||
|
return ($matches[0]);
|
||||||
|
|
||||||
|
$matches[1] = proxy_url($matches[1]);
|
||||||
|
return "[img]".$matches[1]."[/img]";
|
||||||
|
}
|
||||||
|
|
||||||
function bb_map_coords($match) {
|
function bb_map_coords($match) {
|
||||||
// the extra space in the following line is intentional
|
// the extra space in the following line is intentional
|
||||||
|
@ -101,9 +117,9 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
|
||||||
$text = $oembed;
|
$text = $oembed;
|
||||||
else {
|
else {
|
||||||
if (($image != "") AND !strstr(strtolower($oembed), "<img "))
|
if (($image != "") AND !strstr(strtolower($oembed), "<img "))
|
||||||
$text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br />', $url, $image, $title);
|
$text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br />', $url, proxy_url($image), $title);
|
||||||
elseif (($preview != "") AND !strstr(strtolower($oembed), "<img "))
|
elseif (($preview != "") AND !strstr(strtolower($oembed), "<img "))
|
||||||
$text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br />', $url, $preview, $title);
|
$text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br />', $url, proxy_url($preview), $title);
|
||||||
|
|
||||||
$text .= $oembed;
|
$text .= $oembed;
|
||||||
|
|
||||||
|
@ -455,7 +471,7 @@ function bb_replace_images($body, $images) {
|
||||||
// We're depending on the property of 'foreach' (specified on the PHP website) that
|
// We're depending on the property of 'foreach' (specified on the PHP website) that
|
||||||
// it loops over the array starting from the first element and going sequentially
|
// it loops over the array starting from the first element and going sequentially
|
||||||
// to the last element
|
// to the last element
|
||||||
$newbody = str_replace('[$#saved_image' . $cnt . '#$]', '<img src="' . $image .'" alt="' . t('Image/photo') . '" />', $newbody);
|
$newbody = str_replace('[$#saved_image' . $cnt . '#$]', '<img src="' . proxy_url($image) .'" alt="' . t('Image/photo') . '" />', $newbody);
|
||||||
$cnt++;
|
$cnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -585,7 +601,7 @@ function bb_ShareAttributes($share, $simplehtml) {
|
||||||
default:
|
default:
|
||||||
$headline = trim($share[1]).'<div class="shared_header">';
|
$headline = trim($share[1]).'<div class="shared_header">';
|
||||||
if ($avatar != "")
|
if ($avatar != "")
|
||||||
$headline .= '<img src="'.$avatar.'" height="32" width="32" >';
|
$headline .= '<img src="'.proxy_url($avatar, false, PROXY_SIZE_MICRO).'" height="32" width="32" >';
|
||||||
|
|
||||||
$headline .= sprintf(t('<span><a href="%s" target="_blank">%s</a> wrote the following <a href="%s" target="_blank">post</a>'.$reldate.':</span>'), $profile, $author, $link);
|
$headline .= sprintf(t('<span><a href="%s" target="_blank">%s</a> wrote the following <a href="%s" target="_blank">post</a>'.$reldate.':</span>'), $profile, $author, $link);
|
||||||
$headline .= "</div>";
|
$headline .= "</div>";
|
||||||
|
@ -1102,13 +1118,17 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal
|
||||||
"<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
|
"<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
|
||||||
$Text);
|
$Text);
|
||||||
|
|
||||||
|
|
||||||
// [img=widthxheight]image source[/img]
|
// [img=widthxheight]image source[/img]
|
||||||
//$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text);
|
$Text = preg_replace_callback("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", 'bb_PictureCacheExt', $Text);
|
||||||
|
|
||||||
$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="width: $1px;" >', $Text);
|
$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="width: $1px;" >', $Text);
|
||||||
$Text = preg_replace("/\[zmg\=([0-9]*)x([0-9]*)\](.*?)\[\/zmg\]/ism", '<img class="zrl" src="$3" style="width: $1px;" >', $Text);
|
$Text = preg_replace("/\[zmg\=([0-9]*)x([0-9]*)\](.*?)\[\/zmg\]/ism", '<img class="zrl" src="$3" style="width: $1px;" >', $Text);
|
||||||
|
|
||||||
// Images
|
// Images
|
||||||
// [img]pathtoimage[/img]
|
// [img]pathtoimage[/img]
|
||||||
|
$Text = preg_replace_callback("/\[img\](.*?)\[\/img\]/ism", 'bb_PictureCache', $Text);
|
||||||
|
|
||||||
$Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
|
$Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
|
||||||
$Text = preg_replace("/\[zmg\](.*?)\[\/zmg\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
|
$Text = preg_replace("/\[zmg\](.*?)\[\/zmg\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
|
||||||
|
|
||||||
|
@ -1190,7 +1210,7 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal
|
||||||
// start which is always required). Allow desc with a missing summary for compatibility.
|
// start which is always required). Allow desc with a missing summary for compatibility.
|
||||||
|
|
||||||
if((x($ev,'desc') || x($ev,'summary')) && x($ev,'start')) {
|
if((x($ev,'desc') || x($ev,'summary')) && x($ev,'start')) {
|
||||||
$sub = format_event_html($ev);
|
$sub = format_event_html($ev, $simplehtml);
|
||||||
|
|
||||||
$Text = preg_replace("/\[event\-summary\](.*?)\[\/event\-summary\]/ism",'',$Text);
|
$Text = preg_replace("/\[event\-summary\](.*?)\[\/event\-summary\]/ism",'',$Text);
|
||||||
$Text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/ism",'',$Text);
|
$Text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/ism",'',$Text);
|
||||||
|
|
|
@ -88,7 +88,7 @@ function network_to_name($s, $profile = "") {
|
||||||
NETWORK_PUMPIO => t('pump.io'),
|
NETWORK_PUMPIO => t('pump.io'),
|
||||||
NETWORK_TWITTER => t('Twitter'),
|
NETWORK_TWITTER => t('Twitter'),
|
||||||
NETWORK_DIASPORA2 => t('Diaspora Connector'),
|
NETWORK_DIASPORA2 => t('Diaspora Connector'),
|
||||||
NETWORK_STATUSNET => t('Statusnet'),
|
NETWORK_STATUSNET => t('GNU Social'),
|
||||||
NETWORK_APPNET => t('App.net')
|
NETWORK_APPNET => t('App.net')
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,11 @@ function localize_item(&$item){
|
||||||
$item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']);
|
$item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']);
|
||||||
|
|
||||||
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
|
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
|
||||||
if (activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE)){
|
if (activity_match($item['verb'],ACTIVITY_LIKE)
|
||||||
|
|| activity_match($item['verb'],ACTIVITY_DISLIKE)
|
||||||
|
|| activity_match($item['verb'],ACTIVITY_ATTEND)
|
||||||
|
|| activity_match($item['verb'],ACTIVITY_ATTENDNO)
|
||||||
|
|| activity_match($item['verb'],ACTIVITY_ATTENDMAYBE)){
|
||||||
|
|
||||||
$r = q("SELECT * from `item`,`contact` WHERE
|
$r = q("SELECT * from `item`,`contact` WHERE
|
||||||
`item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
|
`item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
|
||||||
|
@ -139,6 +143,15 @@ function localize_item(&$item){
|
||||||
elseif(activity_match($item['verb'],ACTIVITY_DISLIKE)) {
|
elseif(activity_match($item['verb'],ACTIVITY_DISLIKE)) {
|
||||||
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
|
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
|
||||||
}
|
}
|
||||||
|
elseif(activity_match($item['verb'],ACTIVITY_ATTEND)) {
|
||||||
|
$bodyverb = t('%1$s attends %2$s\'s %3$s');
|
||||||
|
}
|
||||||
|
elseif(activity_match($item['verb'],ACTIVITY_ATTENDNO)) {
|
||||||
|
$bodyverb = t('%1$s doesn\'t attend %2$s\'s %3$s');
|
||||||
|
}
|
||||||
|
elseif(activity_match($item['verb'],ACTIVITY_ATTENDMAYBE)) {
|
||||||
|
$bodyverb = t('%1$s attends maybe %2$s\'s %3$s');
|
||||||
|
}
|
||||||
$item['body'] = sprintf($bodyverb, $author, $objauthor, $plink);
|
$item['body'] = sprintf($bodyverb, $author, $objauthor, $plink);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -341,8 +354,15 @@ function count_descendants($item) {
|
||||||
|
|
||||||
function visible_activity($item) {
|
function visible_activity($item) {
|
||||||
|
|
||||||
if(activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE))
|
// likes (etc.) can apply to other things besides posts. Check if they are post children,
|
||||||
|
// in which case we handle them specially
|
||||||
|
|
||||||
|
$hidden_activities = array(ACTIVITY_LIKE, ACTIVITY_DISLIKE, ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE);
|
||||||
|
foreach($hidden_activities as $act) {
|
||||||
|
if(activity_match($item['verb'],$act)) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(activity_match($item['verb'],ACTIVITY_FOLLOW) && $item['object-type'] === ACTIVITY_OBJ_NOTE) {
|
if(activity_match($item['verb'],ACTIVITY_FOLLOW) && $item['object-type'] === ACTIVITY_OBJ_NOTE) {
|
||||||
if(! (($item['self']) && ($item['uid'] == local_user()))) {
|
if(! (($item['self']) && ($item['uid'] == local_user()))) {
|
||||||
|
@ -484,8 +504,10 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
||||||
$cmnt_tpl = get_markup_template('comment_item.tpl');
|
$cmnt_tpl = get_markup_template('comment_item.tpl');
|
||||||
$hide_comments_tpl = get_markup_template('hide_comments.tpl');
|
$hide_comments_tpl = get_markup_template('hide_comments.tpl');
|
||||||
|
|
||||||
$alike = array();
|
$conv_responses = array(
|
||||||
$dlike = array();
|
'like' => array('title' => t('Likes','title')), 'dislike' => array('title' => t('Dislikes','title')),
|
||||||
|
'attendyes' => array('title' => t('Attending','title')), 'attendno' => array('title' => t('Not attending','title')), 'attendmaybe' => array('title' => t('Might attend','title'))
|
||||||
|
);
|
||||||
|
|
||||||
// array with html for each thread (parent+comments)
|
// array with html for each thread (parent+comments)
|
||||||
$threads = array();
|
$threads = array();
|
||||||
|
@ -656,7 +678,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
||||||
'name' => $profile_name_e,
|
'name' => $profile_name_e,
|
||||||
'sparkle' => $sparkle,
|
'sparkle' => $sparkle,
|
||||||
'lock' => $lock,
|
'lock' => $lock,
|
||||||
'thumb' => proxy_url($profile_avatar),
|
'thumb' => proxy_url($profile_avatar, false, PROXY_SIZE_THUMB),
|
||||||
'title' => $item['title_e'],
|
'title' => $item['title_e'],
|
||||||
'body' => $body_e,
|
'body' => $body_e,
|
||||||
'tags' => $tags_e,
|
'tags' => $tags_e,
|
||||||
|
@ -675,7 +697,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
||||||
'indent' => '',
|
'indent' => '',
|
||||||
'owner_name' => $owner_name_e,
|
'owner_name' => $owner_name_e,
|
||||||
'owner_url' => $owner_url,
|
'owner_url' => $owner_url,
|
||||||
'owner_photo' => proxy_url($owner_photo),
|
'owner_photo' => proxy_url($owner_photo, false, PROXY_SIZE_THUMB),
|
||||||
'plink' => get_plink($item),
|
'plink' => get_plink($item),
|
||||||
'edpost' => false,
|
'edpost' => false,
|
||||||
'isstarred' => $isstarred,
|
'isstarred' => $isstarred,
|
||||||
|
@ -734,8 +756,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
||||||
|
|
||||||
|
|
||||||
// Can we put this after the visibility check?
|
// Can we put this after the visibility check?
|
||||||
like_puller($a,$item,$alike,'like');
|
builtin_activity_puller($item, $conv_responses);
|
||||||
like_puller($a,$item,$dlike,'dislike');
|
|
||||||
|
|
||||||
// Only add what is visible
|
// Only add what is visible
|
||||||
if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
|
if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
|
||||||
|
@ -755,7 +776,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$threads = $conv->get_template_data($alike, $dlike);
|
$threads = $conv->get_template_data($conv_responses);
|
||||||
|
|
||||||
if(!$threads) {
|
if(!$threads) {
|
||||||
logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG);
|
logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG);
|
||||||
|
@ -792,10 +813,16 @@ function best_link_url($item,&$sparkle,$ssl_state = false) {
|
||||||
if($a->contacts[$clean_url]['network'] === NETWORK_DFRN) {
|
if($a->contacts[$clean_url]['network'] === NETWORK_DFRN) {
|
||||||
$best_url = $a->get_baseurl($ssl_state) . '/redir/' . $a->contacts[$clean_url]['id'];
|
$best_url = $a->get_baseurl($ssl_state) . '/redir/' . $a->contacts[$clean_url]['id'];
|
||||||
$sparkle = true;
|
$sparkle = true;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
$best_url = $a->contacts[$clean_url]['url'];
|
$best_url = $a->contacts[$clean_url]['url'];
|
||||||
}
|
}
|
||||||
|
} elseif (local_user()) {
|
||||||
|
$r = q("SELECT `id`, `network` FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `nurl` = '%s'",
|
||||||
|
dbesc(NETWORK_DFRN), intval(local_user()), dbesc(normalise_link($clean_url)));
|
||||||
|
if ($r) {
|
||||||
|
$best_url = $a->get_baseurl($ssl_state).'/redir/'.$r[0]['id'];
|
||||||
|
$sparkle = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(! $best_url) {
|
if(! $best_url) {
|
||||||
if(strlen($item['author-link']))
|
if(strlen($item['author-link']))
|
||||||
|
@ -848,8 +875,16 @@ function item_photo_menu($item){
|
||||||
$profile_link = zrl($profile_link);
|
$profile_link = zrl($profile_link);
|
||||||
if(local_user() && local_user() == $item['uid'] && link_compare($item['url'],$item['author-link'])) {
|
if(local_user() && local_user() == $item['uid'] && link_compare($item['url'],$item['author-link'])) {
|
||||||
$cid = $item['contact-id'];
|
$cid = $item['contact-id'];
|
||||||
}
|
} else {
|
||||||
else {
|
$r = q("SELECT `id`, `network` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' ORDER BY `uid` DESC LIMIT 1",
|
||||||
|
intval(local_user()), dbesc(normalise_link($item['author-link'])));
|
||||||
|
if ($r) {
|
||||||
|
$cid = $r[0]["id"];
|
||||||
|
|
||||||
|
if ($r[0]["network"] == NETWORK_DIASPORA)
|
||||||
|
$pm_url = $a->get_baseurl($ssl_state) . '/message/new/' . $cid;
|
||||||
|
|
||||||
|
} else
|
||||||
$cid = 0;
|
$cid = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -870,6 +905,7 @@ function item_photo_menu($item){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (local_user()) {
|
||||||
$menu = Array(
|
$menu = Array(
|
||||||
t("Follow Thread") => $sub_link,
|
t("Follow Thread") => $sub_link,
|
||||||
t("View Status") => $status_link,
|
t("View Status") => $status_link,
|
||||||
|
@ -877,10 +913,17 @@ function item_photo_menu($item){
|
||||||
t("View Photos") => $photos_link,
|
t("View Photos") => $photos_link,
|
||||||
t("Network Posts") => $posts_link,
|
t("Network Posts") => $posts_link,
|
||||||
t("Edit Contact") => $contact_url,
|
t("Edit Contact") => $contact_url,
|
||||||
t("Send PM") => $pm_url,
|
t("Send PM") => $pm_url
|
||||||
t("Poke") => $poke_link
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if ($a->contacts[$clean_url]['network'] === NETWORK_DFRN)
|
||||||
|
$menu[t("Poke")] = $poke_link;
|
||||||
|
|
||||||
|
if ((($cid == 0) OR ($a->contacts[$clean_url]['rel'] == CONTACT_IS_FOLLOWER)) AND
|
||||||
|
in_array($item['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA)))
|
||||||
|
$menu[t("Connect/Follow")] = $a->get_baseurl($ssl_state)."/follow?url=".urlencode($item['author-link']);
|
||||||
|
} else
|
||||||
|
$menu = array(t("View Profile") => $item['author-link']);
|
||||||
|
|
||||||
$args = array('item' => $item, 'menu' => $menu);
|
$args = array('item' => $item, 'menu' => $menu);
|
||||||
|
|
||||||
|
@ -899,65 +942,114 @@ function item_photo_menu($item){
|
||||||
return $o;
|
return $o;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
if(! function_exists('like_puller')) {
|
/**
|
||||||
function like_puller($a,$item,&$arr,$mode) {
|
* @brief Checks item to see if it is one of the builtin activities (like/dislike, event attendance, consensus items, etc.)
|
||||||
|
* Increments the count of each matching activity and adds a link to the author as needed.
|
||||||
|
*
|
||||||
|
* @param array $a (not used)
|
||||||
|
* @param array $item
|
||||||
|
* @param array &$conv_responses (already created with builtin activity structure)
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
if(! function_exists(builtin_activity_puller)) {
|
||||||
|
function builtin_activity_puller($item, &$conv_responses) {
|
||||||
|
foreach($conv_responses as $mode => $v) {
|
||||||
$url = '';
|
$url = '';
|
||||||
$sparkle = '';
|
$sparkle = '';
|
||||||
$verb = (($mode === 'like') ? ACTIVITY_LIKE : ACTIVITY_DISLIKE);
|
|
||||||
|
switch($mode) {
|
||||||
|
case 'like':
|
||||||
|
$verb = ACTIVITY_LIKE;
|
||||||
|
break;
|
||||||
|
case 'dislike':
|
||||||
|
$verb = ACTIVITY_DISLIKE;
|
||||||
|
break;
|
||||||
|
case 'attendyes':
|
||||||
|
$verb = ACTIVITY_ATTEND;
|
||||||
|
break;
|
||||||
|
case 'attendno':
|
||||||
|
$verb = ACTIVITY_ATTENDNO;
|
||||||
|
break;
|
||||||
|
case 'attendmaybe':
|
||||||
|
$verb = ACTIVITY_ATTENDMAYBE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if((activity_match($item['verb'], $verb)) && ($item['id'] != $item['parent'])) {
|
if((activity_match($item['verb'], $verb)) && ($item['id'] != $item['parent'])) {
|
||||||
$url = $item['author-link'];
|
$url = $item['author-link'];
|
||||||
if((local_user()) && (local_user() == $item['uid']) && ($item['network'] === NETWORK_DFRN) && (! $item['self']) && (link_compare($item['author-link'],$item['url']))) {
|
if((local_user()) && (local_user() == $item['uid']) && ($item['network'] === NETWORK_DFRN) && (! $item['self']) && (link_compare($item['author-link'],$item['url']))) {
|
||||||
$url = $a->get_baseurl(true) . '/redir/' . $item['contact-id'];
|
$url = z_root(true) . '/redir/' . $item['contact-id'];
|
||||||
$sparkle = ' class="sparkle" ';
|
$sparkle = ' class="sparkle" ';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
$url = zrl($url);
|
$url = zrl($url);
|
||||||
|
|
||||||
|
$url = '<a href="'. $url . '"'. $sparkle .'>' . htmlentities($item['author-name']) . '</a>';
|
||||||
|
|
||||||
if(! $item['thr-parent'])
|
if(! $item['thr-parent'])
|
||||||
$item['thr-parent'] = $item['parent-uri'];
|
$item['thr-parent'] = $item['parent-uri'];
|
||||||
|
|
||||||
if(! ((isset($arr[$item['thr-parent'] . '-l'])) && (is_array($arr[$item['thr-parent'] . '-l']))))
|
if(! ((isset($conv_responses[$mode][$item['thr-parent'] . '-l']))
|
||||||
$arr[$item['thr-parent'] . '-l'] = array();
|
&& (is_array($conv_responses[$mode][$item['thr-parent'] . '-l']))))
|
||||||
if(! isset($arr[$item['thr-parent']]))
|
$conv_responses[$mode][$item['thr-parent'] . '-l'] = array();
|
||||||
$arr[$item['thr-parent']] = 1;
|
|
||||||
|
// only list each unique author once
|
||||||
|
if(in_array($url,$conv_responses[$mode][$item['thr-parent'] . '-l']))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(! isset($conv_responses[$mode][$item['thr-parent']]))
|
||||||
|
$conv_responses[$mode][$item['thr-parent']] = 1;
|
||||||
else
|
else
|
||||||
$arr[$item['thr-parent']] ++;
|
$conv_responses[$mode][$item['thr-parent']] ++;
|
||||||
$arr[$item['thr-parent'] . '-l'][] = '<a href="'. $url . '"'. $sparkle .'>' . $item['author-name'] . '</a>';
|
|
||||||
}
|
$conv_responses[$mode][$item['thr-parent'] . '-l'][] = $url;
|
||||||
|
|
||||||
|
// there can only be one activity verb per item so if we found anything, we can stop looking
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
|
|
||||||
// Format the like/dislike text for a profile item
|
// Format the vote text for a profile item
|
||||||
// $cnt = number of people who like/dislike the item
|
// $cnt = number of people who vote the item
|
||||||
// $arr = array of pre-linked names of likers/dislikers
|
// $arr = array of pre-linked names of likers/dislikers
|
||||||
// $type = one of 'like, 'dislike'
|
// $type = one of 'like, 'dislike', 'attendyes', 'attendno', 'attendmaybe'
|
||||||
// $id = item id
|
// $id = item id
|
||||||
// returns formatted text
|
// returns formatted text
|
||||||
|
|
||||||
if(! function_exists('format_like')) {
|
if(! function_exists('format_like')) {
|
||||||
function format_like($cnt,$arr,$type,$id) {
|
function format_like($cnt,$arr,$type,$id) {
|
||||||
$o = '';
|
$o = '';
|
||||||
if($cnt == 1)
|
$expanded = '';
|
||||||
$o .= (($type === 'like') ? sprintf( t('%s likes this.'), $arr[0]) : sprintf( t('%s doesn\'t like this.'), $arr[0])) . EOL ;
|
|
||||||
else {
|
if($cnt == 1) {
|
||||||
$spanatts = "class=\"fakelink\" onclick=\"openClose('{$type}list-$id');\"";
|
$likers = $arr[0];
|
||||||
|
|
||||||
|
// Phrase if there is only one liker. In other cases it will be uses for the expanded
|
||||||
|
// list which show all likers
|
||||||
switch($type) {
|
switch($type) {
|
||||||
case 'like' :
|
case 'like' :
|
||||||
$phrase = sprintf( t('<span %1$s>%2$d people</span> like this'), $spanatts, $cnt);
|
$phrase = sprintf( t('%s likes this.'), $likers);
|
||||||
break;
|
break;
|
||||||
case 'dislike' :
|
case 'dislike' :
|
||||||
$phrase = sprintf( t('<span %1$s>%2$d people</span> don\'t like this'), $spanatts, $cnt);
|
$phrase = sprintf( t('%s doesn\'t like this.'), $likers);
|
||||||
|
break;
|
||||||
|
case 'attendyes' :
|
||||||
|
$phrase = sprintf( t('%s attends.'), $likers);
|
||||||
|
break;
|
||||||
|
case 'attendno' :
|
||||||
|
$phrase = sprintf( t('%s doesn\'t attend.'), $likers);
|
||||||
|
break;
|
||||||
|
case 'attendmaybe' :
|
||||||
|
$phrase = sprintf( t('%s attends maybe.'), $likers);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$phrase .= EOL ;
|
}
|
||||||
$o .= replace_macros(get_markup_template('voting_fakelink.tpl'), array(
|
|
||||||
'$phrase' => $phrase,
|
|
||||||
'$type' => $type,
|
|
||||||
'$id' => $id
|
|
||||||
));
|
|
||||||
|
|
||||||
|
if($cnt > 1) {
|
||||||
$total = count($arr);
|
$total = count($arr);
|
||||||
if($total >= MAX_LIKERS)
|
if($total >= MAX_LIKERS)
|
||||||
$arr = array_slice($arr, 0, MAX_LIKERS - 1);
|
$arr = array_slice($arr, 0, MAX_LIKERS - 1);
|
||||||
|
@ -970,9 +1062,45 @@ function format_like($cnt,$arr,$type,$id) {
|
||||||
$str = implode(', ', $arr);
|
$str = implode(', ', $arr);
|
||||||
$str .= sprintf( t(', and %d other people'), $total - MAX_LIKERS );
|
$str .= sprintf( t(', and %d other people'), $total - MAX_LIKERS );
|
||||||
}
|
}
|
||||||
$str = (($type === 'like') ? sprintf( t('%s like this.'), $str) : sprintf( t('%s don\'t like this.'), $str));
|
|
||||||
$o .= "\t" . '<div class="wall-item-' . $type . '-expanded" id="' . $type . 'list-' . $id . '" style="display: none;" >' . $str . '</div>';
|
$likers = $str;
|
||||||
|
|
||||||
|
$spanatts = "class=\"fakelink\" onclick=\"openClose('{$type}list-$id');\"";
|
||||||
|
|
||||||
|
switch($type) {
|
||||||
|
case 'like':
|
||||||
|
$phrase = sprintf( t('<span %1$s>%2$d people</span> like this'), $spanatts, $cnt);
|
||||||
|
$explikers = sprintf( t('%s like this.'), $likers);
|
||||||
|
break;
|
||||||
|
case 'dislike':
|
||||||
|
$phrase = sprintf( t('<span %1$s>%2$d people</span> don\'t like this'), $spanatts, $cnt);
|
||||||
|
$explikers = sprintf( t('%s don\'t like this.'), $likers);
|
||||||
|
break;
|
||||||
|
case 'attendyes':
|
||||||
|
$phrase = sprintf( t('<span %1$s>%2$d people</span> attend'), $spanatts, $cnt);
|
||||||
|
$explikers = sprintf( t('%s attend.'), $likers);
|
||||||
|
break;
|
||||||
|
case 'attendno':
|
||||||
|
$phrase = sprintf( t('<span %1$s>%2$d people</span> don\'t attend'), $spanatts, $cnt);
|
||||||
|
$explikers = sprintf( t('%s don\'t attend.'), $likers);
|
||||||
|
break;
|
||||||
|
case 'attendmaybe':
|
||||||
|
$phrase = sprintf( t('<span %1$s>%2$d people</span> anttend maybe'), $spanatts, $cnt);
|
||||||
|
$explikers = sprintf( t('%s anttend maybe.'), $likers);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$expanded .= "\t" . '<div class="wall-item-' . $type . '-expanded" id="' . $type . 'list-' . $id . '" style="display: none;" >' . $explikers . EOL . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$phrase .= EOL ;
|
||||||
|
$o .= replace_macros(get_markup_template('voting_fakelink.tpl'), array(
|
||||||
|
'$phrase' => $phrase,
|
||||||
|
'$type' => $type,
|
||||||
|
'$id' => $id
|
||||||
|
));
|
||||||
|
$o .= $expanded;
|
||||||
|
|
||||||
return $o;
|
return $o;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
@ -1163,6 +1291,15 @@ function conv_sort($arr,$order) {
|
||||||
|
|
||||||
$parents = array();
|
$parents = array();
|
||||||
$children = array();
|
$children = array();
|
||||||
|
$newarr = array();
|
||||||
|
|
||||||
|
// This is a preparation for having two different items with the same uri in one thread
|
||||||
|
// This will otherwise lead to an endless loop.
|
||||||
|
foreach($arr as $x)
|
||||||
|
if (!isset($newarr[$x['uri']]))
|
||||||
|
$newarr[$x['uri']] = $x;
|
||||||
|
|
||||||
|
$arr = $newarr;
|
||||||
|
|
||||||
foreach($arr as $x)
|
foreach($arr as $x)
|
||||||
if($x['id'] == $x['parent'])
|
if($x['id'] == $x['parent'])
|
||||||
|
@ -1236,3 +1373,51 @@ function render_location_dummy($item) {
|
||||||
if ($item['coord'] != "")
|
if ($item['coord'] != "")
|
||||||
return $item['coord'];
|
return $item['coord'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function get_responses($conv_responses,$response_verbs,$ob,$item) {
|
||||||
|
$ret = array();
|
||||||
|
foreach($response_verbs as $v) {
|
||||||
|
$ret[$v] = array();
|
||||||
|
$ret[$v]['count'] = ((x($conv_responses[$v],$item['uri'])) ? $conv_responses[$v][$item['uri']] : '');
|
||||||
|
$ret[$v]['list'] = ((x($conv_responses[$v],$item['uri'])) ? $conv_responses[$v][$item['uri'] . '-l'] : '');
|
||||||
|
if(count($ret[$v]['list']) > MAX_LIKERS) {
|
||||||
|
$ret[$v]['list_part'] = array_slice($ret[$v]['list'], 0, MAX_LIKERS);
|
||||||
|
array_push($ret[$v]['list_part'], '<a href="#" data-toggle="modal" data-target="#' . $v . 'Modal-'
|
||||||
|
. (($ob) ? $ob->get_id() : $item['id']) . '"><b>' . t('View all') . '</b></a>');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$ret[$v]['list_part'] = '';
|
||||||
|
}
|
||||||
|
$ret[$v]['button'] = get_response_button_text($v,$ret[$v]['count']);
|
||||||
|
$ret[$v]['title'] = $conv_responses[$v]['title'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$count = 0;
|
||||||
|
foreach($ret as $key) {
|
||||||
|
if ($key['count'] == true)
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
$ret['count'] = $count;
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_response_button_text($v,$count) {
|
||||||
|
switch($v) {
|
||||||
|
case 'like':
|
||||||
|
return tt('Like','Likes',$count,'noun');
|
||||||
|
break;
|
||||||
|
case 'dislike':
|
||||||
|
return tt('Dislike','Dislikes',$count,'noun');
|
||||||
|
break;
|
||||||
|
case 'attendyes':
|
||||||
|
return tt('Attending','Attending',$count,'noun');
|
||||||
|
break;
|
||||||
|
case 'attendno':
|
||||||
|
return tt('Not Attending','Not Attending',$count,'noun');
|
||||||
|
break;
|
||||||
|
case 'attendmaybe':
|
||||||
|
return tt('Undecided','Undecided',$count,'noun');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
342
include/cron.php
Normal file
342
include/cron.php
Normal file
|
@ -0,0 +1,342 @@
|
||||||
|
<?php
|
||||||
|
if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) {
|
||||||
|
$directory = dirname($_SERVER["argv"][0]);
|
||||||
|
|
||||||
|
if (substr($directory, 0, 1) != "/")
|
||||||
|
$directory = $_SERVER["PWD"]."/".$directory;
|
||||||
|
|
||||||
|
$directory = realpath($directory."/..");
|
||||||
|
|
||||||
|
chdir($directory);
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once("boot.php");
|
||||||
|
|
||||||
|
|
||||||
|
function cron_run(&$argv, &$argc){
|
||||||
|
global $a, $db;
|
||||||
|
|
||||||
|
if(is_null($a)) {
|
||||||
|
$a = new App;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_null($db)) {
|
||||||
|
@include(".htconfig.php");
|
||||||
|
require_once("include/dba.php");
|
||||||
|
$db = new dba($db_host, $db_user, $db_pass, $db_data);
|
||||||
|
unset($db_host, $db_user, $db_pass, $db_data);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
require_once('include/session.php');
|
||||||
|
require_once('include/datetime.php');
|
||||||
|
require_once('library/simplepie/simplepie.inc');
|
||||||
|
require_once('include/items.php');
|
||||||
|
require_once('include/Contact.php');
|
||||||
|
require_once('include/email.php');
|
||||||
|
require_once('include/socgraph.php');
|
||||||
|
require_once('include/pidfile.php');
|
||||||
|
require_once('mod/nodeinfo.php');
|
||||||
|
|
||||||
|
load_config('config');
|
||||||
|
load_config('system');
|
||||||
|
|
||||||
|
$maxsysload = intval(get_config('system','maxloadavg'));
|
||||||
|
if($maxsysload < 1)
|
||||||
|
$maxsysload = 50;
|
||||||
|
if(function_exists('sys_getloadavg')) {
|
||||||
|
$load = sys_getloadavg();
|
||||||
|
if(intval($load[0]) > $maxsysload) {
|
||||||
|
logger('system: load ' . $load[0] . ' too high. cron deferred to next scheduled run.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$last = get_config('system','last_cron');
|
||||||
|
|
||||||
|
$poll_interval = intval(get_config('system','cron_interval'));
|
||||||
|
if(! $poll_interval)
|
||||||
|
$poll_interval = 10;
|
||||||
|
|
||||||
|
if($last) {
|
||||||
|
$next = $last + ($poll_interval * 60);
|
||||||
|
if($next > time()) {
|
||||||
|
logger('cron intervall not reached');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$lockpath = get_lockpath();
|
||||||
|
if ($lockpath != '') {
|
||||||
|
$pidfile = new pidfile($lockpath, 'cron');
|
||||||
|
if($pidfile->is_already_running()) {
|
||||||
|
logger("cron: Already running");
|
||||||
|
if ($pidfile->running_time() > 9*60) {
|
||||||
|
$pidfile->kill();
|
||||||
|
logger("cron: killed stale process");
|
||||||
|
// Calling a new instance
|
||||||
|
proc_run('php','include/cron.php');
|
||||||
|
}
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$a->set_baseurl(get_config('system','url'));
|
||||||
|
|
||||||
|
load_hooks();
|
||||||
|
|
||||||
|
logger('cron: start');
|
||||||
|
|
||||||
|
// run queue delivery process in the background
|
||||||
|
|
||||||
|
proc_run('php',"include/queue.php");
|
||||||
|
|
||||||
|
// run diaspora photo queue process in the background
|
||||||
|
|
||||||
|
proc_run('php',"include/dsprphotoq.php");
|
||||||
|
|
||||||
|
// run the process to discover global contacts in the background
|
||||||
|
|
||||||
|
proc_run('php',"include/discover_poco.php");
|
||||||
|
|
||||||
|
// run the process to update locally stored global contacts in the background
|
||||||
|
|
||||||
|
proc_run('php',"include/discover_poco.php", "checkcontact");
|
||||||
|
|
||||||
|
// expire any expired accounts
|
||||||
|
|
||||||
|
q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0
|
||||||
|
AND `account_expires_on` != '0000-00-00 00:00:00'
|
||||||
|
AND `account_expires_on` < UTC_TIMESTAMP() ");
|
||||||
|
|
||||||
|
// delete user and contact records for recently removed accounts
|
||||||
|
|
||||||
|
$r = q("SELECT * FROM `user` WHERE `account_removed` = 1 AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
|
||||||
|
if ($r) {
|
||||||
|
foreach($r as $user) {
|
||||||
|
q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid']));
|
||||||
|
q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$abandon_days = intval(get_config('system','account_abandon_days'));
|
||||||
|
if($abandon_days < 1)
|
||||||
|
$abandon_days = 0;
|
||||||
|
|
||||||
|
// Check OStatus conversations
|
||||||
|
// Check only conversations with mentions (for a longer time)
|
||||||
|
check_conversations(true);
|
||||||
|
|
||||||
|
// Check every conversation
|
||||||
|
check_conversations(false);
|
||||||
|
|
||||||
|
// Follow your friends from your legacy OStatus account
|
||||||
|
// Doesn't work
|
||||||
|
// ostatus_check_follow_friends();
|
||||||
|
|
||||||
|
// update nodeinfo data
|
||||||
|
nodeinfo_cron();
|
||||||
|
|
||||||
|
// To-Do: Regenerate usage statistics
|
||||||
|
// q("ANALYZE TABLE `item`");
|
||||||
|
|
||||||
|
// once daily run birthday_updates and then expire in background
|
||||||
|
|
||||||
|
$d1 = get_config('system','last_expire_day');
|
||||||
|
$d2 = intval(datetime_convert('UTC','UTC','now','d'));
|
||||||
|
|
||||||
|
if($d2 != intval($d1)) {
|
||||||
|
|
||||||
|
update_contact_birthdays();
|
||||||
|
|
||||||
|
proc_run('php',"include/discover_poco.php", "suggestions");
|
||||||
|
|
||||||
|
set_config('system','last_expire_day',$d2);
|
||||||
|
|
||||||
|
proc_run('php','include/expire.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$last = get_config('system','cache_last_cleared');
|
||||||
|
|
||||||
|
if($last) {
|
||||||
|
$next = $last + (3600); // Once per hour
|
||||||
|
$clear_cache = ($next <= time());
|
||||||
|
} else
|
||||||
|
$clear_cache = true;
|
||||||
|
|
||||||
|
if ($clear_cache) {
|
||||||
|
// clear old cache
|
||||||
|
Cache::clear();
|
||||||
|
|
||||||
|
// clear old item cache files
|
||||||
|
clear_cache();
|
||||||
|
|
||||||
|
// clear cache for photos
|
||||||
|
clear_cache($a->get_basepath(), $a->get_basepath()."/photo");
|
||||||
|
|
||||||
|
// clear smarty cache
|
||||||
|
clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled");
|
||||||
|
|
||||||
|
// clear cache for image proxy
|
||||||
|
if (!get_config("system", "proxy_disabled")) {
|
||||||
|
clear_cache($a->get_basepath(), $a->get_basepath()."/proxy");
|
||||||
|
|
||||||
|
$cachetime = get_config('system','proxy_cache_time');
|
||||||
|
if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME;
|
||||||
|
|
||||||
|
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
|
||||||
|
}
|
||||||
|
|
||||||
|
set_config('system','cache_last_cleared', time());
|
||||||
|
}
|
||||||
|
|
||||||
|
$manual_id = 0;
|
||||||
|
$generation = 0;
|
||||||
|
$force = false;
|
||||||
|
$restart = false;
|
||||||
|
|
||||||
|
if(($argc > 1) && ($argv[1] == 'force'))
|
||||||
|
$force = true;
|
||||||
|
|
||||||
|
if(($argc > 1) && ($argv[1] == 'restart')) {
|
||||||
|
$restart = true;
|
||||||
|
$generation = intval($argv[2]);
|
||||||
|
if(! $generation)
|
||||||
|
killme();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(($argc > 1) && intval($argv[1])) {
|
||||||
|
$manual_id = intval($argv[1]);
|
||||||
|
$force = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$interval = intval(get_config('system','poll_interval'));
|
||||||
|
if(! $interval)
|
||||||
|
$interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval')));
|
||||||
|
|
||||||
|
// If we are using the worker we don't need a delivery interval
|
||||||
|
if (get_config("system", "worker"))
|
||||||
|
$interval = false;
|
||||||
|
|
||||||
|
$sql_extra = (($manual_id) ? " AND `id` = $manual_id " : "");
|
||||||
|
|
||||||
|
reload_plugins();
|
||||||
|
|
||||||
|
$d = datetime_convert();
|
||||||
|
|
||||||
|
// Only poll from those with suitable relationships,
|
||||||
|
// and which have a polling address and ignore Diaspora since
|
||||||
|
// we are unable to match those posts with a Diaspora GUID and prevent duplicates.
|
||||||
|
|
||||||
|
$abandon_sql = (($abandon_days)
|
||||||
|
? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
|
||||||
|
: ''
|
||||||
|
);
|
||||||
|
|
||||||
|
$contacts = q("SELECT `contact`.`id` FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
|
||||||
|
WHERE `rel` IN (%d, %d) AND `poll` != '' AND `network` IN ('%s', '%s', '%s', '%s', '%s', '%s')
|
||||||
|
$sql_extra
|
||||||
|
AND NOT `self` AND NOT `contact`.`blocked` AND NOT `contact`.`readonly` AND NOT `contact`.`archive`
|
||||||
|
AND NOT `user`.`account_expired` AND NOT `user`.`account_removed` $abandon_sql ORDER BY RAND()",
|
||||||
|
intval(CONTACT_IS_SHARING),
|
||||||
|
intval(CONTACT_IS_FRIEND),
|
||||||
|
dbesc(NETWORK_DFRN),
|
||||||
|
dbesc(NETWORK_ZOT),
|
||||||
|
dbesc(NETWORK_OSTATUS),
|
||||||
|
dbesc(NETWORK_FEED),
|
||||||
|
dbesc(NETWORK_MAIL),
|
||||||
|
dbesc(NETWORK_MAIL2)
|
||||||
|
);
|
||||||
|
|
||||||
|
if(! count($contacts)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($contacts as $c) {
|
||||||
|
|
||||||
|
$res = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
|
||||||
|
intval($c['id'])
|
||||||
|
);
|
||||||
|
|
||||||
|
if((! $res) || (! count($res)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
foreach($res as $contact) {
|
||||||
|
|
||||||
|
$xml = false;
|
||||||
|
|
||||||
|
if($manual_id)
|
||||||
|
$contact['last-update'] = '0000-00-00 00:00:00';
|
||||||
|
|
||||||
|
if(in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS)))
|
||||||
|
$contact['priority'] = 2;
|
||||||
|
|
||||||
|
if($contact['subhub'] AND in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS))) {
|
||||||
|
// We should be getting everything via a hub. But just to be sure, let's check once a day.
|
||||||
|
// (You can make this more or less frequent if desired by setting 'pushpoll_frequency' appropriately)
|
||||||
|
// This also lets us update our subscription to the hub, and add or replace hubs in case it
|
||||||
|
// changed. We will only update hubs once a day, regardless of 'pushpoll_frequency'.
|
||||||
|
|
||||||
|
$poll_interval = get_config('system','pushpoll_frequency');
|
||||||
|
$contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($contact['priority'] AND !$force) {
|
||||||
|
|
||||||
|
$update = false;
|
||||||
|
|
||||||
|
$t = $contact['last-update'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Based on $contact['priority'], should we poll this site now? Or later?
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch ($contact['priority']) {
|
||||||
|
case 5:
|
||||||
|
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 month"))
|
||||||
|
$update = true;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 week"))
|
||||||
|
$update = true;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
|
||||||
|
$update = true;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 12 hour"))
|
||||||
|
$update = true;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
default:
|
||||||
|
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 hour"))
|
||||||
|
$update = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!$update)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger("Polling ".$contact["network"]." ".$contact["id"]." ".$contact["nick"]." ".$contact["name"]);
|
||||||
|
|
||||||
|
proc_run('php','include/onepoll.php',$contact['id']);
|
||||||
|
|
||||||
|
if($interval)
|
||||||
|
@time_sleep_until(microtime(true) + (float) $interval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger('cron: end');
|
||||||
|
|
||||||
|
set_config('system','last_cron', time());
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_search(__file__,get_included_files())===0){
|
||||||
|
cron_run($_SERVER["argv"],$_SERVER["argc"]);
|
||||||
|
killme();
|
||||||
|
}
|
|
@ -35,6 +35,20 @@ function cronhooks_run(&$argv, &$argc){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$last = get_config('system','last_cronhook');
|
||||||
|
|
||||||
|
$poll_interval = intval(get_config('system','cronhook_interval'));
|
||||||
|
if(! $poll_interval)
|
||||||
|
$poll_interval = 9;
|
||||||
|
|
||||||
|
if($last) {
|
||||||
|
$next = $last + ($poll_interval * 60);
|
||||||
|
if($next > time()) {
|
||||||
|
logger('cronhook intervall not reached');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$lockpath = get_lockpath();
|
$lockpath = get_lockpath();
|
||||||
if ($lockpath != '') {
|
if ($lockpath != '') {
|
||||||
$pidfile = new pidfile($lockpath, 'cronhooks');
|
$pidfile = new pidfile($lockpath, 'cronhooks');
|
||||||
|
@ -62,6 +76,8 @@ function cronhooks_run(&$argv, &$argc){
|
||||||
|
|
||||||
logger('cronhooks: end');
|
logger('cronhooks: end');
|
||||||
|
|
||||||
|
set_config('system','last_cronhook', time());
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -210,6 +210,18 @@ function timesel($format, $h, $m, $id='timepicker') {
|
||||||
if(! function_exists('datetimesel')) {
|
if(! function_exists('datetimesel')) {
|
||||||
function datetimesel($format, $min, $max, $default, $id = 'datetimepicker', $pickdate = true, $picktime = true, $minfrom = '', $maxfrom = '', $required = false) {
|
function datetimesel($format, $min, $max, $default, $id = 'datetimepicker', $pickdate = true, $picktime = true, $minfrom = '', $maxfrom = '', $required = false) {
|
||||||
|
|
||||||
|
$a = get_app();
|
||||||
|
|
||||||
|
// First day of the week (0 = Sunday)
|
||||||
|
$firstDay = get_pconfig(local_user(),'system','first_day_of_week');
|
||||||
|
if ($firstDay === false) $firstDay=0;
|
||||||
|
|
||||||
|
$lang = substr(get_browser_language(), 0, 2);
|
||||||
|
|
||||||
|
// Check if the detected language is supported by the picker
|
||||||
|
if (!in_array($lang, array("ar", "ro", "id", "bg", "fa", "ru", "uk", "en", "el", "de", "nl", "tr", "fr", "es", "th", "pl", "pt", "ch", "se", "kr", "it", "da", "no", "ja", "vi", "sl", "cs", "hu")))
|
||||||
|
$lang = ((isset($a->config['system']['language'])) ? $a->config['system']['language'] : 'en');
|
||||||
|
|
||||||
$o = '';
|
$o = '';
|
||||||
$dateformat = '';
|
$dateformat = '';
|
||||||
if($pickdate) $dateformat .= 'Y-m-d';
|
if($pickdate) $dateformat .= 'Y-m-d';
|
||||||
|
@ -224,6 +236,7 @@ function datetimesel($format, $min, $max, $default, $id = 'datetimepicker', $pic
|
||||||
if(!$pickdate) $pickers .= ',datepicker: false';
|
if(!$pickdate) $pickers .= ',datepicker: false';
|
||||||
if(!$picktime) $pickers .= ',timepicker: false';
|
if(!$picktime) $pickers .= ',timepicker: false';
|
||||||
$extra_js = '';
|
$extra_js = '';
|
||||||
|
$pickers .= ",dayOfWeekStart: ".$firstDay.",lang:'".$lang."'";
|
||||||
if($minfrom != '')
|
if($minfrom != '')
|
||||||
$extra_js .= "\$('#$minfrom').data('xdsoft_datetimepicker').setOptions({onChangeDateTime: function (currentDateTime) { \$('#$id').data('xdsoft_datetimepicker').setOptions({minDate: currentDateTime})}})";
|
$extra_js .= "\$('#$minfrom').data('xdsoft_datetimepicker').setOptions({onChangeDateTime: function (currentDateTime) { \$('#$id').data('xdsoft_datetimepicker').setOptions({minDate: currentDateTime})}})";
|
||||||
if($maxfrom != '')
|
if($maxfrom != '')
|
||||||
|
@ -236,7 +249,9 @@ function datetimesel($format, $min, $max, $default, $id = 'datetimepicker', $pic
|
||||||
$readable_format = str_replace('i','MM',$readable_format);
|
$readable_format = str_replace('i','MM',$readable_format);
|
||||||
$o .= "<div class='date'><input type='text' placeholder='$readable_format' name='$id' id='$id' $input_text />";
|
$o .= "<div class='date'><input type='text' placeholder='$readable_format' name='$id' id='$id' $input_text />";
|
||||||
$o .= '</div>';
|
$o .= '</div>';
|
||||||
$o .= "<script type='text/javascript'>\$(function () {var picker = \$('#$id').datetimepicker({step:5,format:'$dateformat' $minjs $maxjs $pickers $defaultdatejs}); $extra_js})</script>";
|
$o .= "<script type='text/javascript'>";
|
||||||
|
$o .= "\$(function () {var picker = \$('#$id').datetimepicker({step:5,format:'$dateformat' $minjs $maxjs $pickers $defaultdatejs}); $extra_js})";
|
||||||
|
$o .= "</script>";
|
||||||
return $o;
|
return $o;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
|
@ -642,6 +642,7 @@ function db_definition() {
|
||||||
"gender" => array("type" => "varchar(32)", "not null" => "1", "default" => ""),
|
"gender" => array("type" => "varchar(32)", "not null" => "1", "default" => ""),
|
||||||
"community" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
"community" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
|
||||||
"network" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
|
"network" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
|
||||||
|
"addr" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
|
||||||
"generation" => array("type" => "tinyint(3)", "not null" => "1", "default" => "0"),
|
"generation" => array("type" => "tinyint(3)", "not null" => "1", "default" => "0"),
|
||||||
"server_url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
|
"server_url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
|
||||||
),
|
),
|
||||||
|
@ -1382,6 +1383,20 @@ function db_definition() {
|
||||||
"username" => array("username"),
|
"username" => array("username"),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
$database["workerqueue"] = array(
|
||||||
|
"fields" => array(
|
||||||
|
"id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
|
||||||
|
"parameter" => array("type" => "text", "not null" => "1"),
|
||||||
|
"priority" => array("type" => "tinyint(3) unsigned", "not null" => "1", "default" => "0"),
|
||||||
|
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
|
||||||
|
"pid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
|
||||||
|
"executed" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"),
|
||||||
|
),
|
||||||
|
"indexes" => array(
|
||||||
|
"PRIMARY" => array("id"),
|
||||||
|
"created" => array("created"),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
return($database);
|
return($database);
|
||||||
}
|
}
|
||||||
|
|
|
@ -340,9 +340,9 @@ function delivery_run(&$argv, &$argc){
|
||||||
$ssl_policy = get_config('system','ssl_policy');
|
$ssl_policy = get_config('system','ssl_policy');
|
||||||
fix_contact_ssl_policy($x[0],$ssl_policy);
|
fix_contact_ssl_policy($x[0],$ssl_policy);
|
||||||
|
|
||||||
// If we are setup as a soapbox we aren't accepting input from this person
|
// If we are setup as a soapbox we aren't accepting top level posts from this person
|
||||||
|
|
||||||
if($x[0]['page-flags'] == PAGE_SOAPBOX)
|
if (($x[0]['page-flags'] == PAGE_SOAPBOX) AND $top_level)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
require_once('library/simplepie/simplepie.inc');
|
require_once('library/simplepie/simplepie.inc');
|
||||||
|
@ -520,11 +520,16 @@ function delivery_run(&$argv, &$argc){
|
||||||
if((! $contact['pubkey']) && (! $public_message))
|
if((! $contact['pubkey']) && (! $public_message))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if($target_item['verb'] === ACTIVITY_DISLIKE) {
|
$unsupported_activities = array(ACTIVITY_DISLIKE, ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE);
|
||||||
// unsupported
|
|
||||||
break;
|
//don't transmit activities which are not supported by diaspora
|
||||||
|
foreach($unsupported_activities as $act) {
|
||||||
|
if(activity_match($target_item['verb'],$act)) {
|
||||||
|
break 2;
|
||||||
}
|
}
|
||||||
elseif(($target_item['deleted']) && ($target_item['uri'] === $target_item['parent-uri'])) {
|
}
|
||||||
|
|
||||||
|
if(($target_item['deleted']) && ($target_item['uri'] === $target_item['parent-uri'])) {
|
||||||
// top-level retraction
|
// top-level retraction
|
||||||
logger('delivery: diaspora retract: ' . $loc);
|
logger('delivery: diaspora retract: ' . $loc);
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,9 @@ function diaspora_dispatch($importer,$msg,$attempt=1) {
|
||||||
elseif($xmlbase->message) {
|
elseif($xmlbase->message) {
|
||||||
$ret = diaspora_message($importer,$xmlbase->message,$msg);
|
$ret = diaspora_message($importer,$xmlbase->message,$msg);
|
||||||
}
|
}
|
||||||
|
elseif($xmlbase->participation) {
|
||||||
|
$ret = diaspora_participation($importer,$xmlbase->participation);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true));
|
logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true));
|
||||||
}
|
}
|
||||||
|
@ -589,7 +592,7 @@ function diaspora_request($importer,$xml) {
|
||||||
// perhaps we were already sharing with this person. Now they're sharing with us.
|
// perhaps we were already sharing with this person. Now they're sharing with us.
|
||||||
// That makes us friends.
|
// That makes us friends.
|
||||||
|
|
||||||
if($contact['rel'] == CONTACT_IS_FOLLOWER && !in_array($importer['page-flags'], array(PAGE_COMMUNITY, PAGE_SOAPBOX))) {
|
if($contact['rel'] == CONTACT_IS_FOLLOWER && in_array($importer['page-flags'], array(PAGE_FREELOVE))) {
|
||||||
q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
|
q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
|
||||||
intval(CONTACT_IS_FRIEND),
|
intval(CONTACT_IS_FRIEND),
|
||||||
intval($contact['id']),
|
intval($contact['id']),
|
||||||
|
@ -771,7 +774,7 @@ function diaspora_post_allow($importer,$contact, $is_comment = false) {
|
||||||
// perhaps we were already sharing with this person. Now they're sharing with us.
|
// perhaps we were already sharing with this person. Now they're sharing with us.
|
||||||
// That makes us friends.
|
// That makes us friends.
|
||||||
// Normally this should have handled by getting a request - but this could get lost
|
// Normally this should have handled by getting a request - but this could get lost
|
||||||
if($contact['rel'] == CONTACT_IS_FOLLOWER && !in_array($importer['page-flags'], array(PAGE_COMMUNITY, PAGE_SOAPBOX))) {
|
if($contact['rel'] == CONTACT_IS_FOLLOWER && in_array($importer['page-flags'], array(PAGE_FREELOVE))) {
|
||||||
q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
|
q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
|
||||||
intval(CONTACT_IS_FRIEND),
|
intval(CONTACT_IS_FRIEND),
|
||||||
intval($contact['id']),
|
intval($contact['id']),
|
||||||
|
@ -1881,6 +1884,9 @@ function diaspora_message($importer,$xml,$msg) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function diaspora_participation($importer,$xml) {
|
||||||
|
logger("Unsupported message type 'participation' ".print_r($xml, true));
|
||||||
|
}
|
||||||
|
|
||||||
function diaspora_photo($importer,$xml,$msg,$attempt=1) {
|
function diaspora_photo($importer,$xml,$msg,$attempt=1) {
|
||||||
|
|
||||||
|
@ -2415,6 +2421,7 @@ function diaspora_profile($importer,$xml,$msg) {
|
||||||
|
|
||||||
$birthday = str_replace('1000','1901',$birthday);
|
$birthday = str_replace('1000','1901',$birthday);
|
||||||
|
|
||||||
|
if ($birthday != "")
|
||||||
$birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d');
|
$birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d');
|
||||||
|
|
||||||
// this is to prevent multiple birthday notifications in a single year
|
// this is to prevent multiple birthday notifications in a single year
|
||||||
|
|
|
@ -41,6 +41,8 @@ function discover_poco_run(&$argv, &$argc){
|
||||||
$mode = 1;
|
$mode = 1;
|
||||||
} elseif(($argc == 2) && ($argv[1] == "checkcontact")) {
|
} elseif(($argc == 2) && ($argv[1] == "checkcontact")) {
|
||||||
$mode = 2;
|
$mode = 2;
|
||||||
|
} elseif(($argc == 2) && ($argv[1] == "suggestions")) {
|
||||||
|
$mode = 3;
|
||||||
} elseif ($argc == 1) {
|
} elseif ($argc == 1) {
|
||||||
$search = "";
|
$search = "";
|
||||||
$mode = 0;
|
$mode = 0;
|
||||||
|
@ -69,7 +71,9 @@ function discover_poco_run(&$argv, &$argc){
|
||||||
|
|
||||||
logger('start '.$search);
|
logger('start '.$search);
|
||||||
|
|
||||||
if (($mode == 2) AND get_config('system','poco_completion'))
|
if ($mode==3)
|
||||||
|
update_suggestions();
|
||||||
|
elseif (($mode == 2) AND get_config('system','poco_completion'))
|
||||||
discover_users();
|
discover_users();
|
||||||
elseif (($mode == 1) AND ($search != "") and get_config('system','poco_local_search'))
|
elseif (($mode == 1) AND ($search != "") and get_config('system','poco_local_search'))
|
||||||
discover_directory($search);
|
discover_directory($search);
|
||||||
|
|
|
@ -20,7 +20,11 @@ function notification($params) {
|
||||||
$siteurl = $a->get_baseurl(true);
|
$siteurl = $a->get_baseurl(true);
|
||||||
$thanks = t('Thank You,');
|
$thanks = t('Thank You,');
|
||||||
$sitename = $a->config['sitename'];
|
$sitename = $a->config['sitename'];
|
||||||
|
if (!x($a->config['admin_name'])) {
|
||||||
$site_admin = sprintf( t('%s Administrator'), $sitename);
|
$site_admin = sprintf( t('%s Administrator'), $sitename);
|
||||||
|
} else {
|
||||||
|
$site_admin = sprintf( t('%1$s, %2$s Administrator'), $a->config['admin_name'], $sitename);
|
||||||
|
}
|
||||||
$nickname = "";
|
$nickname = "";
|
||||||
|
|
||||||
$sender_name = $sitename;
|
$sender_name = $sitename;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
require_once('include/bbcode.php');
|
require_once('include/bbcode.php');
|
||||||
require_once('include/map.php');
|
require_once('include/map.php');
|
||||||
|
|
||||||
function format_event_html($ev) {
|
function format_event_html($ev, $simple = false) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,6 +12,32 @@ function format_event_html($ev) {
|
||||||
|
|
||||||
$bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8 AM
|
$bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8 AM
|
||||||
|
|
||||||
|
$event_start = (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(),
|
||||||
|
$ev['start'] , $bd_format ))
|
||||||
|
: day_translate(datetime_convert('UTC', 'UTC',
|
||||||
|
$ev['start'] , $bd_format)));
|
||||||
|
|
||||||
|
$event_end = (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(),
|
||||||
|
$ev['finish'] , $bd_format ))
|
||||||
|
: day_translate(datetime_convert('UTC', 'UTC',
|
||||||
|
$ev['finish'] , $bd_format )));
|
||||||
|
|
||||||
|
if ($simple) {
|
||||||
|
$o = "<h3>".bbcode($ev['summary'])."</h3>";
|
||||||
|
|
||||||
|
$o .= "<p>".bbcode($ev['desc'])."</p>";
|
||||||
|
|
||||||
|
$o .= "<h4>".t('Starts:')."</h4><p>".$event_start."</p>";
|
||||||
|
|
||||||
|
if(! $ev['nofinish'])
|
||||||
|
$o .= "<h4>".t('Finishes:')."</h4><p>".$event_end."</p>";
|
||||||
|
|
||||||
|
if(strlen($ev['location']))
|
||||||
|
$o .= "<h4>".t('Location:')."</h4><p>".$ev['location']."</p>";
|
||||||
|
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
$o = '<div class="vevent">' . "\r\n";
|
$o = '<div class="vevent">' . "\r\n";
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,21 +47,13 @@ function format_event_html($ev) {
|
||||||
|
|
||||||
$o .= '<p class="event-start">' . t('Starts:') . ' <abbr class="dtstart" title="'
|
$o .= '<p class="event-start">' . t('Starts:') . ' <abbr class="dtstart" title="'
|
||||||
. datetime_convert('UTC','UTC',$ev['start'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
|
. datetime_convert('UTC','UTC',$ev['start'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
|
||||||
. '" >'
|
. '" >'.$event_start
|
||||||
. (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(),
|
|
||||||
$ev['start'] , $bd_format ))
|
|
||||||
: day_translate(datetime_convert('UTC', 'UTC',
|
|
||||||
$ev['start'] , $bd_format)))
|
|
||||||
. '</abbr></p>' . "\r\n";
|
. '</abbr></p>' . "\r\n";
|
||||||
|
|
||||||
if(! $ev['nofinish'])
|
if(! $ev['nofinish'])
|
||||||
$o .= '<p class="event-end" >' . t('Finishes:') . ' <abbr class="dtend" title="'
|
$o .= '<p class="event-end" >' . t('Finishes:') . ' <abbr class="dtend" title="'
|
||||||
. datetime_convert('UTC','UTC',$ev['finish'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
|
. datetime_convert('UTC','UTC',$ev['finish'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
|
||||||
. '" >'
|
. '" >'.$event_end
|
||||||
. (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(),
|
|
||||||
$ev['finish'] , $bd_format ))
|
|
||||||
: day_translate(datetime_convert('UTC', 'UTC',
|
|
||||||
$ev['finish'] , $bd_format )))
|
|
||||||
. '</abbr></p>' . "\r\n";
|
. '</abbr></p>' . "\r\n";
|
||||||
|
|
||||||
if(strlen($ev['location'])){
|
if(strlen($ev['location'])){
|
||||||
|
@ -204,7 +222,13 @@ function ev_compare($a,$b) {
|
||||||
return strcmp($date_a,$date_b);
|
return strcmp($date_a,$date_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function event_delete($event_id) {
|
||||||
|
if ($event_id == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
q("DELETE FROM `event` WHERE `id` = %d", intval($event_id));
|
||||||
|
logger("Deleted event ".$event_id, LOGGER_DEBUG);
|
||||||
|
}
|
||||||
|
|
||||||
function event_store($arr) {
|
function event_store($arr) {
|
||||||
|
|
||||||
|
@ -362,6 +386,7 @@ function event_store($arr) {
|
||||||
$item_arr['contact-id'] = $arr['cid'];
|
$item_arr['contact-id'] = $arr['cid'];
|
||||||
$item_arr['uri'] = $arr['uri'];
|
$item_arr['uri'] = $arr['uri'];
|
||||||
$item_arr['parent-uri'] = $arr['uri'];
|
$item_arr['parent-uri'] = $arr['uri'];
|
||||||
|
$item_arr['guid'] = $arr['guid'];
|
||||||
$item_arr['type'] = 'activity';
|
$item_arr['type'] = 'activity';
|
||||||
$item_arr['wall'] = (($arr['cid']) ? 0 : 1);
|
$item_arr['wall'] = (($arr['cid']) ? 0 : 1);
|
||||||
$item_arr['contact-id'] = $contact['id'];
|
$item_arr['contact-id'] = $contact['id'];
|
||||||
|
|
|
@ -1,19 +1,54 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Features management
|
* @file include/features.php *
|
||||||
|
* @brief Features management
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief check if feature is enabled
|
||||||
|
*
|
||||||
|
* return boolean
|
||||||
|
*/
|
||||||
function feature_enabled($uid,$feature) {
|
function feature_enabled($uid,$feature) {
|
||||||
//return true;
|
//return true;
|
||||||
|
|
||||||
$x = get_pconfig($uid,'feature',$feature);
|
$x = get_pconfig($uid,'feature',$feature);
|
||||||
|
if($x === false) {
|
||||||
|
$x = get_config('feature',$feature);
|
||||||
|
if($x === false)
|
||||||
|
$x = get_feature_default($feature);
|
||||||
|
}
|
||||||
$arr = array('uid' => $uid, 'feature' => $feature, 'enabled' => $x);
|
$arr = array('uid' => $uid, 'feature' => $feature, 'enabled' => $x);
|
||||||
call_hooks('feature_enabled',$arr);
|
call_hooks('feature_enabled',$arr);
|
||||||
return($arr['enabled']);
|
return($arr['enabled']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief check if feature is enabled or disabled by default
|
||||||
|
*
|
||||||
|
* @param string $feature
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function get_feature_default($feature) {
|
||||||
|
$f = get_features();
|
||||||
|
foreach($f as $cat) {
|
||||||
|
foreach($cat as $feat) {
|
||||||
|
if(is_array($feat) && $feat[0] === $feature)
|
||||||
|
return $feat[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ brief get a list of all available features
|
||||||
|
* The array includes the setting group, the setting name,
|
||||||
|
* explainations for the setting and if it's enabled or disabled
|
||||||
|
* by default
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
function get_features() {
|
function get_features() {
|
||||||
|
|
||||||
$arr = array(
|
$arr = array(
|
||||||
|
@ -22,45 +57,53 @@ function get_features() {
|
||||||
'general' => array(
|
'general' => array(
|
||||||
t('General Features'),
|
t('General Features'),
|
||||||
//array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')),
|
//array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')),
|
||||||
array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles')),
|
array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles'),false),
|
||||||
|
array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'),false),
|
||||||
),
|
),
|
||||||
|
|
||||||
// Post composition
|
// Post composition
|
||||||
'composition' => array(
|
'composition' => array(
|
||||||
t('Post Composition Features'),
|
t('Post Composition Features'),
|
||||||
array('richtext', t('Richtext Editor'), t('Enable richtext editor')),
|
array('richtext', t('Richtext Editor'), t('Enable richtext editor'),false),
|
||||||
array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them')),
|
array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them'),false),
|
||||||
array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a fourm page is selected/deselected in ACL window.')),
|
array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a fourm page is selected/deselected in ACL window.'),false),
|
||||||
),
|
),
|
||||||
|
|
||||||
// Network sidebar widgets
|
// Network sidebar widgets
|
||||||
'widgets' => array(
|
'widgets' => array(
|
||||||
t('Network Sidebar Widgets'),
|
t('Network Sidebar Widgets'),
|
||||||
array('archives', t('Search by Date'), t('Ability to select posts by date ranges')),
|
array('archives', t('Search by Date'), t('Ability to select posts by date ranges'),false),
|
||||||
array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group')),
|
array('forumlist_widget', t('List Forums'), t('Enable widget to display the forums your are connected with'),true),
|
||||||
array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network')),
|
array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group'),false),
|
||||||
array('savedsearch', t('Saved Searches'), t('Save search terms for re-use')),
|
array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network'),false),
|
||||||
|
array('savedsearch', t('Saved Searches'), t('Save search terms for re-use'),false),
|
||||||
),
|
),
|
||||||
|
|
||||||
// Network tabs
|
// Network tabs
|
||||||
'net_tabs' => array(
|
'net_tabs' => array(
|
||||||
t('Network Tabs'),
|
t('Network Tabs'),
|
||||||
array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on')),
|
array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on'),false),
|
||||||
array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)')),
|
array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)'),false),
|
||||||
array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them')),
|
array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them'),false),
|
||||||
),
|
),
|
||||||
|
|
||||||
// Item tools
|
// Item tools
|
||||||
'tools' => array(
|
'tools' => array(
|
||||||
t('Post/Comment Tools'),
|
t('Post/Comment Tools'),
|
||||||
array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once')),
|
array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once'),false),
|
||||||
array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending')),
|
array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending'),false),
|
||||||
array('commtag', t('Tagging'), t('Ability to tag existing posts')),
|
array('commtag', t('Tagging'), t('Ability to tag existing posts'),false),
|
||||||
array('categories', t('Post Categories'), t('Add categories to your posts')),
|
array('categories', t('Post Categories'), t('Add categories to your posts'),false),
|
||||||
array('filing', t('Saved Folders'), t('Ability to file posts under folders')),
|
array('filing', t('Saved Folders'), t('Ability to file posts under folders'),false),
|
||||||
array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments')),
|
array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments')),
|
||||||
array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator')),
|
array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator'),false),
|
||||||
array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread')),
|
array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread'),false),
|
||||||
|
),
|
||||||
|
|
||||||
|
// Advanced Profile Settings
|
||||||
|
'advanced_profile' => array(
|
||||||
|
t('Advanced Profile Settings'),
|
||||||
|
array('forumlist_profile', t('List Forums'), t('Show visitors public community forums at the Advanced Profile Page'),false),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
285
include/feed.php
Normal file
285
include/feed.php
Normal file
|
@ -0,0 +1,285 @@
|
||||||
|
<?php
|
||||||
|
require_once("include/html2bbcode.php");
|
||||||
|
require_once("include/items.php");
|
||||||
|
|
||||||
|
function feed_import($xml,$importer,&$contact, &$hub) {
|
||||||
|
|
||||||
|
$a = get_app();
|
||||||
|
|
||||||
|
logger("Import Atom/RSS feed", LOGGER_DEBUG);
|
||||||
|
|
||||||
|
if ($xml == "")
|
||||||
|
return;
|
||||||
|
|
||||||
|
$doc = new DOMDocument();
|
||||||
|
@$doc->loadXML($xml);
|
||||||
|
$xpath = new DomXPath($doc);
|
||||||
|
$xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom");
|
||||||
|
$xpath->registerNamespace('dc', "http://purl.org/dc/elements/1.1/");
|
||||||
|
$xpath->registerNamespace('content', "http://purl.org/rss/1.0/modules/content/");
|
||||||
|
$xpath->registerNamespace('rdf', "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
|
||||||
|
$xpath->registerNamespace('rss', "http://purl.org/rss/1.0/");
|
||||||
|
$xpath->registerNamespace('media', "http://search.yahoo.com/mrss/");
|
||||||
|
|
||||||
|
$author = array();
|
||||||
|
|
||||||
|
// Is it RDF?
|
||||||
|
if ($xpath->query('/rdf:RDF/rss:channel')->length > 0) {
|
||||||
|
//$author["author-link"] = $xpath->evaluate('/rdf:RDF/rss:channel/rss:link/text()')->item(0)->nodeValue;
|
||||||
|
$author["author-name"] = $xpath->evaluate('/rdf:RDF/rss:channel/rss:title/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($author["author-name"] == "")
|
||||||
|
$author["author-name"] = $xpath->evaluate('/rdf:RDF/rss:channel/rss:description/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$entries = $xpath->query('/rdf:RDF/rss:item');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is it Atom?
|
||||||
|
if ($xpath->query('/atom:feed/atom:entry')->length > 0) {
|
||||||
|
//$self = $xpath->query("/atom:feed/atom:link[@rel='self']")->item(0)->attributes;
|
||||||
|
//if (is_object($self))
|
||||||
|
// foreach($self AS $attributes)
|
||||||
|
// if ($attributes->name == "href")
|
||||||
|
// $author["author-link"] = $attributes->textContent;
|
||||||
|
|
||||||
|
//if ($author["author-link"] == "") {
|
||||||
|
// $alternate = $xpath->query("/atom:feed/atom:link[@rel='alternate']")->item(0)->attributes;
|
||||||
|
// if (is_object($alternate))
|
||||||
|
// foreach($alternate AS $attributes)
|
||||||
|
// if ($attributes->name == "href")
|
||||||
|
// $author["author-link"] = $attributes->textContent;
|
||||||
|
//}
|
||||||
|
|
||||||
|
$author["author-name"] = $xpath->evaluate('/atom:feed/atom:title/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($author["author-name"] == "")
|
||||||
|
$author["author-name"] = $xpath->evaluate('/atom:feed/atom:subtitle/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($author["author-name"] == "")
|
||||||
|
$author["author-name"] = $xpath->evaluate('/atom:feed/atom:author/atom:name/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
//$author["author-avatar"] = $xpath->evaluate('/atom:feed/atom:logo/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$author["edited"] = $author["created"] = $xpath->query('/atom:feed/atom:updated/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$author["app"] = $xpath->evaluate('/atom:feed/atom:generator/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$entries = $xpath->query('/atom:feed/atom:entry');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is it RSS?
|
||||||
|
if ($xpath->query('/rss/channel')->length > 0) {
|
||||||
|
//$author["author-link"] = $xpath->evaluate('/rss/channel/link/text()')->item(0)->nodeValue;
|
||||||
|
$author["author-name"] = $xpath->evaluate('/rss/channel/title/text()')->item(0)->nodeValue;
|
||||||
|
//$author["author-avatar"] = $xpath->evaluate('/rss/channel/image/url/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($author["author-name"] == "")
|
||||||
|
$author["author-name"] = $xpath->evaluate('/rss/channel/copyright/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($author["author-name"] == "")
|
||||||
|
$author["author-name"] = $xpath->evaluate('/rss/channel/description/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$author["edited"] = $author["created"] = $xpath->query('/rss/channel/pubDate/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$author["app"] = $xpath->evaluate('/rss/channel/generator/text()')->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$entries = $xpath->query('/rss/channel/item');
|
||||||
|
}
|
||||||
|
|
||||||
|
//if ($author["author-link"] == "")
|
||||||
|
$author["author-link"] = $contact["url"];
|
||||||
|
|
||||||
|
if ($author["author-name"] == "")
|
||||||
|
$author["author-name"] = $contact["name"];
|
||||||
|
|
||||||
|
//if ($author["author-avatar"] == "")
|
||||||
|
$author["author-avatar"] = $contact["thumb"];
|
||||||
|
|
||||||
|
$author["owner-link"] = $contact["url"];
|
||||||
|
$author["owner-name"] = $contact["name"];
|
||||||
|
$author["owner-avatar"] = $contact["thumb"];
|
||||||
|
|
||||||
|
$header = array();
|
||||||
|
$header["uid"] = $importer["uid"];
|
||||||
|
$header["network"] = NETWORK_FEED;
|
||||||
|
$header["type"] = "remote";
|
||||||
|
$header["wall"] = 0;
|
||||||
|
$header["origin"] = 0;
|
||||||
|
$header["gravity"] = GRAVITY_PARENT;
|
||||||
|
$header["private"] = 2;
|
||||||
|
$header["verb"] = ACTIVITY_POST;
|
||||||
|
$header["object-type"] = ACTIVITY_OBJ_NOTE;
|
||||||
|
|
||||||
|
$header["contact-id"] = $contact["id"];
|
||||||
|
|
||||||
|
if(!strlen($contact["notify"])) {
|
||||||
|
// one way feed - no remote comment ability
|
||||||
|
$header["last-child"] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_object($entries))
|
||||||
|
return;
|
||||||
|
|
||||||
|
$entrylist = array();
|
||||||
|
|
||||||
|
foreach ($entries AS $entry)
|
||||||
|
$entrylist[] = $entry;
|
||||||
|
|
||||||
|
foreach (array_reverse($entrylist) AS $entry) {
|
||||||
|
$item = array_merge($header, $author);
|
||||||
|
|
||||||
|
$item["title"] = $xpath->evaluate('atom:title/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($item["title"] == "")
|
||||||
|
$item["title"] = $xpath->evaluate('title/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($item["title"] == "")
|
||||||
|
$item["title"] = $xpath->evaluate('rss:title/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$alternate = $xpath->query("atom:link[@rel='alternate']", $entry)->item(0)->attributes;
|
||||||
|
if (!is_object($alternate))
|
||||||
|
$alternate = $xpath->query("atom:link", $entry)->item(0)->attributes;
|
||||||
|
|
||||||
|
if (is_object($alternate))
|
||||||
|
foreach($alternate AS $attributes)
|
||||||
|
if ($attributes->name == "href")
|
||||||
|
$item["plink"] = $attributes->textContent;
|
||||||
|
|
||||||
|
if ($item["plink"] == "")
|
||||||
|
$item["plink"] = $xpath->evaluate('link/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($item["plink"] == "")
|
||||||
|
$item["plink"] = $xpath->evaluate('rss:link/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$item["plink"] = original_url($item["plink"]);
|
||||||
|
|
||||||
|
$item["uri"] = $xpath->evaluate('atom:id/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($item["uri"] == "")
|
||||||
|
$item["uri"] = $xpath->evaluate('guid/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($item["uri"] == "")
|
||||||
|
$item["uri"] = $item["plink"];
|
||||||
|
|
||||||
|
$item["parent-uri"] = $item["uri"];
|
||||||
|
|
||||||
|
$published = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($published == "")
|
||||||
|
$published = $xpath->query('pubDate/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($published == "")
|
||||||
|
$published = $xpath->query('dc:date/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
$updated = $xpath->query('atom:updated/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($updated == "")
|
||||||
|
$updated = $published;
|
||||||
|
|
||||||
|
if ($published != "")
|
||||||
|
$item["created"] = $published;
|
||||||
|
|
||||||
|
if ($updated != "")
|
||||||
|
$item["edited"] = $updated;
|
||||||
|
|
||||||
|
$creator = $xpath->query('author/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($creator == "")
|
||||||
|
$creator = $xpath->query('atom:author/atom:name/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($creator == "")
|
||||||
|
$creator = $xpath->query('dc:creator/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($creator != "")
|
||||||
|
$item["author-name"] = $creator;
|
||||||
|
|
||||||
|
if ($pubDate != "")
|
||||||
|
$item["edited"] = $item["created"] = $pubDate;
|
||||||
|
|
||||||
|
$creator = $xpath->query('dc:creator/text()', $entry)->item(0)->nodeValue;
|
||||||
|
|
||||||
|
if ($creator != "")
|
||||||
|
$item["author-name"] = $creator;
|
||||||
|
|
||||||
|
//$item["object"] = $xml;
|
||||||
|
|
||||||
|
$r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` = '%s'",
|
||||||
|
intval($importer["uid"]), dbesc($item["uri"]), dbesc(NETWORK_FEED));
|
||||||
|
if ($r) {
|
||||||
|
logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already existed under id ".$r[0]["id"], LOGGER_DEBUG);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// To-Do?
|
||||||
|
// <category>Ausland</category>
|
||||||
|
// <media:thumbnail width="152" height="76" url="http://www.taz.de/picture/667875/192/14388767.jpg"/>
|
||||||
|
|
||||||
|
$attachments = array();
|
||||||
|
|
||||||
|
$enclosures = $xpath->query("enclosure", $entry);
|
||||||
|
foreach ($enclosures AS $enclosure) {
|
||||||
|
$href = "";
|
||||||
|
$length = "";
|
||||||
|
$type = "";
|
||||||
|
$title = "";
|
||||||
|
|
||||||
|
foreach($enclosure->attributes AS $attributes) {
|
||||||
|
if ($attributes->name == "url")
|
||||||
|
$href = $attributes->textContent;
|
||||||
|
elseif ($attributes->name == "length")
|
||||||
|
$length = $attributes->textContent;
|
||||||
|
elseif ($attributes->name == "type")
|
||||||
|
$type = $attributes->textContent;
|
||||||
|
}
|
||||||
|
if(strlen($item["attach"]))
|
||||||
|
$item["attach"] .= ',';
|
||||||
|
|
||||||
|
$attachments[] = array("link" => $href, "type" => $type, "length" => $length);
|
||||||
|
|
||||||
|
$item["attach"] .= '[attach]href="'.$href.'" length="'.$length.'" type="'.$type.'"[/attach]';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($contact["fetch_further_information"]) {
|
||||||
|
$preview = "";
|
||||||
|
|
||||||
|
// Handle enclosures and treat them as preview picture
|
||||||
|
foreach ($attachments AS $attachment)
|
||||||
|
if ($attachment["type"] == "image/jpeg")
|
||||||
|
$preview = $attachment["link"];
|
||||||
|
|
||||||
|
$item["body"] = $item["title"].add_page_info($item["plink"], false, $preview, ($contact["fetch_further_information"] == 2), $contact["ffi_keyword_blacklist"]);
|
||||||
|
$item["tag"] = add_page_keywords($item["plink"], false, $preview, ($contact["fetch_further_information"] == 2), $contact["ffi_keyword_blacklist"]);
|
||||||
|
$item["title"] = "";
|
||||||
|
$item["object-type"] = ACTIVITY_OBJ_BOOKMARK;
|
||||||
|
unset($item["attach"]);
|
||||||
|
} else {
|
||||||
|
$body = trim($xpath->evaluate('atom:content/text()', $entry)->item(0)->nodeValue);
|
||||||
|
|
||||||
|
if ($body == "")
|
||||||
|
$body = trim($xpath->evaluate('content:encoded/text()', $entry)->item(0)->nodeValue);
|
||||||
|
|
||||||
|
if ($body == "")
|
||||||
|
$body = trim($xpath->evaluate('description/text()', $entry)->item(0)->nodeValue);
|
||||||
|
|
||||||
|
if ($body == "")
|
||||||
|
$body = trim($xpath->evaluate('atom:summary/text()', $entry)->item(0)->nodeValue);
|
||||||
|
|
||||||
|
// remove the content of the title if it is identically to the body
|
||||||
|
// This helps with auto generated titles e.g. from tumblr
|
||||||
|
if (title_is_body($item["title"], $body))
|
||||||
|
$item["title"] = "";
|
||||||
|
|
||||||
|
$item["body"] = html2bbcode($body);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger("Stored feed: ".print_r($item, true), LOGGER_DEBUG);
|
||||||
|
|
||||||
|
$notify = item_is_remote_self($contact, $item);
|
||||||
|
$id = item_store($item, false, $notify);
|
||||||
|
|
||||||
|
//print_r($item);
|
||||||
|
|
||||||
|
logger("Feed for contact ".$contact["url"]." stored under id ".$id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
|
@ -9,13 +9,13 @@ function update_contact($id) {
|
||||||
|
|
||||||
$r = q("SELECT `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `network` FROM `contact` WHERE `id` = %d", intval($id));
|
$r = q("SELECT `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `network` FROM `contact` WHERE `id` = %d", intval($id));
|
||||||
if (!$r)
|
if (!$r)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
$ret = probe_url($r[0]["url"]);
|
$ret = probe_url($r[0]["url"]);
|
||||||
|
|
||||||
// If probe_url fails the network code will be different
|
// If probe_url fails the network code will be different
|
||||||
if ($ret["network"] != $r[0]["network"])
|
if ($ret["network"] != $r[0]["network"])
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
$update = false;
|
$update = false;
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ function update_contact($id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$update)
|
if (!$update)
|
||||||
return;
|
return true;
|
||||||
|
|
||||||
q("UPDATE `contact` SET `url` = '%s', `nurl` = '%s', `addr` = '%s', `alias` = '%s', `batch` = '%s', `notify` = '%s', `poll` = '%s', `poco` = '%s' WHERE `id` = %d",
|
q("UPDATE `contact` SET `url` = '%s', `nurl` = '%s', `addr` = '%s', `alias` = '%s', `batch` = '%s', `notify` = '%s', `poll` = '%s', `poco` = '%s' WHERE `id` = %d",
|
||||||
dbesc($ret['url']),
|
dbesc($ret['url']),
|
||||||
|
@ -42,6 +42,8 @@ function update_contact($id) {
|
||||||
dbesc($ret['poco']),
|
dbesc($ret['poco']),
|
||||||
intval($id)
|
intval($id)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -152,11 +154,7 @@ function new_contact($uid,$url,$interactive = false) {
|
||||||
|
|
||||||
$hidden = (($ret['network'] === NETWORK_MAIL) ? 1 : 0);
|
$hidden = (($ret['network'] === NETWORK_MAIL) ? 1 : 0);
|
||||||
|
|
||||||
if($ret['network'] === NETWORK_MAIL) {
|
if(in_array($ret['network'], array(NETWORK_MAIL, NETWORK_DIASPORA)))
|
||||||
$writeable = 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
if($ret['network'] === NETWORK_DIASPORA)
|
|
||||||
$writeable = 1;
|
$writeable = 1;
|
||||||
|
|
||||||
// check if we already have a contact
|
// check if we already have a contact
|
||||||
|
@ -213,9 +211,7 @@ function new_contact($uid,$url,$interactive = false) {
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
$new_relation = (($ret['network'] === NETWORK_MAIL) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING);
|
$new_relation = ((in_array($ret['network'], array(NETWORK_MAIL, NETWORK_DIASPORA))) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING);
|
||||||
if($ret['network'] === NETWORK_DIASPORA)
|
|
||||||
$new_relation = CONTACT_IS_FOLLOWER;
|
|
||||||
|
|
||||||
// create contact record
|
// create contact record
|
||||||
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `network`, `pubkey`, `rel`, `priority`,
|
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `network`, `pubkey`, `rel`, `priority`,
|
||||||
|
|
149
include/forums.php
Normal file
149
include/forums.php
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file include/forums.php
|
||||||
|
* @brief Functions related to forum functionality *
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to list all forums a user is connected with
|
||||||
|
*
|
||||||
|
* @param int $uid of the profile owner
|
||||||
|
* @param boolean $showhidden
|
||||||
|
* Show frorums which are not hidden
|
||||||
|
* @param boolean $lastitem
|
||||||
|
* Sort by lastitem
|
||||||
|
* @param boolean $showprivate
|
||||||
|
* Show private groups
|
||||||
|
*
|
||||||
|
* @returns array
|
||||||
|
* 'url' => forum url
|
||||||
|
* 'name' => forum name
|
||||||
|
* 'id' => number of the key from the array
|
||||||
|
* 'micro' => contact photo in format micro
|
||||||
|
*/
|
||||||
|
function get_forumlist($uid, $showhidden = true, $lastitem, $showprivate = false) {
|
||||||
|
|
||||||
|
$forumlist = array();
|
||||||
|
|
||||||
|
$order = (($showhidden) ? '' : ' AND NOT `hidden` ');
|
||||||
|
$order .= (($lastitem) ? ' ORDER BY `last-item` DESC ' : ' ORDER BY `name` ASC ');
|
||||||
|
$select = '`forum` ';
|
||||||
|
if ($showprivate) {
|
||||||
|
$select = '(`forum` OR `prv`)';
|
||||||
|
}
|
||||||
|
|
||||||
|
$contacts = q("SELECT `contact`.`id`, `contact`.`url`, `contact`.`name`, `contact`.`micro` FROM `contact`
|
||||||
|
WHERE `network`= 'dfrn' AND $select AND `uid` = %d
|
||||||
|
AND NOT `blocked` AND NOT `hidden` AND NOT `pending` AND NOT `archive`
|
||||||
|
AND `success_update` > `failure_update`
|
||||||
|
$order ",
|
||||||
|
intval($uid)
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach($contacts as $contact) {
|
||||||
|
$forumlist[] = array(
|
||||||
|
'url' => $contact['url'],
|
||||||
|
'name' => $contact['name'],
|
||||||
|
'id' => $contact['id'],
|
||||||
|
'micro' => $contact['micro'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return($forumlist);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Forumlist widget
|
||||||
|
*
|
||||||
|
* Sidebar widget to show subcribed friendica forums. If activated
|
||||||
|
* in the settings, it appears at the notwork page sidebar
|
||||||
|
*
|
||||||
|
* @param App $a
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function widget_forumlist($a) {
|
||||||
|
|
||||||
|
if(! intval(feature_enabled(local_user(),'forumlist_widget')))
|
||||||
|
return;
|
||||||
|
|
||||||
|
$o = '';
|
||||||
|
|
||||||
|
//sort by last updated item
|
||||||
|
$lastitem = true;
|
||||||
|
|
||||||
|
$contacts = get_forumlist($a->user['uid'],true,$lastitem, true);
|
||||||
|
$total = count($contacts);
|
||||||
|
$visible_forums = 10;
|
||||||
|
|
||||||
|
if(count($contacts)) {
|
||||||
|
|
||||||
|
$id = 0;
|
||||||
|
|
||||||
|
foreach($contacts as $contact) {
|
||||||
|
|
||||||
|
$entry = array(
|
||||||
|
'url' => $a->get_baseurl() . '/network?f=&cid=' . $contact['id'],
|
||||||
|
'external_url' => $a->get_baseurl() . '/redir/' . $contact['id'],
|
||||||
|
'name' => $contact['name'],
|
||||||
|
'micro' => proxy_url($contact['micro'], false, PROXY_SIZE_MICRO),
|
||||||
|
'id' => ++$id,
|
||||||
|
);
|
||||||
|
$entries[] = $entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tpl = get_markup_template('widget_forumlist.tpl');
|
||||||
|
|
||||||
|
$o .= replace_macros($tpl,array(
|
||||||
|
'$title' => t('Forums'),
|
||||||
|
'$forums' => $entries,
|
||||||
|
'$link_desc' => t('External link to forum'),
|
||||||
|
'$total' => $total,
|
||||||
|
'$visible_forums' => $visible_forums,
|
||||||
|
'$showmore' => t('show more'),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Format forumlist as contact block
|
||||||
|
*
|
||||||
|
* This function is used to show the forumlist in
|
||||||
|
* the advanced profile.
|
||||||
|
*
|
||||||
|
* @param int $uid
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
function forumlist_profile_advanced($uid) {
|
||||||
|
|
||||||
|
$profile = intval(feature_enabled($uid,'forumlist_profile'));
|
||||||
|
if(! $profile)
|
||||||
|
return;
|
||||||
|
|
||||||
|
$o = '';
|
||||||
|
|
||||||
|
// place holder in case somebody wants configurability
|
||||||
|
$show_total = 9999;
|
||||||
|
|
||||||
|
//don't sort by last updated item
|
||||||
|
$lastitem = false;
|
||||||
|
|
||||||
|
$contacts = get_forumlist($uid,false,$lastitem,false);
|
||||||
|
|
||||||
|
$total_shown = 0;
|
||||||
|
|
||||||
|
foreach($contacts as $contact) {
|
||||||
|
$forumlist .= micropro($contact,false,'forumlist-profile-advanced');
|
||||||
|
$total_shown ++;
|
||||||
|
if($total_shown == $show_total)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(count($contacts) > 0)
|
||||||
|
$o .= $forumlist;
|
||||||
|
return $o;
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
require_once "object/TemplateEngine.php";
|
require_once "object/TemplateEngine.php";
|
||||||
require_once("library/Smarty/libs/Smarty.class.php");
|
require_once("library/Smarty/libs/Smarty.class.php");
|
||||||
|
require_once "include/plugin.php";
|
||||||
|
|
||||||
define('SMARTY3_TEMPLATE_FOLDER','templates');
|
define('SMARTY3_TEMPLATE_FOLDER','templates');
|
||||||
|
|
||||||
|
@ -59,6 +60,15 @@ class FriendicaSmartyEngine implements ITemplateEngine {
|
||||||
$template = $s;
|
$template = $s;
|
||||||
$s = new FriendicaSmarty();
|
$s = new FriendicaSmarty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// "middleware": inject variables into templates
|
||||||
|
$arr = array(
|
||||||
|
"template"=> basename($s->filename),
|
||||||
|
"vars" => $r
|
||||||
|
);
|
||||||
|
call_hooks("template_vars", $arr);
|
||||||
|
$r = $arr['vars'];
|
||||||
|
|
||||||
foreach($r as $key=>$value) {
|
foreach($r as $key=>$value) {
|
||||||
if($key[0] === '$') {
|
if($key[0] === '$') {
|
||||||
$key = substr($key, 1);
|
$key = substr($key, 1);
|
||||||
|
|
|
@ -47,7 +47,7 @@ function gprobe_run(&$argv, &$argc){
|
||||||
$result = Cache::get("gprobe:".$urlparts["host"]);
|
$result = Cache::get("gprobe:".$urlparts["host"]);
|
||||||
if (!is_null($result)) {
|
if (!is_null($result)) {
|
||||||
$result = unserialize($result);
|
$result = unserialize($result);
|
||||||
if ($result["network"] == NETWORK_FEED) {
|
if (in_array($result["network"], array(NETWORK_FEED, NETWORK_PHANTOM))) {
|
||||||
logger("DDoS attempt detected for ".$urlparts["host"]." by ".$_SERVER["REMOTE_ADDR"].". server data: ".print_r($_SERVER, true), LOGGER_DEBUG);
|
logger("DDoS attempt detected for ".$urlparts["host"]." by ".$_SERVER["REMOTE_ADDR"].". server data: ".print_r($_SERVER, true), LOGGER_DEBUG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,7 +158,9 @@ function group_get_members($gid) {
|
||||||
if(intval($gid)) {
|
if(intval($gid)) {
|
||||||
$r = q("SELECT `group_member`.`contact-id`, `contact`.* FROM `group_member`
|
$r = q("SELECT `group_member`.`contact-id`, `contact`.* FROM `group_member`
|
||||||
INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
|
INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
|
||||||
WHERE `gid` = %d AND `group_member`.`uid` = %d ORDER BY `contact`.`name` ASC ",
|
WHERE `gid` = %d AND `group_member`.`uid` = %d AND
|
||||||
|
NOT `contact`.`self` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
|
||||||
|
ORDER BY `contact`.`name` ASC ",
|
||||||
intval($gid),
|
intval($gid),
|
||||||
intval(local_user())
|
intval(local_user())
|
||||||
);
|
);
|
||||||
|
|
|
@ -85,14 +85,16 @@ function deletenode(&$doc, $node)
|
||||||
$child->parentNode->removeChild($child);
|
$child->parentNode->removeChild($child);
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
function _replace_code_cb($m){
|
||||||
|
return "<code>".str_replace("\n","<br>\n",$m[1]). "</code>";
|
||||||
|
}
|
||||||
|
|
||||||
function html2bbcode($message)
|
function html2bbcode($message)
|
||||||
{
|
{
|
||||||
|
|
||||||
$message = str_replace("\r", "", $message);
|
$message = str_replace("\r", "", $message);
|
||||||
|
|
||||||
$message = preg_replace_callback("|<pre><code>([^<]*)</code></pre>|ism", function($m) {
|
$message = preg_replace_callback("|<pre><code>([^<]*)</code></pre>|ism", "_replace_code_cb", $message);
|
||||||
return "<code>".str_replace("\n","<br>\n",$m[1]). "</code>";
|
|
||||||
}, $message);
|
|
||||||
|
|
||||||
$message = str_replace(array(
|
$message = str_replace(array(
|
||||||
"<li><p>",
|
"<li><p>",
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
|
/**
|
||||||
|
* @file include/identity.php
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once('include/forums.php');
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,15 +64,15 @@ if(! function_exists('profile_load')) {
|
||||||
$profile_int = intval($profile);
|
$profile_int = intval($profile);
|
||||||
$r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile`
|
$r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile`
|
||||||
INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
|
INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
|
||||||
WHERE `user`.`nickname` = '%s' AND `profile`.`id` = %d and `contact`.`self` = 1 LIMIT 1",
|
WHERE `user`.`nickname` = '%s' AND `profile`.`id` = %d AND `contact`.`self` = 1 LIMIT 1",
|
||||||
dbesc($nickname),
|
dbesc($nickname),
|
||||||
intval($profile_int)
|
intval($profile_int)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if((!$r) && (!count($r))) {
|
if((!$r) && (!count($r))) {
|
||||||
$r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile`
|
$r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile`
|
||||||
INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
|
INNER JOIN `contact` ON `contact`.`uid` = `profile`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
|
||||||
WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` = 1 and `contact`.`self` = 1 LIMIT 1",
|
WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` = 1 AND `contact`.`self` = 1 LIMIT 1",
|
||||||
dbesc($nickname)
|
dbesc($nickname)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -82,7 +87,7 @@ if(! function_exists('profile_load')) {
|
||||||
// fetch user tags if this isn't the default profile
|
// fetch user tags if this isn't the default profile
|
||||||
|
|
||||||
if(!$r[0]['is-default']) {
|
if(!$r[0]['is-default']) {
|
||||||
$x = q("select `pub_keywords` from `profile` where uid = %d and `is-default` = 1 limit 1",
|
$x = q("SELECT `pub_keywords` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1",
|
||||||
intval($r[0]['profile_uid'])
|
intval($r[0]['profile_uid'])
|
||||||
);
|
);
|
||||||
if($x && count($x))
|
if($x && count($x))
|
||||||
|
@ -306,7 +311,7 @@ if(! function_exists('profile_sidebar')) {
|
||||||
if(count($r))
|
if(count($r))
|
||||||
$updated = date("c", strtotime($r[0]['updated']));
|
$updated = date("c", strtotime($r[0]['updated']));
|
||||||
|
|
||||||
$r = q("SELECT COUNT(*) AS `total` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0 AND `hidden` = 0 AND `archive` = 0
|
$r = q("SELECT COUNT(*) AS `total` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 AND `archive` = 0
|
||||||
AND `network` IN ('%s', '%s', '%s', '')",
|
AND `network` IN ('%s', '%s', '%s', '')",
|
||||||
intval($profile['uid']),
|
intval($profile['uid']),
|
||||||
dbesc(NETWORK_DFRN),
|
dbesc(NETWORK_DFRN),
|
||||||
|
@ -525,8 +530,9 @@ if(! function_exists('get_events')) {
|
||||||
function advanced_profile(&$a) {
|
function advanced_profile(&$a) {
|
||||||
|
|
||||||
$o = '';
|
$o = '';
|
||||||
|
$uid = $a->profile['uid'];
|
||||||
|
|
||||||
$o .= replace_macros(get_markup_template("section_title.tpl"),array(
|
$o .= replace_macros(get_markup_template('section_title.tpl'),array(
|
||||||
'$title' => t('Profile')
|
'$title' => t('Profile')
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@ -604,6 +610,11 @@ function advanced_profile(&$a) {
|
||||||
|
|
||||||
if($txt = prepare_text($a->profile['education'])) $profile['education'] = array( t('School/education:'), $txt );
|
if($txt = prepare_text($a->profile['education'])) $profile['education'] = array( t('School/education:'), $txt );
|
||||||
|
|
||||||
|
//show subcribed forum if it is enabled in the usersettings
|
||||||
|
if (feature_enabled($uid,'forumlist_profile')) {
|
||||||
|
$profile['forumlist'] = array( t('Forums:'), forumlist_profile_advanced($uid));
|
||||||
|
}
|
||||||
|
|
||||||
if ($a->profile['uid'] == local_user())
|
if ($a->profile['uid'] == local_user())
|
||||||
$profile['edit'] = array($a->get_baseurl(). '/profiles/'.$a->profile['id'], t('Edit profile'),"", t('Edit profile'));
|
$profile['edit'] = array($a->get_baseurl(). '/profiles/'.$a->profile['id'], t('Edit profile'),"", t('Edit profile'));
|
||||||
|
|
||||||
|
@ -664,6 +675,7 @@ if(! function_exists('profile_tabs')){
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($is_owner){
|
if ($is_owner){
|
||||||
|
if ($a->theme_events_in_profile)
|
||||||
$tabs[] = array(
|
$tabs[] = array(
|
||||||
'label' => t('Events'),
|
'label' => t('Events'),
|
||||||
'url' => $a->get_baseurl() . '/events',
|
'url' => $a->get_baseurl() . '/events',
|
||||||
|
@ -709,7 +721,7 @@ function zrl_init(&$a) {
|
||||||
$result = Cache::get("gprobe:".$urlparts["host"]);
|
$result = Cache::get("gprobe:".$urlparts["host"]);
|
||||||
if (!is_null($result)) {
|
if (!is_null($result)) {
|
||||||
$result = unserialize($result);
|
$result = unserialize($result);
|
||||||
if ($result["network"] == NETWORK_FEED) {
|
if (in_array($result["network"], array(NETWORK_FEED, NETWORK_PHANTOM))) {
|
||||||
logger("DDoS attempt detected for ".$urlparts["host"]." by ".$_SERVER["REMOTE_ADDR"].". server data: ".print_r($_SERVER, true), LOGGER_DEBUG);
|
logger("DDoS attempt detected for ".$urlparts["host"]." by ".$_SERVER["REMOTE_ADDR"].". server data: ".print_r($_SERVER, true), LOGGER_DEBUG);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ require_once('include/threads.php');
|
||||||
require_once('include/socgraph.php');
|
require_once('include/socgraph.php');
|
||||||
require_once('include/plaintext.php');
|
require_once('include/plaintext.php');
|
||||||
require_once('include/ostatus.php');
|
require_once('include/ostatus.php');
|
||||||
|
require_once('include/feed.php');
|
||||||
require_once('mod/share.php');
|
require_once('mod/share.php');
|
||||||
|
|
||||||
require_once('library/defuse/php-encryption-1.2.1/Crypto.php');
|
require_once('library/defuse/php-encryption-1.2.1/Crypto.php');
|
||||||
|
@ -1096,6 +1097,48 @@ function add_guid($item) {
|
||||||
dbesc($item["uri"]), dbesc($item["network"]));
|
dbesc($item["uri"]), dbesc($item["network"]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adds a "lang" specification in a "postopts" element of given $arr,
|
||||||
|
// if possible and not already present.
|
||||||
|
// Expects "body" element to exist in $arr.
|
||||||
|
// TODO: add a parameter to request forcing override
|
||||||
|
function item_add_language_opt(&$arr) {
|
||||||
|
|
||||||
|
if (version_compare(PHP_VERSION, '5.3.0', '<')) return; // LanguageDetect.php not available ?
|
||||||
|
|
||||||
|
if ( x($arr, 'postopts') )
|
||||||
|
{
|
||||||
|
if ( strstr($arr['postopts'], 'lang=') )
|
||||||
|
{
|
||||||
|
// do not override
|
||||||
|
// TODO: add parameter to request overriding
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$postopts = $arr['postopts'];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$postopts = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once('library/langdet/Text/LanguageDetect.php');
|
||||||
|
$naked_body = preg_replace('/\[(.+?)\]/','',$arr['body']);
|
||||||
|
$l = new Text_LanguageDetect;
|
||||||
|
//$lng = $l->detectConfidence($naked_body);
|
||||||
|
//$arr['postopts'] = (($lng['language']) ? 'lang=' . $lng['language'] . ';' . $lng['confidence'] : '');
|
||||||
|
$lng = $l->detect($naked_body, 3);
|
||||||
|
|
||||||
|
if (sizeof($lng) > 0) {
|
||||||
|
if ($postopts != "") $postopts .= '&'; // arbitrary separator, to be reviewed
|
||||||
|
$postopts .= 'lang=';
|
||||||
|
$sep = "";
|
||||||
|
foreach ($lng as $language => $score) {
|
||||||
|
$postopts .= $sep . $language.";".$score;
|
||||||
|
$sep = ':';
|
||||||
|
}
|
||||||
|
$arr['postopts'] = $postopts;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function item_store($arr,$force_parent = false, $notify = false, $dontcache = false) {
|
function item_store($arr,$force_parent = false, $notify = false, $dontcache = false) {
|
||||||
|
|
||||||
// If it is a posting where users should get notifications, then define it as wall posting
|
// If it is a posting where users should get notifications, then define it as wall posting
|
||||||
|
@ -1185,29 +1228,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
|
||||||
//if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
|
//if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
|
||||||
// $arr['body'] = strip_tags($arr['body']);
|
// $arr['body'] = strip_tags($arr['body']);
|
||||||
|
|
||||||
|
item_add_language_opt($arr);
|
||||||
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
|
|
||||||
require_once('library/langdet/Text/LanguageDetect.php');
|
|
||||||
$naked_body = preg_replace('/\[(.+?)\]/','',$arr['body']);
|
|
||||||
$l = new Text_LanguageDetect;
|
|
||||||
//$lng = $l->detectConfidence($naked_body);
|
|
||||||
//$arr['postopts'] = (($lng['language']) ? 'lang=' . $lng['language'] . ';' . $lng['confidence'] : '');
|
|
||||||
$lng = $l->detect($naked_body, 3);
|
|
||||||
|
|
||||||
if (sizeof($lng) > 0) {
|
|
||||||
$postopts = "";
|
|
||||||
|
|
||||||
foreach ($lng as $language => $score) {
|
|
||||||
if ($postopts == "")
|
|
||||||
$postopts = "lang=";
|
|
||||||
else
|
|
||||||
$postopts .= ":";
|
|
||||||
|
|
||||||
$postopts .= $language.";".$score;
|
|
||||||
}
|
|
||||||
$arr['postopts'] = $postopts;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($notify)
|
if ($notify)
|
||||||
$guid_prefix = "";
|
$guid_prefix = "";
|
||||||
|
@ -1218,10 +1239,10 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
|
||||||
$arr['guid'] = ((x($arr,'guid')) ? notags(trim($arr['guid'])) : get_guid(32, $guid_prefix));
|
$arr['guid'] = ((x($arr,'guid')) ? notags(trim($arr['guid'])) : get_guid(32, $guid_prefix));
|
||||||
$arr['uri'] = ((x($arr,'uri')) ? notags(trim($arr['uri'])) : $arr['guid']);
|
$arr['uri'] = ((x($arr,'uri')) ? notags(trim($arr['uri'])) : $arr['guid']);
|
||||||
$arr['extid'] = ((x($arr,'extid')) ? notags(trim($arr['extid'])) : '');
|
$arr['extid'] = ((x($arr,'extid')) ? notags(trim($arr['extid'])) : '');
|
||||||
$arr['author-name'] = ((x($arr,'author-name')) ? notags(trim($arr['author-name'])) : '');
|
$arr['author-name'] = ((x($arr,'author-name')) ? trim($arr['author-name']) : '');
|
||||||
$arr['author-link'] = ((x($arr,'author-link')) ? notags(trim($arr['author-link'])) : '');
|
$arr['author-link'] = ((x($arr,'author-link')) ? notags(trim($arr['author-link'])) : '');
|
||||||
$arr['author-avatar'] = ((x($arr,'author-avatar')) ? notags(trim($arr['author-avatar'])) : '');
|
$arr['author-avatar'] = ((x($arr,'author-avatar')) ? notags(trim($arr['author-avatar'])) : '');
|
||||||
$arr['owner-name'] = ((x($arr,'owner-name')) ? notags(trim($arr['owner-name'])) : '');
|
$arr['owner-name'] = ((x($arr,'owner-name')) ? trim($arr['owner-name']) : '');
|
||||||
$arr['owner-link'] = ((x($arr,'owner-link')) ? notags(trim($arr['owner-link'])) : '');
|
$arr['owner-link'] = ((x($arr,'owner-link')) ? notags(trim($arr['owner-link'])) : '');
|
||||||
$arr['owner-avatar'] = ((x($arr,'owner-avatar')) ? notags(trim($arr['owner-avatar'])) : '');
|
$arr['owner-avatar'] = ((x($arr,'owner-avatar')) ? notags(trim($arr['owner-avatar'])) : '');
|
||||||
$arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert());
|
$arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert());
|
||||||
|
@ -1229,8 +1250,8 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
|
||||||
$arr['commented'] = ((x($arr,'commented') !== false) ? datetime_convert('UTC','UTC',$arr['commented']) : datetime_convert());
|
$arr['commented'] = ((x($arr,'commented') !== false) ? datetime_convert('UTC','UTC',$arr['commented']) : datetime_convert());
|
||||||
$arr['received'] = ((x($arr,'received') !== false) ? datetime_convert('UTC','UTC',$arr['received']) : datetime_convert());
|
$arr['received'] = ((x($arr,'received') !== false) ? datetime_convert('UTC','UTC',$arr['received']) : datetime_convert());
|
||||||
$arr['changed'] = ((x($arr,'changed') !== false) ? datetime_convert('UTC','UTC',$arr['changed']) : datetime_convert());
|
$arr['changed'] = ((x($arr,'changed') !== false) ? datetime_convert('UTC','UTC',$arr['changed']) : datetime_convert());
|
||||||
$arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
|
$arr['title'] = ((x($arr,'title')) ? trim($arr['title']) : '');
|
||||||
$arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : '');
|
$arr['location'] = ((x($arr,'location')) ? trim($arr['location']) : '');
|
||||||
$arr['coord'] = ((x($arr,'coord')) ? notags(trim($arr['coord'])) : '');
|
$arr['coord'] = ((x($arr,'coord')) ? notags(trim($arr['coord'])) : '');
|
||||||
$arr['last-child'] = ((x($arr,'last-child')) ? intval($arr['last-child']) : 0 );
|
$arr['last-child'] = ((x($arr,'last-child')) ? intval($arr['last-child']) : 0 );
|
||||||
$arr['visible'] = ((x($arr,'visible') !== false) ? intval($arr['visible']) : 1 );
|
$arr['visible'] = ((x($arr,'visible') !== false) ? intval($arr['visible']) : 1 );
|
||||||
|
@ -1266,6 +1287,19 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($arr['network'] == "") {
|
if ($arr['network'] == "") {
|
||||||
|
$r = q("SELECT `network` FROM `contact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' AND `uid` = %d LIMIT 1",
|
||||||
|
dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
|
||||||
|
dbesc(normalise_link($arr['author-link'])),
|
||||||
|
intval($arr['uid'])
|
||||||
|
);
|
||||||
|
|
||||||
|
if(!count($r))
|
||||||
|
$r = q("SELECT `network` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' LIMIT 1",
|
||||||
|
dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
|
||||||
|
dbesc(normalise_link($arr['author-link']))
|
||||||
|
);
|
||||||
|
|
||||||
|
if(!count($r))
|
||||||
$r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
$r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
||||||
intval($arr['contact-id']),
|
intval($arr['contact-id']),
|
||||||
intval($arr['uid'])
|
intval($arr['uid'])
|
||||||
|
@ -1455,9 +1489,10 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
|
||||||
$arr = $unescaped;
|
$arr = $unescaped;
|
||||||
|
|
||||||
// find the item we just created
|
// find the item we just created
|
||||||
$r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC ",
|
$r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `network` = '%s' ORDER BY `id` ASC ",
|
||||||
dbesc($arr['uri']),
|
dbesc($arr['uri']),
|
||||||
intval($arr['uid'])
|
intval($arr['uid']),
|
||||||
|
dbesc($arr['network'])
|
||||||
);
|
);
|
||||||
|
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
|
@ -2264,16 +2299,20 @@ function edited_timestamp_is_newer($existing, $update) {
|
||||||
function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) {
|
function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) {
|
||||||
if ($contact['network'] === NETWORK_OSTATUS) {
|
if ($contact['network'] === NETWORK_OSTATUS) {
|
||||||
if ($pass < 2) {
|
if ($pass < 2) {
|
||||||
// Test - remove before flight
|
|
||||||
//$tempfile = tempnam(get_temppath(), "ostatus");
|
|
||||||
//file_put_contents($tempfile, $xml);
|
|
||||||
|
|
||||||
logger("Consume OStatus messages ", LOGGER_DEBUG);
|
logger("Consume OStatus messages ", LOGGER_DEBUG);
|
||||||
ostatus_import($xml,$importer,$contact, $hub);
|
ostatus_import($xml,$importer,$contact, $hub);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($contact['network'] === NETWORK_FEED) {
|
||||||
|
if ($pass < 2) {
|
||||||
|
logger("Consume feeds", LOGGER_DEBUG);
|
||||||
|
feed_import($xml,$importer,$contact, $hub);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
require_once('library/simplepie/simplepie.inc');
|
require_once('library/simplepie/simplepie.inc');
|
||||||
require_once('include/contact_selectors.php');
|
require_once('include/contact_selectors.php');
|
||||||
|
|
||||||
|
@ -2342,85 +2381,45 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
|
||||||
$contact_updated = $photo_timestamp;
|
$contact_updated = $photo_timestamp;
|
||||||
|
|
||||||
require_once("include/Photo.php");
|
require_once("include/Photo.php");
|
||||||
$photo_failure = false;
|
$photos = import_profile_photo($photo_url,$contact['uid'],$contact['id']);
|
||||||
$have_photo = false;
|
|
||||||
|
|
||||||
$r = q("SELECT `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1",
|
|
||||||
intval($contact['id']),
|
|
||||||
intval($contact['uid'])
|
|
||||||
);
|
|
||||||
if(count($r)) {
|
|
||||||
$resource_id = $r[0]['resource-id'];
|
|
||||||
$have_photo = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$resource_id = photo_new_resource();
|
|
||||||
}
|
|
||||||
|
|
||||||
$img_str = fetch_url($photo_url,true);
|
|
||||||
// guess mimetype from headers or filename
|
|
||||||
$type = guess_image_type($photo_url,true);
|
|
||||||
|
|
||||||
|
|
||||||
$img = new Photo($img_str, $type);
|
|
||||||
if($img->is_valid()) {
|
|
||||||
if($have_photo) {
|
|
||||||
q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `contact-id` = %d AND `uid` = %d",
|
|
||||||
dbesc($resource_id),
|
|
||||||
intval($contact['id']),
|
|
||||||
intval($contact['uid'])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$img->scaleImageSquare(175);
|
|
||||||
|
|
||||||
$hash = $resource_id;
|
|
||||||
$r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 4);
|
|
||||||
|
|
||||||
$img->scaleImage(80);
|
|
||||||
$r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 5);
|
|
||||||
|
|
||||||
$img->scaleImage(48);
|
|
||||||
$r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 6);
|
|
||||||
|
|
||||||
$a = get_app();
|
|
||||||
|
|
||||||
q("UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
|
q("UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
|
||||||
WHERE `uid` = %d AND `id` = %d",
|
WHERE `uid` = %d AND `id` = %d AND NOT `self`",
|
||||||
dbesc(datetime_convert()),
|
dbesc(datetime_convert()),
|
||||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()),
|
dbesc($photos[0]),
|
||||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()),
|
dbesc($photos[1]),
|
||||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()),
|
dbesc($photos[2]),
|
||||||
intval($contact['uid']),
|
intval($contact['uid']),
|
||||||
intval($contact['id'])
|
intval($contact['id'])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if((is_array($contact)) && ($name_updated) && (strlen($new_name)) && ($name_updated > $contact['name-date'])) {
|
if((is_array($contact)) && ($name_updated) && (strlen($new_name)) && ($name_updated > $contact['name-date'])) {
|
||||||
if ($name_updated > $contact_updated)
|
if ($name_updated > $contact_updated)
|
||||||
$contact_updated = $name_updated;
|
$contact_updated = $name_updated;
|
||||||
|
|
||||||
$r = q("select * from contact where uid = %d and id = %d limit 1",
|
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `id` = %d LIMIT 1",
|
||||||
intval($contact['uid']),
|
intval($contact['uid']),
|
||||||
intval($contact['id'])
|
intval($contact['id'])
|
||||||
);
|
);
|
||||||
|
|
||||||
$x = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d",
|
$x = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d AND `name` != '%s' AND NOT `self`",
|
||||||
dbesc(notags(trim($new_name))),
|
dbesc(notags(trim($new_name))),
|
||||||
dbesc(datetime_convert()),
|
dbesc(datetime_convert()),
|
||||||
intval($contact['uid']),
|
intval($contact['uid']),
|
||||||
intval($contact['id'])
|
intval($contact['id']),
|
||||||
|
dbesc(notags(trim($new_name)))
|
||||||
);
|
);
|
||||||
|
|
||||||
// do our best to update the name on content items
|
// do our best to update the name on content items
|
||||||
|
|
||||||
if(count($r)) {
|
if(count($r) AND (notags(trim($new_name)) != $r[0]['name'])) {
|
||||||
q("update item set `author-name` = '%s' where `author-name` = '%s' and `author-link` = '%s' and uid = %d",
|
q("UPDATE `item` SET `author-name` = '%s' WHERE `author-name` = '%s' AND `author-link` = '%s' AND `uid` = %d AND `author-name` != '%s'",
|
||||||
dbesc(notags(trim($new_name))),
|
dbesc(notags(trim($new_name))),
|
||||||
dbesc($r[0]['name']),
|
dbesc($r[0]['name']),
|
||||||
dbesc($r[0]['url']),
|
dbesc($r[0]['url']),
|
||||||
intval($contact['uid'])
|
intval($contact['uid']),
|
||||||
|
dbesc(notags(trim($new_name)))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2519,6 +2518,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
|
||||||
if(! $item['deleted'])
|
if(! $item['deleted'])
|
||||||
logger('consume_feed: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
|
logger('consume_feed: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
|
||||||
|
|
||||||
|
if($item['object-type'] === ACTIVITY_OBJ_EVENT) {
|
||||||
|
logger("Deleting event ".$item['event-id'], LOGGER_DEBUG);
|
||||||
|
event_delete($item['event-id']);
|
||||||
|
}
|
||||||
|
|
||||||
if(($item['verb'] === ACTIVITY_TAG) && ($item['object-type'] === ACTIVITY_OBJ_TAGTERM)) {
|
if(($item['verb'] === ACTIVITY_TAG) && ($item['object-type'] === ACTIVITY_OBJ_TAGTERM)) {
|
||||||
$xo = parse_xml_string($item['object'],false);
|
$xo = parse_xml_string($item['object'],false);
|
||||||
$xt = parse_xml_string($item['target'],false);
|
$xt = parse_xml_string($item['target'],false);
|
||||||
|
@ -2726,7 +2730,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
|
||||||
$datarray['parent-uri'] = $parent_uri;
|
$datarray['parent-uri'] = $parent_uri;
|
||||||
$datarray['uid'] = $importer['uid'];
|
$datarray['uid'] = $importer['uid'];
|
||||||
$datarray['contact-id'] = $contact['id'];
|
$datarray['contact-id'] = $contact['id'];
|
||||||
if((activity_match($datarray['verb'],ACTIVITY_LIKE)) || (activity_match($datarray['verb'],ACTIVITY_DISLIKE))) {
|
if(($datarray['verb'] === ACTIVITY_LIKE)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_DISLIKE)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_ATTEND)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_ATTENDNO)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_ATTENDMAYBE)) {
|
||||||
$datarray['type'] = 'activity';
|
$datarray['type'] = 'activity';
|
||||||
$datarray['gravity'] = GRAVITY_LIKE;
|
$datarray['gravity'] = GRAVITY_LIKE;
|
||||||
// only one like or dislike per person
|
// only one like or dislike per person
|
||||||
|
@ -2806,11 +2814,12 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
|
||||||
|
|
||||||
if((x($datarray,'object-type')) && ($datarray['object-type'] === ACTIVITY_OBJ_EVENT)) {
|
if((x($datarray,'object-type')) && ($datarray['object-type'] === ACTIVITY_OBJ_EVENT)) {
|
||||||
$ev = bbtoevent($datarray['body']);
|
$ev = bbtoevent($datarray['body']);
|
||||||
if(x($ev,'desc') && x($ev,'start')) {
|
if((x($ev,'desc') || x($ev,'summary')) && x($ev,'start')) {
|
||||||
$ev['uid'] = $importer['uid'];
|
$ev['uid'] = $importer['uid'];
|
||||||
$ev['uri'] = $item_id;
|
$ev['uri'] = $item_id;
|
||||||
$ev['edited'] = $datarray['edited'];
|
$ev['edited'] = $datarray['edited'];
|
||||||
$ev['private'] = $datarray['private'];
|
$ev['private'] = $datarray['private'];
|
||||||
|
$ev['guid'] = $datarray['guid'];
|
||||||
|
|
||||||
if(is_array($contact))
|
if(is_array($contact))
|
||||||
$ev['cid'] = $contact['id'];
|
$ev['cid'] = $contact['id'];
|
||||||
|
@ -3070,85 +3079,46 @@ function local_delivery($importer,$data) {
|
||||||
|
|
||||||
logger('local_delivery: Updating photo for ' . $importer['name']);
|
logger('local_delivery: Updating photo for ' . $importer['name']);
|
||||||
require_once("include/Photo.php");
|
require_once("include/Photo.php");
|
||||||
$photo_failure = false;
|
|
||||||
$have_photo = false;
|
|
||||||
|
|
||||||
$r = q("SELECT `resource-id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1",
|
$photos = import_profile_photo($photo_url,$importer['importer_uid'],$importer['id']);
|
||||||
intval($importer['id']),
|
|
||||||
intval($importer['importer_uid'])
|
|
||||||
);
|
|
||||||
if(count($r)) {
|
|
||||||
$resource_id = $r[0]['resource-id'];
|
|
||||||
$have_photo = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$resource_id = photo_new_resource();
|
|
||||||
}
|
|
||||||
|
|
||||||
$img_str = fetch_url($photo_url,true);
|
|
||||||
// guess mimetype from headers or filename
|
|
||||||
$type = guess_image_type($photo_url,true);
|
|
||||||
|
|
||||||
|
|
||||||
$img = new Photo($img_str, $type);
|
|
||||||
if($img->is_valid()) {
|
|
||||||
if($have_photo) {
|
|
||||||
q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `contact-id` = %d AND `uid` = %d",
|
|
||||||
dbesc($resource_id),
|
|
||||||
intval($importer['id']),
|
|
||||||
intval($importer['importer_uid'])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$img->scaleImageSquare(175);
|
|
||||||
|
|
||||||
$hash = $resource_id;
|
|
||||||
$r = $img->store($importer['importer_uid'], $importer['id'], $hash, basename($photo_url), 'Contact Photos', 4);
|
|
||||||
|
|
||||||
$img->scaleImage(80);
|
|
||||||
$r = $img->store($importer['importer_uid'], $importer['id'], $hash, basename($photo_url), 'Contact Photos', 5);
|
|
||||||
|
|
||||||
$img->scaleImage(48);
|
|
||||||
$r = $img->store($importer['importer_uid'], $importer['id'], $hash, basename($photo_url), 'Contact Photos', 6);
|
|
||||||
|
|
||||||
$a = get_app();
|
|
||||||
|
|
||||||
q("UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
|
q("UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
|
||||||
WHERE `uid` = %d AND `id` = %d",
|
WHERE `uid` = %d AND `id` = %d AND NOT `self`",
|
||||||
dbesc(datetime_convert()),
|
dbesc(datetime_convert()),
|
||||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()),
|
dbesc($photos[0]),
|
||||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()),
|
dbesc($photos[1]),
|
||||||
dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()),
|
dbesc($photos[2]),
|
||||||
intval($importer['importer_uid']),
|
intval($importer['importer_uid']),
|
||||||
intval($importer['id'])
|
intval($importer['id'])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(($name_updated) && (strlen($new_name)) && ($name_updated > $importer['name-date'])) {
|
if(($name_updated) && (strlen($new_name)) && ($name_updated > $importer['name-date'])) {
|
||||||
if ($name_updated > $contact_updated)
|
if ($name_updated > $contact_updated)
|
||||||
$contact_updated = $name_updated;
|
$contact_updated = $name_updated;
|
||||||
|
|
||||||
$r = q("select * from contact where uid = %d and id = %d limit 1",
|
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `id` = %d LIMIT 1",
|
||||||
intval($importer['importer_uid']),
|
intval($importer['importer_uid']),
|
||||||
intval($importer['id'])
|
intval($importer['id'])
|
||||||
);
|
);
|
||||||
|
|
||||||
$x = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d",
|
$x = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `id` = %d AND `name` != '%s' AND NOT `self`",
|
||||||
dbesc(notags(trim($new_name))),
|
dbesc(notags(trim($new_name))),
|
||||||
dbesc(datetime_convert()),
|
dbesc(datetime_convert()),
|
||||||
intval($importer['importer_uid']),
|
intval($importer['importer_uid']),
|
||||||
intval($importer['id'])
|
intval($importer['id']),
|
||||||
|
dbesc(notags(trim($new_name)))
|
||||||
);
|
);
|
||||||
|
|
||||||
// do our best to update the name on content items
|
// do our best to update the name on content items
|
||||||
|
|
||||||
if(count($r)) {
|
if(count($r) AND (notags(trim($new_name)) != $r[0]['name'])) {
|
||||||
q("update item set `author-name` = '%s' where `author-name` = '%s' and `author-link` = '%s' and uid = %d",
|
q("UPDATE `item` SET `author-name` = '%s' WHERE `author-name` = '%s' AND `author-link` = '%s' AND `uid` = %d AND `author-name` != '%s'",
|
||||||
dbesc(notags(trim($new_name))),
|
dbesc(notags(trim($new_name))),
|
||||||
dbesc($r[0]['name']),
|
dbesc($r[0]['name']),
|
||||||
dbesc($r[0]['url']),
|
dbesc($r[0]['url']),
|
||||||
intval($importer['importer_uid'])
|
intval($importer['importer_uid']),
|
||||||
|
dbesc(notags(trim($new_name)))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3500,6 +3470,11 @@ function local_delivery($importer,$data) {
|
||||||
|
|
||||||
logger('local_delivery: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
|
logger('local_delivery: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
|
||||||
|
|
||||||
|
if($item['object-type'] === ACTIVITY_OBJ_EVENT) {
|
||||||
|
logger("Deleting event ".$item['event-id'], LOGGER_DEBUG);
|
||||||
|
event_delete($item['event-id']);
|
||||||
|
}
|
||||||
|
|
||||||
if(($item['verb'] === ACTIVITY_TAG) && ($item['object-type'] === ACTIVITY_OBJ_TAGTERM)) {
|
if(($item['verb'] === ACTIVITY_TAG) && ($item['object-type'] === ACTIVITY_OBJ_TAGTERM)) {
|
||||||
$xo = parse_xml_string($item['object'],false);
|
$xo = parse_xml_string($item['object'],false);
|
||||||
$xt = parse_xml_string($item['target'],false);
|
$xt = parse_xml_string($item['target'],false);
|
||||||
|
@ -3713,7 +3688,11 @@ function local_delivery($importer,$data) {
|
||||||
$datarray['owner-avatar'] = $own[0]['thumb'];
|
$datarray['owner-avatar'] = $own[0]['thumb'];
|
||||||
$datarray['contact-id'] = $importer['id'];
|
$datarray['contact-id'] = $importer['id'];
|
||||||
|
|
||||||
if(($datarray['verb'] === ACTIVITY_LIKE) || ($datarray['verb'] === ACTIVITY_DISLIKE)) {
|
if(($datarray['verb'] === ACTIVITY_LIKE)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_DISLIKE)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_ATTEND)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_ATTENDNO)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_ATTENDMAYBE)) {
|
||||||
$is_like = true;
|
$is_like = true;
|
||||||
$datarray['type'] = 'activity';
|
$datarray['type'] = 'activity';
|
||||||
$datarray['gravity'] = GRAVITY_LIKE;
|
$datarray['gravity'] = GRAVITY_LIKE;
|
||||||
|
@ -3902,7 +3881,11 @@ function local_delivery($importer,$data) {
|
||||||
$datarray['parent-uri'] = $parent_uri;
|
$datarray['parent-uri'] = $parent_uri;
|
||||||
$datarray['uid'] = $importer['importer_uid'];
|
$datarray['uid'] = $importer['importer_uid'];
|
||||||
$datarray['contact-id'] = $importer['id'];
|
$datarray['contact-id'] = $importer['id'];
|
||||||
if(($datarray['verb'] == ACTIVITY_LIKE) || ($datarray['verb'] == ACTIVITY_DISLIKE)) {
|
if(($datarray['verb'] === ACTIVITY_LIKE)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_DISLIKE)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_ATTEND)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_ATTENDNO)
|
||||||
|
|| ($datarray['verb'] === ACTIVITY_ATTENDMAYBE)) {
|
||||||
$datarray['type'] = 'activity';
|
$datarray['type'] = 'activity';
|
||||||
$datarray['gravity'] = GRAVITY_LIKE;
|
$datarray['gravity'] = GRAVITY_LIKE;
|
||||||
// only one like or dislike per person
|
// only one like or dislike per person
|
||||||
|
@ -4022,12 +4005,13 @@ function local_delivery($importer,$data) {
|
||||||
|
|
||||||
if((x($datarray,'object-type')) && ($datarray['object-type'] === ACTIVITY_OBJ_EVENT)) {
|
if((x($datarray,'object-type')) && ($datarray['object-type'] === ACTIVITY_OBJ_EVENT)) {
|
||||||
$ev = bbtoevent($datarray['body']);
|
$ev = bbtoevent($datarray['body']);
|
||||||
if(x($ev,'desc') && x($ev,'start')) {
|
if((x($ev,'desc') || x($ev,'summary')) && x($ev,'start')) {
|
||||||
$ev['cid'] = $importer['id'];
|
$ev['cid'] = $importer['id'];
|
||||||
$ev['uid'] = $importer['uid'];
|
$ev['uid'] = $importer['uid'];
|
||||||
$ev['uri'] = $item_id;
|
$ev['uri'] = $item_id;
|
||||||
$ev['edited'] = $datarray['edited'];
|
$ev['edited'] = $datarray['edited'];
|
||||||
$ev['private'] = $datarray['private'];
|
$ev['private'] = $datarray['private'];
|
||||||
|
$ev['guid'] = $datarray['guid'];
|
||||||
|
|
||||||
$r = q("SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
|
$r = q("SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
|
||||||
dbesc($item_id),
|
dbesc($item_id),
|
||||||
|
@ -4329,7 +4313,7 @@ function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function atom_author($tag,$name,$uri,$h,$w,$photo) {
|
function atom_author($tag,$name,$uri,$h,$w,$photo,$geo) {
|
||||||
$o = '';
|
$o = '';
|
||||||
if(! $tag)
|
if(! $tag)
|
||||||
return $o;
|
return $o;
|
||||||
|
@ -4347,6 +4331,10 @@ function atom_author($tag,$name,$uri,$h,$w,$photo) {
|
||||||
$o .= "\t".'<link rel="avatar" type="image/jpeg" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
|
$o .= "\t".'<link rel="avatar" type="image/jpeg" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
|
||||||
|
|
||||||
if ($tag == "author") {
|
if ($tag == "author") {
|
||||||
|
|
||||||
|
if($geo)
|
||||||
|
$o .= '<georss:point>'.xmlify($geo).'</georss:point>'."\r\n";
|
||||||
|
|
||||||
$r = q("SELECT `profile`.`locality`, `profile`.`region`, `profile`.`country-name`,
|
$r = q("SELECT `profile`.`locality`, `profile`.`region`, `profile`.`country-name`,
|
||||||
`profile`.`name`, `profile`.`pub_keywords`, `profile`.`about`,
|
`profile`.`name`, `profile`.`pub_keywords`, `profile`.`about`,
|
||||||
`profile`.`homepage`,`contact`.`nick` FROM `profile`
|
`profile`.`homepage`,`contact`.`nick` FROM `profile`
|
||||||
|
@ -4410,11 +4398,11 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
|
||||||
$o = "\r\n\r\n<entry>\r\n";
|
$o = "\r\n\r\n<entry>\r\n";
|
||||||
|
|
||||||
if(is_array($author))
|
if(is_array($author))
|
||||||
$o .= atom_author('author',$author['name'],$author['url'],80,80,$author['thumb']);
|
$o .= atom_author('author',$author['name'],$author['url'],80,80,$author['thumb'], $item['coord']);
|
||||||
else
|
else
|
||||||
$o .= atom_author('author',(($item['author-name']) ? $item['author-name'] : $item['name']),(($item['author-link']) ? $item['author-link'] : $item['url']),80,80,(($item['author-avatar']) ? $item['author-avatar'] : $item['thumb']));
|
$o .= atom_author('author',(($item['author-name']) ? $item['author-name'] : $item['name']),(($item['author-link']) ? $item['author-link'] : $item['url']),80,80,(($item['author-avatar']) ? $item['author-avatar'] : $item['thumb']), $item['coord']);
|
||||||
if(strlen($item['owner-name']))
|
if(strlen($item['owner-name']))
|
||||||
$o .= atom_author('dfrn:owner',$item['owner-name'],$item['owner-link'],80,80,$item['owner-avatar']);
|
$o .= atom_author('dfrn:owner',$item['owner-name'],$item['owner-link'],80,80,$item['owner-avatar'], $item['coord']);
|
||||||
|
|
||||||
if(($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']) || (($item['thr-parent'] !== '') && ($item['thr-parent'] !== $item['uri']))) {
|
if(($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']) || (($item['thr-parent'] !== '') && ($item['thr-parent'] !== $item['uri']))) {
|
||||||
$parent = q("SELECT `guid` FROM `item` WHERE `id` = %d", intval($item["parent"]));
|
$parent = q("SELECT `guid` FROM `item` WHERE `id` = %d", intval($item["parent"]));
|
||||||
|
|
|
@ -27,7 +27,6 @@ function nav(&$a) {
|
||||||
|
|
||||||
$a->page['nav'] .= replace_macros($tpl, array(
|
$a->page['nav'] .= replace_macros($tpl, array(
|
||||||
'$baseurl' => $a->get_baseurl(),
|
'$baseurl' => $a->get_baseurl(),
|
||||||
'$langselector' => lang_selector(),
|
|
||||||
'$sitelocation' => $nav_info['sitelocation'],
|
'$sitelocation' => $nav_info['sitelocation'],
|
||||||
'$nav' => $nav_info['nav'],
|
'$nav' => $nav_info['nav'],
|
||||||
'$banner' => $nav_info['banner'],
|
'$banner' => $nav_info['banner'],
|
||||||
|
@ -138,6 +137,8 @@ function nav_info(&$a) {
|
||||||
elseif(get_config('system','community_page_style') == CP_GLOBAL_COMMUNITY)
|
elseif(get_config('system','community_page_style') == CP_GLOBAL_COMMUNITY)
|
||||||
$nav['community'] = array('community', t('Community'), "", t('Conversations on the network'));
|
$nav['community'] = array('community', t('Community'), "", t('Conversations on the network'));
|
||||||
|
|
||||||
|
$nav['events'] = Array('events', t('Events'), "", t('Events and Calendar'));
|
||||||
|
|
||||||
$nav['directory'] = array($gdirpath, t('Directory'), "", t('People directory'));
|
$nav['directory'] = array($gdirpath, t('Directory'), "", t('People directory'));
|
||||||
|
|
||||||
$nav['about'] = Array('friendica', t('Information'), "", t('Information about this friendica instance'));
|
$nav['about'] = Array('friendica', t('Information'), "", t('Information about this friendica instance'));
|
||||||
|
@ -238,6 +239,7 @@ function nav_set_selected($item){
|
||||||
'settings' => null,
|
'settings' => null,
|
||||||
'contacts' => null,
|
'contacts' => null,
|
||||||
'manage' => null,
|
'manage' => null,
|
||||||
|
'events' => null,
|
||||||
'register' => null,
|
'register' => null,
|
||||||
);
|
);
|
||||||
$a->nav_sel[$item] = 'selected';
|
$a->nav_sel[$item] = 'selected';
|
||||||
|
|
|
@ -86,10 +86,9 @@ function z_fetch_url($url,$binary = false, &$redirects = 0, $opts=array()) {
|
||||||
if(x($opts,'nobody')){
|
if(x($opts,'nobody')){
|
||||||
@curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
|
@curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
|
||||||
}
|
}
|
||||||
if(intval($timeout)) {
|
if(x($opts,'timeout')){
|
||||||
@curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
|
@curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
$curl_time = intval(get_config('system','curl_timeout'));
|
$curl_time = intval(get_config('system','curl_timeout'));
|
||||||
@curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
|
@curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
|
||||||
}
|
}
|
||||||
|
@ -309,16 +308,25 @@ function xml_status($st, $message = '') {
|
||||||
|
|
||||||
|
|
||||||
if(! function_exists('http_status_exit')) {
|
if(! function_exists('http_status_exit')) {
|
||||||
function http_status_exit($val) {
|
function http_status_exit($val, $description = array()) {
|
||||||
|
|
||||||
$err = '';
|
$err = '';
|
||||||
if($val >= 400)
|
if($val >= 400) {
|
||||||
$err = 'Error';
|
$err = 'Error';
|
||||||
|
if (!isset($description["title"]))
|
||||||
|
$description["title"] = $err." ".$val;
|
||||||
|
}
|
||||||
if($val >= 200 && $val < 300)
|
if($val >= 200 && $val < 300)
|
||||||
$err = 'OK';
|
$err = 'OK';
|
||||||
|
|
||||||
logger('http_status_exit ' . $val);
|
logger('http_status_exit ' . $val);
|
||||||
header($_SERVER["SERVER_PROTOCOL"] . ' ' . $val . ' ' . $err);
|
header($_SERVER["SERVER_PROTOCOL"] . ' ' . $val . ' ' . $err);
|
||||||
|
|
||||||
|
if (isset($description["title"])) {
|
||||||
|
$tpl = get_markup_template('http_status.tpl');
|
||||||
|
echo replace_macros($tpl, array('$title' => $description["title"],
|
||||||
|
'$description' => $description["description"]));
|
||||||
|
}
|
||||||
|
|
||||||
killme();
|
killme();
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -615,6 +615,10 @@ function notifier_run(&$argv, &$argc){
|
||||||
|
|
||||||
$interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
|
$interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
|
||||||
|
|
||||||
|
// If we are using the worker we don't need a delivery interval
|
||||||
|
if (get_config("system", "worker"))
|
||||||
|
$interval = false;
|
||||||
|
|
||||||
// delivery loop
|
// delivery loop
|
||||||
|
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
|
@ -642,8 +646,10 @@ function notifier_run(&$argv, &$argc){
|
||||||
// together into a single process. This will reduce the overall number of processes
|
// together into a single process. This will reduce the overall number of processes
|
||||||
// spawned for each delivery, but they will run longer.
|
// spawned for each delivery, but they will run longer.
|
||||||
|
|
||||||
|
// When using the workerqueue, we don't need this functionality.
|
||||||
|
|
||||||
$deliveries_per_process = intval(get_config('system','delivery_batch_count'));
|
$deliveries_per_process = intval(get_config('system','delivery_batch_count'));
|
||||||
if($deliveries_per_process <= 0)
|
if (($deliveries_per_process <= 0) OR get_config("system", "worker"))
|
||||||
$deliveries_per_process = 1;
|
$deliveries_per_process = 1;
|
||||||
|
|
||||||
$this_batch = array();
|
$this_batch = array();
|
||||||
|
@ -728,9 +734,9 @@ function notifier_run(&$argv, &$argc){
|
||||||
$ssl_policy = get_config('system','ssl_policy');
|
$ssl_policy = get_config('system','ssl_policy');
|
||||||
fix_contact_ssl_policy($x[0],$ssl_policy);
|
fix_contact_ssl_policy($x[0],$ssl_policy);
|
||||||
|
|
||||||
// If we are setup as a soapbox we aren't accepting input from this person
|
// If we are setup as a soapbox we aren't accepting top level posts from this person
|
||||||
|
|
||||||
if($x[0]['page-flags'] == PAGE_SOAPBOX)
|
if (($x[0]['page-flags'] == PAGE_SOAPBOX) AND $top_level)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
require_once('library/simplepie/simplepie.inc');
|
require_once('library/simplepie/simplepie.inc');
|
||||||
|
@ -902,11 +908,16 @@ function notifier_run(&$argv, &$argc){
|
||||||
if(! $contact['pubkey'])
|
if(! $contact['pubkey'])
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if($target_item['verb'] === ACTIVITY_DISLIKE) {
|
$unsupported_activities = array(ACTIVITY_DISLIKE, ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE);
|
||||||
// unsupported
|
|
||||||
break;
|
//don't transmit activities which are not supported by diaspora
|
||||||
|
foreach($unsupported_activities as $act) {
|
||||||
|
if(activity_match($target_item['verb'],$act)) {
|
||||||
|
break 2;
|
||||||
}
|
}
|
||||||
elseif(($target_item['deleted']) && (($target_item['uri'] === $target_item['parent-uri']) || $followup)) {
|
}
|
||||||
|
|
||||||
|
if(($target_item['deleted']) && (($target_item['uri'] === $target_item['parent-uri']) || $followup)) {
|
||||||
// send both top-level retractions and relayable retractions for owner to relay
|
// send both top-level retractions and relayable retractions for owner to relay
|
||||||
diaspora_send_retraction($target_item,$owner,$contact);
|
diaspora_send_retraction($target_item,$owner,$contact);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -157,7 +157,7 @@ function oembed_format_object($j){
|
||||||
case "rich": {
|
case "rich": {
|
||||||
// not so safe..
|
// not so safe..
|
||||||
if (!get_config("system","no_oembed_rich_content"))
|
if (!get_config("system","no_oembed_rich_content"))
|
||||||
$ret.= $jhtml;
|
$ret.= proxy_parse_html($jhtml);
|
||||||
}; break;
|
}; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -168,8 +168,18 @@ function onepoll_run(&$argv, &$argc){
|
||||||
);
|
);
|
||||||
|
|
||||||
// Update the contact entry
|
// Update the contact entry
|
||||||
if(($contact['network'] === NETWORK_OSTATUS) || ($contact['network'] === NETWORK_DIASPORA) || ($contact['network'] === NETWORK_DFRN))
|
if(($contact['network'] === NETWORK_OSTATUS) || ($contact['network'] === NETWORK_DIASPORA) || ($contact['network'] === NETWORK_DFRN)) {
|
||||||
update_contact($contact["id"]);
|
if (!poco_reachable($contact['url'])) {
|
||||||
|
logger("Skipping probably dead contact ".$contact['url']);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!update_contact($contact["id"])) {
|
||||||
|
mark_for_death($contact);
|
||||||
|
return;
|
||||||
|
} else
|
||||||
|
unmark_for_death($contact);
|
||||||
|
}
|
||||||
|
|
||||||
if($contact['network'] === NETWORK_DFRN) {
|
if($contact['network'] === NETWORK_DFRN) {
|
||||||
|
|
||||||
|
@ -360,7 +370,7 @@ function onepoll_run(&$argv, &$argc){
|
||||||
);
|
);
|
||||||
logger("Mail: Connected to " . $mailconf[0]['user']);
|
logger("Mail: Connected to " . $mailconf[0]['user']);
|
||||||
} else
|
} else
|
||||||
logger("Mail: Connection error ".$mailconf[0]['user']." ".print_r(imap_errors()));
|
logger("Mail: Connection error ".$mailconf[0]['user']." ".print_r(imap_errors(), true));
|
||||||
}
|
}
|
||||||
if($mbox) {
|
if($mbox) {
|
||||||
|
|
||||||
|
|
|
@ -702,9 +702,13 @@ function ostatus_completion($conversation_url, $uid, $item = array()) {
|
||||||
$conv_as = str_replace(',"statusnet:notice_info":', ',"statusnet_notice_info":', $conv_as);
|
$conv_as = str_replace(',"statusnet:notice_info":', ',"statusnet_notice_info":', $conv_as);
|
||||||
$conv_as = json_decode($conv_as);
|
$conv_as = json_decode($conv_as);
|
||||||
|
|
||||||
|
$no_of_items = sizeof($items);
|
||||||
|
|
||||||
if (@is_array($conv_as->items))
|
if (@is_array($conv_as->items))
|
||||||
$items = array_merge($items, $conv_as->items);
|
foreach ($conv_as->items AS $single_item)
|
||||||
else
|
$items[$single_item->id] = $single_item;
|
||||||
|
|
||||||
|
if ($no_of_items == sizeof($items))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
$pageno++;
|
$pageno++;
|
||||||
|
|
|
@ -161,3 +161,26 @@ function string_plural_select_default($n) {
|
||||||
return ($n != 1);
|
return ($n != 1);
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return installed languages as associative array
|
||||||
|
* [
|
||||||
|
* lang => lang,
|
||||||
|
* ...
|
||||||
|
* ]
|
||||||
|
*/
|
||||||
|
function get_avaiable_languages() {
|
||||||
|
$lang_choices = array();
|
||||||
|
$langs = glob('view/*/strings.php'); /**/
|
||||||
|
|
||||||
|
if(is_array($langs) && count($langs)) {
|
||||||
|
if(! in_array('view/en/strings.php',$langs))
|
||||||
|
$langs[] = 'view/en/';
|
||||||
|
asort($langs);
|
||||||
|
foreach($langs as $l) {
|
||||||
|
$t = explode("/",$l);
|
||||||
|
$lang_choices[$t[1]] = $t[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $lang_choices;
|
||||||
|
}
|
||||||
|
|
27
include/photos.php
Normal file
27
include/photos.php
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @file include/photos.php
|
||||||
|
* @brief Functions related to photo handling.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getGps($exifCoord, $hemi) {
|
||||||
|
$degrees = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
|
||||||
|
$minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
|
||||||
|
$seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;
|
||||||
|
|
||||||
|
$flip = ($hemi == 'W' or $hemi == 'S') ? -1 : 1;
|
||||||
|
|
||||||
|
return floatval($flip * ($degrees + ($minutes / 60) + ($seconds / 3600)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function gps2Num($coordPart) {
|
||||||
|
$parts = explode('/', $coordPart);
|
||||||
|
|
||||||
|
if (count($parts) <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (count($parts) == 1)
|
||||||
|
return $parts[0];
|
||||||
|
|
||||||
|
return floatval($parts[0]) / floatval($parts[1]);
|
||||||
|
}
|
|
@ -7,8 +7,8 @@ class pidfile {
|
||||||
$this->_file = "$dir/$name.pid";
|
$this->_file = "$dir/$name.pid";
|
||||||
|
|
||||||
if (file_exists($this->_file)) {
|
if (file_exists($this->_file)) {
|
||||||
$pid = trim(file_get_contents($this->_file));
|
$pid = trim(@file_get_contents($this->_file));
|
||||||
if (posix_kill($pid, 0)) {
|
if (($pid != "") AND posix_kill($pid, 0)) {
|
||||||
$this->_running = true;
|
$this->_running = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ class pidfile {
|
||||||
|
|
||||||
public function __destruct() {
|
public function __destruct() {
|
||||||
if ((! $this->_running) && file_exists($this->_file)) {
|
if ((! $this->_running) && file_exists($this->_file)) {
|
||||||
unlink($this->_file);
|
@unlink($this->_file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ class pidfile {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function running_time() {
|
public function running_time() {
|
||||||
return(time() - filectime($this->_file));
|
return(time() - @filectime($this->_file));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function kill() {
|
public function kill() {
|
||||||
|
|
|
@ -1,7 +1,17 @@
|
||||||
<?php
|
<?php
|
||||||
|
/**
|
||||||
|
* @file include/identity.php
|
||||||
|
*
|
||||||
|
* @brief Some functions to handle addons and themes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
// install and uninstall plugin
|
/**
|
||||||
|
* @brief uninstalls an addon.
|
||||||
|
*
|
||||||
|
* @param string $plugin name of the addon
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
if (! function_exists('uninstall_plugin')){
|
if (! function_exists('uninstall_plugin')){
|
||||||
function uninstall_plugin($plugin){
|
function uninstall_plugin($plugin){
|
||||||
logger("Addons: uninstalling " . $plugin);
|
logger("Addons: uninstalling " . $plugin);
|
||||||
|
@ -16,6 +26,12 @@ function uninstall_plugin($plugin){
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief installs an addon.
|
||||||
|
*
|
||||||
|
* @param string $plugin name of the addon
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
if (! function_exists('install_plugin')){
|
if (! function_exists('install_plugin')){
|
||||||
function install_plugin($plugin) {
|
function install_plugin($plugin) {
|
||||||
// silently fail if plugin was removed
|
// silently fail if plugin was removed
|
||||||
|
@ -42,7 +58,7 @@ function install_plugin($plugin) {
|
||||||
// This way the system won't fall over dead during the update.
|
// This way the system won't fall over dead during the update.
|
||||||
|
|
||||||
if(file_exists('addon/' . $plugin . '/.hidden')) {
|
if(file_exists('addon/' . $plugin . '/.hidden')) {
|
||||||
q("update addon set hidden = 1 where name = '%s'",
|
q("UPDATE `addon` SET `hidden` = 1 WHERE `name` = '%s'",
|
||||||
dbesc($plugin)
|
dbesc($plugin)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -105,10 +121,27 @@ function reload_plugins() {
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief check if addon is enabled
|
||||||
|
*
|
||||||
|
* @param string $plugin
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function plugin_enabled($plugin) {
|
||||||
|
$r = q("SELECT * FROM `addon` WHERE `installed` = 1 AND `name` = '%s'", $plugin);
|
||||||
|
return((bool)(count($r) > 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief registers a hook.
|
||||||
|
*
|
||||||
|
* @param string $hook the name of the hook
|
||||||
|
* @param string $file the name of the file that hooks into
|
||||||
|
* @param string $function the name of the function that the hook will call
|
||||||
|
* @param int $priority A priority (defaults to 0)
|
||||||
|
* @return mixed|bool
|
||||||
|
*/
|
||||||
if(! function_exists('register_hook')) {
|
if(! function_exists('register_hook')) {
|
||||||
function register_hook($hook,$file,$function,$priority=0) {
|
function register_hook($hook,$file,$function,$priority=0) {
|
||||||
|
|
||||||
|
@ -129,6 +162,14 @@ function register_hook($hook,$file,$function,$priority=0) {
|
||||||
return $r;
|
return $r;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief unregisters a hook.
|
||||||
|
*
|
||||||
|
* @param string $hook the name of the hook
|
||||||
|
* @param string $file the name of the file that hooks into
|
||||||
|
* @param string $function the name of the function that the hook called
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
if(! function_exists('unregister_hook')) {
|
if(! function_exists('unregister_hook')) {
|
||||||
function unregister_hook($hook,$file,$function) {
|
function unregister_hook($hook,$file,$function) {
|
||||||
|
|
||||||
|
@ -155,7 +196,15 @@ function load_hooks() {
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Calls a hook.
|
||||||
|
*
|
||||||
|
* Use this function when you want to be able to allow a hook to manipulate
|
||||||
|
* the provided data.
|
||||||
|
*
|
||||||
|
* @param string $name of the hook to call
|
||||||
|
* @param string|array &$data to transmit to the callback handler
|
||||||
|
*/
|
||||||
if(! function_exists('call_hooks')) {
|
if(! function_exists('call_hooks')) {
|
||||||
function call_hooks($name, &$data = null) {
|
function call_hooks($name, &$data = null) {
|
||||||
$stamp1 = microtime(true);
|
$stamp1 = microtime(true);
|
||||||
|
@ -178,7 +227,7 @@ function call_hooks($name, &$data = null) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// remove orphan hooks
|
// remove orphan hooks
|
||||||
q("delete from hook where hook = '%s' and file = '%s' and function = '%s'",
|
q("DELETE FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s'",
|
||||||
dbesc($name),
|
dbesc($name),
|
||||||
dbesc($hook[0]),
|
dbesc($hook[0]),
|
||||||
dbesc($hook[1])
|
dbesc($hook[1])
|
||||||
|
@ -204,16 +253,20 @@ function plugin_is_app($name) {
|
||||||
return false;
|
return false;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* parse plugin comment in search of plugin infos.
|
* @brief Parse plugin comment in search of plugin infos.
|
||||||
* like
|
|
||||||
*
|
*
|
||||||
* * Name: Plugin
|
* like
|
||||||
|
* \code
|
||||||
|
*...* Name: Plugin
|
||||||
* * Description: A plugin which plugs in
|
* * Description: A plugin which plugs in
|
||||||
* * Version: 1.2.3
|
* . * Version: 1.2.3
|
||||||
* * Author: John <profile url>
|
* * Author: John <profile url>
|
||||||
* * Author: Jane <email>
|
* * Author: Jane <email>
|
||||||
* *
|
* *
|
||||||
|
* *\endcode
|
||||||
|
* @param string $plugin the name of the plugin
|
||||||
|
* @return array with the plugin information
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (! function_exists('get_plugin_info')){
|
if (! function_exists('get_plugin_info')){
|
||||||
|
@ -265,16 +318,20 @@ function get_plugin_info($plugin){
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* parse theme comment in search of theme infos.
|
* @brief Parse theme comment in search of theme infos.
|
||||||
* like
|
|
||||||
*
|
*
|
||||||
* * Name: My Theme
|
* like
|
||||||
|
* \code
|
||||||
|
* ..* Name: My Theme
|
||||||
* * Description: My Cool Theme
|
* * Description: My Cool Theme
|
||||||
* * Version: 1.2.3
|
* . * Version: 1.2.3
|
||||||
* * Author: John <profile url>
|
* * Author: John <profile url>
|
||||||
* * Maintainer: Jane <profile url>
|
* * Maintainer: Jane <profile url>
|
||||||
* *
|
* *
|
||||||
|
* \endcode
|
||||||
|
* @param string $theme the name of the theme
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (! function_exists('get_theme_info')){
|
if (! function_exists('get_theme_info')){
|
||||||
|
@ -340,7 +397,14 @@ function get_theme_info($theme){
|
||||||
return $info;
|
return $info;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the theme's screenshot.
|
||||||
|
*
|
||||||
|
* The screenshot is expected as view/theme/$theme/screenshot.[png|jpg].
|
||||||
|
*
|
||||||
|
* @param sring $theme The name of the theme
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
function get_theme_screenshot($theme) {
|
function get_theme_screenshot($theme) {
|
||||||
$a = get_app();
|
$a = get_app();
|
||||||
$exts = array('.png','.jpg');
|
$exts = array('.png','.jpg');
|
||||||
|
@ -402,7 +466,7 @@ function service_class_allows($uid,$property,$usage = false) {
|
||||||
$service_class = $a->user['service_class'];
|
$service_class = $a->user['service_class'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$r = q("select service_class from user where uid = %d limit 1",
|
$r = q("SELECT `service_class` FROM `user` WHERE `uid` = %d LIMIT 1",
|
||||||
intval($uid)
|
intval($uid)
|
||||||
);
|
);
|
||||||
if($r !== false and count($r)) {
|
if($r !== false and count($r)) {
|
||||||
|
@ -432,7 +496,7 @@ function service_class_fetch($uid,$property) {
|
||||||
$service_class = $a->user['service_class'];
|
$service_class = $a->user['service_class'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$r = q("select service_class from user where uid = %d limit 1",
|
$r = q("SELECT `service_class` FROM `user` WHERE `uid` = %d LIMIT 1",
|
||||||
intval($uid)
|
intval($uid)
|
||||||
);
|
);
|
||||||
if($r !== false and count($r)) {
|
if($r !== false and count($r)) {
|
||||||
|
|
|
@ -12,7 +12,6 @@ if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) {
|
||||||
|
|
||||||
require_once("boot.php");
|
require_once("boot.php");
|
||||||
|
|
||||||
|
|
||||||
function poller_run(&$argv, &$argc){
|
function poller_run(&$argv, &$argc){
|
||||||
global $a, $db;
|
global $a, $db;
|
||||||
|
|
||||||
|
@ -27,297 +26,139 @@ function poller_run(&$argv, &$argc){
|
||||||
unset($db_host, $db_user, $db_pass, $db_data);
|
unset($db_host, $db_user, $db_pass, $db_data);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if(function_exists('sys_getloadavg')) {
|
||||||
|
$maxsysload = intval(get_config('system','maxloadavg'));
|
||||||
|
if($maxsysload < 1)
|
||||||
|
$maxsysload = 50;
|
||||||
|
|
||||||
require_once('include/session.php');
|
$load = sys_getloadavg();
|
||||||
require_once('include/datetime.php');
|
if(intval($load[0]) > $maxsysload) {
|
||||||
require_once('library/simplepie/simplepie.inc');
|
logger('system: load ' . $load[0] . ' too high. poller deferred to next scheduled run.');
|
||||||
require_once('include/items.php');
|
return;
|
||||||
require_once('include/Contact.php');
|
}
|
||||||
require_once('include/email.php');
|
}
|
||||||
require_once('include/socgraph.php');
|
|
||||||
require_once('include/pidfile.php');
|
|
||||||
require_once('mod/nodeinfo.php');
|
|
||||||
|
|
||||||
load_config('config');
|
if(($argc <= 1) OR ($argv[1] != "no_cron")) {
|
||||||
load_config('system');
|
// Run the cron job that calls all other jobs
|
||||||
|
proc_run("php","include/cron.php");
|
||||||
|
|
||||||
|
// Run the cronhooks job separately from cron for being able to use a different timing
|
||||||
|
proc_run("php","include/cronhooks.php");
|
||||||
|
|
||||||
|
// Cleaning dead processes
|
||||||
|
$r = q("SELECT DISTINCT(`pid`) FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'");
|
||||||
|
foreach($r AS $pid)
|
||||||
|
if (!posix_kill($pid["pid"], 0))
|
||||||
|
q("UPDATE `workerqueue` SET `executed` = '0000-00-00 00:00:00', `pid` = 0 WHERE `pid` = %d",
|
||||||
|
intval($pid["pid"]));
|
||||||
|
else {
|
||||||
|
// To-Do: Kill long running processes
|
||||||
|
// But: Update processes (like the database update) mustn't be killed
|
||||||
|
}
|
||||||
|
|
||||||
|
} else
|
||||||
|
// Sleep two seconds before checking for running processes to avoid having too many workers
|
||||||
|
sleep(4);
|
||||||
|
|
||||||
|
// Checking number of workers
|
||||||
|
if (poller_too_much_workers())
|
||||||
|
return;
|
||||||
|
|
||||||
|
$starttime = time();
|
||||||
|
|
||||||
|
while ($r = q("SELECT * FROM `workerqueue` WHERE `executed` = '0000-00-00 00:00:00' ORDER BY `created` LIMIT 1")) {
|
||||||
|
|
||||||
|
q("UPDATE `workerqueue` SET `executed` = '%s', `pid` = %d WHERE `id` = %d AND `executed` = '0000-00-00 00:00:00'",
|
||||||
|
dbesc(datetime_convert()),
|
||||||
|
intval(getmypid()),
|
||||||
|
intval($r[0]["id"]));
|
||||||
|
|
||||||
|
// Assure that there are no tasks executed twice
|
||||||
|
$id = q("SELECT `id` FROM `workerqueue` WHERE `id` = %d AND `pid` = %d",
|
||||||
|
intval($r[0]["id"]),
|
||||||
|
intval(getmypid()));
|
||||||
|
if (!$id) {
|
||||||
|
logger("Queue item ".$r[0]["id"]." was executed multiple times - skip this execution", LOGGER_DEBUG);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$argv = json_decode($r[0]["parameter"]);
|
||||||
|
|
||||||
|
$argc = count($argv);
|
||||||
|
|
||||||
|
// Check for existance and validity of the include file
|
||||||
|
$include = $argv[0];
|
||||||
|
|
||||||
|
if (!validate_include($include)) {
|
||||||
|
logger("Include file ".$argv[0]." is not valid!");
|
||||||
|
q("DELETE FROM `workerqueue` WHERE `id` = %d", intval($r[0]["id"]));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once($include);
|
||||||
|
|
||||||
|
$funcname=str_replace(".php", "", basename($argv[0]))."_run";
|
||||||
|
|
||||||
|
if (function_exists($funcname)) {
|
||||||
|
logger("Process ".getmypid().": ".$funcname." ".$r[0]["parameter"]);
|
||||||
|
$funcname($argv, $argc);
|
||||||
|
|
||||||
|
logger("Process ".getmypid().": ".$funcname." - done");
|
||||||
|
|
||||||
|
q("DELETE FROM `workerqueue` WHERE `id` = %d", intval($r[0]["id"]));
|
||||||
|
} else
|
||||||
|
logger("Function ".$funcname." does not exist");
|
||||||
|
|
||||||
|
// Quit the poller once every hour
|
||||||
|
if (time() > ($starttime + 3600))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Count active workers and compare them with a maximum value that depends on the load
|
||||||
|
if (poller_too_much_workers())
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function poller_too_much_workers() {
|
||||||
|
|
||||||
|
$queues = get_config("system", "worker_queues");
|
||||||
|
|
||||||
|
if ($queues == 0)
|
||||||
|
$queues = 4;
|
||||||
|
|
||||||
|
$active = poller_active_workers();
|
||||||
|
|
||||||
|
// Decrease the number of workers at higher load
|
||||||
|
if(function_exists('sys_getloadavg')) {
|
||||||
|
$load = max(sys_getloadavg());
|
||||||
|
|
||||||
$maxsysload = intval(get_config('system','maxloadavg'));
|
$maxsysload = intval(get_config('system','maxloadavg'));
|
||||||
if($maxsysload < 1)
|
if($maxsysload < 1)
|
||||||
$maxsysload = 50;
|
$maxsysload = 50;
|
||||||
if(function_exists('sys_getloadavg')) {
|
|
||||||
$load = sys_getloadavg();
|
$maxworkers = $queues;
|
||||||
if(intval($load[0]) > $maxsysload) {
|
|
||||||
logger('system: load ' . $load[0] . ' too high. Poller deferred to next scheduled run.');
|
// Some magical mathemathics to reduce the workers
|
||||||
return;
|
$exponent = 3;
|
||||||
}
|
$slope = $maxworkers / pow($maxsysload, $exponent);
|
||||||
|
$queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent));
|
||||||
|
|
||||||
|
logger("Current load: ".$load." - maximum: ".$maxsysload." - current queues: ".$active." - maximum: ".$queues, LOGGER_DEBUG);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$lockpath = get_lockpath();
|
return($active >= $queues);
|
||||||
if ($lockpath != '') {
|
|
||||||
$pidfile = new pidfile($lockpath, 'poller');
|
|
||||||
if($pidfile->is_already_running()) {
|
|
||||||
logger("poller: Already running");
|
|
||||||
if ($pidfile->running_time() > 9*60) {
|
|
||||||
$pidfile->kill();
|
|
||||||
logger("poller: killed stale process");
|
|
||||||
// Calling a new instance
|
|
||||||
proc_run('php','include/poller.php');
|
|
||||||
}
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function poller_active_workers() {
|
||||||
|
$workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'");
|
||||||
|
|
||||||
|
return($workers[0]["workers"]);
|
||||||
$a->set_baseurl(get_config('system','url'));
|
|
||||||
|
|
||||||
load_hooks();
|
|
||||||
|
|
||||||
logger('poller: start');
|
|
||||||
|
|
||||||
// run queue delivery process in the background
|
|
||||||
|
|
||||||
proc_run('php',"include/queue.php");
|
|
||||||
|
|
||||||
// run diaspora photo queue process in the background
|
|
||||||
|
|
||||||
proc_run('php',"include/dsprphotoq.php");
|
|
||||||
|
|
||||||
// run the process to discover global contacts in the background
|
|
||||||
|
|
||||||
proc_run('php',"include/discover_poco.php");
|
|
||||||
|
|
||||||
// run the process to update locally stored global contacts in the background
|
|
||||||
|
|
||||||
proc_run('php',"include/discover_poco.php", "checkcontact");
|
|
||||||
|
|
||||||
// expire any expired accounts
|
|
||||||
|
|
||||||
q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0
|
|
||||||
AND `account_expires_on` != '0000-00-00 00:00:00'
|
|
||||||
AND `account_expires_on` < UTC_TIMESTAMP() ");
|
|
||||||
|
|
||||||
// delete user and contact records for recently removed accounts
|
|
||||||
|
|
||||||
$r = q("SELECT * FROM `user` WHERE `account_removed` = 1 AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
|
|
||||||
if ($r) {
|
|
||||||
foreach($r as $user) {
|
|
||||||
q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid']));
|
|
||||||
q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid']));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$abandon_days = intval(get_config('system','account_abandon_days'));
|
|
||||||
if($abandon_days < 1)
|
|
||||||
$abandon_days = 0;
|
|
||||||
|
|
||||||
// Check OStatus conversations
|
|
||||||
// Check only conversations with mentions (for a longer time)
|
|
||||||
check_conversations(true);
|
|
||||||
|
|
||||||
// Check every conversation
|
|
||||||
check_conversations(false);
|
|
||||||
|
|
||||||
// Follow your friends from your legacy OStatus account
|
|
||||||
ostatus_check_follow_friends();
|
|
||||||
|
|
||||||
// update nodeinfo data
|
|
||||||
nodeinfo_cron();
|
|
||||||
|
|
||||||
// To-Do: Regenerate usage statistics
|
|
||||||
// q("ANALYZE TABLE `item`");
|
|
||||||
|
|
||||||
// once daily run birthday_updates and then expire in background
|
|
||||||
|
|
||||||
$d1 = get_config('system','last_expire_day');
|
|
||||||
$d2 = intval(datetime_convert('UTC','UTC','now','d'));
|
|
||||||
|
|
||||||
if($d2 != intval($d1)) {
|
|
||||||
|
|
||||||
update_contact_birthdays();
|
|
||||||
|
|
||||||
update_suggestions();
|
|
||||||
|
|
||||||
set_config('system','last_expire_day',$d2);
|
|
||||||
proc_run('php','include/expire.php');
|
|
||||||
}
|
|
||||||
|
|
||||||
$last = get_config('system','cache_last_cleared');
|
|
||||||
|
|
||||||
if($last) {
|
|
||||||
$next = $last + (3600); // Once per hour
|
|
||||||
$clear_cache = ($next <= time());
|
|
||||||
} else
|
|
||||||
$clear_cache = true;
|
|
||||||
|
|
||||||
if ($clear_cache) {
|
|
||||||
// clear old cache
|
|
||||||
Cache::clear();
|
|
||||||
|
|
||||||
// clear old item cache files
|
|
||||||
clear_cache();
|
|
||||||
|
|
||||||
// clear cache for photos
|
|
||||||
clear_cache($a->get_basepath(), $a->get_basepath()."/photo");
|
|
||||||
|
|
||||||
// clear smarty cache
|
|
||||||
clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled");
|
|
||||||
|
|
||||||
// clear cache for image proxy
|
|
||||||
if (!get_config("system", "proxy_disabled")) {
|
|
||||||
clear_cache($a->get_basepath(), $a->get_basepath()."/proxy");
|
|
||||||
|
|
||||||
$cachetime = get_config('system','proxy_cache_time');
|
|
||||||
if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME;
|
|
||||||
|
|
||||||
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
|
|
||||||
}
|
|
||||||
|
|
||||||
set_config('system','cache_last_cleared', time());
|
|
||||||
}
|
|
||||||
|
|
||||||
$manual_id = 0;
|
|
||||||
$generation = 0;
|
|
||||||
$force = false;
|
|
||||||
$restart = false;
|
|
||||||
|
|
||||||
if(($argc > 1) && ($argv[1] == 'force'))
|
|
||||||
$force = true;
|
|
||||||
|
|
||||||
if(($argc > 1) && ($argv[1] == 'restart')) {
|
|
||||||
$restart = true;
|
|
||||||
$generation = intval($argv[2]);
|
|
||||||
if(! $generation)
|
|
||||||
killme();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(($argc > 1) && intval($argv[1])) {
|
|
||||||
$manual_id = intval($argv[1]);
|
|
||||||
$force = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$interval = intval(get_config('system','poll_interval'));
|
|
||||||
if(! $interval)
|
|
||||||
$interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval')));
|
|
||||||
|
|
||||||
$sql_extra = (($manual_id) ? " AND `id` = $manual_id " : "");
|
|
||||||
|
|
||||||
reload_plugins();
|
|
||||||
|
|
||||||
$d = datetime_convert();
|
|
||||||
|
|
||||||
if(! $restart)
|
|
||||||
proc_run('php','include/cronhooks.php');
|
|
||||||
|
|
||||||
// Only poll from those with suitable relationships,
|
|
||||||
// and which have a polling address and ignore Diaspora since
|
|
||||||
// we are unable to match those posts with a Diaspora GUID and prevent duplicates.
|
|
||||||
|
|
||||||
$abandon_sql = (($abandon_days)
|
|
||||||
? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
|
|
||||||
: ''
|
|
||||||
);
|
|
||||||
|
|
||||||
$contacts = q("SELECT `contact`.`id` FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
|
|
||||||
WHERE `rel` IN (%d, %d) AND `poll` != '' AND `network` IN ('%s', '%s', '%s', '%s', '%s', '%s')
|
|
||||||
$sql_extra
|
|
||||||
AND NOT `self` AND NOT `contact`.`blocked` AND NOT `contact`.`readonly` AND NOT `contact`.`archive`
|
|
||||||
AND NOT `user`.`account_expired` AND NOT `user`.`account_removed` $abandon_sql ORDER BY RAND()",
|
|
||||||
intval(CONTACT_IS_SHARING),
|
|
||||||
intval(CONTACT_IS_FRIEND),
|
|
||||||
dbesc(NETWORK_DFRN),
|
|
||||||
dbesc(NETWORK_ZOT),
|
|
||||||
dbesc(NETWORK_OSTATUS),
|
|
||||||
dbesc(NETWORK_FEED),
|
|
||||||
dbesc(NETWORK_MAIL),
|
|
||||||
dbesc(NETWORK_MAIL2)
|
|
||||||
);
|
|
||||||
|
|
||||||
if(! count($contacts)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($contacts as $c) {
|
|
||||||
|
|
||||||
$res = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
|
|
||||||
intval($c['id'])
|
|
||||||
);
|
|
||||||
|
|
||||||
if((! $res) || (! count($res)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
foreach($res as $contact) {
|
|
||||||
|
|
||||||
$xml = false;
|
|
||||||
|
|
||||||
if($manual_id)
|
|
||||||
$contact['last-update'] = '0000-00-00 00:00:00';
|
|
||||||
|
|
||||||
if(in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS)))
|
|
||||||
$contact['priority'] = 2;
|
|
||||||
|
|
||||||
if($contact['subhub'] AND in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS))) {
|
|
||||||
// We should be getting everything via a hub. But just to be sure, let's check once a day.
|
|
||||||
// (You can make this more or less frequent if desired by setting 'pushpoll_frequency' appropriately)
|
|
||||||
// This also lets us update our subscription to the hub, and add or replace hubs in case it
|
|
||||||
// changed. We will only update hubs once a day, regardless of 'pushpoll_frequency'.
|
|
||||||
|
|
||||||
$poll_interval = get_config('system','pushpoll_frequency');
|
|
||||||
$contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
if($contact['priority'] AND !$force) {
|
|
||||||
|
|
||||||
$update = false;
|
|
||||||
|
|
||||||
$t = $contact['last-update'];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Based on $contact['priority'], should we poll this site now? Or later?
|
|
||||||
*/
|
|
||||||
|
|
||||||
switch ($contact['priority']) {
|
|
||||||
case 5:
|
|
||||||
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 month"))
|
|
||||||
$update = true;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 week"))
|
|
||||||
$update = true;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
|
|
||||||
$update = true;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 12 hour"))
|
|
||||||
$update = true;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
default:
|
|
||||||
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 hour"))
|
|
||||||
$update = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!$update)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger("Polling ".$contact["network"]." ".$contact["id"]." ".$contact["nick"]." ".$contact["name"]);
|
|
||||||
|
|
||||||
proc_run('php','include/onepoll.php',$contact['id']);
|
|
||||||
|
|
||||||
if($interval)
|
|
||||||
@time_sleep_until(microtime(true) + (float) $interval);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger('poller: end');
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_search(__file__,get_included_files())===0){
|
if (array_search(__file__,get_included_files())===0){
|
||||||
poller_run($_SERVER["argv"],$_SERVER["argc"]);
|
poller_run($_SERVER["argv"],$_SERVER["argc"]);
|
||||||
killme();
|
killme();
|
||||||
}
|
}
|
||||||
|
?>
|
||||||
|
|
|
@ -22,6 +22,7 @@ function queue_run(&$argv, &$argc){
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
require_once('include/bbcode.php');
|
require_once('include/bbcode.php');
|
||||||
require_once('include/pidfile.php');
|
require_once('include/pidfile.php');
|
||||||
|
require_once('include/socgraph.php');
|
||||||
|
|
||||||
load_config('config');
|
load_config('config');
|
||||||
load_config('system');
|
load_config('system');
|
||||||
|
@ -59,6 +60,10 @@ function queue_run(&$argv, &$argc){
|
||||||
|
|
||||||
$interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
|
$interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
|
||||||
|
|
||||||
|
// If we are using the worker we don't need a delivery interval
|
||||||
|
if (get_config("system", "worker"))
|
||||||
|
$interval = false;
|
||||||
|
|
||||||
$r = q("select * from deliverq where 1");
|
$r = q("select * from deliverq where 1");
|
||||||
if($r) {
|
if($r) {
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
|
@ -137,6 +142,12 @@ function queue_run(&$argv, &$argc){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!poco_reachable($c[0]['url'])) {
|
||||||
|
logger('queue: skipping probably dead url: ' . $c[0]['url']);
|
||||||
|
update_queue_time($q_item['id']);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
|
$u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
|
||||||
FROM `user` WHERE `uid` = %d LIMIT 1",
|
FROM `user` WHERE `uid` = %d LIMIT 1",
|
||||||
intval($c[0]['uid'])
|
intval($c[0]['uid'])
|
||||||
|
|
|
@ -225,15 +225,17 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
|
||||||
$created = $x[0]["created"];
|
$created = $x[0]["created"];
|
||||||
$server_url = $x[0]["server_url"];
|
$server_url = $x[0]["server_url"];
|
||||||
$nick = $x[0]["nick"];
|
$nick = $x[0]["nick"];
|
||||||
|
$addr = $x[0]["addr"];
|
||||||
} else {
|
} else {
|
||||||
$created = "0000-00-00 00:00:00";
|
$created = "0000-00-00 00:00:00";
|
||||||
$server_url = "";
|
$server_url = "";
|
||||||
|
|
||||||
$urlparts = parse_url($profile_url);
|
$urlparts = parse_url($profile_url);
|
||||||
$nick = end(explode("/", $urlparts["path"]));
|
$nick = end(explode("/", $urlparts["path"]));
|
||||||
|
$addr = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((($network == "") OR ($name == "") OR ($profile_photo == "") OR ($server_url == "") OR $alternate)
|
if ((($network == "") OR ($name == "") OR ($addr == "") OR ($profile_photo == "") OR ($server_url == "") OR $alternate)
|
||||||
AND poco_reachable($profile_url, $server_url, $network, false)) {
|
AND poco_reachable($profile_url, $server_url, $network, false)) {
|
||||||
$data = probe_url($profile_url);
|
$data = probe_url($profile_url);
|
||||||
|
|
||||||
|
@ -242,6 +244,7 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
|
||||||
$network = $data["network"];
|
$network = $data["network"];
|
||||||
$name = $data["name"];
|
$name = $data["name"];
|
||||||
$nick = $data["nick"];
|
$nick = $data["nick"];
|
||||||
|
$addr = $data["addr"];
|
||||||
$profile_url = $data["url"];
|
$profile_url = $data["url"];
|
||||||
$profile_photo = $data["photo"];
|
$profile_photo = $data["photo"];
|
||||||
$server_url = $data["baseurl"];
|
$server_url = $data["baseurl"];
|
||||||
|
@ -294,14 +297,18 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
|
||||||
if (($keywords == "") AND ($x[0]['keywords'] != ""))
|
if (($keywords == "") AND ($x[0]['keywords'] != ""))
|
||||||
$keywords = $x[0]['keywords'];
|
$keywords = $x[0]['keywords'];
|
||||||
|
|
||||||
|
if (($addr == "") AND ($x[0]['addr'] != ""))
|
||||||
|
$addr = $x[0]['addr'];
|
||||||
|
|
||||||
if (($generation == 0) AND ($x[0]['generation'] > 0))
|
if (($generation == 0) AND ($x[0]['generation'] > 0))
|
||||||
$generation = $x[0]['generation'];
|
$generation = $x[0]['generation'];
|
||||||
|
|
||||||
if($x[0]['name'] != $name || $x[0]['photo'] != $profile_photo || $x[0]['updated'] < $updated) {
|
if($x[0]['name'] != $name || $x[0]['photo'] != $profile_photo || $x[0]['updated'] < $updated) {
|
||||||
q("UPDATE `gcontact` SET `name` = '%s', `network` = '%s', `photo` = '%s', `connect` = '%s', `url` = '%s', `server_url` = '%s',
|
q("UPDATE `gcontact` SET `name` = '%s', `addr` = '%s', `network` = '%s', `photo` = '%s', `connect` = '%s', `url` = '%s', `server_url` = '%s',
|
||||||
`updated` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s', `generation` = %d
|
`updated` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s', `generation` = %d
|
||||||
WHERE (`generation` >= %d OR `generation` = 0) AND `nurl` = '%s'",
|
WHERE (`generation` >= %d OR `generation` = 0) AND `nurl` = '%s'",
|
||||||
dbesc($name),
|
dbesc($name),
|
||||||
|
dbesc($addr),
|
||||||
dbesc($network),
|
dbesc($network),
|
||||||
dbesc($profile_photo),
|
dbesc($profile_photo),
|
||||||
dbesc($connect_url),
|
dbesc($connect_url),
|
||||||
|
@ -318,10 +325,11 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
q("INSERT INTO `gcontact` (`name`, `nick`, `network`, `url`, `nurl`, `photo`, `connect`, `server_url`, `created`, `updated`, `location`, `about`, `keywords`, `gender`, `generation`)
|
q("INSERT INTO `gcontact` (`name`, `nick`, `addr`, `network`, `url`, `nurl`, `photo`, `connect`, `server_url`, `created`, `updated`, `location`, `about`, `keywords`, `gender`, `generation`)
|
||||||
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)",
|
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)",
|
||||||
dbesc($name),
|
dbesc($name),
|
||||||
dbesc($nick),
|
dbesc($nick),
|
||||||
|
dbesc($addr),
|
||||||
dbesc($network),
|
dbesc($network),
|
||||||
dbesc($profile_url),
|
dbesc($profile_url),
|
||||||
dbesc(normalise_link($profile_url)),
|
dbesc(normalise_link($profile_url)),
|
||||||
|
@ -570,7 +578,7 @@ function poco_last_updated($profile, $force = false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (($data["poll"] == "") OR ($data["network"] == NETWORK_FEED)) {
|
if (($data["poll"] == "") OR (in_array($data["network"], array(NETWORK_FEED, NETWORK_PHANTOM)))) {
|
||||||
q("UPDATE `gcontact` SET `last_failure` = '%s' WHERE `nurl` = '%s'",
|
q("UPDATE `gcontact` SET `last_failure` = '%s' WHERE `nurl` = '%s'",
|
||||||
dbesc(datetime_convert()), dbesc(normalise_link($profile)));
|
dbesc(datetime_convert()), dbesc(normalise_link($profile)));
|
||||||
return false;
|
return false;
|
||||||
|
@ -748,8 +756,11 @@ function poco_check_server($server_url, $network = "", $force = false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$serverret["success"] OR ($serverret["body"] == "") OR (sizeof($xmlobj) == 0) OR !is_object($xmlobj)) {
|
if (!$serverret["success"] OR ($serverret["body"] == "") OR (sizeof($xmlobj) == 0) OR !is_object($xmlobj)) {
|
||||||
|
// Workaround for bad configured servers (known nginx problem)
|
||||||
|
if ($serverret["debug"]["http_code"] != "403") {
|
||||||
$last_failure = datetime_convert();
|
$last_failure = datetime_convert();
|
||||||
$failure = true;
|
$failure = true;
|
||||||
|
}
|
||||||
} elseif ($network == NETWORK_DIASPORA)
|
} elseif ($network == NETWORK_DIASPORA)
|
||||||
$last_contact = datetime_convert();
|
$last_contact = datetime_convert();
|
||||||
|
|
||||||
|
@ -1036,8 +1047,9 @@ function count_common_friends($uid,$cid) {
|
||||||
|
|
||||||
$r = q("SELECT count(*) as `total`
|
$r = q("SELECT count(*) as `total`
|
||||||
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
|
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
|
||||||
where `glink`.`cid` = %d and `glink`.`uid` = %d
|
WHERE `glink`.`cid` = %d AND `glink`.`uid` = %d AND
|
||||||
and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d ) ",
|
((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))
|
||||||
|
AND `gcontact`.`nurl` IN (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d ) ",
|
||||||
intval($cid),
|
intval($cid),
|
||||||
intval($uid),
|
intval($uid),
|
||||||
intval($uid),
|
intval($uid),
|
||||||
|
@ -1059,11 +1071,15 @@ function common_friends($uid,$cid,$start = 0,$limit=9999,$shuffle = false) {
|
||||||
else
|
else
|
||||||
$sql_extra = " order by `gcontact`.`name` asc ";
|
$sql_extra = " order by `gcontact`.`name` asc ";
|
||||||
|
|
||||||
$r = q("SELECT `gcontact`.*
|
$r = q("SELECT `gcontact`.*, `contact`.`id` AS `cid`
|
||||||
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
|
FROM `glink`
|
||||||
where `glink`.`cid` = %d and `glink`.`uid` = %d
|
INNER JOIN `gcontact` ON `glink`.`gcid` = `gcontact`.`id`
|
||||||
and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d )
|
INNER JOIN `contact` ON `gcontact`.`nurl` = `contact`.`nurl`
|
||||||
$sql_extra limit %d, %d",
|
WHERE `glink`.`cid` = %d and `glink`.`uid` = %d
|
||||||
|
AND `contact`.`uid` = %d AND `contact`.`self` = 0 AND `contact`.`blocked` = 0
|
||||||
|
AND `contact`.`hidden` = 0 AND `contact`.`id` != %d
|
||||||
|
AND ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))
|
||||||
|
$sql_extra LIMIT %d, %d",
|
||||||
intval($cid),
|
intval($cid),
|
||||||
intval($uid),
|
intval($uid),
|
||||||
intval($uid),
|
intval($uid),
|
||||||
|
@ -1120,7 +1136,8 @@ function count_all_friends($uid,$cid) {
|
||||||
|
|
||||||
$r = q("SELECT count(*) as `total`
|
$r = q("SELECT count(*) as `total`
|
||||||
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
|
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
|
||||||
where `glink`.`cid` = %d and `glink`.`uid` = %d ",
|
where `glink`.`cid` = %d and `glink`.`uid` = %d AND
|
||||||
|
((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))",
|
||||||
intval($cid),
|
intval($cid),
|
||||||
intval($uid)
|
intval($uid)
|
||||||
);
|
);
|
||||||
|
@ -1134,10 +1151,14 @@ function count_all_friends($uid,$cid) {
|
||||||
|
|
||||||
function all_friends($uid,$cid,$start = 0, $limit = 80) {
|
function all_friends($uid,$cid,$start = 0, $limit = 80) {
|
||||||
|
|
||||||
$r = q("SELECT `gcontact`.*
|
$r = q("SELECT `gcontact`.*, `contact`.`id` AS `cid`
|
||||||
FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
|
FROM `glink`
|
||||||
where `glink`.`cid` = %d and `glink`.`uid` = %d
|
INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
|
||||||
order by `gcontact`.`name` asc LIMIT %d, %d ",
|
LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl` AND `contact`.`uid` = %d
|
||||||
|
WHERE `glink`.`cid` = %d AND `glink`.`uid` = %d AND
|
||||||
|
((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))
|
||||||
|
ORDER BY `gcontact`.`name` ASC LIMIT %d, %d ",
|
||||||
|
intval($uid),
|
||||||
intval($cid),
|
intval($cid),
|
||||||
intval($uid),
|
intval($uid),
|
||||||
intval($start),
|
intval($start),
|
||||||
|
|
|
@ -21,6 +21,10 @@ function replace_macros($s,$r) {
|
||||||
|
|
||||||
$a = get_app();
|
$a = get_app();
|
||||||
|
|
||||||
|
// pass $baseurl to all templates
|
||||||
|
$r['$baseurl'] = $a->get_baseurl();
|
||||||
|
|
||||||
|
|
||||||
$t = $a->template_engine();
|
$t = $a->template_engine();
|
||||||
try {
|
try {
|
||||||
$output = $t->replace_macros($s,$r);
|
$output = $t->replace_macros($s,$r);
|
||||||
|
@ -970,7 +974,7 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
|
||||||
. (($click) ? ' fakelink' : '') . '" '
|
. (($click) ? ' fakelink' : '') . '" '
|
||||||
. (($redir) ? ' target="redir" ' : '')
|
. (($redir) ? ' target="redir" ' : '')
|
||||||
. (($url) ? ' href="' . $url . '"' : '') . $click . ' ><img class="contact-block-img' . $class . $sparkle . '" src="'
|
. (($url) ? ' href="' . $url . '"' : '') . $click . ' ><img class="contact-block-img' . $class . $sparkle . '" src="'
|
||||||
. proxy_url($contact['micro']) . '" title="' . $contact['name'] . ' [' . $contact['url'] . ']" alt="' . $contact['name']
|
. proxy_url($contact['micro'], false, PROXY_SIZE_THUMB) . '" title="' . $contact['name'] . ' [' . $contact['url'] . ']" alt="' . $contact['name']
|
||||||
. '" /></a></div>' . "\r\n";
|
. '" /></a></div>' . "\r\n";
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
@ -1020,8 +1024,9 @@ if(! function_exists('valid_email')) {
|
||||||
*/
|
*/
|
||||||
function valid_email($x){
|
function valid_email($x){
|
||||||
|
|
||||||
if(get_config('system','disable_email_validation'))
|
// Removed because Fabio told me so.
|
||||||
return true;
|
//if(get_config('system','disable_email_validation'))
|
||||||
|
// return true;
|
||||||
|
|
||||||
if(preg_match('/^[_a-zA-Z0-9\-\+]+(\.[_a-zA-Z0-9\-\+]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/',$x))
|
if(preg_match('/^[_a-zA-Z0-9\-\+]+(\.[_a-zA-Z0-9\-\+]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/',$x))
|
||||||
return true;
|
return true;
|
||||||
|
@ -1410,9 +1415,6 @@ function prepare_body(&$item,$attach = false, $preview = false) {
|
||||||
put_item_in_cache($item, true);
|
put_item_in_cache($item, true);
|
||||||
$s = $item["rendered-html"];
|
$s = $item["rendered-html"];
|
||||||
|
|
||||||
require_once("mod/proxy.php");
|
|
||||||
$s = proxy_parse_html($s);
|
|
||||||
|
|
||||||
$prep_arr = array('item' => $item, 'html' => $s, 'preview' => $preview);
|
$prep_arr = array('item' => $item, 'html' => $s, 'preview' => $preview);
|
||||||
call_hooks('prepare_body', $prep_arr);
|
call_hooks('prepare_body', $prep_arr);
|
||||||
$s = $prep_arr['html'];
|
$s = $prep_arr['html'];
|
||||||
|
@ -1741,50 +1743,6 @@ function unamp($s) {
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(! function_exists('lang_selector')) {
|
|
||||||
/**
|
|
||||||
* get html for language selector
|
|
||||||
* @global string $lang
|
|
||||||
* @return string
|
|
||||||
* @template lang_selector.tpl
|
|
||||||
*/
|
|
||||||
function lang_selector() {
|
|
||||||
global $lang;
|
|
||||||
|
|
||||||
$langs = glob('view/*/strings.php');
|
|
||||||
|
|
||||||
$lang_options = array();
|
|
||||||
$selected = "";
|
|
||||||
|
|
||||||
if(is_array($langs) && count($langs)) {
|
|
||||||
$langs[] = '';
|
|
||||||
if(! in_array('view/en/strings.php',$langs))
|
|
||||||
$langs[] = 'view/en/';
|
|
||||||
asort($langs);
|
|
||||||
foreach($langs as $l) {
|
|
||||||
if($l == '') {
|
|
||||||
$lang_options[""] = t('default');
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$ll = substr($l,5);
|
|
||||||
$ll = substr($ll,0,strrpos($ll,'/'));
|
|
||||||
$selected = (($ll === $lang && (x($_SESSION, 'language'))) ? $ll : $selected);
|
|
||||||
$lang_options[$ll]=$ll;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$tpl = get_markup_template("lang_selector.tpl");
|
|
||||||
$o = replace_macros($tpl, array(
|
|
||||||
'$title' => t('Select an alternate language'),
|
|
||||||
'$langs' => array($lang_options, $selected),
|
|
||||||
|
|
||||||
));
|
|
||||||
return $o;
|
|
||||||
}}
|
|
||||||
|
|
||||||
|
|
||||||
if(! function_exists('return_bytes')) {
|
if(! function_exists('return_bytes')) {
|
||||||
/**
|
/**
|
||||||
* return number of bytes in size (K, M, G)
|
* return number of bytes in size (K, M, G)
|
||||||
|
|
113
include/update_gcontact.php
Normal file
113
include/update_gcontact.php
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once("boot.php");
|
||||||
|
|
||||||
|
function update_gcontact_run(&$argv, &$argc){
|
||||||
|
global $a, $db;
|
||||||
|
|
||||||
|
if(is_null($a)) {
|
||||||
|
$a = new App;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_null($db)) {
|
||||||
|
@include(".htconfig.php");
|
||||||
|
require_once("include/dba.php");
|
||||||
|
$db = new dba($db_host, $db_user, $db_pass, $db_data);
|
||||||
|
unset($db_host, $db_user, $db_pass, $db_data);
|
||||||
|
};
|
||||||
|
|
||||||
|
require_once('include/pidfile.php');
|
||||||
|
require_once('include/Scrape.php');
|
||||||
|
require_once("include/socgraph.php");
|
||||||
|
|
||||||
|
load_config('config');
|
||||||
|
load_config('system');
|
||||||
|
|
||||||
|
$a->set_baseurl(get_config('system','url'));
|
||||||
|
|
||||||
|
load_hooks();
|
||||||
|
|
||||||
|
logger('update_gcontact: start');
|
||||||
|
|
||||||
|
if(($argc > 1) && (intval($argv[1])))
|
||||||
|
$contact_id = intval($argv[1]);
|
||||||
|
|
||||||
|
if(!$contact_id) {
|
||||||
|
logger('update_gcontact: no contact');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lockpath = get_lockpath();
|
||||||
|
if ($lockpath != '') {
|
||||||
|
$pidfile = new pidfile($lockpath, 'update_gcontact'.$contact_id);
|
||||||
|
if ($pidfile->is_already_running()) {
|
||||||
|
logger("update_gcontact: Already running for contact ".$contact_id);
|
||||||
|
if ($pidfile->running_time() > 9*60) {
|
||||||
|
$pidfile->kill();
|
||||||
|
logger("killed stale process");
|
||||||
|
}
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$r = q("SELECT * FROM `gcontact` WHERE `id` = %d", intval($contact_id));
|
||||||
|
|
||||||
|
if (!$r)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
$data = probe_url($r[0]["url"]);
|
||||||
|
|
||||||
|
if (!in_array($data["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
|
||||||
|
if ($r[0]["server_url"] != "")
|
||||||
|
poco_check_server($r[0]["server_url"], $r[0]["network"]);
|
||||||
|
|
||||||
|
q("UPDATE `gcontact` SET `last_failure` = '%s' WHERE `id` = %d",
|
||||||
|
dbesc(datetime_convert()), intval($contact_id));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($data["name"] == "") AND ($r[0]['name'] != ""))
|
||||||
|
$data["name"] = $r[0]['name'];
|
||||||
|
|
||||||
|
if (($data["nick"] == "") AND ($r[0]['nick'] != ""))
|
||||||
|
$data["nick"] = $r[0]['nick'];
|
||||||
|
|
||||||
|
if (($data["addr"] == "") AND ($r[0]['addr'] != ""))
|
||||||
|
$data["addr"] = $r[0]['addr'];
|
||||||
|
|
||||||
|
if (($data["photo"] == "") AND ($r[0]['photo'] != ""))
|
||||||
|
$data["photo"] = $r[0]['photo'];
|
||||||
|
|
||||||
|
|
||||||
|
q("UPDATE `gcontact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', `photo` = '%s'
|
||||||
|
WHERE `id` = %d",
|
||||||
|
dbesc($data["name"]),
|
||||||
|
dbesc($data["nick"]),
|
||||||
|
dbesc($data["addr"]),
|
||||||
|
dbesc($data["photo"]),
|
||||||
|
intval($contact_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', `photo` = '%s'
|
||||||
|
WHERE `uid` = 0 AND `addr` = '' AND `nurl` = '%s'",
|
||||||
|
dbesc($data["name"]),
|
||||||
|
dbesc($data["nick"]),
|
||||||
|
dbesc($data["addr"]),
|
||||||
|
dbesc($data["photo"]),
|
||||||
|
dbesc(normalise_link($data["url"]))
|
||||||
|
);
|
||||||
|
|
||||||
|
q("UPDATE `contact` SET `addr` = '%s'
|
||||||
|
WHERE `uid` != 0 AND `addr` = '' AND `nurl` = '%s'",
|
||||||
|
dbesc($data["addr"]),
|
||||||
|
dbesc(normalise_link($data["url"]))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_search(__file__,get_included_files())===0){
|
||||||
|
update_gcontact_run($_SERVER["argv"],$_SERVER["argc"]);
|
||||||
|
killme();
|
||||||
|
}
|
12
index.php
12
index.php
|
@ -102,13 +102,13 @@ session_start();
|
||||||
* Language was set earlier, but we can over-ride it in the session.
|
* Language was set earlier, but we can over-ride it in the session.
|
||||||
* We have to do it here because the session was just now opened.
|
* We have to do it here because the session was just now opened.
|
||||||
*/
|
*/
|
||||||
|
if (x($_SESSION,'authenticated') && !x($_SESSION,'language')) {
|
||||||
if(array_key_exists('system_language',$_POST)) {
|
// we didn't loaded user data yet, but we need user language
|
||||||
if(strlen($_POST['system_language']))
|
$r = q("SELECT language FROM user WHERE uid=%d", intval($_SESSION['uid']));
|
||||||
$_SESSION['language'] = $_POST['system_language'];
|
$_SESSION['language'] = $lang;
|
||||||
else
|
if (count($r)>0) $_SESSION['language'] = $r[0]['language'];
|
||||||
unset($_SESSION['language']);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if((x($_SESSION,'language')) && ($_SESSION['language'] !== $lang)) {
|
if((x($_SESSION,'language')) && ($_SESSION['language'] !== $lang)) {
|
||||||
$lang = $_SESSION['language'];
|
$lang = $_SESSION['language'];
|
||||||
load_translation_table($lang);
|
load_translation_table($lang);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/**
|
/**
|
||||||
* Filebrowser - Friendica Communications Server
|
* Filebrowser - Friendica Communications Server
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010-2013 the Friendica Project
|
* Copyright (c) 2010-2015 the Friendica Project
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
@ -13,14 +13,14 @@
|
||||||
*
|
*
|
||||||
* To load filebrowser in colorbox, call
|
* To load filebrowser in colorbox, call
|
||||||
*
|
*
|
||||||
* $.colorbox({href: ulr, iframe:true,innerWidth:'500px',innerHeight:'400px'})
|
* Dialog.doImageBrowser(eventname, id);
|
||||||
*
|
*
|
||||||
* where url is:
|
* or
|
||||||
*
|
*
|
||||||
* <baseurl>/fbrowser/<type>/?mode=minimal[#<eventname>-<id>]
|
* Dialog.doFileBrowser(eventname, id);
|
||||||
|
*
|
||||||
|
* where:
|
||||||
*
|
*
|
||||||
* baseurl: baseurl from friendica
|
|
||||||
* type: one of "image", "file"
|
|
||||||
* eventname: event name to catch return value
|
* eventname: event name to catch return value
|
||||||
* id: id returned to event handler
|
* id: id returned to event handler
|
||||||
*
|
*
|
||||||
|
@ -29,17 +29,18 @@
|
||||||
*
|
*
|
||||||
* fbrowser.<type>.[<eventname>]
|
* fbrowser.<type>.[<eventname>]
|
||||||
*
|
*
|
||||||
* with params:
|
* <type> will be one of "image" or "file", and the event handler will
|
||||||
|
* get the following params:
|
||||||
*
|
*
|
||||||
* filemane: filename of item choosed by user
|
* filemane: filename of item choosed by user
|
||||||
* embed: bbcode to embed element into posts
|
* embed: bbcode to embed element into posts
|
||||||
* id: id from url
|
* id: id from caller code
|
||||||
*
|
*
|
||||||
* example:
|
* example:
|
||||||
*
|
*
|
||||||
* // open dialog for select an image for a textarea with id "myeditor"
|
* // open dialog for select an image for a textarea with id "myeditor"
|
||||||
* var id="myeditor";
|
* var id="myeditor";
|
||||||
* $.colorbox({href: baseurl + "/fbrowser/image/?mode=minimal#example-"+id, iframe:true,innerWidth:'500px',innerHeight:'400px'})
|
* Dialog.doImageBrowser("example", id);
|
||||||
*
|
*
|
||||||
* // setup event handler to get user selection
|
* // setup event handler to get user selection
|
||||||
* $("body").on("fbrowser.image.example", function(event, filename, bbcode, id) {
|
* $("body").on("fbrowser.image.example", function(event, filename, bbcode, id) {
|
||||||
|
|
78
js/main.js
78
js/main.js
|
@ -65,10 +65,9 @@
|
||||||
var bbcode = o.data('bbcode');
|
var bbcode = o.data('bbcode');
|
||||||
var id = o.data('id');
|
var id = o.data('id');
|
||||||
if (bbcode=="img") {
|
if (bbcode=="img") {
|
||||||
$.colorbox({href: baseurl + "/fbrowser/image/?mode=minimal#comment-"+id, iframe:true,innerWidth:'500px',innerHeight:'400px'})
|
Dialog.doImageBrowser("comment", id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
insertFormatting(comment, bbcode, id);
|
insertFormatting(comment, bbcode, id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -154,7 +153,7 @@
|
||||||
var notifications_empty = unescape($("#nav-notifications-menu").html());
|
var notifications_empty = unescape($("#nav-notifications-menu").html());
|
||||||
|
|
||||||
/* nav update event */
|
/* nav update event */
|
||||||
$('nav').bind('nav-update', function(e,data){;
|
$('nav').bind('nav-update', function(e,data){
|
||||||
var invalid = $(data).find('invalid').text();
|
var invalid = $(data).find('invalid').text();
|
||||||
if(invalid == 1) { window.location.href=window.location.href }
|
if(invalid == 1) { window.location.href=window.location.href }
|
||||||
|
|
||||||
|
@ -204,6 +203,13 @@
|
||||||
var birthdaystoday = $(data).find('birthdays-today').text();
|
var birthdaystoday = $(data).find('birthdays-today').text();
|
||||||
if(birthdaystoday == 0) { $('#birthdays-update').removeClass('notif-birthdays-today') } else { $('#birthdays-update').addClass('notif-birthdays-today') }
|
if(birthdaystoday == 0) { $('#birthdays-update').removeClass('notif-birthdays-today') } else { $('#birthdays-update').addClass('notif-birthdays-today') }
|
||||||
|
|
||||||
|
$(".sidebar-group-li .notify").removeClass("show");
|
||||||
|
$(data).find("group").each(function() {
|
||||||
|
var gid = this.id;
|
||||||
|
var gcount = this.innerHTML;
|
||||||
|
$(".group-"+gid+" .notify").addClass("show").text(gcount);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
var eNotif = $(data).find('notif')
|
var eNotif = $(data).find('notif')
|
||||||
|
|
||||||
|
@ -614,7 +620,6 @@
|
||||||
$("#comment-edit-form-" + id).serialize(),
|
$("#comment-edit-form-" + id).serialize(),
|
||||||
function(data) {
|
function(data) {
|
||||||
if(data.preview) {
|
if(data.preview) {
|
||||||
|
|
||||||
$("#comment-edit-preview-" + id).html(data.preview);
|
$("#comment-edit-preview-" + id).html(data.preview);
|
||||||
$("#comment-edit-preview-" + id + " a").click(function() { return false; });
|
$("#comment-edit-preview-" + id + " a").click(function() { return false; });
|
||||||
}
|
}
|
||||||
|
@ -826,3 +831,68 @@ function getNotificationPermission() {
|
||||||
return Notification.permission;
|
return Notification.permission;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show a dialog loaded from an url
|
||||||
|
* By defaults this load the url in an iframe in colorbox
|
||||||
|
* Themes can overwrite `show()` function to personalize it
|
||||||
|
*/
|
||||||
|
var Dialog = {
|
||||||
|
/**
|
||||||
|
* Show the dialog
|
||||||
|
*
|
||||||
|
* @param string url
|
||||||
|
* @return object colorbox
|
||||||
|
*/
|
||||||
|
show : function (url) {
|
||||||
|
var size = Dialog._get_size();
|
||||||
|
return $.colorbox({href: url, iframe:true,innerWidth: size.width+'px',innerHeight: size.height+'px'})
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the Image browser dialog
|
||||||
|
*
|
||||||
|
* @param string name
|
||||||
|
* @param string id (optional)
|
||||||
|
* @return object
|
||||||
|
*
|
||||||
|
* The name will be used to build the event name
|
||||||
|
* fired by image browser dialog when the user select
|
||||||
|
* an image. The optional id will be passed as argument
|
||||||
|
* to the event handler
|
||||||
|
*/
|
||||||
|
doImageBrowser : function (name, id) {
|
||||||
|
var url = Dialog._get_url("image",name,id);
|
||||||
|
return Dialog.show(url);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the File browser dialog
|
||||||
|
*
|
||||||
|
* @param string name
|
||||||
|
* @param string id (optional)
|
||||||
|
* @return object
|
||||||
|
*
|
||||||
|
* The name will be used to build the event name
|
||||||
|
* fired by file browser dialog when the user select
|
||||||
|
* a file. The optional id will be passed as argument
|
||||||
|
* to the event handler
|
||||||
|
*/
|
||||||
|
doFileBrowser : function (name, id) {
|
||||||
|
var url = Dialog._get_url("file",name,id);
|
||||||
|
return Dialog.show(url);
|
||||||
|
},
|
||||||
|
|
||||||
|
_get_url : function(type, name, id) {
|
||||||
|
var hash = name;
|
||||||
|
if (id !== undefined) hash = hash + "-" + id;
|
||||||
|
return baseurl + "/fbrowser/"+type+"/?mode=minimal#"+hash;
|
||||||
|
},
|
||||||
|
|
||||||
|
_get_size: function() {
|
||||||
|
return {
|
||||||
|
width: window.innerWidth-50,
|
||||||
|
height: window.innerHeight-100
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -47,12 +47,35 @@ function admin_post(&$a){
|
||||||
return; // NOTREACHED
|
return; // NOTREACHED
|
||||||
break;
|
break;
|
||||||
case 'themes':
|
case 'themes':
|
||||||
|
if ($a->argc < 2) {
|
||||||
|
if(is_ajax()) return;
|
||||||
|
goaway($a->get_baseurl(true) . '/admin/' );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$theme = $a->argv[2];
|
$theme = $a->argv[2];
|
||||||
if (is_file("view/theme/$theme/config.php")){
|
if (is_file("view/theme/$theme/config.php")){
|
||||||
|
function __call_theme_admin_post(&$a, $theme) {
|
||||||
|
$orig_theme = $a->theme;
|
||||||
|
$orig_page = $a->page;
|
||||||
|
$orig_session_theme = $_SESSION['theme'];
|
||||||
|
require_once("view/theme/$theme/theme.php");
|
||||||
require_once("view/theme/$theme/config.php");
|
require_once("view/theme/$theme/config.php");
|
||||||
|
$_SESSION['theme'] = $theme;
|
||||||
|
|
||||||
|
|
||||||
|
$init = $theme."_init";
|
||||||
|
if(function_exists($init)) $init($a);
|
||||||
if(function_exists("theme_admin_post")){
|
if(function_exists("theme_admin_post")){
|
||||||
theme_admin_post($a);
|
$admin_form = theme_admin_post($a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$_SESSION['theme'] = $orig_session_theme;
|
||||||
|
$a->theme = $orig_theme;
|
||||||
|
$a->page = $orig_page;
|
||||||
|
return $admin_form;
|
||||||
|
}
|
||||||
|
__call_theme_admin_post($a, $theme);
|
||||||
}
|
}
|
||||||
info(t('Theme settings updated.'));
|
info(t('Theme settings updated.'));
|
||||||
if(is_ajax()) return;
|
if(is_ajax()) return;
|
||||||
|
@ -112,7 +135,7 @@ function admin_content(&$a) {
|
||||||
|
|
||||||
/* get plugins admin page */
|
/* get plugins admin page */
|
||||||
|
|
||||||
$r = q("SELECT name FROM `addon` WHERE `plugin_admin`=1");
|
$r = q("SELECT `name` FROM `addon` WHERE `plugin_admin`=1 ORDER BY `name`");
|
||||||
$aside['plugins_admin']=Array();
|
$aside['plugins_admin']=Array();
|
||||||
foreach ($r as $h){
|
foreach ($r as $h){
|
||||||
$plugin =$h['name'];
|
$plugin =$h['name'];
|
||||||
|
@ -416,6 +439,11 @@ function admin_page_site_post(&$a){
|
||||||
$rino = ((x($_POST,'rino')) ? intval($_POST['rino']) : 0);
|
$rino = ((x($_POST,'rino')) ? intval($_POST['rino']) : 0);
|
||||||
$embedly = ((x($_POST,'embedly')) ? notags(trim($_POST['embedly'])) : '');
|
$embedly = ((x($_POST,'embedly')) ? notags(trim($_POST['embedly'])) : '');
|
||||||
|
|
||||||
|
if ($a->get_path() != "")
|
||||||
|
$diaspora_enabled = false;
|
||||||
|
|
||||||
|
if (!$thread_allow)
|
||||||
|
$ostatus_disabled = true;
|
||||||
|
|
||||||
if($ssl_policy != intval(get_config('system','ssl_policy'))) {
|
if($ssl_policy != intval(get_config('system','ssl_policy'))) {
|
||||||
if($ssl_policy == SSL_POLICY_FULL) {
|
if($ssl_policy == SSL_POLICY_FULL) {
|
||||||
|
@ -535,6 +563,7 @@ function admin_page_site_post(&$a){
|
||||||
set_config('system','ostatus_disabled', $ostatus_disabled);
|
set_config('system','ostatus_disabled', $ostatus_disabled);
|
||||||
set_config('system','ostatus_poll_interval', $ostatus_poll_interval);
|
set_config('system','ostatus_poll_interval', $ostatus_poll_interval);
|
||||||
set_config('system','diaspora_enabled', $diaspora_enabled);
|
set_config('system','diaspora_enabled', $diaspora_enabled);
|
||||||
|
|
||||||
set_config('config','private_addons', $private_addons);
|
set_config('config','private_addons', $private_addons);
|
||||||
|
|
||||||
set_config('system','force_ssl', $force_ssl);
|
set_config('system','force_ssl', $force_ssl);
|
||||||
|
@ -574,18 +603,7 @@ function admin_page_site_post(&$a){
|
||||||
function admin_page_site(&$a) {
|
function admin_page_site(&$a) {
|
||||||
|
|
||||||
/* Installed langs */
|
/* Installed langs */
|
||||||
$lang_choices = array();
|
$lang_choices = get_avaiable_languages();
|
||||||
$langs = glob('view/*/strings.php'); /**/
|
|
||||||
|
|
||||||
if(is_array($langs) && count($langs)) {
|
|
||||||
if(! in_array('view/en/strings.php',$langs))
|
|
||||||
$langs[] = 'view/en/';
|
|
||||||
asort($langs);
|
|
||||||
foreach($langs as $l) {
|
|
||||||
$t = explode("/",$l);
|
|
||||||
$lang_choices[$t[1]] = $t[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strlen(get_config('system','directory_submit_url')) AND
|
if (strlen(get_config('system','directory_submit_url')) AND
|
||||||
!strlen(get_config('system','directory'))) {
|
!strlen(get_config('system','directory'))) {
|
||||||
|
@ -597,15 +615,17 @@ function admin_page_site(&$a) {
|
||||||
$theme_choices = array();
|
$theme_choices = array();
|
||||||
$theme_choices_mobile = array();
|
$theme_choices_mobile = array();
|
||||||
$theme_choices_mobile["---"] = t("No special theme for mobile devices");
|
$theme_choices_mobile["---"] = t("No special theme for mobile devices");
|
||||||
$files = glob('view/theme/*');
|
$files = glob('view/theme/*'); /**/
|
||||||
if($files) {
|
if($files) {
|
||||||
foreach($files as $file) {
|
foreach($files as $file) {
|
||||||
|
if (intval(file_exists($file . '/unsupported')))
|
||||||
|
continue;
|
||||||
|
|
||||||
$f = basename($file);
|
$f = basename($file);
|
||||||
$theme_name = ((file_exists($file . '/experimental')) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
|
$theme_name = ((file_exists($file . '/experimental')) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
|
||||||
if (file_exists($file . '/mobile')) {
|
if (file_exists($file . '/mobile')) {
|
||||||
$theme_choices_mobile[$f] = $theme_name;
|
$theme_choices_mobile[$f] = $theme_name;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
$theme_choices[$f] = $theme_name;
|
$theme_choices[$f] = $theme_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -681,6 +701,8 @@ function admin_page_site(&$a) {
|
||||||
if ($a->config['hostname'] == "")
|
if ($a->config['hostname'] == "")
|
||||||
$a->config['hostname'] = $a->get_hostname();
|
$a->config['hostname'] = $a->get_hostname();
|
||||||
|
|
||||||
|
$diaspora_able = ($a->get_path() == "");
|
||||||
|
|
||||||
$t = get_markup_template("admin_site.tpl");
|
$t = get_markup_template("admin_site.tpl");
|
||||||
return replace_macros($t, array(
|
return replace_macros($t, array(
|
||||||
'$title' => t('Administration'),
|
'$title' => t('Administration'),
|
||||||
|
@ -737,6 +759,9 @@ function admin_page_site(&$a) {
|
||||||
'$max_author_posts_community_page' => array('max_author_posts_community_page', t("Posts per user on community page"), get_config('system','max_author_posts_community_page'), t("The maximum number of posts per user on the community page. (Not valid for 'Global Community')")),
|
'$max_author_posts_community_page' => array('max_author_posts_community_page', t("Posts per user on community page"), get_config('system','max_author_posts_community_page'), t("The maximum number of posts per user on the community page. (Not valid for 'Global Community')")),
|
||||||
'$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disabled'), t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")),
|
'$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disabled'), t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")),
|
||||||
'$ostatus_poll_interval' => array('ostatus_poll_interval', t("OStatus conversation completion interval"), (string) intval(get_config('system','ostatus_poll_interval')), t("How often shall the poller check for new entries in OStatus conversations? This can be a very ressource task."), $ostatus_poll_choices),
|
'$ostatus_poll_interval' => array('ostatus_poll_interval', t("OStatus conversation completion interval"), (string) intval(get_config('system','ostatus_poll_interval')), t("How often shall the poller check for new entries in OStatus conversations? This can be a very ressource task."), $ostatus_poll_choices),
|
||||||
|
'$ostatus_not_able' => t("OStatus support can only be enabled if threading is enabled."),
|
||||||
|
'$diaspora_able' => $diaspora_able,
|
||||||
|
'$diaspora_not_able' => t("Diaspora support can't be enabled because Friendica was installed into a sub directory."),
|
||||||
'$diaspora_enabled' => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), t("Provide built-in Diaspora network compatibility.")),
|
'$diaspora_enabled' => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), t("Provide built-in Diaspora network compatibility.")),
|
||||||
'$dfrn_only' => array('dfrn_only', t('Only allow Friendica contacts'), get_config('system','dfrn_only'), t("All contacts must use Friendica protocols. All other built-in communication protocols disabled.")),
|
'$dfrn_only' => array('dfrn_only', t('Only allow Friendica contacts'), get_config('system','dfrn_only'), t("All contacts must use Friendica protocols. All other built-in communication protocols disabled.")),
|
||||||
'$verifyssl' => array('verifyssl', t("Verify SSL"), get_config('system','verifyssl'), t("If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites.")),
|
'$verifyssl' => array('verifyssl', t("Verify SSL"), get_config('system','verifyssl'), t("If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites.")),
|
||||||
|
@ -1241,6 +1266,7 @@ function admin_page_plugins(&$a){
|
||||||
'$title' => t('Administration'),
|
'$title' => t('Administration'),
|
||||||
'$page' => t('Plugins'),
|
'$page' => t('Plugins'),
|
||||||
'$submit' => t('Save Settings'),
|
'$submit' => t('Save Settings'),
|
||||||
|
'$reload' => t('Reload active plugins'),
|
||||||
'$baseurl' => $a->get_baseurl(true),
|
'$baseurl' => $a->get_baseurl(true),
|
||||||
'$function' => 'plugins',
|
'$function' => 'plugins',
|
||||||
'$plugins' => $plugins,
|
'$plugins' => $plugins,
|
||||||
|
@ -1393,11 +1419,27 @@ function admin_page_themes(&$a){
|
||||||
|
|
||||||
$admin_form="";
|
$admin_form="";
|
||||||
if (is_file("view/theme/$theme/config.php")){
|
if (is_file("view/theme/$theme/config.php")){
|
||||||
|
function __get_theme_admin_form(&$a, $theme) {
|
||||||
|
$orig_theme = $a->theme;
|
||||||
|
$orig_page = $a->page;
|
||||||
|
$orig_session_theme = $_SESSION['theme'];
|
||||||
|
require_once("view/theme/$theme/theme.php");
|
||||||
require_once("view/theme/$theme/config.php");
|
require_once("view/theme/$theme/config.php");
|
||||||
|
$_SESSION['theme'] = $theme;
|
||||||
|
|
||||||
|
|
||||||
|
$init = $theme."_init";
|
||||||
|
if(function_exists($init)) $init($a);
|
||||||
if(function_exists("theme_admin")){
|
if(function_exists("theme_admin")){
|
||||||
$admin_form = theme_admin($a);
|
$admin_form = theme_admin($a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$_SESSION['theme'] = $orig_session_theme;
|
||||||
|
$a->theme = $orig_theme;
|
||||||
|
$a->page = $orig_page;
|
||||||
|
return $admin_form;
|
||||||
|
}
|
||||||
|
$admin_form = __get_theme_admin_form($a, $theme);
|
||||||
}
|
}
|
||||||
|
|
||||||
$screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
|
$screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
|
||||||
|
@ -1427,6 +1469,22 @@ function admin_page_themes(&$a){
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// reload active themes
|
||||||
|
if (x($_GET,"a") && $_GET['a']=="r"){
|
||||||
|
check_form_security_token_redirectOnErr($a->get_baseurl().'/admin/themes', 'admin_themes', 't');
|
||||||
|
if ($themes) {
|
||||||
|
foreach($themes as $th) {
|
||||||
|
if ($th['allowed']) {
|
||||||
|
uninstall_theme($th['name']);
|
||||||
|
install_theme($th['name']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info("Themes reloaded");
|
||||||
|
goaway($a->get_baseurl().'/admin/themes');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List themes
|
* List themes
|
||||||
*/
|
*/
|
||||||
|
@ -1438,11 +1496,13 @@ function admin_page_themes(&$a){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$t = get_markup_template("admin_plugins.tpl");
|
$t = get_markup_template("admin_plugins.tpl");
|
||||||
return replace_macros($t, array(
|
return replace_macros($t, array(
|
||||||
'$title' => t('Administration'),
|
'$title' => t('Administration'),
|
||||||
'$page' => t('Themes'),
|
'$page' => t('Themes'),
|
||||||
'$submit' => t('Save Settings'),
|
'$submit' => t('Save Settings'),
|
||||||
|
'$reload' => t('Reload active themes'),
|
||||||
'$baseurl' => $a->get_baseurl(true),
|
'$baseurl' => $a->get_baseurl(true),
|
||||||
'$function' => 'themes',
|
'$function' => 'themes',
|
||||||
'$plugins' => $xthemes,
|
'$plugins' => $xthemes,
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once('include/socgraph.php');
|
require_once('include/socgraph.php');
|
||||||
|
require_once('include/Contact.php');
|
||||||
|
require_once('include/contact_selectors.php');
|
||||||
|
|
||||||
function allfriends_content(&$a) {
|
function allfriends_content(&$a) {
|
||||||
|
|
||||||
|
@ -12,16 +14,19 @@ function allfriends_content(&$a) {
|
||||||
|
|
||||||
if($a->argc > 1)
|
if($a->argc > 1)
|
||||||
$cid = intval($a->argv[1]);
|
$cid = intval($a->argv[1]);
|
||||||
|
|
||||||
if(! $cid)
|
if(! $cid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$c = q("select name, url, photo from contact where id = %d and uid = %d limit 1",
|
$uid = $a->user[uid];
|
||||||
|
|
||||||
|
$c = q("SELECT `name`, `url`, `photo` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
||||||
intval($cid),
|
intval($cid),
|
||||||
intval(local_user())
|
intval(local_user())
|
||||||
);
|
);
|
||||||
|
|
||||||
$vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array(
|
$vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array(
|
||||||
'$name' => $c[0]['name'],
|
'$name' => htmlentities($c[0]['name']),
|
||||||
'$photo' => $c[0]['photo'],
|
'$photo' => $c[0]['photo'],
|
||||||
'url' => z_root() . '/contacts/' . $cid
|
'url' => z_root() . '/contacts/' . $cid
|
||||||
));
|
));
|
||||||
|
@ -33,10 +38,6 @@ function allfriends_content(&$a) {
|
||||||
if(! count($c))
|
if(! count($c))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$o .= replace_macros(get_markup_template("section_title.tpl"),array(
|
|
||||||
'$title' => sprintf( t('Friends of %s'), $c[0]['name'])
|
|
||||||
));
|
|
||||||
|
|
||||||
|
|
||||||
$r = all_friends(local_user(),$cid);
|
$r = all_friends(local_user(),$cid);
|
||||||
|
|
||||||
|
@ -45,19 +46,53 @@ function allfriends_content(&$a) {
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
$tpl = get_markup_template('common_friends.tpl');
|
$id = 0;
|
||||||
|
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
|
|
||||||
$o .= replace_macros($tpl,array(
|
//get further details of the contact
|
||||||
'$url' => $rr['url'],
|
$contact_details = get_contact_details_by_url($rr['url'], $uid);
|
||||||
'$name' => $rr['name'],
|
|
||||||
'$photo' => $rr['photo'],
|
$photo_menu = '';
|
||||||
'$tags' => ''
|
|
||||||
));
|
// $rr[cid] is only available for common contacts. So if the contact is a common one, use contact_photo_menu to generate the photo_menu
|
||||||
|
// If the contact is not common to the user, Connect/Follow' will be added to the photo menu
|
||||||
|
if ($rr[cid]) {
|
||||||
|
$rr[id] = $rr[cid];
|
||||||
|
$photo_menu = contact_photo_menu ($rr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$connlnk = $a->get_baseurl() . '/follow/?url=' . $rr['url'];
|
||||||
|
$photo_menu = array(array(t("View Profile"), zrl($rr['url'])));
|
||||||
|
$photo_menu[] = array(t("Connect/Follow"), $connlnk);
|
||||||
}
|
}
|
||||||
|
|
||||||
$o .= cleardiv();
|
$entry = array(
|
||||||
|
'url' => $rr['url'],
|
||||||
|
'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']),
|
||||||
|
'name' => htmlentities($rr['name']),
|
||||||
|
'thumb' => proxy_url($rr['photo'], false, PROXY_SIZE_THUMB),
|
||||||
|
'img_hover' => htmlentities($rr['name']),
|
||||||
|
'details' => $contact_details['location'],
|
||||||
|
'tags' => $contact_details['keywords'],
|
||||||
|
'about' => $contact_details['about'],
|
||||||
|
'account_type' => (($contact_details['community']) ? t('Forum') : ''),
|
||||||
|
'network' => network_to_name($contact_details['network'], $contact_details['url']),
|
||||||
|
'photo_menu' => $photo_menu,
|
||||||
|
'conntxt' => t('Connect'),
|
||||||
|
'connlnk' => $connlnk,
|
||||||
|
'id' => ++$id,
|
||||||
|
);
|
||||||
|
$entries[] = $entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tpl = get_markup_template('viewcontact_template.tpl');
|
||||||
|
|
||||||
|
$o .= replace_macros($tpl,array(
|
||||||
|
'$title' => sprintf( t('Friends of %s'), htmlentities($c[0]['name'])),
|
||||||
|
'$contacts' => $entries,
|
||||||
|
));
|
||||||
|
|
||||||
// $o .= paginate($a);
|
// $o .= paginate($a);
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once('include/socgraph.php');
|
require_once('include/socgraph.php');
|
||||||
|
require_once('include/Contact.php');
|
||||||
|
require_once('include/contact_selectors.php');
|
||||||
|
|
||||||
function common_content(&$a) {
|
function common_content(&$a) {
|
||||||
|
|
||||||
|
@ -11,25 +13,31 @@ function common_content(&$a) {
|
||||||
$cid = intval($a->argv[3]);
|
$cid = intval($a->argv[3]);
|
||||||
$zcid = 0;
|
$zcid = 0;
|
||||||
|
|
||||||
|
if (! local_user()) {
|
||||||
|
notice( t('Permission denied.') . EOL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if($cmd !== 'loc' && $cmd != 'rem')
|
if($cmd !== 'loc' && $cmd != 'rem')
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(! $uid)
|
if(! $uid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if($cmd === 'loc' && $cid) {
|
if($cmd === 'loc' && $cid) {
|
||||||
$c = q("select name, url, photo from contact where id = %d and uid = %d limit 1",
|
$c = q("SELECT `name`, `url`, `photo` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
||||||
intval($cid),
|
intval($cid),
|
||||||
intval($uid)
|
intval($uid)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$c = q("select name, url, photo from contact where self = 1 and uid = %d limit 1",
|
$c = q("SELECT `name`, `url`, `photo` FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
|
||||||
intval($uid)
|
intval($uid)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array(
|
$vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array(
|
||||||
'$name' => $c[0]['name'],
|
'$name' => htmlentities($c[0]['name']),
|
||||||
'$photo' => $c[0]['photo'],
|
'$photo' => $c[0]['photo'],
|
||||||
'url' => z_root() . '/contacts/' . $cid
|
'url' => z_root() . '/contacts/' . $cid
|
||||||
));
|
));
|
||||||
|
@ -41,21 +49,16 @@ function common_content(&$a) {
|
||||||
if(! count($c))
|
if(! count($c))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$o .= replace_macros(get_markup_template("section_title.tpl"),array(
|
|
||||||
'$title' => t('Common Friends')
|
|
||||||
));
|
|
||||||
|
|
||||||
|
|
||||||
if(! $cid) {
|
if(! $cid) {
|
||||||
if(get_my_url()) {
|
if(get_my_url()) {
|
||||||
$r = q("select id from contact where nurl = '%s' and uid = %d limit 1",
|
$r = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1",
|
||||||
dbesc(normalise_link(get_my_url())),
|
dbesc(normalise_link(get_my_url())),
|
||||||
intval($profile_uid)
|
intval($profile_uid)
|
||||||
);
|
);
|
||||||
if(count($r))
|
if(count($r))
|
||||||
$cid = $r[0]['id'];
|
$cid = $r[0]['id'];
|
||||||
else {
|
else {
|
||||||
$r = q("select id from gcontact where nurl = '%s' limit 1",
|
$r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
|
||||||
dbesc(normalise_link(get_my_url()))
|
dbesc(normalise_link(get_my_url()))
|
||||||
);
|
);
|
||||||
if(count($r))
|
if(count($r))
|
||||||
|
@ -94,19 +97,43 @@ function common_content(&$a) {
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
$tpl = get_markup_template('common_friends.tpl');
|
$id = 0;
|
||||||
|
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
|
|
||||||
$o .= replace_macros($tpl,array(
|
//get further details of the contact
|
||||||
'$url' => $rr['url'],
|
$contact_details = get_contact_details_by_url($rr['url'], $uid);
|
||||||
'$name' => $rr['name'],
|
|
||||||
'$photo' => $rr['photo'],
|
// $rr[id] is needed to use contact_photo_menu()
|
||||||
'$tags' => ''
|
$rr[id] = $rr[cid];
|
||||||
));
|
|
||||||
|
$photo_menu = '';
|
||||||
|
$photo_menu = contact_photo_menu ($rr);
|
||||||
|
|
||||||
|
$entry = array(
|
||||||
|
'url' => $rr['url'],
|
||||||
|
'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']),
|
||||||
|
'name' => $rr['name'],
|
||||||
|
'thumb' => proxy_url($rr['photo'], false, PROXY_SIZE_THUMB),
|
||||||
|
'img_hover' => htmlentities($rr['name']),
|
||||||
|
'details' => $contact_details['location'],
|
||||||
|
'tags' => $contact_details['keywords'],
|
||||||
|
'about' => $contact_details['about'],
|
||||||
|
'account_type' => (($contact_details['community']) ? t('Forum') : ''),
|
||||||
|
'network' => network_to_name($contact_details['network'], $contact_details['url']),
|
||||||
|
'photo_menu' => $photo_menu,
|
||||||
|
'id' => ++$id,
|
||||||
|
);
|
||||||
|
$entries[] = $entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
$o .= cleardiv();
|
$tpl = get_markup_template('viewcontact_template.tpl');
|
||||||
|
|
||||||
|
$o .= replace_macros($tpl,array(
|
||||||
|
'$title' => t('Common Friends'),
|
||||||
|
'$contacts' => $entries,
|
||||||
|
));
|
||||||
|
|
||||||
// $o .= paginate($a);
|
// $o .= paginate($a);
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,37 +27,41 @@ function contacts_init(&$a) {
|
||||||
require_once('include/group.php');
|
require_once('include/group.php');
|
||||||
require_once('include/contact_widgets.php');
|
require_once('include/contact_widgets.php');
|
||||||
|
|
||||||
|
if ($_GET['nets'] == "all")
|
||||||
|
$_GET['nets'] = "";
|
||||||
|
|
||||||
if(! x($a->page,'aside'))
|
if(! x($a->page,'aside'))
|
||||||
$a->page['aside'] = '';
|
$a->page['aside'] = '';
|
||||||
|
|
||||||
if($contact_id) {
|
if($contact_id) {
|
||||||
$a->data['contact'] = $r[0];
|
$a->data['contact'] = $r[0];
|
||||||
$vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"),array(
|
$vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"),array(
|
||||||
'$name' => $a->data['contact']['name'],
|
'$name' => htmlentities($a->data['contact']['name']),
|
||||||
'$photo' => $a->data['contact']['photo'],
|
'$photo' => $a->data['contact']['photo'],
|
||||||
'$url' => ($a->data['contact']['network'] == NETWORK_DFRN) ? $a->get_baseurl()."/redir/".$a->data['contact']['id'] : $a->data['contact']['url']
|
'$url' => ($a->data['contact']['network'] == NETWORK_DFRN) ? $a->get_baseurl()."/redir/".$a->data['contact']['id'] : $a->data['contact']['url']
|
||||||
));
|
));
|
||||||
|
$finpeople_widget = '';
|
||||||
$follow_widget = '';
|
$follow_widget = '';
|
||||||
|
$networks_widget = '';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$vcard_widget = '';
|
$vcard_widget = '';
|
||||||
|
$networks_widget .= networks_widget('contacts',$_GET['nets']);
|
||||||
if (isset($_GET['add']))
|
if (isset($_GET['add']))
|
||||||
$follow_widget = follow_widget($_GET['add']);
|
$follow_widget = follow_widget($_GET['add']);
|
||||||
else
|
else
|
||||||
$follow_widget = follow_widget();
|
$follow_widget = follow_widget();
|
||||||
|
|
||||||
|
$findpeople_widget .= findpeople_widget();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($_GET['nets'] == "all")
|
|
||||||
$_GET['nets'] = "";
|
|
||||||
|
|
||||||
$groups_widget .= group_side('contacts','group',false,0,$contact_id);
|
$groups_widget .= group_side('contacts','group',false,0,$contact_id);
|
||||||
$findpeople_widget .= findpeople_widget();
|
|
||||||
$networks_widget .= networks_widget('contacts',$_GET['nets']);
|
|
||||||
$a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"),array(
|
$a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"),array(
|
||||||
'$vcard_widget' => $vcard_widget,
|
'$vcard_widget' => $vcard_widget,
|
||||||
|
'$findpeople_widget' => $findpeople_widget,
|
||||||
'$follow_widget' => $follow_widget,
|
'$follow_widget' => $follow_widget,
|
||||||
'$groups_widget' => $groups_widget,
|
'$groups_widget' => $groups_widget,
|
||||||
'$findpeople_widget' => $findpeople_widget,
|
|
||||||
'$networks_widget' => $networks_widget
|
'$networks_widget' => $networks_widget
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@ -238,12 +242,12 @@ function _contact_update_profile($contact_id) {
|
||||||
|
|
||||||
$data = probe_url($r[0]["url"]);
|
$data = probe_url($r[0]["url"]);
|
||||||
|
|
||||||
// "Feed" is mostly a sign of communication problems
|
// "Feed" or "Unknown" is mostly a sign of communication problems
|
||||||
if (($data["network"] == NETWORK_FEED) AND ($data["network"] != $r[0]["network"]))
|
if ((in_array($data["network"], array(NETWORK_FEED, NETWORK_PHANTOM))) AND ($data["network"] != $r[0]["network"]))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$updatefields = array("name", "nick", "url", "addr", "batch", "notify", "poll", "request", "confirm",
|
$updatefields = array("name", "nick", "url", "addr", "batch", "notify", "poll", "request", "confirm",
|
||||||
"poco", "network", "alias", "pubkey");
|
"poco", "network", "alias");
|
||||||
$update = array();
|
$update = array();
|
||||||
|
|
||||||
if ($data["network"] == NETWORK_OSTATUS) {
|
if ($data["network"] == NETWORK_OSTATUS) {
|
||||||
|
@ -509,7 +513,7 @@ function contacts_content(&$a) {
|
||||||
if(!in_array($contact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA)))
|
if(!in_array($contact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA)))
|
||||||
$relation_text = "";
|
$relation_text = "";
|
||||||
|
|
||||||
$relation_text = sprintf($relation_text,$contact['name']);
|
$relation_text = sprintf($relation_text,htmlentities($contact['name']));
|
||||||
|
|
||||||
if(($contact['network'] === NETWORK_DFRN) && ($contact['rel'])) {
|
if(($contact['network'] === NETWORK_DFRN) && ($contact['rel'])) {
|
||||||
$url = "redir/{$contact['id']}";
|
$url = "redir/{$contact['id']}";
|
||||||
|
@ -550,6 +554,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/contacts/' . $contact_id . '/block',
|
'url' => $a->get_baseurl(true) . '/contacts/' . $contact_id . '/block',
|
||||||
'sel' => '',
|
'sel' => '',
|
||||||
'title' => t('Toggle Blocked status'),
|
'title' => t('Toggle Blocked status'),
|
||||||
|
'id' => 'toggle-block-tab',
|
||||||
'accesskey' => 'b',
|
'accesskey' => 'b',
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
|
@ -557,6 +562,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/contacts/' . $contact_id . '/ignore',
|
'url' => $a->get_baseurl(true) . '/contacts/' . $contact_id . '/ignore',
|
||||||
'sel' => '',
|
'sel' => '',
|
||||||
'title' => t('Toggle Ignored status'),
|
'title' => t('Toggle Ignored status'),
|
||||||
|
'id' => 'toggle-ignore-tab',
|
||||||
'accesskey' => 'i',
|
'accesskey' => 'i',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -565,6 +571,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/contacts/' . $contact_id . '/archive',
|
'url' => $a->get_baseurl(true) . '/contacts/' . $contact_id . '/archive',
|
||||||
'sel' => '',
|
'sel' => '',
|
||||||
'title' => t('Toggle Archive status'),
|
'title' => t('Toggle Archive status'),
|
||||||
|
'id' => 'toggle-archive-tab',
|
||||||
'accesskey' => 'v',
|
'accesskey' => 'v',
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
|
@ -572,6 +579,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/crepair/' . $contact_id,
|
'url' => $a->get_baseurl(true) . '/crepair/' . $contact_id,
|
||||||
'sel' => '',
|
'sel' => '',
|
||||||
'title' => t('Advanced Contact Settings'),
|
'title' => t('Advanced Contact Settings'),
|
||||||
|
'id' => 'repair-tab',
|
||||||
'accesskey' => 'r',
|
'accesskey' => 'r',
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@ -590,6 +598,10 @@ function contacts_content(&$a) {
|
||||||
if ($contact['network'] == NETWORK_DFRN)
|
if ($contact['network'] == NETWORK_DFRN)
|
||||||
$profile_select = contact_profile_assign($contact['profile-id'],(($contact['network'] !== NETWORK_DFRN) ? true : false));
|
$profile_select = contact_profile_assign($contact['profile-id'],(($contact['network'] !== NETWORK_DFRN) ? true : false));
|
||||||
|
|
||||||
|
if (in_array($contact['network'], array(NETWORK_DIASPORA, NETWORK_OSTATUS)) AND
|
||||||
|
($contact['rel'] == CONTACT_IS_FOLLOWER))
|
||||||
|
$follow = $a->get_baseurl(true)."/follow?url=".urlencode($contact["url"]);
|
||||||
|
|
||||||
$o .= replace_macros($tpl, array(
|
$o .= replace_macros($tpl, array(
|
||||||
'$header' => t('Contact Editor'),
|
'$header' => t('Contact Editor'),
|
||||||
'$tab_str' => $tab_str,
|
'$tab_str' => $tab_str,
|
||||||
|
@ -617,6 +629,8 @@ function contacts_content(&$a) {
|
||||||
'$updpub' => t('Update public posts'),
|
'$updpub' => t('Update public posts'),
|
||||||
'$last_update' => $last_update,
|
'$last_update' => $last_update,
|
||||||
'$udnow' => t('Update now'),
|
'$udnow' => t('Update now'),
|
||||||
|
'$follow' => $follow,
|
||||||
|
'$follow_text' => t("Connect/Follow"),
|
||||||
'$profile_select' => $profile_select,
|
'$profile_select' => $profile_select,
|
||||||
'$contact_id' => $contact['id'],
|
'$contact_id' => $contact['id'],
|
||||||
'$block_text' => (($contact['blocked']) ? t('Unblock') : t('Block') ),
|
'$block_text' => (($contact['blocked']) ? t('Unblock') : t('Block') ),
|
||||||
|
@ -632,7 +646,7 @@ function contacts_content(&$a) {
|
||||||
'$ffi_keyword_blacklist' => $contact['ffi_keyword_blacklist'],
|
'$ffi_keyword_blacklist' => $contact['ffi_keyword_blacklist'],
|
||||||
'$ffi_keyword_blacklist' => array('ffi_keyword_blacklist', t('Blacklisted keywords'), $contact['ffi_keyword_blacklist'], t('Comma separated list of keywords that should not be converted to hashtags, when "Fetch information and keywords" is selected')),
|
'$ffi_keyword_blacklist' => array('ffi_keyword_blacklist', t('Blacklisted keywords'), $contact['ffi_keyword_blacklist'], t('Comma separated list of keywords that should not be converted to hashtags, when "Fetch information and keywords" is selected')),
|
||||||
'$photo' => $contact['photo'],
|
'$photo' => $contact['photo'],
|
||||||
'$name' => $contact['name'],
|
'$name' => htmlentities($contact['name']),
|
||||||
'$dir_icon' => $dir_icon,
|
'$dir_icon' => $dir_icon,
|
||||||
'$alt_text' => $alt_text,
|
'$alt_text' => $alt_text,
|
||||||
'$sparkle' => $sparkle,
|
'$sparkle' => $sparkle,
|
||||||
|
@ -687,6 +701,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/suggest',
|
'url' => $a->get_baseurl(true) . '/suggest',
|
||||||
'sel' => '',
|
'sel' => '',
|
||||||
'title' => t('Suggest potential friends'),
|
'title' => t('Suggest potential friends'),
|
||||||
|
'id' => 'suggestions-tab',
|
||||||
'accesskey' => 'g',
|
'accesskey' => 'g',
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
|
@ -694,6 +709,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/contacts/all',
|
'url' => $a->get_baseurl(true) . '/contacts/all',
|
||||||
'sel' => ($all) ? 'active' : '',
|
'sel' => ($all) ? 'active' : '',
|
||||||
'title' => t('Show all contacts'),
|
'title' => t('Show all contacts'),
|
||||||
|
'id' => 'showall-tab',
|
||||||
'accesskey' => 'l',
|
'accesskey' => 'l',
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
|
@ -701,6 +717,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/contacts',
|
'url' => $a->get_baseurl(true) . '/contacts',
|
||||||
'sel' => ((! $all) && (! $blocked) && (! $hidden) && (! $search) && (! $nets) && (! $ignored) && (! $archived)) ? 'active' : '',
|
'sel' => ((! $all) && (! $blocked) && (! $hidden) && (! $search) && (! $nets) && (! $ignored) && (! $archived)) ? 'active' : '',
|
||||||
'title' => t('Only show unblocked contacts'),
|
'title' => t('Only show unblocked contacts'),
|
||||||
|
'id' => 'showunblocked-tab',
|
||||||
'accesskey' => 'o',
|
'accesskey' => 'o',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -709,6 +726,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/contacts/blocked',
|
'url' => $a->get_baseurl(true) . '/contacts/blocked',
|
||||||
'sel' => ($blocked) ? 'active' : '',
|
'sel' => ($blocked) ? 'active' : '',
|
||||||
'title' => t('Only show blocked contacts'),
|
'title' => t('Only show blocked contacts'),
|
||||||
|
'id' => 'showblocked-tab',
|
||||||
'accesskey' => 'b',
|
'accesskey' => 'b',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -717,6 +735,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/contacts/ignored',
|
'url' => $a->get_baseurl(true) . '/contacts/ignored',
|
||||||
'sel' => ($ignored) ? 'active' : '',
|
'sel' => ($ignored) ? 'active' : '',
|
||||||
'title' => t('Only show ignored contacts'),
|
'title' => t('Only show ignored contacts'),
|
||||||
|
'id' => 'showignored-tab',
|
||||||
'accesskey' => 'i',
|
'accesskey' => 'i',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -725,6 +744,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/contacts/archived',
|
'url' => $a->get_baseurl(true) . '/contacts/archived',
|
||||||
'sel' => ($archived) ? 'active' : '',
|
'sel' => ($archived) ? 'active' : '',
|
||||||
'title' => t('Only show archived contacts'),
|
'title' => t('Only show archived contacts'),
|
||||||
|
'id' => 'showarchived-tab',
|
||||||
'accesskey' => 'y',
|
'accesskey' => 'y',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -733,6 +753,7 @@ function contacts_content(&$a) {
|
||||||
'url' => $a->get_baseurl(true) . '/contacts/hidden',
|
'url' => $a->get_baseurl(true) . '/contacts/hidden',
|
||||||
'sel' => ($hidden) ? 'active' : '',
|
'sel' => ($hidden) ? 'active' : '',
|
||||||
'title' => t('Only show hidden contacts'),
|
'title' => t('Only show hidden contacts'),
|
||||||
|
'id' => 'showhidden-tab',
|
||||||
'accesskey' => 'h',
|
'accesskey' => 'h',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -793,6 +814,7 @@ function contacts_content(&$a) {
|
||||||
'$cmd' => $a->cmd,
|
'$cmd' => $a->cmd,
|
||||||
'$contacts' => $contacts,
|
'$contacts' => $contacts,
|
||||||
'$contact_drop_confirm' => t('Do you really want to delete this contact?'),
|
'$contact_drop_confirm' => t('Do you really want to delete this contact?'),
|
||||||
|
'multiselect' => 1,
|
||||||
'$batch_actions' => array(
|
'$batch_actions' => array(
|
||||||
'contacts_batch_update' => t('Update'),
|
'contacts_batch_update' => t('Update'),
|
||||||
'contacts_batch_block' => t('Block')."/".t("Unblock"),
|
'contacts_batch_block' => t('Block')."/".t("Unblock"),
|
||||||
|
@ -841,11 +863,11 @@ function _contact_detail_for_template($rr){
|
||||||
'id' => $rr['id'],
|
'id' => $rr['id'],
|
||||||
'alt_text' => $alt_text,
|
'alt_text' => $alt_text,
|
||||||
'dir_icon' => $dir_icon,
|
'dir_icon' => $dir_icon,
|
||||||
'thumb' => proxy_url($rr['thumb']),
|
'thumb' => proxy_url($rr['thumb'], false, PROXY_SIZE_THUMB),
|
||||||
'name' => $rr['name'],
|
'name' => htmlentities($rr['name']),
|
||||||
'username' => $rr['name'],
|
'username' => htmlentities($rr['name']),
|
||||||
'sparkle' => $sparkle,
|
'sparkle' => $sparkle,
|
||||||
'itemurl' => $rr['url'],
|
'itemurl' => (($rr['addr'] != "") ? $rr['addr'] : $rr['url']),
|
||||||
'url' => $url,
|
'url' => $url,
|
||||||
'network' => network_to_name($rr['network'], $rr['url']),
|
'network' => network_to_name($rr['network'], $rr['url']),
|
||||||
);
|
);
|
||||||
|
|
|
@ -476,7 +476,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
|
||||||
'name' => $name_e,
|
'name' => $name_e,
|
||||||
'sparkle' => $sparkle,
|
'sparkle' => $sparkle,
|
||||||
'lock' => $lock,
|
'lock' => $lock,
|
||||||
'thumb' => proxy_url($profile_avatar),
|
'thumb' => proxy_url($profile_avatar, false, PROXY_SIZE_THUMB),
|
||||||
'title' => $title_e,
|
'title' => $title_e,
|
||||||
'body' => $body_e,
|
'body' => $body_e,
|
||||||
'text' => $text_e,
|
'text' => $text_e,
|
||||||
|
@ -485,7 +485,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
|
||||||
'indent' => '',
|
'indent' => '',
|
||||||
'owner_name' => $owner_name_e,
|
'owner_name' => $owner_name_e,
|
||||||
'owner_url' => $owner_url,
|
'owner_url' => $owner_url,
|
||||||
'owner_photo' => proxy_url($owner_photo),
|
'owner_photo' => proxy_url($owner_photo, false, PROXY_SIZE_THUMB),
|
||||||
'plink' => get_plink($item),
|
'plink' => get_plink($item),
|
||||||
'edpost' => false,
|
'edpost' => false,
|
||||||
'isstarred' => $isstarred,
|
'isstarred' => $isstarred,
|
||||||
|
@ -859,7 +859,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
|
||||||
'profile_url' => $profile_link,
|
'profile_url' => $profile_link,
|
||||||
'item_photo_menu' => item_photo_menu($item),
|
'item_photo_menu' => item_photo_menu($item),
|
||||||
'name' => $name_e,
|
'name' => $name_e,
|
||||||
'thumb' => proxy_url($profile_avatar),
|
'thumb' => proxy_url($profile_avatar, false, PROXY_SIZE_THUMB),
|
||||||
'osparkle' => $osparkle,
|
'osparkle' => $osparkle,
|
||||||
'sparkle' => $sparkle,
|
'sparkle' => $sparkle,
|
||||||
'title' => $title_e,
|
'title' => $title_e,
|
||||||
|
@ -869,7 +869,7 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
|
||||||
'indent' => $indent,
|
'indent' => $indent,
|
||||||
'shiny' => $shiny,
|
'shiny' => $shiny,
|
||||||
'owner_url' => $owner_url,
|
'owner_url' => $owner_url,
|
||||||
'owner_photo' => proxy_url($owner_photo),
|
'owner_photo' => proxy_url($owner_photo, false, PROXY_SIZE_THUMB),
|
||||||
'owner_name' => $owner_name_e,
|
'owner_name' => $owner_name_e,
|
||||||
'plink' => get_plink($item),
|
'plink' => get_plink($item),
|
||||||
'edpost' => $edpost,
|
'edpost' => $edpost,
|
||||||
|
|
20
mod/credits.php
Normal file
20
mod/credits.php
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Show a credits page for all the developers who helped with the project
|
||||||
|
* (only contributors to the git repositories for friendica core and the
|
||||||
|
* addons repository will be listed though ATM)
|
||||||
|
*/
|
||||||
|
|
||||||
|
function credits_content (&$a) {
|
||||||
|
/* fill the page with credits */
|
||||||
|
$f = fopen('util/credits.txt','r');
|
||||||
|
$names = fread($f, filesize('util/credits.txt'));
|
||||||
|
$arr = explode("\n", htmlspecialchars($names));
|
||||||
|
fclose($f);
|
||||||
|
$tpl = get_markup_template('credits.tpl');
|
||||||
|
return replace_macros( $tpl, array(
|
||||||
|
'$title' => t('Credits'),
|
||||||
|
'$thanks' => t('Friendica is a community project, that would not be possible without the help of many people. Here is a list of those who have contributed to the code or the translation of Friendica. Thank you all!'),
|
||||||
|
'$names' => $arr,
|
||||||
|
));
|
||||||
|
}
|
|
@ -24,7 +24,7 @@ function crepair_init(&$a) {
|
||||||
$a->data['contact'] = $r[0];
|
$a->data['contact'] = $r[0];
|
||||||
$tpl = get_markup_template("vcard-widget.tpl");
|
$tpl = get_markup_template("vcard-widget.tpl");
|
||||||
$vcard_widget .= replace_macros($tpl, array(
|
$vcard_widget .= replace_macros($tpl, array(
|
||||||
'$name' => $a->data['contact']['name'],
|
'$name' => htmlentities($a->data['contact']['name']),
|
||||||
'$photo' => $a->data['contact']['photo']
|
'$photo' => $a->data['contact']['photo']
|
||||||
));
|
));
|
||||||
$a->page['aside'] .= $vcard_widget;
|
$a->page['aside'] .= $vcard_widget;
|
||||||
|
@ -137,16 +137,10 @@ function crepair_content(&$a) {
|
||||||
|
|
||||||
$contact = $r[0];
|
$contact = $r[0];
|
||||||
|
|
||||||
$msg1 = t('Repair Contact Settings');
|
$warning = t('<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working.');
|
||||||
|
$info = t('Please use your browser \'Back\' button <strong>now</strong> if you are uncertain what to do on this page.');
|
||||||
|
|
||||||
$msg2 = t('<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working.');
|
$returnaddr = "contacts/$cid";
|
||||||
$msg3 = t('Please use your browser \'Back\' button <strong>now</strong> if you are uncertain what to do on this page.');
|
|
||||||
|
|
||||||
$o .= '<h2>' . $msg1 . '</h2>';
|
|
||||||
|
|
||||||
$o .= '<div class="error-message">' . $msg2 . EOL . EOL. $msg3 . '</div>';
|
|
||||||
|
|
||||||
$o .= EOL . '<a href="contacts/' . $cid . '">' . t('Return to contact editor') . '</a>' . EOL;
|
|
||||||
|
|
||||||
$allow_remote_self = get_config('system','allow_users_remote_self');
|
$allow_remote_self = get_config('system','allow_users_remote_self');
|
||||||
|
|
||||||
|
@ -165,6 +159,11 @@ function crepair_content(&$a) {
|
||||||
|
|
||||||
$tpl = get_markup_template('crepair.tpl');
|
$tpl = get_markup_template('crepair.tpl');
|
||||||
$o .= replace_macros($tpl, array(
|
$o .= replace_macros($tpl, array(
|
||||||
|
'$title' => t('Repair Contact Settings'),
|
||||||
|
'$warning' => $warning,
|
||||||
|
'$info' => $info,
|
||||||
|
'$returnaddr' => $returnaddr,
|
||||||
|
'$return' => t('Return to contact editor'),
|
||||||
'$update_profile' => update_profile,
|
'$update_profile' => update_profile,
|
||||||
'$udprofilenow' => t('Refetch contact data'),
|
'$udprofilenow' => t('Refetch contact data'),
|
||||||
'$label_name' => t('Name'),
|
'$label_name' => t('Name'),
|
||||||
|
@ -178,9 +177,14 @@ function crepair_content(&$a) {
|
||||||
'$label_photo' => t('New photo from this URL'),
|
'$label_photo' => t('New photo from this URL'),
|
||||||
'$label_remote_self' => t('Remote Self'),
|
'$label_remote_self' => t('Remote Self'),
|
||||||
'$allow_remote_self' => $allow_remote_self,
|
'$allow_remote_self' => $allow_remote_self,
|
||||||
'$remote_self' => array('remote_self', t('Mirror postings from this contact'), $contact['remote_self'], t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.'), $remote_self_options),
|
'$remote_self' => array('remote_self',
|
||||||
'$contact_name' => $contact['name'],
|
t('Mirror postings from this contact'),
|
||||||
'$contact_nick' => $contact['nick'],
|
$contact['remote_self'],
|
||||||
|
t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.'),
|
||||||
|
$remote_self_options
|
||||||
|
),
|
||||||
|
'$contact_name' => htmlentities($contact['name']),
|
||||||
|
'$contact_nick' => htmlentities($contact['nick']),
|
||||||
'$contact_id' => $contact['id'],
|
'$contact_id' => $contact['id'],
|
||||||
'$contact_url' => $contact['url'],
|
'$contact_url' => $contact['url'],
|
||||||
'$request' => $contact['request'],
|
'$request' => $contact['request'],
|
||||||
|
|
|
@ -382,7 +382,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
|
||||||
if($duplex)
|
if($duplex)
|
||||||
$new_relation = CONTACT_IS_FRIEND;
|
$new_relation = CONTACT_IS_FRIEND;
|
||||||
else
|
else
|
||||||
$new_relation = CONTACT_IS_SHARING;
|
$new_relation = CONTACT_IS_FOLLOWER;
|
||||||
|
|
||||||
if($new_relation != CONTACT_IS_FOLLOWER)
|
if($new_relation != CONTACT_IS_FOLLOWER)
|
||||||
$writable = 1;
|
$writable = 1;
|
||||||
|
|
|
@ -564,5 +564,3 @@ function dfrn_poll_content(&$a) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,8 @@ function directory_init(&$a) {
|
||||||
|
|
||||||
$a->page['aside'] .= findpeople_widget();
|
$a->page['aside'] .= findpeople_widget();
|
||||||
|
|
||||||
|
$a->page['aside'] .= follow_widget();
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unset($_SESSION['theme']);
|
unset($_SESSION['theme']);
|
||||||
|
@ -44,27 +46,12 @@ function directory_content(&$a) {
|
||||||
else
|
else
|
||||||
$search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
|
$search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
|
||||||
|
|
||||||
$tpl = get_markup_template('directory_header.tpl');
|
$gdirpath = '';
|
||||||
|
$dirurl = get_config('system','directory');
|
||||||
$globaldir = '';
|
if(strlen($dirurl)) {
|
||||||
$gdirpath = get_config('system','directory');
|
$gdirpath = zrl($dirurl,true);
|
||||||
if(strlen($gdirpath)) {
|
|
||||||
$globaldir = '<ul><li><div id="global-directory-link"><a href="'
|
|
||||||
. zrl($gdirpath,true) . '">' . t('Global Directory') . '</a></div></li></ul>';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$admin = '';
|
|
||||||
|
|
||||||
$o .= replace_macros($tpl, array(
|
|
||||||
'$search' => $search,
|
|
||||||
'$globaldir' => $globaldir,
|
|
||||||
'$desc' => t('Find on this site'),
|
|
||||||
'$admin' => $admin,
|
|
||||||
'$finding' => (strlen($search) ? '<h4>' . t('Finding: ') . "'" . $search . "'" . '</h4>' : ""),
|
|
||||||
'$sitedir' => t('Site Directory'),
|
|
||||||
'$submit' => t('Find')
|
|
||||||
));
|
|
||||||
|
|
||||||
if($search) {
|
if($search) {
|
||||||
$search = dbesc($search);
|
$search = dbesc($search);
|
||||||
|
|
||||||
|
@ -159,8 +146,6 @@ function directory_content(&$a) {
|
||||||
|
|
||||||
$about = ((x($profile,'about') == 1) ? t('About:') : False);
|
$about = ((x($profile,'about') == 1) ? t('About:') : False);
|
||||||
|
|
||||||
$tpl = get_markup_template('directory_item.tpl');
|
|
||||||
|
|
||||||
if($a->theme['template_engine'] === 'internal') {
|
if($a->theme['template_engine'] === 'internal') {
|
||||||
$location_e = template_escape($location);
|
$location_e = template_escape($location);
|
||||||
}
|
}
|
||||||
|
@ -168,23 +153,26 @@ function directory_content(&$a) {
|
||||||
$location_e = $location;
|
$location_e = $location;
|
||||||
}
|
}
|
||||||
|
|
||||||
$entry = replace_macros($tpl,array(
|
$photo_menu = array(array(t("View Profile"), zrl($profile_link)));
|
||||||
'$id' => $rr['id'],
|
|
||||||
'$profile_link' => $profile_link,
|
|
||||||
'$photo' => proxy_url($a->get_cached_avatar_image($rr[$photo])),
|
|
||||||
'$alt_text' => $rr['name'],
|
|
||||||
'$name' => $rr['name'],
|
|
||||||
'$details' => $pdesc . $details,
|
|
||||||
'$page_type' => $page_type,
|
|
||||||
'$profile' => $profile,
|
|
||||||
'$location' => $location_e,
|
|
||||||
'$gender' => $gender,
|
|
||||||
'$pdesc' => $pdesc,
|
|
||||||
'$marital' => $marital,
|
|
||||||
'$homepage' => $homepage,
|
|
||||||
'$about' => $about,
|
|
||||||
|
|
||||||
));
|
$entry = array(
|
||||||
|
'id' => $rr['id'],
|
||||||
|
'url' => $profile_link,
|
||||||
|
'thumb' => proxy_url($a->get_cached_avatar_image($rr[$photo]), false, PROXY_SIZE_THUMB),
|
||||||
|
'img_hover' => $rr['name'],
|
||||||
|
'name' => $rr['name'],
|
||||||
|
'details' => $pdesc . $details,
|
||||||
|
'page_type' => $page_type,
|
||||||
|
'profile' => $profile,
|
||||||
|
'location' => $location_e,
|
||||||
|
'gender' => $gender,
|
||||||
|
'pdesc' => $pdesc,
|
||||||
|
'marital' => $marital,
|
||||||
|
'homepage' => $homepage,
|
||||||
|
'about' => $about,
|
||||||
|
'photo_menu' => $photo_menu,
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
$arr = array('contact' => $rr, 'entry' => $entry);
|
$arr = array('contact' => $rr, 'entry' => $entry);
|
||||||
|
|
||||||
|
@ -193,12 +181,27 @@ function directory_content(&$a) {
|
||||||
unset($profile);
|
unset($profile);
|
||||||
unset($location);
|
unset($location);
|
||||||
|
|
||||||
$o .= $entry;
|
if(! $arr['entry'])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
$entries[] = $arr['entry'];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$o .= "<div class=\"directory-end\" ></div>\r\n";
|
$tpl = get_markup_template('directory_header.tpl');
|
||||||
$o .= paginate($a);
|
|
||||||
|
$o .= replace_macros($tpl, array(
|
||||||
|
'$search' => $search,
|
||||||
|
'$globaldir' => t('Global Directory'),
|
||||||
|
'$gdirpath' => $gdirpath,
|
||||||
|
'$desc' => t('Find on this site'),
|
||||||
|
'$contacts' => $entries,
|
||||||
|
'$finding' => t('Finding:'),
|
||||||
|
'$findterm' => (strlen($search) ? $search : ""),
|
||||||
|
'$title' => t('Site Directory'),
|
||||||
|
'$submit' => t('Find'),
|
||||||
|
'$paginate' => paginate($a),
|
||||||
|
));
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
125
mod/dirfind.php
125
mod/dirfind.php
|
@ -1,15 +1,23 @@
|
||||||
<?php
|
<?php
|
||||||
require_once('include/contact_widgets.php');
|
require_once('include/contact_widgets.php');
|
||||||
require_once('include/socgraph.php');
|
require_once('include/socgraph.php');
|
||||||
|
require_once('include/Contact.php');
|
||||||
|
require_once('include/contact_selectors.php');
|
||||||
|
require_once('mod/contacts.php');
|
||||||
|
|
||||||
function dirfind_init(&$a) {
|
function dirfind_init(&$a) {
|
||||||
|
|
||||||
|
if(! local_user()) {
|
||||||
|
notice( t('Permission denied.') . EOL );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(! x($a->page,'aside'))
|
if(! x($a->page,'aside'))
|
||||||
$a->page['aside'] = '';
|
$a->page['aside'] = '';
|
||||||
|
|
||||||
$a->page['aside'] .= follow_widget();
|
|
||||||
|
|
||||||
$a->page['aside'] .= findpeople_widget();
|
$a->page['aside'] .= findpeople_widget();
|
||||||
|
|
||||||
|
$a->page['aside'] .= follow_widget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,13 +25,20 @@ function dirfind_init(&$a) {
|
||||||
function dirfind_content(&$a, $prefix = "") {
|
function dirfind_content(&$a, $prefix = "") {
|
||||||
|
|
||||||
$community = false;
|
$community = false;
|
||||||
|
$discover_user = false;
|
||||||
|
|
||||||
$local = get_config('system','poco_local_search');
|
$local = get_config('system','poco_local_search');
|
||||||
|
|
||||||
$search = $prefix.notags(trim($_REQUEST['search']));
|
$search = $prefix.notags(trim($_REQUEST['search']));
|
||||||
|
|
||||||
if(strpos($search,'@') === 0)
|
if(strpos($search,'@') === 0) {
|
||||||
$search = substr($search,1);
|
$search = substr($search,1);
|
||||||
|
if ((valid_email($search) AND validate_email($search)) OR
|
||||||
|
(substr(normalise_link($search), 0, 7) == "http://")) {
|
||||||
|
$user_data = probe_url($search);
|
||||||
|
$discover_user = (in_array($user_data["network"], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(strpos($search,'!') === 0) {
|
if(strpos($search,'!') === 0) {
|
||||||
$search = substr($search,1);
|
$search = substr($search,1);
|
||||||
|
@ -32,13 +47,34 @@ function dirfind_content(&$a, $prefix = "") {
|
||||||
|
|
||||||
$o = '';
|
$o = '';
|
||||||
|
|
||||||
$o .= replace_macros(get_markup_template("section_title.tpl"),array(
|
|
||||||
'$title' => sprintf( t('People Search - %s'), $search)
|
|
||||||
));
|
|
||||||
|
|
||||||
if($search) {
|
if($search) {
|
||||||
|
|
||||||
if ($local) {
|
if ($discover_user) {
|
||||||
|
$j = new stdClass();
|
||||||
|
$j->total = 1;
|
||||||
|
$j->items_page = 1;
|
||||||
|
$j->page = $a->pager['page'];
|
||||||
|
|
||||||
|
$objresult = new stdClass();
|
||||||
|
$objresult->cid = 0;
|
||||||
|
$objresult->name = $user_data["name"];
|
||||||
|
$objresult->addr = $user_data["addr"];
|
||||||
|
$objresult->url = $user_data["url"];
|
||||||
|
$objresult->photo = $user_data["photo"];
|
||||||
|
$objresult->tags = "";
|
||||||
|
$objresult->network = $user_data["network"];
|
||||||
|
|
||||||
|
$contact = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1",
|
||||||
|
dbesc(normalise_link($user_data["url"])), intval(local_user()));
|
||||||
|
if ($contact)
|
||||||
|
$objresult->cid = $contact[0]["id"];
|
||||||
|
|
||||||
|
|
||||||
|
$j->results[] = $objresult;
|
||||||
|
|
||||||
|
poco_check($user_data["url"], $user_data["name"], $user_data["network"], $user_data["photo"],
|
||||||
|
"", "", "", "", "", datetime_convert(), 0);
|
||||||
|
} elseif ($local) {
|
||||||
|
|
||||||
if ($community)
|
if ($community)
|
||||||
$extra_sql = " AND `community`";
|
$extra_sql = " AND `community`";
|
||||||
|
@ -48,14 +84,24 @@ function dirfind_content(&$a, $prefix = "") {
|
||||||
$perpage = 80;
|
$perpage = 80;
|
||||||
$startrec = (($a->pager['page']) * $perpage) - $perpage;
|
$startrec = (($a->pager['page']) * $perpage) - $perpage;
|
||||||
|
|
||||||
|
if (get_config('system','diaspora_enabled'))
|
||||||
|
$diaspora = NETWORK_DIASPORA;
|
||||||
|
else
|
||||||
|
$diaspora = NETWORK_DFRN;
|
||||||
|
|
||||||
|
if (!get_config('system','ostatus_disabled'))
|
||||||
|
$ostatus = NETWORK_OSTATUS;
|
||||||
|
else
|
||||||
|
$ostatus = NETWORK_DFRN;
|
||||||
|
|
||||||
$count = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND
|
$count = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND
|
||||||
(`url` REGEXP '%s' OR `name` REGEXP '%s' OR `location` REGEXP '%s' OR
|
(`url` REGEXP '%s' OR `name` REGEXP '%s' OR `location` REGEXP '%s' OR
|
||||||
`about` REGEXP '%s' OR `keywords` REGEXP '%s')".$extra_sql,
|
`about` REGEXP '%s' OR `keywords` REGEXP '%s')".$extra_sql,
|
||||||
dbesc(NETWORK_DFRN), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DIASPORA),
|
dbesc(NETWORK_DFRN), dbesc($ostatus), dbesc($diaspora),
|
||||||
dbesc(escape_tags($search)), dbesc(escape_tags($search)), dbesc(escape_tags($search)),
|
dbesc(escape_tags($search)), dbesc(escape_tags($search)), dbesc(escape_tags($search)),
|
||||||
dbesc(escape_tags($search)), dbesc(escape_tags($search)));
|
dbesc(escape_tags($search)), dbesc(escape_tags($search)));
|
||||||
|
|
||||||
$results = q("SELECT `contact`.`id` AS `cid`, `gcontact`.`url`, `gcontact`.`name`, `gcontact`.`photo`, `gcontact`.`keywords`
|
$results = q("SELECT `contact`.`id` AS `cid`, `gcontact`.`url`, `gcontact`.`name`, `gcontact`.`photo`, `gcontact`.`network`, `gcontact`.`keywords`, `gcontact`.`addr`
|
||||||
FROM `gcontact`
|
FROM `gcontact`
|
||||||
LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl`
|
LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl`
|
||||||
AND `contact`.`uid` = %d AND NOT `contact`.`blocked`
|
AND `contact`.`uid` = %d AND NOT `contact`.`blocked`
|
||||||
|
@ -67,7 +113,7 @@ function dirfind_content(&$a, $prefix = "") {
|
||||||
GROUP BY `gcontact`.`nurl`
|
GROUP BY `gcontact`.`nurl`
|
||||||
ORDER BY `gcontact`.`updated` DESC LIMIT %d, %d",
|
ORDER BY `gcontact`.`updated` DESC LIMIT %d, %d",
|
||||||
intval(local_user()), dbesc(CONTACT_IS_SHARING), dbesc(CONTACT_IS_FRIEND),
|
intval(local_user()), dbesc(CONTACT_IS_SHARING), dbesc(CONTACT_IS_FRIEND),
|
||||||
dbesc(NETWORK_DFRN), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DIASPORA),
|
dbesc(NETWORK_DFRN), dbesc($ostatus), dbesc($diaspora),
|
||||||
dbesc(escape_tags($search)), dbesc(escape_tags($search)), dbesc(escape_tags($search)),
|
dbesc(escape_tags($search)), dbesc(escape_tags($search)), dbesc(escape_tags($search)),
|
||||||
dbesc(escape_tags($search)), dbesc(escape_tags($search)),
|
dbesc(escape_tags($search)), dbesc(escape_tags($search)),
|
||||||
intval($startrec), intval($perpage));
|
intval($startrec), intval($perpage));
|
||||||
|
@ -87,9 +133,11 @@ function dirfind_content(&$a, $prefix = "") {
|
||||||
$objresult = new stdClass();
|
$objresult = new stdClass();
|
||||||
$objresult->cid = $result["cid"];
|
$objresult->cid = $result["cid"];
|
||||||
$objresult->name = $result["name"];
|
$objresult->name = $result["name"];
|
||||||
|
$objresult->addr = $result["addr"];
|
||||||
$objresult->url = $result["url"];
|
$objresult->url = $result["url"];
|
||||||
$objresult->photo = $result["photo"];
|
$objresult->photo = $result["photo"];
|
||||||
$objresult->tags = $result["keywords"];
|
$objresult->tags = $result["keywords"];
|
||||||
|
$objresult->network = $result["network"];
|
||||||
|
|
||||||
$j->results[] = $objresult;
|
$j->results[] = $objresult;
|
||||||
}
|
}
|
||||||
|
@ -113,29 +161,64 @@ function dirfind_content(&$a, $prefix = "") {
|
||||||
|
|
||||||
if(count($j->results)) {
|
if(count($j->results)) {
|
||||||
|
|
||||||
$tpl = get_markup_template('match.tpl');
|
$id = 0;
|
||||||
|
|
||||||
foreach($j->results as $jj) {
|
foreach($j->results as $jj) {
|
||||||
|
|
||||||
|
$alt_text = "";
|
||||||
|
|
||||||
|
$contact_details = get_contact_details_by_url($jj->url, local_user());
|
||||||
|
|
||||||
|
$itemurl = (($contact_details["addr"] != "") ? $contact_details["addr"] : $jj->url);
|
||||||
|
|
||||||
// If We already know this contact then don't show the "connect" button
|
// If We already know this contact then don't show the "connect" button
|
||||||
if ($jj->cid > 0) {
|
if ($jj->cid > 0) {
|
||||||
$connlnk = "";
|
$connlnk = "";
|
||||||
$conntxt = "";
|
$conntxt = "";
|
||||||
|
$contact = q("SELECT * FROM `contact` WHERE `id` = %d",
|
||||||
|
intval($jj->cid));
|
||||||
|
if ($contact) {
|
||||||
|
$photo_menu = contact_photo_menu($contact[0]);
|
||||||
|
$details = _contact_detail_for_template($contact[0]);
|
||||||
|
$alt_text = $details['alt_text'];
|
||||||
|
} else
|
||||||
|
$photo_menu = array();
|
||||||
} else {
|
} else {
|
||||||
$connlnk = $a->get_baseurl().'/follow/?url='.(($jj->connect) ? $jj->connect : $jj->url);
|
$connlnk = $a->get_baseurl().'/follow/?url='.(($jj->connect) ? $jj->connect : $jj->url);
|
||||||
$conntxt = t('Connect');
|
$conntxt = t('Connect');
|
||||||
|
$photo_menu = array(array(t("View Profile"), zrl($jj->url)));
|
||||||
|
$photo_menu[] = array(t("Connect/Follow"), $connlnk);
|
||||||
}
|
}
|
||||||
|
|
||||||
$jj->photo = str_replace("http:///photo/", get_server()."/photo/", $jj->photo);
|
$jj->photo = str_replace("http:///photo/", get_server()."/photo/", $jj->photo);
|
||||||
|
|
||||||
$o .= replace_macros($tpl,array(
|
$entry = array(
|
||||||
'$url' => zrl($jj->url),
|
'alt_text' => $alt_text,
|
||||||
'$name' => $jj->name,
|
'url' => zrl($jj->url),
|
||||||
'$photo' => proxy_url($jj->photo),
|
'itemurl' => $itemurl,
|
||||||
'$tags' => $jj->tags,
|
'name' => htmlentities($jj->name),
|
||||||
'$conntxt' => $conntxt,
|
'thumb' => proxy_url($jj->photo, false, PROXY_SIZE_THUMB),
|
||||||
'$connlnk' => $connlnk,
|
'img_hover' => $jj->tags,
|
||||||
));
|
'conntxt' => $conntxt,
|
||||||
|
'connlnk' => $connlnk,
|
||||||
|
'photo_menu' => $photo_menu,
|
||||||
|
'details' => $contact_details['location'],
|
||||||
|
'tags' => $contact_details['keywords'],
|
||||||
|
'about' => $contact_details['about'],
|
||||||
|
'network' => network_to_name($jj->network, $jj->url),
|
||||||
|
'id' => ++$id,
|
||||||
|
);
|
||||||
|
$entries[] = $entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$tpl = get_markup_template('viewcontact_template.tpl');
|
||||||
|
|
||||||
|
$o .= replace_macros($tpl,array(
|
||||||
|
'title' => sprintf( t('People Search - %s'), $search),
|
||||||
|
'$contacts' => $entries,
|
||||||
|
'$paginate' => paginate($a),
|
||||||
|
));
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
info( t('No matches') . EOL);
|
info( t('No matches') . EOL);
|
||||||
|
@ -143,7 +226,5 @@ function dirfind_content(&$a, $prefix = "") {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$o .= '<div class="clear"></div>';
|
|
||||||
$o .= paginate($a);
|
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,43 +97,10 @@ function display_fetchauthor($a, $item) {
|
||||||
$profiledata["nickname"] = $item["author-name"];
|
$profiledata["nickname"] = $item["author-name"];
|
||||||
$profiledata["name"] = $item["author-name"];
|
$profiledata["name"] = $item["author-name"];
|
||||||
$profiledata["picdate"] = "";
|
$profiledata["picdate"] = "";
|
||||||
$profiledata["photo"] = proxy_url($item["author-avatar"]);
|
$profiledata["photo"] = proxy_url($item["author-avatar"], false, PROXY_SIZE_SMALL);
|
||||||
$profiledata["url"] = $item["author-link"];
|
$profiledata["url"] = $item["author-link"];
|
||||||
$profiledata["network"] = $item["network"];
|
$profiledata["network"] = $item["network"];
|
||||||
|
|
||||||
// Fetching further contact data from the contact table
|
|
||||||
$r = q("SELECT `photo`, `nick`, `location`, `about` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `network` = '%s'",
|
|
||||||
dbesc(normalise_link($profiledata["url"])), intval($item["uid"]), dbesc($item["network"]));
|
|
||||||
|
|
||||||
if (!count($r))
|
|
||||||
$r = q("SELECT `photo`, `nick`, `location`, `about` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d",
|
|
||||||
dbesc(normalise_link($profiledata["url"])), intval($item["uid"]));
|
|
||||||
|
|
||||||
if (!count($r))
|
|
||||||
$r = q("SELECT `photo`, `nick`, `location`, `about` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0",
|
|
||||||
dbesc(normalise_link($profiledata["url"])));
|
|
||||||
|
|
||||||
if (count($r)) {
|
|
||||||
$profiledata["photo"] = proxy_url($r[0]["photo"]);
|
|
||||||
$profiledata["address"] = proxy_parse_html(bbcode($r[0]["location"]));
|
|
||||||
$profiledata["about"] = proxy_parse_html(bbcode($r[0]["about"]));
|
|
||||||
if ($r[0]["nick"] != "")
|
|
||||||
$profiledata["nickname"] = $r[0]["nick"];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fetching profile data from unique contacts
|
|
||||||
$r = q("SELECT `avatar`, `nick`, `location`, `about` FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($profiledata["url"])));
|
|
||||||
if (count($r)) {
|
|
||||||
if ($profiledata["photo"] == "")
|
|
||||||
$profiledata["photo"] = proxy_url($r[0]["avatar"]);
|
|
||||||
if ($profiledata["address"] == "")
|
|
||||||
$profiledata["address"] = proxy_parse_html(bbcode($r[0]["location"]));
|
|
||||||
if ($profiledata["about"] == "")
|
|
||||||
$profiledata["about"] = proxy_parse_html(bbcode($r[0]["about"]));
|
|
||||||
if (($profiledata["nickname"] == "") AND ($r[0]["nick"] != ""))
|
|
||||||
$profiledata["nickname"] = $r[0]["nick"];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for a repeated message
|
// Check for a repeated message
|
||||||
$skip = false;
|
$skip = false;
|
||||||
$body = trim($item["body"]);
|
$body = trim($item["body"]);
|
||||||
|
@ -187,28 +154,49 @@ function display_fetchauthor($a, $item) {
|
||||||
|
|
||||||
$profiledata["address"] = "";
|
$profiledata["address"] = "";
|
||||||
$profiledata["about"] = "";
|
$profiledata["about"] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetching further contact data from the contact table
|
||||||
|
$r = q("SELECT `uid`, `network`, `photo`, `nick`, `location`, `about` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `network` = '%s'",
|
||||||
|
dbesc(normalise_link($profiledata["url"])), intval($item["uid"]), dbesc($item["network"]));
|
||||||
|
|
||||||
|
if (!count($r))
|
||||||
|
$r = q("SELECT `uid`, `network`, `photo`, `nick`, `location`, `about` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d",
|
||||||
|
dbesc(normalise_link($profiledata["url"])), intval($item["uid"]));
|
||||||
|
|
||||||
|
if (!count($r))
|
||||||
|
$r = q("SELECT `uid`, `network`, `photo`, `nick`, `location`, `about` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0",
|
||||||
|
dbesc(normalise_link($profiledata["url"])));
|
||||||
|
|
||||||
// Fetching profile data from unique contacts
|
|
||||||
if ($profiledata["url"] != "") {
|
|
||||||
$r = q("SELECT `avatar`, `nick`, `location`, `about` FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($profiledata["url"])));
|
|
||||||
if (count($r)) {
|
if (count($r)) {
|
||||||
$profiledata["photo"] = proxy_url($r[0]["avatar"]);
|
if ((($r[0]["uid"] != local_user()) OR !local_user()) AND ($profiledata["network"] == NETWORK_DIASPORA)) {
|
||||||
$profiledata["address"] = proxy_parse_html(bbcode($r[0]["location"]));
|
$r[0]["location"] = "";
|
||||||
$profiledata["about"] = proxy_parse_html(bbcode($r[0]["about"]));
|
$r[0]["about"] = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
$profiledata["photo"] = proxy_url($r[0]["photo"], false, PROXY_SIZE_SMALL);
|
||||||
|
$profiledata["address"] = bbcode($r[0]["location"]);
|
||||||
|
$profiledata["about"] = bbcode($r[0]["about"]);
|
||||||
if ($r[0]["nick"] != "")
|
if ($r[0]["nick"] != "")
|
||||||
$profiledata["nickname"] = $r[0]["nick"];
|
$profiledata["nickname"] = $r[0]["nick"];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
// Fetching profile data from unique contacts
|
||||||
|
$r = q("SELECT `avatar`, `nick`, `location`, `about` FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($profiledata["url"])));
|
||||||
|
if (count($r)) {
|
||||||
|
if ($profiledata["photo"] == "")
|
||||||
|
$profiledata["photo"] = proxy_url($r[0]["avatar"], false, PROXY_SIZE_SMALL);
|
||||||
|
if (($profiledata["address"] == "") AND ($profiledata["network"] != NETWORK_DIASPORA))
|
||||||
|
$profiledata["address"] = bbcode($r[0]["location"]);
|
||||||
|
if (($profiledata["about"] == "") AND ($profiledata["network"] != NETWORK_DIASPORA))
|
||||||
|
$profiledata["about"] = bbcode($r[0]["about"]);
|
||||||
|
if (($profiledata["nickname"] == "") AND ($r[0]["nick"] != ""))
|
||||||
|
$profiledata["nickname"] = $r[0]["nick"];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (local_user()) {
|
if (local_user()) {
|
||||||
if (in_array($profiledata["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)))
|
if (in_array($profiledata["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)))
|
||||||
$profiledata["remoteconnect"] = $a->get_baseurl()."/follow?url=".urlencode($profiledata["url"]);
|
$profiledata["remoteconnect"] = $a->get_baseurl()."/follow?url=".urlencode($profiledata["url"]);
|
||||||
//if ($profiledata["network"] == NETWORK_DFRN) {
|
|
||||||
// $connect = str_replace("/profile/", "/dfrn_request/", $profiledata["url"])."&addr=".bin2hex($a->get_baseurl()."/profile/".$a->user["nickname"]);
|
|
||||||
// $profiledata["remoteconnect"] = $connect;
|
|
||||||
//} elseif ($profiledata["network"] == NETWORK_DIASPORA)
|
|
||||||
// $profiledata["remoteconnect"] = $a->get_baseurl()."/contacts?add=".GetProfileUsername($profiledata["url"], "", true);
|
|
||||||
} elseif ($profiledata["network"] == NETWORK_DFRN) {
|
} elseif ($profiledata["network"] == NETWORK_DFRN) {
|
||||||
$connect = str_replace("/profile/", "/dfrn_request/", $profiledata["url"]);
|
$connect = str_replace("/profile/", "/dfrn_request/", $profiledata["url"]);
|
||||||
$profiledata["remoteconnect"] = $connect;
|
$profiledata["remoteconnect"] = $connect;
|
||||||
|
|
|
@ -102,7 +102,6 @@ function editpost_content(&$a) {
|
||||||
|
|
||||||
//$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
|
//$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
|
||||||
|
|
||||||
|
|
||||||
$o .= replace_macros($tpl,array(
|
$o .= replace_macros($tpl,array(
|
||||||
'$return_path' => $_SESSION['return_url'],
|
'$return_path' => $_SESSION['return_url'],
|
||||||
'$action' => 'item',
|
'$action' => 'item',
|
||||||
|
|
|
@ -154,6 +154,7 @@ function events_post(&$a) {
|
||||||
if(! $cid)
|
if(! $cid)
|
||||||
proc_run('php',"include/notifier.php","event","$item_id");
|
proc_run('php',"include/notifier.php","event","$item_id");
|
||||||
|
|
||||||
|
goaway($_SESSION['return_url']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -165,6 +166,9 @@ function events_content(&$a) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($a->argc == 1)
|
||||||
|
$_SESSION['return_url'] = $a->get_baseurl() . '/' . $a->cmd;
|
||||||
|
|
||||||
if(($a->argc > 2) && ($a->argv[1] === 'ignore') && intval($a->argv[2])) {
|
if(($a->argc > 2) && ($a->argv[1] === 'ignore') && intval($a->argv[2])) {
|
||||||
$r = q("update event set ignore = 1 where id = %d and uid = %d",
|
$r = q("update event set ignore = 1 where id = %d and uid = %d",
|
||||||
intval($a->argv[2]),
|
intval($a->argv[2]),
|
||||||
|
@ -179,14 +183,69 @@ function events_content(&$a) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($a->theme_events_in_profile)
|
||||||
|
nav_set_selected('home');
|
||||||
|
else
|
||||||
|
nav_set_selected('events');
|
||||||
|
|
||||||
$editselect = 'none';
|
$editselect = 'none';
|
||||||
if( feature_enabled(local_user(), 'richtext') )
|
if( feature_enabled(local_user(), 'richtext') )
|
||||||
$editselect = 'textareas';
|
$editselect = 'textareas';
|
||||||
|
|
||||||
|
// First day of the week (0 = Sunday)
|
||||||
|
$firstDay = get_pconfig(local_user(),'system','first_day_of_week');
|
||||||
|
if ($firstDay === false) $firstDay=0;
|
||||||
|
|
||||||
|
$i18n = array(
|
||||||
|
"firstDay" => $firstDay,
|
||||||
|
"Sun" => t("Sun"),
|
||||||
|
"Mon" => t("Mon"),
|
||||||
|
"Tue" => t("Tue"),
|
||||||
|
"Wed" => t("Wed"),
|
||||||
|
"Thu" => t("Thu"),
|
||||||
|
"Fri" => t("Fri"),
|
||||||
|
"Sat" => t("Sat"),
|
||||||
|
"Sunday" => t("Sunday"),
|
||||||
|
"Monday" => t("Monday"),
|
||||||
|
"Tuesday" => t("Tuesday"),
|
||||||
|
"Wednesday" => t("Wednesday"),
|
||||||
|
"Thursday" => t("Thursday"),
|
||||||
|
"Friday" => t("Friday"),
|
||||||
|
"Saturday" => t("Saturday"),
|
||||||
|
"Jan" => t("Jan"),
|
||||||
|
"Feb" => t("Feb"),
|
||||||
|
"Mar" => t("Mar"),
|
||||||
|
"Apr" => t("Apr"),
|
||||||
|
"May" => t("May"),
|
||||||
|
"Jun" => t("Jun"),
|
||||||
|
"Jul" => t("Jul"),
|
||||||
|
"Aug" => t("Aug"),
|
||||||
|
"Sep" => t("Sept"),
|
||||||
|
"Oct" => t("Oct"),
|
||||||
|
"Nov" => t("Nov"),
|
||||||
|
"Dec" => t("Dec"),
|
||||||
|
"January" => t("January"),
|
||||||
|
"February" => t("February"),
|
||||||
|
"March" => t("March"),
|
||||||
|
"April" => t("April"),
|
||||||
|
"May" => t("May"),
|
||||||
|
"June" => t("June"),
|
||||||
|
"July" => t("July"),
|
||||||
|
"August" => t("August"),
|
||||||
|
"September" => t("September"),
|
||||||
|
"October" => t("October"),
|
||||||
|
"November" => t("November"),
|
||||||
|
"December" => t("December"),
|
||||||
|
"today" => t("today"),
|
||||||
|
"month" => t("month"),
|
||||||
|
"week" => t("week"),
|
||||||
|
"day" => t("day"),
|
||||||
|
);
|
||||||
|
|
||||||
$htpl = get_markup_template('event_head.tpl');
|
$htpl = get_markup_template('event_head.tpl');
|
||||||
$a->page['htmlhead'] .= replace_macros($htpl,array(
|
$a->page['htmlhead'] .= replace_macros($htpl,array(
|
||||||
'$baseurl' => $a->get_baseurl(),
|
'$baseurl' => $a->get_baseurl(),
|
||||||
|
'$i18n' => $i18n,
|
||||||
'$editselect' => $editselect
|
'$editselect' => $editselect
|
||||||
));
|
));
|
||||||
|
|
||||||
|
@ -198,6 +257,7 @@ function events_content(&$a) {
|
||||||
|
|
||||||
$o ="";
|
$o ="";
|
||||||
// tabs
|
// tabs
|
||||||
|
if ($a->theme_events_in_profile)
|
||||||
$tabs = profile_tabs($a, True);
|
$tabs = profile_tabs($a, True);
|
||||||
|
|
||||||
|
|
||||||
|
@ -449,7 +509,7 @@ function events_content(&$a) {
|
||||||
else
|
else
|
||||||
$sh_checked = (($orig_event['allow_cid'] === '<' . local_user() . '>' && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' );
|
$sh_checked = (($orig_event['allow_cid'] === '<' . local_user() . '>' && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' );
|
||||||
|
|
||||||
if($cid)
|
if($cid OR ($mode !== 'new'))
|
||||||
$sh_checked .= ' disabled="disabled" ';
|
$sh_checked .= ' disabled="disabled" ';
|
||||||
|
|
||||||
|
|
||||||
|
@ -480,6 +540,9 @@ function events_content(&$a) {
|
||||||
|
|
||||||
require_once('include/acl_selectors.php');
|
require_once('include/acl_selectors.php');
|
||||||
|
|
||||||
|
if ($mode === 'new')
|
||||||
|
$acl = (($cid) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $a->user)));
|
||||||
|
|
||||||
$tpl = get_markup_template('event_form.tpl');
|
$tpl = get_markup_template('event_form.tpl');
|
||||||
|
|
||||||
$o .= replace_macros($tpl,array(
|
$o .= replace_macros($tpl,array(
|
||||||
|
@ -507,7 +570,7 @@ function events_content(&$a) {
|
||||||
'$sh_text' => t('Share this event'),
|
'$sh_text' => t('Share this event'),
|
||||||
'$sh_checked' => $sh_checked,
|
'$sh_checked' => $sh_checked,
|
||||||
'$preview' => t('Preview'),
|
'$preview' => t('Preview'),
|
||||||
'$acl' => (($cid) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $a->user))),
|
'$acl' => $acl,
|
||||||
'$submit' => t('Submit')
|
'$submit' => t('Submit')
|
||||||
|
|
||||||
));
|
));
|
||||||
|
|
|
@ -35,12 +35,14 @@ function fbrowser_content($a){
|
||||||
$sql_extra2 = " ORDER BY created DESC LIMIT 0, 10";
|
$sql_extra2 = " ORDER BY created DESC LIMIT 0, 10";
|
||||||
|
|
||||||
if ($a->argc==2){
|
if ($a->argc==2){
|
||||||
$albums = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d ",
|
$albums = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' ",
|
||||||
intval(local_user())
|
intval(local_user()),
|
||||||
|
dbesc('Contact Photos'),
|
||||||
|
dbesc( t('Contact Photos'))
|
||||||
);
|
);
|
||||||
// anon functions only from 5.3.0... meglio tardi che mai..
|
|
||||||
$folder1 = function($el) use ($mode) {return array(bin2hex($el['album']),$el['album']);};
|
function _map_folder1($el){return array(bin2hex($el['album']),$el['album']);};
|
||||||
$albums = array_map( $folder1 , $albums);
|
$albums = array_map( "_map_folder1" , $albums);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,12 +55,14 @@ function fbrowser_content($a){
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT `resource-id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `desc`
|
$r = q("SELECT `resource-id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `desc`
|
||||||
FROM `photo` WHERE `uid` = %d $sql_extra
|
FROM `photo` WHERE `uid` = %d $sql_extra AND `album` != '%s' AND `album` != '%s'
|
||||||
GROUP BY `resource-id` $sql_extra2",
|
GROUP BY `resource-id` $sql_extra2",
|
||||||
intval(local_user())
|
intval(local_user()),
|
||||||
|
dbesc('Contact Photos'),
|
||||||
|
dbesc( t('Contact Photos'))
|
||||||
);
|
);
|
||||||
|
|
||||||
function files1($rr){
|
function _map_files1($rr){
|
||||||
global $a;
|
global $a;
|
||||||
$types = Photo::supportedTypes();
|
$types = Photo::supportedTypes();
|
||||||
$ext = $types[$rr['type']];
|
$ext = $types[$rr['type']];
|
||||||
|
@ -71,12 +75,12 @@ function fbrowser_content($a){
|
||||||
}
|
}
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
$a->get_baseurl() . '/photo/' . $rr['resource-id'] . '.' .$ext,
|
$a->get_baseurl() . '/photos/' . $a->user['nickname'] . '/image/' . $rr['resource-id'],
|
||||||
$filename_e,
|
$filename_e,
|
||||||
$a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['loq'] . '.'. $ext
|
$a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['loq'] . '.'. $ext
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
$files = array_map("files1", $r);
|
$files = array_map("_map_files1", $r);
|
||||||
|
|
||||||
$tpl = get_markup_template($template_file);
|
$tpl = get_markup_template($template_file);
|
||||||
|
|
||||||
|
@ -94,11 +98,11 @@ function fbrowser_content($a){
|
||||||
break;
|
break;
|
||||||
case "file":
|
case "file":
|
||||||
if ($a->argc==2){
|
if ($a->argc==2){
|
||||||
$files = q("SELECT id, filename, filetype FROM `attach` WHERE `uid` = %d ",
|
$files = q("SELECT `id`, `filename`, `filetype` FROM `attach` WHERE `uid` = %d ",
|
||||||
intval(local_user())
|
intval(local_user())
|
||||||
);
|
);
|
||||||
|
|
||||||
function files2($rr){ global $a;
|
function _map_files2($rr){ global $a;
|
||||||
list($m1,$m2) = explode("/",$rr['filetype']);
|
list($m1,$m2) = explode("/",$rr['filetype']);
|
||||||
$filetype = ( (file_exists("images/icons/$m1.png"))?$m1:"zip");
|
$filetype = ( (file_exists("images/icons/$m1.png"))?$m1:"zip");
|
||||||
|
|
||||||
|
@ -111,8 +115,7 @@ function fbrowser_content($a){
|
||||||
|
|
||||||
return array( $a->get_baseurl() . '/attach/' . $rr['id'], $filename_e, $a->get_baseurl() . '/images/icons/16/' . $filetype . '.png');
|
return array( $a->get_baseurl() . '/attach/' . $rr['id'], $filename_e, $a->get_baseurl() . '/images/icons/16/' . $filetype . '.png');
|
||||||
}
|
}
|
||||||
$files = array_map("files2", $files);
|
$files = array_map("_map_files2", $files);
|
||||||
//echo "<pre>"; var_dump($files); killme();
|
|
||||||
|
|
||||||
|
|
||||||
$tpl = get_markup_template($template_file);
|
$tpl = get_markup_template($template_file);
|
||||||
|
|
53
mod/follow.php
Executable file → Normal file
53
mod/follow.php
Executable file → Normal file
|
@ -15,6 +15,8 @@ function follow_content(&$a) {
|
||||||
$uid = local_user();
|
$uid = local_user();
|
||||||
$url = notags(trim($_REQUEST['url']));
|
$url = notags(trim($_REQUEST['url']));
|
||||||
|
|
||||||
|
$submit = t('Submit Request');
|
||||||
|
|
||||||
// There is a current issue. It seems as if you can't start following a Friendica that is following you
|
// There is a current issue. It seems as if you can't start following a Friendica that is following you
|
||||||
// With Diaspora this works - but Friendica is special, it seems ...
|
// With Diaspora this works - but Friendica is special, it seems ...
|
||||||
$r = q("SELECT `url` FROM `contact` WHERE `uid` = %d AND ((`rel` != %d) OR (`network` = '%s')) AND
|
$r = q("SELECT `url` FROM `contact` WHERE `uid` = %d AND ((`rel` != %d) OR (`network` = '%s')) AND
|
||||||
|
@ -25,12 +27,34 @@ function follow_content(&$a) {
|
||||||
|
|
||||||
if ($r) {
|
if ($r) {
|
||||||
notice(t('You already added this contact.').EOL);
|
notice(t('You already added this contact.').EOL);
|
||||||
goaway($_SESSION['return_url']);
|
$submit = "";
|
||||||
|
//goaway($_SESSION['return_url']);
|
||||||
// NOTREACHED
|
// NOTREACHED
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret = probe_url($url);
|
$ret = probe_url($url);
|
||||||
|
|
||||||
|
if (($ret["network"] == NETWORK_DIASPORA) AND !get_config('system','diaspora_enabled')) {
|
||||||
|
notice( t("Diaspora support isn't enabled. Contact can't be added.") . EOL);
|
||||||
|
$submit = "";
|
||||||
|
//goaway($_SESSION['return_url']);
|
||||||
|
// NOTREACHED
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($ret["network"] == NETWORK_OSTATUS) AND get_config('system','ostatus_disabled')) {
|
||||||
|
notice( t("OStatus support is disabled. Contact can't be added.") . EOL);
|
||||||
|
$submit = "";
|
||||||
|
//goaway($_SESSION['return_url']);
|
||||||
|
// NOTREACHED
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ret["network"] == NETWORK_PHANTOM) {
|
||||||
|
notice( t("The network type couldn't be detected. Contact can't be added.") . EOL);
|
||||||
|
$submit = "";
|
||||||
|
//goaway($_SESSION['return_url']);
|
||||||
|
// NOTREACHED
|
||||||
|
}
|
||||||
|
|
||||||
if ($ret["network"] == NETWORK_MAIL)
|
if ($ret["network"] == NETWORK_MAIL)
|
||||||
$ret["url"] = $ret["addr"];
|
$ret["url"] = $ret["addr"];
|
||||||
|
|
||||||
|
@ -55,16 +79,27 @@ function follow_content(&$a) {
|
||||||
// Makes the connection request for friendica contacts easier
|
// Makes the connection request for friendica contacts easier
|
||||||
$_SESSION["fastlane"] = $ret["url"];
|
$_SESSION["fastlane"] = $ret["url"];
|
||||||
|
|
||||||
|
$r = q("SELECT `location`, `about`, `keywords` FROM `gcontact` WHERE `nurl` = '%s'",
|
||||||
|
normalise_link($ret["url"]));
|
||||||
|
|
||||||
|
if (!$r)
|
||||||
|
$r = array(array("location" => "", "about" => "", "keywords" => ""));
|
||||||
|
|
||||||
|
if($ret['network'] === NETWORK_DIASPORA) {
|
||||||
|
$r[0]["location"] = "";
|
||||||
|
$r[0]["about"] = "";
|
||||||
|
}
|
||||||
|
|
||||||
$header = $ret["name"];
|
$header = $ret["name"];
|
||||||
|
|
||||||
if ($ret["addr"] != "")
|
if ($ret["addr"] != "")
|
||||||
$header .= " <".$ret["addr"].">";
|
$header .= " <".$ret["addr"].">";
|
||||||
|
|
||||||
$header .= " (".network_to_name($ret['network']).")";
|
$header .= " (".network_to_name($ret['network'], $ret['url']).")";
|
||||||
|
|
||||||
$o = replace_macros($tpl,array(
|
$o = replace_macros($tpl,array(
|
||||||
'$header' => htmlentities($header),
|
'$header' => htmlentities($header),
|
||||||
'$photo' => $ret["photo"],
|
'$photo' => proxy_url($ret["photo"], false, PROXY_SIZE_SMALL),
|
||||||
'$desc' => "",
|
'$desc' => "",
|
||||||
'$pls_answer' => t('Please answer the following:'),
|
'$pls_answer' => t('Please answer the following:'),
|
||||||
'$does_know_you' => array('knowyou', sprintf(t('Does %s know you?'),$ret["name"]), false, '', array(t('No'),t('Yes'))),
|
'$does_know_you' => array('knowyou', sprintf(t('Does %s know you?'),$ret["name"]), false, '', array(t('No'),t('Yes'))),
|
||||||
|
@ -77,13 +112,21 @@ function follow_content(&$a) {
|
||||||
'$your_address' => t('Your Identity Address:'),
|
'$your_address' => t('Your Identity Address:'),
|
||||||
'$invite_desc' => "",
|
'$invite_desc' => "",
|
||||||
'$emailnet' => "",
|
'$emailnet' => "",
|
||||||
'$submit' => t('Submit Request'),
|
'$submit' => $submit,
|
||||||
'$cancel' => t('Cancel'),
|
'$cancel' => t('Cancel'),
|
||||||
'$nickname' => "",
|
'$nickname' => "",
|
||||||
'$name' => $ret["name"],
|
'$name' => $ret["name"],
|
||||||
'$url' => $ret["url"],
|
'$url' => $ret["url"],
|
||||||
|
'$zrl' => zrl($ret["url"]),
|
||||||
|
'$url_label' => t("Profile URL"),
|
||||||
'$myaddr' => $myaddr,
|
'$myaddr' => $myaddr,
|
||||||
'$request' => $request
|
'$request' => $request,
|
||||||
|
'$location' => bbcode($r[0]["location"]),
|
||||||
|
'$location_label' => t("Location:"),
|
||||||
|
'$about' => bbcode($r[0]["about"], false, false),
|
||||||
|
'$about_label' => t("About:"),
|
||||||
|
'$keywords' => $r[0]["keywords"],
|
||||||
|
'$keywords_label' => t("Tags:")
|
||||||
));
|
));
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
|
@ -230,4 +230,3 @@ function group_content(&$a) {
|
||||||
return replace_macros($tpl, $context);
|
return replace_macros($tpl, $context);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
|
require_once "include/Photo.php";
|
||||||
|
|
||||||
$install_wizard_pass=1;
|
$install_wizard_pass=1;
|
||||||
|
|
||||||
|
@ -10,6 +11,14 @@ function install_init(&$a){
|
||||||
echo "ok";
|
echo "ok";
|
||||||
killme();
|
killme();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We overwrite current theme css, because during install we could not have a working mod_rewrite
|
||||||
|
// so we could not have a css at all. Here we set a static css file for the install procedure pages
|
||||||
|
$a->config['system']['theme'] = "../install";
|
||||||
|
$a->theme['stylesheet'] = $a->get_baseurl()."/view/install/style.css";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
global $install_wizard_pass;
|
global $install_wizard_pass;
|
||||||
if (x($_POST,'pass'))
|
if (x($_POST,'pass'))
|
||||||
$install_wizard_pass = intval($_POST['pass']);
|
$install_wizard_pass = intval($_POST['pass']);
|
||||||
|
@ -177,6 +186,8 @@ function install_content(&$a) {
|
||||||
|
|
||||||
check_funcs($checks);
|
check_funcs($checks);
|
||||||
|
|
||||||
|
check_imagik($checks);
|
||||||
|
|
||||||
check_htconfig($checks);
|
check_htconfig($checks);
|
||||||
|
|
||||||
check_smarty3($checks);
|
check_smarty3($checks);
|
||||||
|
@ -321,7 +332,7 @@ function check_php(&$phpath, &$checks) {
|
||||||
$help = "";
|
$help = "";
|
||||||
if(!$passed) {
|
if(!$passed) {
|
||||||
$help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
|
$help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
|
||||||
$help .= t("If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>") . EOL ;
|
$help .= t("If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron. See <a href='https://github.com/friendica/friendica/blob/master/doc/Install.md#set-up-the-poller'>'Setup the poller'</a>") . EOL ;
|
||||||
$help .= EOL . EOL ;
|
$help .= EOL . EOL ;
|
||||||
$tpl = get_markup_template('field_input.tpl');
|
$tpl = get_markup_template('field_input.tpl');
|
||||||
$help .= replace_macros($tpl, array(
|
$help .= replace_macros($tpl, array(
|
||||||
|
@ -428,10 +439,21 @@ function check_funcs(&$checks) {
|
||||||
$ck_funcs[5]['help']= t('Error: mcrypt PHP module required but not installed.');
|
$ck_funcs[5]['help']= t('Error: mcrypt PHP module required but not installed.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$checks = array_merge($checks, $ck_funcs);
|
$checks = array_merge($checks, $ck_funcs);
|
||||||
|
|
||||||
|
// check for 'mcrypt_create_iv()', needed for RINO2
|
||||||
|
if ($ck_funcs[5]['status']) {
|
||||||
|
if (function_exists('mcrypt_create_iv')) {
|
||||||
|
$__status = true;
|
||||||
|
$__help = "If you are using php_cli, please make sure that mcrypt module is enabled in its config file";
|
||||||
|
} else {
|
||||||
|
$__status = false;
|
||||||
|
$__help = t('Function mcrypt_create_iv() is not defined. This is needed to enable RINO2 encryption layer.');
|
||||||
|
}
|
||||||
|
check_add($checks, t('mcrypt_create_iv() function'), $__status, false, $__help);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*if((x($_SESSION,'sysmsg')) && is_array($_SESSION['sysmsg']) && count($_SESSION['sysmsg']))
|
/*if((x($_SESSION,'sysmsg')) && is_array($_SESSION['sysmsg']) && count($_SESSION['sysmsg']))
|
||||||
notice( t('Please see the file "INSTALL.txt".') . EOL);*/
|
notice( t('Please see the file "INSTALL.txt".') . EOL);*/
|
||||||
}
|
}
|
||||||
|
@ -490,6 +512,24 @@ function check_htaccess(&$checks) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function check_imagik(&$checks) {
|
||||||
|
$imagick = false;
|
||||||
|
$gif = false;
|
||||||
|
|
||||||
|
if (class_exists('Imagick')) {
|
||||||
|
$imagick = true;
|
||||||
|
$supported = Photo::supportedTypes();
|
||||||
|
if (array_key_exists('image/gif', $supported)) {
|
||||||
|
$gif = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
check_add($checks, t('ImageMagick PHP extension is installed'), $imagick, false, "");
|
||||||
|
if ($imagick) {
|
||||||
|
check_add($checks, t('ImageMagick supports GIF'), $gif, false, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function manual_config(&$a) {
|
function manual_config(&$a) {
|
||||||
$data = htmlentities($a->data['txt'],ENT_COMPAT,'UTF-8');
|
$data = htmlentities($a->data['txt'],ENT_COMPAT,'UTF-8');
|
||||||
|
|
29
mod/item.php
29
mod/item.php
|
@ -18,7 +18,6 @@
|
||||||
require_once('include/crypto.php');
|
require_once('include/crypto.php');
|
||||||
require_once('include/enotify.php');
|
require_once('include/enotify.php');
|
||||||
require_once('include/email.php');
|
require_once('include/email.php');
|
||||||
require_once('library/langdet/Text/LanguageDetect.php');
|
|
||||||
require_once('include/tags.php');
|
require_once('include/tags.php');
|
||||||
require_once('include/files.php');
|
require_once('include/files.php');
|
||||||
require_once('include/threads.php');
|
require_once('include/threads.php');
|
||||||
|
@ -268,32 +267,8 @@ function item_post(&$a) {
|
||||||
$guid = get_guid(32);
|
$guid = get_guid(32);
|
||||||
|
|
||||||
|
|
||||||
$naked_body = preg_replace('/\[(.+?)\]/','',$body);
|
item_add_language_opt($_REQUEST);
|
||||||
|
$postopts = $_REQUEST['postopts'] ? $_REQUEST['postopts'] : "";
|
||||||
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
|
|
||||||
$l = new Text_LanguageDetect;
|
|
||||||
//$lng = $l->detectConfidence($naked_body);
|
|
||||||
//$postopts = (($lng['language']) ? 'lang=' . $lng['language'] . ';' . $lng['confidence'] : '');
|
|
||||||
|
|
||||||
$lng = $l->detect($naked_body, 3);
|
|
||||||
|
|
||||||
if (sizeof($lng) > 0) {
|
|
||||||
$postopts = "";
|
|
||||||
|
|
||||||
foreach ($lng as $language => $score) {
|
|
||||||
if ($postopts == "")
|
|
||||||
$postopts = "lang=";
|
|
||||||
else
|
|
||||||
$postopts .= ":";
|
|
||||||
|
|
||||||
$postopts .= $language.";".$score;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger('mod_item: detect language' . print_r($lng,true) . $naked_body, LOGGER_DATA);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$postopts = '';
|
|
||||||
|
|
||||||
|
|
||||||
$private = ((strlen($str_group_allow) || strlen($str_contact_allow) || strlen($str_group_deny) || strlen($str_contact_deny)) ? 1 : 0);
|
$private = ((strlen($str_group_allow) || strlen($str_contact_allow) || strlen($str_group_deny) || strlen($str_contact_deny)) ? 1 : 0);
|
||||||
|
|
31
mod/like.php
31
mod/like.php
|
@ -26,6 +26,18 @@ function like_content(&$a) {
|
||||||
case 'undislike':
|
case 'undislike':
|
||||||
$activity = ACTIVITY_DISLIKE;
|
$activity = ACTIVITY_DISLIKE;
|
||||||
break;
|
break;
|
||||||
|
case 'attendyes':
|
||||||
|
case 'unattendyes':
|
||||||
|
$activity = ACTIVITY_ATTEND;
|
||||||
|
break;
|
||||||
|
case 'attendno':
|
||||||
|
case 'unattendno':
|
||||||
|
$activity = ACTIVITY_ATTENDNO;
|
||||||
|
break;
|
||||||
|
case 'attendmaybe':
|
||||||
|
case 'unattendmaybe':
|
||||||
|
$activity = ACTIVITY_ATTENDMAYBE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
|
@ -108,11 +120,18 @@ function like_content(&$a) {
|
||||||
// See if we've been passed a return path to redirect to
|
// See if we've been passed a return path to redirect to
|
||||||
$return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
|
$return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
|
||||||
|
|
||||||
|
$verbs = " '".dbesc($activity)."' ";
|
||||||
|
|
||||||
$r = q("SELECT `id`, `guid` FROM `item` WHERE `verb` = '%s' AND `deleted` = 0
|
// event participation are essentially radio toggles. If you make a subsequent choice,
|
||||||
|
// we need to eradicate your first choice.
|
||||||
|
if($activity === ACTIVITY_ATTEND || $activity === ACTIVITY_ATTENDNO || $activity === ACTIVITY_ATTENDMAYBE) {
|
||||||
|
$verbs = " '" . dbesc(ACTIVITY_ATTEND) . "','" . dbesc(ACTIVITY_ATTENDNO) . "','" . dbesc(ACTIVITY_ATTENDMAYBE) . "' ";
|
||||||
|
}
|
||||||
|
|
||||||
|
$r = q("SELECT `id`, `guid` FROM `item` WHERE `verb` IN ( $verbs ) AND `deleted` = 0
|
||||||
AND `contact-id` = %d AND `uid` = %d
|
AND `contact-id` = %d AND `uid` = %d
|
||||||
AND (`parent` = '%s' OR `parent-uri` = '%s' OR `thr-parent` = '%s') LIMIT 1",
|
AND (`parent` = '%s' OR `parent-uri` = '%s' OR `thr-parent` = '%s') LIMIT 1",
|
||||||
dbesc($activity), intval($contact['id']), intval($owner_uid),
|
intval($contact['id']), intval($owner_uid),
|
||||||
dbesc($item_id), dbesc($item_id), dbesc($item['uri'])
|
dbesc($item_id), dbesc($item_id), dbesc($item['uri'])
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -147,6 +166,8 @@ function like_content(&$a) {
|
||||||
$uri = item_new_uri($a->get_hostname(),$owner_uid);
|
$uri = item_new_uri($a->get_hostname(),$owner_uid);
|
||||||
|
|
||||||
$post_type = (($item['resource-id']) ? t('photo') : t('status'));
|
$post_type = (($item['resource-id']) ? t('photo') : t('status'));
|
||||||
|
if($item['obj_type'] === ACTIVITY_OBJ_EVENT)
|
||||||
|
$post_type = t('event');
|
||||||
$objtype = (($item['resource-id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
|
$objtype = (($item['resource-id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
|
||||||
$link = xmlify('<link rel="alternate" type="text/html" href="' . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
|
$link = xmlify('<link rel="alternate" type="text/html" href="' . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
|
||||||
$body = $item['body'];
|
$body = $item['body'];
|
||||||
|
@ -166,6 +187,12 @@ EOT;
|
||||||
$bodyverb = t('%1$s likes %2$s\'s %3$s');
|
$bodyverb = t('%1$s likes %2$s\'s %3$s');
|
||||||
if($verb === 'dislike')
|
if($verb === 'dislike')
|
||||||
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
|
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
|
||||||
|
if($verb === 'attendyes')
|
||||||
|
$bodyverb = t('%1$s is attending %2$s\'s %3$s');
|
||||||
|
if($verb === 'attendno')
|
||||||
|
$bodyverb = t('%1$s is not attending %2$s\'s %3$s');
|
||||||
|
if($verb === 'attendmaybe')
|
||||||
|
$bodyverb = t('%1$s may attend %2$s\'s %3$s');
|
||||||
|
|
||||||
if(! isset($bodyverb))
|
if(! isset($bodyverb))
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -97,9 +97,23 @@ function manage_content(&$a) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($_GET['identity']) {
|
||||||
|
$_POST['identity'] = $_GET['identity'];
|
||||||
|
manage_post($a);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$identities = $a->identities;
|
$identities = $a->identities;
|
||||||
|
|
||||||
|
//getting additinal information for each identity
|
||||||
foreach ($identities as $key=>$id) {
|
foreach ($identities as $key=>$id) {
|
||||||
$identities[$key]['selected'] = (($id['nickname'] === $a->user['nickname']) ? ' selected="selected" ' : '');
|
$thumb = q("SELECT `thumb` FROM `contact` WHERE `uid` = '%s' AND `self` = 1",
|
||||||
|
dbesc($id['uid'])
|
||||||
|
);
|
||||||
|
|
||||||
|
$identities[$key][thumb] = $thumb[0][thumb];
|
||||||
|
|
||||||
|
$identities[$key]['selected'] = (($id['nickname'] === $a->user['nickname']) ? true : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
$o = replace_macros(get_markup_template('manage.tpl'), array(
|
$o = replace_macros(get_markup_template('manage.tpl'), array(
|
||||||
|
|
|
@ -2,22 +2,28 @@
|
||||||
include_once('include/text.php');
|
include_once('include/text.php');
|
||||||
require_once('include/socgraph.php');
|
require_once('include/socgraph.php');
|
||||||
require_once('include/contact_widgets.php');
|
require_once('include/contact_widgets.php');
|
||||||
|
require_once('mod/proxy.php');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Controller for /match.
|
||||||
|
*
|
||||||
|
* It takes keywords from your profile and queries the directory server for
|
||||||
|
* matching keywords from other profiles.
|
||||||
|
*
|
||||||
|
* @param App &$a
|
||||||
|
* @return void|string
|
||||||
|
*/
|
||||||
function match_content(&$a) {
|
function match_content(&$a) {
|
||||||
|
|
||||||
$o = '';
|
$o = '';
|
||||||
if(! local_user())
|
if(! local_user())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$a->page['aside'] .= follow_widget();
|
|
||||||
$a->page['aside'] .= findpeople_widget();
|
$a->page['aside'] .= findpeople_widget();
|
||||||
|
$a->page['aside'] .= follow_widget();
|
||||||
|
|
||||||
$_SESSION['return_url'] = $a->get_baseurl() . '/' . $a->cmd;
|
$_SESSION['return_url'] = $a->get_baseurl() . '/' . $a->cmd;
|
||||||
|
|
||||||
$o .= replace_macros(get_markup_template("section_title.tpl"),array(
|
|
||||||
'$title' => t('Profile Match')
|
|
||||||
));
|
|
||||||
|
|
||||||
$r = q("SELECT `pub_keywords`, `prv_keywords` FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1",
|
$r = q("SELECT `pub_keywords`, `prv_keywords` FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1",
|
||||||
intval(local_user())
|
intval(local_user())
|
||||||
);
|
);
|
||||||
|
@ -26,7 +32,6 @@ function match_content(&$a) {
|
||||||
if(! $r[0]['pub_keywords'] && (! $r[0]['prv_keywords'])) {
|
if(! $r[0]['pub_keywords'] && (! $r[0]['prv_keywords'])) {
|
||||||
notice( t('No keywords to match. Please add keywords to your default profile.') . EOL);
|
notice( t('No keywords to match. Please add keywords to your default profile.') . EOL);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$params = array();
|
$params = array();
|
||||||
|
@ -51,35 +56,55 @@ function match_content(&$a) {
|
||||||
|
|
||||||
if(count($j->results)) {
|
if(count($j->results)) {
|
||||||
|
|
||||||
|
$id = 0;
|
||||||
|
|
||||||
|
|
||||||
$tpl = get_markup_template('match.tpl');
|
|
||||||
foreach($j->results as $jj) {
|
foreach($j->results as $jj) {
|
||||||
$match_nurl = normalise_link($jj->url);
|
$match_nurl = normalise_link($jj->url);
|
||||||
$match = q("SELECT `nurl` FROM `contact` WHERE `uid` = '%d' AND nurl='%s' LIMIT 1",
|
$match = q("SELECT `nurl` FROM `contact` WHERE `uid` = '%d' AND nurl='%s' LIMIT 1",
|
||||||
intval(local_user()),
|
intval(local_user()),
|
||||||
dbesc($match_nurl));
|
dbesc($match_nurl));
|
||||||
|
|
||||||
if (!count($match)) {
|
if (!count($match)) {
|
||||||
$jj->photo = str_replace("http:///photo/", get_server()."/photo/", $jj->photo);
|
$jj->photo = str_replace("http:///photo/", get_server()."/photo/", $jj->photo);
|
||||||
$connlnk = $a->get_baseurl() . '/follow/?url=' . $jj->url;
|
$connlnk = $a->get_baseurl() . '/follow/?url=' . $jj->url;
|
||||||
|
$photo_menu = array(array(t("View Profile"), zrl($jj->url)));
|
||||||
|
$photo_menu[] = array(t("Connect/Follow"), $connlnk);
|
||||||
|
|
||||||
|
$contact_details = get_contact_details_by_url($jj->url, local_user());
|
||||||
|
|
||||||
|
$entry = array(
|
||||||
|
'url' => zrl($jj->url),
|
||||||
|
'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $jj->url),
|
||||||
|
'name' => $jj->name,
|
||||||
|
'details' => $contact_details['location'],
|
||||||
|
'tags' => $contact_details['keywords'],
|
||||||
|
'about' => $contact_details['about'],
|
||||||
|
'thumb' => proxy_url($jj->photo, false, PROXY_SIZE_THUMB),
|
||||||
|
'inttxt' => ' ' . t('is interested in:'),
|
||||||
|
'conntxt' => t('Connect'),
|
||||||
|
'connlnk' => $connlnk,
|
||||||
|
'img_hover' => $jj->tags,
|
||||||
|
'photo_menu' => $photo_menu,
|
||||||
|
'id' => ++$id,
|
||||||
|
);
|
||||||
|
$entries[] = $entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tpl = get_markup_template('viewcontact_template.tpl');
|
||||||
|
|
||||||
$o .= replace_macros($tpl,array(
|
$o .= replace_macros($tpl,array(
|
||||||
'$url' => zrl($jj->url),
|
'$title' => t('Profile Match'),
|
||||||
'$name' => $jj->name,
|
'$contacts' => $entries,
|
||||||
'$photo' => proxy_url($jj->photo),
|
'$paginate' => paginate($a),
|
||||||
'$inttxt' => ' ' . t('is interested in:'),
|
|
||||||
'$conntxt' => t('Connect'),
|
|
||||||
'$connlnk' => $connlnk,
|
|
||||||
'$tags' => $jj->tags
|
|
||||||
));
|
));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
} else {
|
|
||||||
info( t('No matches') . EOL);
|
info( t('No matches') . EOL);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$o .= cleardiv();
|
|
||||||
$o .= paginate($a);
|
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
128
mod/message.php
128
mod/message.php
|
@ -4,7 +4,13 @@ require_once('include/acl_selectors.php');
|
||||||
require_once('include/message.php');
|
require_once('include/message.php');
|
||||||
|
|
||||||
function message_init(&$a) {
|
function message_init(&$a) {
|
||||||
$tabs = array();
|
|
||||||
|
$tabs = '';
|
||||||
|
|
||||||
|
if ($a->argc >1 && is_numeric($a->argv[1])) {
|
||||||
|
$tabs = render_messages(get_messages(local_user(),0,5), 'mail_list.tpl');
|
||||||
|
}
|
||||||
|
|
||||||
$new = array(
|
$new = array(
|
||||||
'label' => t('New Message'),
|
'label' => t('New Message'),
|
||||||
'url' => $a->get_baseurl(true) . '/message/new',
|
'url' => $a->get_baseurl(true) . '/message/new',
|
||||||
|
@ -344,75 +350,29 @@ function message_content(&$a) {
|
||||||
|
|
||||||
if($a->argc == 1) {
|
if($a->argc == 1) {
|
||||||
|
|
||||||
// list messages
|
// List messages
|
||||||
|
|
||||||
$o .= $header;
|
$o .= $header;
|
||||||
|
|
||||||
|
|
||||||
$r = q("SELECT count(*) AS `total` FROM `mail`
|
$r = q("SELECT count(*) AS `total` FROM `mail`
|
||||||
WHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `created` DESC",
|
WHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `created` DESC",
|
||||||
intval(local_user()),
|
intval(local_user()),
|
||||||
dbesc($myprofile)
|
dbesc($myprofile)
|
||||||
);
|
);
|
||||||
if(count($r))
|
|
||||||
$a->set_pager_total($r[0]['total']);
|
|
||||||
|
|
||||||
$r = q("SELECT max(`mail`.`created`) AS `mailcreated`, min(`mail`.`seen`) AS `mailseen`,
|
if(count($r)) $a->set_pager_total($r[0]['total']);
|
||||||
`mail`.* , `contact`.`name`, `contact`.`url`, `contact`.`thumb` , `contact`.`network`,
|
|
||||||
count( * ) as count
|
$r = get_messages(local_user(), $a->pager['start'], $a->pager['itemspage']);
|
||||||
FROM `mail` LEFT JOIN `contact` ON `mail`.`contact-id` = `contact`.`id`
|
|
||||||
WHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `mailcreated` DESC LIMIT %d , %d ",
|
|
||||||
intval(local_user()),
|
|
||||||
//
|
|
||||||
intval($a->pager['start']),
|
|
||||||
intval($a->pager['itemspage'])
|
|
||||||
);
|
|
||||||
|
|
||||||
if(! count($r)) {
|
if(! count($r)) {
|
||||||
info( t('No messages.') . EOL);
|
info( t('No messages.') . EOL);
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
$tpl = get_markup_template('mail_list.tpl');
|
$o .= render_messages($r, 'mail_list.tpl');
|
||||||
foreach($r as $rr) {
|
|
||||||
if($rr['unknown']) {
|
|
||||||
$partecipants = sprintf( t("Unknown sender - %s"),$rr['from-name']);
|
|
||||||
}
|
|
||||||
elseif (link_compare($rr['from-url'],$myprofile)){
|
|
||||||
$partecipants = sprintf( t("You and %s"), $rr['name']);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$partecipants = sprintf( t("%s and You"), $rr['from-name']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if($a->theme['template_engine'] === 'internal') {
|
|
||||||
$subject_e = template_escape((($rr['mailseen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'));
|
|
||||||
$body_e = template_escape($rr['body']);
|
|
||||||
$to_name_e = template_escape($rr['name']);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$subject_e = (($rr['mailseen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>');
|
|
||||||
$body_e = $rr['body'];
|
|
||||||
$to_name_e = $rr['name'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$o .= replace_macros($tpl, array(
|
|
||||||
'$id' => $rr['id'],
|
|
||||||
'$from_name' => $partecipants,
|
|
||||||
'$from_url' => (($rr['network'] === NETWORK_DFRN) ? $a->get_baseurl(true) . '/redir/' . $rr['contact-id'] : $rr['url']),
|
|
||||||
'$sparkle' => ' sparkle',
|
|
||||||
'$from_photo' => (($rr['thumb']) ? $rr['thumb'] : $rr['from-photo']),
|
|
||||||
'$subject' => $subject_e,
|
|
||||||
'$delete' => t('Delete conversation'),
|
|
||||||
'$body' => $body_e,
|
|
||||||
'$to_name' => $to_name_e,
|
|
||||||
'$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['mailcreated'], t('D, d M Y - g:i A')),
|
|
||||||
'$ago' => relative_date($rr['mailcreated']),
|
|
||||||
'$seen' => $rr['mailseen'],
|
|
||||||
'$count' => sprintf( tt('%d message', '%d messages', $rr['count']), $rr['count']),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
$o .= paginate($a);
|
$o .= paginate($a);
|
||||||
|
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -569,5 +529,65 @@ function message_content(&$a) {
|
||||||
|
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_messages($user, $lstart, $lend) {
|
||||||
|
|
||||||
|
return q("SELECT max(`mail`.`created`) AS `mailcreated`, min(`mail`.`seen`) AS `mailseen`,
|
||||||
|
`mail`.* , `contact`.`name`, `contact`.`url`, `contact`.`thumb` , `contact`.`network`,
|
||||||
|
count( * ) as count
|
||||||
|
FROM `mail` LEFT JOIN `contact` ON `mail`.`contact-id` = `contact`.`id`
|
||||||
|
WHERE `mail`.`uid` = %d GROUP BY `parent-uri` ORDER BY `mailcreated` DESC LIMIT %d , %d ",
|
||||||
|
intval($user), intval($lstart), intval($lend)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function render_messages($msg, $t) {
|
||||||
|
|
||||||
|
$a = get_app();
|
||||||
|
|
||||||
|
$tpl = get_markup_template($t);
|
||||||
|
$rslt = '';
|
||||||
|
|
||||||
|
foreach($msg as $rr) {
|
||||||
|
|
||||||
|
if($rr['unknown']) {
|
||||||
|
$participants = sprintf( t("Unknown sender - %s"),$rr['from-name']);
|
||||||
|
}
|
||||||
|
elseif (link_compare($rr['from-url'], $myprofile)){
|
||||||
|
$participants = sprintf( t("You and %s"), $rr['name']);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$participants = sprintf( t("%s and You"), $rr['from-name']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($a->theme['template_engine'] === 'internal') {
|
||||||
|
$subject_e = template_escape((($rr['mailseen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'));
|
||||||
|
$body_e = template_escape($rr['body']);
|
||||||
|
$to_name_e = template_escape($rr['name']);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$subject_e = (($rr['mailseen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>');
|
||||||
|
$body_e = $rr['body'];
|
||||||
|
$to_name_e = $rr['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$rslt .= replace_macros($tpl, array(
|
||||||
|
'$id' => $rr['id'],
|
||||||
|
'$from_name' => $participants,
|
||||||
|
'$from_url' => (($rr['network'] === NETWORK_DFRN) ? $a->get_baseurl(true) . '/redir/' . $rr['contact-id'] : $rr['url']),
|
||||||
|
'$sparkle' => ' sparkle',
|
||||||
|
'$from_photo' => (($rr['thumb']) ? $rr['thumb'] : $rr['from-photo']),
|
||||||
|
'$subject' => $subject_e,
|
||||||
|
'$delete' => t('Delete conversation'),
|
||||||
|
'$body' => $body_e,
|
||||||
|
'$to_name' => $to_name_e,
|
||||||
|
'$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['mailcreated'], t('D, d M Y - g:i A')),
|
||||||
|
'$ago' => relative_date($rr['mailcreated']),
|
||||||
|
'$seen' => $rr['mailseen'],
|
||||||
|
'$count' => sprintf( tt('%d message', '%d messages', $rr['count']), $rr['count']),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $rslt;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ function navigation_content(&$a) {
|
||||||
$tpl = get_markup_template('navigation.tpl');
|
$tpl = get_markup_template('navigation.tpl');
|
||||||
return replace_macros($tpl, array(
|
return replace_macros($tpl, array(
|
||||||
'$baseurl' => $a->get_baseurl(),
|
'$baseurl' => $a->get_baseurl(),
|
||||||
'$langselector' => lang_selector(),
|
|
||||||
'$sitelocation' => $nav_info['sitelocation'],
|
'$sitelocation' => $nav_info['sitelocation'],
|
||||||
'$nav' => $nav_info['nav'],
|
'$nav' => $nav_info['nav'],
|
||||||
'$banner' => $nav_info['banner'],
|
'$banner' => $nav_info['banner'],
|
||||||
|
|
|
@ -112,6 +112,7 @@ function network_init(&$a) {
|
||||||
require_once('include/group.php');
|
require_once('include/group.php');
|
||||||
require_once('include/contact_widgets.php');
|
require_once('include/contact_widgets.php');
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
|
require_once('include/forums.php');
|
||||||
|
|
||||||
if(! x($a->page,'aside'))
|
if(! x($a->page,'aside'))
|
||||||
$a->page['aside'] = '';
|
$a->page['aside'] = '';
|
||||||
|
@ -119,19 +120,19 @@ function network_init(&$a) {
|
||||||
$search = ((x($_GET,'search')) ? escape_tags($_GET['search']) : '');
|
$search = ((x($_GET,'search')) ? escape_tags($_GET['search']) : '');
|
||||||
|
|
||||||
if(x($_GET,'save')) {
|
if(x($_GET,'save')) {
|
||||||
$r = q("select * from `search` where `uid` = %d and `term` = '%s' limit 1",
|
$r = q("SELECT * FROM `search` WHERE `uid` = %d AND `term` = '%s' LIMIT 1",
|
||||||
intval(local_user()),
|
intval(local_user()),
|
||||||
dbesc($search)
|
dbesc($search)
|
||||||
);
|
);
|
||||||
if(! count($r)) {
|
if(! count($r)) {
|
||||||
q("insert into `search` ( `uid`,`term` ) values ( %d, '%s') ",
|
q("INSERT INTO `search` ( `uid`,`term` ) VALUES ( %d, '%s') ",
|
||||||
intval(local_user()),
|
intval(local_user()),
|
||||||
dbesc($search)
|
dbesc($search)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(x($_GET,'remove')) {
|
if(x($_GET,'remove')) {
|
||||||
q("delete from `search` where `uid` = %d and `term` = '%s'",
|
q("DELETE FROM `search` WHERE `uid` = %d AND `term` = '%s'",
|
||||||
intval(local_user()),
|
intval(local_user()),
|
||||||
dbesc($search)
|
dbesc($search)
|
||||||
);
|
);
|
||||||
|
@ -145,11 +146,20 @@ function network_init(&$a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$a->page['aside'] .= (feature_enabled(local_user(),'groups') ? group_side('network/0','network',true,$group_id) : '');
|
$a->page['aside'] .= (feature_enabled(local_user(),'groups') ? group_side('network/0','network',true,$group_id) : '');
|
||||||
|
$a->page['aside'] .= (feature_enabled(local_user(),'forumlist_widget') ? widget_forumlist($a) : '');
|
||||||
$a->page['aside'] .= posted_date_widget($a->get_baseurl() . '/network',local_user(),false);
|
$a->page['aside'] .= posted_date_widget($a->get_baseurl() . '/network',local_user(),false);
|
||||||
$a->page['aside'] .= networks_widget($a->get_baseurl(true) . '/network',(x($_GET, 'nets') ? $_GET['nets'] : ''));
|
$a->page['aside'] .= networks_widget($a->get_baseurl(true) . '/network',(x($_GET, 'nets') ? $_GET['nets'] : ''));
|
||||||
$a->page['aside'] .= saved_searches($search);
|
$a->page['aside'] .= saved_searches($search);
|
||||||
$a->page['aside'] .= fileas_widget($a->get_baseurl(true) . '/network',(x($_GET, 'file') ? $_GET['file'] : ''));
|
$a->page['aside'] .= fileas_widget($a->get_baseurl(true) . '/network',(x($_GET, 'file') ? $_GET['file'] : ''));
|
||||||
|
|
||||||
|
if(x($_GET['cid']) && intval($_GET['cid']) != 0) {
|
||||||
|
$r = q("SELECT `url` FROM `contact` WHERE `id` = %d",
|
||||||
|
intval($_GET['cid']));
|
||||||
|
if ($r) {
|
||||||
|
$a->page['aside'] = "";
|
||||||
|
profile_load($a, "", 0, get_contact_details_by_url($r[0]["url"]));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function saved_searches($search) {
|
function saved_searches($search) {
|
||||||
|
@ -172,7 +182,7 @@ function saved_searches($search) {
|
||||||
|
|
||||||
$o = '';
|
$o = '';
|
||||||
|
|
||||||
$r = q("select `id`,`term` from `search` WHERE `uid` = %d",
|
$r = q("SELECT `id`,`term` FROM `search` WHERE `uid` = %d",
|
||||||
intval(local_user())
|
intval(local_user())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -359,6 +369,7 @@ function network_content(&$a, $update = 0) {
|
||||||
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . '?f=&order=comment' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
|
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . '?f=&order=comment' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
|
||||||
'sel' => $all_active,
|
'sel' => $all_active,
|
||||||
'title' => t('Sort by Comment Date'),
|
'title' => t('Sort by Comment Date'),
|
||||||
|
'id' => 'commented-order-tab',
|
||||||
'accesskey' => "e",
|
'accesskey' => "e",
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
|
@ -366,6 +377,7 @@ function network_content(&$a, $update = 0) {
|
||||||
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . '?f=&order=post' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
|
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . '?f=&order=post' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
|
||||||
'sel' => $postord_active,
|
'sel' => $postord_active,
|
||||||
'title' => t('Sort by Post Date'),
|
'title' => t('Sort by Post Date'),
|
||||||
|
'id' => 'posted-order-tab',
|
||||||
'accesskey' => "t",
|
'accesskey' => "t",
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -376,6 +388,7 @@ function network_content(&$a, $update = 0) {
|
||||||
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&conv=1',
|
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&conv=1',
|
||||||
'sel' => $conv_active,
|
'sel' => $conv_active,
|
||||||
'title' => t('Posts that mention or involve you'),
|
'title' => t('Posts that mention or involve you'),
|
||||||
|
'id' => 'personal-tab',
|
||||||
'accesskey' => "r",
|
'accesskey' => "r",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -386,6 +399,7 @@ function network_content(&$a, $update = 0) {
|
||||||
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ($len_naked_cmd ? '/' : '') . 'new' . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : ''),
|
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ($len_naked_cmd ? '/' : '') . 'new' . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : ''),
|
||||||
'sel' => $new_active,
|
'sel' => $new_active,
|
||||||
'title' => t('Activity Stream - by date'),
|
'title' => t('Activity Stream - by date'),
|
||||||
|
'id' => 'activitiy-by-date-tab',
|
||||||
'accesskey' => "w",
|
'accesskey' => "w",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -396,6 +410,7 @@ function network_content(&$a, $update = 0) {
|
||||||
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&bmark=1',
|
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&bmark=1',
|
||||||
'sel' => $bookmarked_active,
|
'sel' => $bookmarked_active,
|
||||||
'title' => t('Interesting Links'),
|
'title' => t('Interesting Links'),
|
||||||
|
'id' => 'shared-links-tab',
|
||||||
'accesskey' => "b",
|
'accesskey' => "b",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -406,6 +421,7 @@ function network_content(&$a, $update = 0) {
|
||||||
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&star=1',
|
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&star=1',
|
||||||
'sel' => $starred_active,
|
'sel' => $starred_active,
|
||||||
'title' => t('Favourite Posts'),
|
'title' => t('Favourite Posts'),
|
||||||
|
'id' => 'starred-posts-tab',
|
||||||
'accesskey' => "m",
|
'accesskey' => "m",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -446,7 +462,7 @@ function network_content(&$a, $update = 0) {
|
||||||
$def_acl = array('allow_cid' => '<' . intval($cid) . '>');
|
$def_acl = array('allow_cid' => '<' . intval($cid) . '>');
|
||||||
|
|
||||||
if($nets) {
|
if($nets) {
|
||||||
$r = q("select id from contact where uid = %d and network = '%s' and self = 0",
|
$r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND network = '%s' AND `self` = 0",
|
||||||
intval(local_user()),
|
intval(local_user()),
|
||||||
dbesc($nets)
|
dbesc($nets)
|
||||||
);
|
);
|
||||||
|
@ -475,7 +491,11 @@ function network_content(&$a, $update = 0) {
|
||||||
$content = "";
|
$content = "";
|
||||||
|
|
||||||
if ($cid) {
|
if ($cid) {
|
||||||
$contact = q("SELECT `nick` FROM `contact` WHERE `id` = %d AND `uid` = %d AND `forum`", intval($cid), intval(local_user()));
|
// If $cid belongs to a communitity forum or a privat goup,.add a mention to the status editor
|
||||||
|
$contact = q("SELECT `nick` FROM `contact` WHERE `id` = %d AND `uid` = %d AND (`forum` OR `prv`) ",
|
||||||
|
intval($cid),
|
||||||
|
intval(local_user())
|
||||||
|
);
|
||||||
if ($contact)
|
if ($contact)
|
||||||
$content = "@".$contact[0]["nick"]."+".$cid;
|
$content = "@".$contact[0]["nick"]."+".$cid;
|
||||||
}
|
}
|
||||||
|
@ -552,9 +572,9 @@ function network_content(&$a, $update = 0) {
|
||||||
//$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item` WHERE (`contact-id` IN ($contact_str) OR `allow_gid` like '".protect_sprintf('%<'.intval($group).'>%')."') and deleted = 0 ORDER BY `created` DESC) AS `temp1` ON $sql_table.$sql_parent = `temp1`.`parent` ";
|
//$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item` WHERE (`contact-id` IN ($contact_str) OR `allow_gid` like '".protect_sprintf('%<'.intval($group).'>%')."') and deleted = 0 ORDER BY `created` DESC) AS `temp1` ON $sql_table.$sql_parent = `temp1`.`parent` ";
|
||||||
|
|
||||||
$sql_extra3 .= " AND `contact-id` IN ($contact_str$contact_str_self) ";
|
$sql_extra3 .= " AND `contact-id` IN ($contact_str$contact_str_self) ";
|
||||||
$sql_extra3 .= " AND EXISTS (SELECT id FROM `item` WHERE (`contact-id` IN ($contact_str)
|
$sql_extra3 .= " AND EXISTS (SELECT `id` FROM `item` WHERE (`contact-id` IN ($contact_str)
|
||||||
OR `allow_gid` like '".protect_sprintf('%<'.intval($group).'>%')."') and deleted = 0
|
OR `allow_gid` LIKE '".protect_sprintf('%<'.intval($group).'>%')."') AND `deleted` = 0
|
||||||
AND parent = $sql_table.$sql_parent) ";
|
AND `parent` = $sql_table.$sql_parent) ";
|
||||||
|
|
||||||
$o = replace_macros(get_markup_template("section_title.tpl"),array(
|
$o = replace_macros(get_markup_template("section_title.tpl"),array(
|
||||||
'$title' => sprintf( t('Group: %s'), $r[0]['name'])
|
'$title' => sprintf( t('Group: %s'), $r[0]['name'])
|
||||||
|
@ -569,13 +589,13 @@ function network_content(&$a, $update = 0) {
|
||||||
);
|
);
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item`
|
$sql_post_table = " INNER JOIN (SELECT DISTINCT(`parent`) FROM `item`
|
||||||
WHERE 1 $sql_options AND `contact-id` = ".intval($cid)." and deleted = 0
|
WHERE 1 $sql_options AND `contact-id` = ".intval($cid)." AND `deleted` = 0
|
||||||
ORDER BY `item`.`received` DESC) AS `temp1`
|
ORDER BY `item`.`received` DESC) AS `temp1`
|
||||||
ON $sql_table.$sql_parent = `temp1`.`parent` ";
|
ON $sql_table.$sql_parent = `temp1`.`parent` ";
|
||||||
$sql_extra = "";
|
$sql_extra = "";
|
||||||
|
|
||||||
$o = replace_macros(get_markup_template("section_title.tpl"),array(
|
$o = replace_macros(get_markup_template("section_title.tpl"),array(
|
||||||
'$title' => sprintf( t('Contact: %s'), $r[0]['name'])
|
'$title' => sprintf( t('Contact: %s'), htmlentities($r[0]['name']))
|
||||||
)) . $o;
|
)) . $o;
|
||||||
|
|
||||||
if($r[0]['network'] === NETWORK_OSTATUS && $r[0]['writable'] && (! get_pconfig(local_user(),'system','nowarn_insecure'))) {
|
if($r[0]['network'] === NETWORK_OSTATUS && $r[0]['writable'] && (! get_pconfig(local_user(),'system','nowarn_insecure'))) {
|
||||||
|
@ -677,6 +697,7 @@ function network_content(&$a, $update = 0) {
|
||||||
$itemspage_network = get_pconfig(local_user(),'system','itemspage_network');
|
$itemspage_network = get_pconfig(local_user(),'system','itemspage_network');
|
||||||
$itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 40);
|
$itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 40);
|
||||||
}
|
}
|
||||||
|
|
||||||
// now that we have the user settings, see if the theme forces
|
// now that we have the user settings, see if the theme forces
|
||||||
// a maximum item number which is lower then the user choice
|
// a maximum item number which is lower then the user choice
|
||||||
if(($a->force_max_items > 0) && ($a->force_max_items < $itemspage_network))
|
if(($a->force_max_items > 0) && ($a->force_max_items < $itemspage_network))
|
||||||
|
@ -687,7 +708,7 @@ function network_content(&$a, $update = 0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if($nouveau) {
|
if($nouveau) {
|
||||||
$simple_update = (($update) ? " and `item`.`unseen` = 1 " : '');
|
$simple_update = (($update) ? " AND `item`.`unseen` = 1 " : '');
|
||||||
|
|
||||||
if ($sql_order == "")
|
if ($sql_order == "")
|
||||||
$sql_order = "`item`.`received`";
|
$sql_order = "`item`.`received`";
|
||||||
|
@ -700,7 +721,7 @@ function network_content(&$a, $update = 0) {
|
||||||
FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
|
FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
|
||||||
AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
|
AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
|
||||||
WHERE `item`.`uid` = %d AND `item`.`visible` = 1
|
WHERE `item`.`uid` = %d AND `item`.`visible` = 1
|
||||||
AND `item`.`deleted` = 0 and `item`.`moderated` = 0
|
AND `item`.`deleted` = 0 AND `item`.`moderated` = 0
|
||||||
$simple_update
|
$simple_update
|
||||||
$sql_extra $sql_nets
|
$sql_extra $sql_nets
|
||||||
ORDER BY $sql_order DESC $pager_sql ",
|
ORDER BY $sql_order DESC $pager_sql ",
|
||||||
|
@ -732,7 +753,10 @@ function network_content(&$a, $update = 0) {
|
||||||
// Fetch a page full of parent items for this page
|
// Fetch a page full of parent items for this page
|
||||||
if($update) {
|
if($update) {
|
||||||
if (!get_config("system", "like_no_comment"))
|
if (!get_config("system", "like_no_comment"))
|
||||||
$sql_extra4 = "(`item`.`deleted` = 0 OR `item`.`verb` = '".ACTIVITY_LIKE."' OR `item`.`verb` = '".ACTIVITY_DISLIKE."')";
|
$sql_extra4 = "(`item`.`deleted` = 0
|
||||||
|
OR `item`.`verb` = '".ACTIVITY_LIKE."' OR `item`.`verb` = '".ACTIVITY_DISLIKE."'
|
||||||
|
OR `item`.`verb` = '".ACTIVITY_ATTEND."' OR `item`.`verb` = '".ACTIVITY_ATTENDNO."'
|
||||||
|
OR `item`.`verb` = '".ACTIVITY_ATTENDMAYBE."')";
|
||||||
else
|
else
|
||||||
$sql_extra4 = "`item`.`deleted` = 0 AND `item`.`verb` = '".ACTIVITY_POST."'";
|
$sql_extra4 = "`item`.`deleted` = 0 AND `item`.`verb` = '".ACTIVITY_POST."'";
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<?php
|
<?php
|
||||||
/*
|
/**
|
||||||
Documentation: http://nodeinfo.diaspora.software/schema.html
|
* @file mod/nodeinfo.php
|
||||||
|
*
|
||||||
|
* Documentation: http://nodeinfo.diaspora.software/schema.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once("include/plugin.php");
|
require_once("include/plugin.php");
|
||||||
|
@ -67,48 +69,48 @@ function nodeinfo_init(&$a){
|
||||||
|
|
||||||
$nodeinfo["metadata"] = array("nodeName" => $a->config["sitename"]);
|
$nodeinfo["metadata"] = array("nodeName" => $a->config["sitename"]);
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("appnet"))
|
if (plugin_enabled("appnet"))
|
||||||
$nodeinfo["services"]["inbound"][] = "appnet";
|
$nodeinfo["services"]["inbound"][] = "appnet";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("appnet") OR nodeinfo_plugin_enabled("buffer"))
|
if (plugin_enabled("appnet") OR plugin_enabled("buffer"))
|
||||||
$nodeinfo["services"]["outbound"][] = "appnet";
|
$nodeinfo["services"]["outbound"][] = "appnet";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("blogger"))
|
if (plugin_enabled("blogger"))
|
||||||
$nodeinfo["services"]["outbound"][] = "blogger";
|
$nodeinfo["services"]["outbound"][] = "blogger";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("dwpost"))
|
if (plugin_enabled("dwpost"))
|
||||||
$nodeinfo["services"]["outbound"][] = "dreamwidth";
|
$nodeinfo["services"]["outbound"][] = "dreamwidth";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("fbpost") OR nodeinfo_plugin_enabled("buffer"))
|
if (plugin_enabled("fbpost") OR plugin_enabled("buffer"))
|
||||||
$nodeinfo["services"]["outbound"][] = "facebook";
|
$nodeinfo["services"]["outbound"][] = "facebook";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("statusnet")) {
|
if (plugin_enabled("statusnet")) {
|
||||||
$nodeinfo["services"]["inbound"][] = "gnusocial";
|
$nodeinfo["services"]["inbound"][] = "gnusocial";
|
||||||
$nodeinfo["services"]["outbound"][] = "gnusocial";
|
$nodeinfo["services"]["outbound"][] = "gnusocial";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("gpluspost") OR nodeinfo_plugin_enabled("buffer"))
|
if (plugin_enabled("gpluspost") OR plugin_enabled("buffer"))
|
||||||
$nodeinfo["services"]["outbound"][] = "google";
|
$nodeinfo["services"]["outbound"][] = "google";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("ijpost"))
|
if (plugin_enabled("ijpost"))
|
||||||
$nodeinfo["services"]["outbound"][] = "insanejournal";
|
$nodeinfo["services"]["outbound"][] = "insanejournal";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("libertree"))
|
if (plugin_enabled("libertree"))
|
||||||
$nodeinfo["services"]["outbound"][] = "libertree";
|
$nodeinfo["services"]["outbound"][] = "libertree";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("buffer"))
|
if (plugin_enabled("buffer"))
|
||||||
$nodeinfo["services"]["outbound"][] = "linkedin";
|
$nodeinfo["services"]["outbound"][] = "linkedin";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("ljpost"))
|
if (plugin_enabled("ljpost"))
|
||||||
$nodeinfo["services"]["outbound"][] = "livejournal";
|
$nodeinfo["services"]["outbound"][] = "livejournal";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("buffer"))
|
if (plugin_enabled("buffer"))
|
||||||
$nodeinfo["services"]["outbound"][] = "pinterest";
|
$nodeinfo["services"]["outbound"][] = "pinterest";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("posterous"))
|
if (plugin_enabled("posterous"))
|
||||||
$nodeinfo["services"]["outbound"][] = "posterous";
|
$nodeinfo["services"]["outbound"][] = "posterous";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("pumpio")) {
|
if (plugin_enabled("pumpio")) {
|
||||||
$nodeinfo["services"]["inbound"][] = "pumpio";
|
$nodeinfo["services"]["inbound"][] = "pumpio";
|
||||||
$nodeinfo["services"]["outbound"][] = "pumpio";
|
$nodeinfo["services"]["outbound"][] = "pumpio";
|
||||||
}
|
}
|
||||||
|
@ -118,13 +120,13 @@ function nodeinfo_init(&$a){
|
||||||
if ($smtp)
|
if ($smtp)
|
||||||
$nodeinfo["services"]["outbound"][] = "smtp";
|
$nodeinfo["services"]["outbound"][] = "smtp";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("tumblr"))
|
if (plugin_enabled("tumblr"))
|
||||||
$nodeinfo["services"]["outbound"][] = "tumblr";
|
$nodeinfo["services"]["outbound"][] = "tumblr";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("twitter") OR nodeinfo_plugin_enabled("buffer"))
|
if (plugin_enabled("twitter") OR plugin_enabled("buffer"))
|
||||||
$nodeinfo["services"]["outbound"][] = "twitter";
|
$nodeinfo["services"]["outbound"][] = "twitter";
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("wppost"))
|
if (plugin_enabled("wppost"))
|
||||||
$nodeinfo["services"]["outbound"][] = "wordpress";
|
$nodeinfo["services"]["outbound"][] = "wordpress";
|
||||||
|
|
||||||
$nodeinfo["metadata"]["protocols"] = $nodeinfo["protocols"];
|
$nodeinfo["metadata"]["protocols"] = $nodeinfo["protocols"];
|
||||||
|
@ -134,7 +136,7 @@ function nodeinfo_init(&$a){
|
||||||
|
|
||||||
$nodeinfo["metadata"]["services"] = $nodeinfo["services"];
|
$nodeinfo["metadata"]["services"] = $nodeinfo["services"];
|
||||||
|
|
||||||
if (nodeinfo_plugin_enabled("twitter"))
|
if (plugin_enabled("twitter"))
|
||||||
$nodeinfo["metadata"]["services"]["inbound"][] = "twitter";
|
$nodeinfo["metadata"]["services"]["inbound"][] = "twitter";
|
||||||
|
|
||||||
header('Content-type: application/json; charset=utf-8');
|
header('Content-type: application/json; charset=utf-8');
|
||||||
|
@ -142,17 +144,14 @@ function nodeinfo_init(&$a){
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
function nodeinfo_plugin_enabled($plugin) {
|
|
||||||
$r = q("SELECT * FROM `addon` WHERE `installed` = 1 AND `name` = '%s'", $plugin);
|
|
||||||
return((bool)(count($r) > 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
function nodeinfo_cron() {
|
function nodeinfo_cron() {
|
||||||
|
|
||||||
$a = get_app();
|
$a = get_app();
|
||||||
|
|
||||||
// If the plugin "statistics_json" is enabled then disable it and actrivate nodeinfo.
|
// If the plugin "statistics_json" is enabled then disable it and actrivate nodeinfo.
|
||||||
if (nodeinfo_plugin_enabled("statistics_json")) {
|
if (plugin_enabled("statistics_json")) {
|
||||||
set_config("system", "nodeinfo", true);
|
set_config("system", "nodeinfo", true);
|
||||||
|
|
||||||
$plugin = "statistics_json";
|
$plugin = "statistics_json";
|
||||||
|
|
|
@ -35,6 +35,7 @@ function nogroup_content(&$a) {
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
|
|
||||||
|
$contact_details = get_contact_details_by_url($rr['url'], local_user());
|
||||||
|
|
||||||
$contacts[] = array(
|
$contacts[] = array(
|
||||||
'img_hover' => sprintf( t('Visit %s\'s profile [%s]'),$rr['name'],$rr['url']),
|
'img_hover' => sprintf( t('Visit %s\'s profile [%s]'),$rr['name'],$rr['url']),
|
||||||
|
@ -46,8 +47,11 @@ function nogroup_content(&$a) {
|
||||||
'thumb' => $rr['thumb'],
|
'thumb' => $rr['thumb'],
|
||||||
'name' => $rr['name'],
|
'name' => $rr['name'],
|
||||||
'username' => $rr['name'],
|
'username' => $rr['name'],
|
||||||
|
'details' => $contact_details['location'],
|
||||||
|
'tags' => $contact_details['keywords'],
|
||||||
|
'about' => $contact_details['about'],
|
||||||
'sparkle' => $sparkle,
|
'sparkle' => $sparkle,
|
||||||
'itemurl' => $rr['url'],
|
'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']),
|
||||||
'url' => $url,
|
'url' => $url,
|
||||||
'network' => network_to_name($rr['network'], $url),
|
'network' => network_to_name($rr['network'], $url),
|
||||||
);
|
);
|
||||||
|
|
|
@ -9,6 +9,8 @@ function notes_init(&$a) {
|
||||||
|
|
||||||
$which = $a->user['nickname'];
|
$which = $a->user['nickname'];
|
||||||
|
|
||||||
|
nav_set_selected('home');
|
||||||
|
|
||||||
// profile_load($a,$which,$profile);
|
// profile_load($a,$which,$profile);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
include_once("include/bbcode.php");
|
include_once("include/bbcode.php");
|
||||||
|
include_once("include/contact_selectors.php");
|
||||||
|
include_once("include/Scrape.php");
|
||||||
|
|
||||||
function notifications_post(&$a) {
|
function notifications_post(&$a) {
|
||||||
|
|
||||||
|
@ -138,7 +140,8 @@ function notifications_content(&$a) {
|
||||||
|
|
||||||
$r = q("SELECT `intro`.`id` AS `intro_id`, `intro`.*, `contact`.*, `fcontact`.`name` AS `fname`,`fcontact`.`url` AS `furl`,`fcontact`.`photo` AS `fphoto`,`fcontact`.`request` AS `frequest`,
|
$r = q("SELECT `intro`.`id` AS `intro_id`, `intro`.*, `contact`.*, `fcontact`.`name` AS `fname`,`fcontact`.`url` AS `furl`,`fcontact`.`photo` AS `fphoto`,`fcontact`.`request` AS `frequest`,
|
||||||
`gcontact`.`location` AS `glocation`, `gcontact`.`about` AS `gabout`,
|
`gcontact`.`location` AS `glocation`, `gcontact`.`about` AS `gabout`,
|
||||||
`gcontact`.`keywords` AS `gkeywords`, `gcontact`.`gender` AS `ggender`
|
`gcontact`.`keywords` AS `gkeywords`, `gcontact`.`gender` AS `ggender`,
|
||||||
|
`gcontact`.`network` AS `gnetwork`
|
||||||
FROM `intro`
|
FROM `intro`
|
||||||
LEFT JOIN `contact` ON `contact`.`id` = `intro`.`contact-id`
|
LEFT JOIN `contact` ON `contact`.`id` = `intro`.`contact-id`
|
||||||
LEFT JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl`
|
LEFT JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl`
|
||||||
|
@ -152,6 +155,7 @@ function notifications_content(&$a) {
|
||||||
$tpl = get_markup_template("intros.tpl");
|
$tpl = get_markup_template("intros.tpl");
|
||||||
|
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
|
|
||||||
if($rr['fid']) {
|
if($rr['fid']) {
|
||||||
|
|
||||||
$return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
|
$return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
|
||||||
|
@ -162,7 +166,7 @@ function notifications_content(&$a) {
|
||||||
'$intro_id' => $rr['intro_id'],
|
'$intro_id' => $rr['intro_id'],
|
||||||
'$madeby' => sprintf( t('suggested by %s'),$rr['name']),
|
'$madeby' => sprintf( t('suggested by %s'),$rr['name']),
|
||||||
'$contact_id' => $rr['contact-id'],
|
'$contact_id' => $rr['contact-id'],
|
||||||
'$photo' => ((x($rr,'fphoto')) ? $rr['fphoto'] : "images/person-175.jpg"),
|
'$photo' => ((x($rr,'fphoto')) ? proxy_url($rr['fphoto'], false, PROXY_SIZE_SMALL) : "images/person-175.jpg"),
|
||||||
'$fullname' => $rr['fname'],
|
'$fullname' => $rr['fname'],
|
||||||
'$url' => zrl($rr['furl']),
|
'$url' => zrl($rr['furl']),
|
||||||
'$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
|
'$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
|
||||||
|
@ -206,7 +210,27 @@ function notifications_content(&$a) {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$header = $rr["name"];
|
||||||
|
|
||||||
|
$ret = probe_url($rr["url"]);
|
||||||
|
|
||||||
|
if ($rr['gnetwork'] == "")
|
||||||
|
$rr['gnetwork'] = $ret["network"];
|
||||||
|
|
||||||
|
if ($ret["addr"] != "")
|
||||||
|
$header .= " <".$ret["addr"].">";
|
||||||
|
|
||||||
|
$header .= " (".network_to_name($rr['gnetwork'], $rr['url']).")";
|
||||||
|
|
||||||
|
// Don't show these data until you are connected. Diaspora is doing the same.
|
||||||
|
if($rr['gnetwork'] === NETWORK_DIASPORA) {
|
||||||
|
$rr['glocation'] = "";
|
||||||
|
$rr['gabout'] = "";
|
||||||
|
$rr['ggender'] = "";
|
||||||
|
}
|
||||||
|
|
||||||
$notif_content .= replace_macros($tpl, array(
|
$notif_content .= replace_macros($tpl, array(
|
||||||
|
'$header' => htmlentities($header),
|
||||||
'$str_notifytype' => t('Notification type: '),
|
'$str_notifytype' => t('Notification type: '),
|
||||||
'$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')),
|
'$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')),
|
||||||
'$dfrn_text' => $dfrn_text,
|
'$dfrn_text' => $dfrn_text,
|
||||||
|
@ -214,12 +238,11 @@ function notifications_content(&$a) {
|
||||||
'$uid' => $_SESSION['uid'],
|
'$uid' => $_SESSION['uid'],
|
||||||
'$intro_id' => $rr['intro_id'],
|
'$intro_id' => $rr['intro_id'],
|
||||||
'$contact_id' => $rr['contact-id'],
|
'$contact_id' => $rr['contact-id'],
|
||||||
'$photo' => ((x($rr,'photo')) ? proxy_url($rr['photo']) : "images/person-175.jpg"),
|
'$photo' => ((x($rr,'photo')) ? proxy_url($rr['photo'], false, PROXY_SIZE_SMALL) : "images/person-175.jpg"),
|
||||||
'$fullname' => $rr['name'],
|
'$fullname' => $rr['name'],
|
||||||
|
'$location' => bbcode($rr['glocation'], false, false),
|
||||||
'$location_label' => t('Location:'),
|
'$location_label' => t('Location:'),
|
||||||
'$location' => $rr['glocation'],
|
'$about' => bbcode($rr['gabout'], false, false),
|
||||||
'$location_label' => t('Location:'),
|
|
||||||
'$about' => proxy_parse_html(bbcode($rr['gabout'], false, false)),
|
|
||||||
'$about_label' => t('About:'),
|
'$about_label' => t('About:'),
|
||||||
'$keywords' => $rr['gkeywords'],
|
'$keywords' => $rr['gkeywords'],
|
||||||
'$keywords_label' => t('Tags:'),
|
'$keywords_label' => t('Tags:'),
|
||||||
|
@ -227,7 +250,9 @@ function notifications_content(&$a) {
|
||||||
'$gender_label' => t('Gender:'),
|
'$gender_label' => t('Gender:'),
|
||||||
'$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
|
'$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
|
||||||
'$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
|
'$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
|
||||||
'$url' => zrl($rr['url']),
|
'$url' => $rr['url'],
|
||||||
|
'$zrl' => zrl($rr['url']),
|
||||||
|
'$url_label' => t('Profile URL'),
|
||||||
'$knowyou' => $knowyou,
|
'$knowyou' => $knowyou,
|
||||||
'$approve' => t('Approve'),
|
'$approve' => t('Approve'),
|
||||||
'$note' => $rr['note'],
|
'$note' => $rr['note'],
|
||||||
|
@ -278,7 +303,7 @@ function notifications_content(&$a) {
|
||||||
$notif_content .= replace_macros($tpl_item_likes,array(
|
$notif_content .= replace_macros($tpl_item_likes,array(
|
||||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||||
'$item_image' => $it['author-avatar'],
|
'$item_image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||||
'$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
|
'$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
|
||||||
'$item_when' => relative_date($it['created'])
|
'$item_when' => relative_date($it['created'])
|
||||||
));
|
));
|
||||||
|
@ -288,7 +313,7 @@ function notifications_content(&$a) {
|
||||||
$notif_content .= replace_macros($tpl_item_dislikes,array(
|
$notif_content .= replace_macros($tpl_item_dislikes,array(
|
||||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||||
'$item_image' => $it['author-avatar'],
|
'$item_image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||||
'$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
|
'$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
|
||||||
'$item_when' => relative_date($it['created'])
|
'$item_when' => relative_date($it['created'])
|
||||||
));
|
));
|
||||||
|
@ -303,7 +328,7 @@ function notifications_content(&$a) {
|
||||||
$notif_content .= replace_macros($tpl_item_friends,array(
|
$notif_content .= replace_macros($tpl_item_friends,array(
|
||||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||||
'$item_image' => $it['author-avatar'],
|
'$item_image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||||
'$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
|
'$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
|
||||||
'$item_when' => relative_date($it['created'])
|
'$item_when' => relative_date($it['created'])
|
||||||
));
|
));
|
||||||
|
@ -318,7 +343,7 @@ function notifications_content(&$a) {
|
||||||
$notif_content .= replace_macros($tpl,array(
|
$notif_content .= replace_macros($tpl,array(
|
||||||
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
//'$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
|
||||||
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
'$item_link' => $a->get_baseurl(true).'/display/'.$it['pguid'],
|
||||||
'$item_image' => $it['author-avatar'],
|
'$item_image' => proxy_url($it['author-avatar'], false, PROXY_SIZE_MICRO),
|
||||||
'$item_text' => $item_text,
|
'$item_text' => $item_text,
|
||||||
'$item_when' => relative_date($it['created'])
|
'$item_when' => relative_date($it['created'])
|
||||||
));
|
));
|
||||||
|
@ -351,7 +376,7 @@ function notifications_content(&$a) {
|
||||||
foreach ($r as $it) {
|
foreach ($r as $it) {
|
||||||
$notif_content .= replace_macros($not_tpl,array(
|
$notif_content .= replace_macros($not_tpl,array(
|
||||||
'$item_link' => $a->get_baseurl(true).'/notify/view/'. $it['id'],
|
'$item_link' => $a->get_baseurl(true).'/notify/view/'. $it['id'],
|
||||||
'$item_image' => $it['photo'],
|
'$item_image' => proxy_url($it['photo'], false, PROXY_SIZE_MICRO),
|
||||||
'$item_text' => strip_tags(bbcode($it['msg'])),
|
'$item_text' => strip_tags(bbcode($it['msg'])),
|
||||||
'$item_when' => relative_date($it['date'])
|
'$item_when' => relative_date($it['date'])
|
||||||
));
|
));
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
require_once('include/Photo.php');
|
require_once('include/Photo.php');
|
||||||
|
require_once('include/photos.php');
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
require_once('include/acl_selectors.php');
|
require_once('include/acl_selectors.php');
|
||||||
require_once('include/bbcode.php');
|
require_once('include/bbcode.php');
|
||||||
|
@ -17,6 +18,8 @@ function photos_init(&$a) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nav_set_selected('home');
|
||||||
|
|
||||||
$o = '';
|
$o = '';
|
||||||
|
|
||||||
if($a->argc > 1) {
|
if($a->argc > 1) {
|
||||||
|
@ -30,6 +33,7 @@ function photos_init(&$a) {
|
||||||
|
|
||||||
$a->data['user'] = $r[0];
|
$a->data['user'] = $r[0];
|
||||||
$a->profile_uid = $r[0]['uid'];
|
$a->profile_uid = $r[0]['uid'];
|
||||||
|
$is_owner = (local_user() && (local_user() == $a->profile_uid));
|
||||||
|
|
||||||
$profilephoto = $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg');
|
$profilephoto = $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg');
|
||||||
|
|
||||||
|
@ -62,6 +66,9 @@ function photos_init(&$a) {
|
||||||
|
|
||||||
$ret['albums'] = array();
|
$ret['albums'] = array();
|
||||||
foreach($albums as $k => $album) {
|
foreach($albums as $k => $album) {
|
||||||
|
//hide profile photos to others
|
||||||
|
if((! $is_owner) && (! remote_user()) && ($album['album'] == t('Profile Photos')))
|
||||||
|
continue;
|
||||||
$entry = array(
|
$entry = array(
|
||||||
'text' => $album['album'],
|
'text' => $album['album'],
|
||||||
'total' => $album['total'],
|
'total' => $album['total'],
|
||||||
|
@ -194,6 +201,10 @@ function photos_post(&$a) {
|
||||||
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
|
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RENAME photo album
|
||||||
|
*/
|
||||||
|
|
||||||
$newalbum = notags(trim($_POST['albumname']));
|
$newalbum = notags(trim($_POST['albumname']));
|
||||||
if($newalbum != $album) {
|
if($newalbum != $album) {
|
||||||
q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d",
|
q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d",
|
||||||
|
@ -206,6 +217,9 @@ function photos_post(&$a) {
|
||||||
return; // NOTREACHED
|
return; // NOTREACHED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DELETE photo album and all its photos
|
||||||
|
*/
|
||||||
|
|
||||||
if($_POST['dropalbum'] == t('Delete Album')) {
|
if($_POST['dropalbum'] == t('Delete Album')) {
|
||||||
|
|
||||||
|
@ -833,7 +847,7 @@ function photos_post(&$a) {
|
||||||
killme();
|
killme();
|
||||||
}
|
}
|
||||||
|
|
||||||
$ph->orient($src);
|
$exif = $ph->orient($src);
|
||||||
@unlink($src);
|
@unlink($src);
|
||||||
|
|
||||||
$max_length = get_config('system','max_image_length');
|
$max_length = get_config('system','max_image_length');
|
||||||
|
@ -874,8 +888,20 @@ function photos_post(&$a) {
|
||||||
|
|
||||||
// Create item container
|
// Create item container
|
||||||
|
|
||||||
|
$lat = $lon = null;
|
||||||
|
|
||||||
|
if($exif && $exif['GPS']) {
|
||||||
|
if(feature_enabled($channel_id,'photo_location')) {
|
||||||
|
$lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']);
|
||||||
|
$lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$arr = array();
|
$arr = array();
|
||||||
|
|
||||||
|
if($lat && $lon)
|
||||||
|
$arr['coord'] = $lat . ' ' . $lon;
|
||||||
|
|
||||||
$arr['uid'] = $page_owner_uid;
|
$arr['uid'] = $page_owner_uid;
|
||||||
$arr['uri'] = $uri;
|
$arr['uri'] = $uri;
|
||||||
$arr['parent-uri'] = $uri;
|
$arr['parent-uri'] = $uri;
|
||||||
|
@ -1059,13 +1085,12 @@ function photos_content(&$a) {
|
||||||
$o = "";
|
$o = "";
|
||||||
|
|
||||||
// tabs
|
// tabs
|
||||||
$_is_owner = (local_user() && (local_user() == $owner_uid));
|
$is_owner = (local_user() && (local_user() == $owner_uid));
|
||||||
$o .= profile_tabs($a,$_is_owner, $a->data['user']['nickname']);
|
$o .= profile_tabs($a,$is_owner, $a->data['user']['nickname']);
|
||||||
|
|
||||||
//
|
|
||||||
// dispatch request
|
|
||||||
//
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display upload form
|
||||||
|
*/
|
||||||
|
|
||||||
if($datatype === 'upload') {
|
if($datatype === 'upload') {
|
||||||
if(! ($can_post)) {
|
if(! ($can_post)) {
|
||||||
|
@ -1176,6 +1201,10 @@ function photos_content(&$a) {
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display a single photo album
|
||||||
|
*/
|
||||||
|
|
||||||
if($datatype === 'album') {
|
if($datatype === 'album') {
|
||||||
|
|
||||||
$album = hex2bin($datum);
|
$album = hex2bin($datum);
|
||||||
|
@ -1203,6 +1232,7 @@ function photos_content(&$a) {
|
||||||
intval($a->pager['itemspage'])
|
intval($a->pager['itemspage'])
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//edit album name
|
||||||
if($cmd === 'edit') {
|
if($cmd === 'edit') {
|
||||||
if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
|
if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
|
||||||
if($can_post) {
|
if($can_post) {
|
||||||
|
@ -1290,11 +1320,12 @@ function photos_content(&$a) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display one photo
|
||||||
|
*/
|
||||||
|
|
||||||
if($datatype === 'image') {
|
if($datatype === 'image') {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//$o = '';
|
//$o = '';
|
||||||
// fetch image, item containing image, then comments
|
// fetch image, item containing image, then comments
|
||||||
|
|
||||||
|
@ -1418,6 +1449,9 @@ function photos_content(&$a) {
|
||||||
$linked_items = q("SELECT * FROM `item` WHERE `resource-id` = '%s' $sql_extra LIMIT 1",
|
$linked_items = q("SELECT * FROM `item` WHERE `resource-id` = '%s' $sql_extra LIMIT 1",
|
||||||
dbesc($datum)
|
dbesc($datum)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$map = null;
|
||||||
|
|
||||||
if(count($linked_items)) {
|
if(count($linked_items)) {
|
||||||
$link_item = $linked_items[0];
|
$link_item = $linked_items[0];
|
||||||
$r = q("SELECT COUNT(*) AS `total`
|
$r = q("SELECT COUNT(*) AS `total`
|
||||||
|
@ -1461,6 +1495,10 @@ function photos_content(&$a) {
|
||||||
);
|
);
|
||||||
update_thread($link_item['parent']);
|
update_thread($link_item['parent']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($link_item['coord']) {
|
||||||
|
$map = generate_map($link_item['coord']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$tags=Null;
|
$tags=Null;
|
||||||
|
@ -1597,18 +1635,22 @@ function photos_content(&$a) {
|
||||||
$like = '';
|
$like = '';
|
||||||
$dislike = '';
|
$dislike = '';
|
||||||
|
|
||||||
|
$conv_responses = array(
|
||||||
|
'like' => array('title' => t('Likes','title')),'dislike' => array('title' => t('Dislikes','title')),
|
||||||
|
'attendyes' => array('title' => t('Attending','title')), 'attendno' => array('title' => t('Not attending','title')), 'attendmaybe' => array('title' => t('Might attend','title'))
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// display comments
|
// display comments
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
|
|
||||||
foreach($r as $item) {
|
foreach($r as $item) {
|
||||||
like_puller($a,$item,$alike,'like');
|
builtin_activity_puller($item, $conv_responses);
|
||||||
like_puller($a,$item,$dlike,'dislike');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$like = ((isset($alike[$link_item['id']])) ? format_like($alike[$link_item['id']],$alike[$link_item['id'] . '-l'],'like',$link_item['id']) : '');
|
$like = ((x($conv_responses['like'],$link_item['uri'])) ? format_like($conv_responses['like'][$link_item['uri']],$conv_responses['like'][$link_item['uri'] . '-l'],'like',$link_item['id']) : '');
|
||||||
$dislike = ((isset($dlike[$link_item['id']])) ? format_like($dlike[$link_item['id']],$dlike[$link_item['id'] . '-l'],'dislike',$link_item['id']) : '');
|
$dislike = ((x($conv_responses['dislike'],$link_item['uri'])) ? format_like($conv_responses['dislike'][$link_item['uri']],$conv_responses['dislike'][$link_item['uri'] . '-l'],'dislike',$link_item['id']) : '');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1727,6 +1769,12 @@ function photos_content(&$a) {
|
||||||
$paginate = paginate($a);
|
$paginate = paginate($a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$response_verbs = array('like');
|
||||||
|
if(feature_enabled($owner_uid,'dislike'))
|
||||||
|
$response_verbs[] = 'dislike';
|
||||||
|
$responses = get_responses($conv_responses,$response_verbs,'',$link_item);
|
||||||
|
|
||||||
$photo_tpl = get_markup_template('photo_view.tpl');
|
$photo_tpl = get_markup_template('photo_view.tpl');
|
||||||
|
|
||||||
if($a->theme['template_engine'] === 'internal') {
|
if($a->theme['template_engine'] === 'internal') {
|
||||||
|
@ -1753,9 +1801,12 @@ function photos_content(&$a) {
|
||||||
'$desc' => $ph[0]['desc'],
|
'$desc' => $ph[0]['desc'],
|
||||||
'$tags' => $tags_e,
|
'$tags' => $tags_e,
|
||||||
'$edit' => $edit,
|
'$edit' => $edit,
|
||||||
|
'$map' => $map,
|
||||||
|
'$map_text' => t('Map'),
|
||||||
'$likebuttons' => $likebuttons,
|
'$likebuttons' => $likebuttons,
|
||||||
'$like' => $like_e,
|
'$like' => $like_e,
|
||||||
'$dislike' => $dikslike_e,
|
'$dislike' => $dikslike_e,
|
||||||
|
'responses' => $responses,
|
||||||
'$comments' => $comments,
|
'$comments' => $comments,
|
||||||
'$paginate' => $paginate,
|
'$paginate' => $paginate,
|
||||||
));
|
));
|
||||||
|
@ -1799,6 +1850,10 @@ function photos_content(&$a) {
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
$twist = 'rotright';
|
$twist = 'rotright';
|
||||||
foreach($r as $rr) {
|
foreach($r as $rr) {
|
||||||
|
//hide profile photos to others
|
||||||
|
if((! $is_owner) && (! remote_user()) && ($rr['album'] == t('Profile Photos')))
|
||||||
|
continue;
|
||||||
|
|
||||||
if($twist == 'rotright')
|
if($twist == 'rotright')
|
||||||
$twist = 'rotleft';
|
$twist = 'rotleft';
|
||||||
else
|
else
|
||||||
|
|
29
mod/ping.php
29
mod/ping.php
|
@ -33,6 +33,7 @@ function ping_init(&$a) {
|
||||||
|
|
||||||
$home = 0;
|
$home = 0;
|
||||||
$network = 0;
|
$network = 0;
|
||||||
|
$network_group = array();
|
||||||
|
|
||||||
$r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`wall`, `item`.`author-name`,
|
$r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`wall`, `item`.`author-name`,
|
||||||
`item`.`contact-id`, `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object`,
|
`item`.`contact-id`, `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object`,
|
||||||
|
@ -40,8 +41,9 @@ function ping_init(&$a) {
|
||||||
FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
|
FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
|
||||||
WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
|
WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
|
||||||
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `pitem`.`parent` != 0
|
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `pitem`.`parent` != 0
|
||||||
|
AND `item`.`contact-id` != %d
|
||||||
ORDER BY `item`.`created` DESC",
|
ORDER BY `item`.`created` DESC",
|
||||||
intval(local_user())
|
intval(local_user()), intval(local_user())
|
||||||
);
|
);
|
||||||
|
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
|
@ -84,6 +86,22 @@ function ping_init(&$a) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( $network )
|
||||||
|
{
|
||||||
|
# Find out how unseen network posts are spread across groups
|
||||||
|
$sql = "SELECT g.id, g.name, count(i.id) count " .
|
||||||
|
"FROM `group` g, group_member gm, item i " .
|
||||||
|
"WHERE g.uid = %d " .
|
||||||
|
"AND i.uid = %d " .
|
||||||
|
"AND i.unseen AND i.visible " .
|
||||||
|
"AND NOT i.deleted " .
|
||||||
|
"AND i.`contact-id` = gm.`contact-id` " .
|
||||||
|
"AND gm.gid = g.id GROUP BY g.id";
|
||||||
|
#echo '<SQL id="' . intval(local_user()) . '">' . $sql . '</SQL>';
|
||||||
|
$network_group = q($sql, intval(local_user()), intval(local_user()));
|
||||||
|
#echo '<COUNT R="' . count($network_group) . '"/>';
|
||||||
|
}
|
||||||
|
|
||||||
$intros1 = q("SELECT `intro`.`id`, `intro`.`datetime`,
|
$intros1 = q("SELECT `intro`.`id`, `intro`.`datetime`,
|
||||||
`fcontact`.`name`, `fcontact`.`url`, `fcontact`.`photo`
|
`fcontact`.`name`, `fcontact`.`url`, `fcontact`.`photo`
|
||||||
FROM `intro` LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id`
|
FROM `intro` LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id`
|
||||||
|
@ -173,7 +191,7 @@ function ping_init(&$a) {
|
||||||
* 'message' => notification message. "{0}" will be replaced by subject name
|
* 'message' => notification message. "{0}" will be replaced by subject name
|
||||||
**/
|
**/
|
||||||
function xmlize($n){
|
function xmlize($n){
|
||||||
$n['photo'] = proxy_url($n['photo']);
|
$n['photo'] = proxy_url($n['photo'], false, PROXY_SIZE_MICRO);
|
||||||
|
|
||||||
$n['message'] = html_entity_decode($n['message'], ENT_COMPAT | ENT_HTML401, "UTF-8");
|
$n['message'] = html_entity_decode($n['message'], ENT_COMPAT | ENT_HTML401, "UTF-8");
|
||||||
$n['name'] = html_entity_decode($n['name'], ENT_COMPAT | ENT_HTML401, "UTF-8");
|
$n['name'] = html_entity_decode($n['name'], ENT_COMPAT | ENT_HTML401, "UTF-8");
|
||||||
|
@ -202,6 +220,13 @@ function ping_init(&$a) {
|
||||||
<net>$network</net>
|
<net>$network</net>
|
||||||
<home>$home</home>\r\n";
|
<home>$home</home>\r\n";
|
||||||
if ($register!=0) echo "<register>$register</register>";
|
if ($register!=0) echo "<register>$register</register>";
|
||||||
|
if ( count($network_group) ) {
|
||||||
|
echo '<groups>';
|
||||||
|
foreach ($network_group as $it) {
|
||||||
|
echo '<group id="' . $it['id'] . '">' . $it['count'] . "</group>";
|
||||||
|
}
|
||||||
|
echo "</groups>";
|
||||||
|
}
|
||||||
|
|
||||||
echo "<all-events>$all_events</all-events>
|
echo "<all-events>$all_events</all-events>
|
||||||
<all-events-today>$all_events_today</all-events-today>
|
<all-events-today>$all_events_today</all-events-today>
|
||||||
|
|
24
mod/poco.php
24
mod/poco.php
|
@ -69,14 +69,8 @@ function poco_init(&$a) {
|
||||||
dbesc(NETWORK_OSTATUS)
|
dbesc(NETWORK_OSTATUS)
|
||||||
);
|
);
|
||||||
} elseif($system_mode) {
|
} elseif($system_mode) {
|
||||||
$r = q("SELECT count(*) AS `total` FROM `contact` WHERE `self` = 1 AND `network` IN ('%s', '%s', '%s', '%s')
|
$r = q("SELECT count(*) AS `total` FROM `contact` WHERE `self` = 1
|
||||||
AND (`success_update` >= `failure_update` OR `last-item` >= `failure_update`)
|
AND `uid` IN (SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1) ");
|
||||||
AND `uid` IN (SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1) ",
|
|
||||||
dbesc(NETWORK_DFRN),
|
|
||||||
dbesc(NETWORK_DIASPORA),
|
|
||||||
dbesc(NETWORK_OSTATUS),
|
|
||||||
dbesc(NETWORK_STATUSNET)
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
$r = q("SELECT count(*) AS `total` FROM `contact` WHERE `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 AND `archive` = 0
|
$r = q("SELECT count(*) AS `total` FROM `contact` WHERE `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 AND `archive` = 0
|
||||||
AND (`success_update` >= `failure_update` OR `last-item` >= `failure_update`)
|
AND (`success_update` >= `failure_update` OR `last-item` >= `failure_update`)
|
||||||
|
@ -115,13 +109,8 @@ function poco_init(&$a) {
|
||||||
$r = q("SELECT `contact`.*, `profile`.`about` AS `pabout`, `profile`.`locality` AS `plocation`, `profile`.`pub_keywords`, `profile`.`gender` AS `pgender`,
|
$r = q("SELECT `contact`.*, `profile`.`about` AS `pabout`, `profile`.`locality` AS `plocation`, `profile`.`pub_keywords`, `profile`.`gender` AS `pgender`,
|
||||||
`profile`.`address` AS `paddress`, `profile`.`region` AS `pregion`, `profile`.`postal-code` AS `ppostalcode`, `profile`.`country-name` AS `pcountry`
|
`profile`.`address` AS `paddress`, `profile`.`region` AS `pregion`, `profile`.`postal-code` AS `ppostalcode`, `profile`.`country-name` AS `pcountry`
|
||||||
FROM `contact` INNER JOIN `profile` ON `profile`.`uid` = `contact`.`uid`
|
FROM `contact` INNER JOIN `profile` ON `profile`.`uid` = `contact`.`uid`
|
||||||
WHERE `self` = 1 AND `network` IN ('%s', '%s', '%s', '%s') AND `profile`.`is-default`
|
WHERE `self` = 1 AND `profile`.`is-default`
|
||||||
AND ((`contact`.`success_update` >= `contact`.`failure_update`) OR (`contact`.`last-item` >= `contact`.`failure_update`))
|
|
||||||
AND `contact`.`uid` IN (SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1) LIMIT %d, %d",
|
AND `contact`.`uid` IN (SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1) LIMIT %d, %d",
|
||||||
dbesc(NETWORK_DFRN),
|
|
||||||
dbesc(NETWORK_DIASPORA),
|
|
||||||
dbesc(NETWORK_OSTATUS),
|
|
||||||
dbesc(NETWORK_STATUSNET),
|
|
||||||
intval($startIndex),
|
intval($startIndex),
|
||||||
intval($itemsPerPage)
|
intval($itemsPerPage)
|
||||||
);
|
);
|
||||||
|
@ -226,6 +215,13 @@ function poco_init(&$a) {
|
||||||
Cache::set("about:".$rr['updated'].":".$rr['nurl'],$about);
|
Cache::set("about:".$rr['updated'].":".$rr['nurl'],$about);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Non connected persons can only see the keywords of a Diaspora account
|
||||||
|
if ($rr['network'] == NETWORK_DIASPORA) {
|
||||||
|
$rr['location'] = "";
|
||||||
|
$about = "";
|
||||||
|
$rr['gender'] = "";
|
||||||
|
}
|
||||||
|
|
||||||
$entry = array();
|
$entry = array();
|
||||||
if($fields_ret['id'])
|
if($fields_ret['id'])
|
||||||
$entry['id'] = (int)$rr['id'];
|
$entry['id'] = (int)$rr['id'];
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue