pl: Schreibberechtigung in Verzeichnis

via stat(DIR) erhalte ich 700 oktal in Sachen Berechtigung. Ebenfalls per stat(DIR) erhalte ich die UiD und GruppenID für das Verzeichnis. UID und GruppenID vom Benutzer stimmen überein mit UiD und GruppenID für das Verzeichnis. Also gehe ich davon aus, das ich der Owner bin und im Verzeichnis schreiben darf (alle Bits sind gesetzt).

Praktisch jedoch schlägt mein Versuch, eine Datei anzulegen fehl, was übersehe ich?

  1. Moin!

    Praktisch jedoch schlägt mein Versuch, eine Datei anzulegen fehl, was übersehe ich?

    Nun, keine Ahnung. Ich sehe nämlich gar nichts. (Code, Fehlermeldungen)

    Jörg Reinholz

    1. 
      package FileMan; # Datei Manager
      
      use base main;
      use strict;
      use warnings;
      use POSIX qw(strftime);
      use MIME::Base64 qw(encode_base64);
      use IO::File;
      
      sub data{
          my $self = shift;
          $self->{DATAS} = $self->splitdata(<DATA>);
          $self->{BODY} = $self->{DATAS}{entries};
          $self->nocache;
      }
      
      sub init{
          my $self = shift;
          $self->nocache;
      }
      
      sub entries{
          my $self = shift;
          my $chdir = shift;
          chdir $chdir;
          opendir(my $dir, $chdir);
          my @e = readdir $dir;
          my @files = grep{-f} sort @e;
          my @dirs = grep{-d && -r} sort @e;
          shift @dirs; shift @dirs;
          
          my $stat = [stat $chdir];
          $self->{BODY} = $self->{DATAS}{entries};
          $self->{STASH}{dirs}  = [];
          $self->{STASH}{files} = [];
          $self->{STASH}{cwd}   = $chdir; 
          $self->{STASH}{mode}  = sprintf("%o", (stat($chdir))[2] & 07777);
          #"$stat->[5] $) ";
          #sprintf("%o", (stat($chdir))[2] & 07777);
          
          foreach my $d(@dirs){
              push @{$self->{STASH}{dirs}},{
                  dirname => $d,
                  cwd => $chdir,
                  chdir => do{
                      my $ndir = "$chdir/$d";
                      $ndir =~ s/\//&#x25;2F/g;
                      $ndir;
                  },
              };
          }
      
          if( $chdir ne $self->eav('basedir')){
              unshift @{$self->{STASH}{dirs}},{
                  dirname => 'SUPERDIR',
                  chdir => do{
                      my @sd = split '/', $chdir;
                      pop @sd;
                      my $ndir = join '/', @sd;
                      $ndir =~ s/\//&#x25;2F/g;
                      $ndir;
                  }
              };
          }
      
      
          my $i = 0;
          foreach my $f(@files){
              my $stat = [stat "$chdir/$f"];
              push @{$self->{STASH}{files}},{
                  filename => $f,
                  mtime    => strftime("%d.%m.%Y %X", localtime $stat->[9]),
                  size     => $stat->[7],
                  type     => XR::xr($self->{DATAS}{type}, $self->checktype("$chdir/$f")),
                  class    => $i % 2 ? qq(class='preemphasis') : '',
                  url      => $self->{URL},
                  index    => $i,
                  mode     => sprintf("%o", $stat->[2] & 07777),
                  owner    => $stat->[4] == $> ? 'Ja' : 'Nein',
              };
              $i++;
          }
          $self->{STASH}{anzahldateien} = scalar @files || 0;
      }
      
      sub checktype{
          my $self = shift;
          my $file = shift;
          my $suffix = do{
              $file =~ /\.(\w+)$/;
              $1 ? $1 : '';
          };
          return { bin_chk => 'checked', fullname => $file  } unless $suffix;
          
          if($suffix eq 'txt' || $suffix eq 'ini' || $suffix eq 'pm' || $suffix eq 'js' || $suffix eq 'css' || $suffix eq 'cgi' || $suffix eq 'html' || $suffix eq 'htm'){
              return {txt_chk => 'checked', fullname => $file};
          }
          elsif($suffix eq 'jpg' || $suffix eq 'jpeg' || $suffix eq 'png' || $suffix eq 'gif'){
              return {img_chk => 'checked', fullname => $file};
          }
          elsif($suffix eq 'bin'){
              return {bin_chk => 'checked', fullname => $file};
          }
          else{
              return {bin_chk => 'checked', fullname => $file};
          }
      }
      
      sub browse{
          my $self = shift;
          $self->entries( $self->eav('basedir') );
      }
      
      sub control{
          my $self = shift;
          if( my $chdir = $self->param('chdir') ){
              $self->entries( $chdir );
          }
          elsif(my $fullname = $self->param('edit')){
              $self->eav('title', $fullname);
              $self->{BODY} = $self->{DATAS}{editform};
              $self->{NO_MENU} = 1;
              my $ftype = $self->param('ftype');
              $self->{STASH}{ftype} = $ftype;
              #$ftype =~ s/\//_/;
              $self->{STASH}{fullname} = $fullname;
              $self->{STASH}{filename} = do{
                  $fullname =~ /.*\/(.*)$/;
                  $1 ? $1 : '';
              };
              
              my $stat = [stat $fullname];
      
              $self->{STASH}{owner_read}    = 'checked' if 1 & $stat->[2] >> 8;
              $self->{STASH}{owner_write}   = 'checked' if 1 & $stat->[2] >> 7;
              $self->{STASH}{owner_execute} = 'checked' if 1 & $stat->[2] >> 6;
              $self->{STASH}{group_read}    = 'checked' if 1 & $stat->[2] >> 5;
              $self->{STASH}{group_write}   = 'checked' if 1 & $stat->[2] >> 4;
              $self->{STASH}{group_execute} = 'checked' if 1 & $stat->[2] >> 3;
              $self->{STASH}{other_read}    = 'checked' if 1 & $stat->[2] >> 2;
              $self->{STASH}{other_write}   = 'checked' if 1 & $stat->[2] >> 1;
              $self->{STASH}{other_execute} = 'checked' if 1 & $stat->[2] >> 0;
              
              $self->{STASH}{backurl} = sprintf("%s?edit=%s;ftype=%s", $self->{URL}, $fullname, $ftype);
              
              if($ftype eq 'image/jpeg'){
                  $self->{BODY} .= $self->{DATAS}{image_jpeg_form};
                  $self->{STASH}{binary} = do{
                      my $fh = IO::File->new;
                      $fh->open($fullname, O_BINARY|O_RDONLY) or die $!;
                      read($fh, my $binary, -s $fh);
                      $fh->close;
                      encode_base64($binary, '');
                  };
              }
              elsif($ftype eq 'text/plain'){
                  $self->{BODY} .= $self->{DATAS}{text_plain_form};
                  $self->{STASH}{content} = do{
                      @ARGV = $fullname;
                      local $/ = undef;
                      my $doc = <>;
                      $doc =~ s/</&lt;/g;
                      $doc;
                  };
              }
              elsif($ftype eq 'text/html'){
                  $self->{BODY} .= $self->{DATAS}{text_html_form};
                  $self->{STASH}{content} = do{
                      @ARGV = $fullname;
                      local $/ = undef;
                      <>;
                  };
              }
              else{
                  $self->{BODY} .= $self->{DATAS}{binary_form};
              }
          }
          elsif( $self->param('download') ){
              my $fullname = $self->param('fullname');
              my $ftype    = $self->param('ftype');
              my $filename = $self->param('filename');
              $self->header(
                  "Content-Type"        => $ftype,
                  "Content-Disposition" => qq(Attachment; filename="$filename"),
                  "Content-Length"      => length($self->{CONTENT}),
              );
              my $fh =IO::File->new;
              $fh->open($fullname, O_RDONLY|O_BINARY) or die $!;
              read($fh, $self->{CONTENT}, -s $fh);
              $fh->close;
          }
          elsif($self->param('delete')){
              my $filename = $self->param('fullname');
              unlink($filename);
              $self->{NO_MENU} = 1;
              $self->{BODY} = qq(<p>Bitte Fenster schließen und darunterliegende Seite neu laden!</p>);
          }
          elsif($self->param('chmod')){
              my @owner = $self->param('owner') ? $self->param('owner') : ();
              my @group = $self->param('group') ? $self->param('group') : ();
              my @other = $self->param('other') ? $self->param('other') : ();
              my $owner = 0;
              my $group = 0;
              my $other = 0;
              
              
              if(scalar @owner){ $owner += $_ for @owner }
              if(scalar @group){ $group += $_ for @group }
              if(scalar @other){ $other += $_ for @other }
              
              my $fullname = $self->param('fullname');
              my $chmod = sprintf("%s%s%s", $owner, $group, $other); 
              
              qx(chmod $chmod $fullname);
              
              $self->redirect($self->param('backurl'));
          }
          elsif($self->param('upload')){
              my $cwd = $self->param('cwd');
              chdir $cwd;
              return $self->errorP( descr => 'Keine Datei!' ) if ! $self->param('upfiles');
              
              foreach my $r ( $self->param('upfiles') ){
                  my $fh = IO::File->new;
                  $fh->open($r->{filename}, O_CREAT|O_BINARY|O_RDWR ) or return $self->errorP( descr => "Keine Schreibberechtigung in '$cwd'\n");
                  $r->{iohandle}->seek(0,0);
                  read($r->{iohandle}, my $buffer, $r->{content_length});
                  $fh->print($buffer);
                  $fh->close;
              }
              
          
              my $redir = sprintf("%s%s", $self->{URL}, $self->param('cwd') eq $self->eav('basedir') ? '' : qq(?chdir=@{[$self->param('cwd')]}) );
              $self->redirect($redir);
          }
          else{}
      }
      
      
      1;#########################################################################
      __DATA__
      
      --entries------------------------------------------------------------------
      <h2>Verzeichnisse</h2>
      
      <p><strong>CurrentWorkDir (%mode%):</strong> <code>%cwd%</code></p>
      
      <ul style="padding:0.2em">
          %loop_dirs%
              <li style="display:inline;padding:0.3em"> <a href="?chdir=%chdir%">%dirname%</a> </li>
          %endloop%
      </ul>
      
      <h2>%anzahldateien% Dateien</h2>
      
      <table class="grid" id="tabtab">
      <thead>
      <tr style="cursor:pointer"  id="tabtab_thead_tr">
          <th>Dateiname</th>
          <th>Type</th>
          <th>Edit</th>
          <th>mtime</th>
          <th>Größe</th>
          <th>Rechte</th>
          <th>Owner</th>
      </tr>
      </thead>
      
      <tbody>
          %loop_files%
          <tr %class%>
              <td> %filename% </td>
              <td> %type% </td>
              <td title="%filename%"> <button type="button" onClick="editfile(this.form)">...</button> </form></td>
              <td> %mtime% </td>
              <td> %size% </td>
              <td> %mode% </th>
              <td> %owner% </td>
          </tr>
          %endloop%
      </tbody>
      </table>
      
      <form enctype="multipart/form-data" method="POST">
          <fieldset><legend><strong>Dateien hochladen:</strong></legend>
              <input type="hidden" name="cwd" value="%cwd%">
              <input type="file" name="upfiles" multiple>
              <button name="upload" value="1" onClick="throbber(true)">Upload Now!</button>
          </fieldset>
      </form>
      
      <script type="text/javascript">
      function editfile(form){
          window.open('%url%?'+$(form).serialize(), 'EditFile', 'width=750,height=750,left=50,top=80,scrollbars=yes');
      }
      
      
      $(document).ready(function(){ 
          $("#tabtab").tablesorter(); 
          $("#tabtab_thead_tr").css('cursor',' pointer');
      }); 
      </script>
      
      --type---------------------------------------------------------------------
      <form>
      <input type="hidden" name="edit" value="%fullname%">
      Text:<input type="radio" name="ftype" value="text/plain" %txt_chk% >
      Html:<input type="radio" name="ftype" value="text/html" %html_chk% >
      Img:<input type="radio"  name="ftype" value="image/jpeg"  %img_chk% >
      Bin:<input type="radio"  name="ftype" value="application/octet-stream"  %bin_chk% >
      
      --text_plain_form----------------------------------------------------------
      
      <pre>%content%</pre>
      
      --text_html_form-----------------------------------------------------------
      
      
      <div>%content%</div>
      
      --image_jpeg_form----------------------------------------------------------
      
      <p><img src="data:image/jpeg;base64,%binary%" alt="IMG"></p>
      
      --binary_form--------------------------------------------------------------
      
      --editform-----------------------------------------------------------------
      
      <form>
          <fieldset style="border-style:solid"><legend><strong>Aktionen:</strong></legend>
              <input type="hidden" name="backurl" value="%backurl%">
              <input type="hidden" name="fullname" value='%fullname%'>
              <input type="hidden" name="filename" value='%filename%'>
              <input type="hidden" name="ftype" value='%ftype%'>
              <button name="download" value="1">Download</button>
              <button name="delete" value="1" onClick="return confirm('Datei \'%filename%\' löschen?')">Löschen</button>
              <button name="chmod" value="1">Chmod</button>
          </fieldset>
          <table class="grid" style="width:100%">
              <tr>
                  <th>Owner</th>
                  <th>Group</th>
                  <th>Other</th>
              </tr>
              <tr>
                  <td><input name="owner" value="4" type="checkbox" %owner_read%> Lesen</td>
                  <td><input name="group" value="4" type="checkbox" %group_read%> Lesen</td>
                  <td><input name="other" value="4" type="checkbox" %other_read%> Lesen</td>
              </tr>
              <tr>
                  <td><input name="owner" value="2" type="checkbox" %owner_write%> Schreiben</td>
                  <td><input name="group" value="2" type="checkbox" %group_write%> Schreiben</td>
                  <td><input name="other" value="2" type="checkbox" %other_write%> Schreiben</td>
              </tr>
              <tr>
                  <td><input name="owner" value="1" type="checkbox" %owner_execute%> Ausführen</td>
                  <td><input name="group" value="1" type="checkbox" %group_execute%> Ausführen</td>
                  <td><input name="other" value="1" type="checkbox" %other_execute%> Ausführen</td>
              </tr>
          </table>
      </form>
      
      <script>
          window.onunload = function(){
              window.opener.location.reload();
          };
      </script>
      
      1. Moin!

        Ich habe für Dich den relevanten Teil herausgesucht. Füttere den mit Daten und melde Dich mit der eventuellen Fehlermeldung.

                    my $fh = IO::File->new;
                    $fh->open($r->{filename}, O_CREAT|O_BINARY|O_RDWR ) or return $self->errorP( descr => "Keine Schreibberechtigung in '$cwd'\n");
                    $r->{iohandle}->seek(0,0);
                    read($r->{iohandle}, my $buffer, $r->{content_length});
                    $fh->print($buffer);
                    $fh->close;
        

        Jörg Reinholz

        1. $^E und $! melden: Permission denied

          1. Moin!

            $^E und $! melden: Permission denied

            Du hast aber schon beachtet, dass der Browser (abgesehen von mod_suhosin. hier eher: suexec und ähnlichen Bemühungen) als www-data:www-data schreiben will und das es auf Schreibrechte am Verzeichnis ankommt?

            1. Mach Dir ein Mikro-Skript und versuche auf klassische Weise eine neue Datei zu speichern. Achte auf die Fehler.
            2. Lass Dir die Umgebung ausgeben. Die sollte auch den Benutzer enthalten.

            Jörg Reinholz

            1. Moin!

              $^E und $! melden: Permission denied

              Du hast aber schon beachtet, dass der Browser (abgesehen von mod_suhosin. hier eher: suexec und ähnlichen Bemühungen) als www-data:www-data schreiben will und das es auf Schreibrechte am Verzeichnis ankommt?

              ls sieht so aus:

                drwxr-xr-x   8 netsh100633 hosting      4096 Dec 11 20:33 files     # schreiben ok
                drwxr-xr-x  39 netsh100633 hosting      4096 Dec 11 15:30 html      # schreiben ok
                drwxr-xr-x   3 netsh100633 hosting       112 Dec 12 15:07 logfiles  # schreiben nicht möglich
                drwx------   2 netsh100633 hosting         6 Nov 22  2013 phptemp   # schreiben nicht möglich
              

              Ich verstehs nicht, beachte Zeile 2 und 3 die sind gleicher als gleich. Wahrscheinlich ein systematischer Denkfehler in meinem Kopf.

              1. Tach!

                ls sieht so aus:

                  drwxr-xr-x   8 netsh100633 hosting      4096 Dec 11 20:33 files     # schreiben ok
                  drwxr-xr-x  39 netsh100633 hosting      4096 Dec 11 15:30 html      # schreiben ok
                  drwxr-xr-x   3 netsh100633 hosting       112 Dec 12 15:07 logfiles  # schreiben nicht möglich
                  drwx------   2 netsh100633 hosting         6 Nov 22  2013 phptemp   # schreiben nicht möglich
                

                Ich verstehs nicht, beachte Zeile 2 und 3 die sind gleicher als gleich. Wahrscheinlich ein systematischer Denkfehler in meinem Kopf.

                Es gibt noch mehr Berechtigungen als die bekannten mit chmod beeinflussbaren. lsattr kann sie offenbaren.

                dedlfix.

                1. Moin!

                  Es gibt noch mehr Berechtigungen als die bekannten mit chmod beeinflussbaren. lsattr kann sie offenbaren.

                  Mit setfacl gesetzte Rechte fallen wohl aus, denn dann stände hinter "drwxr-xr-x" noch ein "+". Trotzdem mal nachsehen: getfacl ist Dein Freund ...

                  Jörg Reinholz

                  1. Aloha ;)

                    Mit setfacl gesetzte Rechte fallen wohl aus, denn dann stände hinter "drwxr-xr-x" noch ein "+". Trotzdem mal nachsehen: getfacl ist Dein Freund ...

                    Schön zusammengeschrieben, danke für die Verlinkung!

                    (zur Info: ich habe das "t" von getfacl noch eingefügt)

                    Grüße,

                    RIDER

                    --
                    Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                  2. Moin!

                    Es gibt noch mehr Berechtigungen als die bekannten mit chmod beeinflussbaren. lsattr kann sie offenbaren.

                    Mit setfacl gesetzte Rechte fallen wohl aus, denn dann stände hinter "drwxr-xr-x" noch ein "+". Trotzdem mal nachsehen: getfacl ist Dein Freund ...

                    Sehr schön, danke! Ich denke, die seitens ISP gesetzten Rechte sind ok (es lebe suexec). Unterhalb der vom ISP angelegten Verzeichnisse verhalten sich alle meine Anwendungen korrekt und so wie erwartet eben auch hinsichtlich der Berechtigungen.

                    Insgesamt musst Du beim Dateimanagment via Browser schon sehr sorgsam programmieren, damit keine Sicherheitslücken entstehen (siehe dein Zoff mit Joomla). Bezüglich meines FileMan.pm ist neben ausgenommenen Verzeichnissen ein weiteres Attribut zu konfigurieren: chdir=1

                    Mit chdir=0 wird dem Anwender der Zugriff exakt nur in basedir=/home... erlaubt. Nicht jedoch ein Verzeichniswechsel und auch nicht das Anlegen von Subdirs (macht ja keinen Sinn wenn chdir nicht möglich ist). Hier könnte ich mal eine Demo stellen, die Möglichkeit multipler Uploads ist schon beeindruckend (den Parser für multipart/form-data hab ich selbst entwickelt und das hat sich echt gelohnt: gegenüber CGI.pm wesentlich performanter und keine temporären Dateien, im Übrigen auch ein Sicherheitsproblem).pl

                    1. Moin!

                      (siehe dein Zoff mit Joomla).

                      Das sieht nur so aus.

                      In der Realität mag ich Joomla. Ich lebe nämlich auch von den Sicherheitslücken, welche Joomla nebst den Plugins (welche auch gerne mit "Designs" installiert werden) den "Hackern" liefert. Insofern sind meine negativen Äußerungen über Joomla nur Werbung für mein Angebot, gehackte Joomla-Installationen zu reparieren und zu härten.

                      Jörg Reinholz

                      1. Och ich verstehe das schon ;)

                    2. Moin!

                      Geheimtipp: Mit einem eigenen Apache lässt sich das Verzeichnislisting gewaltig aufbohren. Man kann nämlich bestimmen, was vor der Liste (Tabelle) steht, was in der Tabelle steht und was nach der Tabelle steht. Das bietet einige Möglichkeiten einen Dateimanager mit einem Formular zwecks upload bauen ohne sich um um das Listing selbst kümmern zu müssen. Hier mal auszugsweise nutzbare Konfigurationseinstellungen:

                      
                      	<Directory "/var/www/Files/">
                      		# Aussehen der ../File-Seiten:
                      		DefaultType text/plain
                      		Options -ExecCGI
                      		php_flag engine off
                      		IndexOptions 	HTMLTable FoldersFirst SuppressHTMLPreamble SuppressRules IconsAreLinks SuppressDescription
                      		IndexStyleSheet /autoindex-files/autoindex.css
                      		HeaderName      /autoindex-files/header.html
                      		ReadmeName      /autoindex-files/footer.html
                      		AllowOverride none
                      		IndexIgnore . .ht* *.deleted
                      		AddType text/plain .php .pl .sh .py
                                      AddType application/unknown .cgi
                      		RemoveHandler application/x-httpd-php .php
                      		RemoveHandler cgi-script .pl .sh .py .pyc .pyo .rb .cc .exe .jar
                      		<Files ~ "\.php$">
                      			ForceType text/plain
                      		</Files>
                      		<Files ~ "\.pl$">
                      			ForceType text/plain
                      		</Files>
                      		<Files ~ "\.sh$">
                      			ForceType text/plain
                      		</Files>
                      		<Files ~ "\.py$">
                      			ForceType text/plain
                      		</Files>
                      		<Files ~ "\.cgi$">
                      			ForceType application/unknown
                      		</Files>
                      	</Directory>      
                      
                      

                      So sieht das dann aus (ohne Upload).

                      Jörg Reinholz

                      1. Ja, sieht gut aus ;)

                        Das hier auch: http://handwerkzeugs.de/astro/fileman.gif

            2. Debug:

                          $fh->open($r->{filename}, O_CREAT|O_BINARY|O_RDWR ) or $self->dd({
                              system => $^E,
                              effUID => $>,
                              effGID => $),
                              fileUID => $stat->[4],
                              fileGID => $stat->[5],
                          });
              

              und wenns knallt, was sehe ich:

              $VAR1 = {
                        'fileGID' => 0,
                        'effUID' => '1127',
                        'system' => 'Permission denied',
                        'fileUID' => 0,
                        'effGID' => '443 443'
                      };
              

              stat[4] und [5] sind plötzlich 0. Nix verstehen. Waren vor dem Upload gleich wie $> und $)

              1. [...] Nix verstehen [...]

                Fehlt immer noch die Antwort auf Jörgs entscheidende Frage: hast Du mal geprüft, unter welchem User das Script überhaupt ausgeführt wird?

                1. [...] Nix verstehen [...]

                  Fehlt immer noch die Antwort auf Jörgs entscheidende Frage: hast Du mal geprüft, unter welchem User das Script überhaupt ausgeführt wird?

                  ich hab in $> die UID. Den Namen kenn ich nur, wenn ich FTP mache, aber auch da kann ich in den besagten Verzeichnissen keine Datei anlegen.

                  Und überhaupt gehts mir nur darum das UPload-Form auszublenden, wenns keinen Sinn macht. Wenn ich das nicht restlos abklären kann, wirds halt konfigurierbar gemacht und gut isses.

                  1. Moin!

                    ich hab in $> die UID. Den Namen kenn ich nur, wenn ich FTP mache,

                    Variante 1:

                    $sys='grep -P "^[^:]+:x:' . $UID . '" /etc/passwd';
                    $name=`$sys`; # Backticks!
                    $sys='grep -P "^[^:]+:x:' . $GID . '" /etc/group';
                    $name=`$sys`; # Backticks!
                    

                    Variante 2

                    Hin und wieder wird /etc/passwd bzw. /etc/group nicht benutzt. Dann: Lege mittels Skript in /tmp eine Datei an und sieh einfach mit ls -l nach :-)

                    Jörg Reinholz

                    1. Ja, solche Ideen hatte ich auch schon. Mein Provider hat mich jedoch dermaßen eingemauert, dass ich hiervon gar nichts realisieren kann. To do: dendirs=/denied/dir /foo/bar ..

                      in der Konfiguration als zusätzliches Attribut für die Klassenbindung an den Backend-URL. Dann wird das UploadForm nur gezeigt, wenn in der betreffenden Directory geschrieben werden darf. Fertisch ;)

                        1. Danke, haste gut gemeint, sicher,

                          Provider

                          Wechseln. Ich kann meinen (Variomedia) echt empfehlen!

                          Guggst Du Hardware und Auslastung...

                          Für mich ist das alles weder Anreiz noch Kriterium. Was mir wichtig ist, ist erstens Perl und zweitens eine zugängliche Hotline. Weischd, ich programmiere schon lange, 20 Jahre schon. Aber ich hab seit meinem schrecklichen Schlaganfall ne mächtig lange Leitung. Sicher kann ich noch bis 256 zählen, nur, ich brauch dafür ne Woche ;)

                          1. Moin!

                            Für mich ist das alles weder Anreiz noch Kriterium. Was mir wichtig ist, ist erstens Perl und zweitens eine zugängliche Hotline.

                            Nur vom Feinsten! Die haben was Dein Herz begehrt (sogar einen Dyndns-Service!) und sind nicht mal teuer.

                            Jörg Reinholz

                            1. Moin!

                              Für mich ist das alles weder Anreiz noch Kriterium. Was mir wichtig ist, ist erstens Perl und zweitens eine zugängliche Hotline.

                              Nur vom Feinsten! Die haben was Dein Herz begehrt (sogar einen Dyndns-Service!) und sind nicht mal teuer.

                              Das sehe ich auch ohne Brille, dass kein Perl dabei ist ;)

                              Btw., FileMan.pm: Vezeichnisse, in denen der Anwender keine Dateien anlegen darf, sind nun konfigurierbar. D.h., das UploadForm erscheint da nicht und auch nicht das Eingabefeld zum mkdir. Spannend wird noch, wenn ich <pre contenteditable>%textdatei%</pre> mache und einen Speichern-Button einbaue. Spannend wegen der Zeilenumbrüche, CRLF oder nur LF ich lass mich mal überraschen, was mir der Browser anbietet.

                              Übrigens habe ich den kompletten Code gepostet, weil ich irgendwo noch einen systematischen Fehler vermute. Geht mir leider öfter so in letzter Zeit. pl

                              1. Aloha ;)

                                Für mich ist das alles weder Anreiz noch Kriterium. Was mir wichtig ist, ist erstens Perl und zweitens eine zugängliche Hotline.

                                Nur vom Feinsten! Die haben was Dein Herz begehrt (sogar einen Dyndns-Service!) und sind nicht mal teuer.

                                Das sehe ich auch ohne Brille, dass kein Perl dabei ist ;)

                                Hm? Ich lese da deutlich unter dem vierten Aufzählungspunkt

                                • Python 2.7/3.4, Perl 5, SSI

                                (Hervorhebung von mir)

                                Grüße,

                                RIDER

                                --
                                Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                                1. Das sehe ich auch ohne Brille, dass kein Perl dabei ist ;)

                                  Hm? Ich lese da deutlich unter dem vierten Aufzählungspunkt

                                  • Python 2.7/3.4, Perl 5, SSI

                                  Bitte kein falsches Mitleid. Was ich sehe oder nicht sehen kann, entscheide immer noch ich.

                                  1. Hallo,

                                    Bitte kein falsches Mitleid.

                                    Mitleid konnte ich aus Riders Beitrag nicht herauslesen. Weder echtes noch falsches.

                                    Was ich sehe oder nicht sehen kann, entscheide immer noch ich.

                                    Aber du könntest uns an deinem Entscheidungsfindungsprozess teilhaben lassen.

                                    Gruß
                                    Kalk

                                    1. Bitte kein falsches Mitleid.

                                      Mitleid konnte ich aus Riders Beitrag nicht herauslesen. Weder echtes noch falsches.

                                      Der wollte mir vorlesen!

                                      Was ich sehe oder nicht sehen kann, entscheide immer noch ich.

                                      Aber du könntest uns an deinem Entscheidungsfindungsprozess teilhaben lassen.

                                      Gerne. Manche Dinge sehe ich nicht. So einfach ist das ;)

                                      1. Hallo,

                                        Bitte kein falsches Mitleid.

                                        Mitleid konnte ich aus Riders Beitrag nicht herauslesen. Weder echtes noch falsches.

                                        Der wollte mir vorlesen!

                                        Das nennt sich dann Hilfsbereitschaft!

                                        Was ich sehe oder nicht sehen kann, entscheide immer noch ich.

                                        Aber du könntest uns an deinem Entscheidungsfindungsprozess teilhaben lassen.

                                        Gerne. Manche Dinge sehe ich nicht. So einfach ist das ;)

                                        Dann leg dir ein Paar Hühneraugen zu, vier Augen sehen mehr als zwei.

                                        Gruß
                                        Kalk

                                        1. Das nennt sich dann Hilfsbereitschaft!

                                          Das Wort helfen und damit verwandte Worte kann ich momentan leider nicht mehr hören, tut mir leid ;)

                                          Neglect

                                          PS: Hat meine Oma oft gesagt "Ich helf Dir gleich!"

                                          1. Hallo,

                                            PS: Hat meine Oma oft gesagt "Ich helf Dir gleich!"

                                            ich kenn die Drohung in der Formulierung "Ick wer di wat helfen!"

                                            Gruß
                                            Kalk

                    2. Hallo Jörg,

                      $sys='grep -P "^[^:]+:x:' . $UID . '" /etc/passwd';
                      $name=`$sys`; # Backticks!
                      $sys='grep -P "^[^:]+:x:' . $GID . '" /etc/group';
                      $name=`$sys`; # Backticks!
                      

                      bitte nicht. Dafür gibt es APIs, und die Existenz von /etc/passwd bzw /etc/group ist nicht zwangsläufig gegeben.

                      LG,
                      CK

                      1. Moin!

                        Dafür gibt es APIs, und die Existenz von /etc/passwd bzw /etc/group ist nicht zwangsläufig gegeben.

                        Die Existenz der Dateien ist schon gegeben weil andere Auth-Mehoden zuvor gestartete Dienste erfordern - und die brauchen ihre User. Nicht aber der User und Gruppen in /etc/passwd und /etc/group …

                        …Ok. Dann also so:

                        <pre><?php
                        $userinfo = posix_getpwuid(posix_geteuid());
                        print_r($userinfo);
                        ?>
                        
                        #!/usr/bin/perl
                        print "Content-type: text/plain\n\n<pre>";
                        print "UID:  " . $< . "\n";
                        print "Name: " . getpwuid( $< ) . "\n";
                        

                        Was ist eigentlich aus dem Syntax-Highlighting für Perl geworden?

                        Jörg Reinholz

                        1. Hallo Jörg,

                          Die Existenz der Dateien ist schon gegeben [...]

                          Nein. /etc/passwd sowie /etc/group müssen nicht existieren, nicht jedes Unix ist ein Linux.

                          Was ist eigentlich aus dem Syntax-Highlighting für Perl geworden?

                          siehe Upstream :)

                          LG,
                          CK

            3. Versuch Upload in phptemp (siehe ls) sollte thun

              $VAR1 = {
                        'fileGID' => 443,
                        'effUID' => '1127',
                        'system' => 'Permission denied',
                        'fileUID' => 1127,
                        'effGID' => '443 443'
                      };
              

              thut aber nicht.