X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=gosa-si%2Fmodules%2FGosaSupportDaemon.pm;h=1a40c23a0f1d270f2b0e7ca3bdcd14033b0370dc;hb=bca3ce5ba8e04e21c5a0460fe0863ecead3936ce;hp=cf26ca49fc88e24b5b22e622bea255cd86e33585;hpb=5b1032e073b74baac4d255a8e45761c2d1cee82d;p=gosa.git diff --git a/gosa-si/modules/GosaSupportDaemon.pm b/gosa-si/modules/GosaSupportDaemon.pm index cf26ca49f..1a40c23a0 100644 --- a/gosa-si/modules/GosaSupportDaemon.pm +++ b/gosa-si/modules/GosaSupportDaemon.pm @@ -2,7 +2,7 @@ package GOSA::GosaSupportDaemon; use Exporter; @ISA = qw(Exporter); -@EXPORT = qw(create_xml_hash send_msg_hash2address get_content_from_xml_hash add_content2xml_hash create_xml_string encrypt_msg decrypt_msg create_ciphering transform_msg2hash get_time send_msg); +@EXPORT = qw(create_xml_hash get_content_from_xml_hash add_content2xml_hash create_xml_string encrypt_msg decrypt_msg create_ciphering transform_msg2hash get_time send_msg get_where_statement get_select_statement get_update_statement get_limit_statement get_orderby_statement); use strict; use warnings; @@ -12,6 +12,14 @@ use Digest::MD5 qw(md5 md5_hex md5_base64); use MIME::Base64; use XML::Simple; +my $op_hash = { + 'eq' => '=', + 'ne' => '!=', + 'ge' => '>=', + 'gt' => '>', + 'le' => '<=', + 'lt' => '<', +}; BEGIN {} @@ -22,10 +30,6 @@ END {} my $xml = new XML::Simple(); -sub process_incoming_msg { - return; -} - sub daemon_log { my ($msg, $level) = @_ ; &main::daemon_log($msg, $level); @@ -60,20 +64,25 @@ sub transform_msg2hash { # xml tags without a content are created as an empty hash # substitute it with an empty list - while( my ($xml_tag, $xml_content) = each %{ $hash } ) { - if( 1 == @{ $xml_content } ) { - # there is only one element in xml_content list ... - my $element = @{ $xml_content }[0]; - if( ref($element) eq "HASH" ) { - # and this element is an hash ... - my $len_element = keys %{ $element }; - if( $len_element == 0 ) { - # and this hash is empty, then substitute the xml_content - # with an empty string in list - $hash->{$xml_tag} = [ "none" ]; + eval { + while( my ($xml_tag, $xml_content) = each %{ $hash } ) { + if( 1 == @{ $xml_content } ) { + # there is only one element in xml_content list ... + my $element = @{ $xml_content }[0]; + if( ref($element) eq "HASH" ) { + # and this element is an hash ... + my $len_element = keys %{ $element }; + if( $len_element == 0 ) { + # and this hash is empty, then substitute the xml_content + # with an empty string in list + $hash->{$xml_tag} = [ "none" ]; + } } } } + }; + if( $@ ) { + $hash = undef; } return $hash; @@ -88,37 +97,37 @@ sub transform_msg2hash { # RETURNS: nothing # DESCRIPTION: ???? #=============================================================================== -sub send_msg_hash2address ($$$){ - my ($msg_hash, $address, $passwd) = @_ ; - - # fetch header for logging - my $header = @{$msg_hash->{header}}[0]; - - # generate xml string - my $msg_xml = &create_xml_string($msg_hash); - - # create ciphering object - my $act_cipher = &create_ciphering($passwd); - - # encrypt xml msg - my $crypted_msg = &encrypt_msg($msg_xml, $act_cipher); - - # opensocket - my $socket = &open_socket($address); - if(not defined $socket){ - daemon_log("cannot send '$header'-msg to $address , server not reachable", 5); - return 1; - } - - # send xml msg - print $socket $crypted_msg."\n"; - - close $socket; - - daemon_log("send '$header'-msg to $address", 1); - daemon_log("message:\n$msg_xml", 8); - return 0; -} +#sub send_msg_hash2address ($$$){ +# my ($msg_hash, $address, $passwd) = @_ ; +# +# # fetch header for logging +# my $header = @{$msg_hash->{header}}[0]; +# +# # generate xml string +# my $msg_xml = &create_xml_string($msg_hash); +# +# # create ciphering object +# my $act_cipher = &create_ciphering($passwd); +# +# # encrypt xml msg +# my $crypted_msg = &encrypt_msg($msg_xml, $act_cipher); +# +# # opensocket +# my $socket = &open_socket($address); +# if(not defined $socket){ +# daemon_log("cannot send '$header'-msg to $address , server not reachable", 5); +# return 1; +# } +# +# # send xml msg +# print $socket $crypted_msg."\n"; +# +# close $socket; +# +# daemon_log("send '$header'-msg to $address", 1); +# daemon_log("message:\n$msg_xml", 8); +# return 0; +#} #=== FUNCTION ================================================================ @@ -129,15 +138,15 @@ sub send_msg_hash2address ($$$){ # value - list - for all other keys in xml hash # DESCRIPTION: #=============================================================================== -sub get_content_from_xml_hash { - my ($xml_ref, $element) = @_ ; - #my $result = $main::xml_ref->{$element}; - #if( $element eq "header" || $element eq "target" || $element eq "source") { - # return @$result[0]; - #} - my @result = $xml_ref->{$element}; - return \@result; -} +#sub get_content_from_xml_hash { +# my ($xml_ref, $element) = @_ ; +# #my $result = $main::xml_ref->{$element}; +# #if( $element eq "header" || $element eq "target" || $element eq "source") { +# # return @$result[0]; +# #} +# my @result = $xml_ref->{$element}; +# return \@result; +#} #=== FUNCTION ================================================================ @@ -184,12 +193,31 @@ sub create_xml_string { # DESCRIPTION: crypts the incoming message with the Crypt::Rijndael module #=============================================================================== sub encrypt_msg { - my ($msg, $my_cipher) = @_; - if(not defined $my_cipher) { print "no cipher object\n"; } - $msg = "\0"x(16-length($msg)%16).$msg; +# my ($msg, $my_cipher) = @_; +# if(not defined $my_cipher) { print "no cipher object\n"; } +# { +# use bytes; +# $msg = "\0"x(16-length($msg)%16).$msg; +# } +# $msg = $my_cipher->encrypt($msg); +# chomp($msg = &encode_base64($msg)); +# +# # there are no newlines allowed inside msg +# $msg=~ s/\n//g; +# +# return $msg; + my ($msg, $key) = @_; + my $my_cipher = &create_ciphering($key); + { + use bytes; + $msg = "\0"x(16-length($msg)%16).$msg; + } $msg = $my_cipher->encrypt($msg); chomp($msg = &encode_base64($msg)); + # there are no newlines allowed inside msg + $msg=~ s/\n//g; return $msg; + } @@ -201,10 +229,17 @@ sub encrypt_msg { # DESCRIPTION: decrypts the incoming message with the Crypt::Rijndael module #=============================================================================== sub decrypt_msg { - my ($msg, $my_cipher) = @_ ; - if(defined $msg && defined $my_cipher) { - $msg = &decode_base64($msg); - } +# my ($msg, $my_cipher) = @_ ; +# +# if(defined $msg && defined $my_cipher) { +# $msg = &decode_base64($msg); +# } +# $msg = $my_cipher->decrypt($msg); +# $msg =~ s/\0*//g; +# return $msg; + my ($msg, $key) = @_ ; + $msg = &decode_base64($msg); + my $my_cipher = &create_ciphering($key); $msg = $my_cipher->decrypt($msg); $msg =~ s/\0*//g; return $msg; @@ -237,23 +272,23 @@ sub create_ciphering { # RETURNS: socket IO::Socket::INET # DESCRIPTION: open a socket to PeerAddr #=============================================================================== -sub open_socket { - my ($PeerAddr, $PeerPort) = @_ ; - if(defined($PeerPort)){ - $PeerAddr = $PeerAddr.":".$PeerPort; - } - my $socket; - $socket = new IO::Socket::INET(PeerAddr => $PeerAddr, - Porto => "tcp", - Type => SOCK_STREAM, - Timeout => 5, - ); - if(not defined $socket) { - return; - } - &daemon_log("open_socket: $PeerAddr", 7); - return $socket; -} +#sub open_socket { +# my ($PeerAddr, $PeerPort) = @_ ; +# if(defined($PeerPort)){ +# $PeerAddr = $PeerAddr.":".$PeerPort; +# } +# my $socket; +# $socket = new IO::Socket::INET(PeerAddr => $PeerAddr, +# Porto => "tcp", +# Type => SOCK_STREAM, +# Timeout => 5, +# ); +# if(not defined $socket) { +# return; +# } +# &daemon_log("open_socket: $PeerAddr", 7); +# return $socket; +#} sub get_time { @@ -281,8 +316,8 @@ sub get_time { # package # RETURNS: nothing #=============================================================================== -sub send_msg ($$$$$) { - my ($header, $from, $to, $data, $hostkey) = @_; +sub send_msg ($$$$) { + my ($header, $from, $to, $data) = @_; my $out_hash = &create_xml_hash($header, $from, $to); @@ -293,8 +328,147 @@ sub send_msg ($$$$$) { &add_content2xml_hash($out_hash, $key, $value); } } + my $out_msg = &create_xml_string($out_hash); + return $out_msg; +} + + +sub get_where_statement { + my ($msg, $msg_hash) = @_; + my $error= 0; + + my $clause_str= ""; + if( (not exists $msg_hash->{'where'}) || (not exists @{$msg_hash->{'where'}}[0]->{'clause'}) ) { + $error++; + } + + if( $error == 0 ) { + my @clause_l; + my @where = @{@{$msg_hash->{'where'}}[0]->{'clause'}}; + foreach my $clause (@where) { + my $connector = $clause->{'connector'}[0]; + if( not defined $connector ) { $connector = "AND"; } + $connector = uc($connector); + delete($clause->{'connector'}); + + my @phrase_l ; + foreach my $phrase (@{$clause->{'phrase'}}) { + my $operator = "="; + if( exists $phrase->{'operator'} ) { + my $op = $op_hash->{$phrase->{'operator'}[0]}; + if( not defined $op ) { + &main::daemon_log("Can not translate operator '$operator' in where ". + "statement to sql valid syntax. Please use 'eq', ". + "'ne', 'ge', 'gt', 'le', 'lt' in xml message\n", 1); + &main::daemon_log($msg, 8); + $op = "="; + } + $operator = $op; + delete($phrase->{'operator'}); + } + + my @xml_tags = keys %{$phrase}; + my $tag = $xml_tags[0]; + my $val = $phrase->{$tag}[0]; + push(@phrase_l, "$tag$operator'$val'"); + } + my $clause_str .= join(" $connector ", @phrase_l); + push(@clause_l, $clause_str); + } - &send_msg_hash2address($out_hash, $to, $hostkey); + if( not 0 == @clause_l ) { + $clause_str = join(" AND ", @clause_l); + $clause_str = "WHERE $clause_str "; + } + } + + return $clause_str; +} + +sub get_select_statement { + my ($msg, $msg_hash)= @_; + my $select = "*"; + if( exists $msg_hash->{'select'} ) { + my $select_l = \@{$msg_hash->{'select'}}; + $select = join(' AND ', @{$select_l}); + } + return $select; +} + + +sub get_update_statement { + my ($msg, $msg_hash) = @_; + my $error= 0; + my $update_str= ""; + my @update_l; + + if( not exists $msg_hash->{'update'} ) { $error++; }; + + if( $error == 0 ) { + my $update= @{$msg_hash->{'update'}}[0]; + while( my ($tag, $val) = each %{$update} ) { + my $val= @{$update->{$tag}}[0]; + push(@update_l, "$tag='$val'"); + } + if( 0 == @update_l ) { $error++; }; + } + + if( $error == 0 ) { + $update_str= join(', ', @update_l); + $update_str= "SET $update_str "; + } + + return $update_str; +} + +sub get_limit_statement { + my ($msg, $msg_hash)= @_; + my $error= 0; + my $limit_str = ""; + my ($from, $to); + + if( not exists $msg_hash->{'limit'} ) { $error++; }; + + if( $error == 0 ) { + eval { + my $limit= @{$msg_hash->{'limit'}}[0]; + $from= @{$limit->{'from'}}[0]; + $to= @{$limit->{'to'}}[0]; + }; + if( $@ ) { + $error++; + } + } + + if( $error == 0 ) { + $limit_str= "LIMIT $from, $to"; + } + + return $limit_str; +} + +sub get_orderby_statement { + my ($msg, $msg_hash)= @_; + my $error= 0; + my $order_str= ""; + my $order; + + if( not exists $msg_hash->{'orderby'} ) { $error++; }; + + if( $error == 0) { + eval { + $order= @{$msg_hash->{'orderby'}}[0]; + }; + if( $@ ) { + $error++; + } + } + + if( $error == 0 ) { + $order_str= "ORDER BY $order"; + } + + return $order_str; } 1;