fix merge conflict
commit
bf1332451f
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,11 @@
|
|||||||
|
// remove duplicate elements in an array
|
||||||
|
module.exports = function (O) {
|
||||||
|
// make a copy of the original array
|
||||||
|
var A = O.slice();
|
||||||
|
for (var i = 0; i < A.length; i++) {
|
||||||
|
for (var j = i + 1; j < A.length; j++) {
|
||||||
|
if (A[i] === A[j]) { A.splice(j--, 1); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return A;
|
||||||
|
};
|
@ -0,0 +1,126 @@
|
|||||||
|
var Meta = module.exports;
|
||||||
|
|
||||||
|
var deduplicate = require("./deduplicate");
|
||||||
|
|
||||||
|
/* Metadata fields:
|
||||||
|
|
||||||
|
* channel <STRING>
|
||||||
|
* validateKey <STRING>
|
||||||
|
* owners <ARRAY>
|
||||||
|
* ADD_OWNERS
|
||||||
|
* RM_OWNERS
|
||||||
|
* expire <NUMBER>
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
var commands = {};
|
||||||
|
|
||||||
|
// ["ADD_OWNERS", ["7eEqelGso3EBr5jHlei6av4r9w2B9XZiGGwA1EgZ-5I="], 1561623438989]
|
||||||
|
commands.ADD_OWNERS = function (meta, args) {
|
||||||
|
// bail out if args isn't an array
|
||||||
|
if (!Array.isArray(args)) {
|
||||||
|
throw new Error('METADATA_INVALID_OWNERS');
|
||||||
|
}
|
||||||
|
|
||||||
|
// you shouldn't be able to get here if there are no owners
|
||||||
|
// because only an owner should be able to change the owners
|
||||||
|
if (!Array.isArray(meta.owners)) {
|
||||||
|
throw new Error("METADATA_NONSENSE_OWNERS");
|
||||||
|
}
|
||||||
|
|
||||||
|
args.forEach(function (owner) {
|
||||||
|
if (meta.owners.indexOf(owner) >= 0) { return; }
|
||||||
|
meta.owners.push(owner);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// ["RM_OWNERS", ["CrufexqXcY-z+eKJlEbNELVy5Sb7E-EAAEFI8GnEtZ0="], 1561623439989]
|
||||||
|
commands.RM_OWNERS = function (meta, args) {
|
||||||
|
// what are you doing if you don't have owners to remove?
|
||||||
|
if (!Array.isArray(args)) {
|
||||||
|
throw new Error('METADATA_INVALID_OWNERS');
|
||||||
|
}
|
||||||
|
// if there aren't any owners to start, this is also pointless
|
||||||
|
if (!Array.isArray(meta.owners)) {
|
||||||
|
throw new Error("METADATA_NONSENSE_OWNERS");
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove owners one by one
|
||||||
|
// we assume there are no duplicates
|
||||||
|
args.forEach(function (owner) {
|
||||||
|
var index = meta.owners.indexOf(owner);
|
||||||
|
if (index < 0) { return; }
|
||||||
|
meta.owners.splice(index, 1);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// ["RESET_OWNERS", ["7eEqelGso3EBr5jHlei6av4r9w2B9XZiGGwA1EgZ-5I="], 1561623439989]
|
||||||
|
commands.RESET_OWNERS = function (meta, args) {
|
||||||
|
// expect a new array, even if it's empty
|
||||||
|
if (!Array.isArray(args)) {
|
||||||
|
throw new Error('METADATA_INVALID_OWNERS');
|
||||||
|
}
|
||||||
|
// assume there are owners to start
|
||||||
|
if (!Array.isArray(meta.owners)) {
|
||||||
|
throw new Error("METADATA_NONSENSE_OWNERS");
|
||||||
|
}
|
||||||
|
|
||||||
|
// overwrite the existing owners with the new one
|
||||||
|
meta.owners = deduplicate(args);
|
||||||
|
};
|
||||||
|
|
||||||
|
commands.UPDATE_EXPIRATION = function () {
|
||||||
|
throw new Error("E_NOT_IMPLEMENTED");
|
||||||
|
};
|
||||||
|
|
||||||
|
var handleCommand = function (meta, line) {
|
||||||
|
var command = line[0];
|
||||||
|
var args = line[1];
|
||||||
|
//var time = line[2];
|
||||||
|
|
||||||
|
if (typeof(commands[command]) !== 'function') {
|
||||||
|
throw new Error("METADATA_UNSUPPORTED_COMMAND");
|
||||||
|
}
|
||||||
|
|
||||||
|
commands[command](meta, args);
|
||||||
|
};
|
||||||
|
|
||||||
|
Meta.createLineHandler = function (ref, errorHandler) {
|
||||||
|
ref.meta = {};
|
||||||
|
ref.index = 0;
|
||||||
|
|
||||||
|
return function (err, line) {
|
||||||
|
if (err) {
|
||||||
|
return void errorHandler('METADATA_HANDLER_LINE_ERR', {
|
||||||
|
error: err,
|
||||||
|
index: ref.index,
|
||||||
|
line: JSON.stringify(line),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(line)) {
|
||||||
|
try {
|
||||||
|
handleCommand(ref.meta, line);
|
||||||
|
ref.index++;
|
||||||
|
} catch (err2) {
|
||||||
|
errorHandler("METADATA_COMMAND_ERR", {
|
||||||
|
error: err2.stack,
|
||||||
|
line: line,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ref.index === 0 && typeof(line) === 'object') {
|
||||||
|
ref.index++;
|
||||||
|
// special case!
|
||||||
|
ref.meta = line;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
errorHandler("METADATA_HANDLER_WEIRDLINE", {
|
||||||
|
line: line,
|
||||||
|
index: ref.index++,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
@ -1,51 +0,0 @@
|
|||||||
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;
|
|
||||||
});
|
|
File diff suppressed because it is too large
Load Diff
@ -1,20 +0,0 @@
|
|||||||
<!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.3.5"></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>
|
|
@ -1,88 +0,0 @@
|
|||||||
define([
|
|
||||||
'jquery',
|
|
||||||
'/common/cryptpad-common.js',
|
|
||||||
'/common/common-interface.js',
|
|
||||||
//'/common/common-hash.js',
|
|
||||||
//'/bower_components/chainpad-listmap/chainpad-listmap.js',
|
|
||||||
//'/common/curve.js',
|
|
||||||
'less!/invite/main.less',
|
|
||||||
], function ($, Cryptpad, UI/*, Hash , Listmap, Curve*/) {
|
|
||||||
var Messages = Cryptpad.Messages;
|
|
||||||
var comingSoon = function () {
|
|
||||||
return $('<div>', {
|
|
||||||
'class': 'coming-soon',
|
|
||||||
})
|
|
||||||
.text(Messages.comingSoon)
|
|
||||||
.append('<br>');
|
|
||||||
};
|
|
||||||
|
|
||||||
$(function () {
|
|
||||||
UI.removeLoadingScreen();
|
|
||||||
console.log("wut");
|
|
||||||
$('body #mainBlock').append(comingSoon());
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* jshint ignore:start */
|
|
||||||
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 = Hash.parseTypeHash('invite', hash);
|
|
||||||
console.log(info);
|
|
||||||
|
|
||||||
if (!info.pubkey) {
|
|
||||||
UI.removeLoadingScreen();
|
|
||||||
UI.alert('invalid invite');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var proxy = Cryptpad.getProxy();
|
|
||||||
var mySecret = proxy.curvePrivate;
|
|
||||||
|
|
||||||
var keys = Curve.deriveKeys(info.pubkey, mySecret);
|
|
||||||
var encryptor = Curve.createEncryptor(keys);
|
|
||||||
|
|
||||||
UI.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');
|
|
||||||
|
|
||||||
// main block is hidden in case javascript is disabled
|
|
||||||
$main.removeClass('hidden');
|
|
||||||
|
|
||||||
APP.$container = $('#container');
|
|
||||||
|
|
||||||
Cryptpad.ready(function () {
|
|
||||||
andThen();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
/* jshint ignore:end */
|
|
||||||
});
|
|
@ -1,150 +0,0 @@
|
|||||||
/*
|
|
||||||
.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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
.coming-soon {
|
|
||||||
text-align: center;
|
|
||||||
font-size: 25px;
|
|
||||||
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-flow: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
Loading…
Reference in New Issue