summaryrefslogtreecommitdiffstats
path: root/remoting
diff options
context:
space:
mode:
authorsimonmorris@chromium.org <simonmorris@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-13 00:16:30 +0000
committersimonmorris@chromium.org <simonmorris@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-13 00:16:30 +0000
commitf03c94972c592f522f12ab6d005f5cee26030c25 (patch)
treef1e38b51359d49fb88b87024ff4c15432b541c51 /remoting
parent4ca0c4e4ad2f96025b4f758ee66a6722de0c752f (diff)
downloadchromium_src-f03c94972c592f522f12ab6d005f5cee26030c25.zip
chromium_src-f03c94972c592f522f12ab6d005f5cee26030c25.tar.gz
chromium_src-f03c94972c592f522f12ab6d005f5cee26030c25.tar.bz2
The chromoting client logs a session ID to the server,
instead of a per-install ID. BUG=106208 TEST=none Review URL: http://codereview.chromium.org/8893015 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@114127 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting')
-rw-r--r--remoting/webapp/me2mom/log_to_server.js114
-rw-r--r--remoting/webapp/me2mom/server_log_entry.js48
2 files changed, 125 insertions, 37 deletions
diff --git a/remoting/webapp/me2mom/log_to_server.js b/remoting/webapp/me2mom/log_to_server.js
index 48f21b2..e0cd4f7 100644
--- a/remoting/webapp/me2mom/log_to_server.js
+++ b/remoting/webapp/me2mom/log_to_server.js
@@ -20,20 +20,29 @@ remoting.LogToServer = function() {
this.pendingEntries = [];
/** @type {remoting.StatsAccumulator} */
this.statsAccumulator = new remoting.StatsAccumulator();
+ /** @type string */
+ this.sessionId = '';
+ /** @type number */
+ this.sessionIdGenerationTime = 0;
};
-// Local storage keys.
+// Local storage key.
/** @private */
-remoting.LogToServer.prototype.KEY_ENABLED_ = 'remoting.LogToServer.enabled';
-/** @private */
-remoting.LogToServer.prototype.KEY_ID_ = 'remoting.LogToServer.id';
+remoting.LogToServer.KEY_ENABLED_ = 'remoting.LogToServer.enabled';
-// Constants used for generating an ID.
+// Constants used for generating a session ID.
/** @private */
-remoting.LogToServer.prototype.ID_ALPHABET_ =
+remoting.LogToServer.SESSION_ID_ALPHABET_ =
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
/** @private */
-remoting.LogToServer.prototype.ID_LEN_ = 20;
+remoting.LogToServer.SESSION_ID_LEN_ = 20;
+
+// The maximum age of a session ID, in milliseconds.
+remoting.LogToServer.MAX_SESSION_ID_AGE = 24 * 60 * 60 * 1000;
+
+// The time over which to accumulate connection statistics before logging them
+// to the server, in milliseconds.
+remoting.LogToServer.CONNECTION_STATS_ACCUMULATE_TIME = 60 * 1000;
/**
* Enables or disables logging.
@@ -41,7 +50,8 @@ remoting.LogToServer.prototype.ID_LEN_ = 20;
* @param {boolean} enabled whether logging is enabled
*/
remoting.LogToServer.prototype.setEnabled = function(enabled) {
- window.localStorage.setItem(this.KEY_ENABLED_, enabled ? 'true' : 'false');
+ window.localStorage.setItem(remoting.LogToServer.KEY_ENABLED_,
+ enabled ? 'true' : 'false');
}
/**
@@ -52,16 +62,31 @@ remoting.LogToServer.prototype.setEnabled = function(enabled) {
*/
remoting.LogToServer.prototype.logClientSessionStateChange =
function(state, connectionError) {
+ this.maybeExpireSessionId();
+ // Maybe set the session ID.
+ if ((state == remoting.ClientSession.State.CONNECTING) ||
+ (state == remoting.ClientSession.State.INITIALIZING) ||
+ (state == remoting.ClientSession.State.CONNECTED)) {
+ if (this.sessionId == '') {
+ this.setSessionId();
+ }
+ }
+ // Log the session state change.
var entry = remoting.ServerLogEntry.makeClientSessionStateChange(
state, connectionError);
entry.addHostFields();
entry.addChromeVersionField();
entry.addWebappVersionField();
- entry.addIdField(this.getId());
+ entry.addSessionIdField(this.sessionId);
this.log(entry);
// Don't accumulate connection statistics across state changes.
this.logAccumulatedStatistics();
this.statsAccumulator.empty();
+ // Maybe clear the session ID.
+ if ((state == remoting.ClientSession.State.CLOSED) ||
+ (state == remoting.ClientSession.State.CONNECTION_FAILED)) {
+ this.clearSessionId();
+ }
};
/**
@@ -69,11 +94,13 @@ remoting.LogToServer.prototype.logClientSessionStateChange =
* @param {Object.<string, number>} stats the connection statistics
*/
remoting.LogToServer.prototype.logStatistics = function(stats) {
+ this.maybeExpireSessionId();
// Store the statistics.
this.statsAccumulator.add(stats);
// Send statistics to the server if they've been accumulating for at least
// 60 seconds.
- if (this.statsAccumulator.getTimeSinceFirstValue() >= 60 * 1000) {
+ if (this.statsAccumulator.getTimeSinceFirstValue() >=
+ remoting.LogToServer.CONNECTION_STATS_ACCUMULATE_TIME) {
this.logAccumulatedStatistics();
}
};
@@ -92,7 +119,7 @@ remoting.LogToServer.prototype.logAccumulatedStatistics = function() {
entry.addHostFields();
entry.addChromeVersionField();
entry.addWebappVersionField();
- entry.addIdField(this.getId());
+ entry.addSessionIdField(this.sessionId);
this.log(entry);
}
this.statsAccumulator.empty();
@@ -137,43 +164,66 @@ remoting.LogToServer.prototype.log = function(entry) {
* @return {boolean} whether logging is enabled
*/
remoting.LogToServer.prototype.isEnabled = function() {
- var value = window.localStorage.getItem(this.KEY_ENABLED_);
+ var value = window.localStorage.getItem(remoting.LogToServer.KEY_ENABLED_);
return (value == 'true');
};
/**
- * Gets an ID from local storage.
+ * Sets the session ID to a random string.
*
- * This function returns the empty string if logging is disabled.
- * If logging is enabled, and there is no ID in local storage, then this
- * function will create and store an ID.
+ * @private
+ */
+remoting.LogToServer.prototype.setSessionId = function() {
+ this.sessionId = remoting.LogToServer.generateSessionId();
+ this.sessionIdGenerationTime = new Date().getTime();
+};
+
+/**
+ * Clears the session ID.
*
* @private
- * @return {string} an ID, or the empty string
*/
-remoting.LogToServer.prototype.getId = function() {
- if (!this.isEnabled()) {
- return '';
- }
- var id = window.localStorage.getItem(this.KEY_ID_);
- if ((!id) || (typeof id != 'string')) {
- id = this.generateId();
- window.localStorage.setItem(this.KEY_ID_, id);
+remoting.LogToServer.prototype.clearSessionId = function() {
+ this.sessionId = '';
+ this.sessionIdGenerationTime = 0;
+};
+
+/**
+ * Sets a new session ID, if the current session ID has reached its maximum age.
+ *
+ * This method also logs the old and new session IDs to the server, in separate
+ * log entries.
+ *
+ * @private
+ */
+remoting.LogToServer.prototype.maybeExpireSessionId = function() {
+ if ((this.sessionId != '') &&
+ (new Date().getTime() - this.sessionIdGenerationTime >=
+ remoting.LogToServer.MAX_SESSION_ID_AGE)) {
+ // Log the old session ID.
+ var entry = remoting.ServerLogEntry.makeSessionIdOld(this.sessionId);
+ this.log(entry);
+ // Generate a new session ID.
+ this.setSessionId();
+ // Log the new session ID.
+ entry = remoting.ServerLogEntry.makeSessionIdNew(this.sessionId);
+ this.log(entry);
}
- return id.toString();
};
/**
- * Generates an ID.
+ * Generates a string that can be used as a session ID.
*
* @private
- * @return {string} an ID
+ * @return {string} a session ID
*/
-remoting.LogToServer.prototype.generateId = function() {
+remoting.LogToServer.generateSessionId = function() {
var idArray = [];
- for (var i = 0; i < this.ID_LEN_; i++) {
- var index = Math.random() * this.ID_ALPHABET_.length;
- idArray.push(this.ID_ALPHABET_.slice(index, index + 1));
+ for (var i = 0; i < remoting.LogToServer.SESSION_ID_LEN_; i++) {
+ var index =
+ Math.random() * remoting.LogToServer.SESSION_ID_ALPHABET_.length;
+ idArray.push(
+ remoting.LogToServer.SESSION_ID_ALPHABET_.slice(index, index + 1));
}
return idArray.join('');
};
diff --git a/remoting/webapp/me2mom/server_log_entry.js b/remoting/webapp/me2mom/server_log_entry.js
index a8755b9..29178bc 100644
--- a/remoting/webapp/me2mom/server_log_entry.js
+++ b/remoting/webapp/me2mom/server_log_entry.js
@@ -27,7 +27,7 @@ remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_STATE_ =
'session-state';
/** @private */
-remoting.ServerLogEntry.KEY_ID_ = 'id';
+remoting.ServerLogEntry.KEY_SESSION_ID_ = 'session-id';
/** @private */
remoting.ServerLogEntry.KEY_ROLE_ = 'role';
@@ -132,6 +132,12 @@ remoting.ServerLogEntry.KEY_BROWSER_VERSION_ = 'browser-version';
/** @private */
remoting.ServerLogEntry.KEY_WEBAPP_VERSION_ = 'webapp-version';
+/** @private */
+remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_OLD_ = 'session-id-old';
+
+/** @private */
+remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_NEW_ = 'session-id-new';
+
/**
* Sets one field in this log entry.
*
@@ -249,12 +255,44 @@ remoting.ServerLogEntry.prototype.addStatsField = function(
};
/**
- * Adds an ID field to this log entry.
+ * Makes a log entry for a "this session ID is old" event.
+ *
+ * @param {string} sessionId
+ * @return {remoting.ServerLogEntry}
+ */
+remoting.ServerLogEntry.makeSessionIdOld = function(sessionId) {
+ var entry = new remoting.ServerLogEntry();
+ entry.set(remoting.ServerLogEntry.KEY_ROLE_,
+ remoting.ServerLogEntry.VALUE_ROLE_CLIENT_);
+ entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_,
+ remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_OLD_);
+ entry.addSessionIdField(sessionId);
+ return entry;
+};
+
+/**
+ * Makes a log entry for a "this session ID is new" event.
+ *
+ * @param {string} sessionId
+ * @return {remoting.ServerLogEntry}
+ */
+remoting.ServerLogEntry.makeSessionIdNew = function(sessionId) {
+ var entry = new remoting.ServerLogEntry();
+ entry.set(remoting.ServerLogEntry.KEY_ROLE_,
+ remoting.ServerLogEntry.VALUE_ROLE_CLIENT_);
+ entry.set(remoting.ServerLogEntry.KEY_EVENT_NAME_,
+ remoting.ServerLogEntry.VALUE_EVENT_NAME_SESSION_ID_NEW_);
+ entry.addSessionIdField(sessionId);
+ return entry;
+};
+
+/**
+ * Adds a session ID field to this log entry.
*
- * @param {string} id
+ * @param {string} sessionId
*/
-remoting.ServerLogEntry.prototype.addIdField = function(id) {
- this.set(remoting.ServerLogEntry.KEY_ID_, id);
+remoting.ServerLogEntry.prototype.addSessionIdField = function(sessionId) {
+ this.set(remoting.ServerLogEntry.KEY_SESSION_ID_, sessionId);
}
/**