Ejemplo n.º 1
0
function diaspora_send_mail($item, $owner, $contact)
{
    $a = get_app();
    $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(), '://') + 3);
    $r = q("select * from conv where id = %d and uid = %d limit 1", intval($item['convid']), intval($item['uid']));
    if (!count($r)) {
        logger('diaspora_send_mail: conversation not found.');
        return;
    }
    $cnv = $r[0];
    $conv = array('guid' => xmlify($cnv['guid']), 'subject' => xmlify($cnv['subject']), 'created_at' => xmlify(datetime_convert('UTC', 'UTC', $cnv['created'], 'Y-m-d H:i:s \\U\\T\\C')), 'diaspora_handle' => xmlify($cnv['creator']), 'participant_handles' => xmlify($cnv['recips']));
    $body = bb2diaspora($item['body']);
    $created = datetime_convert('UTC', 'UTC', $item['created'], 'Y-m-d H:i:s \\U\\T\\C');
    $signed_text = $item['guid'] . ';' . $cnv['guid'] . ';' . $body . ';' . $created . ';' . $myaddr . ';' . $cnv['guid'];
    $sig = base64_encode(rsa_sign($signed_text, $owner['uprvkey'], 'sha256'));
    $msg = array('guid' => xmlify($item['guid']), 'parent_guid' => xmlify($cnv['guid']), 'parent_author_signature' => xmlify($sig), 'author_signature' => xmlify($sig), 'text' => xmlify($body), 'created_at' => xmlify($created), 'diaspora_handle' => xmlify($myaddr), 'conversation_guid' => xmlify($cnv['guid']));
    if ($item['reply']) {
        $tpl = get_markup_template('diaspora_message.tpl');
        $xmsg = replace_macros($tpl, array('$msg' => $msg));
    } else {
        $conv['messages'] = array($msg);
        $tpl = get_markup_template('diaspora_conversation.tpl');
        $xmsg = replace_macros($tpl, array('$conv' => $conv));
    }
    logger('diaspora_conversation: ' . print_r($xmsg, true), LOGGER_DATA);
    $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($xmsg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], false)));
    //$slap = 'xml=' . urlencode(diaspora_msg_build($xmsg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],false));
    return diaspora_transmit($owner, $contact, $slap, false);
}
Ejemplo n.º 2
0
function queue_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 'include/items.php';
    require_once 'include/bbcode.php';
    require_once 'include/pidfile.php';
    require_once 'include/socgraph.php';
    load_config('config');
    load_config('system');
    $lockpath = get_lockpath();
    if ($lockpath != '') {
        $pidfile = new pidfile($lockpath, 'queue');
        if ($pidfile->is_already_running()) {
            logger("queue: Already running");
            if ($pidfile->running_time() > 9 * 60) {
                $pidfile->kill();
                logger("queue: killed stale process");
                // Calling a new instance
                proc_run('php', "include/queue.php");
            }
            return;
        }
    }
    $a->set_baseurl(get_config('system', 'url'));
    load_hooks();
    if ($argc > 1) {
        $queue_id = intval($argv[1]);
    } else {
        $queue_id = 0;
    }
    $deadguys = array();
    logger('queue: start');
    // Handling the pubsubhubbub requests
    proc_run('php', 'include/pubsubpublish.php');
    $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");
    if ($r) {
        foreach ($r as $rr) {
            logger('queue: deliverq');
            proc_run('php', 'include/delivery.php', $rr['cmd'], $rr['item'], $rr['contact']);
            if ($interval) {
                @time_sleep_until(microtime(true) + (double) $interval);
            }
        }
    }
    $r = q("SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue`\n\t\tINNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`\n\t\tWHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
    if ($r) {
        foreach ($r as $rr) {
            logger('Removing expired queue item for ' . $rr['name'] . ', uid=' . $rr['uid']);
            logger('Expired queue data :' . $rr['content'], LOGGER_DATA);
        }
        q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
    }
    if ($queue_id) {
        $r = q("SELECT `id` FROM `queue` WHERE `id` = %d LIMIT 1", intval($queue_id));
    } else {
        // For the first 12 hours we'll try to deliver every 15 minutes
        // After that, we'll only attempt delivery once per hour.
        $r = q("SELECT `id` FROM `queue` WHERE (( `created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR && `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ) OR ( `last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR ))");
    }
    if (!$r) {
        return;
    }
    if (!$queue_id) {
        call_hooks('queue_predeliver', $a, $r);
    }
    // delivery loop
    require_once 'include/salmon.php';
    require_once 'include/diaspora.php';
    foreach ($r as $q_item) {
        // queue_predeliver hooks may have changed the queue db details,
        // so check again if this entry still needs processing
        if ($queue_id) {
            $qi = q("select * from queue where `id` = %d limit 1", intval($queue_id));
        } else {
            $qi = q("SELECT * FROM `queue` WHERE `id` = %d AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ", intval($q_item['id']));
        }
        if (!count($qi)) {
            continue;
        }
        $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($qi[0]['cid']));
        if (!count($c)) {
            remove_queue_item($q_item['id']);
            continue;
        }
        if (in_array($c[0]['notify'], $deadguys)) {
            logger('queue: skipping known dead url: ' . $c[0]['notify']);
            update_queue_time($q_item['id']);
            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`\n\t\t\tFROM `user` WHERE `uid` = %d LIMIT 1", intval($c[0]['uid']));
        if (!count($u)) {
            remove_queue_item($q_item['id']);
            continue;
        }
        $data = $qi[0]['content'];
        $public = $qi[0]['batch'];
        $contact = $c[0];
        $owner = $u[0];
        $deliver_status = 0;
        switch ($contact['network']) {
            case NETWORK_DFRN:
                logger('queue: dfrndelivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
                $deliver_status = dfrn_deliver($owner, $contact, $data);
                if ($deliver_status == -1) {
                    update_queue_time($q_item['id']);
                    $deadguys[] = $contact['notify'];
                } else {
                    remove_queue_item($q_item['id']);
                }
                break;
            case NETWORK_OSTATUS:
                if ($contact['notify']) {
                    logger('queue: slapdelivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
                    $deliver_status = slapper($owner, $contact['notify'], $data);
                    if ($deliver_status == -1) {
                        update_queue_time($q_item['id']);
                    } else {
                        remove_queue_item($q_item['id']);
                    }
                }
                break;
            case NETWORK_DIASPORA:
                if ($contact['notify']) {
                    logger('queue: diaspora_delivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
                    $deliver_status = diaspora_transmit($owner, $contact, $data, $public, true);
                    if ($deliver_status == -1) {
                        update_queue_time($q_item['id']);
                    } else {
                        remove_queue_item($q_item['id']);
                    }
                }
                break;
            default:
                $params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
                call_hooks('queue_deliver', $a, $params);
                if ($params['result']) {
                    remove_queue_item($q_item['id']);
                } else {
                    update_queue_time($q_item['id']);
                }
                break;
        }
    }
    return;
}
Ejemplo n.º 3
0
function diaspora_send_mail($item, $owner, $contact)
{
    $a = get_app();
    $myaddr = $owner['channel_address'] . '@' . get_app()->get_hostname();
    $r = q("select * from conv where id = %d and uid = %d limit 1", intval($item['convid']), intval($item['channel_id']));
    if (!count($r)) {
        logger('diaspora_send_mail: conversation not found.');
        return;
    }
    $cnv = $r[0];
    $conv = array('guid' => xmlify($cnv['guid']), 'subject' => xmlify($cnv['subject']), 'created_at' => xmlify(datetime_convert('UTC', 'UTC', $cnv['created'], 'Y-m-d H:i:s \\U\\T\\C')), 'diaspora_handle' => xmlify($cnv['creator']), 'participant_handles' => xmlify($cnv['recips']));
    if (array_key_exists('mail_flags', $item) && $item['mail_flags'] & MAIL_OBSCURED) {
        $key = get_config('system', 'prvkey');
        //		if($item['title'])
        //			$item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key);
        if ($item['body']) {
            $item['body'] = crypto_unencapsulate(json_decode_plus($item['body']), $key);
        }
    }
    $body = bb2diaspora($item['body']);
    $created = datetime_convert('UTC', 'UTC', $item['created'], 'Y-m-d H:i:s \\U\\T\\C');
    $signed_text = $item['mid'] . ';' . $cnv['guid'] . ';' . $body . ';' . $created . ';' . $myaddr . ';' . $cnv['guid'];
    $sig = base64_encode(rsa_sign($signed_text, $owner['channel_prvkey'], 'sha256'));
    $msg = array('guid' => xmlify($item['mid']), 'parent_guid' => xmlify($cnv['guid']), 'parent_author_signature' => $item['reply'] ? null : xmlify($sig), 'author_signature' => xmlify($sig), 'text' => xmlify($body), 'created_at' => xmlify($created), 'diaspora_handle' => xmlify($myaddr), 'conversation_guid' => xmlify($cnv['guid']));
    if ($item['reply']) {
        $tpl = get_markup_template('diaspora_message.tpl');
        $xmsg = replace_macros($tpl, array('$msg' => $msg));
    } else {
        $conv['messages'] = array($msg);
        $tpl = get_markup_template('diaspora_conversation.tpl');
        $xmsg = replace_macros($tpl, array('$conv' => $conv));
    }
    logger('diaspora_conversation: ' . print_r($xmsg, true), LOGGER_DATA);
    $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($xmsg, $owner, $contact, $owner['channel_prvkey'], $contact['xchan_pubkey'], false)));
    return diaspora_transmit($owner, $contact, $slap, false);
}
Ejemplo n.º 4
0
function queue_run($argv, $argc)
{
    global $a, $db;
    if (is_null($a)) {
        $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);
    }
    require_once "session.php";
    require_once "datetime.php";
    require_once 'include/items.php';
    require_once 'include/bbcode.php';
    load_config('config');
    load_config('system');
    $a->set_baseurl(get_config('system', 'url'));
    load_hooks();
    if ($argc > 1) {
        $queue_id = intval($argv[1]);
    } else {
        $queue_id = 0;
    }
    $deadguys = array();
    logger('queue: start');
    $interval = get_config('system', 'delivery_interval') === false ? 2 : intval(get_config('system', 'delivery_interval'));
    $r = q("select * from deliverq where 1");
    if (count($r)) {
        foreach ($r as $rr) {
            logger('queue: deliverq');
            proc_run('php', 'include/delivery.php', $rr['cmd'], $rr['item'], $rr['contact']);
            if ($interval) {
                @time_sleep_until(microtime(true) + (double) $interval);
            }
        }
    }
    $r = q("SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue` \n\t\tLEFT JOIN `contact` ON `queue`.`cid` = `contact`.`id` \n\t\tWHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
    if (count($r)) {
        foreach ($r as $rr) {
            logger('Removing expired queue item for ' . $rr['name'] . ', uid=' . $rr['uid']);
            logger('Expired queue data :' . $rr['content'], LOGGER_DATA);
        }
        q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
    }
    if ($queue_id) {
        $r = q("SELECT `id` FROM `queue` WHERE `id` = %d LIMIT 1", intval($queue_id));
    } else {
        $r = q("SELECT `id` FROM `queue` WHERE `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ");
    }
    if (!count($r)) {
        return;
    }
    if (!$queue_id) {
        call_hooks('queue_predeliver', $a, $r);
    }
    // delivery loop
    require_once 'include/salmon.php';
    require_once 'include/diaspora.php';
    foreach ($r as $q_item) {
        // queue_predeliver hooks may have changed the queue db details,
        // so check again if this entry still needs processing
        if ($queue_id) {
            $qi = q("select * from queue where `id` = %d limit 1", intval($queue_id));
        } else {
            $qi = q("SELECT * FROM `queue` WHERE `id` = %d AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ", intval($q_item['id']));
        }
        if (!count($qi)) {
            continue;
        }
        $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($qi[0]['cid']));
        if (!count($c)) {
            remove_queue_item($q_item['id']);
            continue;
        }
        if (in_array($c[0]['notify'], $deadguys)) {
            logger('queue: skipping known dead url: ' . $c[0]['notify']);
            update_queue_time($q_item['id']);
            continue;
        }
        $u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey` \n\t\t\tFROM `user` WHERE `uid` = %d LIMIT 1", intval($c[0]['uid']));
        if (!count($u)) {
            remove_queue_item($q_item['id']);
            continue;
        }
        $data = $qi[0]['content'];
        $public = $qi[0]['batch'];
        $contact = $c[0];
        $owner = $u[0];
        $deliver_status = 0;
        switch ($contact['network']) {
            case NETWORK_DFRN:
                logger('queue: dfrndelivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
                $deliver_status = dfrn_deliver($owner, $contact, $data);
                if ($deliver_status == -1) {
                    update_queue_time($q_item['id']);
                    $deadguys[] = $contact['notify'];
                } else {
                    remove_queue_item($q_item['id']);
                }
                break;
            case NETWORK_OSTATUS:
                if ($contact['notify']) {
                    logger('queue: slapdelivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
                    $deliver_status = slapper($owner, $contact['notify'], $data);
                    if ($deliver_status == -1) {
                        update_queue_time($q_item['id']);
                    } else {
                        remove_queue_item($q_item['id']);
                    }
                }
                break;
            case NETWORK_DIASPORA:
                if ($contact['notify']) {
                    logger('queue: diaspora_delivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
                    $deliver_status = diaspora_transmit($owner, $contact, $data, $public);
                    if ($deliver_status == -1) {
                        update_queue_time($q_item['id']);
                    } else {
                        remove_queue_item($q_item['id']);
                    }
                }
                break;
            default:
                $params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
                call_hooks('queue_deliver', $a, $params);
                if ($params['result']) {
                    remove_queue_item($q_item['id']);
                } else {
                    update_queue_time($q_item['id']);
                }
                break;
        }
    }
    return;
}