2012-10-08 12 views
6

Podczas przeglądania Moodle's kod źródłowy natknąłem to:base64_encode i funkcji php serializacji params

repozytorium/niedawne/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; 
} 

repozytorium/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; 
} 

Moje pytanie brzmi: jaki jest cel kodowania base64 i serializowania to jest, kiedy jest natychmiast przywracana do funkcji? Czy istnieje uzasadniony powód, aby to zrobić, czy jest to po prostu ukończone?

+0

Bez ważnego powodu, aby to zrobić, chyba że jest to naprawdę duży wyjątek, a najczęstszym użyciem 'get_file_size' jest daleko, aby uzyskać rozmiar pliku' serialize'd, 'base64_encode'd obiektu. – Ryan

+0

['function get_file_size'] (http://xref.schoolsict.net/moodle/2.2/nav.html?repository/lib.php.source.html#l1367) w modzie źródłowym – air4x

+0

Czy możesz pokazać kod podążający za wywołanie '$ this-> get_file_size()'? – NullUserException

Odpowiedz

2

Szybkie kliknięcie wokół ich PHPXref ujawnia, że ​​funkcja ta jest nazywana również repository_ajax.php

przekazywanie danych odcinkach wokół w polu ciąg kwerendy/forma po prostu nie będzie działać (potencjalnie), ale z kodowaniem base64 to nie jest problem.

Funkcja została zaprojektowana do obsługi żądań dostarczanych przez ajax, dekodowania base64, deserialise, a następnie zwracania rozmiaru pliku. (Jest to prawdopodobnie powiązane również z elementem source węzła listy)

W skrócie, połączenie polega na sprawdzeniu, czy zakodowany ciąg jest prawidłowy, ponieważ jest później używany w żądaniu ajax.

Powiązane problemy