use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) {
- define('DB_UPDATE_VERSION', 1313);
+ define('DB_UPDATE_VERSION', 1314);
}
return [
"inform" => ["type" => "mediumtext", "comment" => "Additional receivers of the linked item"],
"queue_count" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Initial number of delivery recipients, used as item.delivery_queue_count"],
"queue_done" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries, used as item.delivery_queue_done"],
+ "activitypub" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via ActivityPub"],
+ "dfrn" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via DFRN"],
+ "legacy_dfrn" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via legacy DFRN"],
+ "diaspora" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via Diaspora"],
+ "ostatus" => ["type" => "mediumint", "not null" => "1", "default" => "0", "comment" => "Number of successful deliveries via OStatus"],
],
"indexes" => [
"PRIMARY" => ["iid"],
-- ------------------------------------------
--- Friendica 2019.06-dev (Dalmatian Bellflower)
--- DB_UPDATE_VERSION 1311
+-- Friendica 2019.09-dev (Dalmatian Bellflower)
+-- DB_UPDATE_VERSION 1314
-- ------------------------------------------
+--
+-- TABLE 2fa_recovery_codes
+--
+CREATE TABLE IF NOT EXISTS `2fa_recovery_codes` (
+ `uid` mediumint unsigned NOT NULL COMMENT 'User ID',
+ `code` varchar(50) NOT NULL COMMENT 'Recovery code string',
+ `generated` datetime NOT NULL COMMENT 'Datetime the code was generated',
+ `used` datetime COMMENT 'Datetime the code was used',
+ PRIMARY KEY(`uid`,`code`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Two-factor authentication recovery codes';
+
--
-- TABLE addon
--
`term-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
`last-item` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'date of the last post',
`priority` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
- `blocked` boolean NOT NULL DEFAULT '1' COMMENT '',
+ `blocked` boolean NOT NULL DEFAULT '1' COMMENT 'Node-wide block status',
+ `block_reason` text COMMENT 'Node-wide block reason',
`readonly` boolean NOT NULL DEFAULT '0' COMMENT 'posts of the contact are readonly',
`writable` boolean NOT NULL DEFAULT '0' COMMENT '',
`forum` boolean NOT NULL DEFAULT '0' COMMENT 'contact is a forum',
`inform` mediumtext COMMENT 'Additional receivers of the linked item',
`queue_count` mediumint NOT NULL DEFAULT 0 COMMENT 'Initial number of delivery recipients, used as item.delivery_queue_count',
`queue_done` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries, used as item.delivery_queue_done',
+ `activitypub` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via ActivityPub',
+ `dfrn` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via DFRN',
+ `legacy_dfrn` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via legacy DFRN',
+ `diaspora` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via Diaspora',
+ `ostatus` mediumint NOT NULL DEFAULT 0 COMMENT 'Number of successful deliveries via OStatus',
PRIMARY KEY(`iid`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Delivery data for items';
'queue_done' => 'delivery_queue_done',
];
+ const ACTIVITYPUB = 1;
+ const DFRN = 2;
+ const LEGACY_DFRN = 3;
+ const DIASPORA = 4;
+ const OSTATUS = 5;
+
/**
* Extract delivery data from the provided item fields
*
* Avoids racing condition between multiple delivery threads.
*
* @param integer $item_id
+ * @param integer $protocol
* @return bool
* @throws \Exception
*/
- public static function incrementQueueDone($item_id)
+ public static function incrementQueueDone($item_id, $protocol = 0)
{
- return DBA::e('UPDATE `item-delivery-data` SET `queue_done` = `queue_done` + 1 WHERE `iid` = ?', $item_id);
+ $sql = '';
+
+ switch ($protocol) {
+ case self::ACTIVITYPUB:
+ $sql = ", `activitypub` = `activitypub` + 1";
+ break;
+ case self::DFRN:
+ $sql = ", `dfrn` = `dfrn` + 1";
+ break;
+ case self::LEGACY_DFRN:
+ $sql = ", `legacy_dfrn` = `legacy_dfrn` + 1";
+ break;
+ case self::DIASPORA:
+ $sql = ", `diaspora` = `diaspora` + 1";
+ break;
+ case self::OSTATUS:
+ $sql = ", `ostatus` = `ostatus` + 1";
+ break;
+ }
+
+ return DBA::e('UPDATE `item-delivery-data` SET `queue_done` = `queue_done` + 1' . $sql . ' WHERE `iid` = ?', $item_id);
}
/**
* @param string $atom Content that will be transmitted
* @param bool $dissolve (to be documented)
*
- * @param bool $legacy_transport
* @return int Deliver status. Negative values mean an error.
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
* @todo Add array type-hint for $owner, $contact
*/
- public static function deliver($owner, $contact, $atom, $dissolve = false, $legacy_transport = false)
+ public static function deliver($owner, $contact, $atom, $dissolve = false)
{
- // At first try the Diaspora transport layer
- if (!$dissolve && !$legacy_transport) {
- $curlResult = self::transmit($owner, $contact, $atom);
- if ($curlResult >= 200) {
- Logger::log('Delivery via Diaspora transport layer was successful with status ' . $curlResult);
- return $curlResult;
- }
- }
-
$idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
if ($contact['duplex'] && $contact['dfrn-id']) {
if (!empty($data)) {
$success = HTTPSignature::transmit($data, $inbox, $uid);
if ($success && in_array($cmd, [Delivery::POST])) {
- ItemDeliveryData::incrementQueueDone($target_id);
+ ItemDeliveryData::incrementQueueDone($target_id, ItemDeliveryData::ACTIVITYPUB);
}
}
}
DFRN::import($atom, $target_importer);
if (in_array($cmd, [Delivery::POST, Delivery::POKE])) {
- Model\ItemDeliveryData::incrementQueueDone($target_item['id']);
+ Model\ItemDeliveryData::incrementQueueDone($target_item['id'], Model\ItemDeliveryData::DFRN);
}
return;
}
+ $protocol = Model\ItemDeliveryData::DFRN;
+
// We don't have a relationship with contacts on a public post.
// Se we transmit with the new method and via Diaspora as a fallback
if (!empty($items) && (($items[0]['uid'] == 0) || ($contact['uid'] == 0))) {
return;
}
} elseif ($cmd != self::RELOCATION) {
- $deliver_status = DFRN::deliver($owner, $contact, $atom);
+ // DFRN payload over Diaspora transport layer
+ $deliver_status = DFRN::transmit($owner, $contact, $atom);
+ if ($deliver_status < 200) {
+ // Legacy DFRN
+ $deliver_status = DFRN::deliver($owner, $contact, $atom);
+ $protocol = Model\ItemDeliveryData::LEGACY_DFRN;
+ }
} else {
- $deliver_status = DFRN::deliver($owner, $contact, $atom, false, true);
+ $deliver_status = DFRN::deliver($owner, $contact, $atom);
+ $protocol = Model\ItemDeliveryData::LEGACY_DFRN;
}
Logger::info('DFRN Delivery', ['cmd' => $cmd, 'url' => $contact['url'], 'guid' => defaults($target_item, 'guid', $target_item['id']), 'return' => $deliver_status]);
Model\Contact::unmarkForArchival($contact);
if (in_array($cmd, [Delivery::POST, Delivery::POKE])) {
- Model\ItemDeliveryData::incrementQueueDone($target_item['id']);
+ Model\ItemDeliveryData::incrementQueueDone($target_item['id'], $protocol);
}
} else {
// The message could not be delivered. We mark the contact as "dead"
Model\Contact::unmarkForArchival($contact);
if (in_array($cmd, [Delivery::POST, Delivery::POKE])) {
- Model\ItemDeliveryData::incrementQueueDone($target_item['id']);
+ Model\ItemDeliveryData::incrementQueueDone($target_item['id'], Model\ItemDeliveryData::DIASPORA);
}
} else {
// The message could not be delivered. We mark the contact as "dead"
// defer message for redelivery
Worker::defer();
} elseif (in_array($cmd, [Delivery::POST, Delivery::POKE])) {
- Model\ItemDeliveryData::incrementQueueDone($target_item['id']);
+ Model\ItemDeliveryData::incrementQueueDone($target_item['id'], Model\ItemDeliveryData::DIASPORA);
}
}
}
Logger::log('Salmon delivery of item ' . $target_id . ' to ' . $url);
/// @TODO Redeliver/queue these items on failure, though there is no contact record
Salmon::slapper($owner, $url, $slap);
- ItemDeliveryData::incrementQueueDone($target_id);
+ ItemDeliveryData::incrementQueueDone($target_id, ItemDeliveryData::OSTATUS);
}
}