void OwncloudSetupWizard::startWizard(bool intro) { // create the ocInfo object connect(ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)),SLOT(slotOwnCloudFound(QString,QString,QString,QString))); connect(ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)),SLOT(slotNoOwnCloudFound(QNetworkReply*))); connect(ownCloudInfo::instance(),SIGNAL(webdavColCreated(QNetworkReply::NetworkError)),SLOT(slotCreateRemoteFolderFinished(QNetworkReply::NetworkError))); MirallConfigFile cfgFile; QString url = cfgFile.ownCloudUrl(); if( !url.isEmpty() ) { _ocWizard->setOCUrl( url ); } #ifdef OWNCLOUD_CLIENT QString user = cfgFile.ownCloudUser(); if( !user.isEmpty() ) { _ocWizard->setOCUser( user ); } bool doStore = cfgFile.passwordStorageAllowed(); _ocWizard->setAllowPasswordStorage( doStore ); if (intro) _ocWizard->setStartId(OwncloudWizard::Page_oCWelcome); else _ocWizard->setStartId(OwncloudWizard::Page_oCSetup); #endif _ocWizard->restart(); _ocWizard->show(); }
void FolderWizardTargetPage::initializePage() { showWarn(); /* check the owncloud configuration file and query the ownCloud */ ownCloudInfo *ocInfo = ownCloudInfo::instance(); if( ocInfo->isConfigured() ) { connect( ocInfo, SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), SLOT(slotOwnCloudFound(QString,QString,QString,QString))); connect( ocInfo, SIGNAL(noOwncloudFound(QNetworkReply*)), SLOT(slotNoOwnCloudFound(QNetworkReply*))); connect( ocInfo, SIGNAL(ownCloudDirExists(QString,QNetworkReply*)), SLOT(slotDirCheckReply(QString,QNetworkReply*))); connect( ocInfo, SIGNAL(webdavColCreated(QNetworkReply::NetworkError)), SLOT(slotCreateRemoteFolderFinished( QNetworkReply::NetworkError ))); connect(_ui._buttCreateFolder, SIGNAL(clicked()), SLOT(slotCreateRemoteFolder())); ocInfo->checkInstallation(); _ui.OCFolderLineEdit->setEnabled( false ); QString dir = _ui.OCFolderLineEdit->text(); if( !dir.isEmpty() ) { slotFolderTextChanged( dir ); } } }
void Application::slotNoOwnCloudFound( QNetworkReply* reply ) { qDebug() << "** Application: NO ownCloud found!"; QString msg; if( reply ) { QString url( reply->url().toString() ); url.remove( QLatin1String("/status.php") ); msg = tr("<p>The %1 at %2 could not be reached.</p>").arg(_theme->appName()).arg( url ); msg += tr("<p>The detailed error message is<br/><tt>%1</tt></p>").arg( reply->errorString() ); } msg += tr("<p>Please check your configuration by clicking on the tray icon.</p>"); QMessageBox::warning(0, tr("%1 Connection Failed").arg(_theme->appName()), msg ); _actionAddFolder->setEnabled( false ); // Disconnect. disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), this, SLOT(slotOwnCloudFound(QString,QString,QString,QString))); disconnect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)), this, SLOT(slotNoOwnCloudFound(QNetworkReply*))); disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudDirExists(QString,QNetworkReply*)), this,SLOT(slotAuthCheck(QString,QNetworkReply*))); setupContextMenu(); }
void OwncloudSetupWizard::testOwnCloudConnect() { // write a temporary config. QDateTime now = QDateTime::currentDateTime(); // remove a possibly existing custom config. if( ! _configHandle.isEmpty() ) { // remove the old config file. MirallConfigFile oldConfig( _configHandle ); oldConfig.cleanupCustomConfig(); } _configHandle = now.toString(QLatin1String("MMddyyhhmmss")); MirallConfigFile cfgFile( _configHandle ); QString url = _ocWizard->field(QLatin1String("OCUrl")).toString(); if( url.isEmpty() ) return; if( !( url.startsWith(QLatin1String("https://")) || url.startsWith(QLatin1String("http://"))) ) { qDebug() << "url does not start with a valid protocol, assuming https."; url.prepend(QLatin1String("https://")); // FIXME: give a hint about the auto completion _ocWizard->setOCUrl(url); } cfgFile.writeOwncloudConfig( Theme::instance()->appName(), url, _ocWizard->field(QLatin1String("OCUser")).toString(), _ocWizard->field(QLatin1String("OCPasswd")).toString() ); // If there is already a config, take its proxy config. if( ownCloudInfo::instance()->isConfigured() ) { MirallConfigFile prevCfg; if( prevCfg.proxyType() != QNetworkProxy::DefaultProxy ) { cfgFile.setProxyType( prevCfg.proxyType(), prevCfg.proxyHostName(), prevCfg.proxyPort(), prevCfg.proxyUser(), prevCfg.proxyPassword() ); } } // now start ownCloudInfo to check the connection. ownCloudInfo* info = ownCloudInfo::instance(); info->setCustomConfigHandle( _configHandle ); if( info->isConfigured() ) { // reset the SSL Untrust flag to let the SSL dialog appear again. info->resetSSLUntrust(); connect(info, SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), SLOT(slotOwnCloudFound(QString,QString,QString,QString))); connect(info, SIGNAL(noOwncloudFound(QNetworkReply*)), SLOT(slotNoOwnCloudFound(QNetworkReply*))); _checkInstallationRequest = info->checkInstallation(); } else { qDebug() << " ownCloud seems not to be configured, can not start test connect."; } }
// status.php could not be loaded. void ConnectionValidator::slotNoStatusFound(QNetworkReply *reply) { // disconnect from ownCloudInfo disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), this, SLOT(slotStatusFound(QString,QString,QString,QString))); disconnect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)), this, SLOT(slotNoStatusFound(QNetworkReply*))); _errors.append( reply->errorString() ); emit connectionResult( StatusNotFound ); }
void ConnectionValidator::checkConnection() { if( ownCloudInfo::instance()->isConfigured() ) { connect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), SLOT(slotStatusFound(QString,QString,QString,QString))); connect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)), SLOT(slotNoStatusFound(QNetworkReply*))); // checks for status.php ownCloudInfo::instance()->checkInstallation(); } else { emit connectionResult( NotConfigured ); } }
void Application::slotStartFolderSetup( int result ) { if( result == QDialog::Accepted ) { if( ownCloudInfo::instance()->isConfigured() ) { connect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), SLOT(slotOwnCloudFound(QString,QString,QString,QString))); connect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)), SLOT(slotNoOwnCloudFound(QNetworkReply*))); connect( ownCloudInfo::instance(),SIGNAL(ownCloudDirExists(QString,QNetworkReply*)), this,SLOT(slotAuthCheck(QString,QNetworkReply*))); ownCloudInfo::instance()->checkInstallation(); } else {
void OwncloudSetupWizard::slotNoOwnCloudFound( QNetworkReply *err ) { disconnect(ownCloudInfo::instance(), SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), this, SLOT(slotOwnCloudFound(QString,QString,QString,QString))); disconnect(ownCloudInfo::instance(), SIGNAL(noOwncloudFound(QNetworkReply*)), this, SLOT(slotNoOwnCloudFound(QNetworkReply*))); _ocWizard->displayError(tr("Failed to connect to %1:<br/>%2"). arg(Theme::instance()->appNameGUI()).arg(err->errorString())); // remove the config file again MirallConfigFile cfgFile( _configHandle ); cfgFile.cleanupCustomConfig(); finalizeSetup( false ); }
void OwncloudSetupWizard::slotOwnCloudFound( const QString& url, const QString& infoString, const QString& version, const QString& ) { disconnect(ownCloudInfo::instance(), SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), this, SLOT(slotOwnCloudFound(QString,QString,QString,QString))); disconnect(ownCloudInfo::instance(), SIGNAL(noOwncloudFound(QNetworkReply*)), this, SLOT(slotNoOwnCloudFound(QNetworkReply*))); _ocWizard->appendToConfigurationLog(tr("<font color=\"green\">Successfully connected to %1: %2 version %3 (%4)</font><br/><br/>") .arg( url ).arg(Theme::instance()->appNameGUI()).arg(infoString).arg(version)); // enable the finish button. _ocWizard->button( QWizard::FinishButton )->setEnabled( true ); // start the local folder creation setupLocalSyncFolder(); }
void Application::slotStartFolderSetup( int result ) { if( result == QDialog::Accepted ) { if( ownCloudInfo::instance()->isConfigured() ) { connect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), SLOT(slotOwnCloudFound(QString,QString,QString,QString))); connect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)), SLOT(slotNoOwnCloudFound(QNetworkReply*))); ownCloudInfo::instance()->checkInstallation(); } else { _owncloudSetupWizard->startWizard(true); // with intro } } else { qDebug() << "Setup Wizard was canceled. No reparsing of config."; } }
void Application::slotNoOwnCloudFound( QNetworkReply* reply ) { Q_UNUSED(reply) qDebug() << "** Application: NO ownCloud found! Going offline"; _actionAddFolder->setEnabled( false ); // Disconnect. disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), this, SLOT(slotOwnCloudFound(QString,QString,QString,QString))); disconnect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)), this, SLOT(slotNoOwnCloudFound(QNetworkReply*))); disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudDirExists(QString,QNetworkReply*)), this,SLOT(slotAuthCheck(QString,QNetworkReply*))); setupContextMenu(); QTimer::singleShot( 30*1000, this, SLOT( slotStartFolderSetup() )); }
void OwncloudSetupWizard::testOwnCloudConnect() { // write a config. Note that it has to be removed on fail?! MirallConfigFile cfgFile; cfgFile.writeOwncloudConfig( QString::fromLocal8Bit("ownCloud"), _ocWizard->field("OCUrl").toString(), _ocWizard->field("OCUser").toString(), _ocWizard->field("OCPasswd").toString() ); // now start ownCloudInfo to check the connection. if( _ocInfo ) delete _ocInfo; _ocInfo = new ownCloudInfo( QString(), this ); if( _ocInfo->isConfigured() ) { connect(_ocInfo,SIGNAL(ownCloudInfoFound(QString,QString)),SLOT(slotOwnCloudFound(QString,QString))); connect(_ocInfo,SIGNAL(noOwncloudFound(QNetworkReply::NetworkError )),SLOT(slotNoOwnCloudFound(QNetworkReply::NetworkError))); _ocInfo->checkInstallation(); } else { qDebug() << " ownCloud seems not to be configured, can not start test connect."; } }
void Application::slotOwnCloudFound( const QString& url, const QString& versionStr, const QString& version, const QString& edition) { qDebug() << "** Application: ownCloud found: " << url << " with version " << versionStr << "(" << version << ")"; // now check the authentication MirallConfigFile cfgFile; cfgFile.setOwnCloudVersion( version ); // disconnect from ownCloudInfo disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), this, SLOT(slotOwnCloudFound(QString,QString,QString,QString))); disconnect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)), this, SLOT(slotNoOwnCloudFound(QNetworkReply*))); if( version.startsWith("4.0") ) { QMessageBox::warning(0, tr("%1 Server Mismatch").arg(_theme->appNameGUI()), tr("<p>The configured server for this client is too old.</p>" "<p>Please update to the latest %1 server and restart the client.</p>").arg(_theme->appNameGUI())); return; } QTimer::singleShot( 0, this, SLOT( slotFetchCredentials() )); }
void FolderWizardTargetPage::initializePage() { slotToggleItems(); showWarn(); /* check the owncloud configuration file and query the ownCloud */ ownCloudInfo *ocInfo = ownCloudInfo::instance(); if( ocInfo->isConfigured() ) { connect(ocInfo,SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)),SLOT(slotOwnCloudFound(QString,QString,QString,QString))); connect(ocInfo,SIGNAL(noOwncloudFound(QNetworkReply*)),SLOT(slotNoOwnCloudFound(QNetworkReply*))); connect(_ui._buttCreateFolder, SIGNAL(clicked()), SLOT(slotCreateRemoteFolder())); ocInfo->checkInstallation(); } else { _ui.OCRadioBtn->setEnabled( false ); _ui.OCFolderLineEdit->setEnabled( false ); } QString dir = _ui.OCFolderLineEdit->text(); if( !dir.isEmpty() ) { slotFolderTextChanged( dir ); } }
void ConnectionValidator::slotStatusFound( const QString& url, const QString& versionStr, const QString& version, const QString& edition) { // status.php was found. qDebug() << "** Application: ownCloud found: " << url << " with version " << versionStr << "(" << version << ")"; // now check the authentication MirallConfigFile cfgFile(_connection); cfgFile.setOwnCloudVersion( version ); // disconnect from ownCloudInfo disconnect( ownCloudInfo::instance(),SIGNAL(ownCloudInfoFound(QString,QString,QString,QString)), this, SLOT(slotStatusFound(QString,QString,QString,QString))); disconnect( ownCloudInfo::instance(),SIGNAL(noOwncloudFound(QNetworkReply*)), this, SLOT(slotNoStatusFound(QNetworkReply*))); if( version.startsWith("4.0") ) { _errors.append( tr("<p>The configured server for this client is too old.</p>" "<p>Please update to the latest server and restart the client.</p>")); emit connectionResult( ServerVersionMismatch ); return; } QTimer::singleShot( 0, this, SLOT( slotFetchCredentials() )); }
// // There have been problems with the finish-signal coming from the networkmanager. // To avoid that, the reply-signals were connected and the data is taken from the // sender() method. // void ownCloudInfo::slotReplyFinished() { QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); QSslConfiguration sslConfig = reply->sslConfiguration(); if (!sslConfig.isNull()) { QMutexLocker lock(&_certChainMutex); _certificateChain = sslConfig.peerCertificateChain(); } if( ! reply ) { qDebug() << "ownCloudInfo: Reply empty!"; return; } // Detect redirect url QUrl possibleRedirUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); /* We'll deduct if the redirection is valid in the redirectUrl function */ if (!possibleRedirUrl.isEmpty() && _redirectCount++ > 10) { // Are we in a redirect loop qDebug() << "Redirect loop while redirecting to" << possibleRedirUrl; possibleRedirUrl.clear(); } if(!possibleRedirUrl.isEmpty()) { QString configHandle; qDebug() << "Redirected to " << possibleRedirUrl; // We'll do another request to the redirection url. // an empty config handle is ok for the default config. if( _configHandleMap.contains(reply) ) { configHandle = _configHandleMap[reply]; qDebug() << "Redirect: Have a custom config handle: " << configHandle; } QString path = _directories[reply]; if (path.isEmpty()) { path = QLatin1String("status.php"); } else { path.prepend( QLatin1String(WEBDAV_PATH) ); } qDebug() << "This path was redirected: " << path; QString newUrl = possibleRedirUrl.toString(); if( !path.isEmpty() && newUrl.endsWith( path )) { // cut off the trailing path newUrl.chop( path.length() ); _urlRedirectedTo = newUrl; qDebug() << "Updated url to" << newUrl; getRequest( possibleRedirUrl ); } else { qDebug() << "WRN: Path is not part of the redirect URL. NO redirect."; } reply->deleteLater(); _directories.remove(reply); _configHandleMap.remove(reply); return; } // TODO: check if this is always the correct encoding const QString version = QString::fromUtf8( reply->readAll() ); const QString url = reply->url().toString(); QString plainUrl(url); plainUrl.remove( QLatin1String("/status.php")); QString info( version ); if( url.endsWith( QLatin1String("status.php")) ) { // it was a call to status.php if( reply->error() == QNetworkReply::NoError && info.isEmpty() ) { // This seems to be a bit strange behaviour of QNetworkAccessManager. // It calls the finised slot multiple times but only the first read wins. // That happend when the code connected the finished signal of the manager. // It did not happen when the code connected to the reply finish signal. qDebug() << "WRN: NetworkReply with not content but also no error! " << reply; reply->deleteLater(); return; } qDebug() << "status.php returns: " << info << " " << reply->error() << " Reply: " << reply; if( info.contains(QLatin1String("installed")) && info.contains(QLatin1String("version")) && info.contains(QLatin1String("versionstring")) ) { info.remove(0,1); // remove first char which is a "{" info.remove(-1,1); // remove the last char which is a "}" QStringList li = info.split( QLatin1Char(',') ); QString versionStr; QString version; QString edition; foreach ( const QString& infoString, li ) { QStringList touple = infoString.split( QLatin1Char(':')); QString key = touple[0]; key.remove(QLatin1Char('"')); QString val = touple[1]; val.remove(QLatin1Char('"')); if( key == QLatin1String("versionstring") ) { // get the versionstring out. versionStr = val; } else if( key == QLatin1String( "version") ) { // get version out version = val; } else if( key == QLatin1String( "edition") ) { // get version out edition = val; } else if(key == QLatin1String("installed")) { // Silently ignoring "installed = true" information } else { qDebug() << "Unknown info from ownCloud status.php: "<< key << "=" << val; } } emit ownCloudInfoFound( plainUrl, versionStr, version, edition ); } else {
// // There have been problems with the finish-signal coming from the networkmanager. // To avoid that, the reply-signals were connected and the data is taken from the // sender() method. // void ownCloudInfo::slotReplyFinished() { QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); if( ! reply ) { qDebug() << "ownCloudInfo: Reply empty!"; return; } // Detect redirect url QVariant possibleRedirUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); /* We'll deduct if the redirection is valid in the redirectUrl function */ _urlRedirectedTo = redirectUrl( possibleRedirUrl.toUrl(), _urlRedirectedTo ); if(!_urlRedirectedTo.isEmpty()) { QString configHandle; qDebug() << "Redirected to " << possibleRedirUrl; // We'll do another request to the redirection url. // an empty config handle is ok for the default config. if( _configHandleMap.contains(reply) ) { configHandle = _configHandleMap[reply]; qDebug() << "Redirect: Have a custom config handle: " << configHandle; } QString path = _directories[reply]; qDebug() << "This path was redirected: " << path; MirallConfigFile cfgFile( configHandle ); QString newUrl = _urlRedirectedTo.toString(); if( newUrl.endsWith( path )) { // cut off the trailing path newUrl.chop( path.length() ); cfgFile.setOwnCloudUrl( _connection, newUrl ); qDebug() << "Update the config file url to " << newUrl; getRequest( path, false ); // FIXME: Redirect for webdav! reply->deleteLater(); return; } else { qDebug() << "WRN: Path is not part of the redirect URL. NO redirect."; } } _urlRedirectedTo.clear(); // TODO: check if this is always the correct encoding const QString version = QString::fromUtf8( reply->readAll() ); const QString url = reply->url().toString(); QString plainUrl(url); plainUrl.remove( QLatin1String("/status.php")); QString info( version ); if( url.endsWith( QLatin1String("status.php")) ) { // it was a call to status.php if( reply->error() == QNetworkReply::NoError && info.isEmpty() ) { // This seems to be a bit strange behaviour of QNetworkAccessManager. // It calls the finised slot multiple times but only the first read wins. // That happend when the code connected the finished signal of the manager. // It did not happen when the code connected to the reply finish signal. qDebug() << "WRN: NetworkReply with not content but also no error! " << reply; reply->deleteLater(); return; } qDebug() << "status.php returns: " << info << " " << reply->error() << " Reply: " << reply; if( info.contains(QLatin1String("installed")) && info.contains(QLatin1String("version")) && info.contains(QLatin1String("versionstring")) ) { info.remove(0,1); // remove first char which is a "{" info.remove(-1,1); // remove the last char which is a "}" QStringList li = info.split( QLatin1Char(',') ); QString versionStr; QString version; QString edition; foreach ( const QString& infoString, li ) { QStringList touple = infoString.split( QLatin1Char(':')); QString key = touple[0]; key.remove(QLatin1Char('"')); QString val = touple[1]; val.remove(QLatin1Char('"')); if( key == QLatin1String("versionstring") ) { // get the versionstring out. versionStr = val; } else if( key == QLatin1String( "version") ) { // get version out version = val; } else if( key == QLatin1String( "edition") ) { // get version out edition = val; } else { qDebug() << "Unknown info from ownCloud status.php: "<< key << "=" << val; } } emit ownCloudInfoFound( plainUrl, versionStr, version, edition ); } else {