/// <summary>
            /// Activates the device.
            /// </summary>
            /// <param name="request">The device activation request.</param>
            /// <returns>The device activation response.</returns>
            private static ActivateDeviceRealtimeResponse ActivateDevice(ActivateDeviceRealtimeRequest request)
            {
                var    getDeviceRequest = new GetDeviceDataRequest(request.DeviceNumber, isActivatedOnly: false);
                Device device           = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest, request.RequestContext).Entity;

                device.ActivatedDateTime   = device.ActivatedDateTime ?? DateTimeOffset.UtcNow;
                device.DeactivateComments  = device.DeactivateComments ?? string.Empty;
                device.DeactivatedDateTime = device.DeactivatedDateTime ?? DateTimeOffset.MinValue;
                device.TokenIssueTime      = device.TokenIssueTime ?? DateTimeOffset.UtcNow;

                var result = new DeviceActivationResult();

                if (device == null)
                {
                    // Device is not found, throws exception.
                    string message = string.Format("The input device number '{0}' does not exist in demo database.", request.DeviceNumber);
                    throw new ConfigurationException(ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceConfigurationNotFound, message);
                }
                else if (string.IsNullOrWhiteSpace(device.TerminalId))
                {
                    // If device is found but the terminal associated with the device is not found, try to find the terminal using input terminal id.
                    var      columnSet          = new ColumnSet(Terminal.RecordIdColumn, Terminal.TerminalIdColumn, Terminal.ChannelIdColumn);
                    var      settings           = new QueryResultSettings(columnSet, PagingInfo.AllRecords);
                    var      getTerminalRequest = new GetTerminalDataRequest(request.TerminalId, settings);
                    Terminal terminal           = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Terminal> >(getTerminalRequest, request.RequestContext).Entity;

                    if (terminal == null)
                    {
                        string message = string.Format("The input device number '{0}' and terminal identifier '{1}' do not exist in demo database.", request.DeviceNumber, request.TerminalId);
                        throw new ConfigurationException(ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceConfigurationNotFound, message);
                    }

                    result.Device = new Device
                    {
                        DeviceId            = request.DeviceId,
                        DeviceNumber        = request.DeviceNumber,
                        TerminalRecordId    = terminal.RecordId,
                        TerminalId          = terminal.TerminalId,
                        ChannelId           = terminal.ChannelId,
                        DeviceTypeRecordId  = device.DeviceTypeRecordId,
                        ActivatedDateTime   = device.ActivatedDateTime,
                        TokenIssueTime      = device.TokenIssueTime,
                        DeactivatedDateTime = device.DeactivatedDateTime,
                        DeactivateComments  = device.DeactivateComments,
                        TokenData           = device.TokenData,
                        TokenSalt           = device.TokenSalt
                    };
                }
                else
                {
                    // Both the device and associated terminal are found.
                    device.DeviceNumber = request.DeviceNumber;
                    device.DeviceId     = request.DeviceId;
                    result.Device       = device;
                }

                var response = new ActivateDeviceRealtimeResponse(result);

                return(response);
            }
Ejemplo n.º 2
0
            /// <summary>
            /// The data service method to execute the data manager to get the device configuration.
            /// </summary>
            /// <param name="request">The data service request.</param>
            /// <returns>The data service response.</returns>
            private SingleEntityDataServiceResponse <DeviceConfiguration> GetDeviceConfiguration(GetDeviceConfigurationDataRequest request)
            {
                ThrowIf.Null(request, "request");
                ThrowIf.Null(request.RequestContext, "request.RequestContext");
                ThrowIf.Null(request.QueryResultSettings, "request.QueryResultSettings");

                ICommercePrincipal principal = request.RequestContext.GetPrincipal();

                if (principal.IsChannelAgnostic || principal.IsTerminalAgnostic || string.IsNullOrWhiteSpace(principal.DeviceNumber))
                {
                    throw new InvalidOperationException("Current request context is not associated to a device.");
                }

                Terminal terminal = request.RequestContext.GetTerminal();

                ParameterSet parameters = new ParameterSet();
                Tuple <PagedResult <DeviceConfiguration>,
                       ReadOnlyCollection <HardwareConfiguration>,
                       ReadOnlyCollection <HardwareConfiguration>,
                       ReadOnlyCollection <HardwareConfiguration> > dataSets = null;

                parameters[DatabaseAccessor.ChannelIdVariableName] = terminal.ChannelId;
                parameters[TerminalIdVariableName]    = terminal.TerminalId;
                parameters[IncludeImagesVariableName] = request.IncludeImages;

                using (SqlServerDatabaseContext databaseContext = new SqlServerDatabaseContext(request.RequestContext, request.QueryResultSettings))
                {
                    dataSets = databaseContext.ExecuteStoredProcedure <DeviceConfiguration, HardwareConfiguration, HardwareConfiguration, HardwareConfiguration>(GetDeviceConfigurationSprocName, parameters);
                }

                DeviceConfiguration deviceConfiguration             = dataSets.Item1.SingleOrDefault();
                ReadOnlyCollection <HardwareConfiguration> drawers  = dataSets.Item2;
                ReadOnlyCollection <HardwareConfiguration> printers = dataSets.Item3;
                ReadOnlyCollection <HardwareConfiguration> pinpads  = dataSets.Item4;

                if (deviceConfiguration != null)
                {
                    deviceConfiguration.HardwareConfigurations = new HardwareConfigurations();
                    deviceConfiguration.HardwareConfigurations.CashDrawerConfigurations.AddRange(drawers);
                    deviceConfiguration.HardwareConfigurations.PrinterConfigurations.AddRange(printers);
                    deviceConfiguration.HardwareConfigurations.PinPadConfiguration = pinpads.SingleOrDefault();
                }

                GetDeviceDataRequest getDeviceRequest = new GetDeviceDataRequest(principal.DeviceNumber);
                Device device = request.RequestContext.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest).Entity;

                if (deviceConfiguration != null && device != null)
                {
                    deviceConfiguration.UseInMemoryDeviceDataStorage = device.UseInMemoryDeviceDataStorage;
                }

                return(new SingleEntityDataServiceResponse <DeviceConfiguration>(deviceConfiguration));
            }
Ejemplo n.º 3
0
        /// <summary>
        /// 获取某个设备当前上报到云端的数据,该接口适用于使用数据模板协议的产品。
        /// </summary>
        /// <param name="req">参考<see cref="GetDeviceDataRequest"/></param>
        /// <returns>参考<see cref="GetDeviceDataResponse"/>实例</returns>
        public async Task <GetDeviceDataResponse> GetDeviceData(GetDeviceDataRequest req)
        {
            JsonResponseModel <GetDeviceDataResponse> rsp = null;

            try
            {
                var strResp = await this.InternalRequest(req, "GetDeviceData");

                rsp = JsonConvert.DeserializeObject <JsonResponseModel <GetDeviceDataResponse> >(strResp);
            }
            catch (JsonSerializationException e)
            {
                throw new TencentCloudSDKException(e.Message);
            }
            return(rsp.Response);
        }
            /// <summary>
            /// Deactivates the device.
            /// </summary>
            /// <param name="request">The device deactivation request.</param>
            /// <returns>The device deactivation response.</returns>
            private static DeactivateDeviceRealtimeResponse DeactivateDevice(DeactivateDeviceRealtimeRequest request)
            {
                ThrowIf.Null(request, "request");

                var    getDeviceRequest = new GetDeviceDataRequest(request.DeviceNumber, isActivatedOnly: false);
                Device device           = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest, request.RequestContext).Entity;

                device.ActivationStatus    = DeviceActivationStatus.Deactivated;
                device.ActivatedDateTime   = device.ActivatedDateTime ?? DateTimeOffset.UtcNow;
                device.DeactivateComments  = device.DeactivateComments ?? string.Empty;
                device.DeactivatedDateTime = device.DeactivatedDateTime ?? DateTimeOffset.MinValue;
                device.TokenIssueTime      = device.TokenIssueTime ?? DateTimeOffset.UtcNow;
                return(new DeactivateDeviceRealtimeResponse(new DeviceDeactivationResult()
                {
                    Device = device
                }));
            }
            /// <summary>
            /// Authenticates the device.
            /// </summary>
            /// <param name="request">The device authentication request.</param>
            /// <returns>The response.</returns>
            private static AuthenticateDeviceRealtimeResponse AuthenticateDevice(AuthenticateDeviceRealtimeRequest request)
            {
                var    getDeviceRequest = new GetDeviceDataRequest(request.Device.DeviceNumber, isActivatedOnly: false);
                Device device           = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest, request.RequestContext).Entity;

                if (device == null)
                {
                    // Device is not found, throws exception.
                    string message = string.Format("The input device number '{0}' does not exist in demo database.", request.Device.DeviceNumber);
                    throw new ConfigurationException(ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceConfigurationNotFound, message);
                }

                device.ActivatedDateTime   = device.ActivatedDateTime ?? DateTimeOffset.UtcNow;
                device.DeactivateComments  = device.DeactivateComments ?? string.Empty;
                device.DeactivatedDateTime = device.DeactivatedDateTime ?? DateTimeOffset.MinValue;
                device.TokenIssueTime      = device.TokenIssueTime ?? DateTimeOffset.UtcNow;

                return(new AuthenticateDeviceRealtimeResponse(device));
            }
Ejemplo n.º 6
0
            /// <summary>
            /// Validate Device token.
            /// </summary>
            /// <param name="deviceId">The device identifier.</param>
            /// <param name="deviceTokenData">The device token data.</param>
            /// <param name="deviceToken">The device token.</param>
            /// <param name="requestContext">Request context.</param>
            /// <returns>Device response.</returns>
            private static Device ValidateDeviceTokenLocally(string deviceId, string deviceTokenData, string deviceToken, RequestContext requestContext)
            {
                var getTransactionServiceProfileDataRequest         = new GetTransactionServiceProfileDataRequest();
                TransactionServiceProfile transactionServiceProfile = requestContext.Runtime.Execute <SingleEntityDataServiceResponse <TransactionServiceProfile> >(getTransactionServiceProfileDataRequest, requestContext).Entity;

                int deviceTokenExpirationInDays = transactionServiceProfile.DeviceTokenExpirationInDays;

                // only validate device if connecting against master database
                bool mustValidateActiveDevice = requestContext.Runtime.Configuration.IsMasterDatabaseConnectionString;

                // Get the device
                GetDeviceDataRequest getDeviceRequest = new GetDeviceDataRequest(deviceId, mustValidateActiveDevice);
                Device localDevice = requestContext.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest).Entity;

                if (localDevice == null)
                {
                    throw new DeviceAuthenticationException(
                              SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_LocalDeviceAuthenticationFailed,
                              string.Format("Device not found for device '{0}'.", deviceId));
                }

                localDevice.Token = deviceToken;

                string algorithm = localDevice.TokenAlgorithm;

                if (string.IsNullOrEmpty(algorithm))
                {
                    // string algorithm = transactionServiceProfile.DeviceTokenAlgorithm;
                    algorithm = "SHA256";
                }

                if (mustValidateActiveDevice)
                {
                    if (string.IsNullOrEmpty(localDevice.TokenSalt))
                    {
                        throw new DeviceAuthenticationException(
                                  SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_LocalDeviceAuthenticationFailed,
                                  string.Format("TokenSalt not available for device '{0}'.", deviceId));
                    }

                    if (localDevice.ActivationStatus != DeviceActivationStatus.Activated)
                    {
                        throw new DeviceAuthenticationException(
                                  SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_LocalDeviceAuthenticationFailed,
                                  string.Format("Device is not activated, actual state is '{0}'.", localDevice.ActivationStatus));
                    }

                    // Get hashed value for device token
                    HashDataServiceRequest hashDataServiceRequest = new HashDataServiceRequest(deviceTokenData, algorithm, localDevice.DeviceNumber, localDevice.TokenSalt);
                    string deviceTokenHash = requestContext.Execute <HashDataServiceResponse>(hashDataServiceRequest).Data;

                    // Validate the hashed device token with value in the database
                    if (!string.Equals(deviceTokenHash, localDevice.TokenData))
                    {
                        throw new DeviceAuthenticationException(
                                  SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_LocalDeviceAuthenticationFailed,
                                  string.Format("Device token for '{0}' record was not found.", deviceId));
                    }

                    if (!localDevice.TokenIssueTime.HasValue)
                    {
                        throw new ConfigurationException(
                                  ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_ActivatedDeviceMissingTokenIssueDatetime,
                                  string.Format("Activated device '{0}' does not have an associated token issue datetime.", deviceId));
                    }

                    if (DateTimeOffset.Compare(DateTimeOffset.Now, localDevice.TokenIssueTime.Value.AddDays(deviceTokenExpirationInDays)) > 0)
                    {
                        throw new DeviceAuthenticationException(
                                  SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceTokenExpired,
                                  string.Format("Device Token for device '{0}' expired.", deviceId));
                    }
                }
                else
                {
                    // when device comes from non-master database, it might have stale data
                    localDevice = ConstructDeviceFromToken(deviceToken);
                }

                return(localDevice);
            }