Compare commits
18 commits
Author | SHA1 | Date | |
---|---|---|---|
d3c07e19b8 | |||
6b6a25f28a | |||
d2b779540b | |||
3dda921db2 | |||
|
a9c0e7592e | ||
|
8ceb715798 | ||
|
558b2dff35 | ||
|
c91a1c105b | ||
|
2197a1ef46 | ||
|
d6b5baeb7c | ||
|
2b7e5bcffe | ||
|
d4e6c5cdb1 | ||
|
82a498a4ff | ||
|
6e8816c467 | ||
|
28a8cf8b31 | ||
|
cd4e146aa9 | ||
|
2f74ef5ca7 | ||
|
9087608087 |
18 changed files with 3758 additions and 4025 deletions
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
|
@ -1 +1,2 @@
|
|||
github: [hexagon]
|
||||
ko_fi: hexagon_56k
|
||||
|
|
6
.github/dependabot.yml
vendored
Normal file
6
.github/dependabot.yml
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "npm" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "daily"
|
2
.github/workflows/node.js.yml
vendored
2
.github/workflows/node.js.yml
vendored
|
@ -27,4 +27,4 @@ jobs:
|
|||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
- run: npm ci
|
||||
- run: npm run build
|
||||
- run: npm run build:ci
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
FROM node:16-alpine
|
||||
FROM keymetrics/pm2:16-alpine
|
||||
COPY . /usr/src/app
|
||||
WORKDIR /usr/src/app
|
||||
RUN npm install --no-cache
|
||||
RUN npm install --no-cache --production
|
||||
EXPOSE 8080
|
||||
RUN chmod +x /usr/src/app/docker-entrypoint.sh
|
||||
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh", "npm", "start"]
|
||||
CMD [ "pm2-runtime", "start", "pm2.json" ]
|
||||
|
|
81
README.md
81
README.md
|
@ -1,15 +1,15 @@
|
|||

|
||||

|
||||
|
||||

|
||||
[](https://badge.fury.io/js/cryptalk)
|
||||
[](LICENSE.md)
|
||||
[](https://www.codacy.com/gh/Hexagon/cryptalk/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Hexagon/cryptalk&utm_campaign=Badge_Grade)
|
||||
|
||||
# Cryptalk
|
||||
|
||||
Cyptalk is a HTML5/Node.js based, client side (E2EE) encrypted instant chat
|
||||
|
||||
|
||||
Features
|
||||
========
|
||||
## Features
|
||||
|
||||
* Client side AES-256-CBC encryption/decryption (the server is just a messenger)
|
||||
* 256 bit key derived from your passphrase using PBKDF2
|
||||
|
@ -21,9 +21,9 @@ Features
|
|||
* Nicknames, optional.
|
||||
* Quick-links using http://server/#Room:Passphrase, optional and insecure
|
||||
|
||||
## Installing
|
||||
|
||||
Docker setup
|
||||
========
|
||||
### Docker setup
|
||||
|
||||
To run latest cryptalk with docker, exposed on host port 80, simply run the following command to pull it from docker hub
|
||||
|
||||
|
@ -31,18 +31,13 @@ To run latest cryptalk with docker, exposed on host port 80, simply run the foll
|
|||
sudo docker run -d --restart=always -p 80:8080 hexagon/cryptalk
|
||||
```
|
||||
|
||||
|
||||
Heroku setup
|
||||
========
|
||||
### Heroku setup
|
||||
|
||||
Click the button below
|
||||
|
||||
[](https://heroku.com/deploy?template=https://github.com/hexagon/cryptalk)
|
||||
|
||||
|
||||
|
||||
Docker setup without using docker hub
|
||||
========
|
||||
### Docker setup without using docker hub
|
||||
|
||||
Clone this repo, enter the new directory.
|
||||
|
||||
|
@ -60,10 +55,7 @@ Browse to ```http://<ip-of-server>/```
|
|||
|
||||
Done!
|
||||
|
||||
|
||||
|
||||
npm setup
|
||||
========
|
||||
### npm setup
|
||||
|
||||
Install node.js, exact procedure is dependant on platform and distribution.
|
||||
|
||||
|
@ -82,36 +74,7 @@ Browse to ```http://localhost:8080```
|
|||
|
||||
Done!
|
||||
|
||||
|
||||
|
||||
Developer setup
|
||||
========
|
||||
|
||||
Install node.js (development require >=12.0), exact procedure is dependant on platform and distribution.
|
||||
|
||||
Clone this repo
|
||||
```bash
|
||||
git clone https://github.com/Hexagon/cryptalk.git
|
||||
cd cryptalk
|
||||
```
|
||||
|
||||
Pull dependencies from npm
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
Start server
|
||||
```bash
|
||||
npn run start
|
||||
```
|
||||
|
||||
Browse to ```http://localhost:8080```
|
||||
|
||||
To work on the JavaScript, edit the code in ```client/source/```. To test the changes, first run ```npm run build``` to lint, build and minify the code. Then restart the server.
|
||||
|
||||
|
||||
Usage
|
||||
========
|
||||
## Usage
|
||||
|
||||
```
|
||||
|
||||
|
@ -148,3 +111,27 @@ to prevent browsers from keeping history or cache.
|
|||
|
||||
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
Install node.js (development require >=12.0), exact procedure is dependant on platform and distribution.
|
||||
|
||||
Clone this repo
|
||||
```bash
|
||||
git clone https://github.com/Hexagon/cryptalk.git
|
||||
cd cryptalk
|
||||
```
|
||||
|
||||
Pull dependencies from npm
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
Start server
|
||||
```bash
|
||||
npm run start
|
||||
```
|
||||
|
||||
Browse to ```http://localhost:8080```
|
||||
|
||||
To work on the JavaScript, edit the code in ```client/source/```. To test the changes, first run ```npm run build``` to lint, build and minify the code. Then restart the server.
|
||||
|
|
|
@ -1,32 +1,31 @@
|
|||
/*------------------------------------*\
|
||||
GENERIC
|
||||
\*------------------------------------*/
|
||||
html {
|
||||
-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
|
||||
-moz-box-sizing: border-box; /* Firefox, other Gecko */
|
||||
box-sizing: border-box; /* Opera/IE 8+ */
|
||||
}
|
||||
|
||||
*, *:before, *:after {
|
||||
*,
|
||||
*:before,
|
||||
*:after {
|
||||
box-sizing: inherit;
|
||||
|
||||
font-family: monospace, 'Courier New';
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body, html {
|
||||
body,
|
||||
html {
|
||||
min-height: 100%;
|
||||
min-width: 600px;
|
||||
background-color: #181A1D;
|
||||
background-color: #181a1d;
|
||||
overflow: hidden;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
color: #00DD00;
|
||||
color: #00dd00;
|
||||
}
|
||||
|
||||
.good { color: #99FF99; }
|
||||
.good { color: #99ff99; }
|
||||
.bad { color: #ff7777; }
|
||||
.info { color: #99FFFF; }
|
||||
.info { color: #99ffff; }
|
||||
.neutral { color: #eeeeee; }
|
||||
|
||||
/*------------------------------------*\
|
||||
|
@ -50,7 +49,7 @@ body, html {
|
|||
}
|
||||
|
||||
#chat li .timestamp {
|
||||
color: #A0A00A;
|
||||
color: #a0a00a;
|
||||
}
|
||||
|
||||
/* Message types */
|
||||
|
@ -58,12 +57,16 @@ body, html {
|
|||
#chat i {
|
||||
font-style: normal;
|
||||
}
|
||||
#chat i.motd { color: #99FF99; display:inline-block; line-height: 12px !important; }
|
||||
#chat i.motd {
|
||||
color: #99ff99;
|
||||
display:inline-block;
|
||||
line-height: 12px !important;
|
||||
}
|
||||
#chat i.info { color: #999999; }
|
||||
#chat i.server { color: #99FFFF; }
|
||||
#chat i.server { color: #99ffff; }
|
||||
#chat i.error { color: #ff7777; }
|
||||
#chat i.message { color: #eeeeee; }
|
||||
#chat i.nick { color: #99FF99; }
|
||||
#chat i.nick { color: #99ff99; }
|
||||
#chat i.fatal { color: #ff7777; }
|
||||
|
||||
/*------------------------------------*\
|
||||
|
@ -74,7 +77,6 @@ body, html {
|
|||
bottom: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
|
@ -90,20 +92,29 @@ body, html {
|
|||
|
||||
padding: 5px 5px 5px 15px;
|
||||
|
||||
color: #FFFFFF;
|
||||
background-color:#272A2E;
|
||||
color: #ffffff;
|
||||
background-color:#272a2e;
|
||||
height:30px;
|
||||
|
||||
border-top: 2px solid #153315;
|
||||
}
|
||||
|
||||
#input { z-index: 1; }
|
||||
#loader { z-index: 0; line-height: 20px; font-size: 14px; font-weight: 100; font-family: tahoma;}
|
||||
#input {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#loader {
|
||||
z-index: 0;
|
||||
line-height: 20px;
|
||||
font-size: 14px;
|
||||
font-weight: 100;
|
||||
font-family: tahoma;
|
||||
}
|
||||
|
||||
.loading #loader {
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
/*------------------------------------*\
|
||||
SPINNER
|
||||
\*------------------------------------*/
|
||||
.loading #loader { z-index: 2; }
|
||||
.loading #loader span {
|
||||
margin-left:-2px;
|
||||
-webkit-animation: rotation 1s infinite linear;
|
||||
|
|
2
client/public/js/cryptalk.min.js
vendored
2
client/public/js/cryptalk.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -9,8 +9,7 @@ for(var k in proto) ElementArray.prototype[k] = proto[k];
|
|||
// Create to actual dollar function
|
||||
function Dollar (selector) {
|
||||
|
||||
var match,
|
||||
matches = new ElementArray();
|
||||
let matches = new ElementArray();
|
||||
|
||||
if (selector !== undefined) {
|
||||
if (selector === document) {
|
||||
|
@ -18,7 +17,8 @@ function Dollar (selector) {
|
|||
} else if (selector === window) {
|
||||
matches.push(window);
|
||||
} else {
|
||||
if ((match = document.querySelectorAll(selector))) {
|
||||
let match = document.querySelectorAll(selector);
|
||||
if (match) {
|
||||
for( var i=0; i < match.length; i++) {
|
||||
matches.push(match[i]);
|
||||
}
|
||||
|
|
|
@ -57,9 +57,9 @@ export default function (mediator, settings, templates) {
|
|||
|
||||
// Make sure the nick meets the length requirements
|
||||
if (payload.length > settings.nick.maxLen) {
|
||||
return mediator('console:error', $.template(templates.messages.nick_to_long, { nick_maxLen: settings.nick.maxLen } ));
|
||||
return mediator.emit('console:error', $.template(templates.messages.nick_to_long, { nick_maxLen: settings.nick.maxLen } ));
|
||||
} else if (payload.length < settings.nick.minLen) {
|
||||
return mediator('console:error', $.template(templates.messages.nick_to_short, {nick_minLen: settings.nick.minLen } ));
|
||||
return mediator.emit('console:error', $.template(templates.messages.nick_to_short, {nick_minLen: settings.nick.minLen } ));
|
||||
}
|
||||
|
||||
// Set nick
|
||||
|
|
|
@ -128,20 +128,6 @@ export default function(mediator,settings,templates, sounds) {
|
|||
components.input[0].removeAttribute('disabled');
|
||||
components.inputWrapper[0].className = '';
|
||||
components.input.focus();
|
||||
},
|
||||
|
||||
_require: function (filepath, done) {
|
||||
commands.lockInput();
|
||||
commands.post('info', 'Requiring ' + filepath + '...');
|
||||
require([filepath], function () {
|
||||
commands.post('info', 'Successfully required ' + filepath + '.');
|
||||
commands.unlockInput();
|
||||
done();
|
||||
}, function (e) {
|
||||
commands.post('error', 'An error occurred while trying to load "' + filepath + '":\n' + e);
|
||||
commands.unlockInput();
|
||||
done();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -156,7 +142,8 @@ export default function(mediator,settings,templates, sounds) {
|
|||
// If the active element is not the input, focus on it and exit the function.
|
||||
// Ignore this when ctrl and/or alt is pressed!
|
||||
if (!e.ctrlKey && !e.altKey && components.input[0] !== $.activeElement()) {
|
||||
return components.input.focus();
|
||||
components.input.focus();
|
||||
return;
|
||||
}
|
||||
|
||||
// Return immediatly if the buffer is empty or if the hit key was not <enter>
|
||||
|
@ -176,7 +163,8 @@ export default function(mediator,settings,templates, sounds) {
|
|||
payload,
|
||||
function(retvals, recipients) {
|
||||
if(!recipients) {
|
||||
return commands.post('error', $.template(templates.messages.unrecognized_command, { commandName: command }));
|
||||
commands.post('error', $.template(templates.messages.unrecognized_command, { commandName: command }));
|
||||
return;
|
||||
} else {
|
||||
commands.clearInput();
|
||||
}
|
||||
|
@ -217,13 +205,11 @@ export default function(mediator,settings,templates, sounds) {
|
|||
|
||||
// Connect events
|
||||
for (var commandName in commands) {
|
||||
if (commandName !== '_require' && commandName !== 'post') {
|
||||
if (commandName !== 'post') {
|
||||
mediator.on('console:' + commandName, commands[commandName]);
|
||||
}
|
||||
}
|
||||
|
||||
mediator.on('console:require', commands._require);
|
||||
|
||||
mediator.on('console:post', function (data) {
|
||||
commands.post(data.type, data.data, data.nick);
|
||||
});
|
||||
|
|
|
@ -1,23 +1,15 @@
|
|||
export default {
|
||||
|
||||
title: 'Cryptalk - Online',
|
||||
title: 'Claytonia Chat',
|
||||
|
||||
ttl: 600000,
|
||||
|
||||
motd: '<pre>\n\n' +
|
||||
'▄████▄ ██▀███ ▓██ ██▓ ██▓███ ▄▄▄█████▓ ▄▄▄ ██▓ ██ ▄█▀ \n' +
|
||||
'▒██▀ ▀█ ▓██ ▒ ██▒▒██ ██▒▓██░ ██▒▓ ██▒ ▓▒▒████▄ ▓██▒ ██▄█▒ \n' +
|
||||
'▒▓█ ▄ ▓██ ░▄█ ▒ ▒██ ██░▓██░ ██▓▒▒ ▓██░ ▒░▒██ ▀█▄ ▒██░ ▓███▄░ \n' +
|
||||
'▒▓▓▄ ▄██▒▒██▀▀█▄ ░ ▐██▓░▒██▄█▓▒ ▒░ ▓██▓ ░ ░██▄▄▄▄██ ▒██░ ▓██ █▄ \n' +
|
||||
'▒ ▓███▀ ░░██▓ ▒██▒ ░ ██▒▓░▒██▒ ░ ░ ▒██▒ ░ ▓█ ▓██▒░██████▒▒██▒ █▄ \n' +
|
||||
'░ ░▒ ▒ ░░ ▒▓ ░▒▓░ ██▒▒▒ ▒▓▒░ ░ ░ ▒ ░░ ▒▒ ▓▒█░░ ▒░▓ ░▒ ▒▒ ▓▒ \n' +
|
||||
' ░ ▒ ░▒ ░ ▒░▓██ ░▒░ ░▒ ░ ░ ▒ ▒▒ ░░ ░ ▒ ░░ ░▒ ▒░ \n' +
|
||||
'░ ░░ ░ ▒ ▒ ░░ ░░ ░ ░ ▒ ░ ░ ░ ░░ ░ \n' +
|
||||
'░ ░ ░ ░ ░ ░ ░ ░ ░░ ░ \n' +
|
||||
'░ ░ ░ \n' +
|
||||
' https://github.com/hexagon/cryptalk \n' +
|
||||
' \n' +
|
||||
' Welcome to Claytonia Chat \n' +
|
||||
' Tip of the day: /help \n' +
|
||||
' Public Room: /join Claytonia \n' +
|
||||
' Public Key: /key Claytonia \n' +
|
||||
' Everyone in the room must have the same key to decrypt messages. \n' +
|
||||
'----------------------------------------------------------------------' +
|
||||
'</pre>',
|
||||
|
||||
|
|
17
cryptalk.service
Normal file
17
cryptalk.service
Normal file
|
@ -0,0 +1,17 @@
|
|||
[Unit]
|
||||
Description=Cryptalk Node.js App
|
||||
Documentation=https://github.com/Hexagon/cryptalk
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/npm run start
|
||||
WorkingDirectory=/home/cryptochat/cryptalk
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
Environment=NODE_ENV=production
|
||||
Environment=PATH=/usr/bin
|
||||
User=cryptochat
|
||||
Group=cryptochat
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -1,11 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
# /usr/src/app/external-public kan be mounted as a volume on host to expose
|
||||
# statics to be hosted by host nginx
|
||||
if [ -d /usr/src/app/external-public ]; then
|
||||
cp -R /usr/src/app/client/public/* /usr/src/app/external-public/
|
||||
fi
|
||||
|
||||
exec "$@"
|
1991
package-lock.json
generated
1991
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -1,17 +1,18 @@
|
|||
{
|
||||
"name": "cryptalk",
|
||||
"version": "1.2.2",
|
||||
"version": "1.2.9",
|
||||
"description": "Encrypted HTML5/Node.JS instant chat",
|
||||
"main": "server/server.js",
|
||||
"preferGlobal": true,
|
||||
"private": false,
|
||||
"scripts": {
|
||||
"test": "echo \"No tests written yet\" && exit 0",
|
||||
"build": "npm run test:lint && npx rollup -c rollup.config.js && npm run build:minify && npm run build:cleanup",
|
||||
"build": "npm update && npm outdated && npm run test:lint && npx rollup -c rollup.config.js && npm run build:minify && npm run build:cleanup",
|
||||
"build:ci": "npm run test:lint && npx rollup -c rollup.config.js && npm run build:minify && npm run build:cleanup",
|
||||
"build:minify": "uglifyjs client/public/js/cryptalk.js --source-map -o client/public/js/cryptalk.min.js",
|
||||
"build:cleanup": "(rm client/public/js/cryptalk.js || del client\\public\\js\\cryptalk.js)",
|
||||
"test:lint": "eslint ./client/source/**/*.js ./server/*.js",
|
||||
"start": "node server/server.js"
|
||||
"start": "node ./server/server.js"
|
||||
},
|
||||
"keywords": [
|
||||
"cryptalk",
|
||||
|
@ -38,7 +39,7 @@
|
|||
},
|
||||
"bin": "./server/server.js",
|
||||
"dependencies": {
|
||||
"serve": "^12.0.1",
|
||||
"serve": "^13.0.2",
|
||||
"socket.io": "^4.3.1"
|
||||
},
|
||||
"os": [
|
||||
|
|
11
pm2.json
Normal file
11
pm2.json
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"name": "cryptalk",
|
||||
"script": "server/server.js",
|
||||
"instances": "1",
|
||||
"env": {
|
||||
"NODE_ENV": "development"
|
||||
},
|
||||
"env_production" : {
|
||||
"NODE_ENV": "production"
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue