summaryrefslogtreecommitdiff
path: root/noncore/settings/sshkeys/sshkeys.cpp
authordwmw2 <dwmw2>2002-09-20 12:59:59 (UTC)
committer dwmw2 <dwmw2>2002-09-20 12:59:59 (UTC)
commit6cbf7b19d7bb3fcd2471dbaa531a7b2ae05f0fcc (patch) (unidiff)
treec135d91fbd04c19936a71010505777ef7b86ad96 /noncore/settings/sshkeys/sshkeys.cpp
parenta05c10c9744020be31c3038b2de3401b5cc673fb (diff)
downloadopie-6cbf7b19d7bb3fcd2471dbaa531a7b2ae05f0fcc.zip
opie-6cbf7b19d7bb3fcd2471dbaa531a7b2ae05f0fcc.tar.gz
opie-6cbf7b19d7bb3fcd2471dbaa531a7b2ae05f0fcc.tar.bz2
Works now
Diffstat (limited to 'noncore/settings/sshkeys/sshkeys.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/sshkeys/sshkeys.cpp195
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
@@ -4,19 +4,47 @@
4#include <opie/oprocess.h> 4#include <opie/oprocess.h>
5#include <qmultilineedit.h> 5#include <qmultilineedit.h>
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
17static char *keynames[] = { "identity", "id_rsa", "id_dsa" };
8 18
9SSHKeysApp::SSHKeysApp( QWidget* parent, const char* name, WFlags fl ) 19SSHKeysApp::SSHKeysApp( QWidget* parent, const char* name, WFlags fl )
10 : SSHKeysBase( parent, name, fl ) 20 : SSHKeysBase( parent, name, fl )
11{ 21{
22 char *home = getenv("HOME");
23 unsigned i;
12 24
13 connect(AddButton, SIGNAL(clicked()), this, SLOT(doAddButton())); 25 connect(AddButton, SIGNAL(clicked()), this, SLOT(doAddButton()));
14 connect(RefreshListButton, SIGNAL(clicked()), this, SLOT(doRefreshListButton())); 26 connect(RefreshListButton, SIGNAL(clicked()), this, SLOT(doRefreshListButton()));
15 connect(RemoveAllButton, SIGNAL(clicked()), this, SLOT(doRemoveAllButton())); 27 connect(RemoveAllButton, SIGNAL(clicked()), this, SLOT(doRemoveAllButton()));
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
21 doRefreshListButton(); 49 doRefreshListButton();
22} 50}
@@ -28,31 +56,172 @@ SSHKeysApp::~SSHKeysApp()
28void SSHKeysApp::doRefreshListButton() 56void SSHKeysApp::doRefreshListButton()
29{ 57{
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}
44 85
45void SSHKeysApp::get_list_keys_output(OProcess *proc, char *buffer, int buflen) 86void 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
154void SSHKeysApp::log_sshadd_output(OProcess *proc, char *buffer, int buflen)
155{
156 (void)proc;
157 (void)buflen;
158
159 log_text(buffer);
160}
161
162void 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
174void 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
51void SSHKeysApp::doAddButton() 186void 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
207void SSHKeysApp::log_text(const char *text)
208{
209 TextOutput->append(text);
210 TextOutput->setCursorPosition(TextOutput->numLines()+1, 0, FALSE);
54} 211}
212
55void SSHKeysApp::doRemoveAllButton() 213void 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}