diff --git a/js/conversation_controller.js b/js/conversation_controller.js index 51d22b02b7..9171a3925d 100644 --- a/js/conversation_controller.js +++ b/js/conversation_controller.js @@ -109,8 +109,18 @@ type: type }); conversation.initialPromise = new Promise(function(resolve, reject) { - var deferred = conversation.save(); + if (!conversation.isValid()) { + var validationError = conversation.validationError || {}; + console.log( + 'Contact is not valid. Not saving, but adding to collection:', + conversation.idForLogging(), + validationError.stack + ); + return resolve(conversation); + } + + var deferred = conversation.save(); if (!deferred) { console.log('Conversation save failed! ', id, type); return reject(new Error('getOrCreate: Conversation save failed')); diff --git a/libtextsecure/api.js b/libtextsecure/api.js index d6836bcc8a..38fd0a6dcc 100644 --- a/libtextsecure/api.js +++ b/libtextsecure/api.js @@ -76,7 +76,8 @@ var TextSecureServer = (function() { } if (options.user && options.password) { - fetchOptions.headers["Authorization"] = "Basic " + btoa(getString(options.user) + ":" + getString(options.password)); + fetchOptions.headers["Authorization"] = + "Basic " + btoa(getString(options.user) + ":" + getString(options.password)); } if (options.contentType) { fetchOptions.headers["Content-Type"] = options.contentType; @@ -93,13 +94,21 @@ var TextSecureServer = (function() { } return resultPromise.then(function(result) { if (options.responseType === 'arraybuffer') { - result = result.buffer.slice(result.byteOffset, result.byteOffset + result.byteLength); + result = result.buffer.slice( + result.byteOffset, + result.byteOffset + result.byteLength + ); } if (options.responseType === 'json') { if (options.validateResponse) { if (!validateResponse(result, options.validateResponse)) { console.log(options.type, url, response.status, 'Error'); - reject(HTTPError(response.status, result, options.stack)); + reject(HTTPError( + 'promise_ajax: invalid response', + response.status, + result, + options.stack + )); } } } @@ -108,13 +117,18 @@ var TextSecureServer = (function() { resolve(result, response.status); } else { console.log(options.type, url, response.status, 'Error'); - reject(HTTPError(response.status, result, options.stack)); + reject(HTTPError( + 'promise_ajax: error response', + response.status, + result, + options.stack + )); } }); }).catch(function(e) { console.log(options.type, url, 0, 'Error'); - console.log(e); - reject(HTTPError(0, e.toString(), options.stack)); + var stack = e.stack + '\nInitial stack:\n' + options.stack; + reject(HTTPError('promise_ajax catch', 0, e.toString(), stack)); }); }); } @@ -141,14 +155,14 @@ var TextSecureServer = (function() { return retry_ajax(url, options); } - function HTTPError(code, response, stack) { + function HTTPError(message, code, response, stack) { if (code > 999 || code < 100) { code = -1; } - var e = new Error(); + var e = new Error(message + '; code: ' + code); e.name = 'HTTPError'; e.code = code; - e.stack = stack; + e.stack += '\nOriginal stack:\n' + stack; if (response) { e.response = response; }