mirror of
https://github.com/opensourcepos/opensourcepos.git
synced 2026-09-14 14:26:59 -04:00
* refactor: standardize function and variable names to camelCase and improve naming consistency across files * refactor(config): remove spaces around `=` in configuration files for improved consistency and formatting as is required by .env formatting rules. * refactor(security): extract `.env` key management logic into reusable `writeEnvKey` helper, add throttle key provisioning logic, and streamline encryption key updates * fix(migration): improve error handling in CI3 to CI4 encryption data migration - Secure `up` and `convertCI3EncryptedData` methods with detailed exception handling for script execution and data saving. * fix(migration): ensure empty string is correctly handled in CI3 to CI4 encryption data conversion * refactor(security): enhance `.env` management with durable writes, better locking, and helper abstraction - Update `writeEnvKey` to return a success flag and handle file locks robustly. - Introduce `atomicWriteFile` for atomic writes to prevent partial file updates. - Add `applyEnvKeyReplacement` to streamline `.env` key insertion and updates. - Improve throttle key provisioning with validation and runtime persistence safeguards. * refactor(security): implement dedicated `.env` file locking for robust and cross-platform safe write operations - Add `lockEnvFile` and `unlockEnvFile` helpers to manage `.env` mutex files. - Refactor `.env` write logic to use lock helpers, improving reliability and preventing race conditions. - Enhance `atomicWriteFile` for better handling of file overwrites on Windows and POSIX systems. * fix(migration): improve encryption error handling during CI3 to CI4 data conversion - Add conditional checks for `checkEncryption` to prevent failed key persistence. - Introduce `abortEncryptionConversion` for cleanup on failure. - Update `writeEnvKey` to handle and return errors gracefully. * refactor(security): improve `atomicWriteFile` for better file locking and cross-platform durability - Replace `uniqid` with `bin2hex(random_bytes())` for more secure temp file naming. - Add explicit file permissions and locking for safe concurrent writes. - Enhance error handling to ensure atomicity on both Windows and POSIX systems. * Add env temp files to gitignore so they don't get tracked. --------- Signed-off-by: objecttothis <17935339+objecttothis@users.noreply.github.com>
122 lines
3.5 KiB
PHP
122 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace app\Libraries;
|
|
|
|
use CodeIgniter\Email\Email;
|
|
use CodeIgniter\Encryption\Encryption;
|
|
use CodeIgniter\Encryption\EncrypterInterface;
|
|
use CodeIgniter\Encryption\Exceptions\EncryptionException;
|
|
use Config\OSPOS;
|
|
use Config\Services;
|
|
|
|
|
|
/**
|
|
* Email library
|
|
*
|
|
* Library with utilities to configure and send emails
|
|
*/
|
|
|
|
class Email_lib
|
|
{
|
|
private Email $email;
|
|
private array $config;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->email = new Email();
|
|
$this->config = config(OSPOS::class)->settings;
|
|
|
|
$encrypter = Services::encrypter();
|
|
|
|
$smtp_pass = $this->config['smtp_pass'];
|
|
if (!empty($smtp_pass) && checkEncryption()) {
|
|
try {
|
|
$smtp_pass = $encrypter->decrypt($smtp_pass);
|
|
} catch (\EncryptionException $e) {
|
|
// Decryption failed, use the original value
|
|
log_message('error', 'SMTP password decryption failed: ' . $e->getMessage());
|
|
$smtp_pass = '';
|
|
}
|
|
|
|
}
|
|
|
|
$email_config = [
|
|
'mailType' => 'html',
|
|
'userAgent' => 'OSPOS',
|
|
'validate' => true,
|
|
'protocol' => $this->config['protocol'],
|
|
'mailPath' => $this->config['mailpath'],
|
|
'SMTPHost' => $this->config['smtp_host'],
|
|
'SMTPUser' => $this->config['smtp_user'],
|
|
'SMTPPass' => $smtp_pass,
|
|
'SMTPPort' => (int)$this->config['smtp_port'],
|
|
'SMTPTimeout' => (int)$this->config['smtp_timeout'],
|
|
'SMTPCrypto' => $this->config['smtp_crypto']
|
|
];
|
|
$this->email->initialize($email_config);
|
|
}
|
|
|
|
/**
|
|
* Email sending function
|
|
* Example of use: $response = sendEmail('john@doe.com', 'Hello', 'This is a message', $filename);
|
|
*/
|
|
public function sendEmail(string $to, string $subject, string $message, ?string $attachment = null): bool
|
|
{
|
|
$email = $this->email;
|
|
|
|
$email->setFrom($this->config['email'], $this->config['company']);
|
|
$email->setTo($to);
|
|
$email->setSubject($subject);
|
|
$email->setMessage($message);
|
|
|
|
if (!empty($attachment)) {
|
|
$email->attach($attachment);
|
|
$email->setAttachmentCID($attachment);
|
|
}
|
|
|
|
$result = $email->send();
|
|
|
|
if (!$result) {
|
|
log_message('error', $email->printDebugger());
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Gets the mime type of the company logo file.
|
|
*
|
|
* @return string Mime type or empty string if logo doesn't exist
|
|
*/
|
|
public function getLogoMimeType(): string
|
|
{
|
|
$logo_path = FCPATH . 'uploads/' . $this->config['company_logo'];
|
|
|
|
if (!empty($this->config['company_logo']) && file_exists($logo_path)) {
|
|
$mimeType = mime_content_type($logo_path);
|
|
return $mimeType !== false ? $mimeType : '';
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Builds an img tag for the company logo to use in email templates.
|
|
*
|
|
* @return string HTML img tag with base64-encoded logo, or empty string if no logo
|
|
*/
|
|
public function buildLogoImgTag(): string
|
|
{
|
|
$mimeType = $this->getLogoMimeType();
|
|
|
|
if ($mimeType === '') {
|
|
return '';
|
|
}
|
|
|
|
$logo_path = FCPATH . 'uploads/' . $this->config['company_logo'];
|
|
$logo_data = base64_encode(file_get_contents($logo_path));
|
|
|
|
return '<img id="image" src="data:' . $mimeType . ';base64,' . $logo_data . '" alt="company_logo">';
|
|
}
|
|
}
|