mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-12 22:26:08 -04:00
Support show last change user with profile and support YAML config inside the note with robots, lang, dir, breaks options
This commit is contained in:
parent
1672df3dce
commit
2ecec3b59a
18 changed files with 546 additions and 167 deletions
168
lib/realtime.js
168
lib/realtime.js
|
@ -9,7 +9,6 @@ var shortId = require('shortid');
|
|||
var randomcolor = require("randomcolor");
|
||||
var Chance = require('chance'),
|
||||
chance = new Chance();
|
||||
var md5 = require("blueimp-md5").md5;
|
||||
var moment = require('moment');
|
||||
|
||||
//core
|
||||
|
@ -68,7 +67,9 @@ function secure(socket, next) {
|
|||
|
||||
function emitCheck(note) {
|
||||
var out = {
|
||||
updatetime: note.updatetime
|
||||
updatetime: note.updatetime,
|
||||
lastchangeuser: note.lastchangeuser,
|
||||
lastchangeuserprofile: note.lastchangeuserprofile
|
||||
};
|
||||
realtime.io.to(note.id).emit('check', out);
|
||||
/*
|
||||
|
@ -89,18 +90,52 @@ var updater = setInterval(function () {
|
|||
if (note.server.isDirty) {
|
||||
if (config.debug)
|
||||
logger.info("updater found dirty note: " + key);
|
||||
var body = note.server.document;
|
||||
var title = Note.getNoteTitle(body);
|
||||
title = LZString.compressToBase64(title);
|
||||
body = LZString.compressToBase64(body);
|
||||
db.saveToDB(key, title, body, function (err, result) {
|
||||
if (err) return;
|
||||
note.server.isDirty = false;
|
||||
note.updatetime = Date.now();
|
||||
emitCheck(note);
|
||||
Note.findNote(note.id, function (err, _note) {
|
||||
if (err || !_note) return callback(err, null);
|
||||
//mongo update
|
||||
if (note.lastchangeuser && _note.lastchangeuser != note.lastchangeuser) {
|
||||
var lastchangeuser = note.lastchangeuser;
|
||||
var lastchangeuserprofile = null;
|
||||
User.findUser(lastchangeuser, function (err, user) {
|
||||
if (err) return callback(err, null);
|
||||
if (user && user.profile) {
|
||||
var profile = JSON.parse(user.profile);
|
||||
if (profile) {
|
||||
lastchangeuserprofile = {
|
||||
name: profile.displayName || profile.username,
|
||||
photo: User.parsePhotoByProfile(profile)
|
||||
}
|
||||
note.lastchangeuser = lastchangeuser;
|
||||
note.lastchangeuserprofile = lastchangeuserprofile;
|
||||
Note.updateLastChangeUser(_note, lastchangeuser, function (err, result) {
|
||||
if (err) return callback(err, null);
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
note.lastchangeuser = null;
|
||||
note.lastchangeuserprofile = null;
|
||||
Note.updateLastChangeUser(_note, null, function (err, result) {
|
||||
if (err) return callback(err, null);
|
||||
});
|
||||
}
|
||||
//postgres update
|
||||
var body = note.server.document;
|
||||
var title = Note.getNoteTitle(body);
|
||||
title = LZString.compressToBase64(title);
|
||||
body = LZString.compressToBase64(body);
|
||||
db.saveToDB(key, title, body, function (err, result) {
|
||||
if (err) return callback(err, null);
|
||||
note.server.isDirty = false;
|
||||
note.updatetime = Date.now();
|
||||
emitCheck(note);
|
||||
callback(null, null);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
callback(null, null);
|
||||
}
|
||||
callback();
|
||||
}, function (err) {
|
||||
if (err) return logger.error('updater error', err);
|
||||
});
|
||||
|
@ -121,7 +156,7 @@ var cleaner = setInterval(function () {
|
|||
disconnectSocketQueue.push(socket);
|
||||
disconnect(socket);
|
||||
}
|
||||
callback();
|
||||
callback(null, null);
|
||||
}, function (err) {
|
||||
if (err) return logger.error('cleaner error', err);
|
||||
});
|
||||
|
@ -250,7 +285,11 @@ function emitRefresh(socket) {
|
|||
socket.emit('refresh', {
|
||||
docmaxlength: config.documentmaxlength,
|
||||
owner: note.owner,
|
||||
ownerprofile: note.ownerprofile,
|
||||
lastchangeuser: note.lastchangeuser,
|
||||
lastchangeuserprofile: note.lastchangeuserprofile,
|
||||
permission: note.permission,
|
||||
createtime: note.createtime,
|
||||
updatetime: note.updatetime
|
||||
});
|
||||
}
|
||||
|
@ -321,11 +360,15 @@ function startConnection(socket) {
|
|||
isConnectionBusy = false;
|
||||
return logger.error(err);
|
||||
}
|
||||
|
||||
var owner = data.rows[0].owner;
|
||||
var ownerprofile = null;
|
||||
var permission = "freely";
|
||||
if (owner && owner != "null") {
|
||||
permission = "editable";
|
||||
}
|
||||
|
||||
//find or new note
|
||||
Note.findOrNewNote(notename, permission, function (err, note) {
|
||||
if (err) {
|
||||
responseError(res, "404", "Not Found", "oops.");
|
||||
|
@ -333,20 +376,64 @@ function startConnection(socket) {
|
|||
isConnectionBusy = false;
|
||||
return;
|
||||
}
|
||||
|
||||
var body = LZString.decompressFromBase64(data.rows[0].content);
|
||||
//body = LZString.compressToUTF16(body);
|
||||
var createtime = data.rows[0].create_time;
|
||||
var updatetime = data.rows[0].update_time;
|
||||
var server = new ot.EditorSocketIOServer(body, [], notename, ifMayEdit);
|
||||
|
||||
var lastchangeuser = note.lastchangeuser || null;
|
||||
var lastchangeuserprofile = null;
|
||||
|
||||
notes[notename] = {
|
||||
id: notename,
|
||||
owner: owner,
|
||||
ownerprofile: ownerprofile,
|
||||
permission: note.permission,
|
||||
lastchangeuser: lastchangeuser,
|
||||
lastchangeuserprofile: lastchangeuserprofile,
|
||||
socks: [],
|
||||
users: {},
|
||||
createtime: moment(createtime).valueOf(),
|
||||
updatetime: moment(updatetime).valueOf(),
|
||||
server: server
|
||||
};
|
||||
finishConnection(socket, notes[notename], users[socket.id]);
|
||||
|
||||
if (lastchangeuser) {
|
||||
//find last change user profile if lastchangeuser exists
|
||||
User.findUser(lastchangeuser, function (err, user) {
|
||||
if (!err && user && user.profile) {
|
||||
var profile = JSON.parse(user.profile);
|
||||
if (profile) {
|
||||
lastchangeuserprofile = {
|
||||
name: profile.displayName || profile.username,
|
||||
photo: User.parsePhotoByProfile(profile)
|
||||
}
|
||||
notes[notename].lastchangeuserprofile = lastchangeuserprofile;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (owner && owner != "null") {
|
||||
//find owner profile if owner exists
|
||||
User.findUser(owner, function (err, user) {
|
||||
if (!err && user && user.profile) {
|
||||
var profile = JSON.parse(user.profile);
|
||||
if (profile) {
|
||||
ownerprofile = {
|
||||
name: profile.displayName || profile.username,
|
||||
photo: User.parsePhotoByProfile(profile)
|
||||
}
|
||||
notes[notename].ownerprofile = ownerprofile;
|
||||
}
|
||||
}
|
||||
finishConnection(socket, notes[notename], users[socket.id]);
|
||||
});
|
||||
} else {
|
||||
finishConnection(socket, notes[notename], users[socket.id]);
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
|
@ -433,23 +520,7 @@ function updateUserData(socket, user) {
|
|||
//retrieve user data from passport
|
||||
if (socket.request.user && socket.request.user.logged_in) {
|
||||
var profile = JSON.parse(socket.request.user.profile);
|
||||
var photo = null;
|
||||
switch (profile.provider) {
|
||||
case "facebook":
|
||||
photo = 'https://graph.facebook.com/' + profile.id + '/picture';
|
||||
break;
|
||||
case "twitter":
|
||||
photo = profile.photos[0].value;
|
||||
break;
|
||||
case "github":
|
||||
photo = 'https://avatars.githubusercontent.com/u/' + profile.id + '?s=48';
|
||||
break;
|
||||
case "dropbox":
|
||||
//no image api provided, use gravatar
|
||||
photo = 'https://www.gravatar.com/avatar/' + md5(profile.emails[0].value);
|
||||
break;
|
||||
}
|
||||
user.photo = photo;
|
||||
user.photo = User.parsePhotoByProfile(profile);
|
||||
user.name = profile.displayName || profile.username;
|
||||
user.userid = socket.request.user._id;
|
||||
user.login = true;
|
||||
|
@ -466,19 +537,28 @@ function ifMayEdit(socket, callback) {
|
|||
var note = notes[notename];
|
||||
var mayEdit = true;
|
||||
switch (note.permission) {
|
||||
case "freely":
|
||||
//not blocking anyone
|
||||
break;
|
||||
case "editable":
|
||||
//only login user can change
|
||||
if (!socket.request.user || !socket.request.user.logged_in)
|
||||
mayEdit = false;
|
||||
break;
|
||||
case "locked":
|
||||
//only owner can change
|
||||
if (note.owner != socket.request.user._id)
|
||||
mayEdit = false;
|
||||
break;
|
||||
case "freely":
|
||||
//not blocking anyone
|
||||
break;
|
||||
case "editable":
|
||||
//only login user can change
|
||||
if (!socket.request.user || !socket.request.user.logged_in)
|
||||
mayEdit = false;
|
||||
break;
|
||||
case "locked":
|
||||
//only owner can change
|
||||
if (note.owner != socket.request.user._id)
|
||||
mayEdit = false;
|
||||
break;
|
||||
}
|
||||
//if user may edit and this note have owner (not anonymous usage)
|
||||
if (mayEdit && note.owner && note.owner != "null") {
|
||||
//save for the last change user id
|
||||
if (socket.request.user && socket.request.user.logged_in) {
|
||||
note.lastchangeuser = socket.request.user._id;
|
||||
} else {
|
||||
note.lastchangeuser = null;
|
||||
}
|
||||
}
|
||||
callback(mayEdit);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue