/**
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS-IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// src/etherpad/events.js
import("etherpad.licensing");
import("etherpad.log");
import("etherpad.pad.chatarchive");
import("etherpad.pad.activepads");
import("etherpad.pad.padutils");
import("etherpad.sessions");
import("etherpad.pro.pro_padmeta");
import("etherpad.pro.pro_pad_db");
import("etherpad.pad.padusers");
import("etherpad.pad.pad_security");
import("etherpad.pad.noprowatcher");
import("etherpad.collab.collab_server");
jimport("java.lang.System.out.println");
function onNewPad(pad) {
log.custom("padevents", {
type: "newpad",
padId: pad.getId()
});
pro_pad_db.onCreatePad(pad);
}
function onDestroyPad(pad) {
log.custom("padevents", {
type: "destroypad",
padId: pad.getId()
});
pro_pad_db.onDestroyPad(pad);
}
function onUserJoin(pad, userInfo) {
log.callCatchingExceptions(function() {
var name = userInfo.name || "unnamed";
log.custom("padevents", {
type: "userjoin",
padId: pad.getId(),
username: name,
ip: userInfo.ip,
userId: userInfo.userId
});
activepads.touch(pad.getId());
licensing.onUserJoin(userInfo);
log.onUserJoin(userInfo.userId);
padusers.notifyActive();
noprowatcher.onUserJoin(pad, userInfo);
});
}
function onUserLeave(pad, userInfo) {
log.callCatchingExceptions(function() {
var name = userInfo.name || "unnamed";
log.custom("padevents", {
type: "userleave",
padId: pad.getId(),
username: name,
ip: userInfo.ip,
userId: userInfo.userId
});
activepads.touch(pad.getId());
licensing.onUserLeave(userInfo);
noprowatcher.onUserLeave(pad, userInfo);
});
}
function onUserInfoChange(pad, userInfo) {
log.callCatchingExceptions(function() {
activepads.touch(pad.getId());
});
}
function onClientMessage(pad, senderUserInfo, msg) {
var padId = pad.getId();
activepads.touch(padId);
if (msg.type == "chat") {
chatarchive.onChatMessage(pad, senderUserInfo, msg);
var name = "unnamed";
if (senderUserInfo.name) {
name = senderUserInfo.name;
}
log.custom("chat", {
padId: padId,
userId: senderUserInfo.userId,
username: name,
text: msg.lineText
});
}
else if (msg.type == "padtitle") {
if (msg.title && padutils.isProPadId(pad.getId())) {
pro_padmeta.accessProPad(pad.getId(), function(propad) {
propad.setTitle(String(msg.title).substring(0, 80));
});
}
}
else if (msg.type == "padpassword") {
if (padutils.isProPadId(pad.getId())) {
pro_padmeta.accessProPad(pad.getId(), function(propad) {
propad.setPassword(msg.password || null);
});
}
}
else if (msg.type == "padoptions") {
// options object is a full set of options or just
// some options to change
var opts = msg.options;
var padOptions = pad.getPadOptionsObj();
if (opts.view) {
if (! padOptions.view) {
padOptions.view = {};
}
for(var k in opts.view) {
padOptions.view[k] = opts.view[k];
}
}
if (opts.guestPolicy) {
padOptions.guestPolicy = opts.guestPolicy;
if (opts.guestPolicy == 'deny') {
// boot guests!
collab_server.bootUsersFromPad(pad, "unauth", function(userInfo) {
return padusers.isGuest(userInfo.userId); }).forEach(function(userInfo) {
pad_security.revokePadUserAccess(padId, userInfo.userId); });
}
}
}
else if (msg.type == "guestanswer") {
if ((! msg.authId) || padusers.isGuest(msg.authId)) {
// not a pro user, forbid.
}
else {
pad_security.answerKnock(msg.guestId, padId, msg.answer);
}
}
}
function onEditPad(pad, authorId) {
log.callCatchingExceptions(function() {
pro_pad_db.onEditPad(pad, authorId);
});
}