Beispiel #1
0
void ConnectionValidator::slotStatusFound(const QUrl&url, const QVariantMap &info)
{
    // status.php was found.
    qDebug() << "** Application: ownCloud found: "
             << url << " with version "
             << CheckServerJob::versionString(info)
             << "(" << CheckServerJob::version(info) << ")";

    QString version = CheckServerJob::version(info);
    _account->setServerVersion(version);

    if (version.contains('.') && version.split('.')[0].toInt() < 5) {
        _errors.append( tr("The configured server for this client is too old") );
        _errors.append( tr("Please update to the latest server and restart the client.") );
        reportResult( ServerVersionMismatch );
        return;
    }

    // now check the authentication
    AbstractCredentials *creds = _account->credentials();
    if (creds->ready()) {
        QTimer::singleShot( 0, this, SLOT( checkAuthentication() ));
    } else {
        // We can't proceed with the auth check because we don't have credentials.
        // Fetch them now! Once fetched, a new connectivity check will be
        // initiated anyway.
        creds->fetch();

        // no result is reported
        deleteLater();
    }
}
Beispiel #2
0
// Обрабатываем новое сообщение
int handleEvent(int fd) {
    struct Connection *connection = getConnection(fd);
    if (connection == NULL) {
        fprintf(stderr, "Error: connection from epoll wasn't found in list\n");
        return -1;
    }
    if (checkConnectionTimeout(connection) == 1) {
        return 0;
    }
    if (checkAuthentication(connection) > 0) {
        passAuthentication(connection);
    } else {
        if (connection->ptm == -1) {
            if (createPty(connection) == -1) {
                fprintf(stderr, "Error: creating new pty\n");
                return -1;
            }
        }
        if (fd == connection->connectionfd) {
            sendMessage(connection->ptm, connection->connectionfd);
        } else {
            sendMessage(connection->connectionfd, connection->ptm);
        }
    }
    return 0;
}
Beispiel #3
0
void ConnectionValidator::slotStatusFound(const QUrl&url, const QVariantMap &info)
{
    // status.php was found.
    qDebug() << "** Application: ownCloud found: "
             << url << " with version "
             << CheckServerJob::versionString(info)
             << "(" << CheckServerJob::version(info) << ")";

    QString version = CheckServerJob::version(info);
    _account->setServerVersion(version);

    // We cannot deal with servers < 5.0.0
    if (version.contains('.') && version.split('.')[0].toInt() < 5) {
        _errors.append( tr("The configured server for this client is too old") );
        _errors.append( tr("Please update to the latest server and restart the client.") );
        reportResult( ServerVersionMismatch );
        return;
    }

    // We attempt to work with servers >= 5.0.0 but warn users.
    // Check usages of Account::serverVersionUnsupported() for details.

    // now check the authentication
    if (_account->credentials()->ready())
        QTimer::singleShot( 0, this, SLOT( checkAuthentication() ));
    else
        reportResult( CredentialsMissingOrWrong );
}
int AccountAccessor::userLogin(const LoginInfo & info){
	//0: ERROR
	//1: SUCCESS 
	
	//1st check if that account has login
	if (!checkAuthentication(info)) return 0;
	if (!checkLogin(info.username)) return 0;

	//open file AccountOnline.txt to write new username
	ofstream outfile;
	outfile.open(_ONL_USR, ios::app);
	if (!outfile){
		cerr << "WRITE INFO TO FILE ERROR!!!" << endl;
		outfile.close();
		return 0;
	}
	//write username into OnlineAccount.txt
	outfile << info.username << endl;
	///////////////////////////////////////
	cout << "LOGIN SUCCESSFUL!!!" << endl;
	outfile.close();
	return 1;
}
bool AdministrationServerConnection::executeCommand(socketMsg *smsg) {
	Parser *parseCommand;
	Parser *parseArgument;
	List<Memory<char> *> *tokensCommand;
	List<Memory<char> *> *tokensArgument;
	int **hashtablePtr;
	int hashtableSize;
	HashTableElt *hashtableElt;
	struct CatalogData *catalogData;
	socketMsg smsgSend;
	size_t sizeSent;
	char specialDelimiter[2];
	char timeBuffer[64];
	int counter = 0;
	bool wantToQuit = false;
	char *argument;
	int i;
	size_t catalogBufferSize;
	char *catalogBuffer;
	int returnCode;

	specialDelimiter[0] = ';';
	specialDelimiter[1] = 0x00;
	parseCommand = new Parser(" ");
	parseArgument = new Parser(specialDelimiter);
	tokensCommand = parseCommand->tokenizeData(smsg->recvmsg, 1, smsg->brecv);
	while (commandsList[counter]) {
		if (! strncmp(tokensCommand->getFirstElement()->bloc, commandsList[counter], strlen(commandsList[counter])))
			break;
		counter++;
	}
	if (! commandsList[counter]) {
		systemLog->sysLog(ERROR, "( %s:%d ) unrecognized administration command : %s\n", inet_ntoa(sourceAddress->sin_addr), ntohs(sourceAddress->sin_port), tokensCommand->getFirstElement()->bloc);
		counter = -1;
	}
	tokensCommand->removeFirst();
  
	// Local Initializations
	serverAnswer->initialize();
	bzero(timeBuffer, sizeof(timeBuffer));

	switch (counter) {
	case 0:
		/* AUTH <user> <pass> - authentication */
		tokensArgument = parseArgument->tokenizeData(tokensCommand->getFirstElement()->bloc, 2, tokensCommand->getFirstElement()->getBlocSize());
		if ((! tokensArgument) || (tokensArgument->getListSize() != 2)) {
			serverMessage(300);
			break;
		}
		if (! strcmp(tokensArgument->getElement(1)->getBloc(), "admin")) {
			if (! strncmp(tokensArgument->getElement(2)->getBloc(), "a02sg32", 7)) {
				serverMessage(201);
				sessionAuthenticated = true;
			}
			else
				serverMessage(306);
		}
		else
			serverMessage(306);
		delete tokensArgument;
		break;
	case 1:
		/* DAEMONRELOAD - reload configuration */
		if (checkAuthentication() == true) {
			configuration->parseConfigurationFile();
			serverMessage(200);
		}
		break;
	case 2:
		/* DAEMONSTATS - get the stats */
		if (checkAuthentication() == true)
			serverMessage(201);
		break;
	case 3:
		/* DAEMONPING - check if daemon is ok */
		if (checkAuthentication() == true)
			serverMessage(305);
		break;
	case 4:
		/* DAEMONVERSION - return the daemon revision */
		if (checkAuthentication() == true)
			serverMessage(203);
		break;
	case 5:
		/* QUIT - quit the administration interface */
		serverMessage(101);
		wantToQuit = true;
		break;
	case 6:
		/* SET - set some startup parameters */
		if (checkAuthentication() == false)
			break;
		tokensArgument = parseArgument->tokenizeData(tokensCommand->getFirstElement()->bloc, 2, tokensCommand->getFirstElement()->getBlocSize());
		if ((! tokensArgument) || (tokensArgument->getListSize() != 2)) {
			serverMessage(301);
			break;
		}
		i = 0;
		argument = tokensArgument->getElement(2)->bloc;
		while (argument[i]) {
			if ((argument[i] == '\n') || (argument[i] == '\r'))
				argument[i] = '\0';
			i++;
		}
		if (! strcmp(tokensArgument->getElement(1)->bloc, "nokeycheck")) {
			if (! strcmp(tokensArgument->getElement(2)->bloc, "true")) {
				configuration->noKeyCheck = true;
				serverMessage(204);
			}
			else
				if (! strcmp(tokensArgument->getElement(2)->bloc, "false")) {
					configuration->noKeyCheck = false;
					serverMessage(204);
				}
				else
					serverMessage(302);
			delete tokensArgument;
			break;
		}
		if (! strcmp(tokensArgument->getElement(1)->bloc, "keytimeout")) {
			int keyTimeout;

			keyTimeout = atoi(tokensArgument->getElement(2)->bloc);
			if (keyTimeout) {
				configuration->keyTimeout = keyTimeout;
				serverMessage(204);
			}
			else
				serverMessage(302);
			delete tokensArgument;
			break;
		}
		if (! strcmp(tokensArgument->getElement(1)->bloc, "readtimeout")) {
			int readTimeout;

			readTimeout = atoi(tokensArgument->getElement(2)->bloc);
			if (readTimeout) {
				configuration->readTimeout = readTimeout;
				serverMessage(204);
			}
			else
				serverMessage(302);
			delete tokensArgument;
			break;
		}
		if (! strcmp(tokensArgument->getElement(1)->bloc, "writetimeout")) {
			int writeTimeout;

			writeTimeout = atoi(tokensArgument->getElement(2)->bloc);
			if (writeTimeout) {
				configuration->writeTimeout = writeTimeout;
				serverMessage(204);
			}
			else
				serverMessage(302);
			delete tokensArgument;
			break;
		}
		if (! strcmp(tokensArgument->getElement(1)->bloc, "shappingtimeout")) {
			int shappingTimeout;

			shappingTimeout = atoi(tokensArgument->getElement(2)->bloc);
			if (shappingTimeout) {
				configuration->shappingTimeout = shappingTimeout;
				serverMessage(204);
			}
			else
				serverMessage(302);
			delete tokensArgument;
			break;
		}
		
		serverMessage(302);
		delete tokensArgument;
		break;
	case 7:
		catalogHashtable->lock();
		hashtablePtr = catalogHashtable->getHashtable();
		hashtableSize = catalogHashtable->getSize();
		i = 0;
		if (! catalogHashtable->getNumberOfElements()) {
			serverMessage(401);
			catalogHashtable->unlock();
			break;
		}
		catalogBufferSize = 0;
		catalogBuffer = (char *)malloc(1);
		catalogBuffer[0] = '\0';
		while (i < hashtableSize) {
			if (hashtablePtr[i]) {
				hashtableElt = (HashTableElt *)hashtablePtr[i];
				while (hashtableElt) {
					catalogData = (struct CatalogData *)hashtableElt->getData();
					serverAnswer->snPrintf("%s|%s|%d\n", hashtableElt->getKey(), inet_ntoa(*((struct in_addr *)&catalogData->host)), catalogData->counter);
					catalogBufferSize += strlen(serverAnswer->bloc);
					catalogBuffer = (char *)realloc(catalogBuffer, catalogBufferSize+1);
					if (! catalogBuffer) {
						systemLog->sysLog(CRITICAL, "cannot reallocate catalogBuffer: %s", strerror(errno));
						serverMessage(502);
						catalogHashtable->unlock();
						break;
					}
					strcat(catalogBuffer, serverAnswer->bloc);
					hashtableElt = hashtableElt->getNext();
				}
			}
			i++;
		}
		catalogHashtable->unlock();
		serverMessage(205);
		usleep(500);
		serverAnswer->snPrintf("%d\n", catalogBufferSize);
		smsgSend.len = strlen(serverAnswer->bloc);
		smsgSend.sendmsg = serverAnswer->bloc;
		server->sendMessage(clientSocket, &smsgSend);
		usleep(500);
		sizeSent = 0;
		while (sizeSent != catalogBufferSize) {
			smsgSend.len = catalogBufferSize - sizeSent;
			smsgSend.sendmsg = &catalogBuffer[sizeSent];
			returnCode = server->sendMessage(clientSocket, &smsgSend);
			if (returnCode < 0) {
				systemLog->sysLog(ERROR, "cannot send catalog buffer to client: %s", strerror(errno));
				free(catalogBuffer);
				return -1;
			}
			sizeSent += smsgSend.bsent;
		}
		if (catalogBuffer)
			free(catalogBuffer);

		break;
	default:
		serverMessage(500);
		break;
	}

	delete tokensCommand;
	delete parseCommand;
	delete parseArgument;

	return wantToQuit;
}