/**
  * @param $tokenParameters
  * @throws \Exception
  */
 protected function persistToken($tokenParameters)
 {
     if ($tokenParameters['screen_name'] !== $this->getUser()->getTwitterUserName()) {
         throw new \Exception('The token doesn\'t match ' . 'with the declared twitter username of current user');
     }
     $tokens = $this->tokenRepository->findBy(['oauthToken' => $tokenParameters['oauth_token']]);
     if (count($tokens) === 0) {
         $token = $this->tokenRepository->makeToken($tokenParameters);
         /** @var \WTW\UserBundle\Entity\User $user */
         $user = $this->getUser();
         $phantomUser = $this->userManager->findUserBy(['twitter_username' => $tokenParameters['screen_name'], 'twitterID' => $tokenParameters['user_id']]);
         if (!is_null($phantomUser)) {
             $phantomUser->setTwitterID(null);
             $this->entityManager->persist($phantomUser);
             $this->entityManager->flush();
         }
         $this->userManager->updateUserTwitterCredentials($user, $tokenParameters);
         $token->addUser($user);
         $this->entityManager->persist($token);
         $this->entityManager->flush();
         $user->addToken($token);
         $this->entityManager->persist($user);
         $this->entityManager->flush();
         $noticeMessage = 'successful_access_token_persistence';
     } else {
         $noticeMessage = 'existing_access_token';
     }
     $this->session->getFlashBag()->add('notice', $noticeMessage);
 }
Example #2
0
 /**
  * @return bool
  */
 protected function isTwitterApiAvailable()
 {
     $availableTwitterApi = false;
     /** @var \WeavingTheWeb\Bundle\ApiBundle\Entity\Token $token */
     $token = $this->tokenRepository->refreshFreezeCondition($this->accessor->userToken, $this->logger);
     if (!$token->isFrozen()) {
         try {
             if (!$this->accessor->isApiRateLimitReached('/statuses/user_timeline')) {
                 $availableTwitterApi = true;
             }
         } catch (\Exception $exception) {
             if ($exception->getCode() === 52) {
                 $availableTwitterApi = true;
             } else {
                 $this->tokenRepository->freezeToken($this->accessor->userToken);
             }
         }
     } else {
         /** @var \WeavingTheWeb\Bundle\ApiBundle\Entity\Token $unfrozenToken */
         $unfrozenToken = $this->tokenRepository->findFirstUnfrozenToken();
         if (is_null($unfrozenToken)) {
             $now = new \DateTime();
             $this->moderator->waitFor($token->getFrozenUntil()->getTimestamp() - $now->getTimestamp(), ['{{ token }}' => substr($token->getOauthToken(), 0, '8')]);
         } else {
             $this->setupAccessor(['token' => $unfrozenToken->getOauthToken(), 'secret' => $unfrozenToken->getOauthTokenSecret()]);
             $availableTwitterApi = true;
         }
     }
     return $availableTwitterApi;
 }
Example #3
0
 /**
  * @param $endpoint
  * @return \API|mixed|object
  * @throws \WeavingTheWeb\Bundle\TwitterBundle\Exception\UnavailableResourceException
  */
 public function contactEndpoint($endpoint)
 {
     $parameters = array();
     $response = null;
     $tokens = $this->getTokens();
     $httpClient = $this->httpClient;
     /** @var \WeavingTheWeb\Bundle\ApiBundle\Entity\Token $token */
     $token = $this->tokenRepository->refreshFreezeCondition($tokens['oauth'], $this->logger);
     if ($token->isFrozen()) {
         $now = new \DateTime();
         $this->moderator->waitFor($token->getFrozenUntil()->getTimestamp() - $now->getTimestamp(), ['{{ token }}' => substr($token->getOauthToken(), 0, '8')]);
     }
     try {
         if (is_null($this->authenticationHeader)) {
             /** @var \TwitterOAuth $connection */
             $connection = new $httpClient($tokens['key'], $tokens['secret'], $tokens['oauth'], $tokens['oauth_secret']);
             $content = $connection->get($endpoint, $parameters);
         } else {
             $this->setupClient();
             $httpClient->setHeader('Authorization', $this->authenticationHeader);
             $httpClient->request('GET', $endpoint);
             /** @var \Symfony\Component\HttpFoundation\Response $response */
             $response = $httpClient->getResponse();
             $encodedContent = $response->getContent();
             $content = json_decode($encodedContent);
         }
     } catch (\Exception $exception) {
         $this->logger->error($exception->getMessage(), $exception->getTrace());
         $content = (object) ['errors' => [(object) ['message' => $exception->getMessage(), 'code' => $exception->getCode()]]];
     }
     $this->logger->info('[info] ' . $endpoint);
     if ($this->hasError($content)) {
         $errorMessage = $content->errors[0]->message;
         $errorCode = $content->errors[0]->code;
         $this->logger->error('[message] ' . $errorMessage);
         $this->logger->error('[code] ' . $errorCode);
         $this->logger->error('[token] ' . $token->getOauthToken());
         $reflection = new \ReflectionClass(__NAMESPACE__ . '\\TwitterErrorAwareInterface');
         $errorCodes = $reflection->getConstants();
         if (in_array($errorCode, $errorCodes)) {
             if ($errorCode == self::ERROR_EXCEEDED_RATE_LIMIT) {
                 $this->tokenRepository->freezeToken($token->getOauthToken());
             }
             $this->throwException($errorMessage, $errorCode);
         } else {
             /** Freeze token and wait for 15 minutes before getting back to operation */
             $this->tokenRepository->freezeToken($token->getOauthToken());
             $this->moderator->waitFor(15 * 60, ['{{ token }}' => substr($token->getOauthToken(), 0, '8')]);
             return $this->contactEndpoint($endpoint);
         }
     }
     return $content;
 }
 /**
  * @return object
  */
 public function authenticate($key = null, $secret = null)
 {
     if (!is_null($key) && !is_null($secret)) {
         $this->key = $key;
         $this->secret = $secret;
     }
     $basic = $this->makeAuthorizationBasic($this->key, $this->secret);
     $token = $this->tokenRepository->findOneBy(['oauthToken' => $this->key]);
     if (is_null($token)) {
         $response = $this->postOauth2Token($basic);
         if (array_key_exists('errors', $response)) {
             throw new \Exception($response['errors'][0]['message']);
         } else {
             $token = $this->tokenRepository->persistBearerToken($this->key, $response['access_token']);
         }
     }
     return ['consumer_key' => $this->key, 'access_token' => $token->getOauthTokenSecret()];
 }