1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2 
3 #ifndef FILTERUTILITY_H
4 #define FILTERUTILITY_H
5 
6 #include "remote/i2-remote.hpp"
7 #include "remote/apiuser.hpp"
8 #include "config/expression.hpp"
9 #include "base/dictionary.hpp"
10 #include "base/configobject.hpp"
11 #include <set>
12 
13 namespace icinga
14 {
15 
16 class TargetProvider : public Object
17 {
18 public:
19 	DECLARE_PTR_TYPEDEFS(TargetProvider);
20 
21 	virtual void FindTargets(const String& type, const std::function<void (const Value&)>& addTarget) const = 0;
22 	virtual Value GetTargetByName(const String& type, const String& name) const = 0;
23 	virtual bool IsValidType(const String& type) const = 0;
24 	virtual String GetPluralName(const String& type) const = 0;
25 };
26 
27 class ConfigObjectTargetProvider final : public TargetProvider
28 {
29 public:
30 	DECLARE_PTR_TYPEDEFS(ConfigObjectTargetProvider);
31 
32 	void FindTargets(const String& type, const std::function<void (const Value&)>& addTarget) const override;
33 	Value GetTargetByName(const String& type, const String& name) const override;
34 	bool IsValidType(const String& type) const override;
35 	String GetPluralName(const String& type) const override;
36 };
37 
38 struct QueryDescription
39 {
40 	std::set<String> Types;
41 	TargetProvider::Ptr Provider;
42 	String Permission;
43 };
44 
45 /**
46  * Filter utilities.
47  *
48  * @ingroup remote
49  */
50 class FilterUtility
51 {
52 public:
53 	static Type::Ptr TypeFromPluralName(const String& pluralName);
54 	static void CheckPermission(const ApiUser::Ptr& user, const String& permission, Expression **filter = nullptr);
55 	static std::vector<Value> GetFilterTargets(const QueryDescription& qd, const Dictionary::Ptr& query,
56 		const ApiUser::Ptr& user, const String& variableName = String());
57 	static bool EvaluateFilter(ScriptFrame& frame, Expression *filter,
58 		const Object::Ptr& target, const String& variableName = String());
59 };
60 
61 }
62 
63 #endif /* FILTERUTILITY_H */
64