fill and expire fcontact cache

This commit is contained in:
Friendika 2011-08-18 04:20:30 -07:00
parent f561a82647
commit c534dd2969
5 changed files with 57 additions and 41 deletions

View file

@ -9,7 +9,7 @@ require_once("include/pgettext.php");
define ( 'FRIENDIKA_VERSION', '2.2.1075' ); define ( 'FRIENDIKA_VERSION', '2.2.1075' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
define ( 'DB_UPDATE_VERSION', 1080 ); define ( 'DB_UPDATE_VERSION', 1081 );
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' );

View file

@ -531,6 +531,7 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
`network` CHAR( 32 ) NOT NULL , `network` CHAR( 32 ) NOT NULL ,
`alias` CHAR( 255 ) NOT NULL , `alias` CHAR( 255 ) NOT NULL ,
`pubkey` TEXT NOT NULL , `pubkey` TEXT NOT NULL ,
`updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
INDEX ( `addr` ), INDEX ( `addr` ),
INDEX ( `network` ) INDEX ( `network` )
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MYISAM DEFAULT CHARSET=utf8;

View file

@ -4,25 +4,11 @@ require_once('include/crypto.php');
require_once('include/items.php'); require_once('include/items.php');
function get_diaspora_key($uri) { function get_diaspora_key($uri) {
$key = '';
logger('Fetching diaspora key for: ' . $uri); logger('Fetching diaspora key for: ' . $uri);
$arr = lrdd($uri); $r = find_diaspora_person_by_handle($uri);
if($r)
if(is_array($arr)) { return $r['pubkey'];
foreach($arr as $a) {
if($a['@attributes']['rel'] === 'diaspora-public-key') {
$key = base64_decode($a['@attributes']['href']);
}
}
}
else {
return '';
}
if($key)
return rsatopem($key);
return ''; return '';
} }
@ -218,7 +204,7 @@ function diaspora_decode($importer,$xml) {
$encoding = $base->encoding; $encoding = $base->encoding;
$alg = $base->alg; $alg = $base->alg;
// Diaspora devs: I can't even begin to tell you how sucky this is. Read the freaking spec. // Diaspora devs: I can't even begin to tell you how sucky this is. Please read the spec.
$signed_data = $data . (($data[-1] != "\n") ? "\n" : '') . '.' . base64url_encode($type) . "\n" . '.' . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n"; $signed_data = $data . (($data[-1] != "\n") ? "\n" : '') . '.' . base64url_encode($type) . "\n" . '.' . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n";
@ -278,28 +264,33 @@ function diaspora_get_contact_by_handle($uid,$handle) {
return false; return false;
} }
function find_person_by_handle($handle) { function find_diaspora_person_by_handle($handle) {
$r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1", $r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1",
dbesc(NETWORK_DIASPORA), dbesc(NETWORK_DIASPORA),
dbesc($handle) dbesc($handle)
); );
if(count($r)) if(count($r)) {
// update record occasionally so it doesn't get stale
$d = strtotime($r[0]['updated'] . ' +00:00');
if($d < strtotime('now - 14 days')) {
q("delete from fcontact where id = %d limit 1",
intval($r[0]['id'])
);
}
else
return $r[0]; return $r[0];
}
// we don't care about the uid, we just want to save an expensive webfinger probe require_once('include/Scrape.php');
$r = q("select * from contact where network = '%s' and addr = '%s' LIMIT 1", $r = probe_url($handle, PROBE_DIASPORA);
dbesc(NETWORK_DIASPORA), if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) {
dbesc($handle) add_fcontact($r);
); return ($r);
if(count($r)) }
return $r[0]; return false;
$r = probe_url($handle);
// need to cached this, perhaps in fcontact
if(count($r))
return ($r);
return false;
} }
function diaspora_request($importer,$xml) { function diaspora_request($importer,$xml) {
$sender_handle = unxmlify($xml->sender_handle); $sender_handle = unxmlify($xml->sender_handle);
@ -504,7 +495,7 @@ function diaspora_comment($importer,$xml,$msg) {
$key = $msg['key']; $key = $msg['key'];
} }
else { else {
$person = find_person_by_handle($diaspora_handle); $person = find_diaspora_person_by_handle($diaspora_handle);
if(is_array($person) && x($person,'pubkey')) if(is_array($person) && x($person,'pubkey'))
$key = $person['pubkey']; $key = $person['pubkey'];
@ -661,7 +652,7 @@ function diaspora_like($importer,$xml,$msg) {
$key = $msg['key']; $key = $msg['key'];
} }
else { else {
$person = find_person_by_handle($diaspora_handle); $person = find_diaspora_person_by_handle($diaspora_handle);
if(is_array($person) && x($person,'pubkey')) if(is_array($person) && x($person,'pubkey'))
$key = $person['pubkey']; $key = $person['pubkey'];
else { else {

View file

@ -693,3 +693,24 @@ function parse_xml_string($s,$strict = true) {
} }
return $x; return $x;
}} }}
function add_fcontact($arr) {
$r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`,
`notify`,`poll`,`confirm`,`network`,`alias`,`pubkey` )
values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
dbesc($arr['url']),
dbesc($arr['name']),
dbesc($arr['photo']),
dbesc($arr['request']),
dbesc($arr['nick']),
dbesc($arr['addr']),
dbesc($arr['notify']),
dbesc($arr['poll']),
dbesc($arr['confirm']),
dbesc($arr['network']),
dbesc($arr['alias']),
dbesc($arr['pubkey'])
);
return $r;
}

View file

@ -1,6 +1,6 @@
<?php <?php
define( 'UPDATE_VERSION' , 1080 ); define( 'UPDATE_VERSION' , 1081 );
/** /**
* *
@ -671,3 +671,6 @@ function update_1079() {
} }
function update_1080() {
q("ALTER TABLE `fcontact` ADD `updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'");
}