Merge branch 'soon' into fileManager
This commit is contained in:
commit
4278ac7637
5
.dockerignore
Normal file
5
.dockerignore
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
data
|
||||||
|
Dockerfile
|
||||||
|
docker-compose.yml
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
4
.env
Normal file
4
.env
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
VERSION=latest
|
||||||
|
USE_SSL=true
|
||||||
|
STORAGE='./storage/file'
|
||||||
|
LOG_TO_STDOUT=true
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -9,3 +9,4 @@ customization
|
|||||||
messages.log
|
messages.log
|
||||||
.DS_Store
|
.DS_Store
|
||||||
www/scratch
|
www/scratch
|
||||||
|
data
|
||||||
|
|||||||
43
Dockerfile
Normal file
43
Dockerfile
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
FROM ubuntu:16.04
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
vim \
|
||||||
|
wget \
|
||||||
|
git \
|
||||||
|
curl \
|
||||||
|
npm \
|
||||||
|
nodejs-legacy
|
||||||
|
|
||||||
|
ARG VERSION=0.3.0
|
||||||
|
|
||||||
|
# Download stable version
|
||||||
|
# RUN wget https://github.com/xwiki-labs/cryptpad/archive /${VERSION}.tar.gz -O /cryptpad.tar.gz \
|
||||||
|
# && mkdir -p /cryptpad \
|
||||||
|
# && tar -xzf /cryptpad.tar.gz -C /cryptpad --strip-components=1 \
|
||||||
|
# && rm /cryptpad.tar.gz
|
||||||
|
|
||||||
|
# Download from github
|
||||||
|
# RUN git clone https://github.com/xwiki-labs/cryptpad.git
|
||||||
|
|
||||||
|
# Add code directly
|
||||||
|
ADD . /cryptpad
|
||||||
|
|
||||||
|
WORKDIR /cryptpad
|
||||||
|
|
||||||
|
RUN npm install \
|
||||||
|
&& npm install -g bower \
|
||||||
|
&& bower install --allow-root
|
||||||
|
|
||||||
|
ADD container-start.sh /container-start.sh
|
||||||
|
RUN chmod u+x /container-start.sh
|
||||||
|
|
||||||
|
EXPOSE 3000
|
||||||
|
|
||||||
|
VOLUME /cryptpad/datastore
|
||||||
|
VOLUME /cryptpad/customize
|
||||||
|
|
||||||
|
ENV USE_SSL=false
|
||||||
|
ENV STORAGE='./storage/file'
|
||||||
|
ENV LOG_TO_STDOUT=true
|
||||||
|
|
||||||
|
CMD /container-start.sh
|
||||||
23
container-start.sh
Normal file
23
container-start.sh
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Creating customize folder
|
||||||
|
mkdir -p customize
|
||||||
|
[[ ! "$(ls -A customize)" ]] && echo "Creating customize folder" \
|
||||||
|
&& cp -R customize.dist/* customize/ \
|
||||||
|
&& cp config.js.dist customize/config.js
|
||||||
|
|
||||||
|
# Linking config.js
|
||||||
|
[[ ! -h config.js ]] && echo "Linking config.js" && ln -s customize/config.js config.js
|
||||||
|
|
||||||
|
# Configure
|
||||||
|
[[ -n "$USE_SSL" ]] && echo "Using secure websockets: $USE_SSL" \
|
||||||
|
&& sed -i "s/useSecureWebsockets: .*/useSecureWebsockets: ${USE_SSL},/g" customize/config.js
|
||||||
|
|
||||||
|
[[ -n "$USE_SSL" ]] && echo "Using storage adapter: $STORAGE" \
|
||||||
|
&& sed -i "s/storage: .*/storage: ${STORAGE},/g" customize/config.js
|
||||||
|
|
||||||
|
[[ -n "$LOG_TO_STDOUT" ]] && echo "Logging to stdout: $LOG_TO_STDOUT" \
|
||||||
|
&& sed -i "s/logToStdout: .*/logToStdout: ${LOG_TO_STDOUT},/g" customize/config.js
|
||||||
|
|
||||||
|
|
||||||
|
exec node ./server.js
|
||||||
69
cryptpad-docker.md
Normal file
69
cryptpad-docker.md
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
# Cryptpad Docker Image
|
||||||
|
|
||||||
|
- Configuration via .env file
|
||||||
|
- Ready for use with traffic
|
||||||
|
- Using github master for now, release 0.3.0 too old
|
||||||
|
- Creating customize folder
|
||||||
|
- Adding config.js to customize folder
|
||||||
|
- Persistance for datastore and customize folder
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
```
|
||||||
|
cryptpad_1 | Linking config.js
|
||||||
|
cryptpad_1 | Using secure websockets: true
|
||||||
|
cryptpad_1 | Using storage adapter: './storage/file'
|
||||||
|
cryptpad_1 | sed: -e expression #1, char 27: unknown option to `s'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Set configurations Dockerfile or in .env (using docker-compose) file.
|
||||||
|
|
||||||
|
- VERSION=latest
|
||||||
|
- USE_SSL=false
|
||||||
|
- STORAGE='./storage/file'
|
||||||
|
- LOG_TO_STDOUT=true
|
||||||
|
|
||||||
|
The .env variables are read by docker-compose and forwarded to docker container.
|
||||||
|
On runtime, in `bin/container-start.sh` the settings are written to the `config.js` file.
|
||||||
|
|
||||||
|
## Run
|
||||||
|
|
||||||
|
With docker
|
||||||
|
|
||||||
|
```
|
||||||
|
docker build -t xwiki/cryptpad .
|
||||||
|
docker -d --name cryptpad -p 3000:3000 -v ${PWD}/data:/cryptpad/datastore xwiki/cryptpad
|
||||||
|
```
|
||||||
|
|
||||||
|
With docker-compose
|
||||||
|
|
||||||
|
```
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Persistance
|
||||||
|
|
||||||
|
The docker-compose file is preconfigured to persist folders
|
||||||
|
|
||||||
|
- cryptpad/datastore --> ./data/customize
|
||||||
|
- cryptpad/customize --> ./data/customize
|
||||||
|
|
||||||
|
In customize included find your configuration in `config.js`.
|
||||||
|
|
||||||
|
The data folder is ignored by git, so if you want to add your customizations to git versioning change the volume:
|
||||||
|
|
||||||
|
```
|
||||||
|
./customize:/cryptpad/customize:rw
|
||||||
|
```
|
||||||
|
|
||||||
|
## SSL Proxy
|
||||||
|
|
||||||
|
The [traefik](https://traefik.io/) proxy has builtin Let'sEncrypt for easy SSL setup.
|
||||||
|
In the docker-compose file you can find preset lables for usage with traefik.
|
||||||
|
|
||||||
|
[Traefik Docker Image](https://hub.docker.com/_/traefik/)
|
||||||
|
|
||||||
|
Alternativly just use plain old nginx.
|
||||||
@ -120,6 +120,7 @@ define([
|
|||||||
.append($('<td>').append(readOnlyText).append($('<a>', {
|
.append($('<td>').append(readOnlyText).append($('<a>', {
|
||||||
href: pad.href,
|
href: pad.href,
|
||||||
title: pad.title,
|
title: pad.title,
|
||||||
|
target: '_blank',
|
||||||
}).text(shortTitle)))
|
}).text(shortTitle)))
|
||||||
.append($('<td>').text(created))
|
.append($('<td>').text(created))
|
||||||
.append($('<td>').text(date))
|
.append($('<td>').text(date))
|
||||||
|
|||||||
@ -246,7 +246,7 @@ define(function () {
|
|||||||
|
|
||||||
out.login_cancel_prompt = "...or if you may have entered the wrong username or password, cancel to try again.";
|
out.login_cancel_prompt = "...or if you may have entered the wrong username or password, cancel to try again.";
|
||||||
|
|
||||||
out.login_registerSuccess = "registered successfully. Make sure you don't forget your password!"
|
out.login_registerSuccess = "registered successfully. Make sure you don't forget your password!";
|
||||||
out.login_passwordMismatch = "The two passwords you entered do not match. Try again";
|
out.login_passwordMismatch = "The two passwords you entered do not match. Try again";
|
||||||
|
|
||||||
out.login_warning = [
|
out.login_warning = [
|
||||||
|
|||||||
23
docker-compose.yml
Normal file
23
docker-compose.yml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
|
||||||
|
cryptpad:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
args:
|
||||||
|
- VERSION=${VERSION}
|
||||||
|
image: "xwiki/cryptpad:${VERSION}"
|
||||||
|
hostname: cryptpad
|
||||||
|
|
||||||
|
labels:
|
||||||
|
- traefik.port=3000
|
||||||
|
- traefik.frontend.passHostHeader=true
|
||||||
|
environment:
|
||||||
|
- USE_SSL=${USE_SSL}
|
||||||
|
- STORAGE=${STORAGE}
|
||||||
|
- LOG_TO_STDOUT=${LOG_TO_STDOUT}
|
||||||
|
|
||||||
|
restart: always
|
||||||
|
volumes:
|
||||||
|
- ./data/files:/cryptpad/datastore:rw
|
||||||
|
- ./data/customize:/cryptpad/customize:rw
|
||||||
@ -82,6 +82,10 @@ To test CryptPad, go to http://your.server:3000/assert/
|
|||||||
You can use WebDriver to run this test automatically by running TestSelenium.js but you will need chromedriver installed.
|
You can use WebDriver to run this test automatically by running TestSelenium.js but you will need chromedriver installed.
|
||||||
If you use Mac, you can `brew install chromedriver`.
|
If you use Mac, you can `brew install chromedriver`.
|
||||||
|
|
||||||
|
# Setup using Docker
|
||||||
|
|
||||||
|
See [Cryptpad-Docker](cryptpad-docker.md)
|
||||||
|
|
||||||
## Security
|
## Security
|
||||||
|
|
||||||
CryptPad is *private*, not *anonymous*. Privacy protects your data, anonymity protects you.
|
CryptPad is *private*, not *anonymous*. Privacy protects your data, anonymity protects you.
|
||||||
|
|||||||
@ -11,6 +11,7 @@ var WebRTCSrv = require('./WebRTCSrv');
|
|||||||
|
|
||||||
var config = require('./config');
|
var config = require('./config');
|
||||||
var websocketPort = config.websocketPort || config.httpPort;
|
var websocketPort = config.websocketPort || config.httpPort;
|
||||||
|
var useSecureWebsockets = config.useSecureWebsockets || false;
|
||||||
|
|
||||||
// support multiple storage back ends
|
// support multiple storage back ends
|
||||||
var Storage = require(config.storage||'./storage/file');
|
var Storage = require(config.storage||'./storage/file');
|
||||||
@ -83,7 +84,7 @@ app.get('/api/config', function(req, res){
|
|||||||
res.setHeader('Content-Type', 'text/javascript');
|
res.setHeader('Content-Type', 'text/javascript');
|
||||||
res.send('define(' + JSON.stringify({
|
res.send('define(' + JSON.stringify({
|
||||||
websocketPath: config.websocketPath,
|
websocketPath: config.websocketPath,
|
||||||
websocketURL:'ws' + ((httpsOpts) ? 's' : '') + '://' + host + ':' +
|
websocketURL:'ws' + ((useSecureWebsockets) ? 's' : '') + '://' + host + ':' +
|
||||||
websocketPort + '/cryptpad_websocket',
|
websocketPort + '/cryptpad_websocket',
|
||||||
}) + ');');
|
}) + ');');
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,58 +0,0 @@
|
|||||||
# This is Cryptpad
|
|
||||||
|
|
||||||
There are quite a few realtime editors packed into this installation.
|
|
||||||
Most are prototypes that could use a lot of work.
|
|
||||||
|
|
||||||
All editors make use of Cryptpad's end to end encryption.
|
|
||||||
Some of them have much better UI.
|
|
||||||
|
|
||||||
## /pad/
|
|
||||||
|
|
||||||
Pad is the main feature of Cryptpad. It features a CKEditor for realtime WYSIWYG editing.
|
|
||||||
|
|
||||||
## /code/
|
|
||||||
|
|
||||||
Code has syntax highlighting features.
|
|
||||||
|
|
||||||
## /sheet/
|
|
||||||
|
|
||||||
Sheet is under development. It will feature realtime collaborative spreadsheets.
|
|
||||||
|
|
||||||
## /text/
|
|
||||||
|
|
||||||
Text is a very simple encrypted plain text editor with no highlighting.
|
|
||||||
|
|
||||||
## /render/
|
|
||||||
|
|
||||||
Render takes advantage of the fact that multiple editors can both use the same 'channel' at once.
|
|
||||||
Channel, in this sense, refers to part of the unique hash of a page which groups messages together.
|
|
||||||
If you visit a /text/ and a /render/ page simultaneously, the changes you make in /text/ will be
|
|
||||||
rendered as markdown in /render/. You can't edit in /render/ directly, but it adds value to other
|
|
||||||
editors by allowing a realtime preview of your work.
|
|
||||||
|
|
||||||
## /vdom/
|
|
||||||
|
|
||||||
Vdom is under heavy development, and features an alternative approach to the realtime WYSIWYG
|
|
||||||
editor. It syncs a representation of a virtual-dom instead of syncing the HTML itself. In practice,
|
|
||||||
this means that there are fewer inconsistencies between different browsers' representations of the dom.
|
|
||||||
This makes the codebase much simpler, and eliminates many classes of bugs. It's still far from perfect,
|
|
||||||
but it is quite promising.
|
|
||||||
|
|
||||||
## /hack/
|
|
||||||
|
|
||||||
Hack leaves it to the user to decide whether XSS (Cross site scripting) is a bug or a feature.
|
|
||||||
It exposes a realtime text pad to multiple users, and provides a button which will cause the
|
|
||||||
contents of the pad to be passed to an `eval` call. Anyone with the hash of the page can edit
|
|
||||||
the contents, so make sure you read the code you're about to run. If you can't read it, you
|
|
||||||
probably shouldn't run it. In any case, it might be useful for pair programming or when you want
|
|
||||||
to sketch out and prototype simple demos.
|
|
||||||
|
|
||||||
## Coming soon
|
|
||||||
|
|
||||||
* style
|
|
||||||
- live editing of CSS as applied to some Lorum Ipsum
|
|
||||||
* polyweb
|
|
||||||
- a multi-featured editor which connects to multiple channels at once, for:
|
|
||||||
1. live rendered markdown
|
|
||||||
2. live style editing
|
|
||||||
3. live javascript
|
|
||||||
@ -686,8 +686,8 @@ define([
|
|||||||
$loading.append($container);
|
$loading.append($container);
|
||||||
$('body').append($loading);
|
$('body').append($loading);
|
||||||
};
|
};
|
||||||
common.removeLoadingScreen = function () {
|
common.removeLoadingScreen = function (cb) {
|
||||||
$('#' + LOADING).fadeOut(750);
|
$('#' + LOADING).fadeOut(750, cb);
|
||||||
};
|
};
|
||||||
common.errorLoadingScreen = function (error) {
|
common.errorLoadingScreen = function (error) {
|
||||||
$('.spinnerContainer').hide();
|
$('.spinnerContainer').hide();
|
||||||
|
|||||||
@ -12,16 +12,17 @@ define([
|
|||||||
//console.log("plaintext");
|
//console.log("plaintext");
|
||||||
//console.log(body);
|
//console.log(body);
|
||||||
|
|
||||||
|
/*
|
||||||
0 && Crypt.put(body, function (e, out) {
|
0 && Crypt.put(body, function (e, out) {
|
||||||
if (e) { return void console.error(e); }
|
if (e) { return void console.error(e); }
|
||||||
if (out) {
|
if (out) {
|
||||||
console.log(out);
|
console.log(out);
|
||||||
}
|
}
|
||||||
});
|
}); */
|
||||||
|
|
||||||
var data = {};
|
var data = {};
|
||||||
|
|
||||||
(_ => {
|
(function () {
|
||||||
var cyphertext = data.payload = Crypto.encrypt(body, key);
|
var cyphertext = data.payload = Crypto.encrypt(body, key);
|
||||||
console.log("encrypted");
|
console.log("encrypted");
|
||||||
console.log(cyphertext);
|
console.log(cyphertext);
|
||||||
|
|||||||
@ -1,28 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
|
||||||
<!--
|
|
||||||
|
|
||||||
This file only exists for supporting some old URLs that we're trying not to break.
|
|
||||||
|
|
||||||
Legacy support is tricky.
|
|
||||||
|
|
||||||
:(
|
|
||||||
|
|
||||||
-->
|
|
||||||
<script>
|
|
||||||
(function () {
|
|
||||||
if (/cryptpad\.fr$/i.test(window.location.hostname)) {
|
|
||||||
window.location.hostname = 'old.cryptpad.fr';
|
|
||||||
}
|
|
||||||
}());
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<p>There's nothing here.</p>
|
|
||||||
<p>You probably want to visit <strong><a href="https://old.cryptpad.fr">old.cryptpad.fr</a></strong></p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
@ -62,6 +62,14 @@ define([
|
|||||||
Cryptpad: Cryptpad,
|
Cryptpad: Cryptpad,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var emitResize = module.emitResize = function () {
|
||||||
|
var cw = $('#pad-iframe')[0].contentWindow;
|
||||||
|
|
||||||
|
var evt = cw.document.createEvent('UIEvents');
|
||||||
|
evt.initUIEvent('resize', true, false, cw, 0);
|
||||||
|
cw.dispatchEvent(evt);
|
||||||
|
};
|
||||||
|
|
||||||
var toolbar;
|
var toolbar;
|
||||||
|
|
||||||
var isNotMagicLine = function (el) {
|
var isNotMagicLine = function (el) {
|
||||||
@ -630,14 +638,9 @@ define([
|
|||||||
|
|
||||||
// this should only ever get called once, when the chain syncs
|
// this should only ever get called once, when the chain syncs
|
||||||
var onReady = realtimeOptions.onReady = function (info) {
|
var onReady = realtimeOptions.onReady = function (info) {
|
||||||
if (!APP.isMaximized) {
|
if (!module.isMaximized) {
|
||||||
editor.execCommand('maximize');
|
editor.execCommand('maximize');
|
||||||
// We have to call it 3 times in Safari in order to have the editor fully maximized -_-
|
module.isMaximized = true;
|
||||||
if ((''+window.navigator.vendor).indexOf('Apple') !== -1) {
|
|
||||||
editor.execCommand('maximize');
|
|
||||||
editor.execCommand('maximize');
|
|
||||||
}
|
|
||||||
APP.isMaximized = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.patchText = TextPatcher.create({
|
module.patchText = TextPatcher.create({
|
||||||
@ -664,7 +667,8 @@ define([
|
|||||||
console.log("Unlocking editor");
|
console.log("Unlocking editor");
|
||||||
setEditable(true);
|
setEditable(true);
|
||||||
initializing = false;
|
initializing = false;
|
||||||
Cryptpad.removeLoadingScreen();
|
Cryptpad.removeLoadingScreen(emitResize);
|
||||||
|
|
||||||
// Update the toolbar list:
|
// Update the toolbar list:
|
||||||
// Add the current user in the metadata if he has edit rights
|
// Add the current user in the metadata if he has edit rights
|
||||||
if (readOnly) { return; }
|
if (readOnly) { return; }
|
||||||
|
|||||||
@ -22,6 +22,9 @@ define([
|
|||||||
|
|
||||||
var secret = Cryptpad.getSecrets();
|
var secret = Cryptpad.getSecrets();
|
||||||
var readOnly = secret.keys && !secret.keys.editKeyStr;
|
var readOnly = secret.keys && !secret.keys.editKeyStr;
|
||||||
|
if (!secret.keys) {
|
||||||
|
secret.keys = secret.key;
|
||||||
|
}
|
||||||
|
|
||||||
Cryptpad.addLoadingScreen();
|
Cryptpad.addLoadingScreen();
|
||||||
var onConnectError = function (info) {
|
var onConnectError = function (info) {
|
||||||
@ -361,12 +364,19 @@ define([
|
|||||||
if (proxy && proxy.version === 1) { return; }
|
if (proxy && proxy.version === 1) { return; }
|
||||||
console.log("Configuring proxy schema...");
|
console.log("Configuring proxy schema...");
|
||||||
|
|
||||||
proxy.info = schema.info;
|
proxy.info = proxy.info || schema.info;
|
||||||
proxy.table = schema.table;
|
Object.keys(schema.info).forEach(function (k) {
|
||||||
|
if (!proxy.info[k]) { proxy.info[k] = schema.info[k]; }
|
||||||
|
});
|
||||||
|
|
||||||
|
proxy.table = proxy.table || schema.table;
|
||||||
|
Object.keys(schema.table).forEach(function (k) {
|
||||||
|
if (!proxy.table[k]) { proxy.table[k] = schema.table[k]; }
|
||||||
|
});
|
||||||
|
|
||||||
proxy.version = 1;
|
proxy.version = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
*/
|
*/
|
||||||
@ -642,7 +652,7 @@ define([
|
|||||||
suggestName: suggestName
|
suggestName: suggestName
|
||||||
},
|
},
|
||||||
ifrw: window,
|
ifrw: window,
|
||||||
common: Cryptpad
|
common: Cryptpad,
|
||||||
};
|
};
|
||||||
var toolbar = info.realtime.toolbar = Toolbar.create(APP.$bar, info.myID, info.realtime, info.getLag, userList, config);
|
var toolbar = info.realtime.toolbar = Toolbar.create(APP.$bar, info.myID, info.realtime, info.getLag, userList, config);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user