public SharedAuthSecret DecodeSharedAuth(byte[] encoded) { try { VersionedData[] versions = DecodeExportedVersions(encoded, _magicTagSharedAuth); SharedAuthSecretImpl sharedAuth = null; for (int i = 0; i < versions.Length; i++) { // Se houver duas versões, a versão atual virá antes da versão legacy. if (versions[i].version == ExportVersion.ConstVal) { TypeCode exportedAuthTypeCode = ORB.create_tc_for_type(typeof(ExportedSharedAuth)); ExportedSharedAuth exportedAuth = (ExportedSharedAuth) _codec.decode_value(versions[i].encoded, exportedAuthTypeCode); if (sharedAuth == null) { sharedAuth = new SharedAuthSecretImpl(exportedAuth.bus, exportedAuth.attempt, exportedAuth.secret, null); } else { sharedAuth.Attempt = exportedAuth.attempt; } } if (versions[i].version == CurrentVersion.ConstVal) { TypeCode exportedAuthTypeCode = ORB.create_tc_for_type(typeof(core.v2_0.data_export.ExportedSharedAuth)); core.v2_0.data_export.ExportedSharedAuth exportedAuth = (core.v2_0.data_export.ExportedSharedAuth) _codec.decode_value(versions[i].encoded, exportedAuthTypeCode); if (sharedAuth == null) { sharedAuth = new SharedAuthSecretImpl(exportedAuth.bus, null, exportedAuth.secret, exportedAuth.attempt); } else { sharedAuth.LegacyAttempt = exportedAuth.attempt; } } } if (sharedAuth != null) { return(sharedAuth); } } catch (GenericUserException e) { const string message = "Falha inesperada ao decodificar uma autenticação compartilhada exportada."; Logger.Error(message, e); throw new InvalidEncodedStreamException(message, e); } throw new InvalidEncodedStreamException("Versão de autenticação compartilhada incompatível."); }
public byte[] EncodeSharedAuth(SharedAuthSecret secret) { try { SharedAuthSecretImpl sharedAuth = (SharedAuthSecretImpl)secret; int i = 0; VersionedData?actualVersion = null; VersionedData?legacyVersion = null; if (!sharedAuth.Legacy) { // se não é legacy, tem a versão atual. Pode ter a versão legacy ou não. ExportedSharedAuth exportedAuth = new ExportedSharedAuth(sharedAuth.BusId, sharedAuth.Attempt, sharedAuth.Secret); TypeCode exportedAuthTC = _orb.create_tc_for_type(typeof(ExportedSharedAuth)); Any any = new Any(exportedAuth, exportedAuthTC); byte[] encoded = _codec.encode_value(any); actualVersion = new VersionedData(ExportVersion.ConstVal, encoded); i++; } if (sharedAuth.LegacyAttempt != null) { core.v2_0.data_export.ExportedSharedAuth legacyAuth = new core.v2_0.data_export.ExportedSharedAuth(sharedAuth.BusId, sharedAuth.LegacyAttempt, sharedAuth.Secret); TypeCode legacyExportedAuthTC = _orb.create_tc_for_type(typeof(core.v2_0.data_export.ExportedSharedAuth)); Any any = new Any(legacyAuth, legacyExportedAuthTC); byte[] legacyEncoded = _codec.encode_value(any); legacyVersion = new VersionedData(CurrentVersion.ConstVal, legacyEncoded); i++; } VersionedData[] versions = new VersionedData[i]; // A ordem das versões exportadas IMPORTA. A 2.1 deve vir antes da 2.0. if (legacyVersion != null) { versions[--i] = legacyVersion.Value; } if (actualVersion != null) { versions[--i] = actualVersion.Value; } return(EncodeExportedVersions(versions, _magicTagSharedAuth)); } catch (InvalidTypeForEncoding e) { const string message = "Falha inesperada ao codificar uma autenticação compartilhada para exportação."; Logger.Error(message, e); throw new OpenBusInternalException(message, e); } }