-rw-r--r-- | core/settings/security/security.cpp | 106 | ||||
-rw-r--r-- | core/settings/security/security.h | 5 | ||||
-rw-r--r-- | core/settings/security/securitybase.ui | 39 |
3 files changed, 66 insertions, 84 deletions
diff --git a/core/settings/security/security.cpp b/core/settings/security/security.cpp index 34f7e50..4eddb55 100644 --- a/core/settings/security/security.cpp +++ b/core/settings/security/security.cpp @@ -1,438 +1,440 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "security.h" #include <qpe/qpeapplication.h> #include <qpe/config.h> #include <qpe/password.h> #include <qpe/qpedialog.h> #include <qpe/qcopenvelope_qws.h> #include <qcheckbox.h> #include <qpushbutton.h> #include <qcombobox.h> #include <qmessagebox.h> #include <qfile.h> #include <qtextstream.h> Security::Security( QWidget* parent, const char* name, WFlags fl ) : SecurityBase( parent, name, TRUE, WStyle_ContextHelp ) { valid=FALSE; Config cfg("Security"); cfg.setGroup("Passcode"); passcode = cfg.readEntry("passcode"); passcode_poweron->setChecked(cfg.readBoolEntry("passcode_poweron",FALSE)); cfg.setGroup("Sync"); int auth_peer = cfg.readNumEntry("auth_peer",0xc0a88100);//new default 192.168.129.0/24 int auth_peer_bits = cfg.readNumEntry("auth_peer_bits",24); selectNet(auth_peer,auth_peer_bits,TRUE); - + connect(syncnet, SIGNAL(textChanged(const QString&)), this, SLOT(setSyncNet(const QString&))); - cfg.setGroup("Sync"); - QString sa = cfg.readEntry("syncapp","Qtopia"); - for (int i=0; i<syncapp->count(); i++) { - if ( syncapp->text(i) == sa ) { - syncapp->setCurrentItem(i); - } - } - + /* cfg.setGroup("Remote"); if ( telnetAvailable() ) telnet->setChecked(cfg.readEntry("allow_telnet")); else telnet->hide(); if ( sshAvailable() ) ssh->setChecked(cfg.readEntry("allow_ssh")); else ssh->hide(); */ QString configFile = QPEApplication::qpeDir() + "/etc/opie-login.conf"; Config loginCfg(configFile,Config::File); - + loginCfg.setGroup("General"); autoLoginName=loginCfg.readEntry("AutoLogin",""); if (autoLoginName.stripWhiteSpace().isEmpty()) { autoLogin=false; } else { autoLogin=true; } cfg.setGroup("SyncMode"); int mode = cfg.readNumEntry("Mode",2); // Default to Sharp - syncModeCombo->setCurrentItem( mode - 1 ); - - //since nobody knows what this is and it doesn't do anything, i'll hide it # CoreDump - // is this work-in-progress or can it be removed? - syncModeCombo->hide(); + switch( mode ) { + case 0x01: + syncModeCombo->setCurrentItem( 0 ); + break; + case 0x02: + default: + syncModeCombo->setCurrentItem( 1 ); + break; + case 0x04: + syncModeCombo->setCurrentItem( 2 ); + break; + } + connect(autologinToggle, SIGNAL(toggled(bool)), this, SLOT(toggleAutoLogin(bool))); connect(userlist, SIGNAL(activated(int)), this, SLOT(changeLoginName(int))); connect(changepasscode,SIGNAL(clicked()), this, SLOT(changePassCode())); connect(clearpasscode,SIGNAL(clicked()), this, SLOT(clearPassCode())); - connect(syncapp,SIGNAL(activated(int)), this, SLOT(changeSyncApp())); - connect(restoredefaults,SIGNAL(clicked()), this, SLOT(restoreDefaults())); + connect(restoredefaults,SIGNAL(clicked()), this, SLOT(restoreDefaults())); connect(deleteentry,SIGNAL(clicked()), this, SLOT(deleteListEntry())); - + loadUsers(); updateGUI(); dl = new QPEDialogListener(this); QPEApplication::showDialog( this ); } Security::~Security() { } -void Security::deleteListEntry() +void Security::deleteListEntry() { syncnet->removeItem(syncnet->currentItem()); } void Security::restoreDefaults() -{ +{ QMessageBox unrecbox( tr("Attention"), tr( "<p>All user-defined net ranges will be lost."), QMessageBox::Warning, QMessageBox::Cancel, QMessageBox::Yes, QMessageBox::NoButton, 0, QString::null, TRUE, WStyle_StaysOnTop); unrecbox.setButtonText(QMessageBox::Cancel, tr("Cancel")); unrecbox.setButtonText(QMessageBox::Yes, tr("Ok")); - if ( unrecbox.exec() == QMessageBox::Yes) + if ( unrecbox.exec() == QMessageBox::Yes) { syncnet->clear(); insertDefaultRanges(); - } + } + syncModeCombo->setCurrentItem( 2 ); } void Security::insertDefaultRanges() -{ +{ syncnet->insertItem( tr( "192.168.129.0/24" ) ); syncnet->insertItem( tr( "192.168.1.0/24" ) ); syncnet->insertItem( tr( "192.168.0.0/16" ) ); syncnet->insertItem( tr( "172.16.0.0/12" ) ); syncnet->insertItem( tr( "10.0.0.0/8" ) ); syncnet->insertItem( tr( "1.0.0.0/8" ) ); syncnet->insertItem( tr( "Any" ) ); syncnet->insertItem( tr( "None" ) ); } void Security::updateGUI() { bool empty = passcode.isEmpty(); changepasscode->setText( empty ? tr("Set passcode" ) : tr("Change passcode" ) ); passcode_poweron->setEnabled( !empty ); clearpasscode->setEnabled( !empty ); autologinToggle->setChecked(autoLogin); - userlist->setEnabled(autoLogin); + userlist->setEnabled(autoLogin); } void Security::show() { //valid=FALSE; setEnabled(FALSE); SecurityBase::show(); if ( passcode.isEmpty() ) { // could insist... //changePassCode(); //if ( passcode.isEmpty() ) //reject(); } else { if (!valid) // security passcode was not asked yet, so ask now { QString pc = enterPassCode(tr("Enter passcode")); if ( pc != passcode ) { QMessageBox::critical(this, tr("Passcode incorrect"), tr("The passcode entered is incorrect.\nAccess denied")); reject(); return; } } } setEnabled(TRUE); valid=TRUE; } void Security::accept() { applySecurity(); QDialog::accept(); QCopEnvelope env("QPE/System", "securityChanged()" ); } void Security::done(int r) { QDialog::done(r); close(); } void Security::selectNet(int auth_peer,int auth_peer_bits, bool update) { QString sn; if ( auth_peer_bits == 0 && auth_peer == 0 ) { sn = tr("Any"); } else if ( auth_peer_bits == 32 && auth_peer == 0 ) { sn = tr("None"); } else { sn = QString::number((auth_peer>>24)&0xff) + "." + QString::number((auth_peer>>16)&0xff) + "." + QString::number((auth_peer>>8)&0xff) + "." + QString::number((auth_peer>>0)&0xff) + "/" + QString::number(auth_peer_bits); } //insert user-defined list of netranges upon start if (update) { //User selected/active netrange first syncnet->insertItem( tr( sn ) ); Config cfg("Security"); cfg.setGroup("Sync"); //set up defaults if needed, if someone manually deletes net0 he'll get a suprise hehe QString test = cfg.readEntry("net0",""); if (test.isEmpty()) { insertDefaultRanges(); } else { // 10 ought to be enough for everybody... :) // If you need more, don't forget to edit applySecurity() as well bool already_there=FALSE; for (int i=0; i<10; i++) { QString target, netrange; target.sprintf("net%d", i); netrange = cfg.readEntry(target,""); if (! netrange.isEmpty()){ //make sure we have no "twin" entries for (int i=0; i<syncnet->count(); i++) { if ( syncnet->text(i) == netrange ) { - already_there=TRUE; + already_there=TRUE; } } if (! already_there) { syncnet->insertItem( tr( netrange ) ); } else { already_there=FALSE; - } - } + } + } } - } - } - + } + } + for (int i=0; i<syncnet->count(); i++) { if ( syncnet->text(i).left(sn.length()) == sn ) { syncnet->setCurrentItem(i); return; } } qDebug("No match for \"%s\"",sn.latin1()); } void Security::parseNet(const QString& sn,int& auth_peer,int& auth_peer_bits) { auth_peer=0; if ( sn == tr("Any") ) { auth_peer = 0; auth_peer_bits = 0; } else if ( sn == tr("None") ) { auth_peer = 0; auth_peer_bits = 32; } else { int x=0; for (int i=0; i<4; i++) { int nx = sn.find(QChar(i==3 ? '/' : '.'),x); auth_peer = (auth_peer<<8)|sn.mid(x,nx-x).toInt(); x = nx+1; } uint n = (uint)sn.find(' ',x)-x; auth_peer_bits = sn.mid(x,n).toInt(); } } void Security::loadUsers ( void ) { QFile passwd("/etc/passwd"); if ( passwd.open(IO_ReadOnly) ) { QTextStream t( &passwd ); QString s; QStringList account; while ( !t.eof() ) { account = QStringList::split(':',t.readLine()); // Hide disabled accounts if (*account.at(1)!="*") { userlist->insertItem(*account.at(0)); // Highlight this item if it is set to autologinToggle if ( *account.at(0) == autoLoginName) userlist->setCurrentItem(userlist->count()-1); } } passwd.close(); } } void Security::toggleAutoLogin(bool val) { autoLogin=val; userlist->setEnabled(val); if (!autoLogin) autoLoginName=userlist->currentText(); } void Security::setSyncNet(const QString& sn) { int auth_peer,auth_peer_bits; parseNet(sn,auth_peer,auth_peer_bits); selectNet(auth_peer,auth_peer_bits,FALSE); } void Security::applySecurity() { if ( valid ) { Config cfg("Security"); cfg.setGroup("Passcode"); cfg.writeEntry("passcode",passcode); cfg.writeEntry("passcode_poweron",passcode_poweron->isChecked()); cfg.setGroup("Sync"); int auth_peer=0; int auth_peer_bits; QString sn = syncnet->currentText(); parseNet(sn,auth_peer,auth_peer_bits); - + //this is the *selected* (active) net range cfg.writeEntry("auth_peer",auth_peer); cfg.writeEntry("auth_peer_bits",auth_peer_bits); - + //write back all other net ranges in *cleartext* for (int i=0; i<10; i++) { QString target; target.sprintf("net%d", i); cfg.writeEntry(target,syncnet->text(i)); } - - cfg.writeEntry("syncapp",syncapp->currentText()); - + +#ifdef ODP + #error "Use 0,1,2 and use Launcher" +#endif + /* keep the old code so we don't use currentItem directly */ + int value = 0x02; + switch( syncModeCombo->currentItem() ) { + case 0: + value = 0x01; + break; + case 1: + value = 0x02; + break; + case 2: + value = 0x04; + break; + } + cfg.setGroup("SyncMode"); + cfg.writeEntry( "Mode", value ); + /* cfg.setGroup("Remote"); if ( telnetAvailable() ) cfg.writeEntry("allow_telnet",telnet->isChecked()); if ( sshAvailable() ) cfg.writeEntry("allow_ssh",ssh->isChecked()); // ### write ssh/telnet sys config files */ QString configFile = QPEApplication::qpeDir() + "/etc/opie-login.conf"; Config loginCfg(configFile,Config::File); loginCfg.setGroup("General"); if (autoLogin) { loginCfg.writeEntry("AutoLogin",autoLoginName); } else { loginCfg.removeEntry("AutoLogin"); } } } -void Security::changeSyncApp() -{ - // Don't say i didn't tell ya - if (syncapp->currentText() == "IntelliSync") { - QMessageBox attn( - tr("WARNING"), - tr("<p>Selecting IntelliSync here will disable the FTP password." - "<p>Every machine in your netrange will be able to sync with " - "your Zaurus!"), - QMessageBox::Warning, - QMessageBox::Cancel, QMessageBox::NoButton, QMessageBox::NoButton, - 0, QString::null, TRUE, WStyle_StaysOnTop); - attn.setButtonText(QMessageBox::Cancel, tr("Ok")); - attn.exec(); - } - updateGUI(); -} + void Security::changeLoginName( int idx ) { autoLoginName = userlist->text(idx);; updateGUI(); } void Security::changePassCode() { QString new1; QString new2; do { new1 = enterPassCode(tr("Enter new passcode")); if ( new1.isNull() ) return; new2 = enterPassCode(tr("Re-enter new passcode")); if ( new2.isNull() ) return; } while (new1 != new2); passcode = new1; updateGUI(); } void Security::clearPassCode() { passcode = QString::null; updateGUI(); } QString Security::enterPassCode(const QString& prompt) { return Password::getPassword(prompt); } bool Security::telnetAvailable() const { // ### not implemented return FALSE; } bool Security::sshAvailable() const { // ### not implemented return FALSE; } diff --git a/core/settings/security/security.h b/core/settings/security/security.h index 72aa352..ed25ce1 100644 --- a/core/settings/security/security.h +++ b/core/settings/security/security.h @@ -1,75 +1,74 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef SECURITY_H #define SECURITY_H #include "securitybase.h" class QPEDialogListener; class Security : public SecurityBase -{ +{ Q_OBJECT public: static QString appName() { return QString::fromLatin1("security"); } Security( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~Security(); void show(); protected: void accept(); void applySecurity(); void done(int); private slots: void changePassCode(); void clearPassCode(); void setSyncNet(const QString&); void changeLoginName(int); void toggleAutoLogin(bool); - void changeSyncApp(); void restoreDefaults(); void insertDefaultRanges(); void deleteListEntry(); private: void loadUsers(void); bool telnetAvailable() const; bool sshAvailable() const; void updateGUI(); static void parseNet(const QString& sn,int& auth_peer,int& auth_peer_bits); void selectNet(int auth_peer,int auth_peer_bits,bool update); - + QString enterPassCode(const QString&); QString passcode; bool valid; bool autoLogin; QString autoLoginName; QPEDialogListener *dl; }; #endif // SECURITY_H diff --git a/core/settings/security/securitybase.ui b/core/settings/security/securitybase.ui index 1769ae1..dcf1d6b 100644 --- a/core/settings/security/securitybase.ui +++ b/core/settings/security/securitybase.ui @@ -1,78 +1,78 @@ <!DOCTYPE UI><UI> <class>SecurityBase</class> <widget> <class>QDialog</class> <property stdset="1"> <name>name</name> <cstring>SecurityBase</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> - <width>309</width> + <width>327</width> <height>483</height> </rect> </property> <property stdset="1"> <name>caption</name> <string>Security Settings</string> </property> <property> <name>layoutMargin</name> </property> <property> <name>layoutSpacing</name> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>0</number> </property> <widget> <class>QTabWidget</class> <property stdset="1"> <name>name</name> <cstring>TabWidget2</cstring> </property> <property> <name>layoutMargin</name> </property> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>tab</cstring> </property> <attribute> <name>title</name> <string>Passcode</string> </attribute> <vbox> <property stdset="1"> <name>margin</name> <number>6</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QGroupBox</class> <property stdset="1"> <name>name</name> <cstring>GroupBox4</cstring> </property> <property stdset="1"> <name>title</name> <string>Passcode</string> </property> <vbox> <property stdset="1"> <name>margin</name> <number>11</number> @@ -405,119 +405,100 @@ If unsure, select "Any".</string> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>deleteentry</cstring> </property> <property stdset="1"> <name>text</name> <string>Delete Entry</string> </property> <property> <name>whatsThis</name> <string>Delete the selected net range from the list If you press this button, the currently selected net range will be deleted from the list of net ranges. If you hit this button in error, the button "Restore Defaults" will restore the list to the state it has been when you initially booted your Zaurus.</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>restoredefaults</cstring> </property> <property stdset="1"> <name>text</name> <string>Restore Defaults</string> </property> <property> <name>whatsThis</name> <string>This button will restore the list of net ranges to the defaults. Beware that all manually entered net ranges will be lost!</string> </property> </widget> </hbox> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel2</cstring> </property> <property stdset="1"> <name>text</name> <string>Select your sync software</string> </property> </widget> <widget> <class>QComboBox</class> <item> <property> <name>text</name> - <string>QTopia</string> - </property> - </item> - <item> - <property> - <name>text</name> - <string>IntelliSync</string> - </property> - </item> - <property stdset="1"> - <name>name</name> - <cstring>syncapp</cstring> - </property> - <property> - <name>whatsThis</name> - <string>This option changes the login behaviour of the internal FTP server. - -If you have problems syncing, try the "IntelliSync" setting, which will accept any password you throw at the sync (FTP) port. - -The default is Qtopia. It will let you log in with username "root" and password "Qtopia". The password is CaSeSeNsItIvE.</string> - </property> - </widget> - <widget> - <class>QComboBox</class> - <item> - <property> - <name>text</name> <string>Qtopia 1.7</string> </property> </item> <item> <property> <name>text</name> <string>Opie 1.0</string> </property> </item> <item> <property> <name>text</name> - <string>Both</string> + <string>IntelliSync</string> </property> </item> <property stdset="1"> <name>name</name> <cstring>syncModeCombo</cstring> </property> + <property> + <name>whatsThis</name> + <string>Alter the Sync Protocol to tweak for the different devices. + IntelliSync will disable the password check but you'll be prompted to accept the connection. + Opie1.0 will be compatible with QtopiaDesktop, MultiSync and KitchenSync + Qtopia1.7 will alter the way data is send to the client and will not work with older clients. + </string> + </property> </widget> </vbox> </widget> </grid> </widget> </widget> </vbox> </widget> </UI> |