Browse Source

Implemented user id integration in setting (register, logout).

pull/28/head
Simon Eisenmann 11 years ago
parent
commit
2bdc6c8b1a
  1. 74
      static/js/controllers/mediastreamcontroller.js
  2. 37
      static/js/directives/settings.js
  3. 9
      static/js/mediastream/connector.js
  4. 46
      static/js/services/mediastream.js
  5. 15
      static/partials/settings.html

74
static/js/controllers/mediastreamcontroller.js

@ -154,7 +154,6 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'webrtc.adapter'], function @@ -154,7 +154,6 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'webrtc.adapter'], function
language: ""
}
};
$scope.withStoredLogin = false;
// Data voids.
var cache = {};
@ -390,73 +389,20 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'webrtc.adapter'], function @@ -390,73 +389,20 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'webrtc.adapter'], function
}
}
// Support authentication.
// Support authentication from localStorage.
if (!data.Userid && mediaStream.config.UsersEnabled) {
var key = mediaStream.config.Token;
// Check if we have something in store.
var login = localStorage.getItem("mediastream-login");
if (login) {
safeApply($scope, function(scope) {
scope.withStoredLogin = true;
});
try {
login = sjcl.decrypt(key, login);
login = JSON.parse(login)
} catch(err) {
console.error("Failed to parse login data", err);
login = {};
}
// Check if we can load a user.
var login = mediaStream.users.load();
if (login !== null) {
console.log("Trying to authorize with stored credentials ...");
switch (login.v) {
case 1:
var useridCombo = login.a;
var secret = login.b;
var expiry = login.t;
if (useridCombo && secret) {
mediaStream.users.authorize(useridCombo, secret, function(data) {
console.info("Retrieved nonce - authenticating as user:", data.userid);
mediaStream.api.requestAuthentication(data.userid, data.nonce);
delete data.nonce;
}, function(data, status) {
console.error("Failed to authorize session", status, data);
});
}
break;
default:
console.warn("Unknown stored credentials", login.v);
break
}
}
if (!login && mediaStream.config.UsersAllowRegistration) {
console.log("No userid - creating one ...");
mediaStream.users.register(function(data) {
console.info("Created new userid:", data.userid);
if (data.nonce) {
// If the server provided us a nonce, we can do everthing on our own.
// So we store the stuff in localStorage for later use and directly
// authenticate ourselves with the provided nonce.
var login = sjcl.encrypt(key, JSON.stringify({
v: 1,
t: data.timestamp || "",
a: data.useridcombo,
b: data.secret,
}));
localStorage.setItem("mediastream-login", login);
mediaStream.api.requestAuthentication(data.userid, data.nonce);
delete data.nonce;
} else {
// No nonce received. So this means something we cannot do on our own.
// Make are GET request and retrieve nonce that way and let the
// browser/server do the rest.
// TODO(longsleep): Implement me.
}
mediaStream.users.authorize(login, function(data) {
console.info("Retrieved nonce - authenticating as user:", data.userid);
mediaStream.api.requestAuthentication(data.userid, data.nonce);
delete data.nonce;
}, function(data, status) {
console.error("Failed to create userid", status, data);
console.error("Failed to authorize session", status, data);
});
}
}
// Support to upgrade stuff when ttl was reached.
@ -466,6 +412,7 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'webrtc.adapter'], function @@ -466,6 +412,7 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'webrtc.adapter'], function
mediaStream.api.sendSelf();
}, data.Turn.ttl / 100 * 90 * 1000);
}
// Support resurrection shrine.
if (resurrect) {
var resurrection = resurrect;
@ -478,6 +425,7 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'webrtc.adapter'], function @@ -478,6 +425,7 @@ define(['underscore', 'bigscreen', 'moment', 'sjcl', 'webrtc.adapter'], function
}
}, 0);
}
});
mediaStream.webrtc.e.on("peercall", function(event, peercall) {

37
static/js/directives/settings.js

@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
*/
define(['underscore', 'text!partials/settings.html'], function(_, template) {
return ["$compile", function($compile) {
return ["$compile", "mediaStream", function($compile, mediaStream) {
var controller = ['$scope', 'desktopNotify', 'mediaSources', 'safeApply', 'availableLanguages', 'translation', function($scope, desktopNotify, mediaSources, safeApply, availableLanguages, translation) {
@ -37,6 +37,9 @@ define(['underscore', 'text!partials/settings.html'], function(_, template) { @@ -37,6 +37,9 @@ define(['underscore', 'text!partials/settings.html'], function(_, template) {
name: translation._("Use browser language")
}
];
$scope.withUsers = mediaStream.config.UsersEnabled;
$scope.withUsersRegistration = mediaStream.config.UsersAllowRegistration;
_.each(availableLanguages, function(name, code) {
$scope.availableLanguages.push({
code: code,
@ -120,9 +123,39 @@ define(['underscore', 'text!partials/settings.html'], function(_, template) { @@ -120,9 +123,39 @@ define(['underscore', 'text!partials/settings.html'], function(_, template) {
$scope.showTakePicture = false;
safeApply($scope);
}
}
};
$scope.registerUserid = function() {
console.log("No userid - creating one ...");
mediaStream.users.register(function(data) {
console.info("Created new userid:", data.userid);
if (data.nonce) {
// If the server provided us a nonce, we can do everthing on our own.
mediaStream.users.store(data);
// Directly authenticate ourselves with the provided nonce.
mediaStream.api.requestAuthentication(data.userid, data.nonce);
delete data.nonce;
} else {
// No nonce received. So this means something we cannot do on our own.
// Make are GET request and retrieve nonce that way and let the
// browser/server do the rest.
// TODO(longsleep): Implement me.
}
}, function(data, status) {
console.error("Failed to create userid", status, data);
});
};
$scope.forgetUserid = function() {
mediaStream.users.forget();
mediaStream.connector.forgetAndReconnect();
};
$scope.checkDefaultMediaSources = function() {
if ($scope.master.settings.microphoneId && !$scope.mediaSources.hasAudioId($scope.master.settings.microphoneId)) {
$scope.master.settings.microphoneId=null;

9
static/js/mediastream/connector.js

@ -111,6 +111,15 @@ define(['jquery', 'underscore', 'ua-parser'], function($, _, uaparser) { @@ -111,6 +111,15 @@ define(['jquery', 'underscore', 'ua-parser'], function($, _, uaparser) {
};
Connector.prototype.forgetAndReconnect = function() {
this.token = null;
if (this.conn && this.connected) {
this.conn.close();
}
};
Connector.prototype.room = function(roomid, cb) {
var was_connected = this.connected;

46
static/js/services/mediastream.js

@ -40,6 +40,9 @@ define([ @@ -40,6 +40,9 @@ define([
var api = new Api(connector);
var webrtc = new WebRTC(api);
// TODO(longsleep): Add client side part into this key.
var secureKey = context.Cfg.Token;
var mediaStream = {
version: version,
ws: url,
@ -88,18 +91,21 @@ define([ @@ -88,18 +91,21 @@ define([
}
});
},
authorize: function(useridCombo, secret, success_cb, error_cb) {
authorize: function(data, success_cb, error_cb) {
var url = mediaStream.url.api("sessions") + "/" + mediaStream.api.id + "/";
var data = {
/*var data = {
id: mediaStream.api.id,
sid: mediaStream.api.sid,
useridcombo: useridCombo,
secret: secret
}
}*/
var login = _.clone(data);
login.id = mediaStream.api.id;
login.sid = mediaStream.api.sid;
$http({
method: "PATCH",
url: url,
data: JSON.stringify(data),
data: JSON.stringify(login),
headers: {'Content-Type': 'application/json'}
}).
success(function(data, status) {
@ -116,6 +122,38 @@ define([ @@ -116,6 +122,38 @@ define([
error_cb(data, status)
}
});
},
store: function(data) {
// So we store the stuff in localStorage for later use.
var store = _.clone(data);
store.v = 42; // No idea what number - so use 42.
var login = sjcl.encrypt(secureKey, JSON.stringify(store));
localStorage.setItem("mediastream-login", login);
return login;
},
load: function() {
// Check if we have something in store.
var login = localStorage.getItem("mediastream-login");
if (login) {
try {
login = sjcl.decrypt(secureKey, login);
login = JSON.parse(login)
} catch(err) {
console.error("Failed to parse stored login data", err);
login = {};
}
switch (login.v) {
case 42:
return login;
default:
console.warn("Unknown stored credentials", login.v);
break
}
}
return null;
},
forget: function() {
localStorage.removeItem("mediastream-login");
}
},
initialize: function($rootScope, translation) {

15
static/partials/settings.html

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<div class="form-group">
<label class="col-xs-4 control-label">{{_('Your picture')}}</label>
<div class="col-xs-8">
<label style="padding-top:5px">
<label>
<div style="margin-bottom:5px">
<img ng-show="user.buddyPicture" ng-src="{{user.buddyPicture}}" alt="" />
</div>
@ -26,6 +26,19 @@ @@ -26,6 +26,19 @@
<span class="help-block">{{_('Your picture and name are visible to others.')}}</span>
</div>
</div>
<div class="form-group" ng-if="withUsers || userid">
<label class="col-xs-4 control-label">{{_('Your ID')}} {{serverCfg|json}}</label>
<div class="col-xs-8">
<label ng-if="!userid && withUsersRegistration">
<a class="btn btn-small btn-primary" ng-click="registerUserid()">{{_('Register')}}</a>
</label>
<span class="help-block" ng-if="!userid && withUsersRegistration">{{_('Only register an ID if this is your private browser.')}}</span>
<pre class="small" ng-if="userid">{{userid}}</pre>
<label ng-if="userid">
<a class="btn btn-small btn-default" ng-click="forgetUserid()">{{_('Log out')}}</a>
</label>
</div>
</div>
<hr/>
<div ng-show="mediaSources.supported" class="form-group">
<label class="col-xs-4 control-label">{{_('Microphone')}}</label>

Loading…
Cancel
Save