Compare commits

...

4 commits

8 changed files with 202 additions and 61 deletions

2
.gitignore vendored
View file

@ -1,2 +1,2 @@
lib
bin

View file

@ -1,13 +1,15 @@
# ReportSpam
# BulkBarrage
ReportSpam is a command-line tool that enables users to report spam emails to
the SignalSpam platform. This tool serves as a bridge between individual users
and the SignalSpam service, facilitating the process of submitting spam for
investigation and action.
BulkBarrage is a command-line tool that enables users to report spam emails to
the SignalSpam platform <signal-spam.fr>.
This tool serves as a bridge between individual users and the SignalSpam
service, facilitating the process of submitting spam for official investigation
and action.
## Introduction
ReportSpam is a community-driven project developed independently from
BulkBarrage is a community-driven project developed independently from
SignalSpam. It offers a convenient way for users to report spam emails directly
from any email-piping capable mail client by leveraging the HTML forms on
SignalSpam's web platform. The project is currently in beta but is mature
@ -26,14 +28,14 @@ To build the project from source:
## Installation
To install ReportSpam, follow these steps:
To install BulkBarrage, follow these steps:
1. Ensure that CrystalLang is installed on your system.
2. Clone the repository:
```bash
git clone https://github.com/your-repo/reportspam.git
cd reportspam
git clone https://github.com/your-repo/bulkbarrage.git
cd bulkbarrage
```
3. Use the Makefile to build the project:
@ -44,40 +46,36 @@ To install ReportSpam, follow these steps:
## Usage
ReportSpam can be used in a few simple steps:
BulkBarrage can be used in a few simple steps:
```bash
Usage: reportspam [options] [command]
Usage: bulkbarrage [options] [command]
Commands:
configure Initialize the configuration
send Process and report spam email (default: from STDIN)
report Process and report spam email (default: from STDIN)
Options:
-h, --help Show this help
```
- **Configure**: Set up your initial configuration for using ReportSpam.
- **Report**: Pipe an email into the tool to report it as spam.
- **Help**: Display the help message for more information.
### Reporting Spam
To report a spam email, you can use the `report` command:
```bash
cat spam_email.eml | reportspam send
cat spam_email.eml | bulkbarrage send
```
## Configuration
After installation, run `reportspam configure` to set up your user
After installation, run `bulkbarrage configure` to set up your user
configuration, which may include credentials or preferences for interacting
with the SignalSpam platform.
## Issue Reporting
Issues can be reported on ReportSpam's Issue Tracker.
Issues can be reported on BulkBarrage's Issue Tracker.
## License

10
shard.lock Normal file
View file

@ -0,0 +1,10 @@
version: 2.0
shards:
lexbor:
git: https://github.com/kostya/lexbor.git
version: 3.1.2
mechanize:
git: https://github.com/kanezoh/mechanize.cr.git
version: 0.2.0

View file

@ -1,8 +1,9 @@
name: signalspam-pipe
---
name: bulkbarrage
version: 0.1.0
targets:
signalspam-pipe:
bulkbarrage:
main: src/main.cr
# authors:
@ -11,6 +12,11 @@ targets:
# description: |
# Short description of signalspam-pipe
dependencies:
mechanize:
github: Kanezoh/mechanize.cr
version: "~> 0.2.0"
# dependencies:
# pg:
# github: will/crystal-pg
@ -21,3 +27,4 @@ targets:
# github: manastech/webmock.cr
# license: MIT
license: LGPL-3.0

View file

@ -1,8 +1,7 @@
require "yaml"
class Config
include YAML::Serializable
class Authentication
# Classe pour la gestion de la configuration
class Authentication
include YAML::Serializable
@[YAML::Field(key: "username")]
@ -10,8 +9,19 @@ class Config
@[YAML::Field(key: "password")]
property password : String
def initialize(@username, @password)
end
end
class Config
include YAML::Serializable
@[YAML::Field(key: "authentication")]
property auth : Authentication
property authentication : Authentication
def initialize(@authentication)
end
end

View file

@ -1,32 +1,69 @@
require "yaml"
require "./config"
require "./providers/signal_spam"
require "http/client"
require "./config.cr"
require "./version.cr"
require "option_parser"
require "file_utils"
require "mechanize"
# Partie 1: Lecture du fichier de configuration YAML
config_path = File.expand_path("~/.config/signalspam/config.yaml", home: ENV["HOME"])
begin
config = Config.from_yaml(File.read(config_path))
rescue ex
puts "Error reading or parsing config file: #{ex.message}"
# Nom du script et version
SCRIPT_NAME = "BulkBarrage"
SCRIPT_VERSION = "0.1.0"
# Classe pour gérer les interactions avec Signal-Spam
class SignalSpamCtl
def initialize
@option_parser = OptionParser.new do |parser|
parser.banner = [
"#{SCRIPT_NAME} v#{SCRIPT_VERSION}",
"Usage: bulkbarrage [options] [command] [args]"
].join("\n")
parser.on("configure", "Initialise the configuration") do
init_config
end
parser.on("report", "Process and report spam email (default: from STDIN)") do
process_email_spam
end
parser.on("--help", "-h", "show this help") do
puts parser
end
end
end
def parse_arguments(args : Array(String))
@option_parser.parse(args)
rescue e : OptionParser::Exception
puts e.message
puts @option_parser
exit(1)
end
private def init_config
print "Enter username: "
username = gets.try &.strip || "anonymous"
print "Enter password: "
password = gets.try &.strip || "anonymous"
create_config_file(username, password)
puts "Configuration file created."
end
private def process_email_spam
email_spam = STDIN.gets_to_end
signalspam = Providers::SignalSpam.new
signalspam.process(email_spam)
puts "Email spam processed."
end
private def create_config_file(username : String, password : String)
signalspam = Providers::SignalSpam.new
signalspam.create_config_file(username, password)
end
end
# Partie 2: Lecture de l'email-spam depuis STDIN
email_spam = STDIN.gets_to_end
# Partie 3: Authentification sur signal-spam.fr
def authenticate(config : Config)
# Logique d'authentification (à compléter)
end
# Partie 4: Remplissage et envoi du formulaire
def submit_spam_report(email_spam : String, config : Config)
# Logique pour remplir et envoyer le formulaire (à compléter)
end
# Exécution des fonctions
authenticate(config)
submit_spam_report(email_spam, config)
puts "#{SCRIPT_NAME} v#{SCRIPT_VERSION} executed successfully."
client = SignalSpamCtl.new
client.parse_arguments(ARGV)

View file

@ -0,0 +1,6 @@
module Providers
abstract class Abstract
abstract def process(email_content : String)
end
end

View file

@ -0,0 +1,73 @@
require "../config"
require "./abstract"
module Providers
class SignalSpam < Abstract
property config : Config? = nil
def initialize
end
def process(email_content : String)
load_config
agent = Mechanize.new
authenticate(agent)
submit_spam_report(agent, email_content)
end
def create_config_file(username : String, password : String)
auth = Authentication.new(username: username, password: password)
config = Config.new(authentication: auth)
config_path = File.expand_path("~/.config/bulkbarrage/config.yaml", home: ENV["HOME"])
FileUtils.mkdir_p(File.dirname(config_path))
File.write(config_path, config.to_yaml)
end
private def load_config
config_path = File.expand_path("~/.config/bulkbarrage/config.yaml", home: ENV["HOME"])
begin
@config = Config.from_yaml(File.read(config_path))
rescue ex
puts "Error reading or parsing config file: #{ex.message}"
exit(1)
end
end
private def authenticate(agent)
# Visiter la page de connexion pour obtenir le token d'authenticité
login_page = agent.get("https://signalants.signal-spam.fr/login")
form = login_page.forms.first
authenticity_token = form.field_with("authenticity_token").value
puts "Authentication page loaded."
# Configurer les détails de l'utilisateur
config = @config
return if config.nil?
form.field_with("user[email_or_login]").value = config.authentication.username
form.field_with("user[password]").value = config.authentication.password
# form.field_with("authenticity_token").value = authenticity_token
# Soumettre le formulaire
result_page = agent.submit(form)
raise "Unable to authenticate" if result_page.nil?
puts "Authenticated."
end
private def submit_spam_report(agent, email_spam : String)
report_page = agent.get("https://signalants.signal-spam.fr/reportings/new")
form = report_page.forms.first
authenticity_token = form.field_with("authenticity_token").value
puts "Reporting page loaded."
form.field_with("reporting[raw_email]").value = email_spam
result_page = agent.submit(form)
raise "Unable to submit" if result_page.nil?
puts "Reporting sent."
end
end
end