kopia lustrzana https://github.com/nextcloud/social
Merge pull request #274 from nextcloud/feature/219/update-actor
Using signature date as 'creation' datepull/299/head
commit
f54b346bd0
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Ładowanie…
Reference in New Issue