diff --git a/console/web-api/config.yml b/console/web-api/config.yml index 3cda4d9..6b0b7c5 100644 --- a/console/web-api/config.yml +++ b/console/web-api/config.yml @@ -9,11 +9,13 @@ template: "template_toolkit" # Specify the addresses of the API endpoints for the other components of the # system api: - dns: "ns.example:3000" + dns: "172.31.0.53:3000" + sender: "172.31.10.1:3000" + recipient: "172.31.20.1:3000" + attacker: "172.31.30.1:3000" # Lists the DNS zones that can be edited by the user editable_zones: - - example - expediteur.example - destinataire.example - attaquant.example diff --git a/console/web-api/lib/Email/SpoofingDemo/Web.pm b/console/web-api/lib/Email/SpoofingDemo/Web.pm index 45abdd1..ea04caa 100644 --- a/console/web-api/lib/Email/SpoofingDemo/Web.pm +++ b/console/web-api/lib/Email/SpoofingDemo/Web.pm @@ -50,11 +50,8 @@ get '/dns/zone-edit/:zone' => sub { my $zone_contents; if (defined $zone) { - my $client = REST::Client->new(); - $client->setHost(config->{'api'}{'dns'}); - $client->GET("/zone/${zone}/file"); - my $response = from_json($client->responseContent()); - $zone_contents = $response->{'contents'}; + my ($response, $status) = call_api(GET => 'dns', "/zone/${zone}/file"); + $zone_contents = $response->{contents}; } template 'dns/zone-edit' => { @@ -71,25 +68,75 @@ post '/dns/zone-edit/:zone' => sub { } my $contents = body_parameters->{'zone-contents'}; - - my $client = REST::Client->new(); - $client->setHost(config->{'api'}{'dns'}); - $client->PUT("/zone/${zone}/file", - encode_json({ contents => $contents }), - { - "Content-Type" => "application/json", - "Accept" => "application/json" - }); - - my $success; - if ($client->responseCode() eq '200') { - $success = 'success'; - } else { - warn "Got " . $client->responseCode() . " from upstream: " . $client->responseContent(); - $success = 'failure' - } + my (undef, $status) = call_api(PUT => 'dns', "/zone/${zone}/file", { contents => $contents }); + my $success = ($status eq '200') ? 'success' : 'failure'; redirect "/dns/zone-edit/$zone?success=$success", 303; +}; + +get '/sender/dkim-keys' => sub { + my ($installed_keys, $status) = call_api(GET => 'sender', '/installed-keys'); + ($status eq '200') or die "API returned $status"; + + template 'sender/dkim-keys' => { + active_role => 'sender', + title => 'Gestion des clefs DKIM', + installed_keys => $installed_keys, + }; +}; + +get '/dkim-generator/sender' => sub { + template 'dkim-generator/sender' => { + title => 'Générateur de clefs DKIM' + }; +}; + +post '/dkim-generator/sender' => sub { + my $api_params = { + domain => body_parameters->get('domain'), + selector => body_parameters->get('selector'), + key_size => body_parameters->get('key-size') + }; + + my ($response, $status) = call_api(POST => 'sender', '/generate-dkim-key', $api_params); + ($status eq 200) or die "API returned $status"; + + template 'dkim-generator/sender' => { + title => 'Générateur de clefs DKIM', + txt_record => $response->{'txt_record'} + }; +}; + +get '/attacker/spoof' => sub { + template 'attacker/spoof' => { + title => 'Usurpateur d’identité de courriel' + }; +}; + +get '/sender/send-email' => sub { + my %template_params = ( + title => 'Envoi de messages légitimes', + email_data => [ + { + what => 'Confirmation de commande', + from => 'support@expediteur.example', + url => 'confirmation_email' + }, + { + what => 'Newsletter', + from => 'info@newsletter.expediteur.example', + url => 'newsletter' + } + ] + ); + + my $success = query_parameters->get('success'); + if (defined $success) { + $template_params{success} = ($success eq 'success') ? 'success' : 'failure'; + } + template 'sender/send-email' => \%template_params; +}; + get '/recipient/settings' => sub { my ($system_status, $http_code) = call_api(GET => 'recipient', '/status'); die if $http_code ne '200'; @@ -110,6 +157,13 @@ post '/recipient/settings' => sub { redirect "/recipient/settings?success=$success", 303; }; +get '/sender/send-email/:email' => sub { + my $email = route_parameters->get('email'); + + my (undef, $response) = call_api(POST => 'sender', "/send-email/${email}"); + my $success = ($response =~ /^2\d\d$/) ? 'success' : 'failure'; + + redirect "/sender/send-email?success=$success", 303; }; get '/recipient/webmail' => sub { diff --git a/console/web-api/views/404.tt b/console/web-api/views/404.tt index bdeae06..f1af29c 100644 --- a/console/web-api/views/404.tt +++ b/console/web-api/views/404.tt @@ -1,2 +1,4 @@ +

Erreur 404

Page non trouvée

+
diff --git a/console/web-api/views/attacker/spoof.tt b/console/web-api/views/attacker/spoof.tt new file mode 100644 index 0000000..30404ce --- /dev/null +++ b/console/web-api/views/attacker/spoof.tt @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/console/web-api/views/dkim-generator/sender.tt b/console/web-api/views/dkim-generator/sender.tt new file mode 100644 index 0000000..ebfba1d --- /dev/null +++ b/console/web-api/views/dkim-generator/sender.tt @@ -0,0 +1,50 @@ +
+
+
+

Génération de clef DKIM

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ +[% IF txt_record %] +
+

Clef générée.

+

Publiez ensuite la clef publique dans la zone DNS :

+
+
+ +
+
+
[% txt_record | html %]
+
+
+
+[% END %] + + +
+
+
+ + + diff --git a/console/web-api/views/sender/dkim-keys.tt b/console/web-api/views/sender/dkim-keys.tt new file mode 100644 index 0000000..0e81359 --- /dev/null +++ b/console/web-api/views/sender/dkim-keys.tt @@ -0,0 +1,41 @@ +
+
+

Liste des clefs DKIM installées sur le système

+[% FOR installed_keys %] +
+
+
[% domain | html %]
+
    +
  • + Sélecteur actuel : + [% IF current_key %][% current_key | html %][% ELSE %](aucun)[% END %] +
  • +
  • + Sélecteurs disponibles : +
      + [% FOR selector IN available_keys -%] +
    • + [%- IF selector == current_key -%] + [% selector | html %] + [%- ELSE -%] + [% selector | html %] + [%- END -%] +
    • + [% END %] +
    +
  • +
+
+
+[% END %] +[% UNLESS installed_keys.size %] +

+ Aucune clef DKIM n’est active sur le système. Commencez par en générer une. +

+[% END %] + +
+ + + +
diff --git a/console/web-api/views/sender/send-email.tt b/console/web-api/views/sender/send-email.tt new file mode 100644 index 0000000..5174787 --- /dev/null +++ b/console/web-api/views/sender/send-email.tt @@ -0,0 +1,28 @@ +
+ [% IF success == 'success' %] +
+

Le courriel a bien été envoyé.

+ Relever les courriels du destinataire +
+ [% ELSIF success == 'failure' %] +
+ Une erreur est survenue lors de l’envoi du courriel. +
+ [% END %] +

Système d’e-mailing

+
+ [% FOR email_data %] +
+
+
[% what | html %]
+
+

+ Expéditeur : [% from | html %] +

+ Envoyer +
+
+
+ [% END %] +
+