Changeset 405

Show
Ignore:
Timestamp:
10/15/07 13:58:38 (1 year ago)
Author:
bermiferrer
Message:

Fixing file upload params ($_FILES) normalization. Closes #75

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/AkRequest.php

    r384 r405  
    600600 
    601601                if(is_array($details) && !empty($details['name']) &&  !empty($details['tmp_name']) &&  !empty($details['size'])){ 
    602  
    603                     if( is_array($details['tmp_name']) && 
    604                     ( 
    605                     count($details['tmp_name']) == 1 && 
    606                     !is_array(array_shift(array_values($details['tmp_name'])))) 
    607                     ){ 
    608  
    609                         foreach (array_keys($details['tmp_name']) as $k){ 
    610                             if(UPLOAD_ERR_NO_FILE != $details['error'][$k]){ 
    611                                 $result[$name][$k] = array( 
    612                                 'name'=>$details['name'][$k], 
    613                                 'tmp_name'=>$details['tmp_name'][$k], 
    614                                 'size'=>$details['size'][$k], 
    615                                 'type'=>$details['type'][$k], 
    616                                 'error'=>$details['error'][$k], 
    617                                 ); 
    618                             } 
    619                         } 
    620                     }elseif(is_array($details['tmp_name'])){ 
     602                    if(is_array($details['tmp_name'])){ 
    621603                        foreach ($details['tmp_name'] as $item=>$item_details){ 
    622                             foreach (array_keys($item_details) as $k){ 
    623                                 if(UPLOAD_ERR_NO_FILE != $details['error'][$item][$k]){ 
    624                                     $result[$name][$item][$k] = array( 
    625                                     'name'=>$details['name'][$item][$k], 
    626                                     'tmp_name'=>$details['tmp_name'][$item][$k], 
    627                                     'size'=>$details['size'][$item][$k], 
    628                                     'type'=>$details['type'][$item][$k], 
    629                                     'error'=>$details['error'][$item][$k], 
     604                            if(is_array($item_details)){ 
     605                                foreach (array_keys($item_details) as $k){ 
     606                                    if(UPLOAD_ERR_NO_FILE != $details['error'][$item][$k]){ 
     607                                        $result[$name][$item][$k] = array( 
     608                                        'name'=>$details['name'][$item][$k], 
     609                                        'tmp_name'=>$details['tmp_name'][$item][$k], 
     610                                        'size'=>$details['size'][$item][$k], 
     611                                        'type'=>$details['type'][$item][$k], 
     612                                        'error'=>$details['error'][$item][$k], 
     613                                        ); 
     614                                    } 
     615                                } 
     616                            }else{ 
     617                                if(UPLOAD_ERR_NO_FILE != $details['error'][$item]){ 
     618                                    $result[$name][$item] = array( 
     619                                    'name'=>$details['name'][$item], 
     620                                    'tmp_name'=>$details['tmp_name'][$item], 
     621                                    'size'=>$details['size'][$item], 
     622                                    'type'=>$details['type'][$item], 
     623                                    'error'=>$details['error'][$item], 
    630624                                    ); 
    631625                                } 
     
    649643        return $result; 
    650644    } 
    651  
    652  
     645     
    653646    // {{{ _addParams() 
    654647 
  • trunk/test/unit/lib/AkRequest.php

    r217 r405  
    77class Test_of_AkRequest_Class extends  UnitTestCase 
    88{ 
    9  
    109    var $test_request; 
    1110    var $test_request2; 
     
    5958        'general_param'=>'cmd' 
    6059        ); 
    61          
    62          
    63          
     60 
     61 
     62 
    6463        $this->_testRequestInstance =& new AkRequest(); 
    6564        $this->_testRequestInstance->init(); 
    66          
     65 
    6766    } 
    6867 
     
    7069    { 
    7170        unset($this->_testRequestInstance); 
    72          
     71 
    7372        //We reset the original values 
    7473        $_SESSION['request'] = $this->_original_values[0]; 
     
    8382    { 
    8483        $gpc_param = get_magic_quotes_gpc() ? "Isn't it ironic" : 'Isn\\\'t it ironic'; 
    85          
     84 
    8685        $expected = array( 
    8786        'cmd_param'=>'cmd', 
     
    9493        'gpc_param'=>$gpc_param, 
    9594        ); 
    96          
     95 
    9796        $this->_testRequestInstance->_mergeRequest(); 
    98          
     97 
    9998        $this->assertEqual($this->_testRequestInstance->_request,$expected,'Comparing request precedence'); 
    10099    } 
     
    104103    { 
    105104        $expected_values = array('user','list','100'); 
    106          
     105 
    107106        $this->assertEqual($this->_testRequestInstance->_parseAkRequestString('/user/list/100'), $expected_values); 
    108107        $this->assertEqual($this->_testRequestInstance->_parseAkRequestString('/user/list/100/'), $expected_values); 
    109108        $this->assertEqual($this->_testRequestInstance->_parseAkRequestString('user/list/100/'), $expected_values); 
    110109        $this->assertEqual($this->_testRequestInstance->_parseAkRequestString('user/list/100'), $expected_values); 
    111          
     110 
    112111        $expected_keys = array('controller','action','id'); 
    113112        $this->assertEqual($this->_testRequestInstance->_parseAkRequestString('/:controller/:action/:id','/:'), $expected_keys); 
     
    116115        $this->assertEqual($this->_testRequestInstance->_parseAkRequestString('controller/:action/:id','/:'), $expected_keys); 
    117116    } 
    118      
    119      
    120      
     117 
     118 
     119 
    121120    function test_for_getRemoteIp() 
    122121    { 
    123122        $Request = new AkRequest(); 
    124          
     123 
    125124        $Request->env = array('HTTP_CLIENT_IP'=>'64.68.15.10'); 
    126125        $this->assertEqual($Request->getRemoteIp(),'64.68.15.10'); 
    127          
     126 
    128127        $Request->env = array('HTTP_X_FORWARDED_FOR'=>'64.68.15.11'); 
    129128        $this->assertEqual($Request->getRemoteIp(),'64.68.15.11'); 
    130          
     129 
    131130        $Request->env = array('HTTP_X_FORWARDED_FOR'=>'364.68.15.11'); 
    132131        $this->assertEqual($Request->getRemoteIp(),''); 
    133          
     132 
    134133        $Request->env = array('HTTP_X_FORWARDED_FOR'=>'3e4f:123f:c12a:5566:888e:9975:aaff:2344'); 
    135134        $this->assertEqual($Request->getRemoteIp(),'3e4f:123f:c12a:5566:888e:9975:aaff:2344'); 
    136          
     135 
    137136        $Request->env = array('HTTP_X_FORWARDED_FOR'=>'3e4f:123f:c12a:5566:888e:9975:aafg:2344'); 
    138137        $this->assertEqual($Request->getRemoteIp(),''); 
     
    140139        $Request->env = array('HTTP_X_FORWARDED_FOR'=>'364.68.15.11,64.68.15.11'); 
    141140        $this->assertEqual($Request->getRemoteIp(),'64.68.15.11'); 
    142          
     141 
    143142        $Request->env = array('REMOTE_ADDR'=>'64.68.15.11'); 
    144143        $this->assertEqual($Request->getRemoteIp(),'64.68.15.11'); 
    145144    } 
    146      
     145 
    147146    function test_for_getDomain() 
    148147    { 
    149148        $Request = new AkRequest(); 
    150          
     149 
    151150        $env_backup = $Request->env; 
    152          
     151 
    153152        $Request->env['SERVER_NAME'] = 'localhost'; 
    154153        $Request->env['SERVER_ADDR'] = '127.0.0.1'; 
    155          
     154 
    156155        $this->assertEqual($Request->getDomain(), 'localhost'); 
    157          
     156 
    158157        $Request->_host = 'www.dev.akelos.com'; 
    159158 
    160159        $this->assertEqual($Request->getDomain(),'akelos.com'); 
    161160        $this->assertEqual($Request->getDomain(2),'dev.akelos.com'); 
    162          
     161 
    163162        $Request->env = $env_backup; 
    164163    } 
    165      
     164 
    166165    function test_for_getSubDomains() 
    167166    { 
    168167        $Request = new AkRequest(); 
    169          
     168 
    170169        $env_backup = $Request->env; 
    171          
     170 
    172171        $Request->_host = 'www.dev.akelos.com'; 
    173          
     172 
    174173        $this->assertEqual($Request->getSubdomains(), array('www','dev')); 
    175174        $this->assertEqual($Request->getSubdomains(2),array('www')); 
     175 
     176        $Request->env = $env_backup; 
     177    } 
     178 
     179     
     180    function test_should_normalize_single_level_file_uploads() 
     181    { 
     182        $Request = new AkRequest(); 
     183        $_FILES = array (  
     184            'image0' => array ( 'name' => 'mod_rewrite_cheat_sheet.pdf', 'type' => 'application/pdf', 'tmp_name' => '/tmp/php0JvZ0p', 'error' => 0, 'size' => 332133 ),  
     185            'image1' => array ( 'name' => 'microformats_cheat_sheet.pdf', 'type' => 'application/pdf', 'tmp_name' => '/tmp/phpKry1xs', 'error' => 0, 'size' => 427735 ),  
     186            'image2' => array ( 'name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0 ) ); 
     187        $normalized = array (  
     188            'image0' => array ( 'name' => 'mod_rewrite_cheat_sheet.pdf', 'type' => 'application/pdf', 'tmp_name' => '/tmp/php0JvZ0p', 'error' => 0, 'size' => 332133 ),  
     189            'image1' => array ( 'name' => 'microformats_cheat_sheet.pdf', 'type' => 'application/pdf', 'tmp_name' => '/tmp/phpKry1xs', 'error' => 0, 'size' => 427735 )); 
    176190         
    177         $Request->env = $env_backup; 
     191        $this->assertEqual($Request->_getNormalizedFilesArray(), $normalized); 
     192    } 
     193 
     194    function test_should_normalize_multi_level_but_flat_file_uploads() 
     195    { 
     196        $Request = new AkRequest(); 
     197        $_FILES = array ( 'image' => array ( 'name' => array ( 'file' => array ( 'a' => 'mod_rewrite_cheat_sheet.pdf', 'b' => 'microformats_cheat_sheet.pdf', 'c' => '', ), ), 'type' => array ( 'file' => array ( 'a' => 'application/pdf', 'b' => 'application/pdf', 'c' => '', ), ), 'tmp_name' => array ( 'file' => array ( 'a' => '/tmp/phporGMwx', 'b' => '/tmp/phpGycyd6', 'c' => '', ), ), 'error' => array ( 'file' => array ( 'a' => 0, 'b' => 0, 'c' => 4, ), ), 'size' => array ( 'file' => array ( 'a' => 332133, 'b' => 427735, 'c' => 0, ), ), ), ); 
     198        $normalized = array ( 'image' => array ( 'file' => array ( 'a' => array ( 'name' => 'mod_rewrite_cheat_sheet.pdf', 'tmp_name' => '/tmp/phporGMwx', 'size' => 332133, 'type' => 'application/pdf', 'error' => 0, ), 'b' => array ( 'name' => 'microformats_cheat_sheet.pdf', 'tmp_name' => '/tmp/phpGycyd6', 'size' => 427735, 'type' => 'application/pdf', 'error' => 0, ), ), ), ); 
     199         
     200        $this->assertEqual($Request->_getNormalizedFilesArray(), $normalized); 
     201    } 
     202 
     203    function test_should_normalize_multi_level_as_array_file_uploads() 
     204    { 
     205        $Request = new AkRequest(); 
     206        $_FILES = array ( 'image' => array ( 'name' => array ( 'file' => array ( 0 => 'mod_rewrite_cheat_sheet.pdf', 1 => 'microformats_cheat_sheet.pdf', 2 => '', ), ), 'type' => array ( 'file' => array ( 0 => 'application/pdf', 1 => 'application/pdf', 2 => '', ), ), 'tmp_name' => array ( 'file' => array ( 0 => '/tmp/phpoOcNXs', 1 => '/tmp/php4xVEbv', 2 => '', ), ), 'error' => array ( 'file' => array ( 0 => 0, 1 => 0, 2 => 4, ), ), 'size' => array ( 'file' => array ( 0 => 332133, 1 => 427735, 2 => 0, ), ), ), ); 
     207        $normalized = array ( 'image' => array ( 'file' => array ( 0 => array ( 'name' => 'mod_rewrite_cheat_sheet.pdf', 'tmp_name' => '/tmp/phpoOcNXs', 'size' => 332133, 'type' => 'application/pdf', 'error' => 0, ), 1 => array ( 'name' => 'microformats_cheat_sheet.pdf', 'tmp_name' => '/tmp/php4xVEbv', 'size' => 427735, 'type' => 'application/pdf', 'error' => 0, ), ), ), ); 
     208         
     209        $this->assertEqual($Request->_getNormalizedFilesArray(), $normalized); 
     210    } 
     211 
     212    function test_should_normalize_simple_level_as_array_file_uploads() 
     213    { 
     214        $Request = new AkRequest(); 
     215        $_FILES = array ( 'image' => array ( 'name' => array ( 0 => 'mod_rewrite_cheat_sheet.pdf', 1 => 'microformats_cheat_sheet.pdf', 2 => '', ), 'type' => array ( 0 => 'application/pdf', 1 => 'application/pdf', 2 => '', ), 'tmp_name' => array ( 0 => '/tmp/phpXpfUKA', 1 => '/tmp/phpkB6MnX', 2 => '', ), 'error' => array ( 0 => 0, 1 => 0, 2 => 4, ), 'size' => array ( 0 => 332133, 1 => 427735, 2 => 0, ), ), ); 
     216        $normalized = array ('image' => array (0 => array ('name' => 'mod_rewrite_cheat_sheet.pdf','tmp_name' => '/tmp/phpXpfUKA','size' => 332133,'type' => 'application/pdf','error' => 0),1 => array ('name' => 'microformats_cheat_sheet.pdf','tmp_name' => '/tmp/phpkB6MnX','size' => 427735,'type' => 'application/pdf','error' => 0))); 
     217        $this->assertEqual($Request->_getNormalizedFilesArray(), $normalized); 
    178218    } 
    179219 
  • trunk/test/unit/lib/utils/_Ak_object_inspection.php

    r217 r405  
    124124        $this->assertEqual('1592-10-09 00:00:00', Ak::getDate(Ak::getTimestamp('1592-10-09'))); 
    125125        $this->assertEqual('2192-10-09 00:00:00', Ak::getDate(Ak::getTimestamp('2192-10-09'))); 
    126         $this->assertEqual('2192-10-09 01:02:03', Ak::getDate(Ak::getTimestamp('2192-10-9 1:2:3'))); 
     126        $this->assertEqual('2192-10-09 01:02:03', Ak::getDate(Ak::getTimestamp('2192-10-9 01:02:03'))); 
    127127    } 
    128128