| backtrace.h | | backtrace.h | |
| | | | |
| skipping to change at line 20 | | skipping to change at line 20 | |
| | | | |
| #include <booster/config.h> | | #include <booster/config.h> | |
| #include <stdexcept> | | #include <stdexcept> | |
| #include <typeinfo> | | #include <typeinfo> | |
| #include <string> | | #include <string> | |
| #include <vector> | | #include <vector> | |
| #include <iosfwd> | | #include <iosfwd> | |
| | | | |
| namespace booster { | | namespace booster { | |
| | | | |
|
| | | /// | |
| | | /// \brief Namespace that holds basic operations | |
| | | /// for implementing stack trace | |
| | | /// | |
| namespace stack_trace { | | namespace stack_trace { | |
|
| | | /// | |
| | | /// \brief Record stack frame | |
| | | /// | |
| | | /// Records at most \a size stack frames returning the pointers to | |
| | | the running | |
| | | /// code into \a addresses vector that should have at least size pl | |
| | | aces | |
| | | /// | |
| | | /// returns that number of actually recorded frames | |
| | | /// | |
| BOOSTER_API int trace(void **addresses,int size); | | BOOSTER_API int trace(void **addresses,int size); | |
|
| | | /// | |
| | | /// \brief Print stack trace | |
| | | /// | |
| | | /// Writes stack trace recorded \ref trace function of \a size size | |
| | | to the output stream | |
| | | /// | |
| BOOSTER_API void write_symbols(void *const *addresses,int size,std:
:ostream &); | | BOOSTER_API void write_symbols(void *const *addresses,int size,std:
:ostream &); | |
|
| | | /// | |
| | | /// \brief Get stack trace information about a single address recor | |
| | | ded | |
| | | /// | |
| BOOSTER_API std::string get_symbol(void *address); | | BOOSTER_API std::string get_symbol(void *address); | |
|
| | | /// | |
| | | /// \brief Get stack trace information about multiple address recor | |
| | | ded | |
| | | /// | |
| BOOSTER_API std::string get_symbols(void * const *address,int size)
; | | BOOSTER_API std::string get_symbols(void * const *address,int size)
; | |
| } // stack_trace | | } // stack_trace | |
| | | | |
|
| | | /// | |
| | | /// \brief the class that records the stack trace when it is created, | |
| | | /// | |
| | | /// It is a base class for all exceptions that record stack trace | |
| | | /// | |
| | | | |
| class backtrace { | | class backtrace { | |
| public: | | public: | |
| | | | |
|
| | | /// | |
| | | /// The default number of recorded frames | |
| | | /// | |
| static size_t const default_stack_size = 32; | | static size_t const default_stack_size = 32; | |
| | | | |
|
| | | /// | |
| | | /// Create stack trace recording at most \a frames_no stack frames | |
| | | /// | |
| backtrace(size_t frames_no = default_stack_size) | | backtrace(size_t frames_no = default_stack_size) | |
| { | | { | |
| if(frames_no == 0) | | if(frames_no == 0) | |
| return; | | return; | |
| frames_.resize(frames_no,0); | | frames_.resize(frames_no,0); | |
| int size = stack_trace::trace(&frames_.front(),frames_no); | | int size = stack_trace::trace(&frames_.front(),frames_no); | |
| frames_.resize(size); | | frames_.resize(size); | |
| } | | } | |
| | | | |
| virtual ~backtrace() throw() | | virtual ~backtrace() throw() | |
| { | | { | |
| } | | } | |
| | | | |
|
| | | /// | |
| | | /// Get the actual number of recorded stack frames | |
| | | /// | |
| size_t stack_size() const | | size_t stack_size() const | |
| { | | { | |
| return frames_.size(); | | return frames_.size(); | |
| } | | } | |
| | | | |
|
| | | /// | |
| | | /// Get the returned address for the stack frame number \a frame_no | |
| | | /// | |
| void *return_address(unsigned frame_no) const | | void *return_address(unsigned frame_no) const | |
| { | | { | |
| if(frame_no < stack_size()) | | if(frame_no < stack_size()) | |
| return frames_[frame_no]; | | return frames_[frame_no]; | |
| return 0; | | return 0; | |
| } | | } | |
| | | | |
|
| | | /// | |
| | | /// Print the stack trace frame for the frame \a frame_no to the st | |
| | | ream \a out | |
| | | /// | |
| void trace_line(unsigned frame_no,std::ostream &out) const | | void trace_line(unsigned frame_no,std::ostream &out) const | |
| { | | { | |
| if(frame_no < frames_.size()) | | if(frame_no < frames_.size()) | |
| stack_trace::write_symbols(&frames_[frame_no],1,out); | | stack_trace::write_symbols(&frames_[frame_no],1,out); | |
| } | | } | |
| | | | |
|
| | | /// | |
| | | /// Get a readable stack trace frame for the frame \a frame_no | |
| | | /// | |
| std::string trace_line(unsigned frame_no) const | | std::string trace_line(unsigned frame_no) const | |
| { | | { | |
| if(frame_no < frames_.size()) | | if(frame_no < frames_.size()) | |
| return stack_trace::get_symbol(frames_[frame_no]); | | return stack_trace::get_symbol(frames_[frame_no]); | |
| return std::string(); | | return std::string(); | |
| } | | } | |
| | | | |
|
| | | /// | |
| | | /// Get full stack trace as a string | |
| | | /// | |
| std::string trace() const | | std::string trace() const | |
| { | | { | |
| if(frames_.empty()) | | if(frames_.empty()) | |
| return std::string(); | | return std::string(); | |
| return stack_trace::get_symbols(&frames_.front(),frames_.size()
); | | return stack_trace::get_symbols(&frames_.front(),frames_.size()
); | |
| } | | } | |
| | | | |
|
| | | /// | |
| | | /// Print full stack trace to a stream \a out | |
| | | /// | |
| void trace(std::ostream &out) const | | void trace(std::ostream &out) const | |
| { | | { | |
| if(frames_.empty()) | | if(frames_.empty()) | |
| return; | | return; | |
| stack_trace::write_symbols(&frames_.front(),frames_.size(),out)
; | | stack_trace::write_symbols(&frames_.front(),frames_.size(),out)
; | |
| } | | } | |
| | | | |
| private: | | private: | |
| std::vector<void *> frames_; | | std::vector<void *> frames_; | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::exception but records stack trace | |
| | | /// | |
| class exception : public std::exception, public backtrace { | | class exception : public std::exception, public backtrace { | |
| public: | | public: | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::bad_cast but records stack trace | |
| | | /// | |
| class bad_cast : public std::bad_cast, public backtrace { | | class bad_cast : public std::bad_cast, public backtrace { | |
| public: | | public: | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::runtime_error but records stack trace | |
| | | /// | |
| class runtime_error: public std::runtime_error, public backtrace { | | class runtime_error: public std::runtime_error, public backtrace { | |
| public: | | public: | |
| explicit runtime_error(std::string const &s) : std::runtime_error(s
) | | explicit runtime_error(std::string const &s) : std::runtime_error(s
) | |
| { | | { | |
| } | | } | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::range_error but records stack trace | |
| | | /// | |
| class range_error: public std::range_error, public backtrace { | | class range_error: public std::range_error, public backtrace { | |
| public: | | public: | |
| explicit range_error(std::string const &s) : std::range_error(s) | | explicit range_error(std::string const &s) : std::range_error(s) | |
| { | | { | |
| } | | } | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::overflow_error but records stack trace | |
| | | /// | |
| class overflow_error: public std::overflow_error, public backtrace { | | class overflow_error: public std::overflow_error, public backtrace { | |
| public: | | public: | |
| explicit overflow_error(std::string const &s) : std::overflow_error
(s) | | explicit overflow_error(std::string const &s) : std::overflow_error
(s) | |
| { | | { | |
| } | | } | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::underflow_error but records stack trace | |
| | | /// | |
| class underflow_error: public std::underflow_error, public backtrace { | | class underflow_error: public std::underflow_error, public backtrace { | |
| public: | | public: | |
| explicit underflow_error(std::string const &s) : std::underflow_err
or(s) | | explicit underflow_error(std::string const &s) : std::underflow_err
or(s) | |
| { | | { | |
| } | | } | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::logic_error but records stack trace | |
| | | /// | |
| class logic_error: public std::logic_error, public backtrace { | | class logic_error: public std::logic_error, public backtrace { | |
| public: | | public: | |
| explicit logic_error(std::string const &s) : std::logic_error(s) | | explicit logic_error(std::string const &s) : std::logic_error(s) | |
| { | | { | |
| } | | } | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::domain_error but records stack trace | |
| | | /// | |
| class domain_error: public std::domain_error, public backtrace { | | class domain_error: public std::domain_error, public backtrace { | |
| public: | | public: | |
| explicit domain_error(std::string const &s) : std::domain_error(s) | | explicit domain_error(std::string const &s) : std::domain_error(s) | |
| { | | { | |
| } | | } | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::length_error but records stack trace | |
| | | /// | |
| class length_error: public std::length_error, public backtrace { | | class length_error: public std::length_error, public backtrace { | |
| public: | | public: | |
| explicit length_error(std::string const &s) : std::length_error(s) | | explicit length_error(std::string const &s) : std::length_error(s) | |
| { | | { | |
| } | | } | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::invalid_argument but records stack trace | |
| | | /// | |
| class invalid_argument : public std::invalid_argument, public backtrace
{ | | class invalid_argument : public std::invalid_argument, public backtrace
{ | |
| public: | | public: | |
| explicit invalid_argument(std::string const &s) : std::invalid_argu
ment(s) | | explicit invalid_argument(std::string const &s) : std::invalid_argu
ment(s) | |
| { | | { | |
| } | | } | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// \brief Same as std::out_of_range but records stack trace | |
| | | /// | |
| class out_of_range : public std::out_of_range, public backtrace { | | class out_of_range : public std::out_of_range, public backtrace { | |
| public: | | public: | |
| explicit out_of_range(std::string const &s) : std::out_of_range(s) | | explicit out_of_range(std::string const &s) : std::out_of_range(s) | |
| { | | { | |
| } | | } | |
| }; | | }; | |
| | | | |
|
| | | /// \cond INTERNAL | |
| | | | |
| namespace details { | | namespace details { | |
| class trace_manip { | | class trace_manip { | |
| public: | | public: | |
| trace_manip(backtrace const *tr) : | | trace_manip(backtrace const *tr) : | |
| tr_(tr) | | tr_(tr) | |
| { | | { | |
| } | | } | |
| std::ostream &write(std::ostream &out) const | | std::ostream &write(std::ostream &out) const | |
| { | | { | |
| if(tr_) | | if(tr_) | |
| | | | |
| skipping to change at line 182 | | skipping to change at line 270 | |
| private: | | private: | |
| backtrace const *tr_; | | backtrace const *tr_; | |
| }; | | }; | |
| | | | |
| inline std::ostream &operator<<(std::ostream &out,details::trace_ma
nip const &t) | | inline std::ostream &operator<<(std::ostream &out,details::trace_ma
nip const &t) | |
| { | | { | |
| return t.write(out); | | return t.write(out); | |
| } | | } | |
| } | | } | |
| | | | |
|
| | | /// \endcond | |
| | | | |
| | | /// | |
| | | /// \brief manipulator that print stack trace for the exception \a e if | |
| | | it is derived from backtrace. | |
| | | /// | |
| | | /// For example: | |
| | | /// \code | |
| | | /// catch(std::exception const &e) { | |
| | | /// std::cerr << e.what() << std::endl; | |
| | | /// std::cerr << booster::trace(e); | |
| | | /// } | |
| | | /// | |
| template<typename E> | | template<typename E> | |
| details::trace_manip trace(E const &e) | | details::trace_manip trace(E const &e) | |
| { | | { | |
| backtrace const *tr = dynamic_cast<backtrace const *>(&e); | | backtrace const *tr = dynamic_cast<backtrace const *>(&e); | |
| return details::trace_manip(tr); | | return details::trace_manip(tr); | |
| } | | } | |
| | | | |
| } // booster | | } // booster | |
| | | | |
| #endif | | #endif | |
| | | | |
End of changes. 27 change blocks. |
| 0 lines changed or deleted | | 107 lines changed or added | |
|
| encoding.h | | encoding.h | |
| | | | |
| skipping to change at line 17 | | skipping to change at line 17 | |
| // | | // | |
| #ifndef BOOSTER_LOCALE_ENCODING_H_INCLUDED | | #ifndef BOOSTER_LOCALE_ENCODING_H_INCLUDED | |
| #define BOOSTER_LOCALE_ENCODING_H_INCLUDED | | #define BOOSTER_LOCALE_ENCODING_H_INCLUDED | |
| | | | |
| #include <booster/config.h> | | #include <booster/config.h> | |
| #ifdef BOOSTER_MSVC | | #ifdef BOOSTER_MSVC | |
| # pragma warning(push) | | # pragma warning(push) | |
| # pragma warning(disable : 4275 4251 4231 4660) | | # pragma warning(disable : 4275 4251 4231 4660) | |
| #endif | | #endif | |
| #include <booster/locale/info.h> | | #include <booster/locale/info.h> | |
|
| #include <booster/cstdint.h> | | #include <booster/locale/encoding_errors.h> | |
| #include <booster/backtrace.h> | | #include <booster/locale/encoding_utf.h> | |
| | | | |
| namespace booster { | | namespace booster { | |
| namespace locale { | | namespace locale { | |
| | | | |
| /// | | /// | |
| /// \brief Namespace that contains all functions related to charact
er set conversion | | /// \brief Namespace that contains all functions related to charact
er set conversion | |
| /// | | /// | |
| namespace conv { | | namespace conv { | |
| /// | | /// | |
| /// \defgroup codepage Character conversion functions | | /// \defgroup codepage Character conversion functions | |
| /// | | /// | |
| /// @{ | | /// @{ | |
| | | | |
| /// | | /// | |
|
| /// \brief The excepton that is thrown in case of conversion er | | | |
| ror | | | |
| /// | | | |
| class BOOSTER_SYMBOL_VISIBLE conversion_error : public booster: | | | |
| :runtime_error { | | | |
| public: | | | |
| conversion_error() : booster::runtime_error("Conversion fai | | | |
| led") {} | | | |
| }; | | | |
| | | | |
| /// | | | |
| /// \brief This exception is thrown in case of use of unsupport | | | |
| ed | | | |
| /// or invalid character set | | | |
| /// | | | |
| class BOOSTER_SYMBOL_VISIBLE invalid_charset_error : public boo | | | |
| ster::runtime_error { | | | |
| public: | | | |
| | | | |
| /// Create an error for charset \a charset | | | |
| invalid_charset_error(std::string charset) : | | | |
| booster::runtime_error("Invalid or unsupported charset: | | | |
| " + charset) | | | |
| { | | | |
| } | | | |
| }; | | | |
| | | | |
| /// | | | |
| /// enum that defines conversion policy | | | |
| /// | | | |
| typedef enum { | | | |
| skip = 0, ///< Skip illegal/unconvertable cha | | | |
| racters | | | |
| stop = 1, ///< Stop conversion and throw conv | | | |
| ersion_error | | | |
| default_method = skip ///< Default method - skip | | | |
| } method_type; | | | |
| | | | |
| /// | | | |
| /// convert string to UTF string from text in range [begin,end)
encoded with \a charset according to policy \a how | | /// convert string to UTF string from text in range [begin,end)
encoded with \a charset according to policy \a how | |
| /// | | /// | |
| template<typename CharType> | | template<typename CharType> | |
| std::basic_string<CharType> to_utf(char const *begin,char const
*end,std::string const &charset,method_type how=default_method); | | std::basic_string<CharType> to_utf(char const *begin,char const
*end,std::string const &charset,method_type how=default_method); | |
| | | | |
| /// | | /// | |
| /// convert UTF text in range [begin,end) to a text encoded wit
h \a charset according to policy \a how | | /// convert UTF text in range [begin,end) to a text encoded wit
h \a charset according to policy \a how | |
| /// | | /// | |
| template<typename CharType> | | template<typename CharType> | |
| std::string from_utf(CharType const *begin,CharType const *end,
std::string const &charset,method_type how=default_method); | | std::string from_utf(CharType const *begin,CharType const *end,
std::string const &charset,method_type how=default_method); | |
| | | | |
| skipping to change at line 259 | | skipping to change at line 228 | |
| #endif | | #endif | |
| | | | |
| #ifdef BOOSTER_HAS_CHAR32_T | | #ifdef BOOSTER_HAS_CHAR32_T | |
| template<> | | template<> | |
| BOOSTER_API std::basic_string<char32_t> to_utf(char const *begi
n,char const *end,std::string const &charset,method_type how); | | BOOSTER_API std::basic_string<char32_t> to_utf(char const *begi
n,char const *end,std::string const &charset,method_type how); | |
| | | | |
| template<> | | template<> | |
| BOOSTER_API std::string from_utf(char32_t const *begin,char32_t
const *end,std::string const &charset,method_type how); | | BOOSTER_API std::string from_utf(char32_t const *begin,char32_t
const *end,std::string const &charset,method_type how); | |
| #endif | | #endif | |
| | | | |
|
| namespace details { | | | |
| | | | |
| template<typename CharOut,typename CharIn> | | | |
| struct utf_to_utf_traits { | | | |
| static std::basic_string<CharOut> | | | |
| convert(CharIn const *begin,CharIn const *end,method_ty | | | |
| pe how) | | | |
| { | | | |
| // Make more efficient in fututre - UTF-16/UTF-32 s | | | |
| hould be quite | | | |
| // simple and fast | | | |
| return to_utf<CharOut>(from_utf(begin,end,"UTF-8",h | | | |
| ow),"UTF-8",how); | | | |
| } | | | |
| }; | | | |
| template<typename CharOut> | | | |
| struct utf_to_utf_traits<CharOut,char> { | | | |
| static std::basic_string<CharOut> | | | |
| convert(char const *begin,char const *end,method_type h | | | |
| ow) | | | |
| { | | | |
| return to_utf<CharOut>(begin,end,"UTF-8",how); | | | |
| } | | | |
| }; | | | |
| template<typename CharIn> | | | |
| struct utf_to_utf_traits<char,CharIn> { | | | |
| static std::string | | | |
| convert(CharIn const *begin,CharIn const *end,method_ty | | | |
| pe how) | | | |
| { | | | |
| return from_utf(begin,end,"UTF-8",how); | | | |
| } | | | |
| }; | | | |
| template<> | | | |
| struct utf_to_utf_traits<char,char> { // just test valid | | | |
| static std::string | | | |
| convert(char const *begin,char const *end,method_type h | | | |
| ow) | | | |
| { | | | |
| return from_utf(begin,end,"UTF-8",how); | | | |
| } | | | |
| }; | | | |
| } | | | |
| | | | |
| /// \endcond | | | |
| | | | |
| /// | | | |
| /// Convert a Unicode text in range [begin,end) to other Unicod | | | |
| e encoding | | | |
| /// | | | |
| template<typename CharOut,typename CharIn> | | | |
| std::basic_string<CharOut> | | | |
| utf_to_utf(CharIn const *begin,CharIn const *end,method_type ho | | | |
| w = default_method) | | | |
| { | | | |
| return details::utf_to_utf_traits<CharOut,CharIn>::convert( | | | |
| begin,end,how); | | | |
| } | | | |
| | | | |
| /// | | | |
| /// Convert a Unicode NUL terminated string \a str other Unicod | | | |
| e encoding | | | |
| /// | | | |
| template<typename CharOut,typename CharIn> | | | |
| std::basic_string<CharOut> | | | |
| utf_to_utf(CharIn const *str,method_type how = default_method) | | | |
| { | | | |
| CharIn const *end = str; | | | |
| while(*end) | | | |
| end++; | | | |
| return utf_to_utf<CharOut,CharIn>(str,end,how); | | | |
| } | | | |
| | | | |
| /// | | | |
| /// Convert a Unicode string \a str other Unicode encoding | | | |
| /// | | | |
| template<typename CharOut,typename CharIn> | | | |
| std::basic_string<CharOut> | | | |
| utf_to_utf(std::basic_string<CharIn> const &str,method_type how | | | |
| = default_method) | | | |
| { | | | |
| return utf_to_utf<CharOut,CharIn>(str.c_str(),str.c_str()+s | | | |
| tr.size(),how); | | | |
| } | | | |
| | | | |
| /// @} | | /// @} | |
| | | | |
| } // conv | | } // conv | |
| | | | |
| } // locale | | } // locale | |
| } // boost | | } // boost | |
| | | | |
| #ifdef BOOSTER_MSVC | | #ifdef BOOSTER_MSVC | |
| #pragma warning(pop) | | #pragma warning(pop) | |
| #endif | | #endif | |
| | | | |
End of changes. 3 change blocks. |
| 126 lines changed or deleted | | 2 lines changed or added | |
|
| form.h | | form.h | |
| | | | |
| skipping to change at line 281 | | skipping to change at line 281 | |
| void add(widgets::base_widget &widget); | | void add(widgets::base_widget &widget); | |
| | | | |
| /// | | /// | |
| /// Add \a widget to form. The ownership is transferred to | | /// Add \a widget to form. The ownership is transferred to | |
| /// the parent and the widget will be destroyed together wit
h | | /// the parent and the widget will be destroyed together wit
h | |
| /// the parent. | | /// the parent. | |
| /// | | /// | |
| void attach(widgets::base_widget *widget); | | void attach(widgets::base_widget *widget); | |
| | | | |
| /// | | /// | |
|
| | | /// \deprecated Use add(form &) instead | |
| | | /// | |
| /// Shortcut to \a add. | | /// Shortcut to \a add. | |
| /// | | /// | |
|
| inline form &operator + (form &f) | | CPPCMS_DEPRECATED inline form &operator + (form &f) | |
| { | | { | |
| add(f); | | add(f); | |
| return *this; | | return *this; | |
| } | | } | |
| | | | |
| /// | | /// | |
|
| | | /// \deprecated Use add(widgets::base_widget &) instead | |
| | | /// | |
| /// Shortcut to \a add. | | /// Shortcut to \a add. | |
| /// | | /// | |
|
| inline form &operator + (widgets::base_widget &f) | | CPPCMS_DEPRECATED inline form &operator + (widgets::base_wid
get &f) | |
| { | | { | |
| add(f); | | add(f); | |
| return *this; | | return *this; | |
| } | | } | |
| | | | |
| /// | | /// | |
| /// Set the parent of this form. It is used internally; you
should not use it. It is called | | /// Set the parent of this form. It is used internally; you
should not use it. It is called | |
| /// when the form is added or attached to another form. | | /// when the form is added or attached to another form. | |
| /// | | /// | |
| virtual void parent(base_form *subform); | | virtual void parent(base_form *subform); | |
| | | | |
| skipping to change at line 672 | | skipping to change at line 676 | |
| /// | | /// | |
| | | | |
| virtual void parent(base_form *subform); | | virtual void parent(base_form *subform); | |
| | | | |
| /// | | /// | |
| /// Get parent of this form. If this is topmost form
, NULL is returned | | /// Get parent of this form. If this is topmost form
, NULL is returned | |
| /// Note widget is assumed to be assigned to forms o
nly | | /// Note widget is assumed to be assigned to forms o
nly | |
| /// | | /// | |
| virtual form *parent(); | | virtual form *parent(); | |
| | | | |
|
| | | /// | |
| | | /// This function should be called before actual loa | |
| | | ding | |
| | | /// of widgets, it performs cross widgets validation | |
| | | /// and causes automatic generation of undefined nam | |
| | | es | |
| | | /// | |
| | | void pre_load(http::context &); | |
| | | | |
| protected: | | protected: | |
| /// | | /// | |
| /// This function should be called by overloaded loa
d/render methods | | /// This function should be called by overloaded loa
d/render methods | |
| /// before rendering/loading starts | | /// before rendering/loading starts | |
| /// | | /// | |
| void auto_generate(form_context *context = 0); | | void auto_generate(form_context *context = 0); | |
| private: | | private: | |
| | | | |
| void generate(int position,form_context *context = 0
); | | void generate(int position,form_context *context = 0
); | |
| | | | |
| | | | |
| skipping to change at line 1035 | | skipping to change at line 1046 | |
| base_html_input::clear(); | | base_html_input::clear(); | |
| loaded_string_.clear(); | | loaded_string_.clear(); | |
| } | | } | |
| | | | |
| /// | | /// | |
| /// Load widget data | | /// Load widget data | |
| /// | | /// | |
| | | | |
| virtual void load(http::context &context) | | virtual void load(http::context &context) | |
| { | | { | |
|
| auto_generate(); | | pre_load(context); | |
| | | | |
| loaded_string_.clear(); | | loaded_string_.clear(); | |
| | | | |
| set(false); | | set(false); | |
| valid(true); | | valid(true); | |
| | | | |
| http::request::form_type::const_iterator p; | | http::request::form_type::const_iterator p; | |
| http::request::form_type const &request=cont
ext.request().post_or_get(); | | http::request::form_type const &request=cont
ext.request().post_or_get(); | |
| p=request.find(name()); | | p=request.find(name()); | |
| if(p==request.end()) { | | if(p==request.end()) { | |
| | | | |
End of changes. 6 change blocks. |
| 3 lines changed or deleted | | 16 lines changed or added | |
|
| io_service.h | | io_service.h | |
| | | | |
| skipping to change at line 36 | | skipping to change at line 36 | |
| class event_loop_impl; | | class event_loop_impl; | |
| | | | |
| /// | | /// | |
| /// \brief this is the central event loop that dispatches all reques
ts. | | /// \brief this is the central event loop that dispatches all reques
ts. | |
| /// | | /// | |
| /// This all this class member functions are thread safe unless spec
ified otherwise. | | /// This all this class member functions are thread safe unless spec
ified otherwise. | |
| /// | | /// | |
| /// Sinlge or multiple threads may execute run() member function and
dispatch its handlers, this class | | /// Sinlge or multiple threads may execute run() member function and
dispatch its handlers, this class | |
| /// also can be safely created before fork and used after it | | /// also can be safely created before fork and used after it | |
| /// | | /// | |
|
| class BOOSTER_API io_service : public noncopyable { | | class BOOSTER_API io_service : public noncopyable, public io_events
{ | |
| public: | | public: | |
| | | | |
|
| static const int in = 1 << 0; | | | |
| static const int out = 1 << 1; | | | |
| | | | |
| /// | | /// | |
| /// Create io service using specific reactor type and not de
fault one (see reactor's class use_* constants) | | /// Create io service using specific reactor type and not de
fault one (see reactor's class use_* constants) | |
| /// | | /// | |
| io_service(int reactor_type); | | io_service(int reactor_type); | |
| /// | | /// | |
| /// Create io service using default reactor | | /// Create io service using default reactor | |
| /// | | /// | |
| io_service(); | | io_service(); | |
| /// | | /// | |
| /// Destroy io_service. It should be stopped before!. | | /// Destroy io_service. It should be stopped before!. | |
| /// | | /// | |
| ~io_service(); | | ~io_service(); | |
| | | | |
| /// | | /// | |
|
| /// Set event handler \a h for file descriptor \fd. \a event | | /// Set event handler \a h for file descriptor \a fd. \a eve | |
| can be in, out or in. | | nt can be \ref io_events::in, \ref io_events::out | |
| | | /// or \ref io_events::in | \ref io_events::out. | |
| /// | | /// | |
| /// Error handling: | | /// Error handling: | |
| /// | | /// | |
| /// - If invalid \a event type is given, std::invalid_argume
nt is throw. | | /// - If invalid \a event type is given, std::invalid_argume
nt is throw. | |
| /// - All other applicative errors are always reported using
event handler \a h and never thrown directly. | | /// - All other applicative errors are always reported using
event handler \a h and never thrown directly. | |
| /// | | /// | |
| void set_io_event(native_type fd,int event,event_handler con
st &h); | | void set_io_event(native_type fd,int event,event_handler con
st &h); | |
| /// | | /// | |
| /// Cancel all io-events for file descriptor \a fd. Event ha
ndlers associated with this descriptor are | | /// Cancel all io-events for file descriptor \a fd. Event ha
ndlers associated with this descriptor are | |
| /// dispatched asynchronously with aio_error::canceled error
code. | | /// dispatched asynchronously with aio_error::canceled error
code. | |
| | | | |
End of changes. 3 change blocks. |
| 6 lines changed or deleted | | 4 lines changed or added | |
|
| reactor.h | | reactor.h | |
| | | | |
| skipping to change at line 19 | | skipping to change at line 19 | |
| #define BOOSTER_AIO_REACTOR_H | | #define BOOSTER_AIO_REACTOR_H | |
| #include <booster/config.h> | | #include <booster/config.h> | |
| #include <booster/aio/types.h> | | #include <booster/aio/types.h> | |
| #include <memory> | | #include <memory> | |
| #include <string> | | #include <string> | |
| namespace booster { | | namespace booster { | |
| namespace aio { | | namespace aio { | |
| | | | |
| class reactor_impl; | | class reactor_impl; | |
| | | | |
|
| class BOOSTER_API reactor { | | /// | |
| | | /// \brief This class is an abstraction of platform dependent pollin | |
| | | g API. | |
| | | /// | |
| | | /// It abstracts platform specific APIs like epoll, /dev/poll, kqueu | |
| | | e, poll | |
| | | /// and select. | |
| | | /// | |
| | | /// It provides platform indepenent functionality for polling file d | |
| | | escriptions | |
| | | /// in efficient way | |
| | | /// | |
| | | class BOOSTER_API reactor : public io_events { | |
| reactor(reactor const &); | | reactor(reactor const &); | |
| void operator=(reactor const &); | | void operator=(reactor const &); | |
| public: | | public: | |
|
| static const int in = 1 << 0; | | | |
| static const int out = 1 << 1; | | | |
| static const int err = 1 << 2; | | | |
| | | | |
|
| static const int use_default = 0; | | static const int use_default = 0; //< Best polling device | |
| static const int use_select = 1; | | available on the OS | |
| static const int use_poll = 2; | | static const int use_select = 1; //< select() API, defau | |
| static const int use_epoll = 3; | | lt on Windows | |
| static const int use_dev_poll = 4; | | static const int use_poll = 2; //< poll() API default | |
| static const int use_kqueue = 5; | | on POSIX platforms without better polling support | |
| static const int use_max = use_kqueue; | | static const int use_epoll = 3; //< epoll() available a | |
| | | nd default on Linux | |
| | | static const int use_dev_poll = 4; //< /dev/poll available | |
| | | and default on Solaris and HP-UX | |
| | | static const int use_kqueue = 5; //< kqueue available an | |
| | | d default on BSD and Mac OS X. | |
| | | static const int use_max = use_kqueue; //< Maximal n | |
| | | umber | |
| | | | |
|
| | | /// \brief structure that defines output events | |
| struct event { | | struct event { | |
|
| native_type fd; | | native_type fd; //< A descriptor that event occurred | |
| int events; | | on | |
| | | int events; //< a bit mask of events \see io_eve | |
| | | nts | |
| }; | | }; | |
| | | | |
|
| | | /// | |
| | | /// Create a new polling device using \a hint recommendation | |
| | | . If provided | |
| | | /// device is not supported the default is used | |
| | | /// | |
| reactor(int hint = use_default); | | reactor(int hint = use_default); | |
| ~reactor(); | | ~reactor(); | |
| | | | |
|
| | | /// | |
| | | /// Add \a fd to watch list, flags can be a or mask of \ref | |
| | | io_events::in, \ref io_events::out | |
| | | /// and \ref io_events::err | |
| | | /// | |
| | | /// If flags=0 removes the \a fd from the watch list | |
| | | /// | |
| | | /// If error occurs throws \ref system::system_error | |
| | | /// | |
| void select(native_type fd,int flags); | | void select(native_type fd,int flags); | |
|
| | | /// | |
| | | /// Add \a fd to watch list, flags can be a or mask of \ref | |
| | | io_events::in, | |
| | | /// \ref io_events::out and \ref io_events::err | |
| | | /// | |
| | | /// If flags=0 removes the \a fd from the watch list | |
| | | /// | |
| | | /// If error occurs, the error code is assigned to \a e | |
| | | /// | |
| void select(native_type fd,int flags,system::error_code &e); | | void select(native_type fd,int flags,system::error_code &e); | |
|
| | | /// | |
| | | /// Removes the \a fd from the watch list | |
| | | /// | |
| | | /// If error occurs throws \ref system::system_error | |
| | | /// | |
| void remove(native_type fd) | | void remove(native_type fd) | |
| { | | { | |
| select(fd,0); | | select(fd,0); | |
| } | | } | |
|
| | | /// | |
| | | /// Removes the \a fd from the watch list | |
| | | /// | |
| | | /// If error occurs, the error code is assigned to \a e | |
| | | /// | |
| void remove(native_type fd,system::error_code &e) | | void remove(native_type fd,system::error_code &e) | |
| { | | { | |
| select(fd,0,e); | | select(fd,0,e); | |
| } | | } | |
| | | | |
|
| | | /// | |
| | | /// Poll for the events, wait at most \a timeout microsecond | |
| | | s. | |
| | | /// Save up to \a n values to the \a events vector. | |
| | | /// | |
| | | /// Returns number of events recorded. Returns 0 if timeout | |
| | | occurred. | |
| | | /// | |
| | | /// If error occurs throws \ref system::system_error | |
| | | /// | |
| int poll(event *events,int n,int timeout); | | int poll(event *events,int n,int timeout); | |
|
| | | /// | |
| | | /// Poll for the events, wait at most \a timeout microsecond | |
| | | s. | |
| | | /// Save up to \a n values to the \a events vector. | |
| | | /// | |
| | | /// Returns number of events recorded. Returns 0 if timeout | |
| | | occurred. | |
| | | /// | |
| | | /// If error occurs, the error code is assigned to \a e | |
| | | /// | |
| int poll(event *events,int n,int timeout,system::error_code
&e); | | int poll(event *events,int n,int timeout,system::error_code
&e); | |
| | | | |
|
| | | /// | |
| | | /// Get the actual name of the polling device used. | |
| | | /// | |
| std::string name() const; | | std::string name() const; | |
| private: | | private: | |
| std::auto_ptr<reactor_impl> impl_; | | std::auto_ptr<reactor_impl> impl_; | |
| }; | | }; | |
| } // aio | | } // aio | |
| } // booster | | } // booster | |
| | | | |
| #endif | | #endif | |
| | | | |
End of changes. 13 change blocks. |
| 13 lines changed or deleted | | 88 lines changed or added | |
|
| service.h | | service.h | |
| | | | |
| skipping to change at line 29 | | skipping to change at line 29 | |
| #ifndef CPPCMS_SERVICE_H | | #ifndef CPPCMS_SERVICE_H | |
| #define CPPCMS_SERVICE_H | | #define CPPCMS_SERVICE_H | |
| | | | |
| #include <cppcms/defs.h> | | #include <cppcms/defs.h> | |
| #include <booster/noncopyable.h> | | #include <booster/noncopyable.h> | |
| #include <booster/hold_ptr.h> | | #include <booster/hold_ptr.h> | |
| #include <booster/function.h> | | #include <booster/function.h> | |
| #include <locale> | | #include <locale> | |
| #include <memory> | | #include <memory> | |
| #include <cppcms/locale_fwd.h> | | #include <cppcms/locale_fwd.h> | |
|
| | | #include <cppcms/json.h> | |
| | | | |
| namespace booster { | | namespace booster { | |
| namespace aio { | | namespace aio { | |
| class io_service; | | class io_service; | |
| } | | } | |
| } | | } | |
| | | | |
| /// | | /// | |
| /// \brief This is the namespace where all CppCMS functionality is placed | | /// \brief This is the namespace where all CppCMS functionality is placed | |
| /// | | /// | |
| | | | |
| skipping to change at line 71 | | skipping to change at line 72 | |
| /// | | /// | |
| /// This is the central class that is responsible for management of
CppCMS services: management of HTTP requests and | | /// This is the central class that is responsible for management of
CppCMS services: management of HTTP requests and | |
| /// responses, sessions, cache and much more services. It is the cen
tral class that runs during execution of any CppCMS | | /// responses, sessions, cache and much more services. It is the cen
tral class that runs during execution of any CppCMS | |
| /// service. | | /// service. | |
| /// | | /// | |
| | | | |
| class CPPCMS_API service : public booster::noncopyable | | class CPPCMS_API service : public booster::noncopyable | |
| { | | { | |
| public: | | public: | |
| /// | | /// | |
|
| | | /// Load configuration settings from the command line parame | |
| | | ters. This object can be passed | |
| | | /// to service(json::value const &v) constructor allowing to | |
| | | alter these settings before | |
| | | /// creating the actual service object. | |
| | | /// | |
| | | static json::value load_settings(int argc,char *argv[]); | |
| | | /// | |
| /// Create a new service, passing all configuration settings
via json::value instead of parsing command line parameters. | | /// Create a new service, passing all configuration settings
via json::value instead of parsing command line parameters. | |
| /// | | /// | |
| service(json::value const &v); | | service(json::value const &v); | |
| /// | | /// | |
| /// Parse command line parameters, get the configuration fil
e and additional options and create the service. | | /// Parse command line parameters, get the configuration fil
e and additional options and create the service. | |
| /// | | /// | |
| /// Note for Windows users: argv is assumed to be UTF-8 enco
ded strings, if you want pass non-ascii or "wide" parameters | | /// Note for Windows users: argv is assumed to be UTF-8 enco
ded strings, if you want pass non-ascii or "wide" parameters | |
| /// you need convert them from UTF-16 to UTF-8. For example
you can use booster::nowide::convert functions. | | /// you need convert them from UTF-16 to UTF-8. For example
you can use booster::nowide::convert functions. | |
| /// | | /// | |
| service(int argc,char *argv[]); | | service(int argc,char *argv[]); | |
| | | | |
| skipping to change at line 190 | | skipping to change at line 197 | |
| /// with same id. | | /// with same id. | |
| /// | | /// | |
| /// So if an application want to run certain activity that c
an't be executed in multiple processes it can setup an after_fork | | /// So if an application want to run certain activity that c
an't be executed in multiple processes it can setup an after_fork | |
| /// handle that would check the process id and start this ac
tivity. | | /// handle that would check the process id and start this ac
tivity. | |
| /// | | /// | |
| /// Under Windows and Cygwin it is always 0. | | /// Under Windows and Cygwin it is always 0. | |
| /// | | /// | |
| int process_id(); | | int process_id(); | |
| | | | |
| /// \cond INTERNAL | | /// \cond INTERNAL | |
|
| | | | |
| | | // internal functions never call it directly | |
| | | | |
| cppcms::impl::service &impl(); | | cppcms::impl::service &impl(); | |
| | | | |
| impl::cached_settings const &cached_settings(); | | impl::cached_settings const &cached_settings(); | |
|
| | | | |
| | | #ifdef CPPCMS_WIN_NATIVE | |
| | | void impl_run_as_windows_service(); | |
| | | #endif | |
| | | void impl_run_prepare(); | |
| | | void impl_run_event_loop(); | |
| | | | |
| /// \endcond | | /// \endcond | |
| | | | |
| private: | | private: | |
| void setup(); | | void setup(); | |
| void setup_logging(); | | void setup_logging(); | |
| std::auto_ptr<cppcms::impl::cgi::acceptor> setup_acceptor(js
on::value const &,int,int shift=0); | | std::auto_ptr<cppcms::impl::cgi::acceptor> setup_acceptor(js
on::value const &,int,int shift=0); | |
|
| void load_settings(int argc,char *argv[]); | | | |
| void stop(); | | void stop(); | |
| void start_acceptor(bool after_fork=false); | | void start_acceptor(bool after_fork=false); | |
| void setup_exit_handling(); | | void setup_exit_handling(); | |
| bool prefork(); | | bool prefork(); | |
|
| | | void impl_run(); | |
| | | #ifdef CPPCMS_WIN_NATIVE | |
| | | void install_service(); | |
| | | void uninstall_service(); | |
| | | #endif | |
| booster::hold_ptr<impl::service> impl_; | | booster::hold_ptr<impl::service> impl_; | |
| }; | | }; | |
| | | | |
| } // | | } // | |
| | | | |
| #endif | | #endif | |
| | | | |
End of changes. 6 change blocks. |
| 1 lines changed or deleted | | 24 lines changed or added | |
|
| session_interface.h | | session_interface.h | |
| | | | |
| skipping to change at line 27 | | skipping to change at line 27 | |
| // | | // | |
| ///////////////////////////////////////////////////////////////////////////
//// | | ///////////////////////////////////////////////////////////////////////////
//// | |
| #ifndef CPPCMS_SESSION_INTERFACE_H | | #ifndef CPPCMS_SESSION_INTERFACE_H | |
| #define CPPCMS_SESSION_INTERFACE_H | | #define CPPCMS_SESSION_INTERFACE_H | |
| | | | |
| #include <cppcms/defs.h> | | #include <cppcms/defs.h> | |
| #include <booster/noncopyable.h> | | #include <booster/noncopyable.h> | |
| #include <booster/hold_ptr.h> | | #include <booster/hold_ptr.h> | |
| #include <booster/shared_ptr.h> | | #include <booster/shared_ptr.h> | |
| #include <cppcms/cstdint.h> | | #include <cppcms/cstdint.h> | |
|
| | | #include <cppcms/cppcms_error.h> | |
| #include <cppcms/serialization_classes.h> | | #include <cppcms/serialization_classes.h> | |
| #include <string> | | #include <string> | |
| #include <map> | | #include <map> | |
| #include <memory> | | #include <memory> | |
| #include <sstream> | | #include <sstream> | |
| #include <typeinfo> | | #include <typeinfo> | |
| | | | |
| namespace cppcms { | | namespace cppcms { | |
| namespace http { | | namespace http { | |
| class context; | | class context; | |
| class request; | | class request; | |
| class response; | | class response; | |
| } | | } | |
| | | | |
| class session_api; | | class session_api; | |
| | | | |
| /// | | /// | |
|
| | | /// \brief This exception is thrown when CSRF attempt is suspected: | |
| | | /// | |
| | | class CPPCMS_API request_forgery_error : public cppcms_error { | |
| | | public: | |
| | | /// Create an exception object | |
| | | request_forgery_error() : | |
| | | cppcms_error("Cross site request forgery detected") | |
| | | { | |
| | | } | |
| | | }; | |
| | | | |
| | | /// | |
| /// \brief This class provides an access to an application for session mana
gement | | /// \brief This class provides an access to an application for session mana
gement | |
| /// | | /// | |
| /// Usually it is accessed via application::session member function. | | /// Usually it is accessed via application::session member function. | |
| /// | | /// | |
| /// Note, when the application is asynchronous, the sessions should be load
ed manually as | | /// Note, when the application is asynchronous, the sessions should be load
ed manually as | |
| /// fetching information from session may be not so cheap | | /// fetching information from session may be not so cheap | |
| /// | | /// | |
| /// Generally, session data is represented as a map of key-value strings th
at can be read | | /// Generally, session data is represented as a map of key-value strings th
at can be read | |
| /// and written. All changes in session should be done before headers are w
ritten to the output | | /// and written. All changes in session should be done before headers are w
ritten to the output | |
| /// (before requesting an output stream from http::response object) | | /// (before requesting an output stream from http::response object) | |
| | | | |
| skipping to change at line 289 | | skipping to change at line 302 | |
| /// from event loop when using asynchronous applications. | | /// from event loop when using asynchronous applications. | |
| /// | | /// | |
| bool is_blocking(); | | bool is_blocking(); | |
| | | | |
| /// | | /// | |
| /// When using session id based session - force generation of new se
ssion id to prevent session | | /// When using session id based session - force generation of new se
ssion id to prevent session | |
| /// fixation attacks | | /// fixation attacks | |
| /// | | /// | |
| void reset_session(); | | void reset_session(); | |
| | | | |
|
| | | /// | |
| | | /// Check that the CSRF token is the same as in the session object, | |
| | | it does not do any checks, whether | |
| | | /// CSRF enabled or the request method is correct. It should be used | |
| | | for custom request handling (like | |
| | | /// custom content types for RESTful services. | |
| | | /// | |
| | | /// Returns true if the token is valid, otherwise returns false | |
| | | /// | |
| | | bool validate_csrf_token(std::string const &str); | |
| | | /// | |
| | | /// Check that there is no Cross Site Request Forgery Attempt. | |
| | | /// | |
| | | /// If CSRF checks enabled it validates that there is a valid CSRF t | |
| | | oken is submitted via POST request | |
| | | /// or via X-CSRF-Token header for AJAX requests. | |
| | | /// | |
| | | /// \note it is checked for POST requests only. | |
| | | /// | |
| | | void validate_request_origin(); | |
| | | | |
| | | /// | |
| | | /// Set CSRF validation mode. | |
| | | /// | |
| | | /// If \a required \c is true then validate_request_origin() would t | |
| | | hrow \ref request_forgery_error | |
| | | /// if the CSRF token is not valid. | |
| | | /// | |
| | | /// Setting it to false would prevent from validate_request_origin() | |
| | | to do any checks. | |
| | | /// | |
| | | /// \note The default is defined in the configuration property \c se | |
| | | curity.csrf.automatic. If | |
| | | /// its value is not set the default is \c true | |
| | | /// | |
| | | /// It is useful when some parts of the application do not require C | |
| | | SRF validation regardless | |
| | | /// the status of sepecifc session owner | |
| | | /// | |
| | | void request_origin_validation_is_required(bool required); | |
| | | | |
| | | /// | |
| | | /// Get CSRF token that is stored in the session that can be used fo | |
| | | r validation | |
| | | /// of the request origin | |
| | | /// | |
| | | std::string get_csrf_token(); | |
| | | /// | |
| | | /// Get the cooke name that holds CSRF token. Note it can be used on | |
| | | ly if security.csrf.exposed | |
| | | /// is set to true (which is not by default) | |
| | | /// | |
| | | std::string get_csrf_token_cookie_name(); | |
| | | | |
| private: | | private: | |
| friend class http::response; | | friend class http::response; | |
| friend class http::request; | | friend class http::request; | |
| | | | |
| struct entry; | | struct entry; | |
| | | | |
| typedef std::map<std::string,entry> data_type; | | typedef std::map<std::string,entry> data_type; | |
| data_type data_,data_copy_; | | data_type data_,data_copy_; | |
| http::context *context_; | | http::context *context_; | |
| | | | |
| | | | |
| skipping to change at line 315 | | skipping to change at line 373 | |
| int how_; | | int how_; | |
| | | | |
| // Information from session data | | // Information from session data | |
| time_t timeout_in_; | | time_t timeout_in_; | |
| | | | |
| uint32_t new_session_ : 1; | | uint32_t new_session_ : 1; | |
| uint32_t saved_ : 1; | | uint32_t saved_ : 1; | |
| uint32_t on_server_ : 1; | | uint32_t on_server_ : 1; | |
| uint32_t loaded_ : 1; | | uint32_t loaded_ : 1; | |
| uint32_t reset_ : 1; | | uint32_t reset_ : 1; | |
|
| uint32_t reserved_ : 27; | | uint32_t csrf_checked_ : 1; | |
| | | uint32_t csrf_do_validation_ : 1; | |
| | | uint32_t csrf_validation_ : 1; | |
| | | uint32_t reserved_ : 24; | |
| | | | |
| std::string temp_cookie_; | | std::string temp_cookie_; | |
| | | | |
| // storage itself | | // storage itself | |
| | | | |
| booster::shared_ptr<session_api> storage_; | | booster::shared_ptr<session_api> storage_; | |
| struct _data; | | struct _data; | |
| booster::hold_ptr<_data> d; // for future use | | booster::hold_ptr<_data> d; // for future use | |
| | | | |
| int cookie_age(); | | int cookie_age(); | |
| time_t session_age(); | | time_t session_age(); | |
| | | | |
| void check(); | | void check(); | |
| void update_exposed(bool); | | void update_exposed(bool); | |
| | | | |
| void set_session_cookie(int64_t age,std::string const &data,std::str
ing const &key=std::string()); | | void set_session_cookie(int64_t age,std::string const &data,std::str
ing const &key=std::string()); | |
| | | | |
| void save_data(std::map<std::string,entry> const &data,std::string &
s); | | void save_data(std::map<std::string,entry> const &data,std::string &
s); | |
| void load_data(std::map<std::string,entry> &data,std::string const &
s); | | void load_data(std::map<std::string,entry> &data,std::string const &
s); | |
|
| | | std::string generate_csrf_token(); | |
| }; | | }; | |
| | | | |
| } // cppcms | | } // cppcms | |
| | | | |
| #endif | | #endif | |
| | | | |
End of changes. 5 change blocks. |
| 1 lines changed or deleted | | 72 lines changed or added | |
|
| steal_buf.h | | steal_buf.h | |
| | | | |
| skipping to change at line 32 | | skipping to change at line 32 | |
| #include <streambuf> | | #include <streambuf> | |
| #include <ostream> | | #include <ostream> | |
| #include <stdio.h> | | #include <stdio.h> | |
| #include <string> | | #include <string> | |
| #include <string.h> | | #include <string.h> | |
| #include <stdlib.h> | | #include <stdlib.h> | |
| | | | |
| namespace cppcms { | | namespace cppcms { | |
| namespace util { | | namespace util { | |
| | | | |
|
| template<size_t on_stack_size = 128> | | /// | |
| class steal_buffer : public std::streambuf { | | /// \brief Very simple output stream buffer that uses stack for smal | |
| steal_buffer(steal_buffer const &); | | l chunks of | |
| void operator=(steal_buffer const &); | | /// text and then allocates memory of the default buffer is too smal | |
| | | l. | |
| | | /// | |
| | | /// It is something like std::stringbuf with small string optimizati | |
| | | on, it also | |
| | | /// allows to access the memory without actually creating the string | |
| | | itself. | |
| | | /// | |
| | | /// The template parameter defines how many characters should be all | |
| | | ocated | |
| | | /// on stack by default before heap is used. | |
| | | /// | |
| | | template<size_t OnStackSize = 128> | |
| | | class stackbuf : public std::streambuf { | |
| | | stackbuf(stackbuf const &); | |
| | | void operator=(stackbuf const &); | |
| public: | | public: | |
|
| | | /// | |
| | | /// get the pointer to the beginning of the output buffer | |
| | | /// | |
| char *begin() | | char *begin() | |
| { | | { | |
| return pbase(); | | return pbase(); | |
| } | | } | |
|
| | | /// | |
| | | /// get the pointer to the end of the output buffer | |
| | | /// | |
| char *end() | | char *end() | |
| { | | { | |
| return pptr(); | | return pptr(); | |
| } | | } | |
|
| steal_buffer(std::ostream &out) | | /// | |
| { | | /// get the 0 terminated string from the buffer. | |
| init(); | | /// | |
| steal(out); | | char *c_str() | |
| } | | | |
| steal_buffer() | | | |
| { | | { | |
|
| init(); | | *pptr() = 0; | |
| | | return begin(); | |
| } | | } | |
|
| void steal(std::ostream &out) | | /// | |
| | | /// get the std::string from the buffer. | |
| | | /// | |
| | | std::string str() | |
| { | | { | |
|
| release(); | | return std::string(begin(),size_t(end()-begin())); | |
| stolen_ = out.rdbuf(this); | | | |
| stream_ = &out; | | | |
| } | | } | |
|
| void release() | | stackbuf() | |
| { | | { | |
|
| if(stream_ && stolen_) { | | init(); | |
| stream_->rdbuf(stolen_); | | | |
| } | | | |
| stream_ = 0; | | | |
| stolen_ = 0; | | | |
| } | | } | |
|
| ~steal_buffer() | | ~stackbuf() | |
| { | | { | |
|
| release(); | | | |
| free(on_heap_); | | free(on_heap_); | |
| } | | } | |
|
| | | protected: | |
| | | | |
| int overflow(int c) | | int overflow(int c) | |
| { | | { | |
| size_t current_size; | | size_t current_size; | |
| size_t new_size; | | size_t new_size; | |
| if(pbase() == on_stack_) { | | if(pbase() == on_stack_) { | |
|
| current_size = on_stack_size; | | current_size = OnStackSize; | |
| new_size = on_stack_size * 2; | | new_size = OnStackSize * 2; | |
| on_heap_ = (char *)malloc(new_size); | | on_heap_ = (char *)malloc(new_size + 1); | |
| if(!on_heap_) | | if(!on_heap_) | |
| throw std::bad_alloc(); | | throw std::bad_alloc(); | |
| memcpy(on_heap_,on_stack_,current_size); | | memcpy(on_heap_,on_stack_,current_size); | |
| } | | } | |
| else { | | else { | |
| current_size = pptr() - pbase(); | | current_size = pptr() - pbase(); | |
| new_size = current_size * 2; | | new_size = current_size * 2; | |
|
| char *new_ptr = (char *)realloc(on_heap_,new
_size); | | char *new_ptr = (char *)realloc(on_heap_,new
_size + 1); | |
| if(!new_ptr) | | if(!new_ptr) | |
| throw std::bad_alloc(); | | throw std::bad_alloc(); | |
| on_heap_ = new_ptr; | | on_heap_ = new_ptr; | |
| | | | |
| } | | } | |
| setp(on_heap_,on_heap_ + new_size); | | setp(on_heap_,on_heap_ + new_size); | |
| pbump(current_size); | | pbump(current_size); | |
| if(c!=EOF) | | if(c!=EOF) | |
| sputc(c); | | sputc(c); | |
| return 0; | | return 0; | |
| } | | } | |
| private: | | private: | |
| void init() | | void init() | |
| { | | { | |
| on_heap_ = 0; | | on_heap_ = 0; | |
|
| | | setp(on_stack_,on_stack_+OnStackSize); | |
| | | } | |
| | | char *on_heap_; | |
| | | char on_stack_[OnStackSize + 1]; | |
| | | }; | |
| | | | |
| | | template<size_t Size = 128> | |
| | | class steal_buffer : public stackbuf<Size> { | |
| | | public: | |
| | | steal_buffer(std::ostream &out) | |
| | | { | |
| stolen_ = 0; | | stolen_ = 0; | |
| stream_ = 0; | | stream_ = 0; | |
|
| setp(on_stack_,on_stack_+on_stack_size); | | steal(out); | |
| } | | } | |
|
| char *on_heap_; | | steal_buffer() | |
| | | { | |
| | | stolen_ = 0; | |
| | | stream_ = 0; | |
| | | } | |
| | | void steal(std::ostream &out) | |
| | | { | |
| | | release(); | |
| | | stolen_ = out.rdbuf(this); | |
| | | stream_ = &out; | |
| | | } | |
| | | void release() | |
| | | { | |
| | | if(stream_ && stolen_) { | |
| | | stream_->rdbuf(stolen_); | |
| | | } | |
| | | stream_ = 0; | |
| | | stolen_ = 0; | |
| | | } | |
| | | ~steal_buffer() | |
| | | { | |
| | | release(); | |
| | | } | |
| | | private: | |
| std::streambuf *stolen_; | | std::streambuf *stolen_; | |
| std::ostream *stream_; | | std::ostream *stream_; | |
|
| char on_stack_[on_stack_size]; | | }; | |
| | | | |
| | | template<size_t Size = 128> | |
| | | class stackstream : public std::ostream { | |
| | | public: | |
| | | stackstream() : std::ostream(0) | |
| | | { | |
| | | rbbuf(&buf_); | |
| | | } | |
| | | char *begin() | |
| | | { | |
| | | return buf_->begin(); | |
| | | } | |
| | | char *end() | |
| | | { | |
| | | return buf_->end(); | |
| | | } | |
| | | char *c_str() | |
| | | { | |
| | | return buf_.c_str(); | |
| | | } | |
| | | std::string str() | |
| | | { | |
| | | return buf_.str(); | |
| | | } | |
| | | private: | |
| | | stackbuf<Size> buf_; | |
| }; | | }; | |
| | | | |
| } // util | | } // util | |
| } // cppcms | | } // cppcms | |
| | | | |
| #endif | | #endif | |
| | | | |
End of changes. 18 change blocks. |
| 30 lines changed or deleted | | 108 lines changed or added | |
|
| util.h | | util.h | |
| | | | |
| skipping to change at line 13 | | skipping to change at line 13 | |
| // | | // | |
| // Distributed under the Boost Software License, Version 1.0. (See | | // Distributed under the Boost Software License, Version 1.0. (See | |
| // accompanying file LICENSE_1_0.txt or copy at | | // accompanying file LICENSE_1_0.txt or copy at | |
| // http://www.boost.org/LICENSE_1_0.txt) | | // http://www.boost.org/LICENSE_1_0.txt) | |
| // | | // | |
| #ifndef BOOSTER_LOCALE_UTIL_HPP | | #ifndef BOOSTER_LOCALE_UTIL_HPP | |
| #define BOOSTER_LOCALE_UTIL_HPP | | #define BOOSTER_LOCALE_UTIL_HPP | |
| #include <locale> | | #include <locale> | |
| #include <typeinfo> | | #include <typeinfo> | |
| #include <booster/cstdint.h> | | #include <booster/cstdint.h> | |
|
| | | #include <booster/locale/utf.h> | |
| #include <booster/locale/generator.h> | | #include <booster/locale/generator.h> | |
| #include <booster/assert.h> | | #include <booster/assert.h> | |
| | | | |
| #include <vector> | | #include <vector> | |
| namespace booster { | | namespace booster { | |
| namespace locale { | | namespace locale { | |
| /// | | /// | |
| /// \brief This namespace provides various utility function useful for Boos
t.Locale backends | | /// \brief This namespace provides various utility function useful for Boos
t.Locale backends | |
| /// implementations | | /// implementations | |
| /// | | /// | |
| | | | |
| skipping to change at line 83 | | skipping to change at line 84 | |
| /// these converters for certain character set. | | /// these converters for certain character set. | |
| /// | | /// | |
| class base_converter { | | class base_converter { | |
| public: | | public: | |
| | | | |
| /// | | /// | |
| /// This value should be returned when an illegal input sequence or
code-point is observed: | | /// This value should be returned when an illegal input sequence or
code-point is observed: | |
| /// For example if a UCS-32 code-point is in the range reserved for
UTF-16 surrogates | | /// For example if a UCS-32 code-point is in the range reserved for
UTF-16 surrogates | |
| /// or an invalid UTF-8 sequence is found | | /// or an invalid UTF-8 sequence is found | |
| /// | | /// | |
|
| static const uint32_t illegal=0xFFFFFFFF; | | static const uint32_t illegal=utf::illegal; | |
| | | | |
| /// | | /// | |
| /// This value is returned in following cases: The of incomplete in
put sequence was found or | | /// This value is returned in following cases: The of incomplete in
put sequence was found or | |
| /// insufficient output buffer was provided so complete output coul
d not be written. | | /// insufficient output buffer was provided so complete output coul
d not be written. | |
| /// | | /// | |
|
| static const uint32_t incomplete=0xFFFFFFFE; | | static const uint32_t incomplete=utf::incomplete; | |
| | | | |
| virtual ~base_converter() | | virtual ~base_converter() | |
| { | | { | |
| } | | } | |
| /// | | /// | |
| /// Return the maximal length that one Unicode code-point can be co
nverted to, for example | | /// Return the maximal length that one Unicode code-point can be co
nverted to, for example | |
| /// for UTF-8 it is 4, for Shift-JIS it is 2 and ISO-8859-1 is 1 | | /// for UTF-8 it is 4, for Shift-JIS it is 2 and ISO-8859-1 is 1 | |
| /// | | /// | |
| virtual int max_len() const | | virtual int max_len() const | |
| { | | { | |
| | | | |
End of changes. 3 change blocks. |
| 2 lines changed or deleted | | 3 lines changed or added | |
|
| xss.h | | xss.h | |
| | | | |
| skipping to change at line 32 | | skipping to change at line 32 | |
| #include <booster/copy_ptr.h> | | #include <booster/copy_ptr.h> | |
| #include <booster/regex.h> | | #include <booster/regex.h> | |
| #include <booster/function.h> | | #include <booster/function.h> | |
| #include <cppcms/defs.h> | | #include <cppcms/defs.h> | |
| | | | |
| #include <string.h> | | #include <string.h> | |
| #include <string> | | #include <string> | |
| #include <algorithm> | | #include <algorithm> | |
| | | | |
| namespace cppcms { | | namespace cppcms { | |
|
| | | namespace json { | |
| | | class value; | |
| | | } | |
| /// | | /// | |
| /// \brief Namespace that holds Anti-Cross Site Scripting Filter sup
port | | /// \brief Namespace that holds Anti-Cross Site Scripting Filter sup
port | |
| /// | | /// | |
| /// The classes in this namespace created to provide a filtering for
a save | | /// The classes in this namespace created to provide a filtering for
a save | |
| /// handing of HTML and preventing XSS attacks | | /// handing of HTML and preventing XSS attacks | |
| /// | | /// | |
| namespace xss { | | namespace xss { | |
| | | | |
| /// \cond INTERNAL | | /// \cond INTERNAL | |
| namespace details { | | namespace details { | |
| | | | |
| skipping to change at line 105 | | skipping to change at line 108 | |
| /// it and use it for filtering and validation - and make yo
ur attackers cry :-). | | /// it and use it for filtering and validation - and make yo
ur attackers cry :-). | |
| /// | | /// | |
| /// | | /// | |
| class CPPCMS_API rules { | | class CPPCMS_API rules { | |
| public: | | public: | |
| rules(); | | rules(); | |
| rules(rules const &); | | rules(rules const &); | |
| rules const &operator=(rules const &); | | rules const &operator=(rules const &); | |
| ~rules(); | | ~rules(); | |
| | | | |
|
| | | /// Create rules from JSON object \a r | |
| | | /// | |
| | | /// The json object the defines the XSS prevention r | |
| | | ules. | |
| | | /// This object has following properties: | |
| | | /// | |
| | | /// - "xhtml" - boolean; default true - use XHTML (t | |
| | | rue) or HTML input | |
| | | /// - "comments" - boolean; setting it to true allow | |
| | | s comments, default false | |
| | | /// - "numeric_entities" - boolean; setting it to tr | |
| | | ue allows numeric_entities, default false | |
| | | /// - "entities" - array of strings: list of allowed | |
| | | HTML entities besides lt, gt and amp | |
| | | /// - "encoding" - string; the encoding of the text | |
| | | to validate, by default not checked and the | |
| | | /// input is assumed to be ASCII compatible. Alw | |
| | | ays specifiy it for multibyte encodings | |
| | | /// like Shift-JIS or GBK as they are not ASCII | |
| | | compatible. | |
| | | /// - "tags" - object with 3 properties of type arra | |
| | | y of string: | |
| | | /// - "opening_and_closing" - the tags that shou | |
| | | ld come in pair like "<b></b>" | |
| | | /// - "stand_alone" - the tags that should appea | |
| | | r stand alone like "<br/>" | |
| | | /// - "any_tag" - the tags that can be both like | |
| | | "<input>" | |
| | | /// - "attributes" - array of objects that define HT | |
| | | ML attributes. Each object consists | |
| | | /// of following properties: | |
| | | /// - "type" - string - the type of the attribut | |
| | | e one of: "boolean", "uri", "relative_uri", | |
| | | /// "absolute_uri", "integer", "regex". | |
| | | /// - "scheme" - string the allowed URI scheme - | |
| | | regular expression like "(http|ftp)". Used with | |
| | | /// "uri" and "absolute_uri" type | |
| | | /// - "expression" - string the regular express | |
| | | ion that defines the value that the attribute | |
| | | /// should match. | |
| | | /// - "tags" - array of strings - list of tags t | |
| | | hat this attribute is allowed for. | |
| | | /// - "attributes" - array of strings - lisf of | |
| | | names of the attribute | |
| | | /// - "pairs" - array of objects that consists o | |
| | | f two properities "tag" and "attr" of | |
| | | /// type string that define tag and attr | |
| | | ibuted that such type of property | |
| | | /// should be allowed for. | |
| | | /// | |
| | | /// The extra properties that are not defined by thi | |
| | | s scheme are ingored | |
| | | /// | |
| | | /// For example: | |
| | | /// \code | |
| | | /// { | |
| | | /// "xhtml" : true, | |
| | | /// "encoding" : "UTF-8", | |
| | | /// "entities" : [ "nbsp" , "copy" ], | |
| | | /// "comments" : false, | |
| | | /// "numeric_entities" : false, | |
| | | /// "tags" : { | |
| | | /// "opening_and_closing" : [ | |
| | | /// "p", "b", "i", "tt", | |
| | | /// "a", | |
| | | /// "strong", "em", | |
| | | /// "sub", "sup", | |
| | | /// "ol", "ul", "li", | |
| | | /// "dd", "dt", "dl", | |
| | | /// "blockquote","code", "pre", | |
| | | /// "span", "div" | |
| | | /// ], | |
| | | /// "stand_alone" : [ "br", "hr", "img" | |
| | | ] | |
| | | /// ], | |
| | | /// "attributes": [ | |
| | | /// { | |
| | | /// "tags" : [ "p", "li", "ul" ] | |
| | | /// "attr" : [ "style" ], | |
| | | /// "type" : "regex", | |
| | | /// "expression" : "\\s*text-alg | |
| | | in:\\s*(center|left|right|justify);?\\s*" | |
| | | /// }, | |
| | | /// { | |
| | | /// "tags" : [ "span", "div" ] | |
| | | /// "attr" : [ "class", "id" ], | |
| | | /// "type" : "regex", | |
| | | /// "expression" : "[a-zA-Z_0-9] | |
| | | +" | |
| | | /// }, | |
| | | /// { | |
| | | /// "pairs" : [ | |
| | | /// { "tag" : "a", "at | |
| | | tr" : "href" }, | |
| | | /// { "tag" : "img", "at | |
| | | tr" : "src" } | |
| | | /// ], | |
| | | /// "type" : "absolute_uri", | |
| | | /// "scheme" : "(http|https|ftp) | |
| | | " | |
| | | /// }, | |
| | | /// { | |
| | | /// "tags" : [ "img" ], | |
| | | /// "attr" : [ "alt" ], | |
| | | /// "type" : "regex", | |
| | | /// "expression" : ".*" | |
| | | /// } | |
| | | /// ] | |
| | | /// } | |
| | | /// \endcode | |
| | | /// | |
| | | rules(json::value const &r); | |
| | | | |
| | | /// | |
| | | /// Create rules from the JSON object stored in the | |
| | | file \a file_name | |
| | | /// | |
| | | /// \see rules(json::value const&) | |
| | | /// | |
| | | rules(std::string const &file_name); | |
| | | | |
| /// | | /// | |
| /// How to treat in input | | /// How to treat in input | |
| /// | | /// | |
| typedef enum { | | typedef enum { | |
| xhtml_input, ///< Assume that the input is X
HTML | | xhtml_input, ///< Assume that the input is X
HTML | |
| html_input ///< Assume that the input is H
TML | | html_input ///< Assume that the input is H
TML | |
| } html_type; | | } html_type; | |
| | | | |
| /// | | /// | |
| /// The type of tag | | /// The type of tag | |
| | | | |
| skipping to change at line 208 | | skipping to change at line 304 | |
| void add_uri_property(std::string const &tag_name,st
d::string const &property,std::string const &schema); | | void add_uri_property(std::string const &tag_name,st
d::string const &property,std::string const &schema); | |
| | | | |
| /// | | /// | |
| /// \deprecated use uri_validator | | /// \deprecated use uri_validator | |
| /// | | /// | |
| /// Create a regular expression that checks URI for
safe inclusion in the property. | | /// Create a regular expression that checks URI for
safe inclusion in the property. | |
| /// By default it allows only: http, https, ftp, mai
lto, news, nntp. | | /// By default it allows only: http, https, ftp, mai
lto, news, nntp. | |
| /// | | /// | |
| /// If you need finer control over allowed schemas,
use uri_matcher(std::string const&). | | /// If you need finer control over allowed schemas,
use uri_matcher(std::string const&). | |
| /// | | /// | |
|
| static booster::regex uri_matcher(); | | CPPCMS_DEPRECATED static booster::regex uri_matcher(
); | |
| /// | | /// | |
| /// \deprecated use uri_validator | | /// \deprecated use uri_validator | |
| /// | | /// | |
| /// Create a regular expression that checks URI for
safe inclusion in the text, where | | /// Create a regular expression that checks URI for
safe inclusion in the text, where | |
| /// schema is a regular expression that matches spec
ific protocols that can be used. | | /// schema is a regular expression that matches spec
ific protocols that can be used. | |
| /// | | /// | |
| /// \note Don't add "^" or "$" tags as this expressi
on would be used in construction of regular | | /// \note Don't add "^" or "$" tags as this expressi
on would be used in construction of regular | |
| /// other expression. | | /// other expression. | |
| /// | | /// | |
| /// For example: | | /// For example: | |
| /// \code | | /// \code | |
| /// booster::regex uri = uri_matcher("(http|https)")
; | | /// booster::regex uri = uri_matcher("(http|https)")
; | |
| /// \endcode | | /// \endcode | |
| /// | | /// | |
|
| static booster::regex uri_matcher(std::string const
&schema); | | CPPCMS_DEPRECATED static booster::regex uri_matcher(
std::string const &schema); | |
| | | | |
| //// | | //// | |
| /// Create a validator that checks URI for safe incl
usion in the property. | | /// Create a validator that checks URI for safe incl
usion in the property. | |
| /// By default it allows only: http, https, ftp, mai
lto, news, nntp. | | /// By default it allows only: http, https, ftp, mai
lto, news, nntp. | |
| /// | | /// | |
| /// If you need finer control over allowed schemas,
use uri_validator(std::string const&). | | /// If you need finer control over allowed schemas,
use uri_validator(std::string const&). | |
| /// | | /// | |
| static validator_type uri_validator(); | | static validator_type uri_validator(); | |
| //// | | //// | |
| /// Create a validator that checks URI for safe incl
usion in the property. | | /// Create a validator that checks URI for safe incl
usion in the property. | |
| | | | |
End of changes. 4 change blocks. |
| 2 lines changed or deleted | | 126 lines changed or added | |
|