Merge branch 'msg' into staging
commit
159d72f33b
@ -0,0 +1,51 @@
|
|||||||
|
define([
|
||||||
|
'/common/curve.js',
|
||||||
|
'/bower_components/chainpad-listmap/chainpad-listmap.js',
|
||||||
|
], function (Curve, Listmap) {
|
||||||
|
var Edit = {};
|
||||||
|
|
||||||
|
Edit.create = function (config, cb) { //network, channel, theirs, mine, cb) {
|
||||||
|
var network = config.network;
|
||||||
|
var channel = config.channel;
|
||||||
|
var keys = config.keys;
|
||||||
|
|
||||||
|
try {
|
||||||
|
var encryptor = Curve.createEncryptor(keys);
|
||||||
|
var lm = Listmap.create({
|
||||||
|
network: network,
|
||||||
|
data: {},
|
||||||
|
channel: channel,
|
||||||
|
readOnly: false,
|
||||||
|
validateKey: keys.validateKey || undefined,
|
||||||
|
crypto: encryptor,
|
||||||
|
userName: 'lol',
|
||||||
|
logLevel: 1,
|
||||||
|
});
|
||||||
|
|
||||||
|
var done = function () {
|
||||||
|
// TODO make this abort and disconnect the session after the
|
||||||
|
// user has finished making changes to the object, and they
|
||||||
|
// have propagated.
|
||||||
|
};
|
||||||
|
|
||||||
|
lm.proxy
|
||||||
|
.on('create', function () {
|
||||||
|
console.log('created');
|
||||||
|
})
|
||||||
|
.on('ready', function () {
|
||||||
|
console.log('ready');
|
||||||
|
cb(lm, done);
|
||||||
|
})
|
||||||
|
.on('disconnect', function () {
|
||||||
|
console.log('disconnected');
|
||||||
|
})
|
||||||
|
.on('change', [], function (o, n, p) {
|
||||||
|
console.log(o, n, p);
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return Edit;
|
||||||
|
});
|
@ -0,0 +1,86 @@
|
|||||||
|
define([
|
||||||
|
'/bower_components/tweetnacl/nacl-fast.min.js',
|
||||||
|
], function () {
|
||||||
|
var Nacl = window.nacl;
|
||||||
|
var Curve = {};
|
||||||
|
|
||||||
|
var concatenateUint8s = function (A) {
|
||||||
|
var len = 0;
|
||||||
|
var offset = 0;
|
||||||
|
A.forEach(function (uints) {
|
||||||
|
len += uints.length || 0;
|
||||||
|
});
|
||||||
|
var c = new Uint8Array(len);
|
||||||
|
A.forEach(function (x) {
|
||||||
|
c.set(x, offset);
|
||||||
|
offset += x.length;
|
||||||
|
});
|
||||||
|
return c;
|
||||||
|
};
|
||||||
|
|
||||||
|
var encodeBase64 = Nacl.util.encodeBase64;
|
||||||
|
var decodeBase64 = Nacl.util.decodeBase64;
|
||||||
|
var decodeUTF8 = Nacl.util.decodeUTF8;
|
||||||
|
var encodeUTF8 = Nacl.util.encodeUTF8;
|
||||||
|
|
||||||
|
Curve.encrypt = function (message, secret) {
|
||||||
|
var buffer = decodeUTF8(message);
|
||||||
|
var nonce = Nacl.randomBytes(24);
|
||||||
|
var box = Nacl.box.after(buffer, nonce, secret);
|
||||||
|
return encodeBase64(nonce) + '|' + encodeBase64(box);
|
||||||
|
};
|
||||||
|
|
||||||
|
Curve.decrypt = function (packed, secret) {
|
||||||
|
var unpacked = packed.split('|');
|
||||||
|
var nonce = decodeBase64(unpacked[0]);
|
||||||
|
var box = decodeBase64(unpacked[1]);
|
||||||
|
var message = Nacl.box.open.after(box, nonce, secret);
|
||||||
|
return encodeUTF8(message);
|
||||||
|
};
|
||||||
|
|
||||||
|
Curve.signAndEncrypt = function (msg, cryptKey, signKey) {
|
||||||
|
var packed = Curve.encrypt(msg, cryptKey);
|
||||||
|
return encodeBase64(Nacl.sign(decodeUTF8(packed), signKey));
|
||||||
|
};
|
||||||
|
|
||||||
|
Curve.openSigned = function (msg, cryptKey /*, validateKey STUBBED*/) {
|
||||||
|
var content = decodeBase64(msg).subarray(64);
|
||||||
|
return Curve.decrypt(encodeUTF8(content), cryptKey);
|
||||||
|
};
|
||||||
|
|
||||||
|
Curve.deriveKeys = function (theirs, mine) {
|
||||||
|
var pub = decodeBase64(theirs);
|
||||||
|
var secret = decodeBase64(mine);
|
||||||
|
|
||||||
|
var sharedSecret = Nacl.box.before(pub, secret);
|
||||||
|
var salt = decodeUTF8('CryptPad.signingKeyGenerationSalt');
|
||||||
|
|
||||||
|
// 64 uint8s
|
||||||
|
var hash = Nacl.hash(concatenateUint8s([salt, sharedSecret]));
|
||||||
|
var signKp = Nacl.sign.keyPair.fromSeed(hash.subarray(0, 32));
|
||||||
|
var cryptKey = hash.subarray(32, 64);
|
||||||
|
|
||||||
|
return {
|
||||||
|
cryptKey: encodeBase64(cryptKey),
|
||||||
|
signKey: encodeBase64(signKp.secretKey),
|
||||||
|
validateKey: encodeBase64(signKp.publicKey)
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
Curve.createEncryptor = function (keys) {
|
||||||
|
var cryptKey = decodeBase64(keys.cryptKey);
|
||||||
|
var signKey = decodeBase64(keys.signKey);
|
||||||
|
var validateKey = decodeBase64(keys.validateKey);
|
||||||
|
|
||||||
|
return {
|
||||||
|
encrypt: function (msg) {
|
||||||
|
return Curve.signAndEncrypt(msg, cryptKey, signKey);
|
||||||
|
},
|
||||||
|
decrypt: function (packed) {
|
||||||
|
return Curve.openSigned(packed, cryptKey, validateKey);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
return Curve;
|
||||||
|
});
|
@ -0,0 +1,30 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="cp pad">
|
||||||
|
<head>
|
||||||
|
<title>CryptPad</title>
|
||||||
|
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.1.15"></script>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
#pad-iframe {
|
||||||
|
position:fixed;
|
||||||
|
top:0px;
|
||||||
|
left:0px;
|
||||||
|
bottom:0px;
|
||||||
|
right:0px;
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
border:none;
|
||||||
|
margin:0;
|
||||||
|
padding:0;
|
||||||
|
overflow:hidden;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<iframe id="pad-iframe"></iframe><script src="/common/noscriptfix.js"></script>
|
||||||
|
|
@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||||
|
<script src="/bower_components/jquery/dist/jquery.min.js"></script>
|
||||||
|
<script async data-bootload="/friends/inner.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.1.15"></script>
|
||||||
|
<style>.loading-hidden, .loading-hidden * {display: none !important;}</style>
|
||||||
|
</head>
|
||||||
|
<body class="loading-hidden">
|
||||||
|
<div id="toolbar" class="toolbar-container"></div>
|
||||||
|
<div id="app">
|
||||||
|
<div id="friendList"></div>
|
||||||
|
<div id="messaging"></div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,13 @@
|
|||||||
|
define([
|
||||||
|
'jquery',
|
||||||
|
'css!/bower_components/components-font-awesome/css/font-awesome.min.css',
|
||||||
|
'css!/bower_components/bootstrap/dist/css/bootstrap.min.css',
|
||||||
|
'less!/friends/main.less',
|
||||||
|
'less!/customize/src/less/toolbar.less',
|
||||||
|
], function ($) {
|
||||||
|
$('.loading-hidden').removeClass('loading-hidden');
|
||||||
|
// dirty hack to get rid the flash of the lock background
|
||||||
|
setTimeout(function () {
|
||||||
|
$('#app').addClass('ready');
|
||||||
|
}, 100);
|
||||||
|
});
|
@ -0,0 +1,51 @@
|
|||||||
|
define([
|
||||||
|
'jquery',
|
||||||
|
'/bower_components/chainpad-crypto/crypto.js',
|
||||||
|
'/common/toolbar2.js',
|
||||||
|
'/common/cryptpad-common.js',
|
||||||
|
|
||||||
|
'css!/bower_components/components-font-awesome/css/font-awesome.min.css',
|
||||||
|
'less!/customize/src/less/cryptpad.less',
|
||||||
|
], function ($, Crypto, Toolbar, Cryptpad) {
|
||||||
|
//var Messages = Cryptpad.Messages;
|
||||||
|
|
||||||
|
var APP = window.APP = {
|
||||||
|
Cryptpad: Cryptpad
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
|
||||||
|
var andThen = function () {
|
||||||
|
Cryptpad.addLoadingScreen();
|
||||||
|
|
||||||
|
var ifrw = $('#pad-iframe')[0].contentWindow;
|
||||||
|
var $iframe = $('#pad-iframe').contents();
|
||||||
|
//var $appContainer = $iframe.find('#app');
|
||||||
|
var $list = $iframe.find('#friendList');
|
||||||
|
var $messages = $iframe.find('#messaging');
|
||||||
|
var $bar = $iframe.find('.toolbar-container');
|
||||||
|
|
||||||
|
var displayed = ['useradmin', 'newpad', 'limit', 'lag', 'spinner'];
|
||||||
|
|
||||||
|
var configTb = {
|
||||||
|
displayed: displayed,
|
||||||
|
ifrw: ifrw,
|
||||||
|
common: Cryptpad,
|
||||||
|
$container: $bar,
|
||||||
|
network: Cryptpad.getNetwork()
|
||||||
|
};
|
||||||
|
var toolbar = APP.toolbar = Toolbar.create(configTb);
|
||||||
|
toolbar.$rightside.html(''); // Remove the drawer if we don't use it to hide the toolbar
|
||||||
|
|
||||||
|
Cryptpad.initMessaging(Cryptpad, $list, $messages);
|
||||||
|
|
||||||
|
Cryptpad.removeLoadingScreen();
|
||||||
|
};
|
||||||
|
|
||||||
|
Cryptpad.ready(function () {
|
||||||
|
andThen();
|
||||||
|
Cryptpad.reportAppUsage();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,20 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="cp">
|
||||||
|
<!-- If this file is not called customize.dist/src/template.html, it is generated -->
|
||||||
|
<head>
|
||||||
|
<title data-localization="main_title">Cryptpad: Zero Knowledge, Collaborative Real Time Editing</title>
|
||||||
|
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||||
|
<link rel="icon" type="image/png" href="/customize/main-favicon.png" id="favicon"/>
|
||||||
|
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.1.15"></script>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="/bower_components/codemirror/lib/codemirror.css">
|
||||||
|
<link rel="stylesheet" href="/bower_components/codemirror/addon/dialog/dialog.css">
|
||||||
|
<link rel="stylesheet" href="/bower_components/codemirror/addon/fold/foldgutter.css" />
|
||||||
|
</head>
|
||||||
|
<body class="html">
|
||||||
|
<noscript>
|
||||||
|
<p><strong>OOPS</strong> In order to do encryption in your browser, Javascript is really <strong>really</strong> required.</p>
|
||||||
|
<p><strong>OUPS</strong> Afin de pouvoir réaliser le chiffrement dans votre navigateur, Javascript est <strong>vraiment</strong> nécessaire.</p>
|
||||||
|
</noscript>
|
||||||
|
</html>
|
@ -0,0 +1,86 @@
|
|||||||
|
define([
|
||||||
|
'jquery',
|
||||||
|
'/common/cryptpad-common.js',
|
||||||
|
'/bower_components/chainpad-listmap/chainpad-listmap.js',
|
||||||
|
'/common/curve.js',
|
||||||
|
'less!/invite/main.less',
|
||||||
|
], function ($, Cryptpad, Listmap, Curve) {
|
||||||
|
var APP = window.APP = {};
|
||||||
|
|
||||||
|
//var Messages = Cryptpad.Messages;
|
||||||
|
var onInit = function () {};
|
||||||
|
|
||||||
|
var onDisconnect = function () {};
|
||||||
|
var onChange = function () {};
|
||||||
|
|
||||||
|
var andThen = function () {
|
||||||
|
var hash = window.location.hash.slice(1);
|
||||||
|
|
||||||
|
var info = Cryptpad.parseTypeHash('invite', hash);
|
||||||
|
console.log(info);
|
||||||
|
|
||||||
|
if (!info.pubkey) {
|
||||||
|
Cryptpad.removeLoadingScreen();
|
||||||
|
Cryptpad.alert('invalid invite');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var proxy = Cryptpad.getProxy();
|
||||||
|
var mySecret = proxy.curvePrivate;
|
||||||
|
|
||||||
|
var keys = Curve.deriveKeys(info.pubkey, mySecret);
|
||||||
|
var encryptor = Curve.createEncryptor(keys);
|
||||||
|
|
||||||
|
Cryptpad.removeLoadingScreen();
|
||||||
|
|
||||||
|
var listmapConfig = {
|
||||||
|
data: {},
|
||||||
|
network: Cryptpad.getNetwork(),
|
||||||
|
channel: info.channel,
|
||||||
|
readOnly: false,
|
||||||
|
validateKey: keys.validateKey,
|
||||||
|
crypto: encryptor,
|
||||||
|
userName: 'profile',
|
||||||
|
logLevel: 1,
|
||||||
|
};
|
||||||
|
var lm = APP.lm = Listmap.create(listmapConfig);
|
||||||
|
lm.proxy.on('create', onInit)
|
||||||
|
.on('ready', function () {
|
||||||
|
APP.initialized = true;
|
||||||
|
console.log(JSON.stringify(lm.proxy));
|
||||||
|
})
|
||||||
|
.on('disconnect', onDisconnect)
|
||||||
|
.on('change', [], onChange);
|
||||||
|
};
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
var $main = $('#mainBlock');
|
||||||
|
// Language selector
|
||||||
|
var $sel = $('#language-selector');
|
||||||
|
Cryptpad.createLanguageSelector(undefined, $sel);
|
||||||
|
$sel.find('button').addClass('btn').addClass('btn-secondary');
|
||||||
|
$sel.show();
|
||||||
|
|
||||||
|
// User admin menu
|
||||||
|
var $userMenu = $('#user-menu');
|
||||||
|
var userMenuCfg = {
|
||||||
|
$initBlock: $userMenu
|
||||||
|
};
|
||||||
|
var $userAdmin = Cryptpad.createUserAdminMenu(userMenuCfg);
|
||||||
|
$userAdmin.find('button').addClass('btn').addClass('btn-secondary');
|
||||||
|
|
||||||
|
$(window).click(function () {
|
||||||
|
$('.cryptpad-dropdown').hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
// main block is hidden in case javascript is disabled
|
||||||
|
$main.removeClass('hidden');
|
||||||
|
|
||||||
|
APP.$container = $('#container');
|
||||||
|
|
||||||
|
Cryptpad.ready(function () {
|
||||||
|
Cryptpad.reportAppUsage();
|
||||||
|
andThen();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,137 @@
|
|||||||
|
.cp {
|
||||||
|
#mainBlock {
|
||||||
|
z-index: 1;
|
||||||
|
width: 1000px;
|
||||||
|
max-width: 90%;
|
||||||
|
margin: auto;
|
||||||
|
#container {
|
||||||
|
font-size: 25px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#header {
|
||||||
|
display: flex;
|
||||||
|
#rightside {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#avatar {
|
||||||
|
width: 300px;
|
||||||
|
//height: 350px;
|
||||||
|
margin: 10px;
|
||||||
|
margin-right: 20px;
|
||||||
|
text-align: center;
|
||||||
|
&> span {
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
height: 300px;
|
||||||
|
width: 300px;
|
||||||
|
border: 1px solid black;
|
||||||
|
border-radius: 10px;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
.delete {
|
||||||
|
right: 0;
|
||||||
|
position: absolute;
|
||||||
|
opacity: 0.7;
|
||||||
|
&:hover {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
media-tag {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
display: inline-flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
img {
|
||||||
|
min-width: 100%;
|
||||||
|
min-height: 100%;
|
||||||
|
max-width: none;
|
||||||
|
max-height: none;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
height: 40px;
|
||||||
|
margin: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#displayName, #link {
|
||||||
|
width: 100%;
|
||||||
|
height: 40px;
|
||||||
|
margin: 10px 0;
|
||||||
|
input {
|
||||||
|
width: 100%;
|
||||||
|
font-size: 20px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding-right: 30px;
|
||||||
|
}
|
||||||
|
input:focus ~ .edit {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.edit {
|
||||||
|
position: absolute;
|
||||||
|
margin-left: -25px;
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
.temp {
|
||||||
|
font-weight: 400;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
.displayName {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
.displayName, .link {
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#description {
|
||||||
|
position: relative;
|
||||||
|
font-size: 16px;
|
||||||
|
border: 1px solid #DDD;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
.rendered {
|
||||||
|
padding: 0 15px;
|
||||||
|
}
|
||||||
|
.ok, .spin {
|
||||||
|
position: absolute;
|
||||||
|
top: 2px;
|
||||||
|
right: 2px;
|
||||||
|
display: none;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
textarea {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
.CodeMirror {
|
||||||
|
border: 1px solid #DDD;
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: initial;
|
||||||
|
pre {
|
||||||
|
margin: 0;
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#createProfile {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue