diff --git a/apps/capi/src/capi_handler_decoder.erl b/apps/capi/src/capi_handler_decoder.erl index 453c2a8..ec6d6f9 100644 --- a/apps/capi/src/capi_handler_decoder.erl +++ b/apps/capi/src/capi_handler_decoder.erl @@ -115,11 +115,99 @@ decode_client_info_ext(ClientInfo) -> <<"ip">> => ClientInfo#domain_ClientInfo.ip_address, <<"peer_ip">> => ClientInfo#domain_ClientInfo.peer_ip_address, <<"user_ip">> => ClientInfo#domain_ClientInfo.user_ip_address, - <<"url">> => ClientInfo#domain_ClientInfo.url + <<"url">> => ClientInfo#domain_ClientInfo.url, + <<"browser_info">> => decode_browser_info(ClientInfo#domain_ClientInfo.browser_info), + <<"device_info">> => decode_device_info(ClientInfo#domain_ClientInfo.device_info), + <<"peer_user_agent">> => ClientInfo#domain_ClientInfo.peer_user_agent, + <<"peer_accept_header">> => ClientInfo#domain_ClientInfo.peer_accept_header }). %% +decode_browser_info(undefined) -> + undefined; +decode_browser_info( + #domain_BrowserInfo{ + accept_header = AcceptHeader, + user_agent = UserAgent, + language = Language, + color_depth = ColorDepth, + screen_width = ScreenWidth, + screen_height = ScreenHeight, + tz_offset = TzOffset + } +) -> + genlib_map:compact(#{ + <<"browserAcceptHeader">> => AcceptHeader, + <<"browserUserAgent">> => UserAgent, + <<"browserLanguage">> => Language, + <<"browserColorDepth">> => ColorDepth, + <<"browserScreenWidth">> => ScreenWidth, + <<"browserScreenHeight">> => ScreenHeight, + <<"browserTZ">> => TzOffset + }). + +decode_device_info(undefined) -> + undefined; +decode_device_info( + #domain_DeviceInfo{ + device_type = DeviceType, + os_name = OsName, + os_version = OsVersion, + device_model = DeviceModel, + browser_name = BrowserName, + browser_version = BrowserVersion, + time_zone = TimeZone, + languages = Languages, + screen_pixel_ratio = ScreenPixelRatio, + web_view = WebView, + user_agent_brands = UserAgentBrands + } +) -> + genlib_map:compact(#{ + <<"deviceType">> => decode_device_type(DeviceType), + <<"osName">> => OsName, + <<"osVersion">> => OsVersion, + <<"deviceModel">> => DeviceModel, + <<"browserName">> => BrowserName, + <<"browserVersion">> => BrowserVersion, + <<"timeZone">> => TimeZone, + <<"languages">> => Languages, + <<"screenPixelRatio">> => ScreenPixelRatio, + <<"webView">> => WebView, + <<"userAgentBrands">> => decode_brands(UserAgentBrands) + }). + +decode_device_type(undefined) -> + undefined; +decode_device_type({desktop, #domain_DeviceTypeDesktop{}}) -> + <<"desktop">>; +decode_device_type({mobile, #domain_DeviceTypeMobile{}}) -> + <<"mobile">>; +decode_device_type({tablet, #domain_DeviceTypeTablet{}}) -> + <<"tablet">>; +decode_device_type({unknown, #domain_DeviceTypeUnknown{}}) -> + <<"unknown">>. + +decode_brands(undefined) -> + undefined; +decode_brands(UserAgentBrands) -> + lists:map( + fun(Brand) -> decode_brand(Brand) end, + UserAgentBrands + ). + +decode_brand( + #domain_UserAgentBrand{ + brand = Brand, + version = Version + } +) -> + genlib_map:compact(#{ + <<"brand">> => Brand, + <<"version">> => Version + }). + -define(PAN_LENGTH, 16). -spec decode_masked_pan(binary() | undefined, binary()) -> binary(). diff --git a/apps/capi/src/capi_handler_encoder.erl b/apps/capi/src/capi_handler_encoder.erl index e6a1098..7bbe760 100644 --- a/apps/capi/src/capi_handler_encoder.erl +++ b/apps/capi/src/capi_handler_encoder.erl @@ -19,7 +19,11 @@ encode_client_info(ClientInfo) -> ip_address = maps:get(<<"ip">>, ClientInfo), peer_ip_address = maps:get(<<"peer_ip">>, ClientInfo), user_ip_address = maps:get(<<"user_ip">>, ClientInfo), - url = maps:get(<<"url">>, ClientInfo, undefined) + url = maps:get(<<"url">>, ClientInfo, undefined), + browser_info = encode_browser_info(maps:get(<<"browserInfo">>, ClientInfo, undefined)), + device_info = encode_device_info(maps:get(<<"deviceInfo">>, ClientInfo, undefined)), + peer_user_agent = maps:get(<<"peer_user_agent">>, ClientInfo, undefined), + peer_accept_header = maps:get(<<"peer_accept_header">>, ClientInfo, undefined) }. -spec encode_content(json, term()) -> encode_data(). @@ -32,3 +36,60 @@ encode_content(json, Data) -> -spec encode_crypto_currency(binary()) -> encode_data(). encode_crypto_currency(CryptoCurrency) -> #domain_CryptoCurrencyRef{id = CryptoCurrency}. + +%% Internals + +encode_browser_info(undefined) -> + undefined; +encode_browser_info(BrowserInfo) -> + #domain_BrowserInfo{ + accept_header = maps:get(<<"browserAcceptHeader">>, BrowserInfo, undefined), + user_agent = maps:get(<<"browserUserAgent">>, BrowserInfo, undefined), + language = maps:get(<<"browserLanguage">>, BrowserInfo, undefined), + color_depth = maps:get(<<"browserColorDepth">>, BrowserInfo, undefined), + screen_width = maps:get(<<"browserScreenWidth">>, BrowserInfo, undefined), + screen_height = maps:get(<<"browserScreenHeight">>, BrowserInfo, undefined), + tz_offset = maps:get(<<"browserTZ">>, BrowserInfo, undefined) + }. + +encode_device_info(undefined) -> + undefined; +encode_device_info(DeviceInfo) -> + #domain_DeviceInfo{ + device_type = encode_device_type(maps:get(<<"deviceType">>, DeviceInfo, undefined)), + os_name = maps:get(<<"osName">>, DeviceInfo, undefined), + os_version = maps:get(<<"osVersion">>, DeviceInfo, undefined), + device_model = maps:get(<<"deviceModel">>, DeviceInfo, undefined), + browser_name = maps:get(<<"browserName">>, DeviceInfo, undefined), + browser_version = maps:get(<<"browserVersion">>, DeviceInfo, undefined), + time_zone = maps:get(<<"timeZone">>, DeviceInfo, undefined), + languages = maps:get(<<"languages">>, DeviceInfo, undefined), + screen_pixel_ratio = maps:get(<<"screenPixelRatio">>, DeviceInfo, undefined), + web_view = maps:get(<<"webView">>, DeviceInfo, undefined), + user_agent_brands = encode_brands(maps:get(<<"userAgentBrands">>, DeviceInfo, undefined)) + }. + +encode_device_type(undefined) -> + undefined; +encode_device_type(<<"desktop">>) -> + {desktop, #domain_DeviceTypeDesktop{}}; +encode_device_type(<<"mobile">>) -> + {mobile, #domain_DeviceTypeMobile{}}; +encode_device_type(<<"tablet">>) -> + {tablet, #domain_DeviceTypeTablet{}}; +encode_device_type(<<"unknown">>) -> + {unknown, #domain_DeviceTypeUnknown{}}. + +encode_brands(undefined) -> + undefined; +encode_brands(UserAgentBrands) -> + lists:map( + fun(Brand) -> encode_brand(Brand) end, + UserAgentBrands + ). + +encode_brand(Brand) -> + #domain_UserAgentBrand{ + brand = maps:get(<<"brand">>, Brand, undefined), + version = maps:get(<<"version">>, Brand, undefined) + }. diff --git a/apps/capi/src/capi_handler_tokens.erl b/apps/capi/src/capi_handler_tokens.erl index 17fd512..7b48b44 100644 --- a/apps/capi/src/capi_handler_tokens.erl +++ b/apps/capi/src/capi_handler_tokens.erl @@ -8,6 +8,7 @@ -include_lib("cds_proto/include/cds_proto_storage_thrift.hrl"). -include_lib("tds_proto/include/tds_storage_thrift.hrl"). -include_lib("damsel/include/dmsl_paytool_provider_thrift.hrl"). +-include_lib("damsel/include/dmsl_domain_conf_v2_thrift.hrl"). -include_lib("moneypenny/include/mnp_thrift.hrl"). -include_lib("bouncer_proto/include/bouncer_rstn_thrift.hrl"). @@ -89,10 +90,13 @@ process_request('CreatePaymentResource', Req, Context, Resolution) -> end end, + Headers = capi_handler_utils:request_headers(Context), ClientInfo1 = ClientInfo0#{ <<"ip">> => ClientIP, <<"peer_ip">> => PeerIP, - <<"user_ip">> => UserIP + <<"user_ip">> => UserIP, + <<"peer_user_agent">> => maps:get(<<"user-agent">>, Headers, undefined), + <<"peer_accept_header">> => maps:get(<<"accept">>, Headers, undefined) }, try @@ -748,4 +752,10 @@ encode_payment_service_ref(Provider) -> #domain_PaymentServiceRef{id = Provider}. validate_payment_service_ref(#domain_PaymentServiceRef{} = Ref) -> - dmt_client:try_checkout_data({payment_service, Ref}). + try dmt_client:checkout_object({payment_service, Ref}) of + Object -> + {ok, Object} + catch + throw:#domain_conf_v2_ObjectNotFound{} -> + {error, object_not_found} + end. diff --git a/apps/capi/src/capi_handler_utils.erl b/apps/capi/src/capi_handler_utils.erl index 0a3799d..9bdaf22 100644 --- a/apps/capi/src/capi_handler_utils.erl +++ b/apps/capi/src/capi_handler_utils.erl @@ -8,6 +8,8 @@ -export([get_auth_context/1]). +-export([request_headers/1]). + -export([get_party_id/1]). -export([merge_and_compact/2]). @@ -82,6 +84,12 @@ service_call({ServiceName, Function, Args}, #{woody_context := WoodyContext}) -> get_auth_context(#{swagger_context := #{auth_context := AuthContext}}) -> AuthContext. +-spec request_headers(processing_context()) -> cowboy:http_headers(). +request_headers(#{swagger_context := #{cowboy_req := Req}}) -> + cowboy_req:headers(Req); +request_headers(_) -> + #{}. + %% Utils -spec merge_and_compact(map(), map()) -> map(). diff --git a/apps/capi/src/capi_merchant_id.erl b/apps/capi/src/capi_merchant_id.erl index b207048..8970cbd 100644 --- a/apps/capi/src/capi_merchant_id.erl +++ b/apps/capi/src/capi_merchant_id.erl @@ -1,9 +1,10 @@ -module(capi_merchant_id). -include_lib("damsel/include/dmsl_paytool_provider_thrift.hrl"). +-include_lib("damsel/include/dmsl_domain_thrift.hrl"). --type party_id() :: dmsl_domain_thrift:'PartyID'(). --type shop_id() :: dmsl_domain_thrift:'ShopID'(). +-type party_id() :: dmsl_base_thrift:'ID'(). +-type shop_id() :: dmsl_base_thrift:'ID'(). -type realm() :: dmsl_domain_thrift:'PaymentInstitutionRealm'(). -type merchant_data() :: dmsl_paytool_provider_thrift:'MerchantID'(). -type merchant_id() :: binary(). @@ -18,11 +19,11 @@ -define(THRIFT_TYPE, {struct, struct, {dmsl_paytool_provider_thrift, 'MerchantID'}}). -spec party_id(merchant_data()) -> party_id(). -party_id(#paytool_provider_MerchantID{party_id = PartyID}) -> +party_id(#paytool_provider_MerchantID{party_ref = #domain_PartyConfigRef{id = PartyID}}) -> PartyID. -spec shop_id(merchant_data()) -> shop_id(). -shop_id(#paytool_provider_MerchantID{shop_id = ShopID}) -> +shop_id(#paytool_provider_MerchantID{shop_ref = #domain_ShopConfigRef{id = ShopID}}) -> ShopID. -spec realm(merchant_data()) -> realm() | undefined. @@ -32,8 +33,8 @@ realm(#paytool_provider_MerchantID{realm = Realm}) -> -spec encode(realm(), party_id(), shop_id()) -> merchant_id(). encode(Realm, PartyID, ShopID) -> encode(#paytool_provider_MerchantID{ - party_id = PartyID, - shop_id = ShopID, + party_ref = #domain_PartyConfigRef{id = PartyID}, + shop_ref = #domain_ShopConfigRef{id = ShopID}, realm = Realm }). diff --git a/apps/capi/test/capi_ct_helper.erl b/apps/capi/test/capi_ct_helper.erl index e73d977..3292b52 100644 --- a/apps/capi/test/capi_ct_helper.erl +++ b/apps/capi/test/capi_ct_helper.erl @@ -4,7 +4,7 @@ -include_lib("capi_dummy_data.hrl"). -include_lib("capi_token_keeper_data.hrl"). -include_lib("damsel/include/dmsl_domain_thrift.hrl"). --include_lib("damsel/include/dmsl_domain_conf_thrift.hrl"). +-include_lib("damsel/include/dmsl_domain_conf_v2_thrift.hrl"). -export([init_suite/2]). -export([init_suite/3]). @@ -70,33 +70,41 @@ init_suite(Module, Config, CapiEnv) -> ServiceURLs = mock_services_( [ { - 'Repository', - {dmsl_domain_conf_thrift, 'Repository'}, - fun('Checkout', _) -> - {ok, #domain_conf_Snapshot{ - version = 1, - domain = #{ - ?PAYMENT_SYSTEM_REF(<<"VISA">>) => - ?PAYMENT_SYSTEM_OBJ( - <<"VISA">>, - bankcard_validator_legacy:get_payment_system_ruleset(<<"VISA">>) - ), - ?PAYMENT_SYSTEM_REF(<<"MASTERCARD">>) => - ?PAYMENT_SYSTEM_OBJ( - <<"MASTERCARD">>, - bankcard_validator_legacy:get_payment_system_ruleset(<<"MASTERCARD">>) - ), - ?PAYMENT_SERVICE_REF(<<"qiwi">>) => - ?PAYMENT_SERVICE_OBJ( - <<"qiwi">> - ), - ?PAYMENT_SERVICE_REF(<<"euroset">>) => - ?PAYMENT_SERVICE_OBJ( - <<"euroset">> - ) - } - }} + 'RepositoryClient', + {dmsl_domain_conf_v2_thrift, 'RepositoryClient'}, + fun + ('CheckoutObject', {{version, V}, ?PAYMENT_SYSTEM_REF(<<"VISA">>)}) -> + PaymentSystemObject = ?PAYMENT_SYSTEM_OBJ( + <<"VISA">>, + bankcard_validator_legacy:get_payment_system_ruleset(<<"VISA">>) + ), + {ok, mk_versioned_object(PaymentSystemObject, V)}; + ('CheckoutObject', {{version, V}, ?PAYMENT_SYSTEM_REF(<<"MASTERCARD">>)}) -> + PaymentSystemObject = ?PAYMENT_SYSTEM_OBJ( + <<"VISA">>, + bankcard_validator_legacy:get_payment_system_ruleset(<<"MASTERCARD">>) + ), + {ok, mk_versioned_object(PaymentSystemObject, V)}; + ('CheckoutObject', {{version, V}, ?PAYMENT_SYSTEM_REF(<<"NSPK MIR">>)}) -> + PaymentSystemObject = ?PAYMENT_SYSTEM_OBJ( + <<"NSPK MIR">>, + bankcard_validator_legacy:get_payment_system_ruleset(<<"NSPK MIR">>) + ), + {ok, mk_versioned_object(PaymentSystemObject, V)}; + ('CheckoutObject', {{version, V}, ?PAYMENT_SERVICE_REF(<<"qiwi">>)}) -> + PaymentServiceObject = ?PAYMENT_SERVICE_OBJ(<<"qiwi">>), + {ok, mk_versioned_object(PaymentServiceObject, V)}; + ('CheckoutObject', {{version, V}, ?PAYMENT_SERVICE_REF(<<"euroset">>)}) -> + PaymentServiceObject = ?PAYMENT_SERVICE_OBJ(<<"euroset">>), + {ok, mk_versioned_object(PaymentServiceObject, V)}; + ('CheckoutObject', {{version, _V}, _ObjectRef}) -> + erlang:throw(#domain_conf_v2_ObjectNotFound{}) end + }, + { + 'Repository', + {dmsl_domain_conf_v2_thrift, 'Repository'}, + fun('GetLatestVersion', _) -> {ok, ?INTEGER} end } ], SupPid @@ -282,3 +290,17 @@ get_lifetime(YY, MM, DD) -> <<"months">> => MM, <<"days">> => DD }. + +mk_versioned_object(Object, Version) -> + #domain_conf_v2_VersionedObject{ + info = #domain_conf_v2_VersionedObjectInfo{ + version = Version, + changed_at = genlib_rfc3339:format(genlib_time:unow(), second), + changed_by = #domain_conf_v2_Author{ + id = ?STRING, + name = ?STRING, + email = ?STRING + } + }, + object = Object + }. diff --git a/apps/capi/test/capi_dummy_data.hrl b/apps/capi/test/capi_dummy_data.hrl index 5542447..8e6f8cd 100644 --- a/apps/capi/test/capi_dummy_data.hrl +++ b/apps/capi/test/capi_dummy_data.hrl @@ -98,3 +98,31 @@ message_expiration = ?TIMESTAMP }} ). + +-define(BROWSER_INFO, #{ + <<"browserAcceptHeader">> => <<"application/json">>, + <<"browserUserAgent">> => <<"chromium">>, + <<"browserLanguage">> => <<"ru-RU">>, + <<"browserColorDepth">> => <<"24">>, + <<"browserScreenWidth">> => <<"1080">>, + <<"browserScreenHeight">> => <<"1080">>, + <<"browserTZ">> => <<"-480">> +}). + +-define(DEVICE_INFO, #{ + <<"deviceType">> => <<"desktop">>, + <<"osName">> => <<"iOS">>, + <<"osVersion">> => <<"17.5.1">>, + <<"deviceModel">> => <<"iPhone">>, + <<"browserName">> => <<"Safari">>, + <<"browserVersion">> => <<"126">>, + <<"timeZone">> => <<"Asia/Dubai">>, + <<"languages">> => [<<"ru">>, <<"en">>], + <<"screenPixelRatio">> => 2, + <<"webView">> => true, + <<"userAgentBrands">> => [?USER_AGENT_BRAND(<<"Chrome">>), ?USER_AGENT_BRAND(<<"Firefox">>)] +}). + +-define(USER_AGENT_BRAND(Name), #{ + <<"brand">> => Name +}). diff --git a/apps/capi/test/capi_payment_resources_tests_SUITE.erl b/apps/capi/test/capi_payment_resources_tests_SUITE.erl index 78876f0..a76cd47 100644 --- a/apps/capi/test/capi_payment_resources_tests_SUITE.erl +++ b/apps/capi/test/capi_payment_resources_tests_SUITE.erl @@ -423,7 +423,11 @@ create_visa_with_empty_cvc_ok_test(Config) -> ], Config ), - ClientInfo = #{<<"fingerprint">> => <<"test fingerprint">>}, + ClientInfo = #{ + <<"deviceInfo">> => ?DEVICE_INFO, + <<"browserInfo">> => ?BROWSER_INFO, + <<"fingerprint">> => <<"test fingerprint">> + }, {ok, #{ <<"paymentToolDetails">> := #{ <<"detailsType">> := <<"PaymentToolDetailsBankCard">>, @@ -432,6 +436,7 @@ create_visa_with_empty_cvc_ok_test(Config) -> <<"first6">> := <<"411111">>, <<"cardNumberMask">> := <<"411111******1111">> }, + <<"paymentSession">> := PaymentSession, <<"resourceToken">> := ?STRING }} = capi_client_tokens:create_payment_resource(?config(context, Config), #{ <<"paymentTool">> => #{ @@ -441,7 +446,17 @@ create_visa_with_empty_cvc_ok_test(Config) -> <<"expDate">> => <<"08/27">> }, <<"clientInfo">> => ClientInfo - }). + }), + #{ + <<"clientInfo">> := #{ + <<"browser_info">> := BrowserInfo, + <<"device_info">> := DeviceInfo, + <<"peer_accept_header">> := <<"application/json">>, + <<"peer_user_agent">> := <<"hackney/", _Ver/binary>> + } + } = capi_utils:base64url_to_map(PaymentSession), + ?assertEqual(?BROWSER_INFO, BrowserInfo), + ?assertEqual(?DEVICE_INFO, DeviceInfo). -spec create_visa_with_wrong_cvc_test(_) -> _. create_visa_with_wrong_cvc_test(Config) -> @@ -1063,7 +1078,4 @@ get_keysource(Key, Config) -> gateway_merchant_id() -> % MerchantID сгенерированный в capi методом % capi_merchant_id:encode(live, <<"party-a4ef-4d03-b666-bdec4b26c5f7">>, <<"shop-a4ef-4d03-b666-bdec4b26c5f7">>) - << - "CwABAAAAIXBhcnR5LWE0ZWYtNGQwMy1iNjY2LWJkZWM0YjI2YzVmNwsAAgAAAC" - "BzaG9wLWE0ZWYtNGQwMy1iNjY2LWJkZWM0YjI2YzVmNwgAAwAAAAEA" - >>. + capi_merchant_id:encode(live, <<"party-a4ef-4d03-b666-bdec4b26c5f7">>, <<"shop-a4ef-4d03-b666-bdec4b26c5f7">>). diff --git a/rebar.config b/rebar.config index 31383e8..a928d68 100644 --- a/rebar.config +++ b/rebar.config @@ -34,7 +34,7 @@ {cowboy_draining_server, {git, "https://github.com/valitydev/cowboy_draining_server.git", {branch, "master"}}}, {woody, {git, "https://github.com/valitydev/woody_erlang.git", {tag, "v1.1.0"}}}, {woody_user_identity, {git, "https://github.com/valitydev/woody_erlang_user_identity.git", {tag, "v1.1.0"}}}, - {damsel, {git, "https://github.com/valitydev/damsel.git", {branch, "master"}}}, + {damsel, {git, "https://github.com/valitydev/damsel.git", {tag, "v2.2.44"}}}, {lechiffre, {git, "https://github.com/valitydev/lechiffre.git", {tag, "v0.1.0"}}}, {binbase_proto, {git, "https://github.com/valitydev/binbase-proto.git", {branch, "master"}}}, {tds_proto, {git, "https://github.com/valitydev/tds-proto.git", {branch, "master"}}}, @@ -49,12 +49,12 @@ {bouncer_proto, {git, "https://github.com/valitydev/bouncer-proto.git", {branch, "master"}}}, {bouncer_client, {git, "https://github.com/valitydev/bouncer-client-erlang.git", {tag, "v1.1.0"}}}, {token_keeper_client, {git, "https://github.com/valitydev/token-keeper-client.git", {tag, "v1.1.0"}}}, - {dmt_client, {git, "https://github.com/valitydev/dmt_client.git", {branch, master}}}, + {dmt_client, {git, "https://github.com/valitydev/dmt_client.git", {tag, "v2.0.3"}}}, {prometheus, "4.11.0"}, {prometheus_cowboy, "0.1.9"}, % Generated dependencies - {swag_server, {git, "https://github.com/valitydev/swag-payments.git", {branch, "release/erlang/server/v2"}}}, - {swag_client, {git, "https://github.com/valitydev/swag-payments.git", {branch, "release/erlang/client/v2"}}}, + {swag_server, {git, "https://github.com/valitydev/swag-payments.git", {branch, "release/erlang/server/v3"}}}, + {swag_client, {git, "https://github.com/valitydev/swag-payments.git", {branch, "release/erlang/client/v3"}}}, %% OpenTelemetry deps {opentelemetry_api, "1.4.0"}, {opentelemetry, "1.5.0"}, diff --git a/rebar.lock b/rebar.lock index edb199b..0d611bb 100644 --- a/rebar.lock +++ b/rebar.lock @@ -3,7 +3,7 @@ {<<"acceptor_pool">>,{pkg,<<"acceptor_pool">>,<<"1.0.0">>},2}, {<<"bankcard_validator">>, {git,"https://github.com/valitydev/bankcard-validator.git", - {ref,"d9c82e9fa7b017278b3f72d9e27ff0249a5e40d7"}}, + {ref,"28073759961858a76a8ebaa294f32ed3123d6dd6"}}, 0}, {<<"binbase_proto">>, {git,"https://github.com/valitydev/binbase-proto.git", @@ -45,16 +45,12 @@ {<<"ctx">>,{pkg,<<"ctx">>,<<"0.6.0">>},2}, {<<"damsel">>, {git,"https://github.com/valitydev/damsel.git", - {ref,"24932cdc557a75bfb3a4aeb1738638366003aba4"}}, + {ref,"e7a78d866c3b56885470705a2fcd8bfb37c59044"}}, 0}, {<<"dmt_client">>, {git,"https://github.com/valitydev/dmt_client.git", - {ref,"d8a4f490d49c038d96f1cbc2a279164c6f4039f9"}}, + {ref,"20c18cc9b51d0f273db60c929e8a8a871d6a1866"}}, 0}, - {<<"dmt_core">>, - {git,"https://github.com/valitydev/dmt-core.git", - {ref,"19d8f57198f2cbe5b64aa4a923ba32774e505503"}}, - 1}, {<<"email_validator">>,{pkg,<<"email_validator">>,<<"1.1.0">>},0}, {<<"erl_health">>, {git,"https://github.com/valitydev/erlang-health.git", @@ -126,11 +122,11 @@ {<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.6">>},1}, {<<"swag_client">>, {git,"https://github.com/valitydev/swag-payments.git", - {ref,"c69fe919595791304c861925cfddc4448785a4a2"}}, + {ref,"ad3c3ce6d505f12010482f11a5e2fbc273076b6e"}}, 0}, {<<"swag_server">>, {git,"https://github.com/valitydev/swag-payments.git", - {ref,"5d9b348a8f9cfeaea85a2f259e13f19a248e2aef"}}, + {ref,"316f9c1acb0f9f687f49d63069b5b771bddf4484"}}, 0}, {<<"tds_proto">>, {git,"https://github.com/valitydev/tds-proto.git",