From dd825e780ad1e7d520f5c2d7f99c0f67fe892781 Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Thu, 10 Jan 2013 00:06:26 -0800 Subject: [PATCH] add blacklist/whitelist settings to self-service API, RT#20896 --- FS/FS/ClientAPI/MyAccount.pm | 38 +++++++++ FS/FS/ClientAPI_XMLRPC.pm | 2 + FS/FS/part_export/http_status.pm | 104 ++++++++++++++++++++++-- FS/FS/svc_Common.pm | 19 +++++ fs_selfservice/FS-SelfService/SelfService.pm | 2 + httemplate/view/elements/svc_export_status.html | 10 ++- 6 files changed, 166 insertions(+), 9 deletions(-) diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index b02852b59..92fcd0cf7 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -1801,6 +1801,44 @@ sub set_svc_status_hash { } +sub set_svc_status_listadd { + my $p = shift; + + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { 'error' => $session } if $context eq 'error'; + + #XXX only svc_acct for now + my $svc_x = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_acct') + or return { 'error' => "Service not found" }; + + warn "set_svc_status_listadd ". join(' / ', map "$_=>".$p->{$_}, keys %$p ) + if $DEBUG; + my $error = $svc_x->export_setstatus_listadd($p); #$p? returns error? + return { 'error' => $error } if $error; + + return {}; #? { 'error' => '' } + +} + +sub set_svc_status_listdel { + my $p = shift; + + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { 'error' => $session } if $context eq 'error'; + + #XXX only svc_acct for now + my $svc_x = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_acct') + or return { 'error' => "Service not found" }; + + warn "set_svc_status_listdel ". join(' / ', map "$_=>".$p->{$_}, keys %$p ) + if $DEBUG; + my $error = $svc_x->export_setstatus_listdel($p); #$p? returns error? + return { 'error' => $error } if $error; + + return {}; #? { 'error' => '' } + +} + sub acct_forward_info { my $p = shift; diff --git a/FS/FS/ClientAPI_XMLRPC.pm b/FS/FS/ClientAPI_XMLRPC.pm index 7dd20c652..086a7b04e 100644 --- a/FS/FS/ClientAPI_XMLRPC.pm +++ b/FS/FS/ClientAPI_XMLRPC.pm @@ -129,6 +129,8 @@ sub ss2clientapi { 'svc_status_html' => 'MyAccount/svc_status_html', 'svc_status_hash' => 'MyAccount/svc_status_hash', 'set_svc_status_hash' => 'MyAccount/set_svc_status_hash', + 'set_svc_status_listadd' => 'MyAccount/set_svc_status_listadd', + 'set_svc_status_listdel' => 'MyAccount/set_svc_status_listdel', 'acct_forward_info' => 'MyAccount/acct_forward_info', 'process_acct_forward' => 'MyAccount/process_acct_forward', 'list_dsl_devices' => 'MyAccount/list_dsl_devices', diff --git a/FS/FS/part_export/http_status.pm b/FS/FS/part_export/http_status.pm index 6fbd3fbe6..da32ec47e 100644 --- a/FS/FS/part_export/http_status.pm +++ b/FS/FS/part_export/http_status.pm @@ -3,28 +3,42 @@ use base qw( FS::part_export ); use strict; use warnings; -use vars qw( %info ); +use vars qw( %info $DEBUG ); use LWP::UserAgent; use HTTP::Request::Common; +use Email::Valid; tie my %options, 'Tie::IxHash', 'url' => { label => 'URL', }, + 'blacklist_add_url' => { label => 'Optional blacklist add URL', }, + 'blacklist_del_url' => { label => 'Optional blacklist delete URL', }, + 'whitelist_add_url' => { label => 'Optional whitelist add URL', }, + 'whitelist_del_url' => { label => 'Optional whitelist delete URL', }, #'user' => { label => 'Username', default=>'' }, #'password' => { label => 'Password', default => '' }, ; %info = ( - 'svc' => 'svc_dsl', + 'svc' => [ 'svc_acct', 'svc_dsl', ], 'desc' => 'Retrieve status information via HTTP or HTTPS', 'options' => \%options, 'no_machine' => 1, 'notes' => <<'END' Fields from the service can be substituted in the URL as $field. + +Optionally, spam black/whitelist addresses may be via HTTP or HTTPS as well. END ); +$DEBUG = 0; + sub rebless { shift; } +our %addl_fields = ( + 'svc_acct' => [qw( email ) ], + 'svc_dsl' => [qw( gateway_access_or_phonenum ) ], +); + sub export_getstatus { my( $self, $svc_x, $htmlref, $hashref ) = @_; @@ -34,10 +48,85 @@ sub export_getstatus { { no strict 'refs'; ${$_} = $svc_x->getfield($_) foreach $svc_x->fields; - if ( $svc_x->table eq 'svc_dsl' ) { - ${$_} = $svc_x->$_() foreach (qw( gateway_access_or_phonenum )); + ${$_} = $svc_x->$_() foreach @{ $addl_fields{ $svc_x->table } }; + $url = eval(qq("$urlopt")); + } + + my $req = HTTP::Request::Common::GET( $url ); + my $ua = LWP::UserAgent->new; + my $response = $ua->request($req); + + if ( $svc_x->table eq 'svc_dsl' ) { + + $$htmlref = $response->is_error ? $response->error_as_HTML + : $response->content; + + #hash data not yet implemented for svc_dsl + + } elsif ( $svc_x->table eq 'svc_acct' ) { + + #this whole section is rather specific to fibernetics and should be an + # option or callback or something + + # to,from,wb_value + + use Text::CSV_XS; + my $csv = Text::CSV_XS->new; + + my @lines = split("\n", $response->content); + pop @lines if $lines[-1] eq ''; + my $header = shift @lines; + $csv->parse($header) or return; + my @header = $csv->fields; + + while ( my $line = shift @lines ) { + $csv->parse($line) or next; + my @fields = $csv->fields; + my %hash = map { $_ => shift(@fields) } @header; + + if ( $hash{'wb_value'} =~ /^[WA]/i ) { #Whitelist/Allow + push @{ $hashref->{'whitelist'} }, $hash{'from'}; + } else { # if ( $hash{'wb_value'} =~ /^[BD]/i ) { #Blacklist/Deny + push @{ $hashref->{'blacklist'} }, $hash{'from'}; + } } + } #else { die 'guru meditation #295'; } + +} + +sub export_setstatus_listadd { + my( $self, $svc_x, $hr ) = @_; + $self->export_setstatus_listX( $svc_x, 'add', $hr->{list}, $hr->{address} ); +} + +sub export_setstatus_listdel { + my( $self, $svc_x, $hr ) = @_; + $self->export_setstatus_listX( $svc_x, 'del', $hr->{list}, $hr->{address} ); +} + +sub export_setstatus_listX { + my( $self, $svc_x, $action, $list, $address ) = @_; + + my $option; + if ( $list =~ /^[WA]/i ) { #Whitelist/Allow + $option = 'whitelist_'; + } else { # if ( $hash{'wb_value'} =~ /^[BD]/i ) { #Blacklist/Deny + $option = 'blacklist_'; + } + $option .= $action. '_url'; + + $address = Email::Valid->address($address) + or die "address failed $Email::Valid::Details check.\n"; + + #some false laziness w/export_getstatus above + my $url; + my $urlopt = $self->option($option) or return; #DIFF + no strict 'vars'; + { + no strict 'refs'; + ${$_} = $svc_x->getfield($_) foreach $svc_x->fields; + ${$_} = $svc_x->$_() foreach @{ $addl_fields{ $svc_x->table } }; $url = eval(qq("$urlopt")); } @@ -45,11 +134,10 @@ sub export_getstatus { my $ua = LWP::UserAgent->new; my $response = $ua->request($req); - $$htmlref = $response->is_error ? $response->error_as_HTML - : $response->content; - - #hash data note yet implemented for this status export + die $response->code. ' '. $response->message if $response->is_error; } 1; + +1; diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm index 7aede54a6..4efdc23ad 100644 --- a/FS/FS/svc_Common.pm +++ b/FS/FS/svc_Common.pm @@ -1092,6 +1092,25 @@ sub export_setstatus { ''; } +sub export_setstatus_listadd { + my( $self, @args ) = @_; + my $error = $self->export('setstatus_listadd', @args); + if ( $error ) { + warn "error running export_setstatus: $error"; + return $error; + } + ''; +} + +sub export_setstatus_listdel { + my( $self, @args ) = @_; + my $error = $self->export('setstatus_listdel', @args); + if ( $error ) { + warn "error running export_setstatus: $error"; + return $error; + } + ''; +} =item export HOOK [ EXPORT_ARGS ] diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm index c22e4269e..5437abd51 100644 --- a/fs_selfservice/FS-SelfService/SelfService.pm +++ b/fs_selfservice/FS-SelfService/SelfService.pm @@ -57,6 +57,8 @@ $socket .= '.'.$tag if defined $tag && length($tag); 'svc_status_html' => 'MyAccount/svc_status_html', 'svc_status_hash' => 'MyAccount/svc_status_hash', 'set_svc_status_hash' => 'MyAccount/set_svc_status_hash', + 'set_svc_status_listadd' => 'MyAccount/set_svc_status_listadd', + 'set_svc_status_listdel' => 'MyAccount/set_svc_status_listdel', 'acct_forward_info' => 'MyAccount/acct_forward_info', 'process_acct_forward' => 'MyAccount/process_acct_forward', 'list_dsl_devices' => 'MyAccount/list_dsl_devices', diff --git a/httemplate/view/elements/svc_export_status.html b/httemplate/view/elements/svc_export_status.html index d96bb277d..4ce869e27 100644 --- a/httemplate/view/elements/svc_export_status.html +++ b/httemplate/view/elements/svc_export_status.html @@ -7,7 +7,15 @@ % foreach my $key ( sort {$a cmp $b} keys %$hashref ) { <% $key |h %> - <% $hashref->{$key} |h %> + +% if ( ref($hashref->{$key}) eq 'ARRAY' ) { +% foreach (@{ $hashref->{$key} }) { + <% $_ |h %>
+% } +% } else { + <% $hashref->{$key} |h %> +% } + % } -- 2.11.0