Esempio n. 1
0
HttpSession* SessionManager::startSession(const HttpRequest& request, HttpResponse& response) {
	cleanUpOldSessions();


	HttpSession* session = NULL;
	if(mUseCookies) {
		try {
			const HttpCookie& sessionCookie = request.getCookie(mCookieName);
			session = startSessionInternal(sessionCookie.getValue(), true, request, response);
		} catch(const CookieNotFoundException& ex) {
		}
	}
	if(!session && mUseRequest) {
		try {
			session = startSessionInternal(request.getAttribute(mRequestName), true, request, response);
		} catch(const AttributeNotFoundException& ex) {
		}
	}
	if(!session) {
		session = startSessionInternal(generateSessionId(request, response), false, request, response);
	}


	if(mUseCookies && session) {
		if(mCookieLifeTime > 0) {
			response.addCookie(HttpCookie(mCookieName, session->getId(), mCookieLifeTime));
		}
		else {
			response.addCookie(HttpCookie(mCookieName, session->getId()));
		}
	}


	return session;
}
void processSetup(RTSPClient *clientInfo, RTSPmsg msg)
{
	if (clientInfo->session_id)
	{
		pausePlayback(clientInfo->playback_timer);
	}
	if (clientInfo->current_file_path)
	{
		free(clientInfo->current_file_path);
	}
	int path_length = strlen(msg.file_path + 8);
	clientInfo->current_file_path = (char* ) calloc(path_length, sizeof(char));
	strcpy(clientInfo->current_file_path, msg.file_path + 8);
	clientInfo->current_frame_index = 0;
	if (!clientInfo->session_id)
	{
		int session_id = generateSessionId();
		clientInfo->session_id = session_id;
	}
	msg.session_id = clientInfo->session_id;
	sendSuccessResponse(clientInfo->socket, msg.seq, msg.session_id);
}
Esempio n. 3
0
MockCDMSession::MockCDMSession(CDMSessionClient* client)
    : m_client(client)
    , m_sessionId(generateSessionId())
{
}
Esempio n. 4
0
/**
 *  Wątek obsługujący pojedynczą wiadomość przesłaną do serwera.
 */
void Server::handleMessage(tcp::socket* socket){
    boost::array<char, 8192> messageBuffer;
    boost::system::error_code error;
    ioService.run();
    socket->read_some(boost::asio::buffer(messageBuffer), error);
    if (error){
        cerr<<error<<endl;
        socket->close();
        delete socket;
        return;
    }

    Message message;
    deserialize(message, messageBuffer.data());

    cout<<"Otrzymano wiadomość: "<<endl;
    cout<<message.toString()<<endl;

    int result;
    string response;
    string sessionId;
    History emptyHistory;
    vector<string> mismatchingParameters;
    History* history;

    if(message.getAction()!=REGISTER
       && message.getAction()!=LOGIN
       && message.getAction()!=UNREGISTER
       && (serverStore.getSessionId(message.getUserId())!=message.getSessionId()
        || serverStore.getSessionId(message.getUserId())==""))
    {
        response = createResponse(NOT_LOGGED_IN);
        socket->write_some(boost::asio::buffer(response), error);
        socket->close();
        delete socket;
        return;
    }

    switch(message.getAction()){
        case REGISTER:
        {
            // muszą być dwa parametry
            if (message.getParameters().size() != 2)
            {
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
            }
            else
            {
                // tworzymy użyszkodnika
                result = serverStore.registerUser(message.getParameters()[0], message.getParameters()[1]);
                switch (result)
                {
                    case 0: // użytkownik dodany poprawnie
                        response = createResponse(OK);
                        break;
                    case -1: // login zajęty
                        response = createResponse(INCORRECT_LOGIN);
                        break;
                }
                socket->write_some(boost::asio::buffer(response), error);
            }
            break;
        }
        case LOGIN:
        {
            // muszą być dwa parametry
            if (message.getParameters().size() != 2)
            {
                response = createResponse(WRONG_SYNTAX, "", &emptyHistory);
                socket->write_some(boost::asio::buffer(response), error);
            }
            else
            {
                // logowanie użyszkodnika
                result = serverStore.loginUser(message.getParameters()[0], message.getParameters()[1]);
                switch (result)
                {
                    case 0: // użytkownik zalogowany poprawnie
                        history = serverStore.getHistory(message.getUserId());
                        if(history==NULL){
                            history = &emptyHistory;
                        }
                        sessionId = generateSessionId();
                        serverStore.setSessionId(message.getUserId(), sessionId);
                        response = createResponse(OK, sessionId, history);
                        serverStore.clearHistory(message.getUserId());
                        break;
                    case -1: // niepoprawny login
                        response = createResponse(INCORRECT_LOGIN, "", &emptyHistory);
                        break;
                    case -2: // niepoprawne haslo
                        response = createResponse(INCORRECT_PASSWORD, "", &emptyHistory);
                        break;
                }
                socket->write_some(boost::asio::buffer(response), error);
            }
            break;
        }
        case LOGOUT:
        {
            serverStore.setSessionId(message.getUserId(), "");
            response = createResponse(OK);
            socket->write_some(boost::asio::buffer(response), error);
            break;
        }
        case UNREGISTER:
        {
            // muszą być dwa parametry
            if (message.getParameters().size() != 2)
            {
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
            }
            else
            {
                // usuwamy użyszkodnika
                result = serverStore.unregisterUser(message.getParameters()[0], message.getParameters()[1]);
                switch (result)
                {
                    case 0: // użytkownik usunięty poprawnie
                        response = createResponse(OK);
                        break;
                    case -1: // login błędny
                        response = createResponse(INCORRECT_LOGIN);
                        break;
                    case -2: // hasło błędne
                        response = createResponse(INCORRECT_PASSWORD);
                        break;
                }
                socket->write_some(boost::asio::buffer(response), error);
            }
            break;
        }
        case LIST:
        {
            //jeśli podano parametry - błąd
            if(message.getParameters().size()!=0){
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }

            vector<string> filenames = serverStore.list(message.getUserId());
            response = createResponse(OK, filenames);
            socket->write_some(boost::asio::buffer(response), error);
            filenames.clear();
            break;
        }
        case LIST_SHARED:
        {
            //jeśli podano parametry - błąd
            if(message.getParameters().size()!=0){
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }

            vector<string> names = serverStore.listShared(message.getUserId());
            response = createResponse(OK, names);
            socket->write_some(boost::asio::buffer(response), error);
            names.clear();
            break;
        }
        case UPLOAD:
            //jeśli nie podano parametrów - błąd
            if(message.getParameters().size()==0){
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }



            //żądanie poprawne, rozpocznij transfer
            dataPortAccessMutex.lock();
            response = createResponse(OK);
            socket->write_some(boost::asio::buffer(response), error);
            for(unsigned int i=0; i<message.getParameters().size(); ++i){
                cout<<"Użytkownik "<<message.getUserId()<<" przesyła plik "<<message.getParameters()[i]<<endl;
                result = fileTransferManager.receiveFile(message.getSource(), createFilePath(message.getUserId(), message.getParameters()[i]), i!=0);
                if(!result){
                    cerr<<"Nie przesłano pliku"<<endl;
                    break;
                }
                serverStore.add(message.getUserId(), message.getParameters()[i]);
                if(serverStore.fileExists(message.getUserId(), message.getParameters()[i])){
                    serverStore.updateHistory(FILE_MODIFIED, message.getUserId(), message.getParameters()[i]);
                }
                cout<<"Gotowe."<<endl;
            }
            dataPortAccessMutex.unlock();
            break;

        case DOWNLOAD:
            //jeśli nie podano parametrów - błąd
            if(message.getParameters().size()==0){
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }
            //jeśli któreś z podanych plików nie istnieją - błąd.
            //zwróć nazwy nieistniejących plików.
            for(unsigned int i=0; i<message.getParameters().size(); ++i){
                if(!serverStore.fileExists(message.getUserId(), message.getParameters()[i])){
                    mismatchingParameters.push_back(message.getParameters()[i]);
                }
            }
            if(mismatchingParameters.size()>0){
                response = createResponse(NO_SUCH_FILE, mismatchingParameters);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }

            //żądanie poprawne, rozpocznij transfer
            dataPortAccessMutex.lock();
            response = createResponse(OK);
            socket->write_some(boost::asio::buffer(response), error);
            for(unsigned int i=0; i<message.getParameters().size(); ++i){
                cout<<"Użytkownik "<<message.getUserId()<<" pobiera plik "<<message.getParameters()[i]<<endl;
                result = fileTransferManager.sendFile(message.getSource(), createFilePath(message.getUserId(), message.getParameters()[i]), true);
                if(!result){
                    cerr<<"Nie przesłano pliku"<<endl;
                    break;
                }
                cout<<"Gotowe."<<endl;
            }
            dataPortAccessMutex.unlock();
            break;

        case DOWNLOAD_SHARED:
            //musi być podany użytkownik oraz min. 1 plik, jeśli nie jest - błąd
            if(message.getParameters().size()<2){
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }

            //jeśli nie ma takiego użytkownika - błąd
            if(!serverStore.userExists(message.getParameters()[0])){
                response = createResponse(NO_SUCH_USER);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }

            //jeśli któreś z podanych plików nie istnieją - błąd.
            //zwróć nazwy nieistniejących plików.
            for(unsigned int i=1; i<message.getParameters().size(); ++i){
                if(!serverStore.fileExists(message.getParameters()[0], message.getParameters()[i])){
                    mismatchingParameters.push_back(message.getParameters()[i]);
                }
            }
            if(mismatchingParameters.size()>0){
                response = createResponse(NO_SUCH_FILE, mismatchingParameters);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }

            //jeśli użytkownik nie ma dostępu do któregoś z plików - błąd.
            //zwróć nazwy tychże plików.
            for(unsigned int i=1; i<message.getParameters().size(); ++i){
                if(!serverStore.hasAccess(message.getUserId(), message.getParameters()[0], message.getParameters()[i])){
                    mismatchingParameters.push_back(message.getParameters()[i]);
                }
            }
            if(mismatchingParameters.size()>0){
                response = createResponse(ACCESS_DENIED, mismatchingParameters);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }

            //żądanie poprawne, rozpocznij transfer
            dataPortAccessMutex.lock();
            response = createResponse(OK);
            socket->write_some(boost::asio::buffer(response), error);
            for(unsigned int i=1; i<message.getParameters().size(); ++i){
                cout<<"Użytkownik "<<message.getUserId()<<" pobiera plik "<<message.getParameters()[i]<<" należący do użytkownika "<<message.getParameters()[0]<<endl;
                result = fileTransferManager.sendFile(message.getSource(), createFilePath(message.getParameters()[0], message.getParameters()[i]), true);
                if(!result){
                    cerr<<"Nie przesłano pliku"<<endl;
                    break;
                }
                cout<<"Gotowe."<<endl;
            }
            dataPortAccessMutex.unlock();
            break;

        case REMOVE:
            //jeśli nie podano parametrów - błąd
            if(message.getParameters().size()==0){
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }

            //usuń pliki, jeśli istnieją, zapisz nazwy tych, które nie istnieją
            int result;
            for(unsigned int i=0; i<message.getParameters().size(); ++i){
                serverStore.updateHistory(FILE_REMOVED, message.getUserId(), message.getParameters()[i]);
                result = serverStore.remove(message.getUserId(), message.getParameters()[i]);
                if(result==0){
                    remove(createFilePath(message.getUserId(), message.getParameters()[i]).c_str());
                }else{
                    mismatchingParameters.push_back(message.getParameters()[i]);
                }
            }

            //wyślij zwrotny komunikat
            if(mismatchingParameters.size()>0){
                response = createResponse(NO_SUCH_FILE, mismatchingParameters);
            }else{
                response = createResponse(OK);
            }
            socket->write_some(boost::asio::buffer(response), error);
            break;

        case RENAME:
            //jeśli liczba parametrów różna od 2 - błąd
            if(message.getParameters().size()!=2){
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }
            result = serverStore.rename(message.getUserId(),
                message.getParameters()[0], message.getParameters()[1]);
            switch(result){
            case 0:
                serverStore.updateHistory(FILE_RENAMED, message.getUserId(), message.getParameters()[1], message.getParameters()[0]);
                rename(createFilePath(message.getUserId(), message.getParameters()[0]).c_str(), createFilePath(message.getUserId(), message.getParameters()[1]).c_str());
                response = createResponse(OK);
                break;
            case -2:
                mismatchingParameters.push_back(message.getParameters()[0]);
                response = createResponse(NO_SUCH_FILE, mismatchingParameters);
                break;
            case -3:
                mismatchingParameters.push_back(message.getParameters()[1]);
                response = createResponse(FILE_EXISTS, mismatchingParameters);
                break;
            }
            socket->write_some(boost::asio::buffer(response), error);
            break;
        case GIVE_ACCESS:
            if(message.getParameters().size()<2){
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }

            for(unsigned int i=1; i<message.getParameters().size(); ++i){
                result = serverStore.giveAccess(message.getUserId().c_str(), message.getParameters()[0].c_str(), message.getParameters()[i].c_str());
                switch(result){
                case 0:
                    serverStore.updateHistory(ACCESS_GRANTED, message.getUserId(), message.getParameters()[i], message.getParameters()[0]);
                    response = createResponse(OK);
                    break;
                case -1:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(NO_SUCH_USER, mismatchingParameters);
                    break;
                case -2:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(NO_SUCH_FILE, mismatchingParameters);
                    break;
                case -3:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(NO_SUCH_USER, mismatchingParameters);
                    break;
                case -4:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(ALREADY_HAVE_ACCESS, mismatchingParameters);
                    break;
                case -5:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(OWN_FILE, mismatchingParameters);
                    break;
                }
                if(result!=0){
                    break;
                }
            }
            socket->write_some(boost::asio::buffer(response), error);
            break;
        case REVOKE_ACCESS:
            if(message.getParameters().size()<2){
                response = createResponse(WRONG_SYNTAX);
                socket->write_some(boost::asio::buffer(response), error);
                break;
            }
            for(unsigned int i=1; i<message.getParameters().size(); ++i){
                result = serverStore.revokeAccess(message.getUserId().c_str(), message.getParameters()[0].c_str(), message.getParameters()[i].c_str());
                switch(result){
                case 0:
                    serverStore.updateHistory(ACCESS_REVOKED, message.getUserId(), message.getParameters()[i], message.getParameters()[0]);
                    response = createResponse(OK);
                    break;
                case -1:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(NO_SUCH_USER, mismatchingParameters);
                    break;
                case -2:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(NO_SUCH_FILE, mismatchingParameters);
                    break;
                case -3:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(NO_SUCH_USER, mismatchingParameters);
                    break;
                case -4:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(ALREADY_NO_ACCESS, mismatchingParameters);
                    break;
                case -5:
                    mismatchingParameters.push_back(message.getParameters()[i]);
                    response = createResponse(OWN_FILE, mismatchingParameters);
                    break;
                }
                if(result!=0){
                    break;
                }
            }
            socket->write_some(boost::asio::buffer(response), error);
            break;
        default:
            response = createResponse(WRONG_SYNTAX);
            socket->write_some(boost::asio::buffer(response), error);
    }
    socket->close();
    delete socket;
}
Esempio n. 5
0
MockCDMSession::MockCDMSession()
    : m_sessionId(generateSessionId())
{
}