This commit is contained in:
Hexagon 2021-11-09 23:43:21 +01:00
parent 6e8816c467
commit 82a498a4ff
8 changed files with 142 additions and 142 deletions

View File

@ -5,25 +5,25 @@
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.md) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.md)
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/753ef40cec1747c2b5025f834635375b)](https://www.codacy.com/gh/Hexagon/cryptalk/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Hexagon/cryptalk&utm_campaign=Badge_Grade) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/753ef40cec1747c2b5025f834635375b)](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 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
* Messages torched after a configurable delay, default is 600s.
* Simple setup using npm, Docker or Heroku
* Notification sounds (mutable)
* Native popup notifications
* Configurable page title
* Nicknames, optional.
* Quick-links using http://server/#Room:Passphrase, optional and insecure
* Client side AES-256-CBC encryption/decryption (the server is just a messenger) ## Installing
* 256 bit key derived from your passphrase using PBKDF2
* Messages torched after a configurable delay, default is 600s.
* Simple setup using npm, Docker or Heroku
* Notification sounds (mutable)
* Native popup notifications
* Configurable page title
* Nicknames, optional.
* Quick-links using http://server/#Room:Passphrase, optional and insecure
### 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 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 sudo docker run -d --restart=always -p 80:8080 hexagon/cryptalk
``` ```
### Heroku setup
Heroku setup
========
Click the button below Click the button below
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/hexagon/cryptalk) [![Deploy](https://www.herokucdn.com/deploy/button.png)](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. Clone this repo, enter the new directory.
@ -60,10 +55,7 @@ Browse to ```http://<ip-of-server>/```
Done! Done!
### npm setup
npm setup
========
Install node.js, exact procedure is dependant on platform and distribution. Install node.js, exact procedure is dependant on platform and distribution.
@ -82,36 +74,7 @@ Browse to ```http://localhost:8080```
Done! Done!
## Usage
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
========
``` ```
@ -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
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.

View File

@ -1,32 +1,31 @@
/*------------------------------------*\
GENERIC
\*------------------------------------*/
html { html {
-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
-moz-box-sizing: border-box; /* Firefox, other Gecko */ -moz-box-sizing: border-box; /* Firefox, other Gecko */
box-sizing: border-box; /* Opera/IE 8+ */ box-sizing: border-box; /* Opera/IE 8+ */
} }
*, *:before, *:after { *,
*:before,
*:after {
box-sizing: inherit; box-sizing: inherit;
font-family: monospace, 'Courier New'; font-family: monospace, 'Courier New';
font-size: 12px; font-size: 12px;
} }
body, html { body,
html {
min-height: 100%; min-height: 100%;
min-width: 600px; min-width: 600px;
background-color: #181A1D; background-color: #181a1d;
overflow: hidden; overflow: hidden;
padding: 0px; padding: 0px;
margin:0px; margin: 0px;
color: #00DD00; color: #00dd00;
} }
.good { color: #99FF99; } .good { color: #99ff99; }
.bad { color: #ff7777; } .bad { color: #ff7777; }
.info { color: #99FFFF; } .info { color: #99ffff; }
.neutral { color: #eeeeee; } .neutral { color: #eeeeee; }
/*------------------------------------*\ /*------------------------------------*\
@ -38,8 +37,8 @@ body, html {
bottom: 40px; bottom: 40px;
position: absolute; position: absolute;
list-style-type: none; list-style-type: none;
padding:0; padding: 0;
margin:0; margin: 0;
} }
/* Messages */ /* Messages */
@ -50,7 +49,7 @@ body, html {
} }
#chat li .timestamp { #chat li .timestamp {
color: #A0A00A; color: #a0a00a;
} }
/* Message types */ /* Message types */
@ -58,24 +57,27 @@ body, html {
#chat i { #chat i {
font-style: normal; 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.info { color: #999999; }
#chat i.server { color: #99FFFF; } #chat i.server { color: #99ffff; }
#chat i.error { color: #ff7777; } #chat i.error { color: #ff7777; }
#chat i.message { color: #eeeeee; } #chat i.message { color: #eeeeee; }
#chat i.nick { color: #99FF99; } #chat i.nick { color: #99ff99; }
#chat i.fatal { color: #ff7777; } #chat i.fatal { color: #ff7777; }
/*------------------------------------*\ /*------------------------------------*\
INPUT & LOADER INPUT & LOADER
\*------------------------------------*/ \*------------------------------------*/
#input_wrapper { #input_wrapper {
right:0; right: 0;
bottom:0; bottom: 0;
left:0; left: 0;
position: absolute; position: absolute;
height: 30px;
height:30px;
} }
#input, #input,
@ -90,26 +92,35 @@ body, html {
padding: 5px 5px 5px 15px; padding: 5px 5px 5px 15px;
color: #FFFFFF; color: #ffffff;
background-color:#272A2E; background-color:#272a2e;
height:30px; height:30px;
border-top: 2px solid #153315; border-top: 2px solid #153315;
} }
#input { z-index: 1; } #input {
#loader { z-index: 0; line-height: 20px; font-size: 14px; font-weight: 100; font-family: tahoma;} 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 { .loading #loader span {
margin-left:-2px; margin-left:-2px;
-webkit-animation: rotation 1s infinite linear; -webkit-animation: rotation 1s infinite linear;
} }
@-webkit-keyframes rotation { @-webkit-keyframes rotation {
from {-webkit-transform: rotate(0deg);} from { -webkit-transform: rotate(0deg); }
to {-webkit-transform: rotate(359deg);} to { -webkit-transform: rotate(359deg); }
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -9,8 +9,7 @@ for(var k in proto) ElementArray.prototype[k] = proto[k];
// Create to actual dollar function // Create to actual dollar function
function Dollar (selector) { function Dollar (selector) {
var match, let matches = new ElementArray();
matches = new ElementArray();
if (selector !== undefined) { if (selector !== undefined) {
if (selector === document) { if (selector === document) {
@ -18,7 +17,8 @@ function Dollar (selector) {
} else if (selector === window) { } else if (selector === window) {
matches.push(window); matches.push(window);
} else { } else {
if ((match = document.querySelectorAll(selector))) { let match = document.querySelectorAll(selector);
if (match) {
for( var i=0; i < match.length; i++) { for( var i=0; i < match.length; i++) {
matches.push(match[i]); matches.push(match[i]);
} }

View File

@ -142,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. // If the active element is not the input, focus on it and exit the function.
// Ignore this when ctrl and/or alt is pressed! // Ignore this when ctrl and/or alt is pressed!
if (!e.ctrlKey && !e.altKey && components.input[0] !== $.activeElement()) { 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> // Return immediatly if the buffer is empty or if the hit key was not <enter>
@ -162,7 +163,8 @@ export default function(mediator,settings,templates, sounds) {
payload, payload,
function(retvals, recipients) { function(retvals, recipients) {
if(!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 { } else {
commands.clearInput(); commands.clearInput();
} }

76
package-lock.json generated
View File

@ -155,9 +155,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "16.11.6", "version": "16.11.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz",
"integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw=="
}, },
"node_modules/@types/resolve": { "node_modules/@types/resolve": {
"version": "1.17.1", "version": "1.17.1",
@ -756,9 +756,9 @@
} }
}, },
"node_modules/eslint-visitor-keys": { "node_modules/eslint-visitor-keys": {
"version": "3.0.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
"integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -954,9 +954,9 @@
} }
}, },
"node_modules/flatted": { "node_modules/flatted": {
"version": "3.2.2", "version": "3.2.4",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
"integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
"dev": true "dev": true
}, },
"node_modules/fs.realpath": { "node_modules/fs.realpath": {
@ -1282,19 +1282,19 @@
} }
}, },
"node_modules/mime-db": { "node_modules/mime-db": {
"version": "1.50.0", "version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
"engines": { "engines": {
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/mime-types": { "node_modules/mime-types": {
"version": "2.1.33", "version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"dependencies": { "dependencies": {
"mime-db": "1.50.0" "mime-db": "1.51.0"
}, },
"engines": { "engines": {
"node": ">= 0.6" "node": ">= 0.6"
@ -1776,9 +1776,9 @@
"integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ=="
}, },
"node_modules/socket.io": { "node_modules/socket.io": {
"version": "4.3.1", "version": "4.3.2",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.1.tgz", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.2.tgz",
"integrity": "sha512-HC5w5Olv2XZ0XJ4gOLGzzHEuOCfj3G0SmoW3jLHYYh34EVsIr3EkW9h6kgfW+K3TFEcmYy8JcPWe//KUkBp5jA==", "integrity": "sha512-6S5tV4jcY6dbZ/lLzD6EkvNWI3s81JO6ABP/EpvOlK1NPOcIj3AS4khi6xXw6JlZCASq82HQV4SapfmVMMl2dg==",
"dependencies": { "dependencies": {
"accepts": "~1.3.4", "accepts": "~1.3.4",
"base64id": "~2.0.0", "base64id": "~2.0.0",
@ -2138,9 +2138,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "16.11.6", "version": "16.11.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz",
"integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw=="
}, },
"@types/resolve": { "@types/resolve": {
"version": "1.17.1", "version": "1.17.1",
@ -2580,9 +2580,9 @@
} }
}, },
"eslint-visitor-keys": { "eslint-visitor-keys": {
"version": "3.0.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
"integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
"dev": true "dev": true
}, },
"espree": { "espree": {
@ -2735,9 +2735,9 @@
} }
}, },
"flatted": { "flatted": {
"version": "3.2.2", "version": "3.2.4",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
"integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
"dev": true "dev": true
}, },
"fs.realpath": { "fs.realpath": {
@ -2984,16 +2984,16 @@
} }
}, },
"mime-db": { "mime-db": {
"version": "1.50.0", "version": "1.51.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
"integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
}, },
"mime-types": { "mime-types": {
"version": "2.1.33", "version": "2.1.34",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
"integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"requires": { "requires": {
"mime-db": "1.50.0" "mime-db": "1.51.0"
} }
}, },
"minimatch": { "minimatch": {
@ -3363,9 +3363,9 @@
"integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ=="
}, },
"socket.io": { "socket.io": {
"version": "4.3.1", "version": "4.3.2",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.1.tgz", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.2.tgz",
"integrity": "sha512-HC5w5Olv2XZ0XJ4gOLGzzHEuOCfj3G0SmoW3jLHYYh34EVsIr3EkW9h6kgfW+K3TFEcmYy8JcPWe//KUkBp5jA==", "integrity": "sha512-6S5tV4jcY6dbZ/lLzD6EkvNWI3s81JO6ABP/EpvOlK1NPOcIj3AS4khi6xXw6JlZCASq82HQV4SapfmVMMl2dg==",
"requires": { "requires": {
"accepts": "~1.3.4", "accepts": "~1.3.4",
"base64id": "~2.0.0", "base64id": "~2.0.0",