2012-10-08 10 views
6

Durante la navigazione Moodle's codice sorgente mi sono imbattuto in questo:base64_encode e serializzare funzione php PARAMS

repository/recenti/lib.php

public function get_listing($encodedpath = '', $page = '') { 
    global $OUTPUT; 
    $ret = array(); 
    $ret['dynload'] = true; 
    $ret['nosearch'] = true; 
    $ret['nologin'] = true; 
    $list = array(); 
    $files = $this->get_recent_files(0, $this->number); 

    try { 
     foreach ($files as $file) { 
      $params = base64_encode(serialize($file)); 
      // Check that file exists and accessible 
      $filesize = $this->get_file_size($params); 
      if ($file['filename'] == 'image.png') { 
       var_dump($filesize); 
      } 
      if (!empty($filesize)) { 
       $node = array(
        'title' => $file['filename'], 
        'size' => $filesize, 
        'date' => '', 
        'source'=> $params, 
        'thumbnail' => $OUTPUT->pix_url(file_extension_icon($file['filename'], 32))->out(false), 
       ); 
       $list[] = $node; 
      } 
     } 
    } catch (Exception $e) { 
     throw new repository_exception('emptyfilelist', 'repository_recent'); 
    } 
    $ret['list'] = array_filter($list, array($this, 'filter')); 
    return $ret; 
} 

repository/lib.php

public function get_file_size($source) { 
    $browser = get_file_browser(); 
    $params  = unserialize(base64_decode($source)); 
    $contextid = clean_param($params['contextid'], PARAM_INT); 
    $fileitemid = clean_param($params['itemid'], PARAM_INT); 
    $filename = clean_param($params['filename'], PARAM_FILE); 
    $filepath = clean_param($params['filepath'], PARAM_PATH); 
    $filearea = clean_param($params['filearea'], PARAM_AREA); 
    $component = clean_param($params['component'], PARAM_COMPONENT); 
    $context = get_context_instance_by_id($contextid); 
    $file_info = $browser->get_file_info($context, $component, $filearea, $fileitemid, $filepath, $filename); 
    if (!empty($file_info)) { 
     $filesize = $file_info->get_filesize(); 
    } else { 
     $filesize = null; 
    } 
    return $filesize; 
} 

La mia domanda è qual è lo scopo della codifica base64 e serializzazione th è quando è immediatamente annullato una volta all'interno della funzione? C'è un motivo valido per farlo o è appena finito?

+0

Nessun motivo valido per fare ciò, a meno che non si tratti di un'eccezione veramente grande e l'uso più comune di get_file_size' è di ottenere la dimensione del file di un oggetto 'serialize'd,' base64_encode'd. – Ryan

+0

['function get_file_size'] (http://xref.schoolsict.net/moodle/2.2/nav.html?repository/lib.php.source.html#l1367) nella sorgente moodle – air4x

+0

Puoi mostrare il codice che segue il chiama a $ this-> get_file_size() '? – NullUserException

risposta

2

uno scatto rapido giro nel loro PHPXref rivela che questa funzione è anche chiamato in repository_ajax.php

Passando dati serializzati intorno in un campo di stringa di query/form semplicemente non funzionerà (potenzialmente), ma con la codifica base64 Questo non è un problema.

Quindi la funzione è stata progettata per gestire le richieste recapitate tramite ajax, decodifica base64, deserializzazione e quindi restituire la dimensione del file. (Questo è probabilmente collegato anche all'elemento source del nodo elenco)

In sostanza, la chiamata sta verificando che la stringa codificata è valida, per quando viene utilizzata in seguito nella richiesta Ajax.

Problemi correlati