mirror of
https://github.com/znc/znc.git
synced 2026-05-10 07:14:43 +02:00
Add modperl support for sasl
This commit is contained in:
@@ -98,6 +98,7 @@ while (<$in>) {
|
|||||||
say $out "\t\tPUSH_PTR($sub*, *i);";
|
say $out "\t\tPUSH_PTR($sub*, *i);";
|
||||||
say $out "\t}";
|
say $out "\t}";
|
||||||
}
|
}
|
||||||
|
when (/SCString/) { my $b=$a->{base}; $b=~s/^const//; say $out "\tPUSH_PTR($b*, &$a->{var});" }
|
||||||
when (/CString/) { say $out "\tPUSH_STR($a->{var});" }
|
when (/CString/) { say $out "\tPUSH_STR($a->{var});" }
|
||||||
when (/\*$/) { my $t=$a->{type}; $t=~s/^const//; say $out "\tPUSH_PTR($t, $a->{var});" }
|
when (/\*$/) { my $t=$a->{type}; $t=~s/^const//; say $out "\tPUSH_PTR($t, $a->{var});" }
|
||||||
when (/&$/) { my $b=$a->{base}; $b=~s/^const//; say $out "\tPUSH_PTR($b*, &$a->{var});" }
|
when (/&$/) { my $b=$a->{base}; $b=~s/^const//; say $out "\tPUSH_PTR($b*, &$a->{var});" }
|
||||||
|
|||||||
@@ -103,3 +103,8 @@ EModRet OnChanNoticeMessage(CNoticeMessage& Message)
|
|||||||
EModRet OnTopicMessage(CTopicMessage& Message)
|
EModRet OnTopicMessage(CTopicMessage& Message)
|
||||||
EModRet OnSendToClientMessage(CMessage& Message)
|
EModRet OnSendToClientMessage(CMessage& Message)
|
||||||
EModRet OnSendToIRCMessage(CMessage& Message)
|
EModRet OnSendToIRCMessage(CMessage& Message)
|
||||||
|
|
||||||
|
void OnClientGetSASLMechanisms(SCString& ssMechanisms)
|
||||||
|
EModRet OnClientSASLServerInitialChallenge(const CString& sMechanism, CString& sResponse)
|
||||||
|
EModRet OnClientSASLAuthenticate(const CString& sMechanism, const CString& sMessage)
|
||||||
|
void OnClientSASLAborted()
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
#include "znc/Buffer.h"
|
#include "znc/Buffer.h"
|
||||||
#include "modperl/module.h"
|
#include "modperl/module.h"
|
||||||
#define stat struct stat
|
#define stat struct stat
|
||||||
|
#include "modperl/pstring.h"
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%apply long { off_t };
|
%apply long { off_t };
|
||||||
@@ -66,11 +67,32 @@
|
|||||||
%include <std_deque.i>
|
%include <std_deque.i>
|
||||||
|
|
||||||
namespace std {
|
namespace std {
|
||||||
template<class K> class set {
|
template<class K> class set {
|
||||||
public:
|
public:
|
||||||
set();
|
set();
|
||||||
set(const set<K>&);
|
set(const set<K>&);
|
||||||
};
|
unsigned int size() const;
|
||||||
|
bool empty() const;
|
||||||
|
void clear();
|
||||||
|
void insert(const K& key);
|
||||||
|
void erase(const K& key);
|
||||||
|
%extend {
|
||||||
|
bool has_key(const K& key) {
|
||||||
|
auto i = self->find(key);
|
||||||
|
return i != self->end();
|
||||||
|
}
|
||||||
|
SV* keys_() {
|
||||||
|
AV* av = newAV_alloc_x(self->size());
|
||||||
|
// assume SCString
|
||||||
|
int i = 0;
|
||||||
|
for (const auto& a : *self) {
|
||||||
|
av_store(av, i++, PString(a).GetSV(false));
|
||||||
|
}
|
||||||
|
SV* result = newRV_noinc((SV*)av);
|
||||||
|
return sv_2mortal(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
%include "modperl/CString.i"
|
%include "modperl/CString.i"
|
||||||
|
|
||||||
@@ -98,9 +120,9 @@ namespace std {
|
|||||||
%template(VCString) std::vector<CString>;
|
%template(VCString) std::vector<CString>;
|
||||||
typedef std::vector<CString> VCString;
|
typedef std::vector<CString> VCString;
|
||||||
/*%template(MNicks) std::map<CString, CNick>;*/
|
/*%template(MNicks) std::map<CString, CNick>;*/
|
||||||
/*%template(SModInfo) std::set<CModInfo>;
|
/*%template(SModInfo) std::set<CModInfo>;*/
|
||||||
%template(SCString) std::set<CString>;
|
%template(SCString) std::set<CString>;
|
||||||
typedef std::set<CString> SCString;*/
|
typedef std::set<CString> SCString;
|
||||||
%template(PerlMCString) std::map<CString, CString>;
|
%template(PerlMCString) std::map<CString, CString>;
|
||||||
class MCString : public std::map<CString, CString> {};
|
class MCString : public std::map<CString, CString> {};
|
||||||
/*%template(PerlModulesVector) std::vector<CModule*>;*/
|
/*%template(PerlModulesVector) std::vector<CModule*>;*/
|
||||||
@@ -294,6 +316,13 @@ typedef std::vector<std::pair<CString, CString> > VPair;
|
|||||||
return %$result;
|
return %$result;
|
||||||
}
|
}
|
||||||
*GetNicks = *_GetNicks_;
|
*GetNicks = *_GetNicks_;
|
||||||
|
|
||||||
|
package ZNC::SCString;
|
||||||
|
sub keys {
|
||||||
|
my $self = shift;
|
||||||
|
my $keys = $self->keys_;
|
||||||
|
return @$keys;
|
||||||
|
}
|
||||||
%}
|
%}
|
||||||
|
|
||||||
/* vim: set filetype=cpp: */
|
/* vim: set filetype=cpp: */
|
||||||
|
|||||||
@@ -160,6 +160,13 @@ class ZNC_EXPORT_LIB_EXPORT CPerlModule : public CModule {
|
|||||||
EModRet OnTopicMessage(CTopicMessage& Message) override;
|
EModRet OnTopicMessage(CTopicMessage& Message) override;
|
||||||
EModRet OnSendToClientMessage(CMessage& Message) override;
|
EModRet OnSendToClientMessage(CMessage& Message) override;
|
||||||
EModRet OnSendToIRCMessage(CMessage& Message) override;
|
EModRet OnSendToIRCMessage(CMessage& Message) override;
|
||||||
|
|
||||||
|
void OnClientGetSASLMechanisms(SCString& ssMechanisms) override;
|
||||||
|
EModRet OnClientSASLServerInitialChallenge(const CString& sMechanism,
|
||||||
|
CString& sResponse) override;
|
||||||
|
EModRet OnClientSASLAuthenticate(const CString& sMechanism,
|
||||||
|
const CString& sMessage) override;
|
||||||
|
void OnClientSASLAborted() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline CPerlModule* AsPerlModule(CModule* p) {
|
static inline CPerlModule* AsPerlModule(CModule* p) {
|
||||||
|
|||||||
@@ -404,5 +404,62 @@ TEST_F(ZNCTest, ModpythonSaslAuth) {
|
|||||||
"as user");
|
"as user");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ZNCTest, ModperlSaslAuth) {
|
||||||
|
#ifndef WANT_PERL
|
||||||
|
GTEST_SKIP() << "Modperl is disabled";
|
||||||
|
#endif
|
||||||
|
auto znc = Run();
|
||||||
|
znc->CanLeak();
|
||||||
|
|
||||||
|
InstallModule("sasltest.pm", R"(
|
||||||
|
package sasltest;
|
||||||
|
use base 'ZNC::Module';
|
||||||
|
sub module_types { $ZNC::CModInfo::GlobalModule }
|
||||||
|
|
||||||
|
sub OnClientGetSASLMechanisms {
|
||||||
|
my $self = shift;
|
||||||
|
my $mechs = shift;
|
||||||
|
$mechs->insert('FOO');
|
||||||
|
}
|
||||||
|
|
||||||
|
sub OnClientSASLServerInitialChallenge {
|
||||||
|
if ($_[1] eq "FOO") {
|
||||||
|
$_[2] = "Welcome";
|
||||||
|
}
|
||||||
|
return $ZNC::CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub OnClientSASLAuthenticate {
|
||||||
|
my $self = $_[0];
|
||||||
|
if ($_[1] eq "FOO") {
|
||||||
|
my $user = ZNC::CZNC::Get()->FindUser("user");
|
||||||
|
$self->GetClient->AcceptSASLLogin($user);
|
||||||
|
return $ZNC::HALT;
|
||||||
|
}
|
||||||
|
return $ZNC::CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
)");
|
||||||
|
|
||||||
|
auto ircd = ConnectIRCd();
|
||||||
|
auto client = LoginClient();
|
||||||
|
client.Write("znc loadmod modperl");
|
||||||
|
client.Write("znc loadmod sasltest");
|
||||||
|
client.ReadUntil("Loaded");
|
||||||
|
|
||||||
|
auto client2 = ConnectClient();
|
||||||
|
client2.Write("CAP LS 302");
|
||||||
|
client2.Write("NICK nick");
|
||||||
|
client2.ReadUntil(" sasl=FOO,PLAIN ");
|
||||||
|
client2.Write("CAP REQ :sasl");
|
||||||
|
client2.Write("AUTHENTICATE FOO");
|
||||||
|
client2.ReadUntil("AUTHENTICATE " + QByteArrayLiteral("Welcome").toBase64());
|
||||||
|
client2.Write("AUTHENTICATE +");
|
||||||
|
client2.ReadUntil(
|
||||||
|
":irc.znc.in 900 nick nick!user@127.0.0.1 user :You are now logged in "
|
||||||
|
"as user");
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace znc_inttest
|
} // namespace znc_inttest
|
||||||
|
|||||||
Reference in New Issue
Block a user