refactor: move SignalSpam specific code to providers/
This commit is contained in:
parent
b8903d9d53
commit
5ad6018a88
4 changed files with 164 additions and 38 deletions
|
@ -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
|
||||
|
||||
|
|
91
src/main.cr
91
src/main.cr
|
@ -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)
|
||||
|
|
6
src/providers/abstract.cr
Normal file
6
src/providers/abstract.cr
Normal file
|
@ -0,0 +1,6 @@
|
|||
|
||||
module Providers
|
||||
abstract class Abstract
|
||||
abstract def process(email_content : String)
|
||||
end
|
||||
end
|
73
src/providers/signal_spam.cr
Normal file
73
src/providers/signal_spam.cr
Normal 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
|
Loading…
Reference in a new issue