subscan/interfaces/module.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
use async_trait::async_trait;
use enum_dispatch::enum_dispatch;
use tokio::sync::Mutex;
use super::requester::RequesterInterface;
use crate::{
enums::dispatchers::{
RequesterDispatcher, SubdomainExtractorDispatcher, SubscanModuleDispatcher,
},
modules::{
generics::{engine::GenericSearchEngineModule, integration::GenericIntegrationModule},
integrations::{
commoncrawl::CommonCrawl, dnsdumpstercrawler::DNSDumpsterCrawler, github::GitHub,
netlas::Netlas, waybackarchive::WaybackArchive,
},
zonetransfer::ZoneTransfer,
},
types::{
config::requester::RequesterConfig, core::Result, env::SubscanModuleEnvs,
result::module::SubscanModuleResult,
},
};
/// Generic `subscan` module trait definition to implement subdomain enumeration modules
///
/// Each module that will be implemented in the future must conform to this interface.
/// Summary it has single method that called `run` and it does whatever it has to do
#[async_trait]
#[enum_dispatch]
pub trait SubscanModuleInterface: Sync + Send {
/// Returns module name, name should clarify what does module
async fn name(&self) -> &str;
/// Loads `.env` file and fetches module environment variables with variable name.
/// If system environment variable set with same name, `.env` file will be overrode
/// See the [`SubscanModuleEnvs`](crate::types::env::SubscanModuleEnvs) for details
async fn envs(&self) -> SubscanModuleEnvs {
self.name().await.into()
}
/// Returns module requester address as a mutable reference if available
async fn requester(&self) -> Option<&Mutex<RequesterDispatcher>>;
/// Returns module extractor reference if available
async fn extractor(&self) -> Option<&SubdomainExtractorDispatcher>;
/// Configure module requester instance
async fn configure(&self, rconfig: RequesterConfig) {
if let Some(requester) = self.requester().await {
requester.lock().await.configure(rconfig).await;
}
}
/// Just like a `main` method, when the module run this `run` method will be called.
/// So this method should do everything
async fn run(&mut self, domain: &str) -> Result<SubscanModuleResult>;
}