diff --git a/midgard.pl b/midgard.pl index c6b6adc0dfb58b83b09eefd076af837ceb2d8a7c..d690d907f5145925e1060c7c4d620196a8ac7793 100644 --- a/midgard.pl +++ b/midgard.pl @@ -1,32 +1,41 @@ #!/usr/bin/env perl +# by virii - C3L use strict; use warnings; use diagnostics; +use utf8; + use YAML::Tiny; use XML::LibXML; use MIME::Base64; +use Net::EasyTCP; use AnyEvent::XMLRPC; use experimental 'smartmatch'; ################################################################################################## -my ($YAMLoutput, $YAMLbase64); +my ($YAMLoutput, $YAMLbase64, $YAMLconfig); my ($member, $memberstatus, $membercounter, $username); my ($voting, $birthday, $address, $votingright, $votingrights); -my ($regularmember, $studentmember, $supportmember, $starvingmember); -my ($serv, $sharedsecret, $XMLparser, $XMLfile, $XMLquery, $XMLnode); +my ($regularmember, $studentmember, $supportmember, $starvingmember, $bifröstconfig); +my ($serv, $sharedsecret, $XMLparser, $XMLfile, $XMLquery, $XMLnode, $TCPclient, $TCPreply); my ($chaosid, $lastname, $forename, $email, $status, $date, $paid, $userbox, $keyowner, $comment); my (@members, @usernames, %usercontacts); my @sharedsecrets = ('secret', 'password'); ################################################################################################## +################################################################################################## +$YAMLconfig = YAML::Tiny->read( '/etc/bifröst/client-config.yml' ) || die "[-] File not found or not a valid YAML"; +$bifröstconfig = $YAMLconfig->[0]; +################################################################################################## + $serv = AnyEvent::XMLRPC->new( port => 9090, uri => "/RPC2", ssl => { - cert_file => "cert.pem", - key_file => "key.pem" + cert_file => "/etc/midgard/cert.pem", + key_file => "/etc/midgard/key.pem" }, methods => { 'CHAOSID' => \&CHAOSID, @@ -37,15 +46,14 @@ $serv = AnyEvent::XMLRPC->new( ); + sub CHAOSID { ($sharedsecret, $chaosid) = ("none", 0); ($sharedsecret, $chaosid) = @_; return "FUCK OFF" unless ($sharedsecret ~~ @sharedsecrets); return "NO CHAOS ID" unless (length $chaosid == 36); - $XMLparser = XML::LibXML->new(); - $XMLfile = $XMLparser->parse_file('datebank'); - @members = $XMLfile->findnodes('/memberdatebank/memberen/member'); + _OPEN_DATABASE(); $username = 0; @@ -68,17 +76,15 @@ sub MEMBERINFO { return "FUCK OFF" unless ($sharedsecret ~~ @sharedsecrets); return "NO USER" unless $username; - $XMLparser = XML::LibXML->new(); - $XMLfile = $XMLparser->parse_file('datebank'); - @members = $XMLfile->findnodes('/memberdatebank/memberen/member'); + _OPEN_DATABASE(); ($chaosid, $lastname, $forename, $email, $status, $date, $paid, $userbox, $keyowner, $comment) = 0; $XMLquery = "/memberdatebank/memberen/member[nick/text() = '$username']"; foreach $XMLnode ($XMLfile->findnodes($XMLquery)) { $chaosid = $XMLnode->findnodes('./id'); - $lastname = $XMLnode->findnodes('./numm'); - $forename = $XMLnode->findnodes('./nonumm'); + $forename = $XMLnode->findnodes('./numm'); + $lastname = $XMLnode->findnodes('./nonumm'); $birthday = $XMLnode->findnodes('./gebuertsdag'); $address = $XMLnode->findnodes('./adress'); $email = $XMLnode->findnodes('./email'); @@ -124,9 +130,7 @@ sub COUNTER { $sharedsecret = shift||"none"; return "FUCK OFF" unless ($sharedsecret ~~ @sharedsecrets); - $XMLparser = XML::LibXML->new(); - $XMLfile = $XMLparser->parse_file('datebank'); - @members = $XMLfile->findnodes('/memberdatebank/memberen/member'); + _OPEN_DATABASE(); ($regularmember, $supportmember, $starvingmember, $votingrights) = 0; @@ -153,9 +157,8 @@ sub VOTINGRIGHT { $sharedsecret = shift||"none"; return "FUCK OFF" unless ($sharedsecret ~~ @sharedsecrets); - $XMLparser = XML::LibXML->new(); - $XMLfile = $XMLparser->parse_file('datebank'); - @members = $XMLfile->findnodes('/memberdatebank/memberen/member'); + _OPEN_DATABASE(); + $votingrights = 0; $XMLquery = "/memberdatebank/memberen/member[stemmrecht/text() = '1']"; @@ -174,5 +177,22 @@ sub VOTINGRIGHT { return $YAMLbase64; } +## +# Internal subroutine +## + +sub _OPEN_DATABASE { + $TCPclient = new Net::EasyTCP( mode => "client", + host => $bifröstconfig->{host}, + port => $bifröstconfig->{port}, + password => $bifröstconfig->{pass} + ) || die "[-] Cannot connect!\n"; + $TCPclient->send("SERVE") || die "[-] Error sending: $@\n"; + $TCPreply = $TCPclient->receive() || die "[-] Error receiving: $@\n"; + $XMLparser = XML::LibXML->new(); + $XMLfile = $XMLparser->parse_string($TCPreply); + @members = $XMLfile->findnodes('/memberdatebank/memberen/member'); +} + $serv->run;