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 {
};
struct ChainedFilters : public BaseFilter {
ChainedFilters(const std::list<Filters::BaseFilter*>& chainedFilters)
explicit ChainedFilters(const std::list<Filters::BaseFilter*>& chainedFilters)
: chainedFilters(chainedFilters) {}
// Usually the encrypt/encode/obfs function.
......@@ -42,7 +42,7 @@ namespace Filters {
}
// 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) {
binaryDatagram = (*iter)->convertForward(binaryDatagram);
}
......@@ -51,6 +51,29 @@ namespace Filters {
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
......
......@@ -14,6 +14,23 @@
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 {
public:
......@@ -36,19 +53,8 @@ public:
std::list<Filters::BaseFilter*> chainedFilters;
for (auto &&filterConfig : filterConfigs) {
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
throw std::invalid_argument("Unknown filter in filterConfig item: " + filterConfig);
newFilter->loadConfig(filterConfig);
chainedFilters.push_back(newFilter);
}
for (auto &&filterConfig : filterConfigs)
chainedFilters.push_back(CreateFilterFromConfig(filterConfig));
ptrFilter = new Filters::ChainedFilters(chainedFilters);
}
......
......@@ -26,7 +26,7 @@ int real_main(int argc, char **argv) {
rlog.info(" '$method@$params', available methods: ");
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("available filters: 'aes@$password' , 'xor@$password'");
rlog.info("available filters: 'aes@$password' , 'xor@$password', 'reverse@$otherFilter'");
return 0;
}
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