Branch: master

9cb7d731 2014-10-06 11:38:24 Timothy Pearson
Push the following patches to GIT from Bug 1499:
 tdelibs: disable kfiledialogbox OK button if user has no permission on file
 tdelibs: fix https loop
 tdelibs: fix groups in kdialogpropertiesdialog
 tdelibs: avoid assertion in tdeio karchive
M tdeio/tdefile/kpropertiesdialog.cpp
M tdeio/tdeio/karchive.cpp
M tdeio/tdeio/tcpslavebase.cpp
diff --git a/tdeio/tdefile/kpropertiesdialog.cpp b/tdeio/tdefile/kpropertiesdialog.cpp
index 49f3359..9fd9027 100644
--- a/tdeio/tdefile/kpropertiesdialog.cpp
+++ b/tdeio/tdefile/kpropertiesdialog.cpp
@@ -1764,7 +1764,6 @@
    */
   int i, maxEntries = 1000;
   struct passwd *user;
-  struct group *ge;
 
   /* File owner: For root, offer a KLineEdit with autocompletion.
    * For a user, who can never chown() a file, offer a TQLabel.
@@ -1800,27 +1799,31 @@
     strUser = user->pw_name;
 
 #ifdef Q_OS_UNIX
-  setgrent();
-  for (i=0; ((ge = getgrent()) != 0L) && (i < maxEntries); i++)
-  {
-    if (IamRoot)
-      groupList += TQString::fromLatin1(ge->gr_name);
-    else
-    {
-      /* pick the groups to which the user belongs */
-      char ** members = ge->gr_mem;
-      char * member;
-      while ((member = *members) != 0L) {
-        if (strUser == member) {
-          groupList += TQString::fromLocal8Bit(ge->gr_name);
-          break;
-        }
-        ++members;
-      }
-    }
+  gid_t *groups = NULL;
+  int ng = 1;
+  struct group *mygroup;
+  gid_t *newgroups = NULL;
+
+  groups = (gid_t *) malloc(ng * sizeof(gid_t));
+
+  if (getgrouplist(strUser, user->pw_gid, groups, &ng) == -1) {
+	  newgroups = (gid_t *) malloc(ng * sizeof(gid_t));
+	  if (newgroups != NULL) {
+	          free(groups);
+		  groups = newgroups;
+		  getgrouplist(strUser, user->pw_gid, groups, &ng);
+	  } else ng = 1;
   }
-  endgrent();
-#endif //Q_OS_UNIX
+
+  for (i = 0; i < ng; i++) {
+	  mygroup = getgrgid(groups[i]);
+	  if (mygroup != NULL) groupList += TQString::fromLocal8Bit(mygroup->gr_name);
+  }
+
+  free(groups);
+
+#else //Q_OS_UNIX
+  struct group *ge;
 
   /* add the effective Group to the list .. */
   ge = getgrgid (getegid());
@@ -1831,6 +1834,7 @@
     if (groupList.find(name) == groupList.end())
       groupList += name;
   }
+#endif //Q_OS_UNIX
 
   bool isMyGroup = groupList.contains(strGroup);
 
@@ -2081,6 +2085,7 @@
   }
 
   // Draw Checkboxes
+  bool allDisable = true;
   TQCheckBox *cba[3][4];
   for (int row = 0; row < 3 ; ++row) {
     for (int col = 0; col < 4; ++col) {
@@ -2091,6 +2096,9 @@
       if ( aPartialPermissions & fperm[row][col] )
       {
         cb->setTristate();
+        if( d->canChangePermissions ) {
+          allDisable = false;
+        }
         cb->setNoChange();
       }
       else if (d->cbRecursive && d->cbRecursive->isChecked())
@@ -2152,6 +2160,10 @@
 
   }
 #endif
+  if ( allDisable ) {
+    dlg.enableButtonOK( false );
+  }
+
   if (dlg.exec() != KDialogBase::Accepted)
     return;
 
diff --git a/tdeio/tdeio/karchive.cpp b/tdeio/tdeio/karchive.cpp
index 0e8d678..b0e0dc6 100644
--- a/tdeio/tdeio/karchive.cpp
+++ b/tdeio/tdeio/karchive.cpp
@@ -588,7 +588,9 @@
 
 void KArchiveDirectory::addEntry( KArchiveEntry* entry )
 {
-  Q_ASSERT( !entry->name().isEmpty() );
+  if( entry->name().isEmpty() ) {
+    return;
+  }
   if( m_entries[ entry->name() ] ) {
       kdWarning() << "KArchiveDirectory::addEntry: directory " << name()
                   << " has entry " << entry->name() << " already" << endl;
diff --git a/tdeio/tdeio/tcpslavebase.cpp b/tdeio/tdeio/tcpslavebase.cpp
index e9707a7..b4b3fa6 100644
--- a/tdeio/tdeio/tcpslavebase.cpp
+++ b/tdeio/tdeio/tcpslavebase.cpp
@@ -1095,7 +1095,13 @@
       TDEConfig *config = new TDEConfig("tdeioslaverc");
       config->setGroup("Notification Messages");
 
-      if (!config->readBoolEntry("WarnOnEnterSSLMode", true)) {
+      bool dialogBoxStatus = false;
+      if( config->hasKey("WarnOnEnterSSLMode") ) {
+          dialogBoxStatus = true;
+      }
+      bool keyStatus = config->readBoolEntry("WarnOnEnterSSLMode", true);
+      dialogBoxStatus = dialogBoxStatus && keyStatus;
+      if (!keyStatus) {
           config->deleteEntry("WarnOnEnterSSLMode");
           config->sync();
           d->kssl->settings()->setWarnOnEnter(false);
@@ -1122,6 +1128,10 @@
                        "showSSLInfoDialog(TQString,TDEIO::MetaData,int)",
                        data, ignoretype, ignore);
       }
+      //Laurent: If we disable message box we can't click on KMessageBox::No
+      if(dialogBoxStatus) {
+          break;
+      }
       } while (result != KMessageBox::No);
    }