Merge branch 'dispy' of github.com:fabrixxm/friendika into dispy

This commit is contained in:
fabrixxm 2011-07-05 07:11:57 +02:00
commit 4e7a5dc56e
469 changed files with 1670 additions and 637 deletions

4
.gitignore vendored
View file

@ -1,11 +1,9 @@
favicon.* favicon.*
.htconfig.php .htconfig.php
\#* \#*
wip/*
include/jquery-1.4.2.min.js include/jquery-1.4.2.min.js
*.log *.log
*.out *.out
*.version* *.version*
push* favicon.*
langup
home.html home.html

View file

@ -9,12 +9,13 @@ Deny from all
<IfModule mod_rewrite.c> <IfModule mod_rewrite.c>
RewriteEngine on RewriteEngine on
# RewriteRule api.* - [E=REMOTE_USER:%{HTTP:Authorization},L] # Protect repository directory from browsing
# Protect repo directory from browsing
RewriteRule "(^|/)\.git" - [F] RewriteRule "(^|/)\.git" - [F]
# Rewrite current-style URLs of the form 'index.php?q=x'. # Rewrite current-style URLs of the form 'index.php?q=x'.
# Also place auth information into REMOTE_USER for sites running
# in CGI mode.
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [E=REMOTE_USER:%{HTTP:Authorization},L,QSA] RewriteRule ^(.*)$ index.php?q=$1 [E=REMOTE_USER:%{HTTP:Authorization},L,QSA]

View file

@ -113,3 +113,95 @@ $a->config['system']['addon'] = 'js_upload,poormancron';
and save your changes. and save your changes.
#####################################################################
If things don't work...
#####################################################################
#####################################################################
- If you get the message
"System is currently unavailable. Please try again later"
#####################################################################
Check your database settings. It usually means your database could not
be opened or accessed. If the database resides on the same machine, check that
the database server name is "localhost".
#####################################################################
- 500 Internal Error
#####################################################################
This could be the result of one of our Apache directives not being
supported by your version of Apache. Examine your apache server logs.
You might remove the line "Options -Indexes" from the .htaccess file if
you are using a Windows server as this has been known to cause problems.
Also check your file permissions. Your website and all contents must generally
be world-readable.
It is likely that your web server reported the source of the problem in
its error log files. Please review these system error logs to determine what
caused the problem. Often this will need to be resolved with your hosting
provider or (if self-hosted) your web server configuration.
#####################################################################
- 400 and 4xx "File not found" errors
#####################################################################
First check your file permissions. Your website and all contents must
generally be world-readable.
Ensure that mod-rewite is installed and working, and that your
.htaccess file is being used. To verify the latter, create a file test.out
containing the word "test" in the top directory of Friendika, make it world
readable and point your web browser to
http://yoursitenamehere.com/test.out
This file should be blocked. You should get a permission denied message.
If you see the word "test" your Apache configuration is not allowing
your .htaccess file to be used (there are rules in this file to block access
to any file with .out at the end, as these are typically used for system logs).
Make certain the .htaccess file exists and is readable by everybody, then
look for the existence of "AllowOverride None" in the Apache server
configuration for your site. This will need to be changed to
"AllowOverride All".
If you do not see the word "test", your .htaccess is working, but it is
likely that mod-rewrite is not installed in your web server or is not working.
On most flavour of Linux,
% a2enmod rewrite
% /etc/init.d/apache2 restart
Consult your hosting provider, experts on your particular Linux
distribution or (if Windows) the provider of your Apache server software if
you need to change either of these and can not figure out how. There is
a lot of help available on the web. Google "mod-rewrite" along with the
name of your operating system distribution or Apache package (if using
Windows).
#####################################################################
- If you are unable to write the file .htconfig.php during installation
due to permissions issues:
#####################################################################
create an empty file with that name and give it world-write permission.
For Linux:
% touch .htconfig.php
% chmod 777 .htconfig.php
Retry the installation. As soon as the database has been created,
******* this is important *********
% chmod 755 .htconfig.php

View file

@ -43,6 +43,25 @@
define('FACEBOOK_MAXPOSTLEN', 420); define('FACEBOOK_MAXPOSTLEN', 420);
function facebook_install() {
register_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook');
register_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
register_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
register_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
register_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
}
function facebook_uninstall() {
unregister_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook');
unregister_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
unregister_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
unregister_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
unregister_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
}
/* declare the facebook_module function so that /facebook url requests will land here */ /* declare the facebook_module function so that /facebook url requests will land here */
function facebook_module() {} function facebook_module() {}
@ -339,22 +358,6 @@ function facebook_content(&$a) {
return $o; return $o;
} }
function facebook_install() {
register_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook');
register_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
register_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
register_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
register_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
}
function facebook_uninstall() {
unregister_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook');
unregister_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets');
unregister_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings');
unregister_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron');
unregister_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook');
}
function facebook_cron($a,$b) { function facebook_cron($a,$b) {
@ -373,9 +376,12 @@ function facebook_cron($a,$b) {
logger('facebook_cron'); logger('facebook_cron');
set_config('facebook','last_poll', time());
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'post' AND `v` = '1' "); // Find the FB users on this site and randomize in case one of them
// uses an obscene amount of memory. It may kill this queue run
// but hopefully we'll get a few others through on each run.
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'post' AND `v` = '1' ORDER BY RAND() ");
if(count($r)) { if(count($r)) {
foreach($r as $rr) { foreach($r as $rr) {
// check for new friends once a day // check for new friends once a day
@ -389,6 +395,9 @@ function facebook_cron($a,$b) {
fb_consume_all($rr['uid']); fb_consume_all($rr['uid']);
} }
} }
set_config('facebook','last_poll', time());
} }
@ -431,6 +440,10 @@ function facebook_post_hook(&$a,&$b) {
if((local_user()) && (local_user() == $b['uid'])) { if((local_user()) && (local_user() == $b['uid'])) {
// Facebook is not considered a private network
if($b['prvnets'] && $b['private'])
return;
if($b['parent']) { if($b['parent']) {
$r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($b['parent']), intval($b['parent']),
@ -817,7 +830,7 @@ function fb_consume_stream($uid,$j,$wall = false) {
$datarray['owner-avatar'] = $self[0]['thumb']; $datarray['owner-avatar'] = $self[0]['thumb'];
} }
if(isset($entry->application) && isset($entry->application->name) && strlen($entry->application->name)) if(isset($entry->application) && isset($entry->application->name) && strlen($entry->application->name))
$datarray['app'] = $entry->application->name; $datarray['app'] = strip_tags($entry->application->name);
else else
$datarray['app'] = 'facebook'; $datarray['app'] = 'facebook';
$datarray['author-name'] = $from->name; $datarray['author-name'] = $from->name;

View file

@ -25,9 +25,9 @@ function oembed_uninstall() {
function oembed_settings_post($a,$b){ function oembed_settings_post($a,$b){
if(! local_user()) if(! local_user())
return; return;
if (isset($_POST['oembed-submit'])){ if (x($_POST,'oembed-submit')){
set_pconfig(local_user(), 'oembed', 'use_for_youtube', (isset($_POST['oembed_use_for_youtube'])? intval($_POST['oembed_use_for_youtube']):0)); set_pconfig(local_user(), 'oembed', 'use_for_youtube', (x($_POST,'oembed_use_for_youtube')? intval($_POST['oembed_use_for_youtube']):0));
notice( t('OEmbed settings updated') . EOL); info( t('OEmbed settings updated') . EOL);
} }
} }
@ -36,21 +36,13 @@ function oembed_settings(&$a,&$o) {
return; return;
$uofy = intval(get_pconfig(local_user(), 'oembed', 'use_for_youtube' )); $uofy = intval(get_pconfig(local_user(), 'oembed', 'use_for_youtube' ));
$o.=' $t = file_get_contents( dirname(__file__). "/settings.tpl" );
<div class="settings-block"> $o .= replace_macros($t, array(
<h3 class="settings-heading">OEmbed</h3> '$submit' => t('Submit'),
<div id="settings-username-wrapper"> '$title' => "OEmbed",
<label for="oembed_use_for_youtube">' '$useoembed' => array('oembed_use_for_youtube', t('Use OEmbed for YouTube videos'), $uofy, ""),
.t('Use OEmbed for YouTube videos: ') ));
.'</label><input type="checkbox" id="oembed_use_for_youtube" name="oembed_use_for_youtube" value="1"'
. ($uofy==1?'checked="true"':'')
.' />
</div>
<div id="settings-username-end"></div>
<div class="settings-submit-wrapper">
<input type="submit" value="'.t('Submit').'" class="settings-submit" name="oembed-submit" />
</div>
</div>';
} }

View file

@ -0,0 +1,7 @@
<div class="settings-block">
<h3 class="settings-heading">$title</h3>
{{ inc field_checkbox.tpl with $field=$useoembed }}{{ endinc }}
<div class="settings-submit-wrapper">
<input type="submit" value="$submit" class="settings-submit" name="oembed-submit" />
</div>
</div>

4
addon/piwik/admin.tpl Normal file
View file

@ -0,0 +1,4 @@
{{ inc field_input.tpl with $field=$baseurl }}{{ endinc }}
{{ inc field_input.tpl with $field=$siteid }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$optout }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>

View file

@ -18,10 +18,10 @@
* Add the following two lines to your .htconfig.php file: * Add the following two lines to your .htconfig.php file:
* *
* $a->config['piwik']['baseurl'] = 'www.example.com/piwik/'; * $a->config['piwik']['baseurl'] = 'www.example.com/piwik/';
* $a->config['piwik']['sideid'] = '1'; * $a->config['piwik']['siteid'] = '1';
* $a->config['piwik']['optout'] = true; // set to false to disable * $a->config['piwik']['optout'] = true; // set to false to disable
* *
* Change the sideid to the ID that the Piwik tracker for your Friendika * Change the siteid to the ID that the Piwik tracker for your Friendika
* installation has. Alter the baseurl to fit your needs, don't care * installation has. Alter the baseurl to fit your needs, don't care
* about http/https but beware to put the trailing / at the end of your * about http/https but beware to put the trailing / at the end of your
* setting. * setting.
@ -54,13 +54,13 @@ function piwik_analytics($a,&$b) {
* Get the configuration variables from the .htconfig file. * Get the configuration variables from the .htconfig file.
*/ */
$baseurl = get_config('piwik','baseurl'); $baseurl = get_config('piwik','baseurl');
$sideod = get_config('piwik','sideid'); $siteid = get_config('piwik','siteid');
$optout = get_config('piwik','optout'); $optout = get_config('piwik','optout');
/* /*
* Add the Piwik code for the side. * Add the Piwik code for the site.
*/ */
$b .= "<div id='piwik-code-block'> <!-- Piwik -->\r\n <script type=\"text/javascript\">\r\n var pkBaseURL = ((\"https:\" == document.location.protocol) ? \"https://".$baseurl."\" : \"http://".$baseurl."\");\r\n document.write(unescape(\"%3Cscript src='\" + pkBaseURL + \"piwik.js' type='text/javascript'%3E%3C/script%3E\"));\r\n </script>\r\n<script type=\"text/javascript\">\r\n try {\r\n var piwikTracker = Piwik.getTracker(pkBaseURL + \"piwik.php\", 8);\r\n piwikTracker.trackPageView();\r\n piwikTracker.enableLinkTracking();\r\n }\r\n catch( err ) {}\r\n </script>\r\n<noscript><p><img src=\"http://".$baseurl."/piwik.php?idsite=8\" style=\"border:0\" alt=\"\" /></p></noscript>\r\n <!-- End Piwik Tracking Tag --> </div>"; $b .= "<div id='piwik-code-block'> <!-- Piwik -->\r\n <script type=\"text/javascript\">\r\n var pkBaseURL = ((\"https:\" == document.location.protocol) ? \"https://".$baseurl."\" : \"http://".$baseurl."\");\r\n document.write(unescape(\"%3Cscript src='\" + pkBaseURL + \"piwik.js' type='text/javascript'%3E%3C/script%3E\"));\r\n </script>\r\n<script type=\"text/javascript\">\r\n try {\r\n var piwikTracker = Piwik.getTracker(pkBaseURL + \"piwik.php\", ".$siteid.");\r\n piwikTracker.trackPageView();\r\n piwikTracker.enableLinkTracking();\r\n }\r\n catch( err ) {}\r\n </script>\r\n<noscript><p><img src=\"http://".$baseurl."/piwik.php?idsite=".$siteid."\" style=\"border:0\" alt=\"\" /></p></noscript>\r\n <!-- End Piwik Tracking Tag --> </div>";
/* /*
* If the optout variable is set to true then display the notice * If the optout variable is set to true then display the notice
* otherwise just include the above code into the page. * otherwise just include the above code into the page.
@ -70,4 +70,21 @@ function piwik_analytics($a,&$b) {
} }
} }
function piwik_plugin_admin (&$a, &$o) {
$t = file_get_contents( dirname(__file__)."/admin.tpl");
$o = replace_macros( $t, array(
'$submit' => t('Submit'),
'$baseurl' => array('baseurl', t('Piwik Base URL'), get_config('piwik','baseurl' ), ''),
'$siteid' => array('siteid', t('Site ID'), get_config('piwik','siteid' ), ''),
'$optout' => array('optout', t('Show opt-out cookie link?'), get_config('piwik','optout' ), ''),
));
}
function piwik_plugin_admin_post (&$a) {
$url = ((x($_POST, 'baseurl')) ? notags(trim($_POST['baseurl'])) : '');
$id = ((x($_POST, 'siteid')) ? trim($_POST['siteid']) : '');
$optout = ((x($_POST, 'optout')) ? trim($_POST['optout']) : '');
set_config('piwik', 'baseurl', $url);
set_config('piwik', 'siteid', $id);
set_config('piwik', 'optout', $optout);
info( t('Settings updated.'). EOL);
}

View file

@ -89,6 +89,9 @@ function statusnet_jot_nets(&$a,&$b) {
function statusnet_settings_post ($a,$post) { function statusnet_settings_post ($a,$post) {
if(! local_user()) if(! local_user())
return; return;
// don't check statusnet settings if statusnet submit button is not clicked
if (!x($_POST,'statusnet-submit')) return;
if (isset($_POST['statusnet-disconnect'])) { if (isset($_POST['statusnet-disconnect'])) {
/*** /***
* if the statusnet-disconnect checkbox is set, clear the statusnet configuration * if the statusnet-disconnect checkbox is set, clear the statusnet configuration
@ -152,28 +155,28 @@ function statusnet_settings_post ($a,$post) {
goaway($a->get_baseurl().'/settings/addon'); goaway($a->get_baseurl().'/settings/addon');
} else { } else {
if (isset($_POST['statusnet-pin'])) { if (isset($_POST['statusnet-pin'])) {
// if the user supplied us with a PIN from Twitter, let the magic of OAuth happen // if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
logger('got a StatusNet security code'); logger('got a StatusNet security code');
$api = get_pconfig(local_user(), 'statusnet', 'baseapi'); $api = get_pconfig(local_user(), 'statusnet', 'baseapi');
$ckey = get_pconfig(local_user(), 'statusnet', 'consumerkey' ); $ckey = get_pconfig(local_user(), 'statusnet', 'consumerkey' );
$csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret' ); $csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret' );
// the token and secret for which the PIN was generated were hidden in the settings // the token and secret for which the PIN was generated were hidden in the settings
// form as token and token2, we need a new connection to Twitter using these token // form as token and token2, we need a new connection to Twitter using these token
// and secret to request a Access Token with the PIN // and secret to request a Access Token with the PIN
$connection = new StatusNetOAuth($api, $ckey, $csecret, $_POST['statusnet-token'], $_POST['statusnet-token2']); $connection = new StatusNetOAuth($api, $ckey, $csecret, $_POST['statusnet-token'], $_POST['statusnet-token2']);
$token = $connection->getAccessToken( $_POST['statusnet-pin'] ); $token = $connection->getAccessToken( $_POST['statusnet-pin'] );
// ok, now that we have the Access Token, save them in the user config // ok, now that we have the Access Token, save them in the user config
set_pconfig(local_user(),'statusnet', 'oauthtoken', $token['oauth_token']); set_pconfig(local_user(),'statusnet', 'oauthtoken', $token['oauth_token']);
set_pconfig(local_user(),'statusnet', 'oauthsecret', $token['oauth_token_secret']); set_pconfig(local_user(),'statusnet', 'oauthsecret', $token['oauth_token_secret']);
set_pconfig(local_user(),'statusnet', 'post', 1); set_pconfig(local_user(),'statusnet', 'post', 1);
// reload the Addon Settings page, if we don't do it see Bug #42 // reload the Addon Settings page, if we don't do it see Bug #42
goaway($a->get_baseurl().'/settings/addon'); goaway($a->get_baseurl().'/settings/addon');
} else { } else {
// if no PIN is supplied in the POST variables, the user has changed the setting // if no PIN is supplied in the POST variables, the user has changed the setting
// to post a tweet for every new __public__ posting to the wall // to post a tweet for every new __public__ posting to the wall
set_pconfig(local_user(),'statusnet','post',intval($_POST['statusnet-enable'])); set_pconfig(local_user(),'statusnet','post',intval($_POST['statusnet-enable']));
set_pconfig(local_user(),'statusnet','post_by_default',intval($_POST['statusnet-default'])); set_pconfig(local_user(),'statusnet','post_by_default',intval($_POST['statusnet-default']));
info( t('StatusNet settings updated.') . EOL); info( t('StatusNet settings updated.') . EOL);
}}}} }}}}
} }
function statusnet_settings(&$a,&$s) { function statusnet_settings(&$a,&$s) {
@ -217,7 +220,7 @@ function statusnet_settings(&$a,&$s) {
$s .= '<input type="radio" name="statusnet-preconf-apiurl" value="'. $asn['apiurl'] .'">'. $asn['sitename'] .'<br />'; $s .= '<input type="radio" name="statusnet-preconf-apiurl" value="'. $asn['apiurl'] .'">'. $asn['sitename'] .'<br />';
} }
$s .= '<p></p><div class="clear"></div></div>'; $s .= '<p></p><div class="clear"></div></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div>'; $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
} }
$s .= '<h4>' . t('Provide your own OAuth Credentials') . '</h4>'; $s .= '<h4>' . t('Provide your own OAuth Credentials') . '</h4>';
$s .= '<p>'. t('No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendika installation at your favorited StatusNet installation.') .'</p>'; $s .= '<p>'. t('No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendika installation at your favorited StatusNet installation.') .'</p>';
@ -231,7 +234,7 @@ function statusnet_settings(&$a,&$s) {
$s .= '<label id="statusnet-baseapi-label" for="statusnet-baseapi">'. t("Base API Path \x28remember the trailing /\x29") .'</label>'; $s .= '<label id="statusnet-baseapi-label" for="statusnet-baseapi">'. t("Base API Path \x28remember the trailing /\x29") .'</label>';
$s .= '<input id="statusnet-baseapi" type="text" name="statusnet-baseapi" size="35" /><br />'; $s .= '<input id="statusnet-baseapi" type="text" name="statusnet-baseapi" size="35" /><br />';
$s .= '<p></p><div class="clear"></div></div>'; $s .= '<p></p><div class="clear"></div></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div>'; $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
} else { } else {
/*** /***
* ok we have a consumer key pair now look into the OAuth stuff * ok we have a consumer key pair now look into the OAuth stuff
@ -256,15 +259,15 @@ function statusnet_settings(&$a,&$s) {
$s .= '<input id="statusnet-pin" type="text" name="statusnet-pin" />'; $s .= '<input id="statusnet-pin" type="text" name="statusnet-pin" />';
$s .= '<input id="statusnet-token" type="hidden" name="statusnet-token" value="'.$token.'" />'; $s .= '<input id="statusnet-token" type="hidden" name="statusnet-token" value="'.$token.'" />';
$s .= '<input id="statusnet-token2" type="hidden" name="statusnet-token2" value="'.$request_token['oauth_token_secret'].'" />'; $s .= '<input id="statusnet-token2" type="hidden" name="statusnet-token2" value="'.$request_token['oauth_token_secret'].'" />';
$s .= '</div><div class="clear"></div>'; $s .= '</div><div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div>'; $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
$s .= '<h4>'.t('Cancel Connection Process').'</h4>'; $s .= '<h4>'.t('Cancel Connection Process').'</h4>';
$s .= '<div id="statusnet-cancel-wrapper">'; $s .= '<div id="statusnet-cancel-wrapper">';
$s .= '<p>'.t('Current StatusNet API is').': '.$api.'</p>'; $s .= '<p>'.t('Current StatusNet API is').': '.$api.'</p>';
$s .= '<label id="statusnet-cancel-label" for="statusnet-cancel">'. t('Cancel StatusNet Connection') . '</label>'; $s .= '<label id="statusnet-cancel-label" for="statusnet-cancel">'. t('Cancel StatusNet Connection') . '</label>';
$s .= '<input id="statusnet-cancel" type="checkbox" name="statusnet-disconnect" value="1" />'; $s .= '<input id="statusnet-cancel" type="checkbox" name="statusnet-disconnect" value="1" />';
$s .= '</div><div class="clear"></div>'; $s .= '</div><div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div>'; $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
} else { } else {
/*** /***
* we have an OAuth key / secret pair for the user * we have an OAuth key / secret pair for the user
@ -286,7 +289,7 @@ function statusnet_settings(&$a,&$s) {
$s .= '<label id="statusnet-disconnect-label" for="statusnet-disconnect">'. t('Clear OAuth configuration') .'</label>'; $s .= '<label id="statusnet-disconnect-label" for="statusnet-disconnect">'. t('Clear OAuth configuration') .'</label>';
$s .= '<input id="statusnet-disconnect" type="checkbox" name="statusnet-disconnect" value="1" />'; $s .= '<input id="statusnet-disconnect" type="checkbox" name="statusnet-disconnect" value="1" />';
$s .= '</div><div class="clear"></div>'; $s .= '</div><div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div>'; $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
} }
} }
$s .= '</div><div class="clear"></div></div>'; $s .= '</div><div class="clear"></div></div>';
@ -303,10 +306,14 @@ function statusnet_post_hook(&$a,&$b) {
if((local_user()) && (local_user() == $b['uid']) && (! $b['private']) && (!$b['parent']) ) { if((local_user()) && (local_user() == $b['uid']) && (! $b['private']) && (!$b['parent']) ) {
load_pconfig(local_user(), 'statusnet'); // Status.Net is not considered a private network
if($b['prvnets'])
return;
$api = get_pconfig(local_user(), 'statusnet', 'baseapi'); load_pconfig(local_user(), 'statusnet');
$ckey = get_pconfig(local_user(), 'statusnet', 'consumerkey' );
$api = get_pconfig(local_user(), 'statusnet', 'baseapi');
$ckey = get_pconfig(local_user(), 'statusnet', 'consumerkey' );
$csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret' ); $csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret' );
$otoken = get_pconfig(local_user(), 'statusnet', 'oauthtoken' ); $otoken = get_pconfig(local_user(), 'statusnet', 'oauthtoken' );
$osecret = get_pconfig(local_user(), 'statusnet', 'oauthsecret' ); $osecret = get_pconfig(local_user(), 'statusnet', 'oauthsecret' );

View file

@ -76,6 +76,9 @@ function twitter_jot_nets(&$a,&$b) {
function twitter_settings_post ($a,$post) { function twitter_settings_post ($a,$post) {
if(! local_user()) if(! local_user())
return; return;
// don't check twitter settings if twitter submit button is not clicked
if (!x($_POST,'twitter-submit')) return;
if (isset($_POST['twitter-disconnect'])) { if (isset($_POST['twitter-disconnect'])) {
/*** /***
* if the twitter-disconnect checkbox is set, clear the OAuth key/secret pair * if the twitter-disconnect checkbox is set, clear the OAuth key/secret pair
@ -159,7 +162,7 @@ function twitter_settings(&$a,&$s) {
$s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="'.$token.'" />'; $s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="'.$token.'" />';
$s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="'.$request_token['oauth_token_secret'].'" />'; $s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="'.$request_token['oauth_token_secret'].'" />';
$s .= '</div><div class="clear"></div>'; $s .= '</div><div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div>'; $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
} else { } else {
/*** /***
* we have an OAuth key / secret pair for the user * we have an OAuth key / secret pair for the user
@ -178,7 +181,7 @@ function twitter_settings(&$a,&$s) {
$s .= '<label id="twitter-disconnect-label" for="twitter-disconnect">'. t('Clear OAuth configuration') .'</label>'; $s .= '<label id="twitter-disconnect-label" for="twitter-disconnect">'. t('Clear OAuth configuration') .'</label>';
$s .= '<input id="twitter-disconnect" type="checkbox" name="twitter-disconnect" value="1" />'; $s .= '<input id="twitter-disconnect" type="checkbox" name="twitter-disconnect" value="1" />';
$s .= '</div><div class="clear"></div>'; $s .= '</div><div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t('Submit') . '" /></div>'; $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
} }
} }
$s .= '</div><div class="clear"></div></div>'; $s .= '</div><div class="clear"></div></div>';
@ -195,6 +198,11 @@ function twitter_post_hook(&$a,&$b) {
if((local_user()) && (local_user() == $b['uid']) && (! $b['private']) && (! $b['parent']) ) { if((local_user()) && (local_user() == $b['uid']) && (! $b['private']) && (! $b['parent']) ) {
// Twitter is not considered a private network
if($b['prvnets'])
return;
load_pconfig(local_user(), 'twitter'); load_pconfig(local_user(), 'twitter');
$ckey = get_config('twitter', 'consumerkey' ); $ckey = get_config('twitter', 'consumerkey' );

View file

@ -0,0 +1,19 @@
<div class="settings-block">
<h3 class="settings-heading">$title</h3>
<div class='field noedit'>
<label>$label</label>
<tt>$key</tt>
</div>
<div class="settings-submit-wrapper">
<input type="submit" value="$submit" class="settings-submit" name="widgets-submit" />
</div>
<h4>$widgets_h</h4>
<ul>
{{ for $widgets as $w }}
<li><a href="$baseurl/widgets/$w.0/?k=$key&p=1">$w.1</a></li>
{{ endfor }}
</ul>
</div>

View file

@ -34,32 +34,30 @@ function widgets_settings(&$a,&$o) {
$key = get_pconfig(local_user(), 'widgets', 'key' ); $key = get_pconfig(local_user(), 'widgets', 'key' );
if ($key=='') { $key = mt_rand(); set_pconfig(local_user(), 'widgets', 'key', $key); } if ($key=='') { $key = mt_rand(); set_pconfig(local_user(), 'widgets', 'key', $key); }
$o .='<h3 class="settings-heading">Widgets</h3>'; $widgets = array();
$o.='
<div id="settings-username-wrapper">
'. t('Widgets key: ') .'<strong>'.$key.'</strong>
</div>
<div id="settings-username-end"></div>
<div class="settings-submit-wrapper">
<input type="submit" value="'.t('Generate new key').'" class="settings-submit" name="widgets-submit">
</div>';
$o.='<h4>Widgets:</h4>';
$o .= '<ul>';
$d = dir(dirname(__file__)); $d = dir(dirname(__file__));
while(false !== ($f = $d->read())) { while(false !== ($f = $d->read())) {
if(substr($f,0,7)=="widget_") { if(substr($f,0,7)=="widget_") {
preg_match("|widget_([^.]+).php|", $f, $m); preg_match("|widget_([^.]+).php|", $f, $m);
$w=$m[1]; $w=$m[1];
require_once($f); require_once($f);
$o.='<li><a href="'.$a->get_baseurl().'/widgets/'.$w.'/?k='.$key.'&p=1">'. call_user_func($w."_widget_name") .'</a></li>'; $widgets[] = array($w, call_user_func($w."_widget_name"));
} }
} }
$o .= '</ul>';
$t = file_get_contents( dirname(__file__). "/settings.tpl" );
$o .= replace_macros($t, array(
'$submit' => t('Generate new key'),
'$baseurl' => $a->get_baseurl(),
'$title' => "Widgets",
'$label' => t('Widgets key'),
'$key' => $key,
'$widgets_h' => t('Widgets available'),
'$widgets' => $widgets,
));
} }

113
boot.php
View file

@ -4,9 +4,9 @@ set_time_limit(0);
ini_set('pcre.backtrack_limit', 250000); ini_set('pcre.backtrack_limit', 250000);
define ( 'FRIENDIKA_VERSION', '2.2.1019' ); define ( 'FRIENDIKA_VERSION', '2.2.1030' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
define ( 'DB_UPDATE_VERSION', 1066 ); define ( 'DB_UPDATE_VERSION', 1073 );
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' );
@ -56,9 +56,9 @@ define ( 'REGISTER_OPEN', 2 );
* this relationship with contact['name'] * this relationship with contact['name']
*/ */
define ( 'REL_VIP', 1); define ( 'REL_VIP', 1); // other person is 'following' us
define ( 'REL_FAN', 2); define ( 'REL_FAN', 2); // we are 'following' other person
define ( 'REL_BUD', 3); define ( 'REL_BUD', 3); // mutual relationship
/** /**
* Hook array order * Hook array order
@ -296,6 +296,8 @@ class App {
$this->module = str_replace(".", "_", $this->argv[0]); $this->module = str_replace(".", "_", $this->argv[0]);
} }
else { else {
$this->argc = 1;
$this->argv = array('home');
$this->module = 'home'; $this->module = 'home';
} }
@ -498,9 +500,6 @@ function install_plugin($plugin){
if(! function_exists('check_config')) { if(! function_exists('check_config')) {
function check_config(&$a) { function check_config(&$a) {
load_config('system');
$build = get_config('system','build'); $build = get_config('system','build');
if(! x($build)) if(! x($build))
$build = set_config('system','build',DB_UPDATE_VERSION); $build = set_config('system','build',DB_UPDATE_VERSION);
@ -674,7 +673,7 @@ function fetch_url($url,$binary = false, &$redirects = 0) {
curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
$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));
@ -703,13 +702,21 @@ function fetch_url($url,$binary = false, &$redirects = 0) {
$s = @curl_exec($ch); $s = @curl_exec($ch);
$http_code = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE)); $base = $s;
$header = substr($s,0,strpos($s,"\r\n\r\n")); $curl_info = curl_getinfo($ch);
if(stristr($header,'100') && (strlen($header) < 30)) { $http_code = $curl_info['http_code'];
// 100 Continue has two headers, get the real one
$s = substr($s,strlen($header)+4); $header = '';
$header = substr($s,0,strpos($s,"\r\n\r\n"));
// Pull out multiple headers, e.g. proxy and continuation headers
// allow for HTTP/2.x without fixing code
while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
$chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
$header .= $chunk;
$base = substr($base,strlen($chunk));
} }
if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307) { if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307) {
$matches = array(); $matches = array();
preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches); preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
@ -720,16 +727,10 @@ function fetch_url($url,$binary = false, &$redirects = 0) {
return fetch_url($url,$binary,$redirects); return fetch_url($url,$binary,$redirects);
} }
} }
$a->set_curl_code($http_code); $a->set_curl_code($http_code);
$body = substr($s,strlen($header)+4); $body = substr($s,strlen($header));
/* one more try to make sure there are no more headers */
if(strpos($body,'HTTP/') === 0) {
$header = substr($body,0,strpos($body,"\r\n\r\n"));
$body = substr($body,strlen($header)+4);
}
$a->set_curl_headers($header); $a->set_curl_headers($header);
@ -750,6 +751,7 @@ function post_url($url,$params, $headers = null, &$redirects = 0) {
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$params); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
$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));
@ -775,13 +777,21 @@ function post_url($url,$params, $headers = null, &$redirects = 0) {
$s = @curl_exec($ch); $s = @curl_exec($ch);
$http_code = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE)); $base = $s;
$header = substr($s,0,strpos($s,"\r\n\r\n")); $curl_info = curl_getinfo($ch);
if(stristr($header,'100') && (strlen($header) < 30)) { $http_code = $curl_info['http_code'];
// 100 Continue has two headers, get the real one
$s = substr($s,strlen($header)+4); $header = '';
$header = substr($s,0,strpos($s,"\r\n\r\n"));
// Pull out multiple headers, e.g. proxy and continuation headers
// allow for HTTP/2.x without fixing code
while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
$chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
$header .= $chunk;
$base = substr($base,strlen($chunk));
} }
if($http_code == 301 || $http_code == 302 || $http_code == 303) { if($http_code == 301 || $http_code == 302 || $http_code == 303) {
$matches = array(); $matches = array();
preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches); preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
@ -793,14 +803,7 @@ function post_url($url,$params, $headers = null, &$redirects = 0) {
} }
} }
$a->set_curl_code($http_code); $a->set_curl_code($http_code);
$body = substr($s,strlen($header)+4); $body = substr($s,strlen($header));
/* one more try to make sure there are no more headers */
if(strpos($body,'HTTP/') === 0) {
$header = substr($body,0,strpos($body,"\r\n\r\n"));
$body = substr($body,strlen($header)+4);
}
$a->set_curl_headers($header); $a->set_curl_headers($header);
@ -1218,7 +1221,11 @@ function load_config($family) {
if(count($r)) { if(count($r)) {
foreach($r as $rr) { foreach($r as $rr) {
$k = $rr['k']; $k = $rr['k'];
$a->config[$family][$k] = $rr['v']; if ($rr['cat'] === 'config') {
$a->config[$k] = $rr['v'];
} else {
$a->config[$family][$k] = $rr['v'];
}
} }
} }
}} }}
@ -1685,8 +1692,10 @@ function fetch_lrdd_template($host) {
$url1 = 'https://' . $host . '/.well-known/host-meta' ; $url1 = 'https://' . $host . '/.well-known/host-meta' ;
$url2 = 'http://' . $host . '/.well-known/host-meta' ; $url2 = 'http://' . $host . '/.well-known/host-meta' ;
$links = fetch_xrd_links($url1); $links = fetch_xrd_links($url1);
logger('fetch_lrdd_template from: ' . $url1);
logger('template (https): ' . print_r($links,true)); logger('template (https): ' . print_r($links,true));
if(! count($links)) { if(! count($links)) {
logger('fetch_lrdd_template from: ' . $url2);
$links = fetch_xrd_links($url2); $links = fetch_xrd_links($url2);
logger('template (http): ' . print_r($links,true)); logger('template (http): ' . print_r($links,true));
} }
@ -2015,7 +2024,7 @@ function get_tags($s) {
$s = preg_replace('/\[code\](.*?)\[\/code\]/sm','',$s); $s = preg_replace('/\[code\](.*?)\[\/code\]/sm','',$s);
if(preg_match_all('/([@#][^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) { if(preg_match_all('/([@#][^ \x0D\x0A,:?]+ [^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) {
foreach($match[1] as $mtch) { foreach($match[1] as $mtch) {
if(strstr($mtch,"]")) { if(strstr($mtch,"]")) {
// we might be inside a bbcode color tag - leave it alone // we might be inside a bbcode color tag - leave it alone
@ -2028,6 +2037,18 @@ function get_tags($s) {
} }
} }
if(preg_match_all('/([@#][^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) {
foreach($match[1] as $mtch) {
if(strstr($mtch,"]")) {
// we might be inside a bbcode color tag - leave it alone
continue;
}
if(substr($mtch,-1,1) === '.')
$ret[] = substr($mtch,0,-1);
else
$ret[] = $mtch;
}
}
return $ret; return $ret;
}} }}
@ -2415,7 +2436,7 @@ function profile_sidebar($profile) {
)); ));
$arr = array('profile' => $profile, 'entry' => $o); $arr = array('profile' => &$profile, 'entry' => &$o);
call_hooks('profile_sidebar', $arr); call_hooks('profile_sidebar', $arr);
@ -2891,3 +2912,15 @@ function get_plugin_info($plugin){
} }
return $info; return $info;
}} }}
if(! function_exists('return_bytes')) {
function return_bytes ($size_str) {
switch (substr ($size_str, -1))
{
case 'M': case 'm': return (int)$size_str * 1048576;
case 'K': case 'k': return (int)$size_str * 1024;
case 'G': case 'g': return (int)$size_str * 1073741824;
default: return $size_str;
}
}}

View file

@ -169,9 +169,10 @@ CREATE TABLE IF NOT EXISTS `item` (
`parent-uri` char(255) NOT NULL, `parent-uri` char(255) NOT NULL,
`extid` char(255) NOT NULL, `extid` char(255) NOT NULL,
`thr-parent` char(255) NOT NULL, `thr-parent` char(255) NOT NULL,
`created` datetime NOT NULL, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`edited` datetime NOT NULL, `edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`changed` datetime NOT NULL, `received` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`owner-name` char(255) NOT NULL, `owner-name` char(255) NOT NULL,
`owner-link` char(255) NOT NULL, `owner-link` char(255) NOT NULL,
`owner-avatar` char(255) NOT NULL, `owner-avatar` char(255) NOT NULL,
@ -201,6 +202,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`private` tinyint(1) NOT NULL DEFAULT '0', `private` tinyint(1) NOT NULL DEFAULT '0',
`pubmail` tinyint(1) NOT NULL DEFAULT '0', `pubmail` tinyint(1) NOT NULL DEFAULT '0',
`visible` tinyint(1) NOT NULL DEFAULT '0', `visible` tinyint(1) NOT NULL DEFAULT '0',
`starred` tinyint(1) NOT NULL DEFAULT '0',
`unseen` tinyint(1) NOT NULL DEFAULT '1', `unseen` tinyint(1) NOT NULL DEFAULT '1',
`deleted` tinyint(1) NOT NULL DEFAULT '0', `deleted` tinyint(1) NOT NULL DEFAULT '0',
`last-child` tinyint(1) unsigned NOT NULL DEFAULT '1', `last-child` tinyint(1) unsigned NOT NULL DEFAULT '1',
@ -215,7 +217,9 @@ CREATE TABLE IF NOT EXISTS `item` (
KEY `extid` (`extid`), KEY `extid` (`extid`),
KEY `created` (`created`), KEY `created` (`created`),
KEY `edited` (`edited`), KEY `edited` (`edited`),
KEY `received` (`received`),
KEY `visible` (`visible`), KEY `visible` (`visible`),
KEY `starred` (`starred`),
KEY `deleted` (`deleted`), KEY `deleted` (`deleted`),
KEY `last-child` (`last-child`), KEY `last-child` (`last-child`),
KEY `unseen` (`unseen`), KEY `unseen` (`unseen`),
@ -241,7 +245,7 @@ CREATE TABLE IF NOT EXISTS `mail` (
`from-url` char(255) NOT NULL, `from-url` char(255) NOT NULL,
`contact-id` char(255) NOT NULL, `contact-id` char(255) NOT NULL,
`title` char(255) NOT NULL, `title` char(255) NOT NULL,
`body` text NOT NULL, `body` mediumtext NOT NULL,
`seen` tinyint(1) NOT NULL, `seen` tinyint(1) NOT NULL,
`replied` tinyint(1) NOT NULL, `replied` tinyint(1) NOT NULL,
`uri` char(255) NOT NULL, `uri` char(255) NOT NULL,
@ -276,7 +280,12 @@ CREATE TABLE IF NOT EXISTS `photo` (
`allow_gid` mediumtext NOT NULL, `allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL, `deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL, `deny_gid` mediumtext NOT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `resource-id` (`resource-id`),
KEY `album` (`album`),
KEY `scale` (`scale`),
KEY `profile` (`profile`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
@ -507,7 +516,8 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`url` CHAR( 255 ) NOT NULL , `url` CHAR( 255 ) NOT NULL ,
`name` CHAR( 255 ) NOT NULL , `name` CHAR( 255 ) NOT NULL ,
`photo` CHAR( 255 ) NOT NULL `photo` CHAR( 255 ) NOT NULL ,
`request` CHAR( 255 ) NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MYISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `ffinder` ( CREATE TABLE IF NOT EXISTS `ffinder` (
@ -518,6 +528,19 @@ CREATE TABLE IF NOT EXISTS `ffinder` (
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MYISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fsuggest` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL ,
`cid` INT NOT NULL ,
`name` CHAR( 255 ) NOT NULL ,
`url` CHAR( 255 ) NOT NULL ,
`request` CHAR( 255 ) NOT NULL,
`photo` CHAR( 255 ) NOT NULL ,
`note` TEXT NOT NULL ,
`created` DATETIME NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `mailacct` ( CREATE TABLE IF NOT EXISTS `mailacct` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL, `uid` INT NOT NULL,

View file

View file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -230,21 +230,21 @@ function import_profile_photo($photo,$uid,$cid) {
$hash = photo_new_resource(); $hash = photo_new_resource();
$r = $img->store($uid, $cid, $hash, $filename, t('Contact Photos'), 4 ); $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 4 );
if($r === false) if($r === false)
$photo_failure = true; $photo_failure = true;
$img->scaleImage(80); $img->scaleImage(80);
$r = $img->store($uid, $cid, $hash, $filename, t('Contact Photos'), 5 ); $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 5 );
if($r === false) if($r === false)
$photo_failure = true; $photo_failure = true;
$img->scaleImage(48); $img->scaleImage(48);
$r = $img->store($uid, $cid, $hash, $filename, t('Contact Photos'), 6 ); $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 6 );
if($r === false) if($r === false)
$photo_failure = true; $photo_failure = true;

View file

@ -423,7 +423,7 @@ function probe_url($url) {
$poll = $tapi . '?user_id=' . $tid; $poll = $tapi . '?user_id=' . $tid;
else else
$poll = $tapi . '?screen_name=' . $tid; $poll = $tapi . '?screen_name=' . $tid;
$profile = 'http://twitter.com/!#/' . $tid; $profile = 'http://twitter.com/#!/' . $tid;
} }
if(! x($vcard,'fn')) if(! x($vcard,'fn'))
@ -442,7 +442,7 @@ function probe_url($url) {
if(x($feedret,'photo')) if(x($feedret,'photo'))
$vcard['photo'] = $feedret['photo']; $vcard['photo'] = $feedret['photo'];
require_once('simplepie/simplepie.inc'); require_once('library/simplepie/simplepie.inc');
$feed = new SimplePie(); $feed = new SimplePie();
$xml = fetch_url($poll); $xml = fetch_url($poll);

View file

@ -41,6 +41,115 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
} }
function contact_selector($selname, $selclass, $preselected = false, $options) {
$a = get_app();
$mutual = false;
$networks = null;
$single = false;
$exclude = false;
$size = 4;
if(is_array($options)) {
if(x($options,'size'))
$size = $options['size'];
if(x($options,'mutual_friends'))
$mutual = true;
if(x($options,'single'))
$single = true;
if(x($options,'multiple'))
$single = false;
if(x($options,'exclude'))
$exclude = $options['exclude'];
if(x($options,'networks')) {
switch($options['networks']) {
case 'DFRN_ONLY':
$networks = array('dfrn');
break;
case 'PRIVATE':
if(is_array($a->user) && $a->user['prvnets'])
$networks = array('dfrn','mail','dspr');
else
$networks = array('dfrn','face','mail', 'dspr');
break;
case 'TWO_WAY':
if(is_array($a->user) && $a->user['prvnets'])
$networks = array('dfrn','mail','dspr');
else
$networks = array('dfrn','face','mail','dspr','stat');
break;
default:
break;
}
}
}
$x = array('options' => $options, 'size' => $size, 'single' => $single, 'mutual' => $mutual, 'exclude' => $exclude, 'networks' => $networks);
call_hooks('contact_select_options', $x);
$o = '';
$sql_extra = '';
if($x['mutual']) {
$sql_extra .= sprintf(" AND `rel` = %d ", intval(REL_BUD));
}
if(intval($x['exclude']))
$sql_extra .= sprintf(" AND `id` != %d ", intval($x['exclude']));
if(is_array($x['networks']) && count($x['networks'])) {
for($y = 0; $y < count($x['networks']) ; $y ++)
$x['networks'][$y] = "'" . dbesc($x['networks'][$y]) . "'";
$str_nets = implode(',',$x['networks']);
$sql_extra .= " AND `network` IN ( $str_nets ) ";
}
if($x['single'])
$o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"" . $x['size'] . "\" >\r\n";
else
$o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"" . $x['size'] . "$\" >\r\n";
$r = q("SELECT `id`, `name`, `url`, `network` FROM `contact`
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `notify` != ''
$sql_extra
ORDER BY `name` ASC ",
intval(local_user())
);
$arr = array('contact' => $r, 'entry' => $o);
// e.g. 'network_pre_contact_deny', 'profile_pre_contact_allow'
call_hooks($a->module . '_pre_' . $selname, $arr);
if(count($r)) {
foreach($r as $rr) {
if((is_array($preselected)) && in_array($rr['id'], $preselected))
$selected = " selected=\"selected\" ";
else
$selected = '';
$trimmed = mb_substr($rr['name'],0,20);
$o .= "<option value=\"{$rr['id']}\" $selected title=\"{$rr['name']}|{$rr['url']}\" >$trimmed</option>\r\n";
}
}
$o .= "</select>\r\n";
call_hooks($a->module . '_post_' . $selname, $o);
return $o;
}
function contact_select($selname, $selclass, $preselected = false, $size = 4, $privmail = false, $celeb = false, $privatenet = false) { function contact_select($selname, $selclass, $preselected = false, $size = 4, $privmail = false, $celeb = false, $privatenet = false) {
@ -64,6 +173,8 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
$sql_extra .= " AND `network` IN ( 'dfrn', 'mail', 'face' ) "; $sql_extra .= " AND `network` IN ( 'dfrn', 'mail', 'face' ) ";
} }
if($privmail) if($privmail)
$o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"$size\" >\r\n"; $o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"$size\" >\r\n";
else else
@ -104,6 +215,7 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
return $o; return $o;
} }
function fixacl(&$item) { function fixacl(&$item) {
$item = intval(str_replace(array('<','>'),array('',''),$item)); $item = intval(str_replace(array('<','>'),array('',''),$item));
} }

View file

@ -177,6 +177,7 @@ function conversation(&$a, $items, $mode, $update) {
$drop = replace_macros($droptpl,array('$id' => $item['id'])); $drop = replace_macros($droptpl,array('$id' => $item['id']));
$lock = '<div class="wall-item-lock"></div>'; $lock = '<div class="wall-item-lock"></div>';
$star = '';
$body = prepare_body($item,true); $body = prepare_body($item,true);
@ -197,6 +198,7 @@ function conversation(&$a, $items, $mode, $update) {
'$owner_url' => $owner_url, '$owner_url' => $owner_url,
'$owner_photo' => $owner_photo, '$owner_photo' => $owner_photo,
'$owner_name' => $owner_name, '$owner_name' => $owner_name,
'$star' => $star,
'$drop' => $drop, '$drop' => $drop,
'$conv' => '<a href="' . $a->get_baseurl() . '/display/' . $nickname . '/' . $item['id'] . '">' . t('View in context') . '</a>' '$conv' => '<a href="' . $a->get_baseurl() . '/display/' . $nickname . '/' . $item['id'] . '">' . t('View in context') . '</a>'
)); ));
@ -381,8 +383,8 @@ function conversation(&$a, $items, $mode, $update) {
} }
$edpost = (((($profile_owner == local_user()) && ($toplevelpost) && (intval($item['wall']) == 1)) || ($mode === 'notes')) $edpost = (((($profile_owner == local_user()) && ($toplevelpost) && (intval($item['wall']) == 1)) || ($mode === 'notes'))
? '<a class="editpost" href="' . $a->get_baseurl() . '/editpost/' . $item['id'] ? '<a class="editpost icon pencil" href="' . $a->get_baseurl() . '/editpost/' . $item['id']
. '" title="' . t('Edit') . '"><img src="images/pencil.gif" /></a>' . '" title="' . t('Edit') . '"></a>'
: ''); : '');
@ -394,6 +396,8 @@ function conversation(&$a, $items, $mode, $update) {
$drop = replace_macros((($dropping)? $droptpl : $fakedrop), array('$id' => $item['id'], '$select' => t('Select'), '$delete' => t('Delete'))); $drop = replace_macros((($dropping)? $droptpl : $fakedrop), array('$id' => $item['id'], '$select' => t('Select'), '$delete' => t('Delete')));
$star = (($profile_owner == local_user() && $toplevelpost) ? '<a href="#" id="starred-' . $item['id'] . '" onclick="dostar(' . $item['id'] . '); return false;" class="star-item icon ' . (($item['starred']) ? 'starred' : 'unstarred') . '" title="' . t('toggle star status') . '"></a>' : '');
$photo = $item['photo']; $photo = $item['photo'];
$thumb = $item['thumb']; $thumb = $item['thumb'];
@ -473,6 +477,7 @@ function conversation(&$a, $items, $mode, $update) {
'$owner_name' => $owner_name, '$owner_name' => $owner_name,
'$plink' => get_plink($item), '$plink' => get_plink($item),
'$edpost' => $edpost, '$edpost' => $edpost,
'$star' => $star,
'$drop' => $drop, '$drop' => $drop,
'$vote' => $likebuttons, '$vote' => $likebuttons,
'$like' => $like, '$like' => $like,

View file

@ -17,7 +17,7 @@ var gArCountryInfo;
var gArStateInfo; var gArStateInfo;
// NOTE: // NOTE:
// Some editors may exhibit problems viewing 2803 characters... // Some editors may exhibit problems viewing 2803 characters...
var sCountryString = "|Afghanistan|Albania|Algeria|American Samoa|Angola|Anguilla|Antartica|Antigua and Barbuda|Argentina|Armenia|Aruba|Ashmore and Cartier Island|Australia|Austria|Azerbaijan|Bahamas|Bahrain|Bangladesh|Barbados|Belarus|Belgium|Belize|Benin|Bermuda|Bhutan|Bolivia|Bosnia and Herzegovina|Botswana|Brazil|British Virgin Islands|Brunei|Bulgaria|Burkina Faso|Burma|Burundi|Cambodia|Cameroon|Canada|Cape Verde|Cayman Islands|Central African Republic|Chad|Chile|China|Christmas Island|Clipperton Island|Cocos (Keeling) Islands|Colombia|Comoros|Congo, Democratic Republic of the|Congo, Republic of the|Cook Islands|Costa Rica|Cote d'Ivoire|Croatia|Cuba|Cyprus|Czeck Republic|Denmark|Djibouti|Dominica|Dominican Republic|Ecuador|Egypt|El Salvador|Equatorial Guinea|Eritrea|Estonia|Ethiopia|Europa Island|Falkland Islands (Islas Malvinas)|Faroe Islands|Fiji|Finland|France|French Guiana|French Polynesia|French Southern and Antarctic Lands|Gabon|Gambia, The|Gaza Strip|Georgia|Germany|Ghana|Gibraltar|Glorioso Islands|Greece|Greenland|Grenada|Guadeloupe|Guam|Guatemala|Guernsey|Guinea|Guinea-Bissau|Guyana|Haiti|Heard Island and McDonald Islands|Holy See (Vatican City)|Honduras|Hong Kong|Howland Island|Hungary|Iceland|India|Indonesia|Iran|Iraq|Ireland|Ireland, Northern|Israel|Italy|Jamaica|Jan Mayen|Japan|Jarvis Island|Jersey|Johnston Atoll|Jordan|Juan de Nova Island|Kazakhstan|Kenya|Kiribati|Korea, North|Korea, South|Kuwait|Kyrgyzstan|Laos|Latvia|Lebanon|Lesotho|Liberia|Libya|Liechtenstein|Lithuania|Luxembourg|Macau|Macedonia, Former Yugoslav Republic of|Madagascar|Malawi|Malaysia|Maldives|Mali|Malta|Man, Isle of|Marshall Islands|Martinique|Mauritania|Mauritius|Mayotte|Mexico|Micronesia, Federated States of|Midway Islands|Moldova|Monaco|Mongolia|Montserrat|Morocco|Mozambique|Namibia|Nauru|Nepal|Netherlands|Netherlands Antilles|New Caledonia|New Zealand|Nicaragua|Niger|Nigeria|Niue|Norfolk Island|Northern Mariana Islands|Norway|Oman|Pakistan|Palau|Panama|Papua New Guinea|Paraguay|Peru|Philippines|Pitcaim Islands|Poland|Portugal|Puerto Rico|Qatar|Reunion|Romainia|Russia|Rwanda|Saint Helena|Saint Kitts and Nevis|Saint Lucia|Saint Pierre and Miquelon|Saint Vincent and the Grenadines|Samoa|San Marino|Sao Tome and Principe|Saudi Arabia|Scotland|Senegal|Seychelles|Sierra Leone|Singapore|Slovakia|Slovenia|Solomon Islands|Somalia|South Africa|South Georgia and South Sandwich Islands|Spain|Spratly Islands|Sri Lanka|Sudan|Suriname|Svalbard|Swaziland|Sweden|Switzerland|Syria|Taiwan|Tajikistan|Tanzania|Thailand|Tobago|Toga|Tokelau|Tonga|Trinidad|Tunisia|Turkey|Turkmenistan|Tuvalu|Uganda|Ukraine|United Arab Emirates|United Kingdom|Uruguay|USA|Uzbekistan|Vanuatu|Venezuela|Vietnam|Virgin Islands|Wales|Wallis and Futuna|West Bank|Western Sahara|Yemen|Yugoslavia|Zambia|Zimbabwe"; var sCountryString = "|Afghanistan|Albania|Algeria|American Samoa|Angola|Anguilla|Antartica|Antigua and Barbuda|Argentina|Armenia|Aruba|Ashmore and Cartier Island|Australia|Austria|Azerbaijan|Bahamas|Bahrain|Bangladesh|Barbados|Belarus|Belgium|Belize|Benin|Bermuda|Bhutan|Bolivia|Bosnia and Herzegovina|Botswana|Brazil|British Virgin Islands|Brunei|Bulgaria|Burkina Faso|Burma|Burundi|Cambodia|Cameroon|Canada|Cape Verde|Cayman Islands|Central African Republic|Chad|Chile|China|Christmas Island|Clipperton Island|Cocos (Keeling) Islands|Colombia|Comoros|Congo, Democratic Republic of the|Congo, Republic of the|Cook Islands|Costa Rica|Cote d'Ivoire|Croatia|Cuba|Cyprus|Czech Republic|Denmark|Djibouti|Dominica|Dominican Republic|Ecuador|Egypt|El Salvador|Equatorial Guinea|Eritrea|Estonia|Ethiopia|Europa Island|Falkland Islands (Islas Malvinas)|Faroe Islands|Fiji|Finland|France|French Guiana|French Polynesia|French Southern and Antarctic Lands|Gabon|Gambia, The|Gaza Strip|Georgia|Germany|Ghana|Gibraltar|Glorioso Islands|Greece|Greenland|Grenada|Guadeloupe|Guam|Guatemala|Guernsey|Guinea|Guinea-Bissau|Guyana|Haiti|Heard Island and McDonald Islands|Holy See (Vatican City)|Honduras|Hong Kong|Howland Island|Hungary|Iceland|India|Indonesia|Iran|Iraq|Ireland|Ireland, Northern|Israel|Italy|Jamaica|Jan Mayen|Japan|Jarvis Island|Jersey|Johnston Atoll|Jordan|Juan de Nova Island|Kazakhstan|Kenya|Kiribati|Korea, North|Korea, South|Kuwait|Kyrgyzstan|Laos|Latvia|Lebanon|Lesotho|Liberia|Libya|Liechtenstein|Lithuania|Luxembourg|Macau|Macedonia, Former Yugoslav Republic of|Madagascar|Malawi|Malaysia|Maldives|Mali|Malta|Man, Isle of|Marshall Islands|Martinique|Mauritania|Mauritius|Mayotte|Mexico|Micronesia, Federated States of|Midway Islands|Moldova|Monaco|Mongolia|Montserrat|Morocco|Mozambique|Namibia|Nauru|Nepal|Netherlands|Netherlands Antilles|New Caledonia|New Zealand|Nicaragua|Niger|Nigeria|Niue|Norfolk Island|Northern Mariana Islands|Norway|Oman|Pakistan|Palau|Panama|Papua New Guinea|Paraguay|Peru|Philippines|Pitcaim Islands|Poland|Portugal|Puerto Rico|Qatar|Reunion|Romainia|Russia|Rwanda|Saint Helena|Saint Kitts and Nevis|Saint Lucia|Saint Pierre and Miquelon|Saint Vincent and the Grenadines|Samoa|San Marino|Sao Tome and Principe|Saudi Arabia|Scotland|Senegal|Seychelles|Sierra Leone|Singapore|Slovakia|Slovenia|Solomon Islands|Somalia|South Africa|South Georgia and South Sandwich Islands|Spain|Spratly Islands|Sri Lanka|Sudan|Suriname|Svalbard|Swaziland|Sweden|Switzerland|Syria|Taiwan|Tajikistan|Tanzania|Thailand|Tobago|Toga|Tokelau|Tonga|Trinidad|Tunisia|Turkey|Turkmenistan|Tuvalu|Uganda|Ukraine|United Arab Emirates|United Kingdom|Uruguay|USA|Uzbekistan|Vanuatu|Venezuela|Vietnam|Virgin Islands|Wales|Wallis and Futuna|West Bank|Western Sahara|Yemen|Yugoslavia|Zambia|Zimbabwe";
var aStates = new Array(); var aStates = new Array();
aStates[0]=""; aStates[0]="";

View file

@ -65,9 +65,9 @@ if(! function_exists('datetime_convert')) {
function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d H:i:s") { function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d H:i:s") {
// Slight hackish adjustment so that 'zero' datetime actually returns what is intended // Slight hackish adjustment so that 'zero' datetime actually returns what is intended
// otherwise we end up with -0001-11-30 ... // otherwise we end up with -0001-11-30 ...
// add 32 days so that we at least get year 00, and then hack around the fact that // add 32 days so that we at least get year 00, and then hack around the fact that
// months and days always start with 1. // months and days always start with 1.
if(substr($s,0,10) == '0000-00-00') { if(substr($s,0,10) == '0000-00-00') {
$d = new DateTime($s . ' + 32 days', new DateTimeZone('UTC')); $d = new DateTime($s . ' + 32 days', new DateTimeZone('UTC'));
@ -176,6 +176,11 @@ function relative_date($posted_date) {
$localtime = datetime_convert('UTC',date_default_timezone_get(),$posted_date); $localtime = datetime_convert('UTC',date_default_timezone_get(),$posted_date);
$abs = strtotime($localtime); $abs = strtotime($localtime);
if (is_null($posted_date) || $posted_date === '0000-00-00 00:00:00' || $abs === False) {
return t('never');
}
$etime = time() - $abs; $etime = time() - $abs;
if ($etime < 1) { if ($etime < 1) {
@ -183,12 +188,12 @@ function relative_date($posted_date) {
} }
$a = array( 12 * 30 * 24 * 60 * 60 => array( t('year'), t('years')), $a = array( 12 * 30 * 24 * 60 * 60 => array( t('year'), t('years')),
30 * 24 * 60 * 60 => array( t('month'), t('months')), 30 * 24 * 60 * 60 => array( t('month'), t('months')),
7 * 24 * 60 * 60 => array( t('week'), t('weeks')), 7 * 24 * 60 * 60 => array( t('week'), t('weeks')),
24 * 60 * 60 => array( t('day'), t('days')), 24 * 60 * 60 => array( t('day'), t('days')),
60 * 60 => array( t('hour'), t('hours')), 60 * 60 => array( t('hour'), t('hours')),
60 => array( t('minute'), t('minutes')), 60 => array( t('minute'), t('minutes')),
1 => array( t('second'), t('seconds')) 1 => array( t('second'), t('seconds'))
); );
foreach ($a as $secs => $str) { foreach ($a as $secs => $str) {

View file

@ -2,18 +2,22 @@
require_once("boot.php"); require_once("boot.php");
function directory_run($argv, $argc){ function directory_run($argv, $argc){
global $a, $db; global $a, $db;
if(is_null($a)){ if(is_null($a)) {
$a = new App; $a = new App;
} }
if(is_null($db)) {
@include(".htconfig.php");
require_once("dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
load_config('config');
load_config('system');
if(is_null($db)){
@include(".htconfig.php");
require_once("dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
if($argc != 2) if($argc != 2)
return; return;

View file

@ -8,7 +8,7 @@ function format_event_html($ev) {
if(! ((is_array($ev)) && count($ev))) if(! ((is_array($ev)) && count($ev)))
return ''; return '';
$bd_format = t('l F d, Y \@ g A') ; // Friday January 18, 2011 @ 8 AM $bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8 AM
$o = '<div class="vevent">' . "\r\n"; $o = '<div class="vevent">' . "\r\n";
@ -212,7 +212,29 @@ function event_store($arr) {
$contact = $c[0]; $contact = $c[0];
// Existing event being modified
if($arr['id']) { if($arr['id']) {
// has the event actually changed?
$r = q("SELECT * FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($arr['id']),
intval($arr['uid'])
);
if((! count($r)) || ($r[0]['edited'] === $arr['edited'])) {
// Nothing has changed. Grab the item id to return.
$r = q("SELECT * FROM `item` WHERE `event-id` = %d AND `uid` = %d LIMIT 1",
intval($arr['id']),
intval($arr['uid'])
);
return((count($r)) ? $r[0]['id'] : 0);
}
// The event changed. Update it.
$r = q("UPDATE `event` SET $r = q("UPDATE `event` SET
`edited` = '%s', `edited` = '%s',
`start` = '%s', `start` = '%s',
@ -260,7 +282,7 @@ function event_store($arr) {
dbesc($arr['allow_gid']), dbesc($arr['allow_gid']),
dbesc($arr['deny_cid']), dbesc($arr['deny_cid']),
dbesc($arr['deny_gid']), dbesc($arr['deny_gid']),
dbesc(datetime_convert()), dbesc($arr['edited']),
intval($r[0]['id']), intval($r[0]['id']),
intval($arr['uid']) intval($arr['uid'])
); );
@ -272,6 +294,8 @@ function event_store($arr) {
} }
else { else {
// New event. Store it.
$r = q("INSERT INTO `event` ( `uid`,`cid`,`uri`,`created`,`edited`,`start`,`finish`,`desc`,`location`,`type`, $r = q("INSERT INTO `event` ( `uid`,`cid`,`uri`,`created`,`edited`,`start`,`finish`,`desc`,`location`,`type`,
`adjust`,`nofinish`,`allow_cid`,`allow_gid`,`deny_cid`,`deny_gid`) `adjust`,`nofinish`,`allow_cid`,`allow_gid`,`deny_cid`,`deny_gid`)
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' ) ", VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' ) ",

View file

@ -16,12 +16,16 @@ function expire_run($argv, $argc){
unset($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data);
}; };
require_once('session.php'); require_once('include/session.php');
require_once('datetime.php'); require_once('include/datetime.php');
require_once('simplepie/simplepie.inc'); require_once('library/simplepie/simplepie.inc');
require_once('include/items.php'); require_once('include/items.php');
require_once('include/Contact.php'); require_once('include/Contact.php');
load_config('config');
load_config('system');
$a->set_baseurl(get_config('system','url')); $a->set_baseurl(get_config('system','url'));

View file

@ -136,7 +136,7 @@ function group_public_members($gid) {
function group_side($every="contacts",$each="group",$edit = false) { function group_side($every="contacts",$each="group",$edit = false, $group_id = 0) {
$o = ''; $o = '';
@ -145,19 +145,15 @@ function group_side($every="contacts",$each="group",$edit = false) {
$createtext = t('Create a new group'); $createtext = t('Create a new group');
$linktext= t('Everybody'); $linktext= t('Everybody');
$selected = (($group_id == 0) ? ' class="group-selected" ' : '');
$o .= <<< EOT $o .= <<< EOT
<div id="group-sidebar"> <div id="group-sidebar">
<h3>Groups</h3> <h3>Groups</h3>
<div id="sidebar-new-group">
<a href="group/new">$createtext</a>
</div>
<div id="sidebar-group-list"> <div id="sidebar-group-list">
<ul id="sidebar-group-ul"> <ul id="sidebar-group-ul">
<li class="sidebar-group-li" ><a href="$every" >$linktext</a></li> <li class="sidebar-group-li" ><a href="$every" $selected >$linktext</a></li>
EOT; EOT;
@ -165,10 +161,21 @@ EOT;
intval($_SESSION['uid']) intval($_SESSION['uid'])
); );
if(count($r)) { if(count($r)) {
foreach($r as $rr) foreach($r as $rr) {
$o .= ' <li class="sidebar-group-li">' . (($edit) ? "<a href=\"group/{$rr['id']}\" title=\"" . t('Edit') . "\" ><img src=\"images/spencil.gif\" alt=\"" . t('Edit') . "\"></a> " : "") . "<a href=\"$each/{$rr['id']}\">{$rr['name']}</a></li>\r\n"; $selected = (($group_id == $rr['id']) ? ' class="group-selected" ' : '');
$o .= ' <li class="sidebar-group-li">' . (($edit) ? "<a href=\"group/{$rr['id']}\" title=\"" . t('Edit') . "\" ><img src=\"images/spencil.gif\" alt=\"" . t('Edit') . "\"></a> " : "") . "<a href=\"$each/{$rr['id']}\" $selected >{$rr['name']}</a></li>\r\n";
}
} }
$o .= " </ul>\r\n </div>\r\n</div>"; $o .= " </ul>\r\n </div>";
$o .= <<< EOT
<div id="sidebar-new-group">
<a href="group/new">$createtext</a>
</div>
</div>
EOT;
return $o; return $o;
} }

View file

@ -2,6 +2,7 @@
function hostxrd($baseurl) { function hostxrd($baseurl) {
header('Access-Control-Allow-Origin: *');
header("Content-type: text/xml"); header("Content-type: text/xml");
$tpl = file_get_contents('view/xrd_host.tpl'); $tpl = file_get_contents('view/xrd_host.tpl');
echo str_replace('$domain',$baseurl,$tpl); echo str_replace('$domain',$baseurl,$tpl);

View file

@ -338,7 +338,7 @@ function get_atom_elements($feed,$item) {
$apps = $item->get_item_tags(NAMESPACE_STATUSNET,'notice_info'); $apps = $item->get_item_tags(NAMESPACE_STATUSNET,'notice_info');
if($apps && $apps[0]['attribs']['']['source']) { if($apps && $apps[0]['attribs']['']['source']) {
$res['app'] = $apps[0]['attribs']['']['source']; $res['app'] = strip_tags(unxmlify($apps[0]['attribs']['']['source']));
if($res['app'] === 'web') if($res['app'] === 'web')
$res['app'] = 'OStatus'; $res['app'] = 'OStatus';
} }
@ -669,6 +669,7 @@ function item_store($arr,$force_parent = false) {
$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());
$arr['edited'] = ((x($arr,'edited') !== false) ? datetime_convert('UTC','UTC',$arr['edited']) : datetime_convert()); $arr['edited'] = ((x($arr,'edited') !== false) ? datetime_convert('UTC','UTC',$arr['edited']) : datetime_convert());
$arr['received'] = datetime_convert();
$arr['changed'] = datetime_convert(); $arr['changed'] = datetime_convert();
$arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : ''); $arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
$arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : ''); $arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : '');
@ -994,7 +995,7 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_feed = false) { function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_feed = false) {
require_once('simplepie/simplepie.inc'); require_once('library/simplepie/simplepie.inc');
$feed = new SimplePie(); $feed = new SimplePie();
$feed->set_raw_data($xml); $feed->set_raw_data($xml);
@ -1071,13 +1072,13 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
$img->scaleImageSquare(175); $img->scaleImageSquare(175);
$hash = $resource_id; $hash = $resource_id;
$r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), t('Contact Photos') , 4); $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 4);
$img->scaleImage(80); $img->scaleImage(80);
$r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), t('Contact Photos') , 5); $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 5);
$img->scaleImage(48); $img->scaleImage(48);
$r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), t('Contact Photos') , 6); $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 6);
$a = get_app(); $a = get_app();
@ -1346,6 +1347,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
if(x($ev,'desc') && x($ev,'start')) { if(x($ev,'desc') && x($ev,'start')) {
$ev['uid'] = $importer['uid']; $ev['uid'] = $importer['uid'];
$ev['uri'] = $item_id; $ev['uri'] = $item_id;
$ev['edited'] = $datarray['edited'];
if(is_array($contact)) if(is_array($contact))
$ev['cid'] = $contact['id']; $ev['cid'] = $contact['id'];
@ -1447,11 +1449,11 @@ function new_follower($importer,$contact,$datarray,$item) {
} }
else { else {
// create contact record - set to readonly // create contact record
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `name`, `nick`, `photo`, `network`, `rel`, $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `name`, `nick`, `photo`, `network`, `rel`,
`blocked`, `readonly`, `pending`, `writable` ) `blocked`, `readonly`, `pending`, `writable` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, 0, 1, 1, 1 ) ", VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, 1 ) ",
intval($importer['uid']), intval($importer['uid']),
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc($url), dbesc($url),

View file

@ -47,11 +47,7 @@
if(mail == 0) { mail = ''; $('#mail-update').hide() } else { $('#mail-update').show() } if(mail == 0) { mail = ''; $('#mail-update').hide() } else { $('#mail-update').show() }
$('#mail-update').html(mail); $('#mail-update').html(mail);
var intro = $(data).find('intro').text(); var intro = $(data).find('intro').text();
var register = $(data).find('register').text(); if(intro == 0) { intro = ''; $('#notify-update').hide() } else { $('#notify-update').show() }
if(intro == 0) { intro = ''; }
if(register != 0 && intro != '') { intro = intro+'/'+register; }
if(register != 0 && intro == '') { intro = '0/'+register; }
if (intro == '') { $('#notify-update').hide() } else { $('#notify-update').show() }
$('#notify-update').html(intro); $('#notify-update').html(intro);
}); });
@ -178,6 +174,21 @@
liking = 1; liking = 1;
} }
function dostar(ident) {
$('#like-rotator-' + ident.toString()).show();
$.get('starred/' + ident.toString(), function(data) {
if(data.match(/1/)) {
$('#starred-' + ident.toString()).addClass('starred');
$('#starred-' + ident.toString()).removeClass('unstarred');
}
else {
$('#starred-' + ident.toString()).addClass('unstarred');
$('#starred-' + ident.toString()).removeClass('starred');
}
$('#like-rotator-' + ident.toString()).hide();
});
}
function getPosition(e) { function getPosition(e) {
var cursor = {x:0, y:0}; var cursor = {x:0, y:0};
if ( e.pageX || e.pageY ) { if ( e.pageX || e.pageY ) {

View file

@ -20,6 +20,9 @@ function notifier_run($argv, $argc){
require_once('include/items.php'); require_once('include/items.php');
require_once('include/bbcode.php'); require_once('include/bbcode.php');
load_config('config');
load_config('system');
load_hooks(); load_hooks();
if($argc < 3) if($argc < 3)
@ -71,6 +74,16 @@ function notifier_run($argv, $argc){
if(! count($items)) if(! count($items))
return; return;
} }
elseif($cmd === 'suggest') {
$suggest = q("SELECT * FROM `fsuggest` WHERE `id` = %d LIMIT 1",
intval($item_id)
);
if(! count($suggest))
return;
$uid = $suggest[0]['uid'];
$recipients[] = $suggest[0]['cid'];
$item = $suggest[0];
}
else { else {
// find ancestors // find ancestors
@ -106,7 +119,8 @@ function notifier_run($argv, $argc){
$top_level = true; $top_level = true;
} }
$r = q("SELECT `contact`.*, `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`, `user`.`page-flags` $r = q("SELECT `contact`.*, `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`,
`user`.`page-flags`, `user`.`prvnets`
FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
WHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1", WHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1",
intval($uid) intval($uid)
@ -125,7 +139,7 @@ function notifier_run($argv, $argc){
// fill this in with a single salmon slap if applicable // fill this in with a single salmon slap if applicable
$slap = ''; $slap = '';
if($cmd != 'mail') { if($cmd != 'mail' && $cmd != 'suggest') {
require_once('include/group.php'); require_once('include/group.php');
@ -224,6 +238,8 @@ function notifier_run($argv, $argc){
if($cmd === 'mail') { if($cmd === 'mail') {
$notify_hub = false; // mail is not public $notify_hub = false; // mail is not public
$body = fix_private_photos($item['body'],$owner['uid']);
$atom .= replace_macros($mail_template, array( $atom .= replace_macros($mail_template, array(
'$name' => xmlify($owner['name']), '$name' => xmlify($owner['name']),
'$profile_page' => xmlify($owner['url']), '$profile_page' => xmlify($owner['url']),
@ -231,10 +247,30 @@ function notifier_run($argv, $argc){
'$item_id' => xmlify($item['uri']), '$item_id' => xmlify($item['uri']),
'$subject' => xmlify($item['title']), '$subject' => xmlify($item['title']),
'$created' => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , ATOM_TIME)), '$created' => xmlify(datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , ATOM_TIME)),
'$content' => xmlify($item['body']), '$content' => xmlify($body),
'$parent_id' => xmlify($item['parent-uri']) '$parent_id' => xmlify($item['parent-uri'])
)); ));
} }
elseif($cmd === 'suggest') {
$notify_hub = false; // suggestions are not public
$sugg_template = get_markup_template('atom_suggest.tpl');
$atom .= replace_macros($sugg_template, array(
'$name' => xmlify($item['name']),
'$url' => xmlify($item['url']),
'$photo' => xmlify($item['photo']),
'$request' => xmlify($item['request']),
'$note' => xmlify($item['note'])
));
// We don't need this any more
q("DELETE FROM `fsuggest` WHERE `id` = %d LIMIT 1",
intval($item['id'])
);
}
else { else {
if($followup) { if($followup) {
foreach($items as $item) { // there is only one item foreach($items as $item) { // there is only one item
@ -329,7 +365,8 @@ function notifier_run($argv, $argc){
} }
break; break;
case 'stat': case 'stat':
if($owner['prvnets'])
break;
if($followup && $contact['notify']) { if($followup && $contact['notify']) {
logger('notifier: slapdelivery: ' . $contact['name']); logger('notifier: slapdelivery: ' . $contact['name']);
$deliver_status = slapper($owner,$contact['notify'],$slap); $deliver_status = slapper($owner,$contact['notify'],$slap);
@ -373,6 +410,7 @@ function notifier_run($argv, $argc){
} }
} }
break; break;
case 'mail': case 'mail':
// WARNING: does not currently convert to RFC2047 header encodings, etc. // WARNING: does not currently convert to RFC2047 header encodings, etc.
@ -447,9 +485,9 @@ function notifier_run($argv, $argc){
mail($addr, $subject, $message, $headers); mail($addr, $subject, $message, $headers);
} }
break; break;
case 'dspr':
case 'feed': case 'feed':
case 'face': case 'face':
case 'dspr':
default: default:
break; break;
} }

View file

@ -2,6 +2,7 @@
require_once("boot.php"); require_once("boot.php");
function poller_run($argv, $argc){ function poller_run($argv, $argc){
global $a, $db; global $a, $db;
@ -17,13 +18,16 @@ function poller_run($argv, $argc){
}; };
require_once('session.php'); require_once('include/session.php');
require_once('datetime.php'); require_once('include/datetime.php');
require_once('simplepie/simplepie.inc'); require_once('library/simplepie/simplepie.inc');
require_once('include/items.php'); require_once('include/items.php');
require_once('include/Contact.php'); require_once('include/Contact.php');
require_once('include/email.php'); require_once('include/email.php');
load_config('config');
load_config('system');
$a->set_baseurl(get_config('system','url')); $a->set_baseurl(get_config('system','url'));
load_hooks(); load_hooks();
@ -44,18 +48,26 @@ function poller_run($argv, $argc){
proc_run('php','include/expire.php'); proc_run('php','include/expire.php');
} }
// clear old cache // clear old cache
q("DELETE FROM `cache` WHERE `updated` < '%s'", q("DELETE FROM `cache` WHERE `updated` < '%s'",
dbesc(datetime_convert('UTC','UTC',"now - 30 days"))); dbesc(datetime_convert('UTC','UTC',"now - 30 days")));
$manual_id = 0; $manual_id = 0;
$generation = 0;
$hub_update = false; $hub_update = false;
$force = false; $force = false;
$restart = false;
if(($argc > 1) && ($argv[1] == 'force')) if(($argc > 1) && ($argv[1] == 'force'))
$force = true; $force = true;
if(($argc > 1) && ($argv[1] == 'restart')) {
$restart = true;
$generation = intval($argv[2]);
if(! $generation)
killme();
}
if(($argc > 1) && intval($argv[1])) { if(($argc > 1) && intval($argv[1])) {
$manual_id = intval($argv[1]); $manual_id = intval($argv[1]);
$force = true; $force = true;
@ -67,7 +79,8 @@ function poller_run($argv, $argc){
$d = datetime_convert(); $d = datetime_convert();
call_hooks('cron', $d); if(! $restart)
call_hooks('cron', $d);
$contacts = q("SELECT `id` FROM `contact` $contacts = q("SELECT `id` FROM `contact`
@ -151,6 +164,22 @@ function poller_run($argv, $argc){
continue; continue;
} }
// Check to see if we are running out of memory - if so spawn a new process and kill this one
$avail_memory = return_bytes(ini_get('memory_limit'));
$memused = memory_get_peak_usage(true);
if(intval($avail_memory)) {
if(($memused / $avail_memory) > 0.95) {
if($generation + 1 > 10) {
logger('poller: maximum number of spawns exceeded. Terminating.');
killme();
}
logger('poller: memory exceeded. ' . $memused . ' bytes used. Spawning new poll.');
proc_run('php', 'include/poller.php', 'restart', (string) $generation + 1);
killme();
}
}
$importer_uid = $contact['uid']; $importer_uid = $contact['uid'];
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1", $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
@ -281,13 +310,22 @@ function poller_run($argv, $argc){
// Upgrading DB fields from an older Friendika version // Upgrading DB fields from an older Friendika version
// Will only do this once per notify-enabled OStatus contact // Will only do this once per notify-enabled OStatus contact
// or if relationship changes
if(($contact['notify']) && (! $contact['writable'])) { $stat_writeable = ((($contact['notify']) && ($contact['rel'] == REL_VIP || $contact['rel'] == REL_BUD)) ? 1 : 0);
q("UPDATE `contact` SET `writable` = 1 WHERE `id` = %d LIMIT 1",
if($stat_writeable != $contact['writable']) {
q("UPDATE `contact` SET `writable` = %d WHERE `id` = %d LIMIT 1",
intval($stat_writeable),
intval($contact['id']) intval($contact['id'])
); );
} }
// Are we allowed to import from this person?
if($contact['rel'] == REL_VIP || $contact['blocked'] || $contact['readonly'])
continue;
$xml = fetch_url($contact['poll']); $xml = fetch_url($contact['poll']);
} }
elseif($contact['network'] === NETWORK_MAIL) { elseif($contact['network'] === NETWORK_MAIL) {

View file

@ -22,6 +22,9 @@ 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');
load_config('config');
load_config('system');
$a->set_baseurl(get_config('system','url')); $a->set_baseurl(get_config('system','url'));
load_hooks(); load_hooks();

View file

@ -145,9 +145,9 @@ EOT;
// Setup RSA stuff to PKCS#1 sign the data // Setup RSA stuff to PKCS#1 sign the data
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpsec'); set_include_path(get_include_path() . PATH_SEPARATOR . 'library' . PATH_SEPARATOR . 'phpsec');
require_once('phpsec/Crypt/RSA.php'); require_once('library/phpsec/Crypt/RSA.php');
$rsa = new CRYPT_RSA(); $rsa = new CRYPT_RSA();
$rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1; $rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1;

View file

@ -44,3 +44,74 @@ function can_write_wall(&$a,$owner) {
return false; return false;
} }
function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
$local_user = local_user();
$remote_user = remote_user();
/**
* Construct permissions
*
* default permissions - anonymous user
*/
$sql = " AND allow_cid = ''
AND allow_gid = ''
AND deny_cid = ''
AND deny_gid = ''
";
/**
* Profile owner - everything is visible
*/
if(($local_user) && ($local_user == $owner_id)) {
$sql = '';
}
/**
* Authenticated visitor. Unless pre-verified,
* check that the contact belongs to this $owner_id
* and load the groups the visitor belongs to.
* If pre-verified, the caller is expected to have already
* done this and passed the groups into this function.
*/
elseif($remote_user) {
if(! $remote_verified) {
$r = q("SELECT id FROM contact WHERE id = %d AND uid = %d AND blocked = 0 LIMIT 1",
intval($remote_user),
intval($owner_id)
);
if(count($r)) {
$remote_verified = true;
$groups = init_groups_visitor($remote_user);
}
}
if($remote_verified) {
$gs = '<<>>'; // should be impossible to match
if(is_array($groups) && count($groups)) {
foreach($groups as $g)
$gs .= '|<' . intval($g) . '>';
}
$sql = sprintf(
" AND ( allow_cid = '' OR allow_cid REGEXP '<%d>' )
AND ( deny_cid = '' OR NOT deny_cid REGEXP '<%d>' )
AND ( allow_gid = '' OR allow_gid REGEXP '%s' )
AND ( deny_gid = '' OR NOT deny_gid REGEXP '%s')
",
intval($remote_user),
intval($remote_user),
dbesc($gs),
dbesc($gs)
);
}
}
return $sql;
}

View file

@ -44,18 +44,19 @@ $db = new dba($db_host, $db_user, $db_pass, $db_data, $install);
unset($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data);
/** if(! $install) {
* Load configs from db. Overwrite configs from .htconfig.php
*/ /**
$r = q("SELECT * FROM `config` WHERE `cat` IN ('system', 'config')"); * Load configs from db. Overwrite configs from .htconfig.php
foreach ($r as $c) { */
if ($c['cat']=='config') {
$a->config[$c['k']] = $c['v']; load_config('config');
} else { load_config('system');
$a->config[$c['cat']][$c['k']] = $c['v'];
} require_once("session.php");
load_hooks();
call_hooks('init_1');
} }
unset($r);
/** /**
@ -70,14 +71,6 @@ unset($r);
* *
*/ */
if(! $install) {
require_once("session.php");
load_hooks();
call_hooks('init_1');
}
require_once("datetime.php"); require_once("datetime.php");
$a->timezone = (($default_timezone) ? $default_timezone : 'UTC'); $a->timezone = (($default_timezone) ? $default_timezone : 'UTC');

View file

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View file

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

View file

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View file

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View file

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View file

Before

Width:  |  Height:  |  Size: 533 B

After

Width:  |  Height:  |  Size: 533 B

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