Merge pull request #274 from nextcloud/feature/219/update-actor

Using signature date as 'creation' date
pull/299/head
Julius Härtl 2019-01-03 11:55:34 +01:00 zatwierdzone przez GitHub
commit f54b346bd0
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
5 zmienionych plików z 68 dodań i 15 usunięć

Wyświetl plik

@ -166,11 +166,12 @@ class ActivityPubController extends Controller {
$body = file_get_contents('php://input'); $body = file_get_contents('php://input');
$this->miscService->log('[<<] shared-inbox: ' . $body, 1); $this->miscService->log('[<<] shared-inbox: ' . $body, 1);
$origin = $this->signatureService->checkRequest($this->request); $requestTime = 0;
$origin = $this->signatureService->checkRequest($this->request, $requestTime);
$activity = $this->importService->importFromJson($body); $activity = $this->importService->importFromJson($body);
if (!$this->signatureService->checkObject($activity)) { if (!$this->signatureService->checkObject($activity)) {
$activity->setOrigin($origin, SignatureService::ORIGIN_HEADER); $activity->setOrigin($origin, SignatureService::ORIGIN_HEADER, $requestTime);
} }
try { try {
@ -204,14 +205,15 @@ class ActivityPubController extends Controller {
$body = file_get_contents('php://input'); $body = file_get_contents('php://input');
$this->miscService->log('[<<] inbox: ' . $body, 1); $this->miscService->log('[<<] inbox: ' . $body, 1);
$origin = $this->signatureService->checkRequest($this->request); $requestTime = 0;
$origin = $this->signatureService->checkRequest($this->request, $requestTime);
// TODO - check the recipient <-> username // TODO - check the recipient <-> username
// $actor = $this->actorService->getActor($username); // $actor = $this->actorService->getActor($username);
$activity = $this->importService->importFromJson($body); $activity = $this->importService->importFromJson($body);
if (!$this->signatureService->checkObject($activity)) { if (!$this->signatureService->checkObject($activity)) {
$activity->setOrigin($origin, SignatureService::ORIGIN_HEADER); $activity->setOrigin($origin, SignatureService::ORIGIN_HEADER, $requestTime);
} }
try { try {

Wyświetl plik

@ -64,6 +64,14 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
* @param Person $actor * @param Person $actor
*/ */
public function save(Person $actor) { public function save(Person $actor) {
if ($actor->getCreation() > 0) {
$dTime = new DateTime();
$dTime->setTimestamp($actor->getCreation());
} else {
$dTime = new DateTime('now');
}
$qb = $this->getCacheActorsInsertSql(); $qb = $this->getCacheActorsInsertSql();
$qb->setValue('id', $qb->createNamedParameter($actor->getId())) $qb->setValue('id', $qb->createNamedParameter($actor->getId()))
->setValue('account', $qb->createNamedParameter($actor->getAccount())) ->setValue('account', $qb->createNamedParameter($actor->getAccount()))
@ -86,7 +94,7 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
->setValue('details', $qb->createNamedParameter(json_encode($actor->getDetails()))) ->setValue('details', $qb->createNamedParameter(json_encode($actor->getDetails())))
->setValue( ->setValue(
'creation', 'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE) $qb->createNamedParameter($dTime, IQueryBuilder::PARAM_DATE)
); );
if ($actor->gotIcon()) { if ($actor->gotIcon()) {
@ -108,16 +116,25 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
* @param Person $actor * @param Person $actor
*/ */
public function update(Person $actor) { public function update(Person $actor) {
if ($actor->getCreation() > 0) {
$dTime = new DateTime();
$dTime->setTimestamp($actor->getCreation());
} else {
$dTime = new DateTime('now');
}
$qb = $this->getCacheActorsUpdateSql(); $qb = $this->getCacheActorsUpdateSql();
$qb->set('account', $qb->createNamedParameter($actor->getAccount())) $qb->set('following', $qb->createNamedParameter($actor->getFollowing()))
->set('following', $qb->createNamedParameter($actor->getFollowing()))
->set('followers', $qb->createNamedParameter($actor->getFollowers())) ->set('followers', $qb->createNamedParameter($actor->getFollowers()))
->set('inbox', $qb->createNamedParameter($actor->getInbox())) ->set('inbox', $qb->createNamedParameter($actor->getInbox()))
->set('shared_inbox', $qb->createNamedParameter($actor->getSharedInbox())) ->set('shared_inbox', $qb->createNamedParameter($actor->getSharedInbox()))
->set('outbox', $qb->createNamedParameter($actor->getOutbox())) ->set('outbox', $qb->createNamedParameter($actor->getOutbox()))
->set('featured', $qb->createNamedParameter($actor->getFeatured())) ->set('featured', $qb->createNamedParameter($actor->getFeatured()))
->set('url', $qb->createNamedParameter($actor->getUrl())) ->set('url', $qb->createNamedParameter($actor->getUrl()))
->set('preferred_username', $qb->createNamedParameter($actor->getPreferredUsername())) ->set(
'preferred_username', $qb->createNamedParameter($actor->getPreferredUsername())
)
->set('name', $qb->createNamedParameter($actor->getName())) ->set('name', $qb->createNamedParameter($actor->getName()))
->set('summary', $qb->createNamedParameter($actor->getSummary())) ->set('summary', $qb->createNamedParameter($actor->getSummary()))
->set('public_key', $qb->createNamedParameter($actor->getPublicKey())) ->set('public_key', $qb->createNamedParameter($actor->getPublicKey()))
@ -125,7 +142,7 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
->set('details', $qb->createNamedParameter(json_encode($actor->getDetails()))) ->set('details', $qb->createNamedParameter(json_encode($actor->getDetails())))
->set( ->set(
'creation', 'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE) $qb->createNamedParameter($dTime, IQueryBuilder::PARAM_DATE)
); );
if ($actor->gotIcon()) { if ($actor->gotIcon()) {
@ -134,10 +151,10 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
} else { } else {
$iconId = $actor->getIconId(); $iconId = $actor->getIconId();
} }
$qb->set('icon_id', $qb->createNamedParameter($iconId)); $qb->set('icon_id', $qb->createNamedParameter($iconId));
$this->limitToIdString($qb, $actor->getId()); $this->limitToIdString($qb, $actor->getId());
$qb->execute(); $qb->execute();
} }

Wyświetl plik

@ -136,11 +136,25 @@ class PersonInterface implements IActivityPubInterface {
/** /**
* @param ACore $activity * @param ACore $activity
* @param ACore $item * @param ACore $item
*
* @throws InvalidOriginException
*/ */
public function activity(Acore $activity, ACore $item) { public function activity(Acore $activity, ACore $item) {
/** @var Person $item */ /** @var Person $item */
if ($activity->getType() === Update::TYPE) { if ($activity->getType() === Update::TYPE) {
// TODO - check time and update. $activity->checkOrigin($item->getId());
$item->setCreation($activity->getOriginCreationTime());
try {
$current = $this->cacheActorsRequest->getFromId($item->getId());
if ($current->getCreation() < $activity->getOriginCreationTime()) {
$this->cacheActorsRequest->update($item);
}
} catch (CacheActorDoesNotExistException $e) {
$this->cacheActorsRequest->save($item);
}
} }
} }

Wyświetl plik

@ -106,6 +106,9 @@ class Item {
/** @var int */ /** @var int */
private $originSource = 0; private $originSource = 0;
/** @var int */
private $originCreationTime = 0;
/** /**
* @return string * @return string
@ -442,16 +445,27 @@ class Item {
return $this->originSource; return $this->originSource;
} }
/**
* @return int
*/
public function getOriginCreationTime(): int {
return $this->originCreationTime;
}
/** /**
* @param string $origin * @param string $origin
* *
* @param int $source * @param int $source
* *
* @param int $creationTime
*
* @return Item * @return Item
*/ */
public function setOrigin(string $origin, int $source): Item { public function setOrigin(string $origin, int $source, int $creationTime): Item {
$this->origin = $origin; $this->origin = $origin;
$this->originSource = $source; $this->originSource = $source;
$this->originCreationTime = $creationTime;
return $this; return $this;
} }

Wyświetl plik

@ -161,6 +161,8 @@ class SignatureService {
/** /**
* @param IRequest $request * @param IRequest $request
* *
* @param int $time
*
* @return string * @return string
* @throws InvalidOriginException * @throws InvalidOriginException
* @throws InvalidResourceException * @throws InvalidResourceException
@ -174,11 +176,12 @@ class SignatureService {
* @throws SocialAppConfigException * @throws SocialAppConfigException
* @throws ItemUnknownException * @throws ItemUnknownException
*/ */
public function checkRequest(IRequest $request): string { public function checkRequest(IRequest $request, int &$time = 0): string {
$dTime = new DateTime($request->getHeader('date')); $dTime = new DateTime($request->getHeader('date'));
$dTime->format(self::DATE_FORMAT); $dTime->format(self::DATE_FORMAT);
$time = $dTime->getTimestamp();
if ($dTime->getTimestamp() < (time() - self::DATE_DELAY)) { if ($time < (time() - self::DATE_DELAY)) {
throw new SignatureException('object is too old'); throw new SignatureException('object is too old');
} }
@ -222,8 +225,11 @@ class SignatureService {
return false; return false;
} }
$dTime = new DateTime($signature->getCreated());
$time = $dTime->getTimestamp();
$object->setOrigin( $object->setOrigin(
$this->getKeyOrigin($actorId), SignatureService::ORIGIN_SIGNATURE $this->getKeyOrigin($actorId), SignatureService::ORIGIN_SIGNATURE, $time
); );
return true; return true;