Merge branch 'v2.0.x-release' into custom-parameters

This commit is contained in:
Anton Georgiev 2018-07-23 10:29:29 -04:00 committed by GitHub
commit 5dc3fe82c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 339 additions and 64 deletions

View File

@ -175,8 +175,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
private function cannotUseWebRTC(message:String):void {
LOGGER.debug("Cannot use WebRTC Screensharing: " + message);
var logData:Object = UsersUtil.initLogData();
logData.tags = ["webrtc-screenshare"];
logData.logCode = "cannot-use-webrtc-screenshare";
logData.reason = message;
LOGGER.info(JSON.stringify(logData));
displayFail(message);
};
@ -192,7 +195,11 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
attempt to share
*/
private function webRTCWorksAndConfigured(message:String):void {
LOGGER.debug("WebRTC Screenshare works, start sharing: " + message);
var logData:Object = UsersUtil.initLogData();
logData.tags = ["webrtc-screenshare"];
logData.logCode = "webrtc-works-and-configured";
logData.reason = message;
LOGGER.info(JSON.stringify(logData));
startWebRTCPublish();
}
@ -202,12 +209,17 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
if (ExternalInterface.available) {
var videoTag:String = "localWebRTCVideo";
var onFail:Function = function(args:Object):void {
LOGGER.debug("startWebRTCDeskshare - failed to publish WebRTC deskshare. " + ObjectUtil.toString(args));
var logData:Object = UsersUtil.initLogData();
logData.tags = ["webrtc-screenshare"];
logData.logCode = "webrtc-failed-to-publish";
if (args is String) {
logData.reason = args as String;
displayFail(args as String);
} else {
displayFail();
}
LOGGER.info(JSON.stringify(logData));
};
ExternalInterface.addCallback("onFail", onFail);
@ -276,10 +288,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
var myArray :Array = rtmp.split('/');
var meetingUrl:String = rtmp.substring(0, rtmp.lastIndexOf('/'));
stream = rtmp.substring(rtmp.lastIndexOf('/')+1, rtmp.length);
LOGGER.debug("WebRTCDesktopPublishWindow::startVideo meetingurl=[{0}] and stream=[{1}]",[meetingUrl, stream]);
JSLog.warn("WebRTCDesktopPublishWindow::startVideo meetingurl= ",meetingUrl);
JSLog.warn("WebRTCDesktopPublishWindow::startVideo stream=", stream);
var logData:Object = UsersUtil.initLogData();
logData.tags = ["webrtc-screenshare"];
logData.logCode = "webrtc-screenshare-start-playing-preview";
logData.stream = stream;
LOGGER.info(JSON.stringify(logData));
connection = new NetConnection();

View File

@ -24,9 +24,6 @@ package org.bigbluebutton.modules.users.services
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
import org.bigbluebutton.common.toaster.Toaster;
import org.bigbluebutton.common.toaster.message.ToastIcon;
import org.bigbluebutton.common.toaster.message.ToastType;
import org.bigbluebutton.core.BBB;
import org.bigbluebutton.core.EventConstants;
import org.bigbluebutton.core.TimerUtil;
@ -470,6 +467,12 @@ package org.bigbluebutton.modules.users.services
var vidWidth: Number = body.vidWidth as Number;
var vidHeight: Number = body.vidHeight as Number;
var logData:Object = UsersUtil.initLogData();
logData.tags = ["webrtc-screenshare"];
logData.logCode = "screenshare-rtmp-broadcast-started";
logData.stream = stream;
LOGGER.info(JSON.stringify(logData));
var event:WebRTCViewStreamEvent = new WebRTCViewStreamEvent(WebRTCViewStreamEvent.START);
event.videoWidth = vidWidth;
@ -485,6 +488,12 @@ package org.bigbluebutton.modules.users.services
var vidWidth: Number = body.vidWidth as Number;
var vidHeight: Number = body.vidHeight as Number;
var logData:Object = UsersUtil.initLogData();
logData.tags = ["webrtc-screenshare"];
logData.logCode = "screenshare-rtmp-broadcast-stopped";
logData.stream = stream;
LOGGER.info(JSON.stringify(logData));
var event:WebRTCViewStreamEvent = new WebRTCViewStreamEvent(WebRTCViewStreamEvent.STOP);
event.videoWidth = vidWidth;

View File

@ -145,7 +145,12 @@ package org.bigbluebutton.modules.whiteboard
textUpdateListener.canvasMouseDown();
//LogUtil.debug("**** CanvasDisplay changePage. Clearing page *****");
clearBoard();
// forcefully clear all annotations and cursors on whiteboard change
_annotationsMap = new Object();
wbCanvas.removeAllGraphics();
clearCursors();
var annotations:Array = whiteboardModel.getAnnotations(wbId);
//LogUtil.debug("**** CanvasDisplay changePage [" + annotations.length + "] *****");
@ -154,6 +159,11 @@ package org.bigbluebutton.modules.whiteboard
}
}
public function clearCursors():void {
_cursors = new Object();
wbCanvas.removeAllCursorChildren();
}
public function drawCursor(userId:String, xPercent:Number, yPercent:Number):void {
var showName: Boolean = LiveMeeting.inst().whiteboardModel.multiUser;

View File

@ -27,9 +27,12 @@ package org.bigbluebutton.modules.whiteboard.views {
import flash.geom.Point;
import mx.containers.Canvas;
import mx.core.IChildList;
import mx.managers.CursorManager;
import org.bigbluebutton.core.UsersUtil;
import org.bigbluebutton.core.model.LiveMeeting;
import org.bigbluebutton.core.model.users.User2x;
import org.bigbluebutton.main.events.SwitchedPresenterEvent;
import org.bigbluebutton.main.events.UserLeftEvent;
import org.bigbluebutton.modules.whiteboard.WhiteboardCanvasDisplayModel;
@ -268,6 +271,13 @@ package org.bigbluebutton.modules.whiteboard.views {
else trace("Does not contain");
}
public function removeAllGraphics():void {
var children:IChildList = this.graphicObjectHolder.rawChildren;
while (children.numChildren != 0) {
children.removeChildAt(children.numChildren - 1);
}
}
public function addGraphic(child:DisplayObject):void {
this.graphicObjectHolder.rawChildren.addChild(child);
}
@ -284,6 +294,13 @@ package org.bigbluebutton.modules.whiteboard.views {
if (doesContainCursor(cursor)) this.cursorObjectHolder.rawChildren.removeChild(cursor);
}
public function removeAllCursorChildren():void {
var children:IChildList = this.cursorObjectHolder.rawChildren;
while (children.numChildren != 0) {
children.removeChildAt(children.numChildren - 1);
}
}
public function textToolbarSyncProxy(tobj:TextObject):void {
textToolbar.syncPropsWith(tobj);
}
@ -341,12 +358,21 @@ package org.bigbluebutton.modules.whiteboard.views {
//if (e.whiteboardId == currentWhiteboardId) {
whiteboardToolbar.whiteboardAccessModified(e.multiUser);
canvasModel.multiUserChange(e.multiUser);
if (!e.multiUser) {
canvasDisplayModel.clearCursors();
}
//}
}
private function onReceivedCursorPosition(e:WhiteboardCursorEvent):void {
var user:User2x = UsersUtil.getUser(e.userId);
// only draw the cursor if the user exists and it's in multiuser mode or they are the presenter
if (user && (LiveMeeting.inst().whiteboardModel.multiUser || user.presenter)) {
canvasDisplayModel.drawCursor(e.userId, e.xPercent, e.yPercent);
}
}
private function onEnableWhiteboardEvent(e:WhiteboardButtonEvent):void {
e.stopPropagation();
@ -360,7 +386,7 @@ package org.bigbluebutton.modules.whiteboard.views {
stopDrawing();
removeCursor()
removeCursor();
this.whiteboardEnabled = false;
setWhiteboardInteractable();

View File

@ -60,6 +60,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
import org.bigbluebutton.modules.whiteboard.events.StopWhiteboardModuleEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardAccessEvent;
import org.bigbluebutton.modules.whiteboard.events.WhiteboardButtonEvent;
import org.bigbluebutton.modules.whiteboard.models.AnnotationType;
import org.bigbluebutton.modules.whiteboard.views.models.WhiteboardOptions;
import org.bigbluebutton.util.i18n.ResourceUtil;
@ -96,9 +97,13 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
changeThickness();
changeColor();
}
penOnlyMultiUser();
}
public function setCanvas(c:WhiteboardCanvas):void {
wbOptions = Options.getOptions(WhiteboardOptions) as WhiteboardOptions;
canvas = c;
if (cpik) {
@ -199,7 +204,6 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
}
public function positionToolbar(container:MDIWindow):void {
wbOptions = Options.getOptions(WhiteboardOptions) as WhiteboardOptions;
LOGGER.debug("Positioning whiteboard toolbar");
containerToOverlay = container;
containerToOverlay.addEventListener(MoveEvent.MOVE, setPositionAndDepth);
@ -229,10 +233,12 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
} else {
hideToolbar();
}
if (multiUser && wbOptions.onlyPenMUW) {
scribbleBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
} else if (!multiUser) {
penOnlyMultiUser();
}
private function penOnlyMultiUser() : void {
if (multiUser && wbOptions.onlyPenMUW && !isPresenter) {
setToolType(WhiteboardConstants.TYPE_SHAPE, AnnotationType.PENCIL);
}
}

13
bigbluebutton-html5/client/main.jsx Normal file → Executable file
View File

@ -2,15 +2,18 @@
import React from 'react';
import { Meteor } from 'meteor/meteor';
import { render } from 'react-dom';
import { log } from '/imports/ui/services/api';
import renderRoutes from '/imports/startup/client/routes';
import logger from '/imports/startup/client/logger';
Meteor.startup(() => {
render(renderRoutes(), document.getElementById('app'));
// Log all uncaught exceptions to the server
// TODO: There is no StackTrace on the ErrorEvent object
// Logs all uncaught exceptions to the client logger
window.addEventListener('error', (e) => {
log('error', e);
const stack = e.error.stack;
let message = e.error.toString();
// Checks if stack includes the message, if not add the two together.
(stack.includes(message)) ? message = stack : message += `\n${stack}`;
logger.error(message);
});
});

View File

@ -2,8 +2,10 @@ import _ from 'lodash';
import VoiceUsers from '/imports/api/voice-users';
import { Tracker } from 'meteor/tracker';
import BaseAudioBridge from './base';
import logger from '/imports/startup/client/logger';
import { fetchStunTurnServers } from '/imports/utils/fetchStunTurnServers';
const MEDIA = Meteor.settings.public.media;
const MEDIA_TAG = MEDIA.mediaTag;
const CALL_TRANSFER_TIMEOUT = MEDIA.callTransferTimeout;
@ -379,7 +381,7 @@ export default class SIPBridge extends BaseAudioBridge {
await audioContext.setSinkId(value);
this.media.outputDeviceId = value;
} catch (err) {
console.error(err);
logger.error(err);
throw new Error(this.baseErrorCodes.MEDIA_ERROR);
}
}

View File

@ -7,23 +7,19 @@ const logClient = function (type, log, ...args) {
const logContents = { ...args };
if (User) {
const {
meetingId, name, intId, extId, authToken,
} = User;
const serverInfo = {
meetingId,
userName: name,
userIntId: intId,
userExtId: extId,
authToken,
};
logContents.serverInfo = serverInfo;
if (User.meetingId === args[0].meetingId) {
args[0].validUser = 'vaild';
} else {
args[0].validUser = 'invaild';
}
} else {
args[0].validUser = 'notFound';
}
if (typeof log === 'string' || log instanceof String) {
Logger.log(type, `CLIENT LOG: ${log}\n`, logContents);
Logger.log(type, `CLIENT LOG: ${log}`, logContents);
} else {
Logger.log(type, `CLIENT LOG: ${JSON.stringify(log)}\n`, logContents);
Logger.log(type, `CLIENT LOG: ${JSON.stringify(log)}`, logContents);
}
};

View File

@ -3,6 +3,7 @@ import SessionStorage from '/imports/ui/services/storage/session';
import { setCustomLogoUrl } from '/imports/ui/components/user-list/service';
import { log } from '/imports/ui/services/api';
import deviceInfo from '/imports/utils/deviceInfo';
import logger from '/imports/startup/client/logger';
// disconnected and trying to open a new connection
const STATUS_CONNECTING = 'connecting';
@ -17,6 +18,9 @@ export function joinRouteHandler(nextState, replace, callback) {
callback();
}
// Old credentials stored in memory were being used when joining a new meeting
Auth.clearCredentials();
// use enter api to get params for the client
const url = `/bigbluebutton/api/enter?sessionToken=${sessionToken}`;
@ -24,7 +28,8 @@ export function joinRouteHandler(nextState, replace, callback) {
.then(response => response.json())
.then(({ response }) => {
const {
returncode, meetingID, internalUserID, authToken, logoutUrl, customLogoURL, metadata, customdata
returncode, meetingID, internalUserID, authToken, logoutUrl, customLogoURL, metadata,
externUserID, fullname, confname, customdata,
} = response;
if (returncode === 'FAILED') {
@ -80,13 +85,32 @@ export function joinRouteHandler(nextState, replace, callback) {
SessionStorage.setItem(METADATA_KEY, metakeys);
SessionStorage.setItem(CUSTOM_DATA_KEY, customData);
Auth.set(meetingID, internalUserID, authToken, logoutUrl, sessionToken);
Auth.set(
meetingID, internalUserID, authToken, logoutUrl,
sessionToken, fullname, externUserID, confname,
);
const path = deviceInfo.type().isPhone ? '/' : '/users';
const userInfo = window.navigator;
// Browser information is sent once on startup
// Sent here instead of Meteor.startup, as the
// user might not be validiated by then, thus user's data
// would not be sent with this information
const clientInfo = {
language: userInfo.language,
userAgent: userInfo.userAgent,
screenSize: { width: window.screen.width, height: window.screen.height },
windowSize: { width: window.innerWidth, height: window.innerHeight },
bbbVersion: Meteor.settings.public.app.bbbServerVersion,
location: window.location.href,
};
replace({ pathname: path });
callback();
logger.info(JSON.stringify(clientInfo));
});
}

View File

@ -10,9 +10,13 @@ import LoadingScreen from '/imports/ui/components/loading-screen/component';
import Settings from '/imports/ui/services/settings';
import AudioManager from '/imports/ui/services/audio-manager';
import IntlStartup from './intl';
import logger from '/imports/startup/client/logger';
import Users from '/imports/api/users';
import Annotations from '/imports/api/annotations';
import AnnotationsLocal from '/imports/ui/components/whiteboard/service';
import IntlStartup from './intl';
const propTypes = {
error: PropTypes.object,
@ -42,6 +46,13 @@ class Base extends Component {
this.updateErrorState = this.updateErrorState.bind(this);
}
componentWillUpdate() {
const { approved } = this.props;
const isLoading = this.state.loading;
if (approved && isLoading) this.updateLoadingState(false);
}
updateLoadingState(loading = false) {
this.setState({
loading,
@ -75,7 +86,6 @@ class Base extends Component {
if (loading || !subscriptionsReady) {
return (<LoadingScreen>{loading}</LoadingScreen>);
}
// this.props.annotationsHandler.stop();
return (<AppContainer {...this.props} baseControls={stateControls} />);
@ -117,7 +127,7 @@ const BaseContainer = withRouter(withTracker(({ params, router }) => {
const subscriptionErrorHandler = {
onError: (error) => {
console.error(error);
logger.error(error);
return router.push('/logout');
},
};
@ -142,6 +152,7 @@ const BaseContainer = withRouter(withTracker(({ params, router }) => {
const subscriptionsReady = subscriptionsHandlers.every(handler => handler.ready());
return {
approved: Users.findOne({ userId: Auth.userID, approved: true }) || false,
locale,
subscriptionsReady,
annotationsHandler,

View File

@ -0,0 +1,79 @@
import Auth from '/imports/ui/services/auth';
import { Meteor } from 'meteor/meteor';
import { createLogger, stdSerializers } from 'browser-bunyan';
import { ConsoleFormattedStream } from '@browser-bunyan/console-formatted-stream';
import { ConsoleRawStream } from '@browser-bunyan/console-raw-stream';
import { ServerStream } from '@browser-bunyan/server-stream';
import { nameFromLevel } from '@browser-bunyan/levels';
// The logger accepts "console","server", and "external" as targets
// Multiple targets can be set as an array in the settings under public.log
// To add more targets use the format { "target": "server", "level": "info" },
// and add it to the public.log array
// The accepted levels are "debug", "info", "warn", "error"
// To send to URL, use the format {"target": "external","level": "info",
// "url": "","method": ""}
// externalURL is the end-point that logs will be sent to
// Call the logger by doing a function call with the level name, I.e, logger.warn('Hi on warn')
const LOG_CONFIG = Meteor.settings.public.log || {};
const { fullInfo } = Auth;
// Custom stream that logs to an end-point
class ServerLoggerStream extends ServerStream {
write(rec) {
if (fullInfo.meetingId != null) {
rec.clientInfo = fullInfo;
}
return super.write(rec);
}
}
// Custom stream to log to the meteor server
class MeteorStream {
write(rec) {
if (fullInfo.meetingId != null) {
Meteor.call('logClient', nameFromLevel[rec.level], rec.msg, fullInfo);
} else {
Meteor.call('logClient', nameFromLevel[rec.level], rec.msg);
}
}
}
function createStreamForTarget(target, options) {
const TARGET_EXTERNAL = 'external';
const TARGET_CONSOLE = 'console';
const TARGET_SERVER = 'server';
let Stream = ConsoleRawStream;
switch (target) {
case TARGET_EXTERNAL:
Stream = ServerLoggerStream;
break;
case TARGET_CONSOLE:
Stream = ConsoleFormattedStream;
break;
case TARGET_SERVER:
Stream = MeteorStream;
break;
}
return new Stream(options);
}
function generateLoggerStreams(config) {
return config.map(({ target, level, ...streamOptions }) => ({
level,
stream: createStreamForTarget(target, streamOptions),
}));
}
// Creates the logger with the array of streams of the chosen targets
const logger = createLogger({
name: 'clientLogger',
streams: generateLoggerStreams(LOG_CONFIG),
serializers: stdSerializers,
src: true,
});
export default logger;

View File

@ -69,10 +69,9 @@ export default withRouter(injectIntl(withModalMounter(withTracker(({ router, int
const currentUser = Users.findOne({ userId: Auth.userID });
const isMeetingBreakout = meetingIsBreakout();
// TODO re-enable to show loading screen while waiting for guest approval
// if (!currentUser.approved) {
// baseControls.updateLoadingState(intl.formatMessage(intlMessages.waitingApprovalMessage));
// }
if (!currentUser.approved) {
baseControls.updateLoadingState(intl.formatMessage(intlMessages.waitingApprovalMessage));
}
// Check if user is removed out of the session
Users.find({ userId: Auth.userID }).observeChanges({

View File

@ -83,9 +83,6 @@ class NavBar extends Component {
this.props.toggleUserList();
}
shouldComponentUpdate(nextProps) {
return nextProps.breakouts.length !== this.props.breakouts.length;
}
componentDidUpdate(oldProps) {
const {
breakouts,

View File

@ -5,6 +5,7 @@ import Dropzone from 'react-dropzone';
import update from 'immutability-helper';
import cx from 'classnames';
import _ from 'lodash';
import logger from '/imports/startup/client/logger';
import { notify } from '/imports/ui/services/notification';
import ModalFullscreen from '/imports/ui/components/modal/fullscreen/component';
@ -203,7 +204,7 @@ class PresentationUploader extends Component {
.catch((error) => {
notify(this.props.intl.formatMessage(intlMessages.genericError), 'error');
console.error(error);
logger.error(error);
this.setState({
disableActions: false,

View File

@ -3,6 +3,8 @@ import { defineMessages, injectIntl } from 'react-intl';
import { log } from '/imports/ui/services/api';
import { notify } from '/imports/ui/services/notification';
import VisibilityEvent from '/imports/utils/visibilityEvent';
import logger from '/imports/startup/client/logger';
import VideoService from './service';
import VideoList from './video-list/component';
import { fetchWebRTCMappedStunTurnServers } from '/imports/utils/fetchStunTurnServers';
@ -248,7 +250,7 @@ class VideoProvider extends Component {
log('info', `Sending message: ${jsonMessage}`);
ws.send(jsonMessage, (error) => {
if (error) {
console.error(`client: Websocket error "${error}" on message "${jsonMessage.id}"`);
logger.error(`client: Websocket error "${error}" on message "${jsonMessage.id}"`);
}
});
} else {

View File

@ -3,6 +3,7 @@ import Auth from '/imports/ui/services/auth';
import WhiteboardMultiUser from '/imports/api/whiteboard-multi-user/';
import { AnnotationsStreamer } from '/imports/api/annotations';
import addAnnotationQuery from '/imports/api/annotations/addAnnotation';
import logger from '/imports/startup/client/logger';
import { isEqual } from 'lodash';
const Annotations = new Mongo.Collection(null);
@ -41,7 +42,7 @@ function handleAddedAnnotation({
Annotations.upsert(query.selector, query.modifier, (err) => {
if (err) {
console.error(err);
logger.error(err);
return;
}

View File

@ -5,6 +5,7 @@ import KurentoBridge from '/imports/api/audio/client/bridge/kurento';
import Auth from '/imports/ui/services/auth';
import VoiceUsers from '/imports/api/voice-users';
import SIPBridge from '/imports/api/audio/client/bridge/sip';
import logger from '/imports/startup/client/logger';
import { notify } from '/imports/ui/services/notification';
const MEDIA = Meteor.settings.public.media;
@ -262,7 +263,7 @@ class AudioManager {
this.error = error;
this.notify(this.messages.error[error] || this.messages.error.GENERIC_ERROR, true);
makeCall('failed callStateCallback audio', response);
console.error('Audio Error:', error, bridgeError);
logger.error('Audio Error:', error, bridgeError);
this.exitAudio();
this.onAudioExit();
}

53
bigbluebutton-html5/imports/ui/services/auth/index.js Normal file → Executable file
View File

@ -15,6 +15,9 @@ class Auth {
this._authToken = Storage.getItem('authToken');
this._sessionToken = Storage.getItem('sessionToken');
this._logoutURL = Storage.getItem('logoutURL');
this._confname = Storage.getItem('confname');
this._externUserID = Storage.getItem('externUserID');
this._fullname = Storage.getItem('fullname');
this._loggedIn = {
value: false,
tracker: new Tracker.Dependency(),
@ -66,6 +69,33 @@ class Auth {
return this._logoutURL;
}
set confname(confname) {
this._confname = confname;
Storage.setItem('confname', this._confname);
}
get confname() {
return this._confname;
}
set externUserID(externUserID) {
this._externUserID = externUserID;
Storage.setItem('externUserID', this._externUserID);
}
get externUserID() {
return this._externUserID;
}
set fullname(fullname) {
this._fullname = fullname;
Storage.setItem('fullname', this._fullname);
}
get fullname() {
return this._fullname;
}
get loggedIn() {
this._loggedIn.tracker.depend();
return this._loggedIn.value;
@ -83,15 +113,32 @@ class Auth {
requesterToken: this.token,
logoutURL: this.logoutURL,
sessionToken: this.sessionToken,
fullname: this.fullname,
externUserID: this.externUserID,
confname: this.confname
};
}
set(meetingId, requesterUserId, requesterToken, logoutURL, sessionToken) {
get fullInfo() {
return {
sessionToken: this.sessionToken,
meetingId: this.meetingID,
requesterUserId: this.userID,
fullname: this.fullname,
confname: this.confname,
externUserID: this.externUserID,
};
}
set(meetingId, requesterUserId, requesterToken, logoutURL, sessionToken, fullname, externUserID, confname) {
this.meetingID = meetingId;
this.userID = requesterUserId;
this.token = requesterToken;
this.logoutURL = logoutURL;
this.sessionToken = sessionToken;
this.fullname = fullname;
this.externUserID = externUserID;
this.confname = confname;
}
clearCredentials(...args) {
@ -101,7 +148,9 @@ class Auth {
this.loggedIn = false;
this.logoutURL = null;
this.sessionToken = null;
this.fullname = null;
this.externUserID = null
this.confname = null;
return Promise.resolve(...args);
}

View File

@ -3,6 +3,32 @@
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"@browser-bunyan/console-formatted-stream": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@browser-bunyan/console-formatted-stream/-/console-formatted-stream-1.3.0.tgz",
"integrity": "sha1-PcBZqlwbKnofJuJwbiveuaCbvlc=",
"requires": {
"@browser-bunyan/levels": "1.3.0"
}
},
"@browser-bunyan/console-raw-stream": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@browser-bunyan/console-raw-stream/-/console-raw-stream-1.3.0.tgz",
"integrity": "sha1-zPJLVvImUFgpfGUX++zqhOu3gYw=",
"requires": {
"@browser-bunyan/levels": "1.3.0"
}
},
"@browser-bunyan/levels": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@browser-bunyan/levels/-/levels-1.3.0.tgz",
"integrity": "sha1-oFIwOuXRofm2Pus6lElaL0KfSDE="
},
"@browser-bunyan/server-stream": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@browser-bunyan/server-stream/-/server-stream-1.3.0.tgz",
"integrity": "sha1-U7MlP6T8WA6GrZoWNqA6ISo0W1Y="
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@ -401,6 +427,19 @@
"concat-map": "0.0.1"
}
},
<<<<<<< HEAD
=======
"browser-bunyan": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/browser-bunyan/-/browser-bunyan-1.3.0.tgz",
"integrity": "sha1-JjeNxY16mAAsyb/Pui6l1xJEmZI=",
"requires": {
"@browser-bunyan/console-formatted-stream": "1.3.0",
"@browser-bunyan/console-raw-stream": "1.3.0",
"@browser-bunyan/levels": "1.3.0"
}
},
>>>>>>> 33222e3... Client logger configured
"browser-detect": {
"version": "0.2.28",
"resolved": "https://registry.npmjs.org/browser-detect/-/browser-detect-0.2.28.tgz",

View File

@ -28,7 +28,9 @@
"but Meteor 1.6.0.1 doesn't see it there for some reason",
"need to investigate"
],
"@browser-bunyan/server-stream": "^1.3.0",
"babel-runtime": "~6.26.0",
"browser-bunyan": "^1.3.0",
"browser-detect": "^0.2.28",
"classnames": "~2.2.5",
"clipboard": "~1.7.1",

View File

@ -341,7 +341,11 @@
}
]
}
}
},
"log": [
{ "target": "server", "level": "info" }
]
},
"private": {

View File

@ -28,28 +28,28 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
<constructor-arg index="0" value="stun:stun.freeswitch.org"/>
</bean>
<!--bean id="stun2" claturnturn.StunServer">
<!--bean id="stun2" class="org.bigbluebutton.web.services.turn.StunServer">
<constructor-arg index="0" value="stun:stun2.example.com"/>
</bean-->
<!--bean id="iceCandidate1" claturnturn.RemoteIceCandidate">
<!--bean id="iceCandidate1" class="org.bigbluebutton.web.services.turn.RemoteIceCandidate">
<constructor-arg index="0" value="192.168.0.1"/>
</bean-->
<!-- Turn servers are configured with a secret that's compatible with
http://tools.ietf.org/html/draft-uberti-behorg.bigbluebutton.web.services.turnturn-rest-00
as supported by the coturn and rfc5org.bigbluebutton.web.services.turnturn-serorg.bigbluebutton.web.services.turnturn servers -->
http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00
as supported by the coturn and rfc5766-turn-server turn servers -->
<!--bean id="turn1" claturnturn.TurnServer">
<!--bean id="turn1" class="org.bigbluebutton.web.services.turn.TurnServer">
Secret:
<constructor-arg index="0" value="secret"/>
TURN server URL, org.bigbluebutton.web.services.turnturn: or turns:
<constructor-arg index="1" valorg.bigbluebutton.web.services.turnturn:turn1.example.com"/>
TURN server URL, use turn: or turns:
<constructor-arg index="1" value="turn:turn1.example.com"/>
TTL in seconds for shared secret
<constructor-arg index="2" value="86400"/>
</bean-->
<!--bean id="turn2" claturnturn.TurnServer">
<!--bean id="turn2" class="org.bigbluebutton.web.services.turn.TurnServer">
<constructor-arg index="0" value="secret"/>
<constructor-arg index="1" value="turns:turn2.example.com:443"/>
<constructor-arg index="2" value="86400"/>