예제 #1
0
        public static byte[] EncodeConfigurationToken_v1(this ConfigurationTokenService service, Model.ExtensionConfiguration configuration)
        {
            byte[] payload = service.SerializeConfigurationToken_v1(configuration);

            // Encrypt the token
            return(service.Encrypt(payload));
        }
예제 #2
0
        public static byte[] SerializeConfigurationToken_v1(this ConfigurationTokenService service, Model.ExtensionConfiguration configuration)
        {
            // Generate the Flatbuffer token payload
            var builder = new FlatBufferBuilder(512);

            var fbConfiguration = new TwitchAchievementTracker.Flatbuffer.v1.Configuration();

            fbConfiguration.version = configuration.Version;


            var xConfig     = configuration.XBoxLiveConfig as Model.XApiConfiguration;
            var steamConfig = configuration.SteamConfig as Model.SteamConfiguration;

            switch (configuration.ActiveConfig)
            {
            case Model.ActiveConfig.XBoxLive:

                var flatBufferXBoxConfig = new XApiConfiguration();
                flatBufferXBoxConfig.xApiKey      = xConfig.XApiKey;
                flatBufferXBoxConfig.streamerXuid = string.IsNullOrEmpty(xConfig.StreamerXuid) ? 0 : UInt64.Parse(xConfig.StreamerXuid);
                flatBufferXBoxConfig.titleId      = string.IsNullOrEmpty(xConfig.TitleId) ? 0 : UInt32.Parse(xConfig.TitleId);
                flatBufferXBoxConfig.locale       = xConfig.Locale ?? "en-US";
                fbConfiguration.config            = new FlatBufferUnion <XApiConfiguration, SteamConfiguration>(flatBufferXBoxConfig);

                break;

            case Model.ActiveConfig.Steam:
                var webKeyString          = builder.CreateString(steamConfig.WebApiKey);
                var steamId               = UInt64.Parse(steamConfig.SteamId);
                var appId                 = steamConfig.AppId;
                var steamLocale           = builder.CreateString(steamConfig.Locale ?? "english");
                var flatBufferSteamConfig = new SteamConfiguration();
                flatBufferSteamConfig.webApiKey = steamConfig.WebApiKey;
                flatBufferSteamConfig.steamId   = string.IsNullOrEmpty(steamConfig.SteamId) ? 0 : UInt64.Parse(steamConfig.SteamId);
                flatBufferSteamConfig.appId     = string.IsNullOrEmpty(steamConfig.AppId) ? 0 : UInt32.Parse(steamConfig.AppId);
                fbConfiguration.config          = new FlatBufferUnion <XApiConfiguration, SteamConfiguration>(flatBufferSteamConfig);

                break;

            default:
                throw new NotSupportedException("Unknown configuration platform");
            }

            int maxBytesNeeded = FlatBufferSerializer.Default.GetMaxSize(fbConfiguration);

            byte[] outBuffer    = new byte[maxBytesNeeded];
            int    bytesWritten = FlatBufferSerializer.Default.Serialize(fbConfiguration, outBuffer);

            return(new ArraySegment <byte>(outBuffer, 0, bytesWritten).ToArray());
        }
예제 #3
0
        public static Model.ExtensionConfiguration DeserializeConfigurationToken_v1(this ConfigurationTokenService service, byte[] decrypted)
        {
            var fbConfiguration = FlatBufferSerializer.Default.Parse <TwitchAchievementTracker.Flatbuffer.v1.Configuration>(decrypted);


            SteamConfiguration steamFbConfig = null;
            XApiConfiguration  xApiFbConfig  = null;

            Model.ActiveConfig activeConfig;
            if (fbConfiguration.config.TryGet(out steamFbConfig))
            {
                activeConfig = Model.ActiveConfig.Steam;
            }
            else if (fbConfiguration.config.TryGet(out xApiFbConfig))
            {
                activeConfig = Model.ActiveConfig.XBoxLive;
            }
            else
            {
                throw new NotSupportedException("Unknown configuration platform");
            }

            return(new Model.ExtensionConfiguration
            {
                Version = fbConfiguration.version,
                ActiveConfig = activeConfig,
                SteamConfig = steamFbConfig == null ? null : new Model.SteamConfiguration
                {
                    WebApiKey = steamFbConfig.webApiKey,
                    SteamId = steamFbConfig.steamId == 0 ? null : steamFbConfig.steamId.ToString(),
                    AppId = steamFbConfig.appId == 0 ? null : steamFbConfig.appId.ToString(),
                    Locale = steamFbConfig.locale,
                },
                XBoxLiveConfig = xApiFbConfig == null ? null : new Model.XApiConfiguration
                {
                    XApiKey = xApiFbConfig.xApiKey,
                    StreamerXuid = xApiFbConfig.streamerXuid == 0 ? null : xApiFbConfig.streamerXuid.ToString(),
                    TitleId = xApiFbConfig.titleId == 0 ? null : xApiFbConfig.titleId.ToString(),
                    Locale = xApiFbConfig.locale,
                }
            });
        }
예제 #4
0
        public void CheckLegacyTokenSerialization()
        {
            // Test deserialization from legacy encrypted token using known secret
            var encrypted = "X1Pmbd3v86Ck731UlGCnFfQ0zjhr0gNRe+fJARWIqtgk80IJfCm6HjmcGGifBndUr3AspJJldYnRHvOmsdj1UUWtjUw4ZK+AqVtIBz+YxbUipbKlcCypRCnsa0n1CLwBqFQd0Ci/9utTVFituJh1wl1VL52F8VWEqQEoNYTz+TKSj/ShJWKNodSkvK1US96F8RMpVHsJvz2M4OuisrRwTagSTW59U75Mz0KJ/hFkyu8=";
            var secret    = "deadbeef1337deadbeef";

            var options = new OptionsWrapper <ConfigurationTokenOptions>(new ConfigurationTokenOptions
            {
                EncryptionSecret = secret
            });
            var loggerFactory = new LoggerFactory();

            var tokenService = new ConfigurationTokenService(options, loggerFactory.CreateLogger <ConfigurationTokenService>());

            var decryptedPayload = tokenService.Decrypt(Convert.FromBase64String(encrypted));
            var configurationIn  = tokenService.DeserializeConfigurationToken_v1(decryptedPayload);

            // Test serialization from current version ExtensionConfiguration type
            var configuration = new ExtensionConfiguration
            {
                Version        = "0.0.1",
                ActiveConfig   = ActiveConfig.XBoxLive,
                SteamConfig    = null,
                XBoxLiveConfig = new XApiConfiguration
                {
                    StreamerXuid = "2112233445566778",
                    TitleId      = "123456",
                    XApiKey      = "deadbeef1337551c773676461c1c1337deadbeef",
                    Locale       = "fr-FR",
                },
            };
            var configurationOut = tokenService.SerializeConfigurationToken_v1(configuration);

            Assert.Equal(configuration.Version, configurationIn.Version);
            Assert.Equal(configuration.SteamConfig, configurationIn.SteamConfig);
            Assert.Equal(configuration.XBoxLiveConfig.XApiKey, configurationIn.XBoxLiveConfig.XApiKey);
            Assert.Equal(configuration.XBoxLiveConfig.StreamerXuid, configurationIn.XBoxLiveConfig.StreamerXuid);
            Assert.Equal(configuration.XBoxLiveConfig.TitleId, configurationIn.XBoxLiveConfig.TitleId);
            Assert.Equal(configuration.XBoxLiveConfig.Locale, configurationIn.XBoxLiveConfig.Locale);
        }
예제 #5
0
 public ConfigurationController(ConfigurationTokenService tokenService, ConfigurationService service)
 {
     _service      = service;
     _tokenService = tokenService;
 }
예제 #6
0
 public AchievementsController(XApiService xApiService, SteamApiService steamApiService, ConfigurationTokenService configurationService)
 {
     _xApiService          = xApiService;
     _steamApiService      = steamApiService;
     _configurationService = configurationService;
 }
예제 #7
0
 // Legacy token decryption from published version v0.1.1
 public static Model.ExtensionConfiguration DecodeConfigurationToken_v1(this ConfigurationTokenService service, byte[] payload)
 {
     // Decrypt the token
     byte[] decrypted = service.Decrypt(payload);
     return(service.DeserializeConfigurationToken_v1(decrypted));
 }