/
zOMGdev
/
cppcms
Обзор
Документация
Войти
/
zOMGdev
/
cppcms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v1.0.5
src/session_sid.cpp
108 строк
2 KB
Artyom Beilis
Moved common "tohex" functionality to centralized location
11 фев 2012, 16:02
11 фев 2012, 16:02
e62b429
Код
Авторство
О чём код?
/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> // // See accompanying file COPYING.TXT file for licensing details. // /////////////////////////////////////////////////////////////////////////////// #define CPPCMS_SOURCE #include <cppcms/session_sid.h> #include <cppcms/session_storage.h> #include <cppcms/session_interface.h> #include <fstream> #include <cppcms/cppcms_error.h> #include <cppcms/urandom.h> #include <stdio.h> #include <time.h> #include "tohex.h" #include <cppcms/config.h> namespace cppcms { namespace sessions { struct session_sid::_data {}; session_sid::session_sid(booster::shared_ptr<session_storage> st) : storage_(st) { } session_sid::~session_sid() { } std::string session_sid::get_new_sid() { char sid[16]; char res[33]; urandom_device rnd; rnd.generate(sid,sizeof(sid)); cppcms::impl::tohex(sid,sizeof(sid),res); return res; } bool session_sid::valid_sid(std::string const &cookie,std::string &id) { if(cookie.size()!=33 || cookie[0]!='I') return false; for(int i=1;i<33;i++) { char c=cookie[i]; bool is_low_x_digit=('0'<=c && c<='9') || ('a'<=c && c<='f'); if(!is_low_x_digit) return false; } id=cookie.substr(1,32); return true; } void session_sid::save(session_interface &session,std::string const &data,time_t timeout,bool new_data,bool /*unused*/) { std::string id; if(valid_sid(session.get_session_cookie(),id)) { if(new_data) { storage_->remove(id); id = get_new_sid(); } } else { id = get_new_sid(); } storage_->save(id,timeout,data); session.set_session_cookie("I"+id); // Renew cookie or set new one } bool session_sid::load(session_interface &session,std::string &data,time_t &timeout) { std::string id; if(!valid_sid(session.get_session_cookie(),id)) return false; std::string tmp_data; if(!storage_->load(id,timeout,data)) return false; if(time(0) > timeout) { storage_->remove(id); return false; } return true; } void session_sid::clear(session_interface &session) { std::string id; if(valid_sid(session.get_session_cookie(),id)) storage_->remove(id); session.clear_session_cookie(); } bool session_sid::is_blocking() { return storage_->is_blocking(); } } // sessions } // namespace cppcms