summaryrefslogtreecommitdiff
authorzecke <zecke>2003-09-19 13:34:19 (UTC)
committer zecke <zecke>2003-09-19 13:34:19 (UTC)
commit6fc0216161b4ad62cd407d2a36d78d8bd88f4ed0 (patch) (unidiff)
tree6a5511175042d599142c1686289487cc4e74c19a
parentff7423735a1effb0aad3f79b8a4e1ee2ed24750d (diff)
downloadopie-6fc0216161b4ad62cd407d2a36d78d8bd88f4ed0.zip
opie-6fc0216161b4ad62cd407d2a36d78d8bd88f4ed0.tar.gz
opie-6fc0216161b4ad62cd407d2a36d78d8bd88f4ed0.tar.bz2
if the password is wrong but 'rootme' prompt the user again to either accept
or deny the connection
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/transferserver.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/core/launcher/transferserver.cpp b/core/launcher/transferserver.cpp
index 371400e..fde6f8b 100644
--- a/core/launcher/transferserver.cpp
+++ b/core/launcher/transferserver.cpp
@@ -92,257 +92,261 @@ void TransferServer::closed(ServerPI *item)
92{ 92{
93 connections.removeRef(item); 93 connections.removeRef(item);
94} 94}
95 95
96TransferServer::~TransferServer() 96TransferServer::~TransferServer()
97{ 97{
98} 98}
99 99
100void TransferServer::newConnection( int socket ) 100void TransferServer::newConnection( int socket )
101{ 101{
102 ServerPI *ptr = new ServerPI( socket, this ); 102 ServerPI *ptr = new ServerPI( socket, this );
103 connect( ptr, SIGNAL(connectionClosed(ServerPI *)), this, SLOT( closed(ServerPI *)) ); 103 connect( ptr, SIGNAL(connectionClosed(ServerPI *)), this, SLOT( closed(ServerPI *)) );
104 connections.append( ptr ); 104 connections.append( ptr );
105} 105}
106 106
107QString SyncAuthentication::serverId() 107QString SyncAuthentication::serverId()
108{ 108{
109 Config cfg("Security"); 109 Config cfg("Security");
110 cfg.setGroup("Sync"); 110 cfg.setGroup("Sync");
111 QString r = cfg.readEntry("serverid"); 111 QString r = cfg.readEntry("serverid");
112 112
113 if ( r.isEmpty() ) { 113 if ( r.isEmpty() ) {
114 r = Opie::Global::uuid(); 114 r = Opie::Global::uuid();
115 cfg.writeEntry("serverid", r ); 115 cfg.writeEntry("serverid", r );
116 } 116 }
117 return r; 117 return r;
118} 118}
119 119
120QString SyncAuthentication::ownerName() 120QString SyncAuthentication::ownerName()
121{ 121{
122 QString vfilename = Global::applicationFileName("addressbook", 122 QString vfilename = Global::applicationFileName("addressbook",
123 "businesscard.vcf"); 123 "businesscard.vcf");
124 if (QFile::exists(vfilename)) { 124 if (QFile::exists(vfilename)) {
125 Contact c; 125 Contact c;
126 c = Contact::readVCard( vfilename )[0]; 126 c = Contact::readVCard( vfilename )[0];
127 return c.fullName(); 127 return c.fullName();
128 } 128 }
129 129
130 return QString::null; 130 return QString::null;
131} 131}
132 132
133QString SyncAuthentication::loginName() 133QString SyncAuthentication::loginName()
134{ 134{
135 struct passwd *pw = 0L; 135 struct passwd *pw = 0L;
136#ifndef Q_OS_WIN32 136#ifndef Q_OS_WIN32
137 pw = getpwuid( geteuid() ); 137 pw = getpwuid( geteuid() );
138 return QString::fromLocal8Bit( pw->pw_name ); 138 return QString::fromLocal8Bit( pw->pw_name );
139#else 139#else
140 //### revise 140 //### revise
141 return QString(); 141 return QString();
142#endif 142#endif
143} 143}
144 144
145int SyncAuthentication::isAuthorized(QHostAddress peeraddress) 145int SyncAuthentication::isAuthorized(QHostAddress peeraddress)
146{ 146{
147 Config cfg("Security"); 147 Config cfg("Security");
148 cfg.setGroup("Sync"); 148 cfg.setGroup("Sync");
149 // QString allowedstr = cfg.readEntry("auth_peer","192.168.1.0"); 149 // QString allowedstr = cfg.readEntry("auth_peer","192.168.1.0");
150 uint auth_peer = cfg.readNumEntry("auth_peer", 0xc0a80100); 150 uint auth_peer = cfg.readNumEntry("auth_peer", 0xc0a80100);
151 151
152 // QHostAddress allowed; 152 // QHostAddress allowed;
153 // allowed.setAddress(allowedstr); 153 // allowed.setAddress(allowedstr);
154 // uint auth_peer = allowed.ip4Addr(); 154 // uint auth_peer = allowed.ip4Addr();
155 uint auth_peer_bits = cfg.readNumEntry("auth_peer_bits", 24); 155 uint auth_peer_bits = cfg.readNumEntry("auth_peer_bits", 24);
156 uint mask = auth_peer_bits >= 32 // shifting by 32 is not defined 156 uint mask = auth_peer_bits >= 32 // shifting by 32 is not defined
157 ? 0xffffffff : (((1 << auth_peer_bits) - 1) << (32 - auth_peer_bits)); 157 ? 0xffffffff : (((1 << auth_peer_bits) - 1) << (32 - auth_peer_bits));
158 158
159 return (peeraddress.ip4Addr() & mask) == auth_peer; 159 return (peeraddress.ip4Addr() & mask) == auth_peer;
160} 160}
161 161
162bool SyncAuthentication::checkUser( const QString& user ) 162bool SyncAuthentication::checkUser( const QString& user )
163{ 163{
164 if ( user.isEmpty() ) return FALSE; 164 if ( user.isEmpty() ) return FALSE;
165 QString euser = loginName(); 165 QString euser = loginName();
166 return user == euser; 166 return user == euser;
167} 167}
168 168
169bool SyncAuthentication::checkPassword( const QString& password ) 169bool SyncAuthentication::checkPassword( const QString& password )
170{ 170{
171#ifdef ALLOW_UNIX_USER_FTP 171#ifdef ALLOW_UNIX_USER_FTP
172 // First, check system password... 172 // First, check system password...
173 173
174 struct passwd *pw = 0; 174 struct passwd *pw = 0;
175 struct spwd *spw = 0; 175 struct spwd *spw = 0;
176 176
177 pw = getpwuid( geteuid() ); 177 pw = getpwuid( geteuid() );
178 spw = getspnam( pw->pw_name ); 178 spw = getspnam( pw->pw_name );
179 179
180 QString cpwd = QString::fromLocal8Bit( pw->pw_passwd ); 180 QString cpwd = QString::fromLocal8Bit( pw->pw_passwd );
181 if ( cpwd == "x" && spw ) 181 if ( cpwd == "x" && spw )
182 cpwd = QString::fromLocal8Bit( spw->sp_pwdp ); 182 cpwd = QString::fromLocal8Bit( spw->sp_pwdp );
183 183
184 // Note: some systems use more than crypt for passwords. 184 // Note: some systems use more than crypt for passwords.
185 QString cpassword = QString::fromLocal8Bit( crypt( password.local8Bit(), cpwd.local8Bit() ) ); 185 QString cpassword = QString::fromLocal8Bit( crypt( password.local8Bit(), cpwd.local8Bit() ) );
186 if ( cpwd == cpassword ) 186 if ( cpwd == cpassword )
187 return TRUE; 187 return TRUE;
188#endif 188#endif
189 189
190 static int lastdenial=0; 190 static int lastdenial=0;
191 static int denials=0; 191 static int denials=0;
192 int now = time(0); 192 int now = time(0);
193 193
194 // Detect old Qtopia Desktop (no password) 194 // Detect old Qtopia Desktop (no password)
195 if ( password.isEmpty() ) { 195 if ( password.isEmpty() ) {
196 if ( denials < 1 || now > lastdenial+600 ) { 196 if ( denials < 1 || now > lastdenial+600 ) {
197 QMessageBox unauth( 197 QMessageBox unauth(
198 tr("Sync Connection"), 198 tr("Sync Connection"),
199 tr("<p>An unauthorized system is requesting access to this device." 199 tr("<p>An unauthorized system is requesting access to this device."
200 "<p>If you are using a version of Qtopia Desktop older than 1.5.1, " 200 "<p>If you are using a version of Qtopia Desktop older than 1.5.1, "
201 "please upgrade."), 201 "please upgrade."),
202 QMessageBox::Warning, 202 QMessageBox::Warning,
203 QMessageBox::Cancel, QMessageBox::NoButton, QMessageBox::NoButton, 203 QMessageBox::Cancel, QMessageBox::NoButton, QMessageBox::NoButton,
204 0, QString::null, TRUE, WStyle_StaysOnTop); 204 0, QString::null, TRUE, WStyle_StaysOnTop);
205 unauth.setButtonText(QMessageBox::Cancel, tr("Deny")); 205 unauth.setButtonText(QMessageBox::Cancel, tr("Deny"));
206 unauth.exec(); 206 unauth.exec();
207 207
208 denials++; 208 denials++;
209 lastdenial=now; 209 lastdenial=now;
210 } 210 }
211 return FALSE; 211 return FALSE;
212 } 212 }
213 213
214 // Second, check sync password... 214 // Second, check sync password...
215 215
216 static int lock=0; 216 static int lock=0;
217 if ( lock ) return FALSE; 217 if ( lock ) return FALSE;
218 218
219 ++lock; 219 ++lock;
220 if ( password.left(6) == "Qtopia" ) { 220
221 /*
222 * we need to support old Sync software and QtopiaDesktop
223 */
224 if ( password.left(6) == "Qtopia" || password.left(6) == "rootme" ) {
221 Config cfg( QPEApplication::qpeDir()+"/etc/Security.conf", Config::File ); 225 Config cfg( QPEApplication::qpeDir()+"/etc/Security.conf", Config::File );
222 cfg.setGroup("Sync"); 226 cfg.setGroup("Sync");
223 QStringList pwds = cfg.readListEntry("Passwords",' '); 227 QStringList pwds = cfg.readListEntry("Passwords",' ');
224 for (QStringList::ConstIterator it=pwds.begin(); it!=pwds.end(); ++it) { 228 for (QStringList::ConstIterator it=pwds.begin(); it!=pwds.end(); ++it) {
225#ifndef Q_OS_WIN32 229#ifndef Q_OS_WIN32
226 QString cpassword = QString::fromLocal8Bit( 230 QString cpassword = QString::fromLocal8Bit(
227 crypt( password.mid(8).local8Bit(), (*it).left(2).latin1() ) ); 231 crypt( password.mid(8).local8Bit(), (*it).left(2).latin1() ) );
228#else 232#else
229 // ### revise 233 // ### revise
230 QString cpassword(""); 234 QString cpassword("");
231#endif 235#endif
232 if ( *it == cpassword ) { 236 if ( *it == cpassword ) {
233 lock--; 237 lock--;
234 return TRUE; 238 return TRUE;
235 } 239 }
236 } 240 }
237 241
238 // Unrecognized system. Be careful... 242 // Unrecognized system. Be careful...
239 QMessageBox unrecbox( 243 QMessageBox unrecbox(
240 tr("Sync Connection"), 244 tr("Sync Connection"),
241 tr("<p>An unrecognized system is requesting access to this device." 245 tr("<p>An unrecognized system is requesting access to this device."
242 "<p>If you have just initiated a Sync for the first time, this is normal."), 246 "<p>If you have just initiated a Sync for the first time, this is normal."),
243 QMessageBox::Warning, 247 QMessageBox::Warning,
244 QMessageBox::Cancel, QMessageBox::Yes, QMessageBox::NoButton, 248 QMessageBox::Cancel, QMessageBox::Yes, QMessageBox::NoButton,
245 0, QString::null, TRUE, WStyle_StaysOnTop); 249 0, QString::null, TRUE, WStyle_StaysOnTop);
246 unrecbox.setButtonText(QMessageBox::Cancel, tr("Deny")); 250 unrecbox.setButtonText(QMessageBox::Cancel, tr("Deny"));
247 unrecbox.setButtonText(QMessageBox::Yes, tr("Allow")); 251 unrecbox.setButtonText(QMessageBox::Yes, tr("Allow"));
248 252
249 if ( (denials > 2 && now < lastdenial+600) 253 if ( (denials > 2 && now < lastdenial+600)
250 || unrecbox.exec() != QMessageBox::Yes) 254 || unrecbox.exec() != QMessageBox::Yes)
251 { 255 {
252 denials++; 256 denials++;
253 lastdenial=now; 257 lastdenial=now;
254 lock--; 258 lock--;
255 return FALSE; 259 return FALSE;
256 } else { 260 } else {
257 const char salty[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/."; 261 const char salty[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/.";
258 char salt[2]; 262 char salt[2];
259 salt[0]= salty[rand() % (sizeof(salty)-1)]; 263 salt[0]= salty[rand() % (sizeof(salty)-1)];
260 salt[1]= salty[rand() % (sizeof(salty)-1)]; 264 salt[1]= salty[rand() % (sizeof(salty)-1)];
261#ifndef Q_OS_WIN32 265#ifndef Q_OS_WIN32
262 QString cpassword = QString::fromLocal8Bit( 266 QString cpassword = QString::fromLocal8Bit(
263 crypt( password.mid(8).local8Bit(), salt ) ); 267 crypt( password.mid(8).local8Bit(), salt ) );
264#else 268#else
265 //### revise 269 //### revise
266 QString cpassword(""); 270 QString cpassword("");
267#endif 271#endif
268 denials=0; 272 denials=0;
269 pwds.prepend(cpassword); 273 pwds.prepend(cpassword);
270 cfg.writeEntry("Passwords",pwds,' '); 274 cfg.writeEntry("Passwords",pwds,' ');
271 lock--; 275 lock--;
272 return TRUE; 276 return TRUE;
273 } 277 }
274 } 278 }
275 lock--; 279 lock--;
276 280
277 return FALSE; 281 return FALSE;
278} 282}
279 283
280 284
281ServerPI::ServerPI( int socket, QObject *parent, const char* name ) 285ServerPI::ServerPI( int socket, QObject *parent, const char* name )
282 : QSocket( parent, name ) , dtp( 0 ), serversocket( 0 ), waitsocket( 0 ), 286 : QSocket( parent, name ) , dtp( 0 ), serversocket( 0 ), waitsocket( 0 ),
283 storFileSize(-1) 287 storFileSize(-1)
284{ 288{
285 state = Connected; 289 state = Connected;
286 290
287 setSocket( socket ); 291 setSocket( socket );
288 292
289 peerport = peerPort(); 293 peerport = peerPort();
290 peeraddress = peerAddress(); 294 peeraddress = peerAddress();
291 295
292#ifndef INSECURE 296#ifndef INSECURE
293 if ( !SyncAuthentication::isAuthorized(peeraddress) ) { 297 if ( !SyncAuthentication::isAuthorized(peeraddress) ) {
294 state = Forbidden; 298 state = Forbidden;
295 startTimer( 0 ); 299 startTimer( 0 );
296 } else 300 } else
297#endif 301#endif
298 { 302 {
299 connect( this, SIGNAL( readyRead() ), SLOT( read() ) ); 303 connect( this, SIGNAL( readyRead() ), SLOT( read() ) );
300 connect( this, SIGNAL( connectionClosed() ), SLOT( connectionClosed() ) ); 304 connect( this, SIGNAL( connectionClosed() ), SLOT( connectionClosed() ) );
301 305
302 passiv = FALSE; 306 passiv = FALSE;
303 for( int i = 0; i < 4; i++ ) 307 for( int i = 0; i < 4; i++ )
304 wait[i] = FALSE; 308 wait[i] = FALSE;
305 309
306 send( "220 Qtopia " QPE_VERSION " FTP Server" ); // No tr 310 send( "220 Qtopia " QPE_VERSION " FTP Server" ); // No tr
307 state = Wait_USER; 311 state = Wait_USER;
308 312
309 dtp = new ServerDTP( this ); 313 dtp = new ServerDTP( this );
310 connect( dtp, SIGNAL( completed() ), SLOT( dtpCompleted() ) ); 314 connect( dtp, SIGNAL( completed() ), SLOT( dtpCompleted() ) );
311 connect( dtp, SIGNAL( failed() ), SLOT( dtpFailed() ) ); 315 connect( dtp, SIGNAL( failed() ), SLOT( dtpFailed() ) );
312 connect( dtp, SIGNAL( error( int ) ), SLOT( dtpError( int ) ) ); 316 connect( dtp, SIGNAL( error( int ) ), SLOT( dtpError( int ) ) );
313 317
314 318
315 directory = QDir::currentDirPath(); 319 directory = QDir::currentDirPath();
316 320
317 static int p = 1024; 321 static int p = 1024;
318 322
319 while ( !serversocket || !serversocket->ok() ) { 323 while ( !serversocket || !serversocket->ok() ) {
320 delete serversocket; 324 delete serversocket;
321 serversocket = new ServerSocket( ++p, this ); 325 serversocket = new ServerSocket( ++p, this );
322 } 326 }
323 connect( serversocket, SIGNAL( newIncomming( int ) ), 327 connect( serversocket, SIGNAL( newIncomming( int ) ),
324 SLOT( newConnection( int ) ) ); 328 SLOT( newConnection( int ) ) );
325 } 329 }
326} 330}
327 331
328ServerPI::~ServerPI() 332ServerPI::~ServerPI()
329{ 333{
330 close(); 334 close();
331 dtp->close(); 335 dtp->close();
332 delete dtp; 336 delete dtp;
333 delete serversocket; 337 delete serversocket;
334} 338}
335 339
336bool ServerPI::verifyAuthorised() 340bool ServerPI::verifyAuthorised()
337{ 341{
338 if ( !SyncAuthentication::isAuthorized(peerAddress()) ) { 342 if ( !SyncAuthentication::isAuthorized(peerAddress()) ) {
339 state = Forbidden; 343 state = Forbidden;
340 return FALSE; 344 return FALSE;
341 } 345 }
342 return TRUE; 346 return TRUE;
343} 347}
344 348
345void ServerPI::connectionClosed() 349void ServerPI::connectionClosed()
346{ 350{
347 // qDebug( "Debug: Connection closed" ); 351 // qDebug( "Debug: Connection closed" );
348 emit connectionClosed(this); 352 emit connectionClosed(this);