Fixed issues 368 and 354, access to files with special characters.
This commit is contained in:
parent
0b580ba2ec
commit
73641a03d5
@ -371,5 +371,13 @@ class IDF_Scm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a path, encode everything but the /
|
||||||
|
*/
|
||||||
|
public static function smartEncode($path)
|
||||||
|
{
|
||||||
|
return str_replace('%2F', '/', rawurlencode($path));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,6 +233,7 @@ class IDF_Scm_Git extends IDF_Scm
|
|||||||
$file->author = 'Unknown';
|
$file->author = 'Unknown';
|
||||||
}
|
}
|
||||||
$file->fullpath = ($folder) ? $folder.'/'.$file->file : $file->file;
|
$file->fullpath = ($folder) ? $folder.'/'.$file->file : $file->file;
|
||||||
|
$file->efullpath = self::smartEncode($file->fullpath);
|
||||||
if ($file->type == 'commit') {
|
if ($file->type == 'commit') {
|
||||||
// We have a submodule
|
// We have a submodule
|
||||||
$file = $this->getSubmodule($file, $commit);
|
$file = $this->getSubmodule($file, $commit);
|
||||||
|
@ -187,9 +187,11 @@ class IDF_Scm_Mercurial extends IDF_Scm
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$fullpath = ($folder) ? $folder.'/'.$file : $file;
|
||||||
|
$efullpath = self::smartEncode($fullpath);
|
||||||
$res[] = (object) array('perm' => $perm, 'type' => $type,
|
$res[] = (object) array('perm' => $perm, 'type' => $type,
|
||||||
'hash' => $hash, 'fullpath' => ($folder) ? $folder.'/'.$file : $file,
|
'hash' => $hash, 'fullpath' => $fullpath,
|
||||||
'file' => $file);
|
'efullpath' => $efullpath, 'file' => $file);
|
||||||
}
|
}
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
@ -169,7 +169,7 @@ class IDF_Scm_Svn extends IDF_Scm
|
|||||||
$cmd = sprintf(Pluf::f('svn_path', 'svn').' info --xml --username=%s --password=%s %s@%s',
|
$cmd = sprintf(Pluf::f('svn_path', 'svn').' info --xml --username=%s --password=%s %s@%s',
|
||||||
escapeshellarg($this->username),
|
escapeshellarg($this->username),
|
||||||
escapeshellarg($this->password),
|
escapeshellarg($this->password),
|
||||||
escapeshellarg($this->repo.'/'.self::urlencode($path)),
|
escapeshellarg($this->repo.'/'.self::smartEncode($path)),
|
||||||
escapeshellarg($rev));
|
escapeshellarg($rev));
|
||||||
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
||||||
$xmlInfo = shell_exec($cmd);
|
$xmlInfo = shell_exec($cmd);
|
||||||
@ -196,7 +196,7 @@ class IDF_Scm_Svn extends IDF_Scm
|
|||||||
$cmd = sprintf(Pluf::f('svn_path', 'svn').' ls --xml --username=%s --password=%s %s@%s',
|
$cmd = sprintf(Pluf::f('svn_path', 'svn').' ls --xml --username=%s --password=%s %s@%s',
|
||||||
escapeshellarg($this->username),
|
escapeshellarg($this->username),
|
||||||
escapeshellarg($this->password),
|
escapeshellarg($this->password),
|
||||||
escapeshellarg($this->repo.'/'.self::urlencode($folder)),
|
escapeshellarg($this->repo.'/'.self::smartEncode($folder)),
|
||||||
escapeshellarg($commit));
|
escapeshellarg($commit));
|
||||||
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
||||||
$xml = simplexml_load_string(shell_exec($cmd));
|
$xml = simplexml_load_string(shell_exec($cmd));
|
||||||
@ -207,6 +207,7 @@ class IDF_Scm_Svn extends IDF_Scm
|
|||||||
$file['type'] = $this->assoc[(string) $entry['kind']];
|
$file['type'] = $this->assoc[(string) $entry['kind']];
|
||||||
$file['file'] = (string) $entry->name;
|
$file['file'] = (string) $entry->name;
|
||||||
$file['fullpath'] = $folder.((string) $entry->name);
|
$file['fullpath'] = $folder.((string) $entry->name);
|
||||||
|
$file['efullpath'] = self::smartEncode($file['fullpath']);
|
||||||
$file['date'] = gmdate('Y-m-d H:i:s',
|
$file['date'] = gmdate('Y-m-d H:i:s',
|
||||||
strtotime((string) $entry->commit->date));
|
strtotime((string) $entry->commit->date));
|
||||||
$file['rev'] = (string) $entry->commit['revision'];
|
$file['rev'] = (string) $entry->commit['revision'];
|
||||||
@ -253,7 +254,7 @@ class IDF_Scm_Svn extends IDF_Scm
|
|||||||
$cmd = sprintf(Pluf::f('svn_path', 'svn').' info --xml --username=%s --password=%s %s@%s',
|
$cmd = sprintf(Pluf::f('svn_path', 'svn').' info --xml --username=%s --password=%s %s@%s',
|
||||||
escapeshellarg($this->username),
|
escapeshellarg($this->username),
|
||||||
escapeshellarg($this->password),
|
escapeshellarg($this->password),
|
||||||
escapeshellarg($this->repo.'/'.self::urlencode($filename)),
|
escapeshellarg($this->repo.'/'.self::smartEncode($filename)),
|
||||||
escapeshellarg($rev));
|
escapeshellarg($rev));
|
||||||
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
||||||
$xml = simplexml_load_string(shell_exec($cmd));
|
$xml = simplexml_load_string(shell_exec($cmd));
|
||||||
@ -280,7 +281,7 @@ class IDF_Scm_Svn extends IDF_Scm
|
|||||||
$cmd = sprintf(Pluf::f('svn_path', 'svn').' cat --username=%s --password=%s %s@%s',
|
$cmd = sprintf(Pluf::f('svn_path', 'svn').' cat --username=%s --password=%s %s@%s',
|
||||||
escapeshellarg($this->username),
|
escapeshellarg($this->username),
|
||||||
escapeshellarg($this->password),
|
escapeshellarg($this->password),
|
||||||
escapeshellarg($this->repo.'/'.self::urlencode($def->fullpath)),
|
escapeshellarg($this->repo.'/'.self::smartEncode($def->fullpath)),
|
||||||
escapeshellarg($def->rev));
|
escapeshellarg($def->rev));
|
||||||
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
||||||
return ($cmd_only) ? $cmd : shell_exec($cmd);
|
return ($cmd_only) ? $cmd : shell_exec($cmd);
|
||||||
@ -498,7 +499,7 @@ class IDF_Scm_Svn extends IDF_Scm
|
|||||||
$cmd = sprintf(Pluf::f('svn_path', 'svn').' proplist --xml --username=%s --password=%s %s@%s',
|
$cmd = sprintf(Pluf::f('svn_path', 'svn').' proplist --xml --username=%s --password=%s %s@%s',
|
||||||
escapeshellarg($this->username),
|
escapeshellarg($this->username),
|
||||||
escapeshellarg($this->password),
|
escapeshellarg($this->password),
|
||||||
escapeshellarg($this->repo.'/'.self::urlencode($path)),
|
escapeshellarg($this->repo.'/'.self::smartEncode($path)),
|
||||||
escapeshellarg($rev));
|
escapeshellarg($rev));
|
||||||
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
||||||
$xmlProps = shell_exec($cmd);
|
$xmlProps = shell_exec($cmd);
|
||||||
@ -534,7 +535,7 @@ class IDF_Scm_Svn extends IDF_Scm
|
|||||||
escapeshellarg($property),
|
escapeshellarg($property),
|
||||||
escapeshellarg($this->username),
|
escapeshellarg($this->username),
|
||||||
escapeshellarg($this->password),
|
escapeshellarg($this->password),
|
||||||
escapeshellarg($this->repo.'/'.self::urlencode($path)),
|
escapeshellarg($this->repo.'/'.self::smartEncode($path)),
|
||||||
escapeshellarg($rev));
|
escapeshellarg($rev));
|
||||||
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
$cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
|
||||||
$xmlProp = shell_exec($cmd);
|
$xmlProp = shell_exec($cmd);
|
||||||
@ -565,11 +566,5 @@ class IDF_Scm_Svn extends IDF_Scm
|
|||||||
$xml = simplexml_load_string($xmlInfo);
|
$xml = simplexml_load_string($xmlInfo);
|
||||||
return (string) $xml->entry->commit['revision'];
|
return (string) $xml->entry->commit['revision'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static function urlencode($string)
|
|
||||||
{
|
|
||||||
return str_replace('%2F', '/', urlencode($string));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,7 +267,7 @@ class IDF_Views_Source
|
|||||||
$stack = '';
|
$stack = '';
|
||||||
$i = 0;
|
$i = 0;
|
||||||
foreach ($elts as $elt) {
|
foreach ($elts as $elt) {
|
||||||
$stack .= ($i==0) ? $elt : '/'.$elt;
|
$stack .= ($i==0) ? rawurlencode($elt) : '/'.rawurlencode($elt);
|
||||||
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Source::tree',
|
$url = Pluf_HTTP_URL_urlForView('IDF_Views_Source::tree',
|
||||||
array($project->shortname,
|
array($project->shortname,
|
||||||
$commit, $stack));
|
$commit, $stack));
|
||||||
@ -378,6 +378,7 @@ class IDF_Views_Source
|
|||||||
'commit' => $commit,
|
'commit' => $commit,
|
||||||
'cobject' => $cobject,
|
'cobject' => $cobject,
|
||||||
'fullpath' => $request_file,
|
'fullpath' => $request_file,
|
||||||
|
'efullpath' => IDF_Scm::smartEncode($request_file),
|
||||||
'base' => $request_file_info->file,
|
'base' => $request_file_info->file,
|
||||||
'prev' => $previous,
|
'prev' => $previous,
|
||||||
'tree_in' => $in_branches,
|
'tree_in' => $in_branches,
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{/if}
|
{/if}
|
||||||
{foreach $files as $file}
|
{foreach $files as $file}
|
||||||
{aurl 'url', 'IDF_Views_Source::tree', array($project.shortname, $commit, $file.fullpath)}
|
{aurl 'url', 'IDF_Views_Source::tree', array($project.shortname, $commit, $file.efullpath)}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="fileicon"><img src="{media '/idf/img/'~$file.type~'.png'}" alt="{$file.type}" /></td>
|
<td class="fileicon"><img src="{media '/idf/img/'~$file.type~'.png'}" alt="{$file.type}" /></td>
|
||||||
{if $file.type != 'extern'}
|
{if $file.type != 'extern'}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
{$file}
|
{$file}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{aurl 'url', 'IDF_Views_Source::getFile', array($project.shortname, $commit, $fullpath)}
|
{aurl 'url', 'IDF_Views_Source::getFile', array($project.shortname, $commit, $efullpath)}
|
||||||
<p class="right soft"><a href="{$url}"><img style="vertical-align: text-bottom;" src="{media '/idf/img/package-grey.png'}" alt="{trans 'Archive'}" align="bottom" /></a> <a href="{$url}">{trans 'Download this file'}</a></p>
|
<p class="right soft"><a href="{$url}"><img style="vertical-align: text-bottom;" src="{media '/idf/img/package-grey.png'}" alt="{trans 'Archive'}" align="bottom" /></a> <a href="{$url}">{trans 'Download this file'}</a></p>
|
||||||
{/block}
|
{/block}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{/if}
|
{/if}
|
||||||
{foreach $files as $file}
|
{foreach $files as $file}
|
||||||
{aurl 'url', 'IDF_Views_Source::tree', array($project.shortname, $commit, $file.fullpath)}
|
{aurl 'url', 'IDF_Views_Source::tree', array($project.shortname, $commit, $file.efullpath)}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="fileicon"><img src="{media '/idf/img/'~$file.type~'.png'}" alt="{$file.type}" /></td>
|
<td class="fileicon"><img src="{media '/idf/img/'~$file.type~'.png'}" alt="{$file.type}" /></td>
|
||||||
<td{if $file.type != 'blob'} colspan="4"{/if}><a href="{$url}">{$file.file}</a></td>
|
<td{if $file.type != 'blob'} colspan="4"{/if}><a href="{$url}">{$file.file}</a></td>
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
{$file}
|
{$file}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{aurl 'url', 'IDF_Views_Source::getFile', array($project.shortname, $commit, $fullpath)}
|
{aurl 'url', 'IDF_Views_Source::getFile', array($project.shortname, $commit, $efullpath)}
|
||||||
<p class="right soft"><a href="{$url}"><img style="vertical-align: text-bottom;" src="{media '/idf/img/package-grey.png'}" alt="{trans 'Archive'}" align="bottom" /></a> <a href="{$url}">{trans 'Download this file'}</a></p>
|
<p class="right soft"><a href="{$url}"><img style="vertical-align: text-bottom;" src="{media '/idf/img/package-grey.png'}" alt="{trans 'Archive'}" align="bottom" /></a> <a href="{$url}">{trans 'Download this file'}</a></p>
|
||||||
|
|
||||||
{/block}
|
{/block}
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{/if}
|
{/if}
|
||||||
{foreach $files as $file}
|
{foreach $files as $file}
|
||||||
{aurl 'url', 'IDF_Views_Source::tree', array($project.shortname, $commit, $file.fullpath)}
|
{aurl 'url', 'IDF_Views_Source::tree', array($project.shortname, $commit, $file.efullpath)}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="fileicon"><img src="{media '/idf/img/'~$file.type~'.png'}" alt="{$file.type}" /></td>
|
<td class="fileicon"><img src="{media '/idf/img/'~$file.type~'.png'}" alt="{$file.type}" /></td>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user