fileshare modul usern das löschen verbieten
Eingetragen von Anonymous (0)
am 20.03.2007 - 16:53 Uhr in
am 20.03.2007 - 16:53 Uhr in
Hi,
Ich versuche gerade den Usern das Löschen von upgeloadeten Conentnt zu verbieten. Leider gibt es dazu in der Access Controll keine passende chekbox. Und ich kann auch leider nicht gut genug php coden um dies in der fileshare.module datei umzuschreiben.
deshalb würde ich euch bitten mir zu helfen
MfG
don durito
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich glaube...
am 20.03.2007 - 18:34 Uhr
Das hier die passende passage liegt:
* Handles the delete file request by submitDelete in fileshare.js
*/
function _fsform_validate($form_id, $form_values) {
global $user;
$node = node_load($form_values['nid']);
// ensure that you are only deleting files from the file directory and build path from node
$deletefile = $node->_basepath.$node->_filepath.trim(str_replace('../', '', $form_values['deletefile']),".");
// checks user access and confirms that the delete string is within the root, but is not the root itself
if ((substr($form_values['deletefile'],0,1) == '/' && strlen($form_values['deletefile']) > 2) && (user_access('modify files') || (user_access('manage own fileshares') && ($user->uid == $node->uid)))) {
if (file_check_directory($deletefile)) {
if (_recursive_rmdir($deletefile)) {
drupal_set_message('The folder and it\'s contents: <strong>"'.basename($deletefile).'"</strong> has been deleted.');
watchdog('fileshare', check_plain($deletefile." and it's contents were deleted from ".$node->title), WATCHDOG_NOTICE, l(t('view'), 'node/'.$node->nid));
} else {
drupal_set_message('The folder: <strong>"'.basename($deletefile).'"</strong> could not be deleted.','error');
return FALSE;
}
} else {
if (file_delete($deletefile)) {
drupal_set_message('The file: <strong>"'.basename($deletefile).'"</strong> has been deleted.');
watchdog('fileshare', check_plain($deletefile.' was deleted from '.$node->title), WATCHDOG_NOTICE, l(t('view'), 'node/'.$node->nid));
} else {
drupal_set_message('The file: <strong>"'.$deletefile.'"</strong> could not be deleted.','error');
return FALSE;
}
}
} else {
drupal_set_message('You are not authorized to remove: <strong>"'.$deletefile.'"</strong>.','error');
}
}
Doch wo und wie muss ich jetzt eine if anweisung schreiben?
Nicht ganz. Dieser Code wird
am 20.03.2007 - 23:02 Uhr
Nicht ganz. Dieser Code wird erst beim Senden des Formulars aufgerufen.
Den entsprechenden Code mit (wieder ungetesteten) Anpassungen findest du hier:
<?php
/**
* RECURSIVE READ DIRECTORY
* for AJAX file browsing
* Called by _fsform()
*/
function _fileshare_handler($node) {
global $user;
// ensure that users are not able to ascend the file tree with relitive paths
isset($_GET['dir']) ? $dir = trim(str_replace('../', '', $_GET['dir']),".") : $dir = '';
isset($_GET['pre']) ? $pre = check_plain($_GET['pre']) : $pre = '';
$modify = _tf($node->_modify) && (user_access('modify files') || ( user_access('manage own fileshares') && ($user->uid == $node->uid)));
$download = (user_access('download files') || ( user_access('manage own fileshares') && ($user->uid == $node->uid)));
$tag = 'a';
$output = '';
// Read files in a directory
$handle = opendir($node->_basepath.$node->_filepath.$dir);
while (false !== ($fileget = readdir($handle))) { // read directory
$file[] = $fileget; // create file array
}
sort($file); // sort directory array
for ($x=0; $x <= (count($file) -1); $x++) { // loop through rows of array
if (substr($file[$x], 0, 1) != "." && $file[$x] != '_previews') {
if (is_dir($node->_basepath.$node->_filepath.$dir.'/'.$file[$x])) {
$output .= '<div class="fs_row">'."\n";
$output .= '<div class="fs_data">'."\n";
# alter code: if ($modify) {
if ($modify && (user_access('delete')) {
# Hier wird der Link zum Loeschen von Ordnern ausgegeben
$output .= '<a href="/javascript:submitDelete(\''
.$dir.'/'.$file[$x].'\');" alt="delete file" class="fs_delete">'
." </a>\n";
}
$output .= "</div>\n";
$output .= '<a href="/javascript:;" onclick="fileshare_folder(this,\''.$pre.$tag.'\');" ';
$output .= 'alt="'.$node->_basepath.$node->_filepath.$dir.'/'.$file[$x].'" ';
$output .= 'name="'.url('fileshare/handler/'.$node->nid
,'dir='.$dir.'/'.$file[$x]
.'&pre='.$pre.$tag).'" ';
$output .= 'class="fs_closed">'."\n";
$output .= $file[$x];
$output .= "</a>\n";
$output .= "</div>\n";
$output .= '<div class="fs_nest" id="'.$pre.$tag.'"></div>'."\n";
++$tag;
} else {
$output .= '<div class="fs_row">'."\n";
$output .= '<div class="fs_data">'."\n";
$output .= '<b>'.date("j/n/y",filemtime($node->_basepath.$node->_filepath.$dir.'/'.$file[$x])).'</b>';
$output .= '<i>'._resize_bytes(filesize($node->_basepath.$node->_filepath.$dir.'/'.$file[$x])).'</i>';
// allow deletion if modify was checked and access permissions are met
# alter code: if ($modify) {
if ($modify && (user_access('delete')) {
# Hier wird der Link zum Loeschen von Dateien ausgegeben
$output .= '<a href="/javascript:submitDelete(\''
.$dir.'/'.$file[$x].'\');" alt="delete file" class="fs_delete">'
." </a>\n";
}
$output .= "</div>\n";
if ($download) {
if ($node->_method) {
$output .= '<a href="/'.url('fileshare/files/'.$node->nid.$dir.'/'.$file[$x]).'" class="fs_file">'."\n"; // _method is private
} else {
$output .= '<a href="/'.base_path().$node->_basepath.$node->_filepath.$dir.'/'.$file[$x].'" class="fs_file">'."\n"; // _method is public
}
} else {
$output .= '<div class="fs_file">';
}
if (_tf($node->_thumbs) == 1) { // check to for display of image previews (1 == true)
$preview = $node->_basepath.$node->_filepath.'/_previews/'.substr($file[$x],0,-3);
$exts = array('jpg','gif');
foreach ($exts as $ext) {
if (file_exists($preview.$ext)) { // check to see if preview file is there
$output .= '<img src="/'.base_path().$preview.$ext.'" border="0" align="absmiddle">'."\n";
}
}
}
$output .= $file[$x];
if ($download) { $output .= "</a>\n"; } else { $output .= "</div>\n"; }
$output .= '</div>'."\n";
}
}
}
closedir($handle);
if ($output == '') { // Safari needs some output returned to the jahHandler
echo " ";
} else {
echo $output;
}
}
?>
Zusätzlich musst den hook_perm nochmals erweitern:
<?php
/**
* Implementation of hook_perm().
*
* Since we are limiting the ability to create new nodes to certain users,
* we need to define what those permissions are here. We also define a permission
* to allow users to edit the nodes they created.
*/
function fileshare_perm() {
return array('create fileshares'
,'set file paths'
,'modify files'
,'download files'
,'manage own fileshares'
,'create directories'
,'delete'
);
}
?>
Gruss Elias
Leider
am 21.03.2007 - 00:17 Uhr
Leider funktioniert es nicht obwohl ich beide $modify teile bearbeite habe, bekommen ich immer die Fehlermeldung das die { falsch ist. doch das sehe sogar ich mit meinen laienhaften programmier kenntnissen das das nicht stimmen kann.
Ich habe zuvor schon meine genannte Code Pasage bearbeitet und das downloaden ist nun verboten. Doch wie du schon geschrieben ist der Button zum downloaden noch immer da. Den würde ich aber gerne verschwienden lasse.
MfG
don durito
p.s.: vielen dank fuer deine wunderbare hilfe
Ich dachte, du willst den
am 21.03.2007 - 07:24 Uhr
Ich dachte, du willst den Button zum Löschen (und nicht zum downloaden) verschwinden lassen?
Aber du hast Recht: der erste Code hat einen Fehler. In der Eile habe ich eine Klammer zuviel geschrieben, die nicht geschlossen wird. Daher der Error.
Hier der korrekte Code: (Habs diesmal sogar rasch erfolgreich getestet ;-)
<?php
/**
* RECURSIVE READ DIRECTORY
* for AJAX file browsing
* Called by _fsform()
*/
function _fileshare_handler($node) {
global $user;
// ensure that users are not able to ascend the file tree with relitive paths
isset($_GET['dir']) ? $dir = trim(str_replace('../', '', $_GET['dir']),".") : $dir = '';
isset($_GET['pre']) ? $pre = check_plain($_GET['pre']) : $pre = '';
$modify = _tf($node->_modify) && (user_access('modify files') || ( user_access('manage own fileshares') && ($user->uid == $node->uid)));
$download = (user_access('download files') || ( user_access('manage own fileshares') && ($user->uid == $node->uid)));
$tag = 'a';
$output = '';
// Read files in a directory
$handle = opendir($node->_basepath.$node->_filepath.$dir);
while (false !== ($fileget = readdir($handle))) { // read directory
$file[] = $fileget; // create file array
}
sort($file); // sort directory array
for ($x=0; $x <= (count($file) -1); $x++) { // loop through rows of array
if (substr($file[$x], 0, 1) != "." && $file[$x] != '_previews') {
if (is_dir($node->_basepath.$node->_filepath.$dir.'/'.$file[$x])) {
$output .= '<div class="fs_row">'."\n";
$output .= '<div class="fs_data">'."\n";
# alter code: if ($modify) {
if ($modify && user_access('delete')) {
# Hier wird der Link zum Loeschen von Ordnern ausgegeben
$output .= '<a href="/javascript:submitDelete(\''
.$dir.'/'.$file[$x].'\');" alt="delete file" class="fs_delete">'
." </a>\n";
}
$output .= "</div>\n";
$output .= '<a href="/javascript:;" onclick="fileshare_folder(this,\''.$pre.$tag.'\');" ';
$output .= 'alt="'.$node->_basepath.$node->_filepath.$dir.'/'.$file[$x].'" ';
$output .= 'name="'.url('fileshare/handler/'.$node->nid
,'dir='.$dir.'/'.$file[$x]
.'&pre='.$pre.$tag).'" ';
$output .= 'class="fs_closed">'."\n";
$output .= $file[$x];
$output .= "</a>\n";
$output .= "</div>\n";
$output .= '<div class="fs_nest" id="'.$pre.$tag.'"></div>'."\n";
++$tag;
} else {
$output .= '<div class="fs_row">'."\n";
$output .= '<div class="fs_data">'."\n";
$output .= '<b>'.date("j/n/y",filemtime($node->_basepath.$node->_filepath.$dir.'/'.$file[$x])).'</b>';
$output .= '<i>'._resize_bytes(filesize($node->_basepath.$node->_filepath.$dir.'/'.$file[$x])).'</i>';
// allow deletion if modify was checked and access permissions are met
# alter code: if ($modify) {
if ($modify && user_access('delete')) {
# Hier wird der Link zum Loeschen von Dateien ausgegeben
$output .= '<a href="/javascript:submitDelete(\''
.$dir.'/'.$file[$x].'\');" alt="delete file" class="fs_delete">'
." </a>\n";
}
$output .= "</div>\n";
if ($download) {
if ($node->_method) {
$output .= '<a href="/'.url('fileshare/files/'.$node->nid.$dir.'/'.$file[$x]).'" class="fs_file">'."\n"; // _method is private
} else {
$output .= '<a href="/'.base_path().$node->_basepath.$node->_filepath.$dir.'/'.$file[$x].'" class="fs_file">'."\n"; // _method is public
}
} else {
$output .= '<div class="fs_file">';
}
if (_tf($node->_thumbs) == 1) { // check to for display of image previews (1 == true)
$preview = $node->_basepath.$node->_filepath.'/_previews/'.substr($file[$x],0,-3);
$exts = array('jpg','gif');
foreach ($exts as $ext) {
if (file_exists($preview.$ext)) { // check to see if preview file is there
$output .= '<img src="/'.base_path().$preview.$ext.'" border="0" align="absmiddle">'."\n";
}
}
}
$output .= $file[$x];
if ($download) { $output .= "</a>\n"; } else { $output .= "</div>\n"; }
$output .= '</div>'."\n";
}
}
}
closedir($handle);
if ($output == '') { // Safari needs some output returned to the jahHandler
echo " ";
} else {
echo $output;
}
}
?>
Danke
am 21.03.2007 - 14:06 Uhr
Du hast meine Frage schon richtig verstanden. Ich wollte es den anonymen Usern verbieten Content zu löschen.
Außerdem hat deine Anleitung wieder einmal super funktioniert, und sie war so grandios erklärt wie die erste.
Danke, Danke, Danke du Schatz ;-)
baba
don durito
Ich hatte das gleiche
am 17.09.2007 - 14:14 Uhr
Ich hatte das gleiche Problem und habe nun auch diesen Code verwendet. Die Buttons zum Löschen sind zwar jetzt weg, allerdings kann man auch die Ordner nicht mehr öffnen. Es erscheint immer: The requested URL /javascript:; was not found on this server. Ich habe den Code im fileshare.module ersetzt, hätte ich was anderes machen sollen?