summaryrefslogtreecommitdiffstats
path: root/source/kde/kdelibs/kdesu-allow_NOPASS_in_suauth.patch
blob: 8d2168c3a3ccb98c858352b8193984da6842ad9d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
diff -Naur kdesu/stub.cpp kdesu.new/stub.cpp
--- kdesu/stub.cpp	2008-05-21 08:08:55.000000000 -0300
+++ kdesu.new/stub.cpp	2009-08-06 04:06:43.000000000 -0300
@@ -111,7 +111,7 @@
 	if (line.isNull())
 	    return -1;
 
-	if (line == "kdesu_stub")
+	if ((line == "kdesu_stub")||(line == "Password authentication bypassed."))
 	{
 	    // This makes parsing a lot easier.
 	    enableLocalEcho(false);
diff -Naur kdesu/su.cpp kdesu.new/su.cpp
--- kdesu/su.cpp	2008-05-21 08:08:55.000000000 -0300
+++ kdesu.new/su.cpp	2009-08-06 04:10:55.000000000 -0300
@@ -163,7 +163,7 @@
     }
     // kDebug(900) << k_lineinfo << "Done StubProcess::exec()";
 
-    SuErrors ret = (SuErrors) ConverseSU(password);
+    SuErrors ret = (SuErrors) ConverseSU(password,check);
     // kDebug(900) << k_lineinfo << "Conversation returned " << ret;
 
     if (ret == error)
@@ -172,6 +172,7 @@
             kError(900) << k_lineinfo << "Conversation with su failed\n";
         return ret;
     }
+    
     if (check == NeedPassword)
     {
         if (ret == killme)
@@ -235,10 +236,10 @@
 
 /*
 * Conversation with su: feed the password.
-* Return values: -1 = error, 0 = ok, 1 = kill me, 2 not authorized
+* Return values: -1 = error, 0 = ok, 1 = kill me, 2 = not authorized
 */
 
-int SuProcess::ConverseSU(const char *password)
+int SuProcess::ConverseSU(const char *password, int check)
 {
     enum { WaitForPrompt, CheckStar, HandleStub } state = WaitForPrompt;
     int colon;
@@ -265,6 +266,27 @@
                     return ok;
                 }
 
+                if (line == "Password authentication bypassed.")
+                {
+		    if (check == 2) 
+		    {
+                    	unreadLine(line);
+                    	return ok;
+		    } 
+		    else 
+		    {
+			if (checkPid(m_Pid))
+                        { 
+			    state=HandleStub;
+			}
+			else
+			{
+			    return error;
+			}
+                    }
+                    break;
+                }
+
                 while(waitMS(fd(),100)>0)
                 {
                     // There is more output available, so the previous line
@@ -293,7 +315,7 @@
                 }
                 if ((colon == 1) && (line[j] == ':'))
                 {
-                    if (password == 0L)
+                    if (password == 0L) 
                         return killme;
                     if (!checkPid(m_Pid))
                     {
diff -Naur kdesu/su.h kdesu.new/su.h
--- kdesu/su.h	2008-05-21 08:08:55.000000000 -0300
+++ kdesu.new/su.h	2009-08-06 02:50:02.000000000 -0300
@@ -62,7 +62,7 @@
 
 private:
     enum SuErrors { error=-1, ok=0, killme=1, notauthorized=2 } ;
-    int ConverseSU(const char *password);
+    int ConverseSU(const char *password, int check=NoCheck);
 
 protected:
     virtual void virtual_hook( int id, void* data );