~ubuntu-branches/ubuntu/precise/nordugrid-arc/precise

« back to all changes in this revision

Viewing changes to src/services/gridftpd/fileplugin/fileplugin.cpp

  • Committer: Package Import Robot
  • Author(s): Mattias Ellert
  • Date: 2011-10-24 02:19:37 UTC
  • mfrom: (3.1.4 sid)
  • Revision ID: package-import@ubuntu.com-20111024021937-8whiie90uq2oqsok
Tags: 1.1.0-2
* Backport fixes for endian independent md5 checksum
* Filter out -Wl,-Bsymbolic-functions from default Ubuntu LDFLAGS

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
#include <sys/vfs.h>
16
16
#endif
17
17
 
 
18
#include <arc/Utils.h>
 
19
 
18
20
#include "fileplugin.h"
19
21
#include "../conf/conf.h"
20
22
#include "../userspec.h"
266
268
    if(i->unix_set(uid,gid) == 0) {
267
269
      if(::mkdir(fdname.c_str(),
268
270
              i->access.mkdir_perm_or & i->access.mkdir_perm_and) == 0) {
269
 
        (void)::chmod(fdname.c_str(),
 
271
        chmod(fdname.c_str(),
270
272
              i->access.mkdir_perm_or & i->access.mkdir_perm_and);
271
273
        i->unix_reset();
272
274
        uid_t u = i->access.mkdir_uid;
273
275
        gid_t g = i->access.mkdir_gid;
274
276
        if(u == ((uid_t)(-1))) u=uid; if(g == ((gid_t)(-1))) g=gid;
275
 
        (void)::chown(fdname.c_str(),u,g);
 
277
        if(chown(fdname.c_str(),u,g) != 0) {}
276
278
        continue;
277
279
      } else {
278
280
        i->unix_reset();
307
309
  if(!(i->access.del)) return 1;
308
310
  std::string fname=real_name(name);
309
311
  int ur=i->unix_rights(fname,uid,gid);
 
312
  if(ur == 0 && errno > 0) { // stat failed
 
313
    error_description = Arc::StrError(errno);
 
314
    return 1;
 
315
  }
 
316
  if(ur & S_IFDIR) {
 
317
    error_description = "Is a directory";
 
318
    return 1;
 
319
  }
310
320
  if(!(ur & S_IFREG)) return 1;
311
321
  if(i->unix_set(uid,gid) != 0) return 1;
312
322
  if(::remove(fname.c_str()) != 0) {
 
323
    error_description = Arc::StrError(errno);
313
324
    i->unix_reset();
314
325
    return 1;
315
326
  };
323
334
  if(!(i->access.del)) return 1;
324
335
  std::string fdname=real_name(dname);
325
336
  int ur=i->unix_rights(fdname,uid,gid);
326
 
  if(!(ur & S_IFDIR)) return 1;
 
337
  if(ur == 0 && errno > 0) { // stat failed
 
338
    error_description = Arc::StrError(errno);
 
339
    return 1;
 
340
  }
 
341
  if(!(ur & S_IFDIR)) {
 
342
    error_description = "Not a directory";
 
343
    return 1;
 
344
  }
327
345
  if(i->unix_set(uid,gid) != 0) return 1;
328
346
  if(::remove(fdname.c_str()) != 0) {
 
347
    error_description = Arc::StrError(errno);
329
348
    i->unix_reset();
330
349
    return 1;
331
350
  };
341
360
    if(i==access.end()) return 1; /* error ? */
342
361
    if(i->access.read) {
343
362
      int ur=(*i).unix_rights(fname,uid,gid);
 
363
      if(ur == 0 && errno > 0) { // stat failed
 
364
        error_description = Arc::StrError(errno);
 
365
        return 1;
 
366
      }
344
367
      if((ur & S_IFREG) && (ur & S_IRUSR)) {
345
368
        /* so open it */
346
369
        if(i->unix_set(uid,gid) != 0) return 1;
390
413
          if(data_file == -1) return 1;
391
414
          file_mode=file_access_overwrite;
392
415
          file_name=fname;
393
 
          truncate(file_name.c_str(),0);
 
416
          if(truncate(file_name.c_str(),0) != 0) {}
394
417
          return 0;
395
418
        };
396
419
      };
 
420
      error_description="File exists, overwrite not allowed";
397
421
      return 1;
398
422
    }
399
423
    else if(ur & S_IFDIR) { /* it's a directory */
429
453
          gid_t g = i->access.creat_gid;
430
454
          if(u == ((uid_t)(-1))) u=uid; if(g == ((gid_t)(-1))) g=gid;
431
455
          logger.msg(Arc::VERBOSE, "open: changing owner for %s, %i, %i", fname, u, gid);
432
 
          (void)chown(fname.c_str(),u,g);
 
456
          if(chown(fname.c_str(),u,g) != 0) {}
433
457
          /* adjust permissions because open uses umask */
434
 
          (void)chmod(fname.c_str(),
 
458
          chmod(fname.c_str(),
435
459
                i->access.creat_perm_or & i->access.creat_perm_and);
436
460
          struct stat st;
437
461
          stat(fname.c_str(),&st);
481
505
    if(data_file == -1) return 1;
482
506
    file_mode=file_access_create;
483
507
    file_name=fname;
484
 
    truncate(file_name.c_str(),0);
485
 
    (void)chown(fname.c_str(),uid,gid);
486
 
    (void)chmod(fname.c_str(),S_IRUSR | S_IWUSR);
 
508
    if(truncate(file_name.c_str(),0) != 0) {}
 
509
    if(chown(fname.c_str(),uid,gid) != 0) {}
 
510
    chmod(fname.c_str(),S_IRUSR | S_IWUSR);
487
511
    return 0;
488
512
  }
489
513
  else {
604
628
}
605
629
 
606
630
void DirectAccess::unix_reset(void) {
607
 
    if(geteuid() != getuid()) seteuid(getuid());
608
 
    if(getegid() != getgid()) setegid(getgid());
 
631
  if(access.access == local_none_access) return;
 
632
  if(geteuid() != getuid()) seteuid(getuid());
 
633
  if(getegid() != getgid()) setegid(getgid());
609
634
}
610
635
 
611
636
std::list<DirectAccess>::iterator DirectFilePlugin::control_dir(const std::string &name,bool indir) {
686
711
  std::string fname = real_name(name);
687
712
  if(i->access.dirlist) {
688
713
    int ur=i->unix_rights(fname,uid,gid);
 
714
    if(ur == 0 && errno > 0) { // stat failed
 
715
      error_description = Arc::StrError(errno);
 
716
      return 1;
 
717
    }
689
718
    if((ur & S_IFDIR) && (ur & S_IRUSR) && (ur & S_IXUSR)) {
690
719
      /* allowed to list in configuration and by unix rights */
691
720
      /* following Linux semantics - need r-x for dirlist */
692
721
      /* now get real listing */
693
722
      if(i->unix_set(uid,gid) != 0) return 1;
694
723
      DIR* d=::opendir(fname.c_str());
695
 
      i->unix_reset();
696
724
      if(d == NULL) { return 1; }; /* maybe return ? */
697
725
      struct dirent *de;
698
726
      for(;;) {
700
728
        if(de == NULL) break;
701
729
        if((!strcmp(de->d_name,".")) || (!strcmp(de->d_name,".."))) continue;
702
730
        DirEntry dent(true,de->d_name); // treat it as file by default
 
731
        i->unix_reset();
703
732
        bool is_manageable = fill_object_info(dent,fname,ur,i,mode);
 
733
        i->unix_set(uid,gid);
704
734
        if(is_manageable) {
705
735
          dir_list.push_back(dent);
706
736
        };
707
737
      };
708
738
      ::closedir(d);
 
739
      i->unix_reset();
709
740
      return 0;
710
741
    }
711
742
    else if(ur & S_IFREG) {
729
760
  std::string fname = real_name(dirname);
730
761
  if(i->access.cd) {
731
762
    int ur=(*i).unix_rights(fname,uid,gid);
 
763
    if(ur == 0 && errno > 0) { // stat failed
 
764
      error_description = Arc::StrError(errno);
 
765
      return 1;
 
766
    }
732
767
    if((ur & S_IXUSR) && (ur & S_IFDIR)) {
733
768
  logger.msg(Arc::VERBOSE, "plugin: checkdir: access: allowed: %s", fname);
734
769
      return 0;
753
788
  if(!(i->access.dirlist)) { return 1; };
754
789
  std::string fdname = real_name(dname);
755
790
  int ur=i->unix_rights(fdname,uid,gid);
 
791
  if(ur == 0 && errno > 0) { // stat failed
 
792
    error_description = Arc::StrError(errno);
 
793
    return 1;
 
794
  }
756
795
  if(!((ur & S_IXUSR) && (ur & S_IFDIR)))  { return 1; };
757
796
  std::string fname = real_name(name);
758
797
  DirEntry dent(true,get_last_name(fname.c_str()));
759
798
  bool is_manageable = fill_object_info(dent,fdname,ur,i,mode);
760
799
  if(!is_manageable) {
 
800
    if (errno > 0) error_description = Arc::StrError(errno);
761
801
    return 1;
762
802
  };
763
803
  info=dent;