This commit is contained in:
BIG2EYEZ 2024-01-28 00:09:22 +08:00
parent 6190cb63cd
commit 548064782e
5 changed files with 19 additions and 43 deletions

View File

@ -13,4 +13,6 @@ let transporter = nodemailer.createTransport({
pass: process.env.epass pass: process.env.epass
}, },
}); });
module.exports = { transporter }; module.exports = { transporter };

View File

@ -39,4 +39,8 @@ const sendOTPByEmail = async (email, otp) => {
module.exports = { module.exports = {
generateOTP, generateOTP,
sendOTPByEmail sendOTPByEmail
}; };

View File

@ -4,6 +4,10 @@ const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes windowMs: 15 * 60 * 1000, // 15 minutes
max: 5, // limit each IP to 5 requests per windowMs max: 5, // limit each IP to 5 requests per windowMs
message: 'Too many login attempts from this IP, please try again later.', message: 'Too many login attempts from this IP, please try again later.',
standardHeaders: "draft-7", // draft-6: `RateLimit-*` headers; draft-7: combined `RateLimit` header
legacyHeaders: false, // Disable the `X-RateLimit-*` headers.
}); });
module.exports = limiter; module.exports = limiter;

View File

@ -1,4 +1,4 @@
const { validationResult, body } = require('express-validator'); const {body } = require('express-validator');
const locationValidation = [ const locationValidation = [
body('name').trim().isLength({ min: 1 }).withMessage('Name must not be empty').escape(), body('name').trim().isLength({ min: 1 }).withMessage('Name must not be empty').escape(),
@ -63,7 +63,7 @@ const createValidation = [
body('name').trim().isLength({ min: 1 }).withMessage('Name must not be empty').escape(), body('name').trim().isLength({ min: 1 }).withMessage('Name must not be empty').escape(),
body('username').trim().isLength({ min: 1 }).withMessage('Username must not be empty').escape(), body('username').trim().isLength({ min: 1 }).withMessage('Username must not be empty').escape(),
body('email').isEmail().withMessage('Invalid email address').normalizeEmail(), body('email').isEmail().withMessage('Invalid email address').normalizeEmail(),
body('password').custom((value) => { body('password').escape().trim().custom((value) => {
if (!isStrongPassword(value)) { throw new Error('Password does not meet complexity requirements'); } return true; if (!isStrongPassword(value)) { throw new Error('Password does not meet complexity requirements'); } return true;
}), }),
body('jobTitle').trim().isLength({ min: 1 }).withMessage('Job title must not be empty').escape(), body('jobTitle').trim().isLength({ min: 1 }).withMessage('Job title must not be empty').escape(),
@ -102,3 +102,5 @@ module.exports = {
,sensorValidation,sensorupdateValidation,sensordeleteValidation,loginValidation,otpValidation ,sensorValidation,sensorupdateValidation,sensordeleteValidation,loginValidation,otpValidation
,createValidation ,createValidation
}; };

View File

@ -7,8 +7,6 @@
<meta name="generator" content="Mobirise v5.9.13, mobirise.com"> <meta name="generator" content="Mobirise v5.9.13, mobirise.com">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta name="description" content=""> <meta name="description" content="">
<title>Home</title> <title>Home</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap-grid.min.css"> <link rel="stylesheet" href="assets/bootstrap/css/bootstrap-grid.min.css">
@ -21,16 +19,9 @@
<link rel="preload" href="https://fonts.googleapis.com/css?family=Inter+Tight:100,200,300,400,500,600,700,800,900,100i,200i,300i,400i,500i,600i,700i,800i,900i&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'"> <link rel="preload" href="https://fonts.googleapis.com/css?family=Inter+Tight:100,200,300,400,500,600,700,800,900,100i,200i,300i,400i,500i,600i,700i,800i,900i&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter+Tight:100,200,300,400,500,600,700,800,900,100i,200i,300i,400i,500i,600i,700i,800i,900i&display=swap"></noscript> <noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter+Tight:100,200,300,400,500,600,700,800,900,100i,200i,300i,400i,500i,600i,700i,800i,900i&display=swap"></noscript>
<link rel="preload" as="style" href="assets/mobirise/css/mbr-additional.css?v=b1g2Yh"><link rel="stylesheet" href="assets/mobirise/css/mbr-additional.css?v=b1g2Yh" type="text/css"> <link rel="preload" as="style" href="assets/mobirise/css/mbr-additional.css?v=b1g2Yh"><link rel="stylesheet" href="assets/mobirise/css/mbr-additional.css?v=b1g2Yh" type="text/css">
</head> </head>
<body> <body>
<section data-bs-version="5.1" class="menu menu5 cid-u2mrL2wdLO" once="menu" id="menu05-1i"> <section data-bs-version="5.1" class="menu menu5 cid-u2mrL2wdLO" once="menu" id="menu05-1i">
<nav class="navbar navbar-dropdown navbar-fixed-top navbar-expand-lg"> <nav class="navbar navbar-dropdown navbar-fixed-top navbar-expand-lg">
<div class="container"> <div class="container">
<div class="navbar-brand"> <div class="navbar-brand">
@ -64,10 +55,6 @@
</section> </section>
<section data-bs-version="5.1" class="header5 cid-tJS6uM4N87" id="header05-1"> <section data-bs-version="5.1" class="header5 cid-tJS6uM4N87" id="header05-1">
<div class="topbg"></div> <div class="topbg"></div>
<div class="align-center container"> <div class="align-center container">
<div class="row justify-content-center"> <div class="row justify-content-center">
@ -133,11 +120,6 @@
</section> </section>
<section data-bs-version="5.1" class="header1 cid-tJS9vXDdRK" id="header01-7"> <section data-bs-version="5.1" class="header1 cid-tJS9vXDdRK" id="header01-7">
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-12 col-md-12 col-lg-7 image-wrapper"> <div class="col-12 col-md-12 col-lg-7 image-wrapper">
@ -156,16 +138,12 @@
</section> </section>
<section data-bs-version="5.1" class="contacts2 map1 cid-tLdYHD757A mbr-parallax-background" id="contacts02-9"> <section data-bs-version="5.1" class="contacts2 map1 cid-tLdYHD757A mbr-parallax-background" id="contacts02-9">
<div class="mbr-overlay" style="opacity: 0.5; background-color: rgb(0, 0, 0);"></div> <div class="mbr-overlay" style="opacity: 0.5; background-color: rgb(0, 0, 0);"></div>
<div class="container-fluid"> <div class="container-fluid">
<div class="mbr-section-head mb-5"> <div class="mbr-section-head mb-5">
<h3 class="mbr-section-title mbr-fonts-style align-center mb-0 display-2"> <h3 class="mbr-section-title mbr-fonts-style align-center mb-0 display-2">
<strong>Contacts</strong> <strong>Contacts</strong>
</h3> </h3>
</div> </div>
<div class="row justify-content-center mt-4"> <div class="row justify-content-center mt-4">
<div class="card col-12 col-md-5"> <div class="card col-12 col-md-5">
@ -185,27 +163,14 @@
</div> </div>
</div> </div>
</section> </section>
<section data-bs-version="5.1" class="footer1 programm5 cid-tJS9NNcTLZ" once="footers" id="footer03-8"> <section data-bs-version="5.1" class="footer1 programm5 cid-tJS9NNcTLZ" once="footers" id="footer03-8">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="row-links mb-4"> <div class="row-links mb-4">
<ul class="header-menu"> <ul class="header-menu">
<li class="header-menu-item mbr-fonts-style display-5"><a href="index.html#header01-7" class="text-danger">About</a></li><li class="header-menu-item mbr-fonts-style display-5"><a href="index.html#features04-w" class="text-danger text-primary">Services</a></li><li class="header-menu-item mbr-fonts-style display-5"><a href="index.html#contacts02-9" class="text-danger">Contacts</a></li></ul> <li class="header-menu-item mbr-fonts-style display-5"><a href="index.html#header01-7" class="text-danger">About</a></li><li class="header-menu-item mbr-fonts-style display-5"><a href="index.html#features04-w" class="text-danger text-primary">Services</a></li><li class="header-menu-item mbr-fonts-style display-5"><a href="index.html#contacts02-9" class="text-danger">Contacts</a></li></ul>
</div> </div>
<div class="col-12">
<div class="col-12">
</div> </div>
<div class="col-12 mt-5"> <div class="col-12 mt-5">
<p class="mbr-fonts-style copyright display-7"> <p class="mbr-fonts-style copyright display-7">
@ -215,8 +180,7 @@
</div> </div>
</div> </div>
</section><section class="display-7" style="padding: 0;align-items: center;justify-content: center;flex-wrap: wrap; align-content: center;display: flex;position: relative;height: 4rem;"><a href="https://mobiri.se/3136804" style="flex: 1 1;height: 4rem;position: absolute;width: 100%;z-index: 1;"><img alt="" style="height: 4rem;" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="></a><p style="margin: 0;text-align: center;" class="display-7">&#8204;</p><a style="z-index:1" href="https://mobirise.com/builder/ai-website-builder.html">AI Website Builder</a></section><script src="assets/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="assets/parallax/jarallax.js"></script> <script src="assets/smoothscroll/smooth-scroll.js"></script> <script src="assets/ytplayer/index.js"></script> <script src="assets/dropdown/js/navbar-dropdown.js"></script> <script src="assets/theme/js/script.js"></script> </section><section class="display-7" style="padding: 0;align-items: center;justify-content: center;flex-wrap: wrap; align-content: center;display: flex;position: relative;height: 4rem;"><a href="https://mobiri.se/3136804" style="flex: 1 1;height: 4rem;position: absolute;width: 100%;z-index: 1;"><img alt="" style="height: 4rem;" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="></a><p style="margin: 0;text-align: center;" class="display-7">&#8204;</p><a style="z-index:1" href="https://mobirise.com/builder/ai-website-builder.html">AI Website Builder</a></section><script src="assets/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="assets/parallax/jarallax.js"></script> <script src="assets/smoothscroll/smooth-scroll.js"></script> <script src="assets/ytplayer/index.js"></script> <script src="assets/dropdown/js/navbar-dropdown.js"></script> <script src="assets/theme/js/script.js"></script>
<input name="animation" type="hidden"> <input name="animation" type="hidden">
</body> </body>
</html> </html>