Menu

[r2111]: / framework / trunk / src / session_sid.cpp  Maximize  Restore  History

Download this file

109 lines (92 with data), 2.5 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
///////////////////////////////////////////////////////////////////////////////
//
// 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
MongoDB Logo MongoDB