/**
  * Serve the request to this endpoint.
  *
  * @param \ArrayAccess $get
  * @param \ArrayAccess $post
  *
  * @return Response
  */
 public function serve(\ArrayAccess $get, \ArrayAccess $post)
 {
     /**
      * Fires before the download query args are validated.
      *
      * If add-ons are completely overriding how product updates
      * are delivered. They should use this action.
      *
      * @since 1.0
      *
      * @param \ArrayAccess $get
      * @param \ArrayAccess $post
      */
     do_action('itelic_pre_validate_download', $get, $post);
     if (!\ITELIC\validate_query_args($get)) {
         $this->logger->notice('Invalid download link used.', array('get' => $get, 'post' => $post));
         status_header(403);
         _e("This download link is invalid or has expired.", Plugin::SLUG);
         if (!defined('DOING_TESTS') || !DOING_TESTS) {
             die;
         } else {
             return;
         }
     }
     $activation = itelic_get_activation($get['activation']);
     $key = $get['key'];
     if (!$activation || $activation->get_key()->get_key() != $key) {
         $key_object = itelic_get_key($key);
         if ($key_object && $key_object->get_customer()) {
             $user = $key_object->get_customer()->id;
         } elseif ($activation->get_key()->get_customer()) {
             $user = $activation->get_key()->get_customer()->id;
         } else {
             $user = 0;
         }
         $this->logger->notice('Invalid download link used. Key activation mismatch.', array('get' => $get, 'post' => $post, '_user' => $user));
         status_header(403);
         _e("This download link is invalid or has expired.", Plugin::SLUG);
         if (!defined('DOING_TESTS') || !DOING_TESTS) {
             die;
         } else {
             return;
         }
     }
     $release = $activation->get_key()->get_product()->get_latest_release_for_activation($activation);
     $file = $release->get_download();
     itelic_create_update(array('activation' => $activation, 'release' => $release));
     $this->logger->info('Download for {product} delivered.', array('product' => $activation->get_key()->get_product()->post_title, '_user' => $activation->get_key()->get_customer()->id, 'get' => $get, 'post' => $post));
     /**
      * Fires before a download is served.
      *
      * Download links are only generated from the Product endpoint
      * if both the license key and activation records are valid.
      *
      * If you are generating download links differently, you should
      * probably validate the activation status and key status again.
      *
      * @since 1.0
      *
      * @param \WP_Post   $file       WordPress attachment object for the software update.
      * @param Key        $key        License key used for validation.
      * @param Activation $activation Activation the download is being delivered to.
      */
     do_action('itelic_pre_serve_download', $file, $key, $activation);
     \ITELIC\serve_download(wp_get_attachment_url($file->ID));
 }
 public function test_download_link_is_invalid_if_past_expiration()
 {
     $key = $this->getMockBuilder('\\ITELIC\\Key')->disableOriginalConstructor()->getMock();
     $key->method('get_key')->willReturn('abcd-1234');
     $activation = $this->getMockBuilder('\\ITELIC\\Activation')->disableOriginalConstructor()->getMock();
     $activation->method('get_pk')->willReturn(1);
     $activation->method('get_key')->willReturn($key);
     $args = \ITELIC\generate_download_query_args($activation, \ITELIC\make_date_time('-1 week'));
     $this->assertFalse(\ITELIC\validate_query_args($args));
 }