Diffstat (limited to 'noncore/settings/sshkeys/sshkeys.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/settings/sshkeys/sshkeys.cpp | 195 |
1 files changed, 182 insertions, 13 deletions
diff --git a/noncore/settings/sshkeys/sshkeys.cpp b/noncore/settings/sshkeys/sshkeys.cpp index 08ce18d..5095d16 100644 --- a/noncore/settings/sshkeys/sshkeys.cpp +++ b/noncore/settings/sshkeys/sshkeys.cpp | |||
@@ -6,3 +6,13 @@ | |||
6 | #include <qpushbutton.h> | 6 | #include <qpushbutton.h> |
7 | #include <qtable.h> | 7 | #include <qlistview.h> |
8 | #include <qcombobox.h> | ||
9 | |||
10 | #include <sys/types.h> | ||
11 | #include <sys/stat.h> | ||
12 | #include <stdlib.h> | ||
13 | #include <unistd.h> | ||
14 | #include <stdio.h> | ||
15 | #include <ctype.h> | ||
16 | |||
17 | static char *keynames[] = { "identity", "id_rsa", "id_dsa" }; | ||
8 | 18 | ||
@@ -11,2 +21,4 @@ SSHKeysApp::SSHKeysApp( QWidget* parent, const char* name, WFlags fl ) | |||
11 | { | 21 | { |
22 | char *home = getenv("HOME"); | ||
23 | unsigned i; | ||
12 | 24 | ||
@@ -16,5 +28,21 @@ SSHKeysApp::SSHKeysApp( QWidget* parent, const char* name, WFlags fl ) | |||
16 | 28 | ||
17 | KeyList->horizontalHeader()->setLabel(0, tr("Key")); | 29 | connect(&addprocess, SIGNAL(receivedStdout(OProcess*,char*,int)), |
18 | KeyList->horizontalHeader()->setLabel(1, tr("Size")); | 30 | this, SLOT(log_sshadd_output(OProcess*,char*,int))); |
19 | KeyList->horizontalHeader()->setLabel(2, tr("Fingerprint")); | 31 | connect(&addprocess, SIGNAL(processExited(OProcess*)), |
32 | this, SLOT(ssh_add_exited(OProcess*))); | ||
33 | |||
34 | connect(KeyFileName, SIGNAL(textChanged(const QString&)), | ||
35 | this, SLOT(add_text_changed(const QString&))); | ||
36 | |||
37 | if (home) { | ||
38 | for (i = 0; i < sizeof(keynames)/sizeof(keynames[0]); i++) { | ||
39 | char thiskeyname[32]; | ||
40 | |||
41 | thiskeyname[31] = 0; | ||
42 | snprintf(thiskeyname, 31, "%s/.ssh/%s", home, keynames[i]); | ||
43 | if (!access(thiskeyname, R_OK)) { | ||
44 | KeyFileName->insertItem(thiskeyname); | ||
45 | } | ||
46 | } | ||
47 | } | ||
20 | 48 | ||
@@ -30,14 +58,27 @@ void SSHKeysApp::doRefreshListButton() | |||
30 | OProcess sshadd_process; | 58 | OProcess sshadd_process; |
59 | QListViewItem *t = KeyList->firstChild(); | ||
31 | 60 | ||
61 | while(t) { | ||
62 | QListViewItem *next = t->nextSibling(); | ||
63 | KeyList->takeItem(t); | ||
64 | delete(t); | ||
65 | t = next; | ||
66 | } | ||
67 | |||
32 | connect(&sshadd_process, SIGNAL(receivedStdout(OProcess*,char*,int)), | 68 | connect(&sshadd_process, SIGNAL(receivedStdout(OProcess*,char*,int)), |
33 | this, SLOT(get_list_keys_output(OProcess*,char*,int))); | 69 | this, SLOT(get_list_keys_output(OProcess*,char*,int))); |
34 | 70 | ||
35 | TextOutput->append("Running ssh-add -l\n"); | 71 | keystate = KeySize; |
72 | incoming_keyname=""; | ||
73 | incoming_keysize=""; | ||
74 | incoming_keyfingerprint=""; | ||
75 | |||
76 | //log_text("Running ssh-add -l"); | ||
36 | sshadd_process << "ssh-add" << "-l"; | 77 | sshadd_process << "ssh-add" << "-l"; |
37 | bool ret = sshadd_process.start(OProcess::Block, OProcess::AllOutput); | 78 | bool ret = sshadd_process.start(OProcess::Block, OProcess::AllOutput); |
38 | if (!ret) | 79 | if (!ret) { |
39 | TextOutput->append("Error running ssh-add\n"); | 80 | log_text("Error running ssh-add"); |
40 | KeyList->setText(0, 0, "dwmw2@infradead.org (RSA v1)"); | 81 | return; |
41 | KeyList->setText(0, 1, "1024"); | 82 | } |
42 | KeyList->setText(0, 2, "78:24:04:95:40:fc:b2:80:9b:94:d5:ae:19:56:19:65"); | 83 | |
43 | } | 84 | } |
@@ -46,5 +87,99 @@ void SSHKeysApp::get_list_keys_output(OProcess *proc, char *buffer, int buflen) | |||
46 | { | 87 | { |
47 | TextOutput->append(buffer); | 88 | int i; |
89 | (void) proc; | ||
90 | |||
91 | for (i=0; i<buflen; i++) { | ||
92 | switch(keystate) { | ||
93 | case Noise: | ||
94 | noise: | ||
95 | if (buffer[i] == '\n') { | ||
96 | log_text(incoming_noise.local8Bit()); | ||
97 | incoming_noise = ""; | ||
98 | keystate = KeySize; | ||
99 | } else { | ||
100 | incoming_noise += buffer[i]; | ||
101 | } | ||
102 | break; | ||
103 | |||
104 | case KeySize: | ||
105 | if (isdigit(buffer[i])) { | ||
106 | incoming_keysize += buffer[i]; | ||
107 | } else if (buffer[i] == ' ') { | ||
108 | keystate = KeyFingerprint; | ||
109 | } else { | ||
110 | incoming_keysize = ""; | ||
111 | incoming_noise = ""; | ||
112 | keystate = Noise; | ||
113 | goto noise; | ||
114 | } | ||
115 | break; | ||
116 | |||
117 | case KeyFingerprint: | ||
118 | if (isxdigit(buffer[i]) || buffer[i] == ':') { | ||
119 | incoming_keyfingerprint += buffer[i]; | ||
120 | } else if (buffer[i] == ' ') { | ||
121 | keystate = KeyName; | ||
122 | } else { | ||
123 | incoming_keysize = ""; | ||
124 | incoming_keyfingerprint = ""; | ||
125 | incoming_noise = ""; | ||
126 | keystate = Noise; | ||
127 | goto noise; | ||
128 | } | ||
129 | break; | ||
130 | |||
131 | case KeyName: | ||
132 | if (buffer[i] == '\n') { | ||
133 | /* Wheee. Got one. */ | ||
134 | KeyList->insertItem(new | ||
135 | QListViewItem(KeyList, incoming_keyname, incoming_keysize, incoming_keyfingerprint)); | ||
136 | incoming_keysize = ""; | ||
137 | incoming_keyfingerprint = ""; | ||
138 | incoming_keyname = ""; | ||
139 | keystate = KeySize; | ||
140 | } else if (isprint(buffer[i])) { | ||
141 | incoming_keyname += buffer[i]; | ||
142 | } else { | ||
143 | incoming_keysize = ""; | ||
144 | incoming_keyfingerprint = ""; | ||
145 | incoming_noise = ""; | ||
146 | keystate = Noise; | ||
147 | goto noise; | ||
148 | } | ||
149 | break; | ||
150 | } | ||
151 | } | ||
48 | } | 152 | } |
49 | 153 | ||
154 | void SSHKeysApp::log_sshadd_output(OProcess *proc, char *buffer, int buflen) | ||
155 | { | ||
156 | (void)proc; | ||
157 | (void)buflen; | ||
158 | |||
159 | log_text(buffer); | ||
160 | } | ||
161 | |||
162 | void SSHKeysApp::ssh_add_exited(OProcess *proc) | ||
163 | { | ||
164 | (void)proc; | ||
165 | |||
166 | doRefreshListButton(); | ||
167 | setEnabled(TRUE); | ||
168 | if (proc->exitStatus()) { | ||
169 | |||
170 | log_text(QString("ssh-add failed")); | ||
171 | } | ||
172 | } | ||
173 | |||
174 | void SSHKeysApp::add_text_changed(const QString &text) | ||
175 | { | ||
176 | struct stat sbuf; | ||
177 | |||
178 | if (!text.length() || (!access(text.ascii(), R_OK) && | ||
179 | !stat(text.ascii(), &sbuf) && | ||
180 | S_ISREG(sbuf.st_mode))) | ||
181 | AddButton->setEnabled(TRUE); | ||
182 | else | ||
183 | AddButton->setEnabled(FALSE); | ||
184 | } | ||
50 | 185 | ||
@@ -52,7 +187,41 @@ void SSHKeysApp::doAddButton() | |||
52 | { | 187 | { |
188 | addprocess.clearArguments(); | ||
189 | |||
190 | setEnabled(FALSE); | ||
191 | |||
192 | if (KeyFileName->currentText().length()) { | ||
193 | addprocess << "ssh-add" << "--" << KeyFileName->currentText(); | ||
194 | log_text(QString("Running ssh-add -- ") + KeyFileName->currentText()); | ||
195 | } else { | ||
196 | addprocess << "ssh-add"; | ||
197 | log_text("Running ssh-add"); | ||
198 | } | ||
199 | bool ret = addprocess.start(OProcess::NotifyOnExit, OProcess::AllOutput); | ||
200 | if (!ret) { | ||
201 | log_text("Error running ssh-add"); | ||
202 | doRefreshListButton(); | ||
203 | setEnabled(TRUE); | ||
204 | } | ||
205 | } | ||
53 | 206 | ||
207 | void SSHKeysApp::log_text(const char *text) | ||
208 | { | ||
209 | TextOutput->append(text); | ||
210 | TextOutput->setCursorPosition(TextOutput->numLines()+1, 0, FALSE); | ||
54 | } | 211 | } |
212 | |||
55 | void SSHKeysApp::doRemoveAllButton() | 213 | void SSHKeysApp::doRemoveAllButton() |
56 | { | 214 | { |
57 | 215 | OProcess sshadd_process; | |
216 | |||
217 | connect(&sshadd_process, SIGNAL(receivedStdout(OProcess*,char*,int)), | ||
218 | this, SLOT(log_sshadd_output(OProcess*,char*,int))); | ||
219 | |||
220 | log_text("Running ssh-add -D"); | ||
221 | sshadd_process << "ssh-add" << "-D"; | ||
222 | bool ret = sshadd_process.start(OProcess::Block, OProcess::AllOutput); | ||
223 | if (!ret) { | ||
224 | log_text("Error running ssh-add"); | ||
225 | } | ||
226 | doRefreshListButton(); | ||
58 | } | 227 | } |