]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/file.c
Permission kludge; 95% bug-free!
[netatalk.git] / etc / afpd / file.c
index 8b2a112a0bb173737b959acb18a0cd0bc1c38b22..63a4ce16595763e9e1c39aa178e44d24578e576b 100644 (file)
@@ -317,6 +317,11 @@ int afp_createfile(obj, ibuf, ibuflen, rbuf, rbuflen )
     int                ibuflen, *rbuflen;
 {
     struct stat         st;
+#ifdef DROPKLUDGE
+    struct stat                sb;
+    char               adpath[50];
+    int                        uid;
+#endif DROPKLUDGE
     struct adouble     ad, *adp;
     struct vol         *vol;
     struct dir         *dir;
@@ -325,6 +330,7 @@ int afp_createfile(obj, ibuf, ibuflen, rbuf, rbuflen )
     int                        creatf, did, openf;
     u_int16_t          vid;
 
+    syslog(LOG_INFO, "afp_createfile");
     *rbuflen = 0;
     ibuf++;
     creatf = (unsigned char) *ibuf++;
@@ -401,6 +407,37 @@ int afp_createfile(obj, ibuf, ibuflen, rbuf, rbuflen )
     ad_close( adp, ADFLAGS_DF|ADFLAGS_HF );
 
 createfile_done:
+
+#ifdef DROPKLUDGE
+
+/* The below code is an experimental, untested, incomplete kludge which 
+provides better dropbox support.  It should NOT be turned on yet unless
+you are a developer who wants to try it out and fix it. */
+    if (stat(".", &sb) == -1) 
+      syslog (LOG_ERR, "Error checking directory %s: %m", dir->d_name);
+    else {
+      uid=geteuid();
+      if ( uid != sb.st_uid )
+      {
+       strcpy (adpath, "./.AppleDouble/");
+       strcat (adpath, path);
+       seteuid(0); /* Become root to change the owner of the file */
+       syslog (LOG_INFO, "Changing %s to uid=%d gid=%d", path, sb.st_uid, sb.st_gid);
+       if (chown(path, sb.st_uid, sb.st_gid)==-1)
+         syslog (LOG_ERR, "Error changing permissions: %m");
+        /* In order to write information to the file, the Mac client needs
+        to be able to read from it too, so read bits have to be turned on.
+        Directory permissions remain unchanged */
+        chmod(path,(sb.st_mode&0x0FFFF)| S_IRGRP| S_IROTH);
+       if (chown(adpath, sb.st_uid, sb.st_gid)==-1)
+         syslog (LOG_ERR, "Error changing AppleDouble permissions: %m");
+       syslog (LOG_INFO, "Changing afpd owner back to %d", uid);
+       seteuid(uid); /* Restore process ownership to normal */
+      }
+    }
+
+#endif DROPKLUDGE
+
     setvoltime(obj, vol );
     return AFP_OK;
 }
@@ -416,6 +453,7 @@ int afp_setfilparams(obj, ibuf, ibuflen, rbuf, rbuflen )
     int                did, rc;
     u_int16_t  vid, bitmap;
 
+    syslog (LOG_INFO, "afp_setfilparams");
     *rbuflen = 0;
     ibuf += 2;
 
@@ -706,6 +744,7 @@ int afp_copyfile(obj, ibuf, ibuflen, rbuf, rbuflen )
     int                plen, err;
     u_int16_t  svid, dvid;
 
+    syslog(LOG_INFO, "afp_copyfile");
     *rbuflen = 0;
     ibuf += 2;
 
@@ -1089,7 +1128,7 @@ int afp_createid(obj, ibuf, ibuflen, rbuf, rbuflen )
     cnid_t             did, id;
     u_short            vid;
     
-
+    syslog(LOG_INFO, "afp_createid");
     *rbuflen = 0;
     ibuf += 2;
 
@@ -1179,7 +1218,7 @@ int afp_resolveid(obj, ibuf, ibuflen, rbuf, rbuflen )
     cnid_t             id;
     u_int16_t          vid, bitmap;
     
-
+    syslog(LOG_INFO, "afp_resolveid");
     *rbuflen = 0;
     ibuf += 2;
 
@@ -1242,7 +1281,7 @@ int afp_deleteid(obj, ibuf, ibuflen, rbuf, rbuflen )
     cnid_t             id;
     u_short            vid;
     
-
+    syslog(LOG_INFO, "afp_deleteid");
     *rbuflen = 0;
     ibuf += 2;
 
@@ -1320,7 +1359,7 @@ int afp_exchangefiles(obj, ibuf, ibuflen, rbuf, rbuflen )
     cnid_t             sid, did;
     u_int16_t          vid;
     
-
+    syslog(LOG_INFO, "afp_exchangefiles");
     *rbuflen = 0;
     ibuf += 2;