file_encrypt-8.x-1.x-dev/src/StreamFilter/EncryptStreamFilter.php

src/StreamFilter/EncryptStreamFilter.php
<?php

namespace Drupal\file_encrypt\StreamFilter;

use Drupal\encrypt\Exception\EncryptException;

/**
 * Provides a stream filter for encryption.
 */
class EncryptStreamFilter extends StreamFilterBase {

  /**
   * The filter name, for use with stream filter functions.
   */
  const NAME = 'encrypt';

  /**
   * {@inheritdoc}
   */
  public function filter($in, $out, &$consumed, $closing) {
    while ($bucket = stream_bucket_make_writeable($in)) {
      try {
        $bucket->data = $this->filterData($bucket->data);
      }
      catch (EncryptException $e) {
        return PSFS_ERR_FATAL;
      }
      $consumed += $bucket->datalen;
      stream_bucket_append($out, $bucket);
    }
    return PSFS_PASS_ON;
  }

  /**
   * Filters data.
   *
   * This encrypts the data and prepends a padded, fixed-length header
   * containing the size of the payload in bytes so that the decrypt filter
   * knows how much data to buffer before attempting decryption (i.e., so the
   * decrypt filter knows how large the succeeding decryptable datum is).
   *
   * @param string $data
   *   The data to filter.
   *
   * @return string
   *   The filtered data.
   *
   * @see DecryptStreamFilter::filter()
   */
  public function filterData($data) {
    $payload = $this->encryption->encrypt($data, $this->encryptionProfile);
    $this->validatePayload($payload);
    $header = $this->buildHeader($payload);
    return $header . $payload;
  }

  /**
   * Validates the payload.
   *
   * @param string $payload
   *   The payload.
   *
   * @throws \Drupal\encrypt\Exception\EncryptException
   *   If the payload is invalid.
   */
  protected function validatePayload($payload) {
    $length = strlen($payload);
    $max_length = self::maxPayloadLength();
    if ($length > $max_length) {
      throw new EncryptException(sprintf('Payload is too large--%s bytes of maximum %s.', number_format($length), number_format($max_length)));
    }
  }

  /**
   * Builds the data header given the payload.
   *
   * @param string $payload
   *   The data payload.
   *
   * @return string
   *   The data header.
   */
  protected function buildHeader($payload) {
    $length = strlen($payload);
    return str_pad($length, self::HEADER_LENGTH, self::HEADER_PADDING_CHARACTER);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc