diff --git a/www/i18n/locale-en-GB.json b/www/i18n/locale-en-GB.json
index aa553025..f44dd03c 100644
--- a/www/i18n/locale-en-GB.json
+++ b/www/i18n/locale-en-GB.json
@@ -764,6 +764,7 @@
"NOT_NEED_MEMBERSHIP": "Already a member.",
"IDENTITY_WILL_MISSING_CERTIFICATIONS": "This identity will soon lack certification (at least {{willNeedCertificationCount}}).",
"IDENTITY_NEED_MEMBERSHIP": "This identity did not send a membership request. She will have to if she wishes to become a member.",
+ "HAS_ALTERNATIVE_IDENTITIES": "There are multiple identities attached to this public key. Before any certification, please check other identities to choose the correct one, or contact the wallet owner.",
"REVOCATION_SENT": "Revocation sent successfully",
"REVOCATION_SENT_WAITING_PROCESS": "Revocation has been sent successfully. It is awaiting processing.",
"FEATURES_NOT_IMPLEMENTED": "This features is not implemented yet.
Why not to contribute to get it faster? ;)",
diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json
index 63f29844..fa6e5bdc 100644
--- a/www/i18n/locale-en.json
+++ b/www/i18n/locale-en.json
@@ -764,6 +764,7 @@
"NOT_NEED_MEMBERSHIP": "Already a member.",
"IDENTITY_WILL_MISSING_CERTIFICATIONS": "This identity will soon lack certification (at least {{willNeedCertificationCount}}).",
"IDENTITY_NEED_MEMBERSHIP": "This identity did not send a membership request. She will have to if she wishes to become a member.",
+ "HAS_ALTERNATIVE_IDENTITIES": "There are multiple identities attached to this public key. Before any certification, please check other identities to choose the correct one, or contact the wallet owner.",
"REVOCATION_SENT": "Revocation sent successfully",
"REVOCATION_SENT_WAITING_PROCESS": "Revocation has been sent successfully. It is awaiting processing.",
"FEATURES_NOT_IMPLEMENTED": "This features is not implemented yet.
Why not to contribute to get it faster? ;)",
diff --git a/www/i18n/locale-es-ES.json b/www/i18n/locale-es-ES.json
index 694cace4..79153762 100644
--- a/www/i18n/locale-es-ES.json
+++ b/www/i18n/locale-es-ES.json
@@ -713,6 +713,7 @@
"NOT_NEED_MEMBERSHIP": "Ya es miembro.",
"IDENTITY_WILL_MISSING_CERTIFICATIONS": "Esta identidad pronto va a necesitar certificaciones (al menos {{willNeedCertificationCount}}).",
"IDENTITY_NEED_MEMBERSHIP": "Esta identidad no envió una solicitud de membresía. Ella tendrá que hacerlo si desea hacerse miembro.",
+ "HAS_ALTERNATIVE_IDENTITIES": "Hay identidades múltiples adjuntas a esta clave pública. Antes de cualquier certificación, verifique otras identidades para elegir la correcta o comuníquese con el propietario de la cuenta.",
"REVOCATION_SENT": "Revocación enviada",
"REVOCATION_SENT_WAITING_PROCESS": "La revocación de esta identidad fue solicitada y está en espera de ser procesada.",
"FEATURES_NOT_IMPLEMENTED": "Esta funcionalidad todavía está en proceso de desarrollo.
¿Por qué no contribuir a Cesium, para obtenerla más rápido? ;)",
diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json
index e5a8917a..3fae4074 100644
--- a/www/i18n/locale-fr-FR.json
+++ b/www/i18n/locale-fr-FR.json
@@ -764,6 +764,7 @@
"NOT_NEED_MEMBERSHIP": "Vous êtes déjà membre.",
"IDENTITY_WILL_MISSING_CERTIFICATIONS": "Cette identité va bientôt manquer de certification (au moins {{willNeedCertificationCount}}).",
"IDENTITY_NEED_MEMBERSHIP": "Cette identité n'a pas envoyée de demande d'adhésion. Elle devra si elle souhaite devenir membre.",
+ "HAS_ALTERNATIVE_IDENTITIES": "Il existe plusieurs identités rattachées à cette clé publique. Avant toute certification, pensez à consulter les autres identités pour choisir la bonne, ou bien contacter le propriétaire du compte.",
"REVOCATION_SENT": "Revocation envoyée",
"REVOCATION_SENT_WAITING_PROCESS": "La révocation de cette identité a été demandée et est en attente de traitement.",
"FEATURES_NOT_IMPLEMENTED": "Cette fonctionnalité est encore en cours de développement.
Pourquoi ne pas contribuer à Cesium, pour l'obtenir plus rapidement ? ;)",
diff --git a/www/js/controllers/wallet-controllers.js b/www/js/controllers/wallet-controllers.js
index db339a24..88dc2510 100644
--- a/www/js/controllers/wallet-controllers.js
+++ b/www/js/controllers/wallet-controllers.js
@@ -628,7 +628,7 @@ function WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state,
var title = $scope.formData.name || $scope.formData.uid || $scope.formData.pubkey;
// Use shareBasePath (fix #530) or rootPath (fix #390)
- var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.wot_identity', {pubkey: $scope.formData.pubkey, uid: $scope.formData.name || $scope.formData.uid});
+ var url = (csConfig.shareBaseUrl || $rootScope.rootPath) + $state.href('app.wot_identity', {pubkey: $scope.formData.pubkey, uid: $scope.formData.uid});
// Override default position, is small screen - fix #545
if (UIUtils.screen.isSmall()) {
diff --git a/www/js/controllers/wot-controllers.js b/www/js/controllers/wot-controllers.js
index 19ab01e1..ce71c927 100644
--- a/www/js/controllers/wot-controllers.js
+++ b/www/js/controllers/wot-controllers.js
@@ -979,7 +979,7 @@ function WotIdentityAbstractController($scope, $rootScope, $state, $translate, $
/**
* Identity view controller - should extend WotIdentityAbstractCtrl
*/
-function WotIdentityViewController($scope, $rootScope, $controller, $timeout, UIUtils, csWallet) {
+function WotIdentityViewController($scope, $rootScope, $controller, $timeout, $state, UIUtils, Modals, csWallet) {
'ngInject';
// Initialize the super class and extend it.
angular.extend(this, $controller('WotIdentityAbstractCtrl', {$scope: $scope}));
@@ -1044,6 +1044,28 @@ function WotIdentityViewController($scope, $rootScope, $controller, $timeout, UI
$scope.showFab('fab-certify-' + $scope.formData.uid);
}
};
+
+ $scope.doQuickFix = function(event) {
+ if (event == "showSelectIdentities") {
+ return $scope.showSelectIdentities();
+ }
+ };
+
+ $scope.showSelectIdentities = function() {
+ if (!$scope.formData.requirements || !$scope.formData.requirements.alternatives) return;
+
+ return Modals.showSelectPubkeyIdentity({
+ identities: [$scope.formData.requirements].concat($scope.formData.requirements.alternatives)
+ })
+ .then(function(res) {
+ if (!res || !res.pubkey) return; // Skip if cancelled
+ // open the identity
+ return $state.go('app.wot_identity', {
+ pubkey: res.pubkey,
+ uid: res.uid
+ });
+ });
+ };
}
/**
diff --git a/www/js/services/wallet-services.js b/www/js/services/wallet-services.js
index 2cb7611a..8d11e714 100644
--- a/www/js/services/wallet-services.js
+++ b/www/js/services/wallet-services.js
@@ -687,35 +687,7 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
cleanEventsByContext('requirements');
// Get requirements
- return csWot.loadRequirements(data)
- .then(function(){
-
- if (!data.requirements.uid) return;
-
- // Get sigDate
- var blockParts = data.requirements.blockUid.split('-', 2);
- var blockNumber = parseInt(blockParts[0]);
- var blockHash = blockParts[1];
- // Retrieve registration date
- return BMA.blockchain.block({block: blockNumber})
- .then(function(block) {
- data.sigDate = block.medianTime;
-
- // Check if self has been done on a valid block
- if (!data.isMember && blockNumber !== 0 && blockHash !== block.hash) {
- data.requirements.hasBadSelfBlock = true;
- }
- })
- .catch(function(err){
- // Special case for currency init (root block not exists): use now
- if (err && err.ucode == BMA.errorCodes.BLOCK_NOT_FOUND && blockNumber === 0) {
- data.sigDate = moment().utc().unix();
- }
- else {
- throw err;
- }
- });
- });
+ return csWot.loadRequirements(data);
},
loadTxAndSources = function(fromTime) {
@@ -746,15 +718,15 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
addEvents = function() {
// Add user events
if (data.requirements.revoked) {
- delete data.requirements.hasBadSelfBlock;
+ delete data.requirements.meta.invalid;
addEvent({type:'info', message: 'ERROR.WALLET_REVOKED', context: 'requirements'});
}
else if (data.requirements.pendingRevocation) {
- delete data.requirements.hasBadSelfBlock;
+ delete data.requirements.meta.invalid;
addEvent({type:'pending', message: 'INFO.REVOCATION_SENT_WAITING_PROCESS', context: 'requirements'});
}
else {
- if (!data.isMember && data.requirements.hasBadSelfBlock) {
+ if (!data.isMember && data.requirements.meta.invalid) {
addEvent({type: 'error', message: 'ERROR.WALLET_INVALID_BLOCK_HASH', context: 'requirements'});
console.debug("Invalid membership for uid={0}: block hash changed".format(data.uid));
}
diff --git a/www/js/services/wot-services.js b/www/js/services/wot-services.js
index a3b740b3..473cc6a7 100644
--- a/www/js/services/wot-services.js
+++ b/www/js/services/wot-services.js
@@ -58,6 +58,7 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
_resetRequirements = function(data) {
data.requirements = {
+ meta: {},
needSelf: true,
needMembership: true,
canMembershipOut: false,
@@ -77,8 +78,8 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
_fillRequirements = function(requirements, currencyParameters) {
// Add useful custom fields
- requirements.hasSelf = true;
- requirements.needSelf = false;
+ requirements.hasSelf = requirements.meta && requirements.meta.timestamp;
+ requirements.needSelf = !requirements.hasSelf || requirements.meta.invalid;
requirements.wasMember = angular.isDefined(requirements.wasMember) ? requirements.wasMember : false; // Compat with Duniter 0.9
requirements.needMembership = (!requirements.revoked && requirements.membershipExpiresIn <= 0 && requirements.membershipPendingExpiresIn <= 0 && !requirements.wasMember);
requirements.needRenew = (!requirements.needMembership && !requirements.revoked &&
@@ -121,24 +122,84 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
return requirements;
},
+ _fillIdentitiesTime = function(identities) {
+ if (!identities) return $q.when(identities);
+
+ var blocks = [];
+ _.forEach(identities, function(identity) {
+ var blockUid = identity.meta.timestamp.split('-', 2);
+ identity.meta.number = parseInt(blockUid[0]);
+ identity.meta.hash = blockUid[1];
+ blocks.push(identity.meta.number);
+ if (identity.revocationNumber) {
+ blocks.push(identity.revocationNumber);
+ }
+ });
+
+ // Get identities blocks, to fill self and revocation time
+ return BMA.blockchain.blocks(_.uniq(blocks))
+ .then(function(blocks) {
+ _.forEach(identities, function(identity) {
+ var block = _.findWhere(blocks, {number: identity.meta.number});
+ identity.meta.time = block && block.medianTime;
+
+ // Check if self has been done on a valid block
+ if (block && identity.meta.number !== 0 && identity.meta.hash !== block.hash) {
+ identity.meta.invalid = true;
+ }
+
+ // Set revocation time
+ if (identity.revocationNumber) {
+ block = _.findWhere(blocks, {number: identity.revocationNumber});
+ identity.revocationTime = block && block.medianTime;
+ }
+ });
+
+ return identities;
+ })
+ .catch(function(err){
+ // Special case for currency init (root block not exists): use now
+ if (err && err.ucode == BMA.errorCodes.BLOCK_NOT_FOUND) {
+ _.forEach(identities, function(identity) {
+ if (identity.number === 0) {
+ identity.meta.time = moment().utc().unix();
+ }
+ });
+ return identities;
+ }
+ else {
+ // FIXME workaround for issue #1304 ?
+ /*
+ if (identity.revocationNumber) {
+ identity.revocationTime = identity.revocationNumber;
+ return identity;
+ }*/
+ throw err;
+ }
+ });
+ },
+
loadRequirements = function(data) {
if (!data || (!data.pubkey && !data.uid)) return $q.when(data);
return $q.all([
// Get currency
csCurrency.get(),
+
// Get requirements
BMA.wot.requirements({pubkey: data.pubkey||data.uid})
+ .then(function(res) {
+ return _fillIdentitiesTime(res && res.identities);
+ })
])
.then(function(res){
var currency = res[0];
+ var identities = res[1];
- res = res[1];
-
- if (!res.identities || !res.identities.length) return;
+ if (!identities || !identities.length) return;
// Sort to select the best identity
- if (res.identities.length > 1) {
+ if (identities.length > 1) {
// Select the best identity, by sorting using this order
// - same wallet uid
// - is member
@@ -149,42 +210,43 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
// max(count(certification)
// else
// max(membershipPendingExpiresIn) = must recent membership
- res.identities = _.sortBy(res.identities, function(idty) {
+ identities = _.sortBy(identities, function(idty) {
var score = 0;
- score += (10000000000 * ((data.uid && idty.uid === data.uid) ? 1 : 0));
- score += (10000000000 * ((data.blockUid && idty.meta && idty.meta.timestamp === data.blockUid) ? 1 : 0));
- score += (1000000000 * (idty.membershipExpiresIn > 0 ? 1 : 0));
- score += (100000000 * (idty.membershipPendingExpiresIn > 0 ? 1 : 0));
- score += (10000000 * (!idty.expired ? 1 : 0));
- score += (1000000 * (!idty.outdistanced ? 1 : 0));
- score += (100000 * (idty.wasMember ? 1 : 0));
+ score += (1000000000000* ((data.uid && idty.uid === data.uid) ? 1 : 0));
+ score += (100000000000 * (!idty.meta.invalid ? 1 : 0));
+ score += (10000000000 * ((data.blockUid && idty.meta.timestamp && idty.meta.timestamp === data.blockUid) ? 1 : 0));
+ score += (1000000000 * (idty.membershipExpiresIn > 0 ? 1 : 0));
+ score += (100000000 * (idty.membershipPendingExpiresIn > 0 ? 1 : 0));
+ score += (10000000 * (!idty.expired ? 1 : 0));
+ score += (1000000 * (!idty.outdistanced ? 1 : 0));
+ score += (100000 * (idty.wasMember ? 1 : 0));
var certCount = !idty.expired && idty.certifications ? idty.certifications.length : 0;
- score += (1 * (certCount ? certCount : 0));
- score += (1 * (!certCount && idty.membershipPendingExpiresIn > 0 ? idty.membershipPendingExpiresIn/1000 : 0));
+ score += (1 * (certCount ? certCount : 0));
+ score += (1 * (!certCount && idty.membershipPendingExpiresIn > 0 ? idty.membershipPendingExpiresIn/1000 : 0));
return -score;
});
- console.debug('[wot] Found {0} identities. Will selected the best one'.format(res.identities.length));
+ console.debug('[wot] Found {0} identities (in requirements). Will selected the best one'.format(identities.length));
}
// Select the first identity
- var requirements = _fillRequirements(res.identities[0], currency.parameters);
+ data.requirements = _fillRequirements(identities[0], currency.parameters);
- data.requirements = requirements;
- data.pubkey = requirements.pubkey;
- data.uid = requirements.uid;
- data.isMember = requirements.isMember;
- data.blockUid = requirements.blockUid;
+ // Copy some useful properties into data
+ data.pubkey = data.requirements.pubkey;
+ data.uid = data.requirements.uid;
+ data.isMember = data.requirements.isMember;
+ data.blockUid = data.requirements.meta && data.requirements.meta.timestamp;
+ data.hasSelf = data.requirements.hasSelf;
+ data.sigDate = data.requirements.meta && data.requirements.meta.time;
// Prepare alternatives identities if any
- if (!requirements.isMember && !requirements.wasMember && res.identities.length > 1) {
- requirements.alternatives = res.identities.splice(1);
- _.forEach(requirements.alternatives, function(requirements) {
+ if (!data.requirements.isMember && !data.requirements.wasMember && identities.length > 1) {
+ data.requirements.alternatives = identities.splice(1);
+ _.forEach(data.requirements.alternatives, function(requirements) {
_fillRequirements(requirements, currency.parameters);
});
}
- // TODO : get sigDate from blockUid ??
-
return data;
})
.catch(function(err) {
@@ -196,51 +258,99 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
return data;
}
throw err;
- })
- ;
+ });
},
+
+
loadIdentityByLookup = function(pubkey, uid) {
+ var data = {
+ pubkey: pubkey,
+ uid: uid,
+ hasSelf: false
+ };
return BMA.wot.lookup({ search: pubkey||uid })
.then(function(res){
+ var blocksToRetrieve = [];
var identities = res.results.reduce(function(idties, res) {
return idties.concat(res.uids.reduce(function(uids, idty) {
var blockUid = idty.meta.timestamp.split('-', 2);
+ var blockNumber = parseInt(blockUid[0]);
+ blocksToRetrieve.push(blockNumber);
+ if (idty.revoked_on) {
+ blocksToRetrieve.push(idty.revoked_on);
+ }
return uids.concat({
uid: idty.uid,
pubkey: res.pubkey,
- timestamp: idty.meta.timestamp,
- number: parseInt(blockUid[0]),
- hash: blockUid[1],
+ meta: {
+ timestamp: idty.meta.timestamp,
+ number: blockNumber,
+ hash: blockUid[1],
+ sig: idty.self
+ },
revoked: idty.revoked,
- revocationNumber: idty.revoked_on,
- sig: idty.self
+ revocationNumber: idty.revoked_on
});
}, []));
}, []);
+ // Fill identities time
+ return _fillIdentitiesTime(identities)
+ .then(function(identities) {
+ return {
+ identities: identities,
+ results: res.results
+ };
+ });
+ })
+ .then(function(res){
+ var identities = res.identities;
+
// Sort identities if need
- if (identities.length) {
+ if (identities.length > 1) {
// Select the best identity, by sorting using this order
+ // - valid block
// - same given uid
// - not revoked
// - max(block_number)
- identities = _.sortBy(identities, function(idty) {
+ res.identities = _.sortBy(identities, function(idty) {
var score = 0;
- score += (10000000000 * ((uid && idty.uid === uid) ? 1 : 0));
- score += (1000000000 * (!idty.revoked ? 1 : 0));
- score += (1 * (idty.number ? idty.number : 0));
+ score += (100000000000 * ((data.uid && idty.uid === data.uid) ? 1 : 0));
+ score += (10000000000 * (!idty.meta.invalid ? 1 : 0));
+ score += (1000000000 * ((data.blockUid && idty.meta.timestamp && idty.meta.timestamp === data.blockUid) ? 1 : 0));
+ score += (100000000 * (!idty.revoked ? 1 : 0));
+ score += (1 * (idty.meta.number ? idty.meta.number : 0) / 1000);
return -score;
});
+ console.debug('[wot] Found {0} identities (in lookup). Will selected the best one'.format(identities.length));
+ }
+
+ // Prepare alternatives identities
+ _.forEach(identities, function(idty) {
+ idty.hasSelf = !!(idty.uid && idty.meta.timestamp && idty.meta.sig);
+ });
+
+ // Select the first identity
+ data.requirements = identities[0];
+
+ // Copy some useful properties into data
+ data.pubkey = data.requirements.pubkey;
+ data.uid = data.requirements.uid;
+ data.blockUid = data.requirements.meta && data.requirements.meta.timestamp;
+ data.hasSelf = data.requirements.hasSelf;
+ data.sigDate = data.requirements.meta && data.requirements.meta.time;
+
+ if (identities.length > 1) {
+ data.requirements.alternatives = identities.splice(1);
}
- var identity = identities[0];
- identity.hasSelf = !!(identity.uid && identity.timestamp && identity.sig);
- identity.lookup = {};
+ // Store additional data (e.g. certs)
+ data.lookup = {};
- // Store received certifications
+ // Store received certifications (can be usefull later)
var certPubkeys = [];
- identity.lookup.certifications = !res.results ? {} : res.results.reduce(function(certsMap, res) {
+ data.lookup.certifications = !res.results ? {} : res.results.reduce(function(certsMap, res) {
return res.uids.reduce(function(certsMap, idty) {
var idtyFullKey = idty.uid + '-' + (idty.meta ? idty.meta.timestamp : '');
certsMap[idtyFullKey] = idty.others.reduce(function(certs, cert) {
@@ -276,7 +386,7 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
// Store given certifications
certPubkeys = [];
- identity.lookup.givenCertifications = !res.results ? [] : res.results.reduce(function(certs, res) {
+ data.lookup.givenCertifications = !res.results ? [] : res.results.reduce(function(certs, res) {
return res.signed.reduce(function(certs, cert) {
var result = {
pubkey: cert.pubkey,
@@ -305,52 +415,12 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
}, certs);
}, []);
- // Retrieve time (self and revocation)
- var blocks = [identity.number];
- if (identity.revocationNumber) {
- blocks.push(identity.revocationNumber);
- }
- return BMA.blockchain.blocks(blocks)
- .then(function(blocks){
- identity.sigDate = blocks[0].medianTime;
-
- // Check if self has been done on a valid block
- if (identity.number !== 0 && identity.hash !== blocks[0].hash) {
- identity.hasBadSelfBlock = true;
- }
-
- // Set revocation time
- if (identity.revocationNumber) {
- identity.revocationTime = blocks[1].medianTime;
- }
-
- return identity;
- })
- .catch(function(err){
- // Special case for currency init (root block not exists): use now
- if (err && err.ucode == BMA.errorCodes.BLOCK_NOT_FOUND && identity.number === 0) {
- identity.sigDate = moment().utc().unix();
- return identity;
- }
- else {
- // FIXME workaround for issue #1304 ?
- /*
- if (identity.revocationNumber) {
- identity.revocationTime = identity.revocationNumber;
- return identity;
- }*/
- throw err;
- }
- });
+ return data;
})
.catch(function(err) {
if (!!err && err.ucode == BMA.errorCodes.NO_MATCHING_IDENTITY) { // Identity not found (if no self)
- var identity = {
- uid: null,
- pubkey: pubkey,
- hasSelf: false
- };
- return identity;
+ _resetRequirements(data);
+ return data;
}
else {
throw err;
@@ -535,16 +605,16 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
addEvents = function(data) {
if (data.requirements.revoked) {
- delete data.hasBadSelfBlock;
+ delete data.requirements.meta.invalid;
addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_REVOKED', messageParams: {revocationTime: data.revocationTime}});
console.debug("[wot] Identity [{0}] has been revoked".format(data.uid));
}
else if (data.requirements.pendingRevocation) {
+ delete data.requirements.meta.invalid;
addEvent(data, {type:'error', message: 'ERROR.IDENTITY_PENDING_REVOCATION'});
console.debug("[wot] Identity [{0}] has pending revocation".format(data.uid));
}
- else if (data.hasBadSelfBlock) {
- delete data.hasBadSelfBlock;
+ else if (data.requirements.meta && data.requirements.meta.invalid) {
if (!data.isMember) {
addEvent(data, {type: 'error', message: 'ERROR.IDENTITY_INVALID_BLOCK_HASH'});
console.debug("[wot] Invalid membership for uid {0}: block hash changed".format(data.uid));
@@ -562,6 +632,9 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
addEvent(data, {type: 'error', message: 'INFO.IDENTITY_NEED_MEMBERSHIP'});
console.debug("[wot] Identity {0} has a self but no membership".format(data.uid));
}
+ if (!data.isMember && data.requirements.alternatives) {
+ addEvent(data, {type: 'info', message: 'INFO.HAS_ALTERNATIVE_IDENTITIES'});
+ }
},
loadData = function(pubkey, withCache, uid, force) {
@@ -629,18 +702,24 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
// Get identity using lookup
loadIdentityByLookup(pubkey, uid)
- .then(function (identity) {
- angular.merge(data, identity);
- })
+
])
- .then(function() {
- if (!data.requirements.uid) return;
+ .then(function(res) {
+ var dataByLookup = res[3];
+
+ // If no requirements found: copy from lookup data
+ if (!data.requirements.uid) {
+ console.debug("[wot] No requirements found: using data from lookup");
+ angular.merge(data, dataByLookup);
+ delete data.lookup; // not need
+ return;
+ }
var idtyFullKey = data.requirements.uid + '-' + data.requirements.meta.timestamp;
return $q.all([
// Get received certifications
- loadCertifications(BMA.wot.certifiersOf, data.pubkey, data.lookup ? data.lookup.certifications[idtyFullKey] : null, parameters, medianTime, true /*certifiersOf*/)
+ loadCertifications(BMA.wot.certifiersOf, data.pubkey, dataByLookup.lookup ? dataByLookup.lookup.certifications[idtyFullKey] : null, parameters, medianTime, true /*certifiersOf*/)
.then(function (res) {
data.received_cert = res.valid;
data.received_cert_pending = res.pending;
@@ -648,7 +727,7 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
}),
// Get given certifications
- loadCertifications(BMA.wot.certifiedBy, data.pubkey, data.lookup ? data.lookup.givenCertifications : null, parameters, medianTime, false/*certifiersOf*/)
+ loadCertifications(BMA.wot.certifiedBy, data.pubkey, dataByLookup.lookup ? dataByLookup.lookup.givenCertifications : null, parameters, medianTime, false/*certifiersOf*/)
.then(function (res) {
data.given_cert = res.valid;
data.given_cert_pending = res.pending;
@@ -675,7 +754,6 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c
})
.then(function() {
if (!data.pubkey) return undefined; // not found
- delete data.lookup; // not need anymore
identityCache.put(data.pubkey, data); // add to cache
console.debug('[wot] Identity '+ data.pubkey.substring(0, 8) +' loaded in '+ (Date.now()-now) +'ms');
return data;
diff --git a/www/templates/wot/modal_select_pubkey_identity.html b/www/templates/wot/modal_select_pubkey_identity.html
index 9c7cbfb8..cd47546e 100644
--- a/www/templates/wot/modal_select_pubkey_identity.html
+++ b/www/templates/wot/modal_select_pubkey_identity.html
@@ -25,6 +25,7 @@