[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#413055: kdelibs4c2a: KDE widget that accepts password behaves wrong when keyboard layout is not US



On Friday 20 July 2007 00:12, Sune Vuorela wrote:
> One thing I don't fully understand in your bug report. Is it just a
> 'cosmetic' issue - or does logging in not work?
> What if you use backspace? do one or two stars dissapear ?

Ok. I have found the bug and written the patch. The bug is in KPasswordEdit 
widget. The author has chosen to store password in a raw char[] array (maybe, 
for security reasons). When the password field was updated, it printed as
many * as the length of this array. Backspace deleted only one char, that
is a half of UTF-8 cyrillic char, so this is definitely a bug.

I've tested it with latin and cyrillic passwords, both works!.

-- 
  Max
diff -Nrua sources/kdelibs-3.5.5a.dfsg.1/kdeui/kpassdlg.cpp kdelibs-3.5.5a.dfsg.1/kdeui/kpassdlg.cpp
--- sources/kdelibs-3.5.5a.dfsg.1/kdeui/kpassdlg.cpp	2006-01-19 20:07:18.000000000 +0300
+++ kdelibs-3.5.5a.dfsg.1/kdeui/kpassdlg.cpp	2007-08-02 05:43:09.000000000 +0400
@@ -205,7 +205,12 @@
 	if (e->state() & (ControlButton | AltButton))
 	    e->ignore();
 	else if (m_Length) {
-	    m_Password[--m_Length] = '\000';
+            QString tmp(QString::fromLocal8Bit(m_Password));
+            tmp.truncate(tmp.length() - 1);
+
+            const QCString localTxt = tmp.local8Bit();
+            qstrncpy(m_Password, localTxt, maxPasswordLength());
+	    m_Length = localTxt.length();
 	    showPass();
 	}
 	break;
@@ -261,15 +266,15 @@
 
 void KPasswordEdit::showPass()
 {
-    QString tmp;
+    QString tmp(QString::fromLocal8Bit(m_Password));
 
     switch (m_EchoMode) {
     case OneStar:
-	tmp.fill('*', m_Length);
+	tmp.fill('*');
 	setText(tmp);
 	break;
     case ThreeStars:
-	tmp.fill('*', m_Length*3);
+	tmp.fill('*', tmp.length()*3);
 	setText(tmp);
 	break;
     case NoEcho: default:
@@ -283,7 +288,7 @@
     if (newLength >= PassLen) newLength = PassLen - 1; // belt and braces
     if (newLength < 0) newLength = 0;
     int* t = ourMaxLength(this);
-    *t = newLength; 
+    *t = newLength;
     while (m_Length > newLength) {
         m_Password[m_Length] = '\000';
         --m_Length;
@@ -625,7 +630,7 @@
 
       const double lengthFactor = d->reasonablePasswordLength / 8.0;
 
-      
+
       int pwlength = (int) (pass.length() / lengthFactor);
       if (pwlength > 5) pwlength = 5;
 
@@ -646,7 +651,7 @@
       if ( pwstrength < 0 ) {
 	      pwstrength = 0;
       }
-  
+
       if ( pwstrength > 100 ) {
 	      pwstrength = 100;
       }

Reply to: