/** * Execute the command. * * @return void */ public function handle() { Log::info(get_class($this) . ': Queued worker is starting the processing of email file: ' . $this->filename); $filesystem = new Filesystem(); $rawEmail = $filesystem->get($this->filename); $parsedMail = new MimeParser(); $parsedMail->setText($rawEmail); // Sanity checks if (empty($parsedMail->getHeader('from')) || empty($parsedMail->getMessageBody())) { Log::warning(get_class($this) . 'Validation failed on: ' . $this->filename); $this->exception(); } // Ignore email from our own notification address to prevent mail loops if (preg_match('/' . Config::get('main.notifications.from_address') . '/', $parsedMail->getHeader('from'))) { Log::warning(get_class($this) . 'Loop prevention: Ignoring email from self ' . Config::get('main.notifications.from_address')); $this->exception(); } // Start with detecting valid ARF e-mail $attachments = $parsedMail->getAttachments(); $arfMail = []; foreach ($attachments as $attachment) { if ($attachment->contentType == 'message/feedback-report') { $arfMail['report'] = $attachment->getContent(); } if ($attachment->contentType == 'message/rfc822') { $arfMail['evidence'] = $attachment->getContent(); } if ($attachment->contentType == 'text/plain') { $arfMail['message'] = $attachment->getContent(); } } // If we do not have a complete e-mail, then we empty the perhaps partially filled arfMail // which is useless, hence reset to false if (!isset($arfMail['report']) || !isset($arfMail['evidence']) || !isset($arfMail['message'])) { $arfMail = false; } // Asking GetParser for an object based on mappings, or die trying $parser = GetParser::object($parsedMail, $arfMail); $result = false; $events = false; if ($parser !== false) { $result = $parser->parse(); } else { Log::error(get_class($this) . ': Unable to handle message from: ' . $parsedMail->getHeader('from') . ' with subject: ' . $parsedMail->getHeader('subject')); $this->exception(); } if ($result !== false && $result['errorStatus'] !== true) { Log::info(get_class($parser) . ': Parser as ended without errors. Collected ' . count($result['data']) . ' events to save'); $events = $result['data']; } else { Log::error(get_class($parser) . ': Parser as ended with errors ! : ' . $result['errorMessage']); $this->exception(); } // call validater $validator = new EventsValidate($events); $return = $validator->handle(); if ($return['errorStatus'] === false) { Log::error(get_class($validator) . ': Validator as ended with errors ! : ' . $result['errorMessage']); $this->exception(); } else { Log::info(get_class($validator) . ': Validator as ended without errors'); } // save evidence into table $evidence = new Evidence(); $evidence->filename = $this->filename; $evidence->sender = $parsedMail->getHeader('from'); $evidence->subject = $parsedMail->getHeader('subject'); $evidence->save(); // call saver $saver = new EventsSave($events, $evidence->id); $return = $saver->handle(); if ($return['errorStatus'] === false) { Log::error(get_class($saver) . ': Saver as ended with errors ! : ' . $result['errorMessage']); $this->exception(); } else { Log::info(get_class($saver) . ': Saver as ended without errors'); } }