ChipMaster's trial hacks on C++CMS starting with v1.2.1. Not sure I'll follow on with the v2 since it looks to be breaking and mostly frivolous.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

109 lines
2.4 KiB

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com>
  4. //
  5. // See accompanying file COPYING.TXT file for licensing details.
  6. //
  7. ///////////////////////////////////////////////////////////////////////////////
  8. #define CPPCMS_SOURCE
  9. #include <cppcms/session_sid.h>
  10. #include <cppcms/session_storage.h>
  11. #include <cppcms/session_interface.h>
  12. #include <fstream>
  13. #include <cppcms/cppcms_error.h>
  14. #include <cppcms/urandom.h>
  15. #include <stdio.h>
  16. #include <time.h>
  17. #include "tohex.h"
  18. #include <cppcms/config.h>
  19. namespace cppcms {
  20. namespace sessions {
  21. struct session_sid::_data {};
  22. session_sid::session_sid(booster::shared_ptr<session_storage> st) :
  23. storage_(st)
  24. {
  25. }
  26. session_sid::~session_sid()
  27. {
  28. }
  29. std::string session_sid::get_new_sid()
  30. {
  31. char sid[16];
  32. char res[33];
  33. urandom_device rnd;
  34. rnd.generate(sid,sizeof(sid));
  35. cppcms::impl::tohex(sid,sizeof(sid),res);
  36. return res;
  37. }
  38. bool session_sid::valid_sid(std::string const &cookie,std::string &id)
  39. {
  40. if(cookie.size()!=33 || cookie[0]!='I')
  41. return false;
  42. for(int i=1;i<33;i++) {
  43. char c=cookie[i];
  44. bool is_low_x_digit=('0'<=c && c<='9') || ('a'<=c && c<='f');
  45. if(!is_low_x_digit)
  46. return false;
  47. }
  48. id=cookie.substr(1,32);
  49. return true;
  50. }
  51. void session_sid::save(session_interface &session,std::string const &data,time_t timeout,bool new_data,bool /*unused*/)
  52. {
  53. std::string id;
  54. if(valid_sid(session.get_session_cookie(),id)) {
  55. if(new_data) {
  56. storage_->remove(id);
  57. id = get_new_sid();
  58. }
  59. }
  60. else {
  61. id = get_new_sid();
  62. }
  63. storage_->save(id,timeout,data);
  64. session.set_session_cookie("I"+id); // Renew cookie or set new one
  65. }
  66. bool session_sid::load(session_interface &session,std::string &data,time_t &timeout)
  67. {
  68. std::string id;
  69. if(!valid_sid(session.get_session_cookie(),id))
  70. return false;
  71. std::string tmp_data;
  72. if(!storage_->load(id,timeout,data))
  73. return false;
  74. if(time(0) > timeout) {
  75. storage_->remove(id);
  76. return false;
  77. }
  78. return true;
  79. }
  80. void session_sid::clear(session_interface &session)
  81. {
  82. std::string id;
  83. if(valid_sid(session.get_session_cookie(),id))
  84. storage_->remove(id);
  85. session.clear_session_cookie();
  86. }
  87. bool session_sid::is_blocking()
  88. {
  89. return storage_->is_blocking();
  90. }
  91. } // sessions
  92. } // namespace cppcms