Download-Modul mit Prüfung auf Berechtigung

achiboy
Beiträge: 138
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Download-Modul mit Prüfung auf Berechtigung

Beitrag von achiboy »

Hallo,

ich habe ein Modul geschrieben, das beim Download einer Datei die Berechtigung prüft und danach die Datei zum öffnen oder speichern anbietet. Es werden nur Dateienn zur Verfügung gestellt, die in einem Unterverzeichnis von cms/upload/download/... liegen.

Ich habe nur noch ein Problem. Bei einigen IE-Konfigurationen haben Besucher gemeldet, dass beim direkten Öffnen von Downloads ein Fehler auftritt, der in etwa lautet: "Es ist ein Fehler aufgetreten. Die Datei konnte nicht gefunden werden".

Bei meiner IE-Installation geht das und mit Firefox sowieso. Woran könnte das liegen?

Hier der code

Code: Alles auswählen

<?php 
if (isset($HTTP_POST_VARS['id']))
{
	$id = intval($HTTP_POST_VARS['id']);
}
elseif (isset($HTTP_GET_VARS['id']))
{
	$id = intval($HTTP_GET_VARS['id']);
}
else 
{
	$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php");
	ob_end_clean(); 
	header("Location: $link");  
	exit; 
}

$sql = "SELECT dirname, filename
          FROM ".$cfg["tab"]["upl"]." 
          WHERE idupl = ".$id;

$db->query($sql); 
$db->next_record();
if (!stristr ($db->f("dirname"), "download"))
{
  $link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php");
  ob_end_clean(); 
  header("Location: $link");  
  exit; 
} else {
  $verzeichnis = $db->f("dirname");
  $dateiname = $db->f("filename");
}
$suchpfad = '0=' . str_replace("/","%2F",substr($verzeichnis, 0, -1)).'&';

$sql = "SELECT a.public, a.idcat 
          FROM ".$cfg["tab"]["cat_lang"]." AS a,
          ".$cfg["tab"]["container_conf"]." AS b,
          con_template_conf AS c 
          WHERE  c.idtplcfg = b.idtplcfg AND
                      c.idtplcfg = a.idtplcfg  AND
                      b.container = '".$suchpfad."'";


$db->query($sql); 
if (!$db->next_record())
{
   $sql = "SELECT d.public, d.idcat 
          FROM ".$cfg["tab"]["cat_lang"]." AS d,
          ".$cfg["tab"]["cat_art"]." AS e,
          ".$cfg["tab"]["art_lang"]." AS a,
          ".$cfg["tab"]["container_conf"]." AS b,
          con_template_conf AS c 
          WHERE c.idtplcfg = b.idtplcfg AND
                       c.idtplcfg = a.idtplcfg AND
                       e.idart = a.idart AND
                       e.idcat = d.idcat AND
                       b.container = '".$suchpfad."'";

   $db->query($sql); 
   $db->next_record();
}

if ($db->f("public") == 1 || $perm->have_perm_area_action_item("str","front_allow", $db->f("idcat")) ||
$perm->have_perm()) 
{
    if ( $file_extern == "1" )
    {
	 Header("Location: $dateiname");
    }
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"".$dateiname."\"");
    readfile($cfgClient[$client]["htmlpath"]["frontend"] . $cfgClient[$client]["upload"] . $verzeichnis . $dateiname);

} else {
  $link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?idart=78&idcat=62");
  ob_end_clean(); 
  header("Location: $link"); 
  exit; 
} 
?>
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Re: Download-Modul mit Prüfung auf Berechtigung

Beitrag von emergence »

achiboy hat geschrieben:Ich habe nur noch ein Problem. Bei einigen IE-Konfigurationen haben Besucher gemeldet, dass beim direkten Öffnen von Downloads ein Fehler auftritt, der in etwa lautet: "Es ist ein Fehler aufgetreten. Die Datei konnte nicht gefunden werden".
was heisst -> beim direkten öffnen von downloads ?
es müsste auch ne url dort stehen was nicht geöffnet werden kann...
ein blick ins apache access.log sollte vielleicht aufschluss darüber geben welche datei nicht gefunden werden kann... (falls es wirklich so ein fehler sein sollte)
seitens einstellungen des browsers wüsste ich momentan nicht was das sein könnte...
*** make your own tools (wishlist :: thx)
achiboy
Beiträge: 138
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Re: Download-Modul mit Prüfung auf Berechtigung

Beitrag von achiboy »

emergence hat geschrieben:was heisst -> beim direkten öffnen von downloads ?
...
ich klicke auf den Download link -> dieser verweist auf die Seite mit dem oben aufgeführten modul -> es erscheint ein dialogfenster, das mich fragt, ob ich das dokument öffnen will oder ob ich es speichern will. -> da klicken die leute auf öffnen.

Der Download wird vollzogen -> das entsprechende Programm wird gestartet -> es erscheint eine Fehlermeldung.
CyberDan
Beiträge: 204
Registriert: Mo 15. Dez 2003, 13:01
Wohnort: Saarland
Kontaktdaten:

Beitrag von CyberDan »

läuft das Modul bei jemandem? Wie soll das funktionieren?
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Re: Download-Modul mit Prüfung auf Berechtigung

Beitrag von timo »

achiboy hat geschrieben:Der Download wird vollzogen -> das entsprechende Programm wird gestartet -> es erscheint eine Fehlermeldung.
Ähm und welche?

Fehlermeldungen beim direkten Öffnen deutet auf eine Fehlkonfiguration auf Client-Seite hin...
achiboy
Beiträge: 138
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Beitrag von achiboy »

et voilà. das sage ich auch. nur scheint diese Fehlkonfiguration sehr verbreitet zu sein. Deshalb suche ich den Fehler immer noch auf meiner Seite.

Kann es sein, dass die Cache-Einstellungen so sind, dass die Datei im Temp-Verzeichnis des Besuchers schon wieder gelöscht ist, wenn dessen Programm (z.B. PDF-Reader) darauf zugreifen will?
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

sag mal betrifft das alle dateien ? (oder eventuell nur pdf's ?)
welche server umgebung ?
*** make your own tools (wishlist :: thx)
achiboy
Beiträge: 138
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Beitrag von achiboy »

Es passiert auch bei Word und Excel.

Serverumgebung:
Serverbetriebssystem Apache/1.3.31 (Unix) mod_auth_passthrough/1.8 FrontPage/5.0.2.2510a mod_log_bytes/1.2 mod_bwlimited/1.4 mod_ssl/2.8.19 OpenSSL/0.9.7d

Installierte PHP-Version 4.3.8
safe_mode Deaktiviert
magic_quotes_gpc Aktiviert
magic_quotes_runtime Deaktiviert
gpc_order GPC
Deaktivierte Funktionen nothing disabled
Gettext extension loaded
sql.safe_mode Deaktiviert
CyberDan
Beiträge: 204
Registriert: Mo 15. Dez 2003, 13:01
Wohnort: Saarland
Kontaktdaten:

Beitrag von CyberDan »

ich würde das Modul ja auch gerne mal testen, nur kriege ich auf jeder Seite, auf der ich es einbaue die Fehlermeldung:

Warning: Cannot modify header information - headers already sent by (output started at /..../includes/include.con_editcontent.php(571) : eval()'d code:9)
achiboy
Beiträge: 138
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Beitrag von achiboy »

Downloadliste
Input
?>
<table cellspacing="0" cellpadding="0" cellpadding="4">

<tr>
<td style="font-size:11px">Upload-Zweig:</td>
<td>
<select name="CMS_VAR[0]">
<option value="0"></option>
<?php

$sql = "SELECT DISTINCT dirname from ".$cfg["tab"]["upl"]." WHERE dirname LIKE '%download%' ";

$db->query($sql);

while ( $db->next_record() ) {

$upload_dir=substr_replace($db->f("dirname"),'',(strlen($db->f("dirname"))-1));

if ( "CMS_VALUE[0]" == $upload_dir) {
echo '<option selected="selected" value="'.$upload_dir.'">'.$db->f("dirname").'</option>';

} else {
echo '<option value="'.$upload_dir.'">'.$db->f("dirname").'</option>';

}
}

?>
</select>
</td>
</tr>
<!-- <tr>
<td style="font-size:11px">File-Typ:</td>
<td>
<select name="CMS_VAR[1]">
<option value="0"></option>
<?php

$sql = "SELECT DISTINCT filetype from ".$cfg["tab"]["upl"]; //." WHERE dirname='CMS_VALUE[0]/'";

$db->query($sql);

while ( $db->next_record() ) {

$upload_file=$db->f("filetype");

if ( "CMS_VALUE[1]" == $upload_file) {
echo '<option selected="selected" value="'.$upload_file.'">'.$db->f("filetype").'</option>';

} else {
echo '<option value="'.$upload_file.'">'.$db->f("filetype").'</option>';

}
}

?>
</select>
</td>
</tr> -->


</table>

<?php
Output
<?php
$sql = "SELECT idcat, public
FROM ".$cfg["tab"]["cat_lang"]."
WHERE idcat = ".$idcat;

$db->query($sql);
$db->next_record();

if ($db->f("public") == 1 || $perm->have_perm_area_action_item("str","front_allow", $db->f("idcat")) || $perm->have_perm())
{



//Datenbankanfrage wird definiert (was, wo und wie sortiert)
// $sql = "SELECT * FROM ".$cfg["tab"]["upl"]." WHERE filetype = 'CMS_VALUE[1]' AND dirname ='CMS_VALUE[0]/' order by created desc";
// $sql = "SELECT * FROM ".$cfg["tab"]["upl"]." WHERE dirname ='CMS_VALUE[0]/' order by description";
$sql = "SELECT * FROM ".$cfg["tab"]["upl"]." WHERE dirname ='CMS_VALUE[0]/' order by description, filename";


//Verbindung zur Datenbank wird hergestellt
$db->query($sql);

//Zeigt die Datensätze in der Tabelle an
// echo 'Insgesamt stehen ' . $db ->num_rows() . ' Dokumente zur Verfügung:<br><br>';

echo '<div class="list"><table width="100%" border="0" cellspacing="2" cellpadding="5">'."\n";
echo ' <tr><td class="headings">Datei</td><td class="headings">Typ</td><td class="headings">Grösse</td></tr>'."\n";

//Link zur Datei im Upload-Verzeichnis
$href = $cfgClient[$client]["htmlpath"]["frontend"] . $cfgClient[$client]["upload"];
$i = 1;
$pdfvorhanden = false;

while ($db->next_record())
{
$filetyp = strtolower($db->f("filetype"));
if ($filetyp == "pdf")
{
$filetyp = $filetyp." *";
$pdfvorhanden = true;
}

if ($db->f("description") != "")
{
$bezeichnung = $db->f("description");
} else {
$bezeichnung = $db->f("filename");
}

// echo "<tr class=\"textsmall line_color0\"><td><a title=\"Download: ".$bezeichnung."\" href=\"".$href.$db->f("dirname").$db->f("filename")."\">".$bezeichnung."</a></td><td>".$filetyp."</td><td style=\"text-align:right\">".round($db->f("size")/1024,1)." KB</td></tr>";

echo "<tr class=\"textsmall line_color0\"><td><a title=\"Download: ".$bezeichnung."\" href=\"front_content.php?idcatart=89&lang=1&client=1&id=".$db->f("idupl")."\">".$bezeichnung."</a></td><td>".$filetyp."</td><td style=\"text-align:right\">".round($db->f("size")/1024,1)." KB</td></tr>";
$i++;
}
echo '</table></div>';
if ($pdfvorhanden)
{
echo '<div class="textsmall"><br />* Um diese Dokumente zu öffnen, brauchen Sie den Acrobat Reader.<br />Sie können diesen <a class="klein" onfocus="this.blur()" href="http://www.adobe.com/products/acrobat/readstep.html" target="_blank">kostenlos herunterladen</a>.<br /></div>';
}




} else {
echo 'nicht berechtigt' ;
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?idart=78&idcat=62");
echo '<meta http-equiv="refresh" content="0;'.$link.'">';
}

?>
Download-Load
Output
<?php
if (isset($HTTP_POST_VARS['id']))
{
$id = intval($HTTP_POST_VARS['id']);
}
elseif (isset($HTTP_GET_VARS['id']))
{
$id = intval($HTTP_GET_VARS['id']);
}
else
{
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php");
ob_end_clean();
header("Location: $link");
exit;
}

$sql = "SELECT dirname, filename
FROM ".$cfg["tab"]["upl"]."
WHERE idupl = ".$id;

$db->query($sql);
$db->next_record();
if (!stristr ($db->f("dirname"), "download"))
{
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php");
ob_end_clean();
header("Location: $link");
exit;
} else {
$verzeichnis = $db->f("dirname");
$dateiname = $db->f("filename");
}
$suchpfad = '0=' . str_replace("/","%2F",substr($verzeichnis, 0, -1)).'&';

$sql = "SELECT a.public, a.idcat
FROM ".$cfg["tab"]["cat_lang"]." AS a,
".$cfg["tab"]["container_conf"]." AS b,
con_template_conf AS c
WHERE c.idtplcfg = b.idtplcfg AND
c.idtplcfg = a.idtplcfg AND
b.container = '".$suchpfad."'";


$db->query($sql);
if (!$db->next_record())
{
$sql = "SELECT d.public, d.idcat
FROM ".$cfg["tab"]["cat_lang"]." AS d,
".$cfg["tab"]["cat_art"]." AS e,
".$cfg["tab"]["art_lang"]." AS a,
".$cfg["tab"]["container_conf"]." AS b,
con_template_conf AS c
WHERE c.idtplcfg = b.idtplcfg AND
c.idtplcfg = a.idtplcfg AND
e.idart = a.idart AND
e.idcat = d.idcat AND
b.container = '".$suchpfad."'";

$db->query($sql);
$db->next_record();
}

if ($db->f("public") == 1 || $perm->have_perm_area_action_item("str","front_allow", $db->f("idcat")) ||
$perm->have_perm())
{
if ( $file_extern == "1" )
{
Header("Location: $dateiname");
}
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$dateiname."\"");
readfile($cfgClient[$client]["htmlpath"]["frontend"] . $cfgClient[$client]["upload"] . $verzeichnis . $dateiname);

} else {
$link = $sess->url($cfgClient[$client]["path"]["htmlpath"]."front_content.php?idart=78&idcat=62");
ob_end_clean();
header("Location: $link");
exit;
}
?>
Hier ist der gesamte Source. Ich habe keine Probleme damit :?
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

du prüft zwar auf die berechtigung des benutzers, um den link darzustellen. aber können nicht in tat und wahrheit alle den download vornehmen, wenn sie den pfad zur datei kennen?
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
achiboy
Beiträge: 138
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Beitrag von achiboy »

das stimmt theoretisch absolut. Deshalb habe ich dieses Load-Verfahren ausgedacht. Denn so wird der Benutzer den Pfad nicht sehen.

So viel ich weiss, gibt es ja keine Möglichkeit, den Zugriff innerhalb der Dateiverwaltung zu steuern oder?
achiboy
Beiträge: 138
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Beitrag von achiboy »

ich habe beim googeln gesehen, dass das Problem verbereitet ist.
Microsoft hat den Fehler auch entdeckt.
http://support.microsoft.com/?scid=kb;d ... sid=global

Das Problem tritt aber nicht nur bei HTTPS sondern auch bei HTTP auf.

Wo wird bei Contenido, das Session-Handling gemacht und die Header() gesetzt?
achiboy
Beiträge: 138
Registriert: Do 26. Aug 2004, 05:05
Kontaktdaten:

Beitrag von achiboy »

so, ich habe es geschafft. ich musste mit ob_end_clean den buffer leeren und dann die richtigen header setzen.
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Kannst Du das nochmal posten (bzw. Deinen ersten Eintrag überarbeiten)?

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Gesperrt