Rename filtre (Zend_Form_Element_File) yerleştirilen mantığı ile dosyanın yükleme fonksiyonunu test etmek nasıl?

2 Cevap php

İlk benim kod:

class ProfileController extends Zend_Controller_Action {

private function getUploadAvatarForm()
{
    $form = new Zend_Form;
    $form->setAttrib('enctype', 'multipart/form-data');
    $form->setAction($this->view->baseUrl('/profile/upload-avatar'))
         ->setName('uploadAvatarForm')
         ->setMethod('POST');

    $element = new Zend_Form_Element_File('avatar');
    $element->setLabel('Upload an image:')
            ->addFilter('Rename',
                array('target' => '/path/toimages/directory/' . $this->userId . '.png',
                      'overwrite' => true)
            );

    $element->addValidator('Count', false, 1);
    $element->addValidator('Size', false, 102400);
    $element->addValidator('Extension', false, 'png');
    $form->addElement($element, 'avatar')
         ->addElement('submit', 'submit_upload', array('label' => 'upload'));
    return $form;
} 

public function uploadAvatarAction()
{
    $form = $this->getUploadAvatarForm();
    $this->view->form = $form;
    if (!$this->getRequest()->isPost() || !$form->isValid($_POST)) {
        return;
    }                
    if (!$form->avatar->receive()) {
        ... error...
    }
    ... ok ...
}

}

Soru: buissiness mantığının bir parçasıdır Rename filtre içine yerleştirilir. Hayalimde o buna değer, ama ben yanılıyorumdur olabilir.

Bunu test etmek çalışıyorum:

public function testUploadFile()
{
    $this->_doLogin('user', 'password');
    $this->getRequest()
         ->setMethod('POST'));
    $this->mockFileUpload();

    $this->dispatch('profile/upload-avatar');
    var_dump($this->getResponse()->getBody());
}

private function mockFileUpload()
{
    $_FILES = array(
        'avatar' => array(
            'name' => 'test.png',
            'type' => 'image/png',
            'tmp_name' => '/tmp/test.png',
            'error' => 0,
            'size' => 10127));
}

ama var:

Dosya 'avatar' yasadışı tarih, olası bir saldırı oldu

Could you please suggest me how to test this situation? (With filesystem everything will be ok - I'm going to use vfsStream for that, so the problem is only to emulate post upload)

2 Cevap

Lütfen test sınıfında, Zend_File_Transfer_Adapter_Http uzun bir sınıfını kullanın ve isValid () yöntemini geçersiz kılmak için form ayarlayın. Açıktır ki ProfileController kamuya form fonksiyon kapsamını değiştirmek gerekir. Bu PHPUnit ile kullanılacak olan. Ben henüz Zend_Test_PHPUnit_ControllerTestCase ile bütünleştirmek için nasıl emin değilim, ama bir noktada onu anlamaya ve güncelleyecektir gerekir.

$class = new ProfileController();
$form = $class->getUploadAvatarForm();
$form->getElement('avatar')->setTransferAdapter(new MockAdapter());

MockAdapter.php

class MockAdapter extends Zend_File_Transfer_Adapter_Http
{
    public function isValid($files = null)
    {
        return true;
    }
}

Ben benzer bir sorun vardı.

Bazı kod okuma ve deneme sonra benim problem (ufak bir kod aksaklık nedeniyle) benim iki formun isValid işlevini çağırarak neden olduğunu keşfetti.

Çalıştırıldı ama nasıl çift isValid benim tmp dosyası ikinci isValid işlevi önce silinecek (yüklenen dosya) neden tam olarak emin değilim, bu da (doğru bir dosya yükleme olmadığını düşünüyorum Zend_Validate_File_Upload hattı 183 yaptı çünkü ikinci kez o) zaten silindi bunun için baktım:

Eğer geçici dosya nedense Zend_Validate_File_Upload hattı 183 değiştirmek için orada olup olmadığını kontrol etmek istiyorsanız:

case 0:
    var_dump(file_exists($content['tmp_name']));
    if (!is_uploaded_file($content['tmp_name'])) {
        $this->_throw($file, self::ATTACK);
    }
    break;

Belki yeniden adlandırma filtre hareketli veya dosyayı yeniden adlandırmayı mi?