You are here

function PclZipUtilPathInclusion in Quiz 6.5

Same name and namespace in other branches
  1. 6.6 includes/moodle/lib/pclzip/pclzip.lib.php \PclZipUtilPathInclusion()
2 calls to PclZipUtilPathInclusion()
PclZip::privCalculateStoredFilename in includes/moodle/lib/pclzip/pclzip.lib.php
PclZip::privExtractFile in includes/moodle/lib/pclzip/pclzip.lib.php

File

includes/moodle/lib/pclzip/pclzip.lib.php, line 5503

Code

function PclZipUtilPathInclusion($p_dir, $p_path) {

  //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathInclusion", "dir='$p_dir', path='$p_path'");
  $v_result = 1;

  // ----- Look for path beginning by ./
  if ($p_dir == '.' || strlen($p_dir) >= 2 && substr($p_dir, 0, 2) == './') {
    $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE) . '/' . substr($p_dir, 1);

    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_dir '".$p_dir."'");
  }
  if ($p_path == '.' || strlen($p_path) >= 2 && substr($p_path, 0, 2) == './') {
    $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE) . '/' . substr($p_path, 1);

    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Replacing ./ by full path in p_path '".$p_path."'");
  }

  // ----- Explode dir and path by directory separator
  $v_list_dir = explode("/", $p_dir);
  $v_list_dir_size = sizeof($v_list_dir);
  $v_list_path = explode("/", $p_path);
  $v_list_path_size = sizeof($v_list_path);

  // ----- Study directories paths
  $i = 0;
  $j = 0;
  while ($i < $v_list_dir_size && $j < $v_list_path_size && $v_result) {

    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Working on dir($i)='".$v_list_dir[$i]."' and path($j)='".$v_list_path[$j]."'");

    // ----- Look for empty dir (path reduction)
    if ($v_list_dir[$i] == '') {
      $i++;
      continue;
    }
    if ($v_list_path[$j] == '') {
      $j++;
      continue;
    }

    // ----- Compare the items
    if ($v_list_dir[$i] != $v_list_path[$j] && $v_list_dir[$i] != '' && $v_list_path[$j] != '') {

      //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Items ($i,$j) are different");
      $v_result = 0;
    }

    // ----- Next items
    $i++;
    $j++;
  }

  // ----- Look if everything seems to be the same
  if ($v_result) {

    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Look for tie break");

    // ----- Skip all the empty items
    while ($j < $v_list_path_size && $v_list_path[$j] == '') {
      $j++;
    }
    while ($i < $v_list_dir_size && $v_list_dir[$i] == '') {
      $i++;
    }

    //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Looking on dir($i)='".($i < $v_list_dir_size?$v_list_dir[$i]:'')."' and path($j)='".($j < $v_list_path_size?$v_list_path[$j]:'')."'");
    if ($i >= $v_list_dir_size && $j >= $v_list_path_size) {

      // ----- There are exactly the same
      $v_result = 2;
    }
    else {
      if ($i < $v_list_dir_size) {

        // ----- The path is shorter than the dir
        $v_result = 0;
      }
    }
  }

  // ----- Return

  //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result);
  return $v_result;
}