Skip to content
This repository was archived by the owner on Nov 14, 2025. It is now read-only.

Commit 24a917c

Browse files
authored
Merge pull request #29 from ln-markets/add-password
2 parents 59aef64 + 403e5ae commit 24a917c

File tree

31 files changed

+338
-39
lines changed

31 files changed

+338
-39
lines changed

apps/api/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"cuid": "^2.1.8",
2727
"dotenv": "^10.0.0",
2828
"express": "^4.17.1",
29+
"express-session": "^1.17.2",
2930
"express-winston": "^4.2.0",
3031
"helmet": "^4.6.0",
3132
"ln-service": "^52.14.2",

apps/api/src/express.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ module.exports = () => {
2424
app.use(bodyParser.json({ extended: false }))
2525
app.use(bodyParser.text())
2626
app.use(bodyParser.urlencoded({ extended: false }))
27+
app.use(require('@/middleware/session.js'))
2728
app.get('/status', (req, res) => {
2829
res.status(200).end()
2930
})

apps/api/src/helpers/errors.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = class HttpError extends Error {
2+
constructor(status, code, message, details) {
3+
if (!status) throw new Error('An HTTP Error need a status')
4+
if (!code) throw new Error('An HTTP Error need a code')
5+
6+
super(code)
7+
8+
this.name = 'HttpError'
9+
this.status = status
10+
11+
if (code) this.code = code
12+
if (message) this.message = message
13+
if (details) this.details = details
14+
}
15+
}

apps/api/src/middleware/auth.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const HttpError = require('@/helpers/errors.js')
2+
3+
module.exports = (req, res, next) => {
4+
if (!req.session || !req.session.auth) {
5+
throw new HttpError(
6+
401,
7+
'unauthorized',
8+
'You do not have permission to reach this ressource.'
9+
)
10+
}
11+
next()
12+
}

apps/api/src/middleware/cors.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
const cors = require('cors')
22

33
module.exports = cors({
4+
credentials: true,
5+
exposedHeaders: ['Set-Cookie', 'Cookie'],
46
origin: (origin, callback) => {
57
if (
68
!origin ||

apps/api/src/middleware/errors.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const HttpError = require('@/helpers/errors.js')
2+
13
const handleLNMarketsRestError = (error) => {
24
const { message, statusCode, code } = error
35

@@ -21,15 +23,28 @@ const internalError = (opt = {}) => {
2123
statusCode,
2224
json: {
2325
code: 'internalError',
24-
message: 'Internal error',
26+
message: 'Internal error.',
27+
},
28+
}
29+
}
30+
31+
const parseHttpError = ({ status, code, message }) => {
32+
return {
33+
statusCode: status,
34+
json: {
35+
code,
36+
message: message || code,
2537
},
2638
}
2739
}
2840

2941
module.exports = (error, req, res, next) => {
3042
let response
43+
3144
if (error.name === 'LNMarketsRestError') {
3245
response = handleLNMarketsRestError(error)
46+
} else if (error instanceof HttpError) {
47+
response = parseHttpError(error)
3348
} else {
3449
response = internalError()
3550
}

apps/api/src/middleware/session.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const dotenv = require('dotenv')
2+
dotenv.config()
3+
4+
const def = {
5+
userSecret: 'Default user secret change me',
6+
}
7+
8+
const session = require('express-session')
9+
10+
module.exports = session({
11+
secret: process.env.SESSION_USER_SECRET || def.userSecret,
12+
resave: false,
13+
saveUninitialized: true,
14+
name: process.env.SESSION_USER_COOKIE_NAME || 'session',
15+
cookie: {
16+
httpOnly: true,
17+
maxAge:
18+
parseInt(process.env.SESSION_USER_COOKIE_MAXAGE) ||
19+
1000 * 60 * 60 * 24 * 30,
20+
path: '/',
21+
sameSite: process.env.SESSION_COOKIE_SAMESITE || true,
22+
},
23+
})

apps/api/src/routes/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
const express = require('express')
2-
const router = express.Router()
2+
const isAuth = require('@/middleware/auth.js')
33

4-
router.get('/auth', require('./auth/get.js'))
5-
router.get('/futures', require('./futures/get.js'))
4+
const router = express.Router()
65

6+
router.get('/auth', [isAuth], require('./auth/get.js'))
7+
router.get('/futures', [isAuth], require('./futures/get.js'))
8+
router.post('/login', require('./login/post.js'))
79
router.use('/user', require('./user/index.js'))
810

911
module.exports = router

apps/api/src/routes/login/post.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const HttpError = require('@/helpers/errors.js')
2+
3+
module.exports = (req, res, next) => {
4+
try {
5+
if (req.body.password === process.env.APP_PASSWORD) {
6+
req.session.auth = true
7+
} else {
8+
throw new HttpError(400, 'wrongPassword', 'Given password is incorrect.')
9+
}
10+
11+
res.end()
12+
} catch (error) {
13+
next(error)
14+
}
15+
}

apps/api/src/routes/user/deposit/post.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
const LNMarketsAPI = require('@/classes/lnmarkets-api.js')
22
const LND = require('@/classes/lnd.js')
33

4+
const HttpError = require('@/helpers/errors.js')
5+
46
module.exports = async (req, res, next) => {
57
try {
68
const { amount } = req.body
@@ -13,7 +15,11 @@ module.exports = async (req, res, next) => {
1315
const { tokens } = await LND.decodePaymentRequest({ request })
1416

1517
if (amount !== tokens) {
16-
throw new Error('WrongAmountInvoice')
18+
throw new HttpError(
19+
400,
20+
'WrongAmountInvoice',
21+
'Amount request does not match with tokens in payment request.'
22+
)
1723
}
1824

1925
const { secret, paths } = await LND.pay({ request })

0 commit comments

Comments
 (0)