#ifndef ___SINGLE_KEYWORD_H__ #define ___SINGLE_KEYWORD_H__ #include #include #include #include #include "buffer.h" #include "keyword_comp.h" #include "debug.h" USE_DEBUG_FLAG(D_KEYWORD); enum class MatchStatus { Match, NoMatch, NoMatchFinal }; class KeywordError { public: KeywordError(const std::string &str) : err(str) { } const std::string & getErr() const { return err; } private: std::string err; }; class KeywordAttr { public: KeywordAttr(const std::string &str); const std::string& getAttrName() const { return params[0]; } const std::vector & getParams() const { return params; } private: std::vector params; }; class KeywordParsed { public: KeywordParsed(const std::string &keyword); const std::string & getName() const { return name; } const std::vector & getAttr() const { return attr; } private: std::string name; std::vector attr; }; class I_KeywordRuntimeState { public: virtual uint getOffset(const std::string &ctx) const = 0; virtual uint getVariable(uint requested_var_id) const = 0; protected: virtual ~I_KeywordRuntimeState() { } }; class OffsetRuntimeState : public I_KeywordRuntimeState { public: OffsetRuntimeState(const I_KeywordRuntimeState *prev, const std::string &ctx, uint offset); virtual ~OffsetRuntimeState() { } uint getOffset(const std::string &requested_ctx_id) const override; uint getVariable(uint requested_var_id) const override; private: const I_KeywordRuntimeState *prev; std::string ctx; uint offset; }; class VariableRuntimeState : public I_KeywordRuntimeState { public: VariableRuntimeState(const I_KeywordRuntimeState *prev, uint var_id, uint val); virtual ~VariableRuntimeState() { } uint getOffset(const std::string &requested_ctx_id) const override; uint getVariable(uint requested_var_id) const override; private: const I_KeywordRuntimeState *prev; uint var_id; uint value; }; class VariablesMapping { public: uint addNewVariable(const std::string &name); Maybe getVariableId(const std::string &name) const; private: std::map mapping; }; class NumericAttr { enum class Status { Unset, Const, Var }; public: void setAttr( const KeywordAttr &attr, const VariablesMapping &known_vars, const std::string &keyword_name, const uint base = 10, bool is_unsigned_val = false); void setAttr( const std::string &attr_name, const std::string ¶m, const VariablesMapping &known_vars, const std::string &keyword_name, const uint base = 10, bool is_unsigned_val = false); int evalAttr(const I_KeywordRuntimeState *prev) const; bool isConstant() const { return status!=Status::Var; } bool isSet() const { return status!=Status::Unset; } private: Status status = Status::Unset; int val = 0; }; class BoolAttr { public: void setAttr(const KeywordAttr &attr, const std::string &keyword_name); void setAttr(const std::string &keyword_name, const std::string &attr_name); operator bool() const { return val; } private: bool val = false; }; class CtxAttr { public: void setAttr(const KeywordAttr &attr, const std::string &keyword_name); operator std::string() const { if (!is_set) { auto env = Singleton::Consume::by(); auto default_ctx = env->get(I_KeywordsRule::getKeywordsRuleTag()); if (default_ctx.ok()) return *default_ctx; dbgError(D_KEYWORD) << "Running keyword rule without specific context and without default"; return "Missing Default Context"; } return ctx; } private: std::string ctx; bool is_set = false; }; class ComparisonAttr { public: enum class CompId { EQUAL, NOT_EQUAL, LESS_THAN, GREATER_THAN, LESS_THAN_OR_EQUAL, GREATER_THAN_OR_EQUAL }; void setAttr(const std::string ¶m, const std::string &keyword_name); bool operator()(int first_val, int second_val) const; bool isSet() const { return is_set; } private: Maybe getComparisonByName(const std::string &name); const static std::map name_to_operator; bool is_set = false; CompId comp_val; }; class SingleKeyword { public: SingleKeyword() { } virtual ~SingleKeyword() { } MatchStatus runNext(const I_KeywordRuntimeState *curr) const; void appendKeyword(std::unique_ptr &&_next); virtual MatchStatus isMatch(const I_KeywordRuntimeState *prev) const = 0; private: std::unique_ptr next; }; std::unique_ptr genDataKeyword( const std::vector &attr, VariablesMapping &vars ); std::unique_ptr genPCREKeyword( const std::vector &attr, VariablesMapping &vars ); std::unique_ptr genLengthKeyword( const std::vector &attr, VariablesMapping &vars ); std::unique_ptr genByteExtractKeyword( const std::vector &attr, VariablesMapping &vars ); std::unique_ptr genCompareKeyword( const std::vector &attr, VariablesMapping &vars ); std::unique_ptr genStateopKeyword( const std::vector &attr, VariablesMapping &vars ); std::unique_ptr genNoMatchKeyword( const std::vector &attr, VariablesMapping &vars ); std::unique_ptr genJumpKeyword( const std::vector &attr, VariablesMapping &vars ); std::unique_ptr getKeywordByName( const KeywordParsed &parsed_data, VariablesMapping &vars ); #endif // ___SINGLE_KEYWORD_H__