From f9e6f2af819689ee72735341aae59f9f7f2dea2c Mon Sep 17 00:00:00 2001 From: DasunThathsara Date: Thu, 28 Sep 2023 16:56:38 +0530 Subject: [PATCH] Add side nav bar --- app/libraries/Core.php | 11 +- app/libraries/Exception.php | 40 + app/libraries/PHPMailer.php | 5126 +++++++++++++++++++++++ app/libraries/SMTP.php | 1466 +++++++ app/views/driver/index.php | 70 + app/views/inc/components/sidenavbar.php | 26 + app/views/inc/components/topnavbar.php | 31 +- app/views/inc/header.php | 3 + composer.json | 5 +- composer.lock | 82 +- public/css/components/sidenavbar.css | 84 + public/css/components/topnavbar.css | 39 +- public/css/style.css | 4 +- public/images/back.svg | 1 + public/images/booking.svg | 1 + public/images/history.svg | 1 + public/images/home.svg | 1 + public/images/logo.png | Bin 0 -> 102883 bytes public/images/menu.svg | 1 + public/images/package.svg | 1 + public/images/profile.svg | 1 + public/images/rating.svg | 1 + public/images/search.svg | 1 + public/images/vehicle.svg | 1 + public/js/script.js | 1 - 25 files changed, 6963 insertions(+), 35 deletions(-) create mode 100644 app/libraries/Exception.php create mode 100644 app/libraries/PHPMailer.php create mode 100644 app/libraries/SMTP.php create mode 100644 app/views/inc/components/sidenavbar.php create mode 100644 public/css/components/sidenavbar.css create mode 100644 public/images/back.svg create mode 100644 public/images/booking.svg create mode 100644 public/images/history.svg create mode 100644 public/images/home.svg create mode 100644 public/images/logo.png create mode 100644 public/images/menu.svg create mode 100644 public/images/package.svg create mode 100644 public/images/profile.svg create mode 100644 public/images/rating.svg create mode 100644 public/images/search.svg create mode 100644 public/images/vehicle.svg diff --git a/app/libraries/Core.php b/app/libraries/Core.php index 7d904ea2..3c8df829 100644 --- a/app/libraries/Core.php +++ b/app/libraries/Core.php @@ -7,7 +7,16 @@ class Core { public function __construct(){ $url = $this->getURL(); - // CHeck requested controller is existing in the controllers folder + // Check user request null controller + if (ucwords($url[0]) == null){ + // If null, then load the default controller + require_once '../app/controllers/Pages.php'; + $this->currentController = new Pages; + $this->currentController->index(); + return; + } + + // Check requested controller is existing in the controllers folder if (file_exists('../app/controllers/'.ucwords($url[0]).'.php')){ // If the controller exists, then load it $this->currentController = ucwords($url[0]); diff --git a/app/libraries/Exception.php b/app/libraries/Exception.php new file mode 100644 index 00000000..52eaf951 --- /dev/null +++ b/app/libraries/Exception.php @@ -0,0 +1,40 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * PHPMailer exception handler. + * + * @author Marcus Bointon + */ +class Exception extends \Exception +{ + /** + * Prettify error message output. + * + * @return string + */ + public function errorMessage() + { + return '' . htmlspecialchars($this->getMessage(), ENT_COMPAT | ENT_HTML401) . "
\n"; + } +} diff --git a/app/libraries/PHPMailer.php b/app/libraries/PHPMailer.php new file mode 100644 index 00000000..7f56ea23 --- /dev/null +++ b/app/libraries/PHPMailer.php @@ -0,0 +1,5126 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * PHPMailer - PHP email creation and transport class. + * + * @author Marcus Bointon (Synchro/coolbru) + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + */ +class PHPMailer +{ + const CHARSET_ASCII = 'us-ascii'; + const CHARSET_ISO88591 = 'iso-8859-1'; + const CHARSET_UTF8 = 'utf-8'; + + const CONTENT_TYPE_PLAINTEXT = 'text/plain'; + const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar'; + const CONTENT_TYPE_TEXT_HTML = 'text/html'; + const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative'; + const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed'; + const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related'; + + const ENCODING_7BIT = '7bit'; + const ENCODING_8BIT = '8bit'; + const ENCODING_BASE64 = 'base64'; + const ENCODING_BINARY = 'binary'; + const ENCODING_QUOTED_PRINTABLE = 'quoted-printable'; + + const ENCRYPTION_STARTTLS = 'tls'; + const ENCRYPTION_SMTPS = 'ssl'; + + const ICAL_METHOD_REQUEST = 'REQUEST'; + const ICAL_METHOD_PUBLISH = 'PUBLISH'; + const ICAL_METHOD_REPLY = 'REPLY'; + const ICAL_METHOD_ADD = 'ADD'; + const ICAL_METHOD_CANCEL = 'CANCEL'; + const ICAL_METHOD_REFRESH = 'REFRESH'; + const ICAL_METHOD_COUNTER = 'COUNTER'; + const ICAL_METHOD_DECLINECOUNTER = 'DECLINECOUNTER'; + + /** + * Email priority. + * Options: null (default), 1 = High, 3 = Normal, 5 = low. + * When null, the header is not set at all. + * + * @var int|null + */ + public $Priority; + + /** + * The character set of the message. + * + * @var string + */ + public $CharSet = self::CHARSET_ISO88591; + + /** + * The MIME Content-type of the message. + * + * @var string + */ + public $ContentType = self::CONTENT_TYPE_PLAINTEXT; + + /** + * The message encoding. + * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". + * + * @var string + */ + public $Encoding = self::ENCODING_8BIT; + + /** + * Holds the most recent mailer error message. + * + * @var string + */ + public $ErrorInfo = ''; + + /** + * The From email address for the message. + * + * @var string + */ + public $From = ''; + + /** + * The From name of the message. + * + * @var string + */ + public $FromName = ''; + + /** + * The envelope sender of the message. + * This will usually be turned into a Return-Path header by the receiver, + * and is the address that bounces will be sent to. + * If not empty, will be passed via `-f` to sendmail or as the 'MAIL FROM' value over SMTP. + * + * @var string + */ + public $Sender = ''; + + /** + * The Subject of the message. + * + * @var string + */ + public $Subject = ''; + + /** + * An HTML or plain text message body. + * If HTML then call isHTML(true). + * + * @var string + */ + public $Body = ''; + + /** + * The plain-text message body. + * This body can be read by mail clients that do not have HTML email + * capability such as mutt & Eudora. + * Clients that can read HTML will view the normal Body. + * + * @var string + */ + public $AltBody = ''; + + /** + * An iCal message part body. + * Only supported in simple alt or alt_inline message types + * To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator. + * + * @see http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ + * @see http://kigkonsult.se/iCalcreator/ + * + * @var string + */ + public $Ical = ''; + + /** + * Value-array of "method" in Contenttype header "text/calendar" + * + * @var string[] + */ + protected static $IcalMethods = [ + self::ICAL_METHOD_REQUEST, + self::ICAL_METHOD_PUBLISH, + self::ICAL_METHOD_REPLY, + self::ICAL_METHOD_ADD, + self::ICAL_METHOD_CANCEL, + self::ICAL_METHOD_REFRESH, + self::ICAL_METHOD_COUNTER, + self::ICAL_METHOD_DECLINECOUNTER, + ]; + + /** + * The complete compiled MIME message body. + * + * @var string + */ + protected $MIMEBody = ''; + + /** + * The complete compiled MIME message headers. + * + * @var string + */ + protected $MIMEHeader = ''; + + /** + * Extra headers that createHeader() doesn't fold in. + * + * @var string + */ + protected $mailHeader = ''; + + /** + * Word-wrap the message body to this number of chars. + * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. + * + * @see static::STD_LINE_LENGTH + * + * @var int + */ + public $WordWrap = 0; + + /** + * Which method to use to send mail. + * Options: "mail", "sendmail", or "smtp". + * + * @var string + */ + public $Mailer = 'mail'; + + /** + * The path to the sendmail program. + * + * @var string + */ + public $Sendmail = '/usr/sbin/sendmail'; + + /** + * Whether mail() uses a fully sendmail-compatible MTA. + * One which supports sendmail's "-oi -f" options. + * + * @var bool + */ + public $UseSendmailOptions = true; + + /** + * The email address that a reading confirmation should be sent to, also known as read receipt. + * + * @var string + */ + public $ConfirmReadingTo = ''; + + /** + * The hostname to use in the Message-ID header and as default HELO string. + * If empty, PHPMailer attempts to find one with, in order, + * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value + * 'localhost.localdomain'. + * + * @see PHPMailer::$Helo + * + * @var string + */ + public $Hostname = ''; + + /** + * An ID to be used in the Message-ID header. + * If empty, a unique id will be generated. + * You can set your own, but it must be in the format "", + * as defined in RFC5322 section 3.6.4 or it will be ignored. + * + * @see https://tools.ietf.org/html/rfc5322#section-3.6.4 + * + * @var string + */ + public $MessageID = ''; + + /** + * The message Date to be used in the Date header. + * If empty, the current date will be added. + * + * @var string + */ + public $MessageDate = ''; + + /** + * SMTP hosts. + * Either a single hostname or multiple semicolon-delimited hostnames. + * You can also specify a different port + * for each host by using this format: [hostname:port] + * (e.g. "smtp1.example.com:25;smtp2.example.com"). + * You can also specify encryption type, for example: + * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). + * Hosts will be tried in order. + * + * @var string + */ + public $Host = 'localhost'; + + /** + * The default SMTP server port. + * + * @var int + */ + public $Port = 25; + + /** + * The SMTP HELO/EHLO name used for the SMTP connection. + * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find + * one with the same method described above for $Hostname. + * + * @see PHPMailer::$Hostname + * + * @var string + */ + public $Helo = ''; + + /** + * What kind of encryption to use on the SMTP connection. + * Options: '', static::ENCRYPTION_STARTTLS, or static::ENCRYPTION_SMTPS. + * + * @var string + */ + public $SMTPSecure = ''; + + /** + * Whether to enable TLS encryption automatically if a server supports it, + * even if `SMTPSecure` is not set to 'tls'. + * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. + * + * @var bool + */ + public $SMTPAutoTLS = true; + + /** + * Whether to use SMTP authentication. + * Uses the Username and Password properties. + * + * @see PHPMailer::$Username + * @see PHPMailer::$Password + * + * @var bool + */ + public $SMTPAuth = false; + + /** + * Options array passed to stream_context_create when connecting via SMTP. + * + * @var array + */ + public $SMTPOptions = []; + + /** + * SMTP username. + * + * @var string + */ + public $Username = ''; + + /** + * SMTP password. + * + * @var string + */ + public $Password = ''; + + /** + * SMTP authentication type. Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2. + * If not specified, the first one from that list that the server supports will be selected. + * + * @var string + */ + public $AuthType = ''; + + /** + * An implementation of the PHPMailer OAuthTokenProvider interface. + * + * @var OAuthTokenProvider + */ + protected $oauth; + + /** + * The SMTP server timeout in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. + * + * @var int + */ + public $Timeout = 300; + + /** + * Comma separated list of DSN notifications + * 'NEVER' under no circumstances a DSN must be returned to the sender. + * If you use NEVER all other notifications will be ignored. + * 'SUCCESS' will notify you when your mail has arrived at its destination. + * 'FAILURE' will arrive if an error occurred during delivery. + * 'DELAY' will notify you if there is an unusual delay in delivery, but the actual + * delivery's outcome (success or failure) is not yet decided. + * + * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY + */ + public $dsn = ''; + + /** + * SMTP class debug output mode. + * Debug output level. + * Options: + * @see SMTP::DEBUG_OFF: No output + * @see SMTP::DEBUG_CLIENT: Client messages + * @see SMTP::DEBUG_SERVER: Client and server messages + * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status + * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed + * + * @see SMTP::$do_debug + * + * @var int + */ + public $SMTPDebug = 0; + + /** + * How to handle debug output. + * Options: + * * `echo` Output plain-text as-is, appropriate for CLI + * * `html` Output escaped, line breaks converted to `
`, appropriate for browser output + * * `error_log` Output to error log as configured in php.ini + * By default PHPMailer will use `echo` if run from a `cli` or `cli-server` SAPI, `html` otherwise. + * Alternatively, you can provide a callable expecting two params: a message string and the debug level: + * + * ```php + * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; + * ``` + * + * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug` + * level output is used: + * + * ```php + * $mail->Debugoutput = new myPsr3Logger; + * ``` + * + * @see SMTP::$Debugoutput + * + * @var string|callable|\Psr\Log\LoggerInterface + */ + public $Debugoutput = 'echo'; + + /** + * Whether to keep the SMTP connection open after each message. + * If this is set to true then the connection will remain open after a send, + * and closing the connection will require an explicit call to smtpClose(). + * It's a good idea to use this if you are sending multiple messages as it reduces overhead. + * See the mailing list example for how to use it. + * + * @var bool + */ + public $SMTPKeepAlive = false; + + /** + * Whether to split multiple to addresses into multiple messages + * or send them all in one message. + * Only supported in `mail` and `sendmail` transports, not in SMTP. + * + * @var bool + * + * @deprecated 6.0.0 PHPMailer isn't a mailing list manager! + */ + public $SingleTo = false; + + /** + * Storage for addresses when SingleTo is enabled. + * + * @var array + */ + protected $SingleToArray = []; + + /** + * Whether to generate VERP addresses on send. + * Only applicable when sending via SMTP. + * + * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path + * @see http://www.postfix.org/VERP_README.html Postfix VERP info + * + * @var bool + */ + public $do_verp = false; + + /** + * Whether to allow sending messages with an empty body. + * + * @var bool + */ + public $AllowEmpty = false; + + /** + * DKIM selector. + * + * @var string + */ + public $DKIM_selector = ''; + + /** + * DKIM Identity. + * Usually the email address used as the source of the email. + * + * @var string + */ + public $DKIM_identity = ''; + + /** + * DKIM passphrase. + * Used if your key is encrypted. + * + * @var string + */ + public $DKIM_passphrase = ''; + + /** + * DKIM signing domain name. + * + * @example 'example.com' + * + * @var string + */ + public $DKIM_domain = ''; + + /** + * DKIM Copy header field values for diagnostic use. + * + * @var bool + */ + public $DKIM_copyHeaderFields = true; + + /** + * DKIM Extra signing headers. + * + * @example ['List-Unsubscribe', 'List-Help'] + * + * @var array + */ + public $DKIM_extraHeaders = []; + + /** + * DKIM private key file path. + * + * @var string + */ + public $DKIM_private = ''; + + /** + * DKIM private key string. + * + * If set, takes precedence over `$DKIM_private`. + * + * @var string + */ + public $DKIM_private_string = ''; + + /** + * Callback Action function name. + * + * The function that handles the result of the send email action. + * It is called out by send() for each email sent. + * + * Value can be any php callable: http://www.php.net/is_callable + * + * Parameters: + * bool $result result of the send action + * array $to email addresses of the recipients + * array $cc cc email addresses + * array $bcc bcc email addresses + * string $subject the subject + * string $body the email body + * string $from email address of sender + * string $extra extra information of possible use + * "smtp_transaction_id' => last smtp transaction id + * + * @var string + */ + public $action_function = ''; + + /** + * What to put in the X-Mailer header. + * Options: An empty string for PHPMailer default, whitespace/null for none, or a string to use. + * + * @var string|null + */ + public $XMailer = ''; + + /** + * Which validator to use by default when validating email addresses. + * May be a callable to inject your own validator, but there are several built-in validators. + * The default validator uses PHP's FILTER_VALIDATE_EMAIL filter_var option. + * + * @see PHPMailer::validateAddress() + * + * @var string|callable + */ + public static $validator = 'php'; + + /** + * An instance of the SMTP sender class. + * + * @var SMTP + */ + protected $smtp; + + /** + * The array of 'to' names and addresses. + * + * @var array + */ + protected $to = []; + + /** + * The array of 'cc' names and addresses. + * + * @var array + */ + protected $cc = []; + + /** + * The array of 'bcc' names and addresses. + * + * @var array + */ + protected $bcc = []; + + /** + * The array of reply-to names and addresses. + * + * @var array + */ + protected $ReplyTo = []; + + /** + * An array of all kinds of addresses. + * Includes all of $to, $cc, $bcc. + * + * @see PHPMailer::$to + * @see PHPMailer::$cc + * @see PHPMailer::$bcc + * + * @var array + */ + protected $all_recipients = []; + + /** + * An array of names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $all_recipients + * and one of $to, $cc, or $bcc. + * This array is used only for addresses with IDN. + * + * @see PHPMailer::$to + * @see PHPMailer::$cc + * @see PHPMailer::$bcc + * @see PHPMailer::$all_recipients + * + * @var array + */ + protected $RecipientsQueue = []; + + /** + * An array of reply-to names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $ReplyTo. + * This array is used only for addresses with IDN. + * + * @see PHPMailer::$ReplyTo + * + * @var array + */ + protected $ReplyToQueue = []; + + /** + * The array of attachments. + * + * @var array + */ + protected $attachment = []; + + /** + * The array of custom headers. + * + * @var array + */ + protected $CustomHeader = []; + + /** + * The most recent Message-ID (including angular brackets). + * + * @var string + */ + protected $lastMessageID = ''; + + /** + * The message's MIME type. + * + * @var string + */ + protected $message_type = ''; + + /** + * The array of MIME boundary strings. + * + * @var array + */ + protected $boundary = []; + + /** + * The array of available text strings for the current language. + * + * @var array + */ + protected $language = []; + + /** + * The number of errors encountered. + * + * @var int + */ + protected $error_count = 0; + + /** + * The S/MIME certificate file path. + * + * @var string + */ + protected $sign_cert_file = ''; + + /** + * The S/MIME key file path. + * + * @var string + */ + protected $sign_key_file = ''; + + /** + * The optional S/MIME extra certificates ("CA Chain") file path. + * + * @var string + */ + protected $sign_extracerts_file = ''; + + /** + * The S/MIME password for the key. + * Used only if the key is encrypted. + * + * @var string + */ + protected $sign_key_pass = ''; + + /** + * Whether to throw exceptions for errors. + * + * @var bool + */ + protected $exceptions = false; + + /** + * Unique ID used for message ID and boundaries. + * + * @var string + */ + protected $uniqueid = ''; + + /** + * The PHPMailer Version number. + * + * @var string + */ + const VERSION = '6.8.1'; + + /** + * Error severity: message only, continue processing. + * + * @var int + */ + const STOP_MESSAGE = 0; + + /** + * Error severity: message, likely ok to continue processing. + * + * @var int + */ + const STOP_CONTINUE = 1; + + /** + * Error severity: message, plus full stop, critical error reached. + * + * @var int + */ + const STOP_CRITICAL = 2; + + /** + * The SMTP standard CRLF line break. + * If you want to change line break format, change static::$LE, not this. + */ + const CRLF = "\r\n"; + + /** + * "Folding White Space" a white space string used for line folding. + */ + const FWS = ' '; + + /** + * SMTP RFC standard line ending; Carriage Return, Line Feed. + * + * @var string + */ + protected static $LE = self::CRLF; + + /** + * The maximum line length supported by mail(). + * + * Background: mail() will sometimes corrupt messages + * with headers longer than 65 chars, see #818. + * + * @var int + */ + const MAIL_MAX_LINE_LENGTH = 63; + + /** + * The maximum line length allowed by RFC 2822 section 2.1.1. + * + * @var int + */ + const MAX_LINE_LENGTH = 998; + + /** + * The lower maximum line length allowed by RFC 2822 section 2.1.1. + * This length does NOT include the line break + * 76 means that lines will be 77 or 78 chars depending on whether + * the line break format is LF or CRLF; both are valid. + * + * @var int + */ + const STD_LINE_LENGTH = 76; + + /** + * Constructor. + * + * @param bool $exceptions Should we throw external exceptions? + */ + public function __construct($exceptions = null) + { + if (null !== $exceptions) { + $this->exceptions = (bool) $exceptions; + } + //Pick an appropriate debug output format automatically + $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html'); + } + + /** + * Destructor. + */ + public function __destruct() + { + //Close any open SMTP connection nicely + $this->smtpClose(); + } + + /** + * Call mail() in a safe_mode-aware fashion. + * Also, unless sendmail_path points to sendmail (or something that + * claims to be sendmail), don't pass params (not a perfect fix, + * but it will do). + * + * @param string $to To + * @param string $subject Subject + * @param string $body Message Body + * @param string $header Additional Header(s) + * @param string|null $params Params + * + * @return bool + */ + private function mailPassthru($to, $subject, $body, $header, $params) + { + //Check overloading of mail function to avoid double-encoding + if ((int)ini_get('mbstring.func_overload') & 1) { + $subject = $this->secureHeader($subject); + } else { + $subject = $this->encodeHeader($this->secureHeader($subject)); + } + //Calling mail() with null params breaks + $this->edebug('Sending with mail()'); + $this->edebug('Sendmail path: ' . ini_get('sendmail_path')); + $this->edebug("Envelope sender: {$this->Sender}"); + $this->edebug("To: {$to}"); + $this->edebug("Subject: {$subject}"); + $this->edebug("Headers: {$header}"); + if (!$this->UseSendmailOptions || null === $params) { + $result = @mail($to, $subject, $body, $header); + } else { + $this->edebug("Additional params: {$params}"); + $result = @mail($to, $subject, $body, $header, $params); + } + $this->edebug('Result: ' . ($result ? 'true' : 'false')); + return $result; + } + + /** + * Output debugging info via a user-defined method. + * Only generates output if debug output is enabled. + * + * @see PHPMailer::$Debugoutput + * @see PHPMailer::$SMTPDebug + * + * @param string $str + */ + protected function edebug($str) + { + if ($this->SMTPDebug <= 0) { + return; + } + //Is this a PSR-3 logger? + if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) { + $this->Debugoutput->debug($str); + + return; + } + //Avoid clash with built-in function names + if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) { + call_user_func($this->Debugoutput, $str, $this->SMTPDebug); + + return; + } + switch ($this->Debugoutput) { + case 'error_log': + //Don't output, just log + /** @noinspection ForgottenDebugOutputInspection */ + error_log($str); + break; + case 'html': + //Cleans up output a bit for a better looking, HTML-safe output + echo htmlentities( + preg_replace('/[\r\n]+/', '', $str), + ENT_QUOTES, + 'UTF-8' + ), "
\n"; + break; + case 'echo': + default: + //Normalize line breaks + $str = preg_replace('/\r\n|\r/m', "\n", $str); + echo gmdate('Y-m-d H:i:s'), + "\t", + //Trim trailing space + trim( + //Indent for readability, except for trailing break + str_replace( + "\n", + "\n \t ", + trim($str) + ) + ), + "\n"; + } + } + + /** + * Sets message type to HTML or plain. + * + * @param bool $isHtml True for HTML mode + */ + public function isHTML($isHtml = true) + { + if ($isHtml) { + $this->ContentType = static::CONTENT_TYPE_TEXT_HTML; + } else { + $this->ContentType = static::CONTENT_TYPE_PLAINTEXT; + } + } + + /** + * Send messages using SMTP. + */ + public function isSMTP() + { + $this->Mailer = 'smtp'; + } + + /** + * Send messages using PHP's mail() function. + */ + public function isMail() + { + $this->Mailer = 'mail'; + } + + /** + * Send messages using $Sendmail. + */ + public function isSendmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (false === stripos($ini_sendmail_path, 'sendmail')) { + $this->Sendmail = '/usr/sbin/sendmail'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'sendmail'; + } + + /** + * Send messages using qmail. + */ + public function isQmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (false === stripos($ini_sendmail_path, 'qmail')) { + $this->Sendmail = '/var/qmail/bin/qmail-inject'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'qmail'; + } + + /** + * Add a "To" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addAddress($address, $name = '') + { + return $this->addOrEnqueueAnAddress('to', $address, $name); + } + + /** + * Add a "CC" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('cc', $address, $name); + } + + /** + * Add a "BCC" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addBCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('bcc', $address, $name); + } + + /** + * Add a "Reply-To" address. + * + * @param string $address The email address to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addReplyTo($address, $name = '') + { + return $this->addOrEnqueueAnAddress('Reply-To', $address, $name); + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer + * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still + * be modified after calling this function), addition of such addresses is delayed until send(). + * Addresses that have been added already return false, but do not throw exceptions. + * + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address + * @param string $name An optional username associated with the address + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + protected function addOrEnqueueAnAddress($kind, $address, $name) + { + $pos = false; + if ($address !== null) { + $address = trim($address); + $pos = strrpos($address, '@'); + } + if (false === $pos) { + //At-sign is missing. + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $kind, + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if ($name !== null && is_string($name)) { + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + } else { + $name = ''; + } + $params = [$kind, $address, $name]; + //Enqueue addresses with IDN until we know the PHPMailer::$CharSet. + //Domain is assumed to be whatever is after the last @ symbol in the address + if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) { + if ('Reply-To' !== $kind) { + if (!array_key_exists($address, $this->RecipientsQueue)) { + $this->RecipientsQueue[$address] = $params; + + return true; + } + } elseif (!array_key_exists($address, $this->ReplyToQueue)) { + $this->ReplyToQueue[$address] = $params; + + return true; + } + + return false; + } + + //Immediately add standard addresses without IDN. + return call_user_func_array([$this, 'addAnAddress'], $params); + } + + /** + * Set the boundaries to use for delimiting MIME parts. + * If you override this, ensure you set all 3 boundaries to unique values. + * The default boundaries include a "=_" sequence which cannot occur in quoted-printable bodies, + * as suggested by https://www.rfc-editor.org/rfc/rfc2045#section-6.7 + * + * @return void + */ + public function setBoundaries() + { + $this->uniqueid = $this->generateId(); + $this->boundary[1] = 'b1=_' . $this->uniqueid; + $this->boundary[2] = 'b2=_' . $this->uniqueid; + $this->boundary[3] = 'b3=_' . $this->uniqueid; + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. + * Addresses that have been added already return false, but do not throw exceptions. + * + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address to send, resp. to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + protected function addAnAddress($kind, $address, $name = '') + { + if (!in_array($kind, ['to', 'cc', 'bcc', 'Reply-To'])) { + $error_message = sprintf( + '%s: %s', + $this->lang('Invalid recipient kind'), + $kind + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if (!static::validateAddress($address)) { + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $kind, + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if ('Reply-To' !== $kind) { + if (!array_key_exists(strtolower($address), $this->all_recipients)) { + $this->{$kind}[] = [$address, $name]; + $this->all_recipients[strtolower($address)] = true; + + return true; + } + } elseif (!array_key_exists(strtolower($address), $this->ReplyTo)) { + $this->ReplyTo[strtolower($address)] = [$address, $name]; + + return true; + } + + return false; + } + + /** + * Parse and validate a string containing one or more RFC822-style comma-separated email addresses + * of the form "display name
" into an array of name/address pairs. + * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. + * Note that quotes in the name part are removed. + * + * @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation + * + * @param string $addrstr The address list string + * @param bool $useimap Whether to use the IMAP extension to parse the list + * @param string $charset The charset to use when decoding the address list string. + * + * @return array + */ + public static function parseAddresses($addrstr, $useimap = true, $charset = self::CHARSET_ISO88591) + { + $addresses = []; + if ($useimap && function_exists('imap_rfc822_parse_adrlist')) { + //Use this built-in parser if it's available + $list = imap_rfc822_parse_adrlist($addrstr, ''); + // Clear any potential IMAP errors to get rid of notices being thrown at end of script. + imap_errors(); + foreach ($list as $address) { + if ( + '.SYNTAX-ERROR.' !== $address->host && + static::validateAddress($address->mailbox . '@' . $address->host) + ) { + //Decode the name part if it's present and encoded + if ( + property_exists($address, 'personal') && + //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled + defined('MB_CASE_UPPER') && + preg_match('/^=\?.*\?=$/s', $address->personal) + ) { + $origCharset = mb_internal_encoding(); + mb_internal_encoding($charset); + //Undo any RFC2047-encoded spaces-as-underscores + $address->personal = str_replace('_', '=20', $address->personal); + //Decode the name + $address->personal = mb_decode_mimeheader($address->personal); + mb_internal_encoding($origCharset); + } + + $addresses[] = [ + 'name' => (property_exists($address, 'personal') ? $address->personal : ''), + 'address' => $address->mailbox . '@' . $address->host, + ]; + } + } + } else { + //Use this simpler parser + $list = explode(',', $addrstr); + foreach ($list as $address) { + $address = trim($address); + //Is there a separate name part? + if (strpos($address, '<') === false) { + //No separate name, just use the whole thing + if (static::validateAddress($address)) { + $addresses[] = [ + 'name' => '', + 'address' => $address, + ]; + } + } else { + list($name, $email) = explode('<', $address); + $email = trim(str_replace('>', '', $email)); + $name = trim($name); + if (static::validateAddress($email)) { + //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled + //If this name is encoded, decode it + if (defined('MB_CASE_UPPER') && preg_match('/^=\?.*\?=$/s', $name)) { + $origCharset = mb_internal_encoding(); + mb_internal_encoding($charset); + //Undo any RFC2047-encoded spaces-as-underscores + $name = str_replace('_', '=20', $name); + //Decode the name + $name = mb_decode_mimeheader($name); + mb_internal_encoding($origCharset); + } + $addresses[] = [ + //Remove any surrounding quotes and spaces from the name + 'name' => trim($name, '\'" '), + 'address' => $email, + ]; + } + } + } + } + + return $addresses; + } + + /** + * Set the From and FromName properties. + * + * @param string $address + * @param string $name + * @param bool $auto Whether to also set the Sender address, defaults to true + * + * @throws Exception + * + * @return bool + */ + public function setFrom($address, $name = '', $auto = true) + { + $address = trim((string)$address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + //Don't validate now addresses with IDN. Will be done in send(). + $pos = strrpos($address, '@'); + if ( + (false === $pos) + || ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported()) + && !static::validateAddress($address)) + ) { + $error_message = sprintf( + '%s (From): %s', + $this->lang('invalid_address'), + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + $this->From = $address; + $this->FromName = $name; + if ($auto && empty($this->Sender)) { + $this->Sender = $address; + } + + return true; + } + + /** + * Return the Message-ID header of the last email. + * Technically this is the value from the last time the headers were created, + * but it's also the message ID of the last sent message except in + * pathological cases. + * + * @return string + */ + public function getLastMessageID() + { + return $this->lastMessageID; + } + + /** + * Check that a string looks like an email address. + * Validation patterns supported: + * * `auto` Pick best pattern automatically; + * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0; + * * `pcre` Use old PCRE implementation; + * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; + * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. + * * `noregex` Don't use a regex: super fast, really dumb. + * Alternatively you may pass in a callable to inject your own validator, for example: + * + * ```php + * PHPMailer::validateAddress('user@example.com', function($address) { + * return (strpos($address, '@') !== false); + * }); + * ``` + * + * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator. + * + * @param string $address The email address to check + * @param string|callable $patternselect Which pattern to use + * + * @return bool + */ + public static function validateAddress($address, $patternselect = null) + { + if (null === $patternselect) { + $patternselect = static::$validator; + } + //Don't allow strings as callables, see SECURITY.md and CVE-2021-3603 + if (is_callable($patternselect) && !is_string($patternselect)) { + return call_user_func($patternselect, $address); + } + //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321 + if (strpos($address, "\n") !== false || strpos($address, "\r") !== false) { + return false; + } + switch ($patternselect) { + case 'pcre': //Kept for BC + case 'pcre8': + /* + * A more complex and more permissive version of the RFC5322 regex on which FILTER_VALIDATE_EMAIL + * is based. + * In addition to the addresses allowed by filter_var, also permits: + * * dotless domains: `a@b` + * * comments: `1234 @ local(blah) .machine .example` + * * quoted elements: `'"test blah"@example.org'` + * * numeric TLDs: `a@b.123` + * * unbracketed IPv4 literals: `a@192.168.0.1` + * * IPv6 literals: 'first.last@[IPv6:a1::]' + * Not all of these will necessarily work for sending! + * + * @see http://squiloople.com/2009/12/20/email-address-validation/ + * @copyright 2009-2010 Michael Rushton + * Feel free to use and redistribute this code. But please keep this copyright notice. + */ + return (bool) preg_match( + '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . + '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . + '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . + '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . + '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . + '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . + '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . + '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . + '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', + $address + ); + case 'html5': + /* + * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. + * + * @see https://html.spec.whatwg.org/#e-mail-state-(type=email) + */ + return (bool) preg_match( + '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . + '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', + $address + ); + case 'php': + default: + return filter_var($address, FILTER_VALIDATE_EMAIL) !== false; + } + } + + /** + * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the + * `intl` and `mbstring` PHP extensions. + * + * @return bool `true` if required functions for IDN support are present + */ + public static function idnSupported() + { + return function_exists('idn_to_ascii') && function_exists('mb_convert_encoding'); + } + + /** + * Converts IDN in given email address to its ASCII form, also known as punycode, if possible. + * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet. + * This function silently returns unmodified address if: + * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form) + * - Conversion to punycode is impossible (e.g. required PHP functions are not available) + * or fails for any reason (e.g. domain contains characters not allowed in an IDN). + * + * @see PHPMailer::$CharSet + * + * @param string $address The email address to convert + * + * @return string The encoded address in ASCII form + */ + public function punyencodeAddress($address) + { + //Verify we have required functions, CharSet, and at-sign. + $pos = strrpos($address, '@'); + if ( + !empty($this->CharSet) && + false !== $pos && + static::idnSupported() + ) { + $domain = substr($address, ++$pos); + //Verify CharSet string is a valid one, and domain properly encoded in this CharSet. + if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) { + //Convert the domain from whatever charset it's in to UTF-8 + $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet); + //Ignore IDE complaints about this line - method signature changed in PHP 5.4 + $errorcode = 0; + if (defined('INTL_IDNA_VARIANT_UTS46')) { + //Use the current punycode standard (appeared in PHP 7.2) + $punycode = idn_to_ascii( + $domain, + \IDNA_DEFAULT | \IDNA_USE_STD3_RULES | \IDNA_CHECK_BIDI | + \IDNA_CHECK_CONTEXTJ | \IDNA_NONTRANSITIONAL_TO_ASCII, + \INTL_IDNA_VARIANT_UTS46 + ); + } elseif (defined('INTL_IDNA_VARIANT_2003')) { + //Fall back to this old, deprecated/removed encoding + $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003); + } else { + //Fall back to a default we don't know about + $punycode = idn_to_ascii($domain, $errorcode); + } + if (false !== $punycode) { + return substr($address, 0, $pos) . $punycode; + } + } + } + + return $address; + } + + /** + * Create a message and send it. + * Uses the sending method specified by $Mailer. + * + * @throws Exception + * + * @return bool false on error - See the ErrorInfo property for details of the error + */ + public function send() + { + try { + if (!$this->preSend()) { + return false; + } + + return $this->postSend(); + } catch (Exception $exc) { + $this->mailHeader = ''; + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + + return false; + } + } + + /** + * Prepare a message for sending. + * + * @throws Exception + * + * @return bool + */ + public function preSend() + { + if ( + 'smtp' === $this->Mailer + || ('mail' === $this->Mailer && (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0)) + ) { + //SMTP mandates RFC-compliant line endings + //and it's also used with mail() on Windows + static::setLE(self::CRLF); + } else { + //Maintain backward compatibility with legacy Linux command line mailers + static::setLE(PHP_EOL); + } + //Check for buggy PHP versions that add a header with an incorrect line break + if ( + 'mail' === $this->Mailer + && ((\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70017) + || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70103)) + && ini_get('mail.add_x_header') === '1' + && stripos(PHP_OS, 'WIN') === 0 + ) { + trigger_error($this->lang('buggy_php'), E_USER_WARNING); + } + + try { + $this->error_count = 0; //Reset errors + $this->mailHeader = ''; + + //Dequeue recipient and Reply-To addresses with IDN + foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) { + $params[1] = $this->punyencodeAddress($params[1]); + call_user_func_array([$this, 'addAnAddress'], $params); + } + if (count($this->to) + count($this->cc) + count($this->bcc) < 1) { + throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL); + } + + //Validate From, Sender, and ConfirmReadingTo addresses + foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) { + $this->{$address_kind} = trim($this->{$address_kind}); + if (empty($this->{$address_kind})) { + continue; + } + $this->{$address_kind} = $this->punyencodeAddress($this->{$address_kind}); + if (!static::validateAddress($this->{$address_kind})) { + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $address_kind, + $this->{$address_kind} + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + } + + //Set whether the message is multipart/alternative + if ($this->alternativeExists()) { + $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE; + } + + $this->setMessageType(); + //Refuse to send an empty message unless we are specifically allowing it + if (!$this->AllowEmpty && empty($this->Body)) { + throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL); + } + + //Trim subject consistently + $this->Subject = trim($this->Subject); + //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) + $this->MIMEHeader = ''; + $this->MIMEBody = $this->createBody(); + //createBody may have added some headers, so retain them + $tempheaders = $this->MIMEHeader; + $this->MIMEHeader = $this->createHeader(); + $this->MIMEHeader .= $tempheaders; + + //To capture the complete message when using mail(), create + //an extra header list which createHeader() doesn't fold in + if ('mail' === $this->Mailer) { + if (count($this->to) > 0) { + $this->mailHeader .= $this->addrAppend('To', $this->to); + } else { + $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); + } + $this->mailHeader .= $this->headerLine( + 'Subject', + $this->encodeHeader($this->secureHeader($this->Subject)) + ); + } + + //Sign with DKIM if enabled + if ( + !empty($this->DKIM_domain) + && !empty($this->DKIM_selector) + && (!empty($this->DKIM_private_string) + || (!empty($this->DKIM_private) + && static::isPermittedPath($this->DKIM_private) + && file_exists($this->DKIM_private) + ) + ) + ) { + $header_dkim = $this->DKIM_Add( + $this->MIMEHeader . $this->mailHeader, + $this->encodeHeader($this->secureHeader($this->Subject)), + $this->MIMEBody + ); + $this->MIMEHeader = static::stripTrailingWSP($this->MIMEHeader) . static::$LE . + static::normalizeBreaks($header_dkim) . static::$LE; + } + + return true; + } catch (Exception $exc) { + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + + return false; + } + } + + /** + * Actually send a message via the selected mechanism. + * + * @throws Exception + * + * @return bool + */ + public function postSend() + { + try { + //Choose the mailer and send through it + switch ($this->Mailer) { + case 'sendmail': + case 'qmail': + return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); + case 'smtp': + return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); + case 'mail': + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + default: + $sendMethod = $this->Mailer . 'Send'; + if (method_exists($this, $sendMethod)) { + return $this->{$sendMethod}($this->MIMEHeader, $this->MIMEBody); + } + + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + } + } catch (Exception $exc) { + $this->setError($exc->getMessage()); + $this->edebug($exc->getMessage()); + if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true && $this->smtp->connected()) { + $this->smtp->reset(); + } + if ($this->exceptions) { + throw $exc; + } + } + + return false; + } + + /** + * Send mail using the $Sendmail program. + * + * @see PHPMailer::$Sendmail + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function sendmailSend($header, $body) + { + if ($this->Mailer === 'qmail') { + $this->edebug('Sending with qmail'); + } else { + $this->edebug('Sending with sendmail'); + } + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver + //A space after `-f` is optional, but there is a long history of its presence + //causing problems, so we don't use one + //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html + //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html + //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html + //Example problem: https://www.drupal.org/node/1057954 + + //PHP 5.6 workaround + $sendmail_from_value = ini_get('sendmail_from'); + if (empty($this->Sender) && !empty($sendmail_from_value)) { + //PHP config has a sender address we can use + $this->Sender = ini_get('sendmail_from'); + } + //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) { + if ($this->Mailer === 'qmail') { + $sendmailFmt = '%s -f%s'; + } else { + $sendmailFmt = '%s -oi -f%s -t'; + } + } else { + //allow sendmail to choose a default envelope sender. It may + //seem preferable to force it to use the From header as with + //SMTP, but that introduces new problems (see + //), and + //it has historically worked this way. + $sendmailFmt = '%s -oi -t'; + } + + $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender); + $this->edebug('Sendmail path: ' . $this->Sendmail); + $this->edebug('Sendmail command: ' . $sendmail); + $this->edebug('Envelope sender: ' . $this->Sender); + $this->edebug("Headers: {$header}"); + + if ($this->SingleTo) { + foreach ($this->SingleToArray as $toAddr) { + $mail = @popen($sendmail, 'w'); + if (!$mail) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + $this->edebug("To: {$toAddr}"); + fwrite($mail, 'To: ' . $toAddr . "\n"); + fwrite($mail, $header); + fwrite($mail, $body); + $result = pclose($mail); + $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); + $this->doCallback( + ($result === 0), + [[$addrinfo['address'], $addrinfo['name']]], + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); + if (0 !== $result) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + } else { + $mail = @popen($sendmail, 'w'); + if (!$mail) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fwrite($mail, $header); + fwrite($mail, $body); + $result = pclose($mail); + $this->doCallback( + ($result === 0), + $this->to, + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); + if (0 !== $result) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + + return true; + } + + /** + * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters. + * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. + * + * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report + * + * @param string $string The string to be validated + * + * @return bool + */ + protected static function isShellSafe($string) + { + //It's not possible to use shell commands safely (which includes the mail() function) without escapeshellarg, + //but some hosting providers disable it, creating a security problem that we don't want to have to deal with, + //so we don't. + if (!function_exists('escapeshellarg') || !function_exists('escapeshellcmd')) { + return false; + } + + if ( + escapeshellcmd($string) !== $string + || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) + ) { + return false; + } + + $length = strlen($string); + + for ($i = 0; $i < $length; ++$i) { + $c = $string[$i]; + + //All other characters have a special meaning in at least one common shell, including = and +. + //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. + //Note that this does permit non-Latin alphanumeric characters based on the current locale. + if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { + return false; + } + } + + return true; + } + + /** + * Check whether a file path is of a permitted type. + * Used to reject URLs and phar files from functions that access local file paths, + * such as addAttachment. + * + * @param string $path A relative or absolute path to a file + * + * @return bool + */ + protected static function isPermittedPath($path) + { + //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1 + return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path); + } + + /** + * Check whether a file path is safe, accessible, and readable. + * + * @param string $path A relative or absolute path to a file + * + * @return bool + */ + protected static function fileIsAccessible($path) + { + if (!static::isPermittedPath($path)) { + return false; + } + $readable = is_file($path); + //If not a UNC path (expected to start with \\), check read permission, see #2069 + if (strpos($path, '\\\\') !== 0) { + $readable = $readable && is_readable($path); + } + return $readable; + } + + /** + * Send mail using the PHP mail() function. + * + * @see http://www.php.net/manual/en/book.mail.php + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function mailSend($header, $body) + { + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + + $toArr = []; + foreach ($this->to as $toaddr) { + $toArr[] = $this->addrFormat($toaddr); + } + $to = trim(implode(', ', $toArr)); + + //If there are no To-addresses (e.g. when sending only to BCC-addresses) + //the following should be added to get a correct DKIM-signature. + //Compare with $this->preSend() + if ($to === '') { + $to = 'undisclosed-recipients:;'; + } + + $params = null; + //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver + //A space after `-f` is optional, but there is a long history of its presence + //causing problems, so we don't use one + //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html + //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html + //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html + //Example problem: https://www.drupal.org/node/1057954 + //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + + //PHP 5.6 workaround + $sendmail_from_value = ini_get('sendmail_from'); + if (empty($this->Sender) && !empty($sendmail_from_value)) { + //PHP config has a sender address we can use + $this->Sender = ini_get('sendmail_from'); + } + if (!empty($this->Sender) && static::validateAddress($this->Sender)) { + if (self::isShellSafe($this->Sender)) { + $params = sprintf('-f%s', $this->Sender); + } + $old_from = ini_get('sendmail_from'); + ini_set('sendmail_from', $this->Sender); + } + $result = false; + if ($this->SingleTo && count($toArr) > 1) { + foreach ($toArr as $toAddr) { + $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); + $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); + $this->doCallback( + $result, + [[$addrinfo['address'], $addrinfo['name']]], + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + } + } else { + $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); + $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, []); + } + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + if (!$result) { + throw new Exception($this->lang('instantiate'), self::STOP_CRITICAL); + } + + return true; + } + + /** + * Get an instance to use for SMTP operations. + * Override this function to load your own SMTP implementation, + * or set one with setSMTPInstance. + * + * @return SMTP + */ + public function getSMTPInstance() + { + if (!is_object($this->smtp)) { + $this->smtp = new SMTP(); + } + + return $this->smtp; + } + + /** + * Provide an instance to use for SMTP operations. + * + * @return SMTP + */ + public function setSMTPInstance(SMTP $smtp) + { + $this->smtp = $smtp; + + return $this->smtp; + } + + /** + * Send mail via SMTP. + * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. + * + * @see PHPMailer::setSMTPInstance() to use a different class. + * + * @uses \PHPMailer\PHPMailer\SMTP + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function smtpSend($header, $body) + { + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + $bad_rcpt = []; + if (!$this->smtpConnect($this->SMTPOptions)) { + throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); + } + //Sender already validated in preSend() + if ('' === $this->Sender) { + $smtp_from = $this->From; + } else { + $smtp_from = $this->Sender; + } + if (!$this->smtp->mail($smtp_from)) { + $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); + throw new Exception($this->ErrorInfo, self::STOP_CRITICAL); + } + + $callbacks = []; + //Attempt to send to all recipients + foreach ([$this->to, $this->cc, $this->bcc] as $togroup) { + foreach ($togroup as $to) { + if (!$this->smtp->recipient($to[0], $this->dsn)) { + $error = $this->smtp->getError(); + $bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']]; + $isSent = false; + } else { + $isSent = true; + } + + $callbacks[] = ['issent' => $isSent, 'to' => $to[0], 'name' => $to[1]]; + } + } + + //Only send the DATA command if we have viable recipients + if ((count($this->all_recipients) > count($bad_rcpt)) && !$this->smtp->data($header . $body)) { + throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL); + } + + $smtp_transaction_id = $this->smtp->getLastTransactionID(); + + if ($this->SMTPKeepAlive) { + $this->smtp->reset(); + } else { + $this->smtp->quit(); + $this->smtp->close(); + } + + foreach ($callbacks as $cb) { + $this->doCallback( + $cb['issent'], + [[$cb['to'], $cb['name']]], + [], + [], + $this->Subject, + $body, + $this->From, + ['smtp_transaction_id' => $smtp_transaction_id] + ); + } + + //Create error message for any bad addresses + if (count($bad_rcpt) > 0) { + $errstr = ''; + foreach ($bad_rcpt as $bad) { + $errstr .= $bad['to'] . ': ' . $bad['error']; + } + throw new Exception($this->lang('recipients_failed') . $errstr, self::STOP_CONTINUE); + } + + return true; + } + + /** + * Initiate a connection to an SMTP server. + * Returns false if the operation failed. + * + * @param array $options An array of options compatible with stream_context_create() + * + * @throws Exception + * + * @uses \PHPMailer\PHPMailer\SMTP + * + * @return bool + */ + public function smtpConnect($options = null) + { + if (null === $this->smtp) { + $this->smtp = $this->getSMTPInstance(); + } + + //If no options are provided, use whatever is set in the instance + if (null === $options) { + $options = $this->SMTPOptions; + } + + //Already connected? + if ($this->smtp->connected()) { + return true; + } + + $this->smtp->setTimeout($this->Timeout); + $this->smtp->setDebugLevel($this->SMTPDebug); + $this->smtp->setDebugOutput($this->Debugoutput); + $this->smtp->setVerp($this->do_verp); + if ($this->Host === null) { + $this->Host = 'localhost'; + } + $hosts = explode(';', $this->Host); + $lastexception = null; + + foreach ($hosts as $hostentry) { + $hostinfo = []; + if ( + !preg_match( + '/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/', + trim($hostentry), + $hostinfo + ) + ) { + $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry)); + //Not a valid host entry + continue; + } + //$hostinfo[1]: optional ssl or tls prefix + //$hostinfo[2]: the hostname + //$hostinfo[3]: optional port number + //The host string prefix can temporarily override the current setting for SMTPSecure + //If it's not specified, the default value is used + + //Check the host name is a valid name or IP address before trying to use it + if (!static::isValidHost($hostinfo[2])) { + $this->edebug($this->lang('invalid_host') . ' ' . $hostinfo[2]); + continue; + } + $prefix = ''; + $secure = $this->SMTPSecure; + $tls = (static::ENCRYPTION_STARTTLS === $this->SMTPSecure); + if ('ssl' === $hostinfo[1] || ('' === $hostinfo[1] && static::ENCRYPTION_SMTPS === $this->SMTPSecure)) { + $prefix = 'ssl://'; + $tls = false; //Can't have SSL and TLS at the same time + $secure = static::ENCRYPTION_SMTPS; + } elseif ('tls' === $hostinfo[1]) { + $tls = true; + //TLS doesn't use a prefix + $secure = static::ENCRYPTION_STARTTLS; + } + //Do we need the OpenSSL extension? + $sslext = defined('OPENSSL_ALGO_SHA256'); + if (static::ENCRYPTION_STARTTLS === $secure || static::ENCRYPTION_SMTPS === $secure) { + //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled + if (!$sslext) { + throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL); + } + } + $host = $hostinfo[2]; + $port = $this->Port; + if ( + array_key_exists(3, $hostinfo) && + is_numeric($hostinfo[3]) && + $hostinfo[3] > 0 && + $hostinfo[3] < 65536 + ) { + $port = (int) $hostinfo[3]; + } + if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { + try { + if ($this->Helo) { + $hello = $this->Helo; + } else { + $hello = $this->serverHostname(); + } + $this->smtp->hello($hello); + //Automatically enable TLS encryption if: + //* it's not disabled + //* we have openssl extension + //* we are not already using SSL + //* the server offers STARTTLS + if ($this->SMTPAutoTLS && $sslext && 'ssl' !== $secure && $this->smtp->getServerExt('STARTTLS')) { + $tls = true; + } + if ($tls) { + if (!$this->smtp->startTLS()) { + $message = $this->getSmtpErrorMessage('connect_host'); + throw new Exception($message); + } + //We must resend EHLO after TLS negotiation + $this->smtp->hello($hello); + } + if ( + $this->SMTPAuth && !$this->smtp->authenticate( + $this->Username, + $this->Password, + $this->AuthType, + $this->oauth + ) + ) { + throw new Exception($this->lang('authenticate')); + } + + return true; + } catch (Exception $exc) { + $lastexception = $exc; + $this->edebug($exc->getMessage()); + //We must have connected, but then failed TLS or Auth, so close connection nicely + $this->smtp->quit(); + } + } + } + //If we get here, all connection attempts have failed, so close connection hard + $this->smtp->close(); + //As we've caught all exceptions, just report whatever the last one was + if ($this->exceptions && null !== $lastexception) { + throw $lastexception; + } + if ($this->exceptions) { + // no exception was thrown, likely $this->smtp->connect() failed + $message = $this->getSmtpErrorMessage('connect_host'); + throw new Exception($message); + } + + return false; + } + + /** + * Close the active SMTP session if one exists. + */ + public function smtpClose() + { + if ((null !== $this->smtp) && $this->smtp->connected()) { + $this->smtp->quit(); + $this->smtp->close(); + } + } + + /** + * Set the language for error messages. + * The default language is English. + * + * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") + * Optionally, the language code can be enhanced with a 4-character + * script annotation and/or a 2-character country annotation. + * @param string $lang_path Path to the language file directory, with trailing separator (slash) + * Do not set this from user input! + * + * @return bool Returns true if the requested language was loaded, false otherwise. + */ + public function setLanguage($langcode = 'en', $lang_path = '') + { + //Backwards compatibility for renamed language codes + $renamed_langcodes = [ + 'br' => 'pt_br', + 'cz' => 'cs', + 'dk' => 'da', + 'no' => 'nb', + 'se' => 'sv', + 'rs' => 'sr', + 'tg' => 'tl', + 'am' => 'hy', + ]; + + if (array_key_exists($langcode, $renamed_langcodes)) { + $langcode = $renamed_langcodes[$langcode]; + } + + //Define full set of translatable strings in English + $PHPMAILER_LANG = [ + 'authenticate' => 'SMTP Error: Could not authenticate.', + 'buggy_php' => 'Your version of PHP is affected by a bug that may result in corrupted messages.' . + ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' . + ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.', + 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', + 'data_not_accepted' => 'SMTP Error: data not accepted.', + 'empty_message' => 'Message body empty', + 'encoding' => 'Unknown encoding: ', + 'execute' => 'Could not execute: ', + 'extension_missing' => 'Extension missing: ', + 'file_access' => 'Could not access file: ', + 'file_open' => 'File Error: Could not open file: ', + 'from_failed' => 'The following From address failed: ', + 'instantiate' => 'Could not instantiate mail function.', + 'invalid_address' => 'Invalid address: ', + 'invalid_header' => 'Invalid header name or value', + 'invalid_hostentry' => 'Invalid hostentry: ', + 'invalid_host' => 'Invalid host: ', + 'mailer_not_supported' => ' mailer is not supported.', + 'provide_address' => 'You must provide at least one recipient email address.', + 'recipients_failed' => 'SMTP Error: The following recipients failed: ', + 'signing' => 'Signing Error: ', + 'smtp_code' => 'SMTP code: ', + 'smtp_code_ex' => 'Additional SMTP info: ', + 'smtp_connect_failed' => 'SMTP connect() failed.', + 'smtp_detail' => 'Detail: ', + 'smtp_error' => 'SMTP server error: ', + 'variable_set' => 'Cannot set or reset variable: ', + ]; + if (empty($lang_path)) { + //Calculate an absolute path so it can work if CWD is not here + $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR; + } + + //Validate $langcode + $foundlang = true; + $langcode = strtolower($langcode); + if ( + !preg_match('/^(?P[a-z]{2})(?P \ No newline at end of file diff --git a/app/views/inc/components/topnavbar.php b/app/views/inc/components/topnavbar.php index 02fa6c99..e27e9f19 100644 --- a/app/views/inc/components/topnavbar.php +++ b/app/views/inc/components/topnavbar.php @@ -1,11 +1,22 @@
- Home - - Login - Register - - Logout - - -
\ No newline at end of file +
+
+ + + Login + Register + + + +
+
+ + + \ No newline at end of file diff --git a/app/views/inc/header.php b/app/views/inc/header.php index 5f94bcfa..fc4fd3cb 100644 --- a/app/views/inc/header.php +++ b/app/views/inc/header.php @@ -1,5 +1,8 @@ + + + <?php echo SITENAME ?> diff --git a/composer.json b/composer.json index 2f674305..3e17a4be 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,8 @@ ], "require": { "php": ">=7.2", - "monolog/monolog": "^2.0" + "monolog/monolog": "^2.0", + "phpmailer/phpmailer": "*" }, "license": "Apache-2.0", "config": { @@ -17,4 +18,4 @@ "php": "7.2" } } -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index 1e18acd8..b959e067 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7e241071bce466ab91b83f631b9be41f", + "content-hash": "40fcde177ef7b048c69bb5e80ad97425", "packages": [ { "name": "monolog/monolog", @@ -108,6 +108,86 @@ ], "time": "2023-02-06T13:44:46+00:00" }, + { + "name": "phpmailer/phpmailer", + "version": "v6.8.1", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "e88da8d679acc3824ff231fdc553565b802ac016" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e88da8d679acc3824ff231fdc553565b802ac016", + "reference": "e88da8d679acc3824ff231fdc553565b802ac016", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" + }, + "suggest": { + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "support": { + "issues": "https://github.com/PHPMailer/PHPMailer/issues", + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.8.1" + }, + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "time": "2023-08-29T08:26:30+00:00" + }, { "name": "psr/log", "version": "1.1.4", diff --git a/public/css/components/sidenavbar.css b/public/css/components/sidenavbar.css new file mode 100644 index 00000000..e38a38e0 --- /dev/null +++ b/public/css/components/sidenavbar.css @@ -0,0 +1,84 @@ +.sidenav{ + background-color: #ffffff; + z-index: 1; + position: absolute; + top: 0; + border-radius: 0 50px 50px 0; + height: 100vh; + width: 250px; + box-shadow: 0 0 20px 0.1px rgba(0, 0, 0, 0.49); + left: -270px; /* Move the sidebar off-screen to the left initially */ + transition: left 0.5s ease-in; +} + +.sidenav-toggled{ + left: 0; +} + +.sidenav .container{ + padding: 10px 0; + height: 95vh; +} + +.sidenav .container .logo{ + font-size: 40px; + text-align: center; + padding: 20px 0 50px 0; + margin: 0 10px 0 10px; + border-bottom: 1px solid black; +} + +.sidenav .container .logo img{ + width: 200px; +} + +.sidenav .container .sidenav-close-btn{ + position: absolute; + top: 40px; + cursor: pointer; + right: -15px; + padding: 7px 10px; + font-size: 15px; + transition: 0.3s; + background-color: #fdc63e; + border-radius: 50%; + box-shadow: 0 0 10px 0.1px rgba(0, 0, 0, 0.16); +} + +.sidenav .container .sidenav-close-btn:hover{ + scale: 1.1; +} + +.sidenav .container .items{ + margin-top: 20px; +} + +.sidenav .container .items .item{ + padding: 15px 10px 15px 10px; + border-radius: 0 50px 50px 0; + transition: 0.3s; +} + +.sidenav .container .items img{ + width: 20px; + margin-right: 10px; +} + +.sidenav .container .items .logout{ + position: absolute; + bottom: 0; + padding: 15px 10px 15px 10px; +} + +.sidenav .container .items .logout a{ + text-decoration: none; + color: black; +} + +.sidenav .container .items .item:hover{ + background-color: rgba(255, 232, 0, 0.11); +} + +.selected{ + background: linear-gradient(to right, rgba(252, 212, 38, 0.56), rgba(255, 153, 0, 0.58)); +} \ No newline at end of file diff --git a/public/css/components/topnavbar.css b/public/css/components/topnavbar.css index 8020fbae..dd0e4133 100644 --- a/public/css/components/topnavbar.css +++ b/public/css/components/topnavbar.css @@ -1,28 +1,33 @@ -body { - margin: 0; - font-family: Arial, Helvetica, sans-serif; -} - -.topnav { +.topnav{ overflow: hidden; - background-color: #333; + background-color: #ffb700; + width: 100vw; + position: absolute; + top: 0; + left: 0; } -.topnav a { - float: left; - color: #f2f2f2; +.topnav .items .item{ + float: right; + color: rgba(0, 0, 0, 0.62); text-align: center; padding: 14px 16px; text-decoration: none; - font-size: 17px; + font-size: 18px; + font-weight: bold; + margin-right: 1vw; } -.topnav a:hover { - background-color: #ddd; - color: black; +.topnav .items .logo{ + float: left; + transition: 0.5s; + margin-left: 1vw; +} + +.topnav .items .logo:hover{ + scale: 1.1; } -.topnav a.active { - background-color: #04AA6D; - color: white; +.topnav .items .item:hover { + color: black; } diff --git a/public/css/style.css b/public/css/style.css index a0ff74ad..32135297 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,9 +1,7 @@ /* --------------- Components Styles --------------- */ @import url('components/topnavbar.css'); - - -/* ------------------ Form Styles ------------------ */ @import url('components/formStyles.css'); +@import url('components/sidenavbar.css'); /* ----------------- General Styles ---------------- */ diff --git a/public/images/back.svg b/public/images/back.svg new file mode 100644 index 00000000..1d99104c --- /dev/null +++ b/public/images/back.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/booking.svg b/public/images/booking.svg new file mode 100644 index 00000000..8a5975c2 --- /dev/null +++ b/public/images/booking.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/history.svg b/public/images/history.svg new file mode 100644 index 00000000..04a6ec30 --- /dev/null +++ b/public/images/history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/home.svg b/public/images/home.svg new file mode 100644 index 00000000..8ebf7eb6 --- /dev/null +++ b/public/images/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/logo.png b/public/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab25e6521723df4c4315a4f51d50f2d425b2c32 GIT binary patch literal 102883 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

YGP1Nu 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 l=Ce|Q?Em%AM0V \ No newline at end of file diff --git a/public/images/package.svg b/public/images/package.svg new file mode 100644 index 00000000..a43670a2 --- /dev/null +++ b/public/images/package.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/profile.svg b/public/images/profile.svg new file mode 100644 index 00000000..01752183 --- /dev/null +++ b/public/images/profile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/rating.svg b/public/images/rating.svg new file mode 100644 index 00000000..c1579e81 --- /dev/null +++ b/public/images/rating.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/search.svg b/public/images/search.svg new file mode 100644 index 00000000..5531a963 --- /dev/null +++ b/public/images/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/vehicle.svg b/public/images/vehicle.svg new file mode 100644 index 00000000..6417e231 --- /dev/null +++ b/public/images/vehicle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/js/script.js b/public/js/script.js index 4cf9afe6..2020b56c 100644 --- a/public/js/script.js +++ b/public/js/script.js @@ -69,4 +69,3 @@ function updateStrengthText(strength) { strengthText.textContent = text; } -