Compare commits

...
Author SHA1 Message Date
code002lover 96780223d2 finish updating dependencies 2025-04-26 03:50:09 +02:00
code002lover 2118b1db99 pre-express@5 2025-04-26 03:30:02 +02:00
code002lover 27a1817595 working pre-update 2025-04-26 03:20:54 +02:00
code002lover 2233b4a44c Update README.md
Signed-off-by: code002lover <code002lover@ipost.rocks>
2024-10-16 09:15:38 +02:00
Code002LoverandGitHub ecb3a38d9b Merge pull request #89 from 002Hub/snyk-upgrade-35323bc1e74c46406e6198feb667b5dc
[Snyk] Upgrade lru-cache from 9.0.3 to 9.1.2
2023-07-06 11:55:16 +02:00
Code002LoverandGitHub 0c9f32bc57 Merge branch 'master' into snyk-upgrade-35323bc1e74c46406e6198feb667b5dc 2023-07-06 11:55:09 +02:00
Code002LoverandGitHub 04dc6ae7ee Merge pull request #88 from 002Hub/snyk-upgrade-22146a9c5cc985e0b567ab6304c44731
[Snyk] Upgrade mysql2 from 3.2.3 to 3.3.5
2023-07-06 11:54:07 +02:00
snyk-bot fd7877fda9 fix: upgrade lru-cache from 9.0.3 to 9.1.2
Snyk has created this PR to upgrade lru-cache from 9.0.3 to 9.1.2.

See this package in npm:
https://www.npmjs.com/package/lru-cache

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-07-06 02:08:35 +00:00
snyk-bot 6e2d635fbd fix: upgrade mysql2 from 3.2.3 to 3.3.5
Snyk has created this PR to upgrade mysql2 from 3.2.3 to 3.3.5.

See this package in npm:
https://www.npmjs.com/package/mysql2

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-07-06 02:08:31 +00:00
Mystikfluu a2ef9e0e9f fix bug in handleUserFiles
fix not detecting file, as originalUrl has no "/"
2023-07-05 11:27:27 +02:00
Mystikfluu 503b546470 Merge branch 'master' of https://github.com/002Hub/IPost 2023-07-05 11:24:00 +02:00
Mystikfluu a550cfde7b properly serve sub-folders 2023-07-05 11:23:57 +02:00
Code002LoverandGitHub 344c117938 Merge pull request #85 from 002Hub/snyk-upgrade-9c29503f2b6842bffc0453bc99b44b8e
[Snyk] Upgrade lru-cache from 9.0.1 to 9.0.3
2023-07-05 11:19:45 +02:00
Code002LoverandGitHub 026aa7ac52 Merge branch 'master' into snyk-upgrade-9c29503f2b6842bffc0453bc99b44b8e 2023-07-05 11:19:38 +02:00
Code002LoverandGitHub 24064990f7 Merge pull request #86 from 002Hub/snyk-upgrade-f3cdf165b2057816c9736f0a060720b8
[Snyk] Upgrade mysql2 from 3.2.1 to 3.2.3
2023-07-05 11:18:51 +02:00
snyk-bot 8446a79a7b fix: upgrade mysql2 from 3.2.1 to 3.2.3
Snyk has created this PR to upgrade mysql2 from 3.2.1 to 3.2.3.

See this package in npm:
https://www.npmjs.com/package/mysql2

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-05-08 04:05:48 +00:00
snyk-bot 90cde02e31 fix: upgrade lru-cache from 9.0.1 to 9.0.3
Snyk has created this PR to upgrade lru-cache from 9.0.1 to 9.0.3.

See this package in npm:
https://www.npmjs.com/package/lru-cache

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-05-06 16:56:25 +00:00
Mystikfluu 5c4c1f4690 fix typo in error_codes.txt 2023-05-06 10:46:13 +02:00
Mystikfluu 12e2fa914f rename fina -> filePath in load_var 2023-05-06 10:44:40 +02:00
Mystikfluu d44d107304 fix package-lock 2023-05-06 10:35:25 +02:00
Code002LoverandGitHub 52fa742e48 Merge pull request #82 from 002Hub/snyk-upgrade-bfdad434ad73951a4b1397b1db7a1f51
[Snyk] Upgrade newrelic from 9.12.1 to 9.15.0
2023-05-06 10:33:12 +02:00
Code002LoverandGitHub 1b1e1ef9fd Merge branch 'master' into snyk-upgrade-bfdad434ad73951a4b1397b1db7a1f51 2023-05-06 10:33:06 +02:00
Code002LoverandGitHub f758517eab Merge pull request #81 from 002Hub/snyk-upgrade-9669d500ec479084b8397d674601ed0e
[Snyk] Upgrade lru-cache from 8.0.0 to 9.0.1
2023-05-06 10:32:15 +02:00
Code002LoverandGitHub 7fbe2e261f Merge branch 'master' into snyk-upgrade-9669d500ec479084b8397d674601ed0e 2023-05-06 10:30:47 +02:00
Code002LoverandGitHub bb06358eec Merge pull request #83 from 002Hub/snyk-upgrade-d3f58296e8c75d6842fbba41e683d07a
[Snyk] Upgrade html-minifier-terser from 7.1.0 to 7.2.0
2023-05-06 10:29:28 +02:00
Code002LoverandGitHub 5b635feb28 Merge branch 'master' into snyk-upgrade-d3f58296e8c75d6842fbba41e683d07a 2023-05-06 10:28:36 +02:00
Code002LoverandGitHub e571696559 Merge pull request #84 from 002Hub/snyk-upgrade-61c1b61b2e67752967505ee3f3b8bb53
[Snyk] Upgrade mysql2 from 3.2.0 to 3.2.1
2023-05-06 10:27:15 +02:00
snyk-bot c02b95fc79 fix: upgrade mysql2 from 3.2.0 to 3.2.1
Snyk has created this PR to upgrade mysql2 from 3.2.0 to 3.2.1.

See this package in npm:
https://www.npmjs.com/package/mysql2

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-05-05 01:32:22 +00:00
snyk-bot 5c37c294fc fix: upgrade html-minifier-terser from 7.1.0 to 7.2.0
Snyk has created this PR to upgrade html-minifier-terser from 7.1.0 to 7.2.0.

See this package in npm:
https://www.npmjs.com/package/html-minifier-terser

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-05-03 19:13:17 +00:00
snyk-bot 86f54a5652 fix: upgrade newrelic from 9.12.1 to 9.15.0
Snyk has created this PR to upgrade newrelic from 9.12.1 to 9.15.0.

See this package in npm:
https://www.npmjs.com/package/newrelic

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-05-03 19:13:13 +00:00
snyk-bot 17e4940f6d feat: upgrade lru-cache from 8.0.0 to 9.0.1
Snyk has created this PR to upgrade lru-cache from 8.0.0 to 9.0.1.

See this package in npm:
https://www.npmjs.com/package/lru-cache

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-05-03 19:13:09 +00:00
none fcf98a8b4f set some http security headers 2023-05-03 10:42:32 +02:00
none 03a6a46f55 Merge branch 'master' of https://github.com/002Hub/IPost 2023-05-03 10:17:06 +02:00
none 6053317ab1 only add hsts on HTTPS 2023-05-03 10:17:04 +02:00
Code002LoverandGitHub ac89cf2504 Merge pull request #80 from 002Hub/snyk-upgrade-e0381780061c80253353f6bebd6fbbee
[Snyk] Upgrade newrelic from 9.11.0 to 9.12.1
2023-05-03 10:02:50 +02:00
Code002LoverandGitHub 48e9f7bc31 Merge branch 'master' into snyk-upgrade-e0381780061c80253353f6bebd6fbbee 2023-05-03 10:02:00 +02:00
Code002LoverandGitHub a1d4524624 Merge pull request #78 from 002Hub/snyk-upgrade-b96d6b000d4656468fa5fb82eab0a88b
[Snyk] Upgrade lru-cache from 7.18.3 to 8.0.0
2023-05-03 10:01:04 +02:00
Code002LoverandGitHub 5946ff4d86 Merge branch 'master' into snyk-upgrade-b96d6b000d4656468fa5fb82eab0a88b 2023-05-03 10:00:20 +02:00
Code002LoverandGitHub 95d0d093e9 Merge pull request #79 from 002Hub/snyk-upgrade-646f41380048301fe49ab59b264d60ff
[Snyk] Upgrade ejs from 3.1.8 to 3.1.9
2023-05-03 09:58:52 +02:00
Code002LoverandGitHub 322b4cad33 Merge pull request #77 from 002Hub/snyk-upgrade-28041a48dbd60d988553fd75c4a6e459
[Snyk] Upgrade ws from 8.12.1 to 8.13.0
2023-05-03 09:57:47 +02:00
none 6b169dc540 add hsts 2023-05-03 09:56:10 +02:00
Mystikfluu 0ea07f9ec8 update api documentation
add authentication
2023-04-21 00:17:05 +02:00
code002lover 213368d34c better api doc styling 2023-04-20 10:15:11 +02:00
code002lover 375facdab5 move api docs back to one html file 2023-04-20 10:08:40 +02:00
code002lover 5fd6cbcfe5 add auto swagger
update documentation - still only a temporary solution
2023-04-20 10:02:10 +02:00
snyk-bot 4810769c5f fix: upgrade newrelic from 9.11.0 to 9.12.1
Snyk has created this PR to upgrade newrelic from 9.11.0 to 9.12.1.

See this package in npm:
https://www.npmjs.com/package/newrelic

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-04-05 19:50:30 +00:00
snyk-bot 1f1211b294 fix: upgrade ejs from 3.1.8 to 3.1.9
Snyk has created this PR to upgrade ejs from 3.1.8 to 3.1.9.

See this package in npm:
https://www.npmjs.com/package/ejs

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-04-04 01:42:04 +00:00
Mystikfluu 1ab0379b64 make Timeout time clearer 2023-04-02 20:35:39 +02:00
snyk-bot 55af81bf02 feat: upgrade lru-cache from 7.18.3 to 8.0.0
Snyk has created this PR to upgrade lru-cache from 7.18.3 to 8.0.0.

See this package in npm:
https://www.npmjs.com/package/lru-cache

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-04-02 16:58:07 +00:00
snyk-bot 3d4e88f3a6 fix: upgrade ws from 8.12.1 to 8.13.0
Snyk has created this PR to upgrade ws from 8.12.1 to 8.13.0.

See this package in npm:
https://www.npmjs.com/package/ws

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-04-01 16:52:03 +00:00
Code002LoverandGitHub 93ab117f13 Merge pull request #75 from 002Hub/snyk-upgrade-8951c27880cc775d28fa3dae8a0aa352
[Snyk] Upgrade lru-cache from 7.18.2 to 7.18.3
2023-04-01 17:24:10 +02:00
Code002LoverandGitHub 5af19d1b12 Merge branch 'master' into snyk-upgrade-8951c27880cc775d28fa3dae8a0aa352 2023-04-01 17:23:29 +02:00
Code002LoverandGitHub b56dbd4e77 Merge pull request #76 from 002Hub/snyk-upgrade-c4f60e66cdea2acddfcde91930661fc7
[Snyk] Upgrade newrelic from 9.10.2 to 9.11.0
2023-04-01 17:22:59 +02:00
Mystikfluu d2420e1fef remove "+" from tokencode
fixes some errors with broken tokens
2023-04-01 17:21:25 +02:00
snyk-bot 2369cc3d08 fix: upgrade newrelic from 9.10.2 to 9.11.0
Snyk has created this PR to upgrade newrelic from 9.10.2 to 9.11.0.

See this package in npm:
https://www.npmjs.com/package/newrelic

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-29 22:17:38 +00:00
snyk-bot d33bce970e fix: upgrade lru-cache from 7.18.2 to 7.18.3
Snyk has created this PR to upgrade lru-cache from 7.18.2 to 7.18.3.

See this package in npm:
https://www.npmjs.com/package/lru-cache

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-27 14:51:32 +00:00
Code002LoverandGitHub ca192718ac Merge pull request #74 from 002Hub/snyk-upgrade-2a42870cc3bacf6d21d1ebe9259658d5
[Snyk] Upgrade lru-cache from 7.18.1 to 7.18.2
2023-03-27 10:11:45 +02:00
snyk-bot 7e5af52ae8 fix: upgrade lru-cache from 7.18.1 to 7.18.2
Snyk has created this PR to upgrade lru-cache from 7.18.1 to 7.18.2.

See this package in npm:
https://www.npmjs.com/package/lru-cache

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-26 17:18:02 +00:00
Code002LoverandGitHub a25c2e3cfe Merge pull request #73 from 002Hub/snyk-upgrade-b728f257d177e2a374f709a05c469716
[Snyk] Upgrade lru-cache from 7.16.1 to 7.18.1
2023-03-26 09:49:28 +02:00
snyk-bot 84912c17fc fix: upgrade lru-cache from 7.16.1 to 7.18.1
Snyk has created this PR to upgrade lru-cache from 7.16.1 to 7.18.1.

See this package in npm:
https://www.npmjs.com/package/lru-cache

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-25 23:35:40 +00:00
Code002LoverandGitHub a30af5aa9f Merge pull request #70 from 002Hub/snyk-upgrade-02325cadd5072b9c4a763560c0573104
[Snyk] Upgrade body-parser from 1.20.1 to 1.20.2
2023-03-24 21:21:24 +01:00
Code002LoverandGitHub cf249ce113 Merge pull request #69 from 002Hub/snyk-upgrade-8798e4709ae5756fb6bb427365a4081d
[Snyk] Upgrade lru-cache from 7.16.0 to 7.16.1
2023-03-24 21:21:13 +01:00
Code002LoverandGitHub 8869090cf2 Merge branch 'master' into snyk-upgrade-8798e4709ae5756fb6bb427365a4081d 2023-03-24 21:21:06 +01:00
Code002LoverandGitHub 957a499a65 Merge pull request #71 from 002Hub/snyk-upgrade-495a2c1b33e689e07572972b49774f9c
[Snyk] Upgrade newrelic from 9.10.1 to 9.10.2
2023-03-24 21:19:59 +01:00
Code002LoverandGitHub 3c11984291 Merge branch 'master' into snyk-upgrade-495a2c1b33e689e07572972b49774f9c 2023-03-24 21:19:51 +01:00
Code002LoverandGitHub a85b8dd6f3 Merge pull request #72 from 002Hub/snyk-upgrade-f65eff730b63ca889ab45dfd12ad07bf
[Snyk] Upgrade mysql2 from 3.1.2 to 3.2.0
2023-03-24 21:19:00 +01:00
snyk-bot f595086d53 fix: upgrade mysql2 from 3.1.2 to 3.2.0
Snyk has created this PR to upgrade mysql2 from 3.1.2 to 3.2.0.

See this package in npm:
https://www.npmjs.com/package/mysql2

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-24 20:15:23 +00:00
snyk-bot b281869651 fix: upgrade newrelic from 9.10.1 to 9.10.2
Snyk has created this PR to upgrade newrelic from 9.10.1 to 9.10.2.

See this package in npm:
https://www.npmjs.com/package/newrelic

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-16 16:16:33 +00:00
snyk-bot 3b4f609d19 fix: upgrade body-parser from 1.20.1 to 1.20.2
Snyk has created this PR to upgrade body-parser from 1.20.1 to 1.20.2.

See this package in npm:
https://www.npmjs.com/package/body-parser

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-16 16:16:29 +00:00
snyk-bot 0c8a3faaed fix: upgrade lru-cache from 7.16.0 to 7.16.1
Snyk has created this PR to upgrade lru-cache from 7.16.0 to 7.16.1.

See this package in npm:
https://www.npmjs.com/package/lru-cache

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-11 16:42:54 +00:00
Code002LoverandGitHub 4e558257b8 Merge pull request #68 from 002Hub/snyk-upgrade-2f8c6245936878f79829d10762c2a453
[Snyk] Upgrade newrelic from 9.10.0 to 9.10.1
2023-03-11 09:13:09 +01:00
snyk-bot 66e5afb74e fix: upgrade newrelic from 9.10.0 to 9.10.1
Snyk has created this PR to upgrade newrelic from 9.10.0 to 9.10.1.

See this package in npm:
https://www.npmjs.com/package/newrelic

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-10 16:48:15 +00:00
Code002LoverandGitHub 81b7ff8629 Merge pull request #66 from 002Hub/snyk-upgrade-d2dced8ac2cbdb6744b3c481f1161493
[Snyk] Upgrade ws from 8.12.0 to 8.12.1
2023-03-10 09:34:06 +01:00
Code002LoverandGitHub 5342c5904f Merge pull request #65 from 002Hub/snyk-upgrade-ba2819a7910b3b67027568a8009abe4e
[Snyk] Upgrade newrelic from 9.8.1 to 9.10.0
2023-03-10 09:33:37 +01:00
Code002LoverandGitHub 8b15f23ad9 Merge pull request #67 from 002Hub/snyk-upgrade-825fc2b7440526fa8b7401fd59e68ba3
[Snyk] Upgrade lru-cache from 7.14.1 to 7.16.0
2023-03-10 09:32:33 +01:00
snyk-bot 644d392f59 fix: upgrade lru-cache from 7.14.1 to 7.16.0
Snyk has created this PR to upgrade lru-cache from 7.14.1 to 7.16.0.

See this package in npm:
https://www.npmjs.com/package/lru-cache

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-10 02:37:47 +00:00
snyk-bot 4ffd5b4038 fix: upgrade ws from 8.12.0 to 8.12.1
Snyk has created this PR to upgrade ws from 8.12.0 to 8.12.1.

See this package in npm:
https://www.npmjs.com/package/ws

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-08 00:58:53 +00:00
code002lover 6ce613c15a remove any / from auth codes 2023-03-07 12:41:13 +01:00
code002lover 0cb28a1bcc add extra data parameter 2023-03-07 10:58:10 +01:00
snyk-bot a7551966b9 fix: upgrade newrelic from 9.8.1 to 9.10.0
Snyk has created this PR to upgrade newrelic from 9.8.1 to 9.10.0.

See this package in npm:
https://www.npmjs.com/package/newrelic

See this project in Snyk:
https://app.snyk.io/org/mystikfluu/project/c5b23892-809c-4121-9c2f-67962c7a4953?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-03-04 16:42:14 +00:00
40 changed files with 12813 additions and 5542 deletions
+10
View File
@@ -0,0 +1,10 @@
node_modules
npm-debug.log
.git
.gitignore
.env
*.md
logs
*.log
cookiesecret.txt
mysql_password.txt
+1
View File
@@ -8,3 +8,4 @@ avatars/*
etc/*
*newrelic*
user_uploads/*
swagger-api.json
+18
View File
@@ -0,0 +1,18 @@
FROM node:slim
WORKDIR /app
# Copy package files
COPY package*.json ./
# Install dependencies
RUN npm install
# Copy application code
COPY . .
# Expose ports
EXPOSE 80
# Start the application
CMD ["node", "server.js"]
+1 -1
View File
@@ -1,3 +1,3 @@
# IPost
IPost, formerly known as "authwebsite" is a chatting platform that mainly has one thing in mind: privacy.
IPost, formerly known as "authwebsite" is a chatting platform that also server as a gateway for me to have authentication for my other projects.
You can visit IPost under https://ipost.rocks
+35
View File
@@ -0,0 +1,35 @@
services:
app:
build: .
ports:
- "23080:80"
environment:
- MYSQL_HOST=db
- MYSQL_USER=ipost
- MYSQL_PASSWORD=ipost_password
- MYSQL_DATABASE=ipost
depends_on:
- db
volumes:
- ./logs:/app/logs
- ./server_config.json:/app/server_config.json
- ./cookiesecret.txt:/app/cookiesecret.txt
- ./mysql_password.txt:/app/mysql_password.txt
restart: unless-stopped
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=ipost
- MYSQL_USER=ipost
- MYSQL_PASSWORD=ipost_password
volumes:
- mysql_data:/var/lib/mysql
- ./createSchema.sql:/docker-entrypoint-initdb.d/createSchema.sql
ports:
- "3306:3306"
restart: unless-stopped
volumes:
mysql_data:
+1 -1
View File
@@ -4,7 +4,7 @@
403: login error (no cookie)
404: invalid url / not found
410-419: argument/data error
420: invalid authetication object
420: invalid authentication object
429: ratelimit
500: server error
+2 -2
View File
@@ -56,9 +56,9 @@ const cape = m => unes[m];
const unescape = un => replace.call(un, es, cape);
function escape_special(str) {
return str.replace(/\\/g,"\\\\").replace(/`/g,"\\`")
return str.replace(/\\/g,"\\\\").replace(/`/g,"\\`");
}
function unescape_special(str) {
return str.replace(/\\\\/g,"\\").replace(/\\`/,"`")
return str.replace(/\\\\/g,"\\").replace(/\\`/,"`");
}
+1 -1
View File
@@ -1,6 +1,6 @@
const warn_messages = [
["%cDo not paste any text in here","background: red; color: yellow; font-size: x-large"],
["Pasting anything in here may give others access to your account.",""]
["Pasting anything in here may give others access to your account."]
]
function warnmessage() {
for (let message of warn_messages) {
+1761 -2636
View File
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -1,23 +1,23 @@
{
"dependencies": {
"body-parser": "^1.20.1",
"clean-css": "^5.3.2",
"compression": "^1.7.4",
"cookie-parser": "^1.4.6",
"ejs": "^3.1.8",
"express": "^4.18.2",
"express-fileupload": "^1.3.1",
"express-useragent": "^1.0.15",
"hcaptcha": "^0.1.1",
"html-minifier-terser": "^7.1.0",
"lru-cache": "^7.14.1",
"mysql2": "^3.1.2",
"newrelic": "^9.8.1",
"sharp": "^0.30.7",
"spdy": "^4.0.2",
"uglify-js": "^3.17.4",
"body-parser": "^2.2",
"clean-css": "^5.3",
"compression": "^1.8",
"cookie-parser": "^1.4",
"ejs": "^3.1",
"express": "^5.1",
"express-fileupload": "^1.5",
"express-useragent": "^1.0",
"hcaptcha": "^0.2",
"html-minifier-terser": "^7.2.0",
"lru-cache": "^11.1",
"mysql2": "^3.14",
"sharp": "^0.34",
"swagger-autogen": "^2.23",
"uglify-js": "^3.19",
"unsafe_encrypt": "^1.0.4",
"ws": "^8.12.0"
"ws": "^8.13.0",
"cookie-signature": "^1.2.2"
},
"scripts": {
"start": "node server.js",
+1474
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -0,0 +1,2 @@
onlyBuiltDependencies:
- sharp
+27 -30
View File
@@ -1,39 +1,41 @@
import fs from "fs";
import {SHA256} from "../../extra_modules/SHA.js";
import {unsign} from "../../extra_modules/unsign.js";
import { SHA256 } from "../../extra_modules/SHA.js";
import { unsign } from "../../extra_modules/unsign.js";
const config = JSON.parse(fs.readFileSync("server_config.json"));
const HASHES_DB = config.cookies.server_hashes;
const HASHES_COOKIE = config.cookies.client_hashes;
const HASHES_DIFF = HASHES_DB - HASHES_COOKIE;
export const setup = function (router, con, server) {
router.use("/*", (req, res, next) => {
router.use("/*path", (req, res, next) => {
res.set("Access-Control-Allow-Origin", "*"); //we'll allow it for now
let unsigned;
if (req.body.user === undefined || req.body.pass === undefined) {
if(typeof req.get("ipost-auth-token") === "string") {
try{
req.body = req.body || {};
if (typeof req.get("ipost-auth-token") === "string") {
try {
req.body.auth = JSON.parse(req.get("ipost-auth-token"))
} catch(err) {
console.log("error parsing header",err)
} catch (err) {
console.log("error parsing header", err)
}
}
if(req.body.auth !== undefined && req.originalUrl !== "/redeemauthcode") {
if(typeof req.body.auth === "string") {
try{
if (req.body.auth !== undefined && req.originalUrl !== "/redeemauthcode") {
if (typeof req.body.auth === "string") {
try {
req.body.auth = JSON.parse(req.body.auth)
} catch(err) {
console.log("error parsing",err)
} catch (err) {
console.log("error parsing", err)
}
} else
if(
if (
typeof req.body.auth !== "object" ||
typeof req.body.auth.secret !== "string" ||
typeof req.body.auth.appid !== "number" ||
typeof req.body.auth.auth_token !== "string" ||
req.body.auth.secret.length !== 200 ||
req.body.auth.auth_token.length !== 200 ||
Buffer.from(req.body.auth.secret,"base64").length !== 150
Buffer.from(req.body.auth.secret, "base64").length !== 150
) {
res.status(420).send("invalid authentication object")
return;
@@ -42,10 +44,10 @@ export const setup = function (router, con, server) {
//appid : number
//auth_token: string(200 chars)
let sql = "select User_ID,User_Name,User_Bio,User_Avatar,User_Settings from ipost.auth_tokens inner join ipost.application on auth_token_isfrom_application_id=application_id inner join ipost.users on auth_token_u_id=User_ID where auth_token=? and application_secret=? and application_id=?"
con.query(sql,[SHA256(req.body.auth.auth_token,req.body.auth.appid, HASHES_DB),SHA256(req.body.auth.secret,req.body.auth.appid, HASHES_DB),req.body.auth.appid],(err,result) => {
if(err) throw err;
con.query(sql, [SHA256(req.body.auth.auth_token, req.body.auth.appid, HASHES_DB), SHA256(req.body.auth.secret, req.body.auth.appid, HASHES_DB), req.body.auth.appid], (err, result) => {
if (err) throw err;
if(result.length !== 1) {
if (result.length !== 1) {
res.status(420).send("invalid authentication object (or server error?)")
return;
}
@@ -63,24 +65,16 @@ export const setup = function (router, con, server) {
return;
}
} else {
if(!req.cookies.AUTH_COOKIE) {
if (!req.cookies.AUTH_COOKIE) {
next()
return
}
unsigned = unsign(req.cookies.AUTH_COOKIE, req, res);
if (!unsigned){
if (!unsigned) {
next()
return
}
}
}
else {
unsigned = `${req.body.user} ${SHA256(req.body.pass, req.body.user, HASHES_COOKIE)}`;
res.set("message","user+pass authentication is deprecated as of february 2023, consider switching to auth tokens")
//basically we generate the unsigned cookie
res.locals.isbot = true; //only bots use user+pass
}
let sql = `select User_ID,User_Name,User_Bio,User_Avatar,User_Settings from ipost.users where User_Name=? and User_PW=?;`;
let values = unsigned.split(" ");
values[1] = SHA256(values[1], values[0], HASHES_DIFF);
@@ -103,13 +97,13 @@ export const setup = function (router, con, server) {
});
});
router.use("/api/*", (req, res, next) => {
router.use("/api/*path", (req, res, next) => {
res.set("Access-Control-Allow-Origin", "*"); //we'll allow it for now
if (config["allow_getotheruser_without_cookie"] && req.originalUrl.split("\?")[0] === "/api/getotheruser") {
next();
return;
}
if (!server.increaseAPICall(req, res))return;
if (!server.increaseAPICall(req, res)) return;
if (res.locals.username !== undefined) {
next();
@@ -118,6 +112,9 @@ export const setup = function (router, con, server) {
res.status(402);
res.json({ "error": "you cannot access the api without being logged in" });
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
};
export default {
+12
View File
@@ -20,6 +20,9 @@ export const setup = function (router, con, server) {
throw err;
res.json(result);
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.get("/api/dms/conversations", function (req, res) {
res.set("Access-Control-Allow-Origin", "*");
@@ -30,10 +33,16 @@ export const setup = function (router, con, server) {
throw err;
res.json(result);
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.get("/api/dms/encrypt.js", function (req, res) {
res.set("Access-Control-Allow-Origin", "*");
res.send(web_version());
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
//
router.get("/api/dms/getDM", function (req, res) {
@@ -52,6 +61,9 @@ export const setup = function (router, con, server) {
res.json({ "error": "there is no such dm!" });
}
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
};
export default {
+7
View File
@@ -19,6 +19,9 @@ export const setup = function (router, con, server) {
router.get("/api/dms/pid", function (req, res) {
res.set("Access-Control-Allow-Origin", "*");
res.json({ "pid": createPID() });
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.post("/api/dms/post", function (req, res) {
if (!req.body.message) {
@@ -89,6 +92,10 @@ export const setup = function (router, con, server) {
console.log(5, `posted new dm by ${res.locals.username} to ${otherperson} : ${xor(encodeURIComponent(res.locals.username), otherperson)}`);
});
//TODO: bring dms up-to-date with normal posts
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
return createPID
};
+5 -2
View File
@@ -31,8 +31,8 @@ async function addTextOnImage(text,buf) {
}
export const setup = function (router, con, server) {
router.get("/api/getFileIcon/*",async function(req,res){
let path = req.path.split("/api/getFileIcon/")[1]
router.get("/api/getFileIcon/:icon",async function(req,res){
let path = req.params.icon
if(path.length > 4) {
res.status(410).json({"error":"file ending is too long"})
return;
@@ -41,5 +41,8 @@ export const setup = function (router, con, server) {
res.set("content-type","image/png")
res.send(buf)
})
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
})
}
+9 -4
View File
@@ -1,8 +1,4 @@
export const setup = function (router, con, server) {
router.get("/api/getPosts/*", function (_req, res) {
res.set("Access-Control-Allow-Origin", "");
res.redirect("/api/getPosts");
});
router.get("/api/getPosts", function (req, res) {
res.set("Access-Control-Allow-Origin", "*");
if (req.query.channel !== undefined) {
@@ -21,6 +17,9 @@ export const setup = function (router, con, server) {
res.json(result);
});
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.get("/api/getPostsLowerThan", function (req, res) {
res.set("Access-Control-Allow-Origin", "*");
@@ -40,6 +39,9 @@ export const setup = function (router, con, server) {
res.json(result);
});
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.get("/api/getPost", function (req, res) {
res.set("Access-Control-Allow-Origin", "*");
@@ -56,5 +58,8 @@ export const setup = function (router, con, server) {
res.json({ "error": "there is no such post!" });
}
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
}
+6
View File
@@ -32,6 +32,9 @@ export const setup = function (router, con, server) {
router.get("/api/pid", function (req, res) {
res.set("Access-Control-Allow-Origin", "*");
res.json({ "pid": createPID() });
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
function validateMessage(message) {
@@ -204,6 +207,9 @@ export const setup = function (router, con, server) {
res.json({"error":"internal server error", "status": 500})
}
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
return createPID
};
+4
View File
@@ -34,5 +34,9 @@ export const setup = function (router, con, server) {
else {
res.json({ "error": "invalid type passed along, expected `user` or `post`", "message": "search has been deprecated as of 11/30/2022"});
}
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
}
+8
View File
@@ -4,6 +4,10 @@ const allowed_settings = {
export const setup = function (router, con, server) {
router.get("/api/settings", function (req, res) {
res.json(res.locals.settings);
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.post("/api/settings", function (req, res) {
if (!req.body.setting) {
@@ -45,6 +49,10 @@ export const setup = function (router, con, server) {
}
res.json({ "status": "success" });
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
};
export default {
+18
View File
@@ -48,9 +48,15 @@ export const setup = function (router, con, server) {
});
})
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.get("/api/getuser", function (_req, res) {
res.json({ "username": res.locals.username, "bio": res.locals.bio, "avatar": res.locals.avatar, "userid": res.locals.userid });
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.get("/api/getalluserinformation", function (req, res) {
res.set("Access-Control-Allow-Origin", ""); //we don't want that here
@@ -73,6 +79,9 @@ export const setup = function (router, con, server) {
res.json({ "error": "you cannot access the api without being logged in" });
}
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.get("/api/getotheruser", function (req, res) {
res.set("Access-Control-Allow-Origin", "*");
@@ -109,6 +118,9 @@ export const setup = function (router, con, server) {
throw err;
res.json({ "success": "updated bio" });
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.post("/api/changePW", (req, res) => {
res.set("Access-Control-Allow-Origin", "");
@@ -149,6 +161,9 @@ export const setup = function (router, con, server) {
res.json({ "error": "invalid password" });
}
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
router.post("/api/changeUsername", function (req, res) {
res.set("Access-Control-Allow-Origin", "");
@@ -212,5 +227,8 @@ export const setup = function (router, con, server) {
res.json({ "error": "invalid password" });
}
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
}
+15 -3
View File
@@ -23,7 +23,7 @@ export const setup = function (router, con, server) {
let tokencode;
while(tokencode===undefined || temp_code_to_token[tokencode]!==undefined) {
tokencode = randomBytes(15).toString("base64")
tokencode = randomBytes(15).toString("base64").replaceAll("/","f").replaceAll("+","A") //"/" and "+" may break some apps
}
temp_code_to_token[tokencode]={
"userid":res.locals.userid,
@@ -35,7 +35,7 @@ export const setup = function (router, con, server) {
if(data !== undefined && data.token===token && data.appid === appid && data.userid === res.locals.userid) {
temp_code_to_token[tokencode]=undefined
}
}, 300000); //wait for 5 minutes
}, 1000*60*5);
const sql = "SELECT application_auth_url FROM ipost.application where application_id=?"
@@ -45,7 +45,11 @@ export const setup = function (router, con, server) {
res.redirect(`/authorize?id=${req.body.application_id}`)
return
}
res.redirect(`${result[0].application_auth_url}?code=${tokencode}`)
let extra = ""
if(req.body.application_extra !== "") {
extra = "&extra="+String(req.body.application_extra)
}
res.redirect(`${result[0].application_auth_url}?code=${tokencode}${extra}`)
})
@@ -55,6 +59,10 @@ export const setup = function (router, con, server) {
}
res.redirect(`/authorize?id=${req.body.application_id}`)
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
})
router.post("/redeemauthcode", (req,res) => {
@@ -120,4 +128,8 @@ export const setup = function (router, con, server) {
})
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
}
+18 -19
View File
@@ -5,43 +5,43 @@ export const setup = function (router, con, server) {
const __dirname = server.dirname
const dir = __dirname + "/"
router.get("/users/*", function (req, res) {
router.get("/users/:user", function (req, res) {
if (!increaseUSERCall(req, res))
return;
res.sendFile(dir + "views/otheruser.html");
});
router.get("/css/*", (request, response) => {
router.get("/css/:file", (request, response) => {
if (!increaseUSERCall(request, response))
return;
if (existsSync(__dirname + request.originalUrl)) {
response.sendFile(__dirname + request.originalUrl);
if (existsSync(`${__dirname}/css/${request.params.file}`)) {
response.sendFile(`${__dirname}/css/${request.params.file}`);
}
else {
response.status(404).send("no file with that name found");
}
return;
});
router.get("/js/*", (request, response) => {
router.get("/js/:file", (request, response) => {
if (!increaseUSERCall(request, response))
return;
if (existsSync(__dirname + request.originalUrl)) {
response.sendFile(__dirname + request.originalUrl);
if (existsSync(`${__dirname}/js/${request.params.file}`)) {
response.sendFile(`${__dirname}/js/${request.params.file}`);
}
else {
response.status(404).send("no file with that name found");
}
return;
});
router.get("/images/*", (request, response) => {
router.get("/images/:file", (request, response) => {
if (!increaseUSERCall(request, response))
return;
if (existsSync(__dirname + request.originalUrl)) {
if (existsSync(`${__dirname}/images/${request.params.file}`)) {
response.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
response.sendFile(__dirname + request.originalUrl);
response.sendFile(`${__dirname}/images/${request.params.file}`);
}
else if(existsSync(__dirname + request.originalUrl.toLowerCase())){
else if(existsSync(`${__dirname}/images/${request.params.file.toLowerCase()}`)){
response.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
response.sendFile(__dirname + request.originalUrl.toLowerCase());
response.sendFile(`${__dirname}/images/${request.params.file.toLowerCase()}`);
}
else {
response.status(404).send("no file with that name found");
@@ -49,12 +49,12 @@ export const setup = function (router, con, server) {
return;
});
router.get("/user_uploads/*", (request, response) => {
router.get("/user_uploads/:file", (request, response) => {
if (!increaseUSERCall(request, response))
return;
if (existsSync(__dirname + request.originalUrl)) {
if (existsSync(`${__dirname}/user_uploads/${request.params.file}`)) {
response.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
response.sendFile(__dirname + request.originalUrl);
response.sendFile(`${__dirname}/user_uploads/${request.params.file}`);
}
else {
response.status(404).send("no file with that name found");
@@ -62,13 +62,12 @@ export const setup = function (router, con, server) {
return;
});
router.get("/avatars/*", (request, response) => {
router.get("/avatars/:avatar", (request, response) => {
if (!increaseUSERCall(request, response))
return;
response.set('Cache-Control', 'public, max-age=2592000'); //cache it for one month-ish
let originalUrl = request.originalUrl.split("?").shift();
if (existsSync(dir + originalUrl)) {
return response.sendFile(dir + originalUrl);
if (existsSync(`${__dirname}/avatars/${request.params.avatar}`)) {
return response.sendFile(`${__dirname}/avatars/${request.params.avatar}`);
}
response.status(404).send("No avatar with that name found");
});
+76 -65
View File
@@ -1,17 +1,17 @@
import ejs from "ejs"
import LRU from "lru-cache"
import {minify as min_js} from "uglify-js"
import { LRUCache as LRU } from "lru-cache"
import { minify as min_js } from "uglify-js"
import Clean from 'clean-css';
import Minifier from 'html-minifier-terser';
import { web_version } from "unsafe_encrypt";
import {existsSync, readFileSync, readFile} from "fs"
import { existsSync, readFileSync, readFile } from "fs"
export const setup = function (router, con, server) {
const increaseUSERCall = server.increaseUSERCall
const dir = server.dirname + "/"
ejs.cache = new LRU({max:20})
ejs.cache = new LRU({ max: 20 })
const load_var_cache = new LRU({
max: 20,
@@ -25,39 +25,39 @@ export const setup = function (router, con, server) {
updateAgeOnHas: true
})
function load_var(fina) {
if(load_var_cache.get(fina))return load_var_cache.get(fina)
if(!existsSync(fina)) {
console.log(1,"tried loading non-existent file",fina)
load_var_cache.set(fina,"")
return "";
}
let out = readFileSync(fina)
if(fina.endsWith(".js")) {
out = min_js(out.toString()).code
}
else if(fina.endsWith(".css")) {
const {
styles,
} = new Clean({}).minify(out.toString());
out = styles
function load_var(filePath) {
if (load_var_cache.has(filePath)) {
return load_var_cache.get(filePath);
}
load_var_cache.set(fina,out)
return out
if (!existsSync(filePath)) {
console.log(1, 'Tried loading non-existent file', filePath);
load_var_cache.set(filePath, '');
return '';
}
function get_channels(){
return new Promise(function(resolve, reject) {
let output = readFileSync(filePath);
if (filePath.endsWith('.js')) {
output = min_js(output.toString()).code;
} else if (filePath.endsWith('.css')) {
const { styles } = new Clean({}).minify(output.toString());
output = styles;
}
load_var_cache.set(filePath, output);
return output;
}
function get_channels() {
return new Promise(function (resolve, reject) {
let sql = `select post_receiver_name from ipost.posts where post_is_private = '0' group by post_receiver_name;`;
con.query(sql, [], function (err, result) {
if (err)reject(err)
if (err) reject(err)
let out = []
for(let channel of result){
if(channel.post_receiver_name === "")continue;
for (let channel of result) {
if (channel.post_receiver_name === "") continue;
out[out.length] = channel.post_receiver_name
}
@@ -66,21 +66,25 @@ export const setup = function (router, con, server) {
})
}
const appId_Cache = new LRU({max:20,ttl: 1000 * 60 * 15}) //cache for 15 minutes
const appId_Cache = new LRU({ max: 20, ttl: 1000 * 60 * 15 }) //cache for 15 minutes
function getAppWithId(appid) {
appid = Number(appid)
return new Promise((res,rej) => {
if(appId_Cache.has(appid)) {
return new Promise((res, rej) => {
if (isNaN(appid)) {
res({})
return
}
if (appId_Cache.has(appid)) {
res(appId_Cache.get(appid) || {})
return
}
con.query("SELECT * FROM ipost.application WHERE application_id=?",[appid],(err,result) => {
if(err) {
con.query("SELECT * FROM ipost.application WHERE application_id=?", [appid], (err, result) => {
if (err) {
console.error(err)
rej({})
return
}
appId_Cache.set(appid,result[0])
appId_Cache.set(appid, result[0])
res(result[0] || {})
})
})
@@ -97,7 +101,6 @@ export const setup = function (router, con, server) {
getChannels: get_channels,
encryptJS: min_js(web_version().toString()).code,
cookiebanner: `<script id="cookieyes" type="text/javascript" src="https://cdn-cookieyes.com/client_data/3cf33f6b631f3587bf83813b/script.js" async></script>`,
newrelic: load_var("./extra_modules/newrelic_monitor.html"),
getPID: server.global_page_variables.getPID,
getDMPID: server.global_page_variables.getDMPID,
unauthorized_description: "Chat now by creating an account on IPost",
@@ -108,19 +111,21 @@ export const setup = function (router, con, server) {
async function handleUserFiles(request, response, overrideurl) {
if (!increaseUSERCall(request, response))return;
if(typeof overrideurl !== "string")overrideurl = undefined;
if (!increaseUSERCall(request, response)) return;
if (typeof overrideurl !== "string") overrideurl = undefined;
let originalUrl = overrideurl || request.originalUrl.split("?").shift();
let originalUrl = overrideurl
|| request.params.file
|| request.originalUrl.split("?").shift(); //backup in case anything goes wrong
let path = ""
if (existsSync(dir + "views" + originalUrl)) {
path = dir + "views" + originalUrl
if (existsSync(dir + "views/" + originalUrl)) {
path = dir + "views/" + originalUrl
//send .txt files as plaintext to help browsers interpret it correctly
if(originalUrl.endsWith(".txt")) {
if (originalUrl.endsWith(".txt")) {
response.set('Content-Type', 'text/plain');
readFile(path,(err,data)=> {
if(err)return
readFile(path, (err, data) => {
if (err) return
response.send(data)
})
return
@@ -136,24 +141,25 @@ export const setup = function (router, con, server) {
path = dir + "views" + originalUrl + ".html"
}
if(path !== "" && originalUrl !== "/favicon.ico" && originalUrl !== "/api/documentation/") {
if (path !== "" && originalUrl !== "favicon.ico" && originalUrl !== "api_documentation" && originalUrl !== "api_documentation.html") {
console.log(originalUrl)
global_page_variables.user = { "username": response.locals.username, "bio": response.locals.bio, "avatar": response.locals.avatar }
global_page_variables.query = request.query
if(originalUrl === "/authorize") {
if (originalUrl === "authorize") {
global_page_variables.application = await getAppWithId(request.query.id)
}
ejs.renderFile(path,global_page_variables,{async: true},async function(err,str){
ejs.renderFile(path, global_page_variables, { async: true }, async function (err, str) {
str = await str
err = await err
if(err) {
console.log(1,err)
if (err) {
console.log(1, err)
response.status(500)
response.send("error")
//TODO: make error page
return
}
try {
str = await Minifier.minify(str,{
str = await Minifier.minify(str, {
removeComments: true,
removeCommentsFromCDATA: true,
removeCDATASectionsFromCDATA: true,
@@ -164,36 +170,36 @@ export const setup = function (router, con, server) {
useShortDoctype: true,
removeEmptyAttributes: true
})
} catch(ignored){
console.log(2,"error minifying",originalUrl);
} catch (ignored) {
console.log(2, "error minifying", originalUrl);
}
try {
response.send(str)
} catch(err) {
} catch (err) {
console.error(err)
}
})
return;
}
if(originalUrl === "/favicon.ico") {
if (originalUrl === "api_documentation" || originalUrl === "api_documentation.html") {
response.set('Cache-Control', 'public, max-age=2592000');
response.set('Content-Type', 'text/html')
response.send(load_var("./views/api_documentation.html"))
return
}
if (originalUrl === "favicon.ico") {
response.set('Cache-Control', 'public, max-age=2592000');
response.sendFile(dir + "/views/favicon.ico")
return
}
if(originalUrl === "/api/documentation/") {
readFile(path,function(_err,res){
response.send(res.toString())
})
return
}
console.log(5,"no file found",originalUrl);
console.log(5, "no file found", originalUrl);
try {
response.status(404).send("No file with that name found");
} catch(err) {
} catch (err) {
console.error(err)
}
}
@@ -201,9 +207,14 @@ export const setup = function (router, con, server) {
/**
* Handle default URI as /index (interpreted redirect: "localhost" -> "localhost/index" )
*/
router.get("/", function (req, res) {
handleUserFiles(req,res,"/index")
router.get("/", (req, res) => {
req.params.file = "index"
handleUserFiles(req, res, "/index")
});
router.get("/*", handleUserFiles);
router.get("/:file", handleUserFiles);
router.get("/:folder/:file", (req, res) => {
req.params.file = req.params.folder + "/" + req.params.file
handleUserFiles(req, res)
});
}
+16 -30
View File
@@ -1,5 +1,3 @@
import "newrelic"
import http from "http";
import express,{Router} from "express";
import useragent from "express-useragent";
@@ -57,7 +55,7 @@ function log_info(level, ...info) {
});
}
}
console.log = log_info;
//console.log = log_info;
const hcaptcha_secret = config.hcaptcha_secret
@@ -262,6 +260,16 @@ app.use(fileUpload({
}
}));
app.use((_req, res, next) => {
res.set("x-powered-by", "ipost");
res.set("X-Frame-Options","DENY");
res.set("X-XSS-Protection","1; mode=block");
res.set("X-Content-Type-Options","nosniff");
res.set("Referrer-Policy","no-referrer");
next()
})
app.use(bodyParser.default.json({ limit: "100mb" }));
app.use(bodyParser.default.urlencoded({ limit: "100mb", extended: true }));
app.use(cookieParser(cookiesecret));
@@ -291,20 +299,7 @@ app.use(function (_req, res, next) {
next();
});
//auto redirect to https
app.use((req, res, next) => {
if (req.secure) {
//already secure
next();
}
else {
//redirect to https
res.redirect('https://' + req.headers.host + req.url);
}
});
app.use("/*", function (req, res, next) {
res.set("x-powered-by", "ipost");
app.use("/*path", function (req, res, next) {
for (let i = 0; i < blocked_headers.length; i++) {
if (req.header(blocked_headers[i]) !== undefined) {
res.json({ "error": "we don't allow proxies on our website." });
@@ -358,6 +353,9 @@ router.get("/api/getChannels", function (_req, res) {
throw err;
res.json(result);
});
/* #swagger.security = [{
"appTokenAuthHeader": []
}] */
});
/*
@@ -371,21 +369,9 @@ const httpServer = http.createServer(app);
httpServer.listen(config["ports"]["http"], function () {
console.log(5, "HTTP Server is listening");
});
const privateKey = readFileSync(config["ssl"]["privateKey"]).toString();
const certificate = readFileSync(config["ssl"]["certificate"]).toString();
const credentials = { key: privateKey, cert: certificate };
var httpsServer;
import spdy from "spdy"
httpsServer = spdy.createServer(credentials,app)
//httpsServer = https.createServer(credentials, app);
httpsServer.listen(config["ports"]["https"], function () {
console.log(5, "HTTPS Server is listening");
});
wss = new WebSocket({
server: httpsServer,
server: httpServer,
perMessageDeflate: {
zlibDeflateOptions: {
chunkSize: 1024,
+6 -6
View File
@@ -4,8 +4,8 @@
"only_prefer_when_ip": "::ffff:127.0.0.1",
"mysql": {
"connections":1000,
"host":"localhost",
"user":"root",
"host":"db",
"user":"ipost",
"password_file":"mysql_password.txt"
},
"cookies": {
@@ -155,12 +155,12 @@
"level": 5
},
"ssl": {
"privateKey": "./etc/letsencrypt/live/ipost.rocks/privkey.pem",
"certificate" : "./etc/letsencrypt/live/ipost.rocks/fullchain.pem"
"privateKey": "/etc/letsencrypt/live/ipost.rocks-0002/privkey.pem",
"certificate" : "/etc/letsencrypt/live/ipost.rocks-0002/fullchain.pem"
},
"ports": {
"http": 9999,
"https": 9998
"http": 80,
"https": 443
},
"disallow_proxies_by_headers": true,
"hcaptcha_secret": "0x0000000000000000000000000000000000000000",
+78
View File
@@ -0,0 +1,78 @@
const fs = require('fs');
const swaggerAutogen = require('swagger-autogen')();
const doc = {
info: {
title: 'IPost API',
description: 'the official IPost.rocks API documentation',
},
host: 'ipost.rocks',
schemes: ['https'],
securityDefinitions: {
appTokenAuthHeader: {
type: 'apiKey',
in: 'header', // can be 'header', 'query' or 'cookie'
name: 'ipost-auth-token', // name of the header, query parameter or cookie
description: 'authenticate using the authentication object in the header'
}
}
};
const outputFile = './swagger-api.json';
const tempFile = './swagger-output.json';
const endpointsFiles = ['./server.js'];
function pushdirectory(currentpath) {
fs.readdirSync(currentpath, {
withFileTypes: true
}).forEach(dirent => {
if (dirent.isFile()) {
endpointsFiles.push(currentpath + dirent.name);
} else {
pushdirectory(currentpath + dirent.name + "/");
}
});
}
pushdirectory("./routes/");
swaggerAutogen(tempFile, endpointsFiles, doc);
/*
Replace some error codes with own error codes, as described in error_codes.txt
*/
const to_replace = {
"401": "login error (invalid cookie)",
"402": "login error (bad cookie)",
"403": "login error (no cookie)",
"410": "argument/data error",
"411": "argument/data error",
"412": "argument/data error",
"413": "argument/data error",
"414": "argument/data error",
"415": "argument/data error",
"416": "argument/data error",
"417": "argument/data error",
"418": "argument/data error",
"419": "argument/data error",
"420": "invalid authetication object",
}
let file = JSON.parse(fs.readFileSync(tempFile, 'utf8'));
for (let path in file.paths) {
for (let method in file.paths[path]) {
for (let response in file.paths[path][method].responses) {
if (to_replace[response]) {
file.paths[path][method].responses[response].description = to_replace[response];
}
}
}
}
file = JSON.stringify(file);
console.log(file)
fs.writeFileSync(outputFile, file);
fs.rmSync(tempFile);
+1 -1
View File
@@ -4,7 +4,7 @@
<meta charset="utf-8">
<title>IPost Privacy Policy</title>
<meta name="description" content="IPosts PrivacyPolicy">
<%- newrelic %>
<script>
<%- warnmessagejs %>
</script>
+1 -1
View File
@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<title>IPost Terms of Service</title>
<%- newrelic %>
<meta name="description" content="IPosts Terms of Service">
<script src="/js/addnavbar.js" charset="utf-8"></script>
<script src="/js/warn_message.js" charset="utf-8"></script>
File diff suppressed because it is too large Load Diff
+1
View File
@@ -27,6 +27,7 @@
<p>Please authorize the app "<%= application.application_name %>" to access your information:</p>
<form action="/authorize" method="post">
<input type="number" value=<%= query.id %> class="hidden" name="application_id" id="application_id">
<input type="number" value=<%= query.extra || "" %> class="hidden" name="application_extra" id="application_extra">
<div class="h-captcha" data-sitekey="<%- hcaptcha_sitekey %>"></div>
<input type="submit" value="Authorize">
</form>
+1 -1
View File
@@ -11,7 +11,7 @@
<% if(user.username === undefined) { %>
<script> document.location.href = '/no_login?r='+encodeURIComponent(document.location.pathname) </script>
<% } %>
<%- newrelic %>
<style>
<%- globalcss %>
<%- loadfile("./css/posts.css") %>
-1
View File
@@ -4,7 +4,6 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>IPost</title>
<meta name="description" content="<%-unauthorized_description%>">
<%- newrelic %>
<style>
<%- globalcss %>
<%- loadfile("./css/logon.css") %>
+1 -1
View File
@@ -4,7 +4,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login | IPost</title>
<meta name="description" content="Chat on IPost by logging in today">
<%- newrelic %>
<link rel="stylesheet" href="/css/logon.css">
<script src="/js/warn_message.js" charset="utf-8"></script>
<script src="/js/addnavbar.js" charset="utf-8"></script>
+1 -1
View File
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>USERS Page</title>
<meta name="description" content="view other users pages on IPost today">
<%- newrelic %>
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/global.css">
<script src="/js/addnavbar.js" charset="utf-8"></script>
+1 -1
View File
@@ -9,7 +9,7 @@
<meta name="description" content="Chat on IPost now">
<% } %>
<title>Posts | IPost</title>
<%- newrelic %>
<style>
<%- globalcss %>
<%- loadfile("./css/posts.css") %>
+1 -1
View File
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<%- newrelic %>
<link rel="stylesheet" href="/css/logon.css">
<script src="/js/warn_message.js" charset="utf-8"></script>
<script src="/js/addnavbar.js" charset="utf-8"></script>
+1 -1
View File
@@ -10,7 +10,7 @@
<% } else { %>
<meta name="description" content="search IPost now">
<% } %>
<%- newrelic %>
<link rel="stylesheet" href="/css/search.css">
<script type="text/javascript" src="/js/htmlescape.js"></script>
<link rel="stylesheet" href="/css/global.css">
+1 -1
View File
@@ -13,7 +13,7 @@
<% if(user.username === undefined) { %>
<script> document.location.href = '/no_login?r='+encodeURIComponent(document.location.pathname) </script>
<% } %>
<%- newrelic %>
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/global.css">
<script src="/js/addnavbar.js" charset="utf-8"></script>
+1 -1
View File
@@ -13,7 +13,7 @@
<% if(user.username === undefined) { %>
<script> document.location.href = '/no_login?r='+encodeURIComponent(document.location.pathname) </script>
<% } %>
<%- newrelic %>
<style>
<%- globalcss %>
<%- loadfile("./css/style.css") %>