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
	
	 Julius Härtl
						Julius Härtl