Skip to content
Snippets Groups Projects
Unverified Commit 9a740f04 authored by Bensong Liu's avatar Bensong Liu
Browse files

add reverse filter

parent 221ccbe3
No related branches found
No related tags found
No related merge requests found
...@@ -30,7 +30,7 @@ namespace Filters { ...@@ -30,7 +30,7 @@ namespace Filters {
}; };
struct ChainedFilters : public BaseFilter { struct ChainedFilters : public BaseFilter {
ChainedFilters(const std::list<Filters::BaseFilter*>& chainedFilters) explicit ChainedFilters(const std::list<Filters::BaseFilter*>& chainedFilters)
: chainedFilters(chainedFilters) {} : chainedFilters(chainedFilters) {}
// Usually the encrypt/encode/obfs function. // Usually the encrypt/encode/obfs function.
...@@ -42,7 +42,7 @@ namespace Filters { ...@@ -42,7 +42,7 @@ namespace Filters {
} }
// Usually the decrypt/decode/de-obfs function. // Usually the decrypt/decode/de-obfs function.
virtual string convertBackward(string binaryDatagram) { virtual string convertBackward(string binaryDatagram) override {
for (auto iter = chainedFilters.rbegin(); iter != chainedFilters.rend(); ++iter) { for (auto iter = chainedFilters.rbegin(); iter != chainedFilters.rend(); ++iter) {
binaryDatagram = (*iter)->convertForward(binaryDatagram); binaryDatagram = (*iter)->convertForward(binaryDatagram);
} }
...@@ -51,6 +51,29 @@ namespace Filters { ...@@ -51,6 +51,29 @@ namespace Filters {
const std::list<Filters::BaseFilter*>& chainedFilters; const std::list<Filters::BaseFilter*>& chainedFilters;
}; };
struct ReversedFilter : public BaseFilter {
explicit ReversedFilter(BaseFilter* real, bool I_should_delete = false) : real(real), I_should_delete(I_should_delete) {}
virtual ~ReversedFilter() {
if (I_should_delete)
delete real;
}
// Usually the encrypt/encode/obfs function.
virtual string convertForward(string binaryDatagram) override {
return real->convertBackward(binaryDatagram);
}
// Usually the decrypt/decode/de-obfs function.
virtual string convertBackward(string binaryDatagram) override {
return real->convertForward(binaryDatagram);
}
bool I_should_delete = false;
BaseFilter* real;
};
} }
#endif #endif
......
...@@ -14,6 +14,23 @@ ...@@ -14,6 +14,23 @@
using std::string; using std::string;
// This function parse the FilterConfig string for you. Register implemented modules here!
inline Filters::BaseFilter* CreateFilterFromConfig(rlib::string filterConfig) {
Filters::BaseFilter *newFilter = nullptr;
if (filterConfig.starts_with("aes@"))
newFilter = new Filters::AESFilter();
else if (filterConfig.starts_with("xor@"))
newFilter = new Filters::XorFilter(); // these filters were not deleted. just a note.
else if (filterConfig.starts_with("reverse@")) {
auto newFilterConfig = filterConfig.substr(8);
newFilter = new Filters::ReversedFilter(CreateFilterFromConfig(newFilterConfig), true);
}
else
throw std::invalid_argument("Unknown filter in filterConfig item: " + filterConfig);
newFilter->loadConfig(filterConfig);
return newFilter;
}
class Forwarder { class Forwarder {
public: public:
...@@ -36,19 +53,8 @@ public: ...@@ -36,19 +53,8 @@ public:
std::list<Filters::BaseFilter*> chainedFilters; std::list<Filters::BaseFilter*> chainedFilters;
for (auto &&filterConfig : filterConfigs) { for (auto &&filterConfig : filterConfigs)
Filters::BaseFilter *newFilter = nullptr; chainedFilters.push_back(CreateFilterFromConfig(filterConfig));
if (filterConfig.starts_with("aes"))
newFilter = new Filters::AESFilter();
else if (filterConfig.starts_with("xor"))
newFilter = new Filters::XorFilter(); // these filters were not deleted. just a note.
else
throw std::invalid_argument("Unknown filter in filterConfig item: " + filterConfig);
newFilter->loadConfig(filterConfig);
chainedFilters.push_back(newFilter);
}
ptrFilter = new Filters::ChainedFilters(chainedFilters); ptrFilter = new Filters::ChainedFilters(chainedFilters);
} }
......
...@@ -26,7 +26,7 @@ int real_main(int argc, char **argv) { ...@@ -26,7 +26,7 @@ int real_main(int argc, char **argv) {
rlog.info(" '$method@$params', available methods: "); rlog.info(" '$method@$params', available methods: ");
rlog.info(" 'plain@$addr@$port', 'misc@$addr@$portRange@$psk'"); rlog.info(" 'plain@$addr@$port', 'misc@$addr@$portRange@$psk'");
rlog.info("There could be multiple --filter, but they MUST be in correct order. "); rlog.info("There could be multiple --filter, but they MUST be in correct order. ");
rlog.info("available filters: 'aes@$password' , 'xor@$password'"); rlog.info("available filters: 'aes@$password' , 'xor@$password', 'reverse@$otherFilter'");
return 0; return 0;
} }
auto inboundConfig = args.getValueArg("-i"); auto inboundConfig = args.getValueArg("-i");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment