public function confirm()
 {
     parent::init();
     try {
         $token = Session::get('SummitConfirmSpeakerPage.Token');
         if (isset($_REQUEST['t'])) {
             $token = base64_decode($_REQUEST['t']);
             Session::set('SummitConfirmSpeakerPage.Token', $token);
             return $this->redirect($this->Link('confirm'));
         }
         if (empty($token)) {
             throw new InvalidArgumentException('missing token!');
         }
         $request = PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter('ConfirmationHash', PresentationSpeakerSummitAssistanceConfirmationRequest::HashConfirmationToken($token))->first();
         if (is_null($request)) {
             throw new NotFoundEntityException('PresentationSpeakerSummitAssistanceConfirmationRequest', '');
         }
         if (!$request->alreadyConfirmed()) {
             $request->confirm($token);
             $request->write();
         }
         $data['Speaker'] = $request->Speaker();
         $data['Summit'] = $request->Summit();
         Session::set('Current.PresentationSpeakerSummitAssistanceConfirmationRequest', $request);
         return $this->customise($data)->renderWith(array('SummitConfirmSpeakerPage', 'SummitPage'), $this->parent);
     } catch (Exception $ex) {
         SS_Log::log($ex->getMessage(), SS_Log::WARN);
         return $this->httpError(404, 'Sorry, this speaker confirmation token does not seem to be correct.');
     }
 }
 /**
  * Resets the confirmation request if exists and its not confirmed yet
  * otherwise exception
  * @param int $summit_id
  * @return string
  * @throws Exception
  * @throws ValidationException
  * @throws null
  */
 public function resetConfirmationLink($summit_id)
 {
     $confirmation_page = SummitConfirmSpeakerPage::get()->filter('SummitID', intval($summit_id))->first();
     if (!$confirmation_page) {
         throw new NotFoundEntityException('Confirmation Speaker Page not set on current summit!');
     }
     $url = $confirmation_page->getAbsoluteLiveLink(false);
     $request = PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter(['SummitID' => intval($summit_id), 'SpeakerID' => $this->ID])->first();
     if (is_null($request)) {
         throw new EntityValidationException('there is not valid request!');
     }
     if ($request->alreadyConfirmed()) {
         throw new EntityValidationException('request already confirmed!');
     }
     $token = null;
     $already_exists = false;
     do {
         $token = $request->generateConfirmationToken();
         $already_exists = intval(PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter(['SummitID' => intval($summit_id), 'SpeakerID:ExactMatch:not' => $this->ID, 'ConfirmationHash' => PresentationSpeakerSummitAssistanceConfirmationRequest::HashConfirmationToken($token)])->count()) > 1;
     } while ($already_exists);
     $request->write();
     return $url . 'confirm?t=' . base64_encode($token);
 }