From a799c57ab40476545f26ca709db03d48445ca60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hl=C3=B6=C3=B0ver=20Sigur=C3=B0sson?= Date: Mon, 4 Dec 2023 22:33:38 +0100 Subject: [PATCH] feat: simplified tls protocol support --- apps/arweave/include/ar.hrl | 2 +- apps/arweave/include/ar_config.hrl | 4 +- apps/arweave/src/ar.erl | 33 ++-- apps/arweave/src/ar_config.erl | 25 +-- apps/arweave/src/ar_http_iface_middleware.erl | 18 +- apps/arweave/src/ar_http_iface_server.erl | 168 +++--------------- apps/arweave/src/ar_util.erl | 13 +- apps/arweave/test/ar_config_tests.erl | 2 - nix/arweave.nix | 8 +- rebar.config | 2 +- rebar.lock | 12 +- 11 files changed, 80 insertions(+), 207 deletions(-) diff --git a/apps/arweave/include/ar.hrl b/apps/arweave/include/ar.hrl index 43f82703f..571a94ea6 100644 --- a/apps/arweave/include/ar.hrl +++ b/apps/arweave/include/ar.hrl @@ -370,7 +370,7 @@ %% The global sequence number of the nonce limiter step at which the block was found. global_step_number = 1, %% ?VDF_CHECKPOINT_COUNT_IN_STEP checkpoints from the most recent step in the nonce - %% limiter process. + %% limiter process. last_step_checkpoints = [], %% A list of the output of each step of the nonce limiting process. Note: each step %% has ?VDF_CHECKPOINT_COUNT_IN_STEP checkpoints, the last of which is that step's output. diff --git a/apps/arweave/include/ar_config.hrl b/apps/arweave/include/ar_config.hrl index 19e1d448a..7cddd4fe2 100644 --- a/apps/arweave/include/ar_config.hrl +++ b/apps/arweave/include/ar_config.hrl @@ -144,8 +144,6 @@ transaction_blacklist_urls = [], transaction_whitelist_files = [], transaction_whitelist_urls = [], - gateway_domain = not_set, - gateway_custom_domains = [], requests_per_minute_limit = ?DEFAULT_REQUESTS_PER_MINUTE_LIMIT, requests_per_minute_limit_by_ip = #{}, max_propagation_peers = ?DEFAULT_MAX_PROPAGATION_PEERS, @@ -186,6 +184,8 @@ defragmentation_modules = [], block_throttle_by_ip_interval = ?DEFAULT_BLOCK_THROTTLE_BY_IP_INTERVAL_MS, block_throttle_by_solution_interval = ?DEFAULT_BLOCK_THROTTLE_BY_SOLUTION_INTERVAL_MS, + tls_cert_file = not_set, %% required to enable TLS + tls_key_file = not_set, %% required to enable TLS p3 = #p3_config{}, coordinated_mining = false, cm_api_secret = not_set, diff --git a/apps/arweave/src/ar.erl b/apps/arweave/src/ar.erl index f2cb922ef..34bce598f 100644 --- a/apps/arweave/src/ar.erl +++ b/apps/arweave/src/ar.erl @@ -253,6 +253,10 @@ show_help() -> {"defragment_module", "Run defragmentation of the chunk storage files from the given storage module." " Assumes the run_defragmentation flag is provided."}, + {"tls_cert_file", + "Optional path to the TLS certificate file for TLS support, depends on 'tls_key_file' being set as well."}, + {"tls_key_file", + "The path to the TLS key file for TLS support, depends on 'tls_cert_file' being set as well."}, {"coordinated_mining", "Enable coordinated mining. You need to also set " "cm_api_secret, cm_peer, and cm_exit_peer."}, {"cm_api_secret", "Coordinated mining secret for authenticated " @@ -424,10 +428,14 @@ parse_cli_args(["enable", Feature | Rest ], C = #config{ enable = Enabled }) -> parse_cli_args(Rest, C#config{ enable = [ list_to_atom(Feature) | Enabled ] }); parse_cli_args(["disable", Feature | Rest ], C = #config{ disable = Disabled }) -> parse_cli_args(Rest, C#config{ disable = [ list_to_atom(Feature) | Disabled ] }); -parse_cli_args(["gateway", Domain | Rest ], C) -> - parse_cli_args(Rest, C#config{ gateway_domain = list_to_binary(Domain) }); -parse_cli_args(["custom_domain", Domain | Rest], C = #config{ gateway_custom_domains = Ds }) -> - parse_cli_args(Rest, C#config{ gateway_custom_domains = [ list_to_binary(Domain) | Ds ] }); +parse_cli_args(["gateway", _ | Rest ], C) -> + ?LOG_WARNING("Deprecated option found 'gateway': " + " this option has been removed and is now a no-op.", []), + parse_cli_args(Rest, C#config{ }); +parse_cli_args(["custom_domain", _ | Rest], C = #config{ }) -> + ?LOG_WARNING("Deprecated option found 'custom_domain': " + " this option has been removed and is a no-op.", []), + parse_cli_args(Rest, C#config{ }); parse_cli_args(["requests_per_minute_limit", Num | Rest], C) -> parse_cli_args(Rest, C#config{ requests_per_minute_limit = list_to_integer(Num) }); parse_cli_args(["max_propagation_peers", Num | Rest], C) -> @@ -498,6 +506,14 @@ parse_cli_args(["defragment_module", DefragModuleString | Rest], C) -> io:format("~ndefragment_module value must be in the [number],[address] format.~n~n"), erlang:halt() end; +parse_cli_args(["tls_cert_file", CertFilePath | Rest], C) -> + AbsCertFilePath = filename:absname(CertFilePath), + ar_util:assert_file_exists_and_readable(AbsCertFilePath), + parse_cli_args(Rest, C#config{ tls_cert_file = AbsCertFilePath }); +parse_cli_args(["tls_key_file", KeyFilePath | Rest], C) -> + AbsKeyFilePath = filename:absname(KeyFilePath), + ar_util:assert_file_exists_and_readable(AbsKeyFilePath), + parse_cli_args(Rest, C#config{ tls_key_file = AbsKeyFilePath }); parse_cli_args(["coordinated_mining" | Rest], C) -> parse_cli_args(Rest, C#config{ coordinated_mining = true }); parse_cli_args(["cm_api_secret", CMSecret | Rest], C) @@ -623,15 +639,6 @@ start(normal, _Args) -> prometheus_registry:register_collector(ar_metrics_collector), %% Register custom metrics. ar_metrics:register(Config#config.metrics_dir), - %% Verify port collisions when gateway is enabled. - case {Config#config.port, Config#config.gateway_domain} of - {P, D} when is_binary(D) andalso (P == 80 orelse P == 443) -> - io:format( - "~nThe port must be different than 80 or 443 when the gateway is enabled.~n~n"), - erlang:halt(); - _ -> - do_nothing - end, %% Start other apps which we depend on. ok = prepare_graphql(), case Config#config.ipfs_pin of diff --git a/apps/arweave/src/ar_config.erl b/apps/arweave/src/ar_config.erl index 7fc254e6e..b0c0cd444 100644 --- a/apps/arweave/src/ar_config.erl +++ b/apps/arweave/src/ar_config.erl @@ -390,25 +390,14 @@ parse_options([{<<"disable">>, Features} | Rest], Config) when is_list(Features) end; parse_options([{<<"disable">>, Features} | _], _) -> {error, {bad_type, disable, array}, Features}; - -parse_options([{<<"gateway">>, Domain} | Rest], Config) when is_binary(Domain) -> - parse_options(Rest, Config#config{ gateway_domain = Domain }); -parse_options([{<<"gateway">>, false} | Rest], Config) -> +parse_options([{<<"gateway">>, _} | Rest], Config) -> + ?LOG_WARNING("Deprecated option found 'gateway': " + " this option has been removed and is a no-op.", []), + parse_options(Rest, Config); +parse_options([{<<"custom_domains">>, _} | Rest], Config) -> + ?LOG_WARNING("Deprecated option found 'custom_domains': " + " this option has been removed and is a no-op.", []), parse_options(Rest, Config); -parse_options([{<<"gateway">>, Gateway} | _], _) -> - {error, {bad_type, gateway, string}, Gateway}; - -parse_options([{<<"custom_domains">>, CustomDomains} | Rest], Config) - when is_list(CustomDomains) -> - case lists:all(fun is_binary/1, CustomDomains) of - true -> - parse_options(Rest, Config#config{ gateway_custom_domains = CustomDomains }); - false -> - {error, bad_custom_domains} - end; -parse_options([{<<"custom_domains">>, CustomDomains} | _], _) -> - {error, {bad_type, custom_domains, array}, CustomDomains}; - parse_options([{<<"webhooks">>, WebhookConfigs} | Rest], Config) when is_list(WebhookConfigs) -> case parse_webhooks(WebhookConfigs, []) of {ok, ParsedWebhooks} -> diff --git a/apps/arweave/src/ar_http_iface_middleware.erl b/apps/arweave/src/ar_http_iface_middleware.erl index 5f35a166d..3b74f4aa2 100644 --- a/apps/arweave/src/ar_http_iface_middleware.erl +++ b/apps/arweave/src/ar_http_iface_middleware.erl @@ -29,11 +29,10 @@ %% middlewares. It uses the `handler` env value set by cowboy_router %% to determine whether or not it should run, otherwise it lets %% the cowboy_handler middleware run prometheus_cowboy2_handler. -execute(Req, #{ handler := ar_http_iface_handler } = Env) -> +execute(Req, #{ handler := ar_http_iface_handler }) -> Pid = self(), - Req1 = with_arql_semaphore_req_field(Req, Env), HandlerPid = spawn_link(fun() -> - Pid ! {handled, handle(Req1, Pid)} + Pid ! {handled, handle(Req, Pid)} end), {ok, TimeoutRef} = timer:send_after( ?HANDLER_TIMEOUT, @@ -47,8 +46,6 @@ execute(Req, Env) -> %%% Private functions. %%%=================================================================== -with_arql_semaphore_req_field(Req, #{ arql_semaphore := Name }) -> - Req#{ '_ar_http_iface_middleware_arql_semaphore' => Name }. %% @doc In order to be able to have a handler-side timeout, we need to %% handle the request asynchronously. However, cowboy doesn't allow @@ -240,7 +237,6 @@ handle(<<"GET">>, [<<"queue">>], Req, _Pid) -> %% Return additional information about the transaction with the given identifier (hash). %% GET request to endpoint /tx/{hash}/status. handle(<<"GET">>, [<<"tx">>, Hash, <<"status">>], Req, _Pid) -> - ar_semaphore:acquire(arql_semaphore(Req), 5000), case ar_node:is_joined() of false -> not_joined(Req); @@ -282,7 +278,6 @@ handle(<<"POST">>, [<<"arql">>], Req, Pid) -> {ok, Config} = application:get_env(arweave, config), case lists:member(serve_arql, Config#config.enable) of true -> - ar_semaphore:acquire(arql_semaphore(Req), 5000), case ar_node:is_joined() of false -> not_joined(Req); @@ -1108,7 +1103,6 @@ handle(<<"GET">>, [<<"wallet">>, Addr, <<"txs">>], Req, _Pid) -> {ok, Config} = application:get_env(arweave, config), case lists:member(serve_wallet_txs, Config#config.enable) of true -> - ar_semaphore:acquire(arql_semaphore(Req), 5000), {Status, Headers, Body} = handle_get_wallet_txs(Addr, none), {Status, Headers, Body, Req}; false -> @@ -1122,7 +1116,6 @@ handle(<<"GET">>, [<<"wallet">>, Addr, <<"txs">>, EarliestTX], Req, _Pid) -> {ok, Config} = application:get_env(arweave, config), case lists:member(serve_wallet_txs, Config#config.enable) of true -> - ar_semaphore:acquire(arql_semaphore(Req), 5000), {Status, Headers, Body} = handle_get_wallet_txs(Addr, ar_util:decode(EarliestTX)), {Status, Headers, Body, Req}; false -> @@ -1136,7 +1129,6 @@ handle(<<"GET">>, [<<"wallet">>, Addr, <<"deposits">>], Req, _Pid) -> {ok, Config} = application:get_env(arweave, config), case lists:member(serve_wallet_deposits, Config#config.enable) of true -> - ar_semaphore:acquire(arql_semaphore(Req), 5000), case catch ar_arql_db:select_txs_by([{to, [Addr]}]) of TXMaps when is_list(TXMaps) -> TXIDs = lists:map(fun(#{ id := ID }) -> ID end, TXMaps), @@ -1155,7 +1147,6 @@ handle(<<"GET">>, [<<"wallet">>, Addr, <<"deposits">>, EarliestDeposit], Req, _P {ok, Config} = application:get_env(arweave, config), case lists:member(serve_wallet_deposits, Config#config.enable) of true -> - ar_semaphore:acquire(arql_semaphore(Req), 5000), case catch ar_arql_db:select_txs_by([{to, [Addr]}]) of TXMaps when is_list(TXMaps) -> TXIDs = lists:map(fun(#{ id := ID }) -> ID end, TXMaps), @@ -1533,9 +1524,6 @@ handle_get_block_index_range(Start, End, CurrentHeight, RecentBI, Req, Encoding) sendfile(Filename) -> {sendfile, 0, filelib:file_size(Filename), Filename}. -arql_semaphore(#{'_ar_http_iface_middleware_arql_semaphore' := Name}) -> - Name. - not_found(Req) -> {400, #{}, <<"Request type not found.">>, Req}. @@ -2227,7 +2215,7 @@ check_api_secret(Header, Secret, APIName, Req) -> %% Reduce efficiency of timing attacks by sleeping randomly between 1-2s. timer:sleep(rand:uniform(1000) + 1000), {reject, { - 421, #{}, + 421, #{}, <> }} end, diff --git a/apps/arweave/src/ar_http_iface_server.erl b/apps/arweave/src/ar_http_iface_server.erl index edc5005f5..9135fde8b 100644 --- a/apps/arweave/src/ar_http_iface_server.erl +++ b/apps/arweave/src/ar_http_iface_server.erl @@ -15,7 +15,6 @@ ar_blacklist_middleware, ar_network_middleware, cowboy_router, - ar_arql_middleware, ar_http_iface_middleware, cowboy_handler ]). @@ -65,157 +64,38 @@ start() -> ), ok = ar_blacklist_middleware:start(), ok = start_http_iface_listener(Config), - ok = start_gateway_listeners(Config), ok. start_http_iface_listener(Config) -> Dispatch = cowboy_router:compile([{'_', ?HTTP_IFACE_ROUTES}]), - HttpIfaceEnv = #{ dispatch => Dispatch }, - TransportOpts = #{ - max_connections => Config#config.max_connections, - socket_opts => [ - {port, Config#config.port}, - {keepalive, true} - ] + TlsCertfilePath = Config#config.tls_cert_file, + TlsKeyfilePath = Config#config.tls_key_file, + TransportOpts = [ + {port, Config#config.port}, + {keepalive, true}, + {max_connections, Config#config.max_connections} + ], + ProtocolOpts = #{ + inactivity_timeout => 120000, + idle_timeout => 30000, + middlewares => ?HTTP_IFACE_MIDDLEWARES, + env => #{ dispatch => Dispatch }, + metrics_callback => fun prometheus_cowboy2_instrumenter:observe/1, + stream_handlers => [cowboy_metrics_h, cowboy_stream_h] }, - ProtocolOpts = protocol_opts([{http_iface, HttpIfaceEnv}]), - {ok, _} = cowboy:start_clear(ar_http_iface_listener, TransportOpts, ProtocolOpts), - ok. - -stop() -> - lists:foreach(fun(Listener) -> - try cowboy:stop_listener(Listener) of - _ -> ok - catch - _:_ -> ok - end - end, [ar_http_iface_listener, ar_http_gateway_listener, ar_https_gateway_listener]). - -start_gateway_listeners(Config) -> - case Config#config.gateway_domain of - Domain when is_binary(Domain) -> - ok = start_http_gateway_listener(Config), - ok = start_https_gateway_listener(Config), - ok; + case CertfilePath of not_set -> - ok - end. - -start_http_gateway_listener(Config) -> - Domain = Config#config.gateway_domain, - CustomDomains = Config#config.gateway_custom_domains, - TransportOpts = #{ - max_connections => 100, - num_acceptors => 100, - socket_opts => [{port, 80}] - }, - ProtocolOpts = protocol_opts([{gateway, Domain, CustomDomains}]), - {ok, _} = cowboy:start_clear(ar_http_gateway_listener, TransportOpts, ProtocolOpts), - ok. - -start_https_gateway_listener(Config) -> - PrivDir = code:priv_dir(arweave), - Domain = Config#config.gateway_domain, - CustomDomains = Config#config.gateway_custom_domains, - Dispatch = cowboy_router:compile([{'_', ?HTTP_IFACE_ROUTES}]), - HttpIfaceEnv = #{ dispatch => Dispatch }, - SniHosts = derive_sni_hosts(CustomDomains), - TransportOpts = #{ - max_connections => Config#config.max_gateway_connections, - socket_opts => [ - {port, 443}, - {certfile, filename:join([PrivDir, "tls/cert.pem"])}, - {keyfile, filename:join([PrivDir, "tls/key.pem"])}, - {sni_hosts, SniHosts} - ] ++ cacertfile_when_present() - }, - ProtocolOpts = protocol_opts([{http_iface, HttpIfaceEnv}, {gateway, Domain, CustomDomains}]), - {ok, _} = cowboy:start_tls(ar_https_gateway_listener, TransportOpts, ProtocolOpts), - ok. - -protocol_opts(List) -> - Opts1 = #{ middlewares := Middlewares1, env := Env1 } = - case proplists:lookup(http_iface, List) of - {http_iface, HttpIfaceEnv} -> - #{ - inactivity_timeout => 120000, - idle_timeout => 30000, - middlewares => ?HTTP_IFACE_MIDDLEWARES, - env => HttpIfaceEnv, - metrics_callback => fun prometheus_cowboy2_instrumenter:observe/1, - stream_handlers => [cowboy_metrics_h, cowboy_stream_h] - }; - none -> - #{ middlewares => [], env => #{} } - end, - Opts2 = - case proplists:lookup(gateway, List) of - {gateway, Domain, CustomDomains} -> - Opts1#{ - middlewares := [ar_gateway_middleware | Middlewares1], - env := Env1#{ - gateway => {Domain, CustomDomains}, - arql_semaphore => gateway_arql - } - }; - none -> - Opts1#{ - env := Env1#{ arql_semaphore => arql }, - metrics_callback => fun collect_http_response_metrics/1 - } - end, - Opts2. - -derive_sni_hosts(Domains) -> - PrivDir = code:priv_dir(arweave), - lists:map(fun(Domain) -> - SDomain = binary_to_list(Domain), - {SDomain, [ - {certfile, filename:join([PrivDir, "tls", SDomain, "cert.pem"])}, - {keyfile, filename:join([PrivDir, "tls", SDomain, "key.pem"])} - ] ++ cacertfile_when_present(SDomain)} - end, Domains). - -cacertfile_when_present() -> - cacertfile_when_present(apex_domain). - -cacertfile_when_present(Domain) -> - PrivDir = code:priv_dir(arweave), - Filename = case Domain of - apex_domain -> - filename:join([PrivDir, "tls/cacert.pem"]); - CustomDomain -> - filename:join([PrivDir, "tls", CustomDomain, "cacert.pem"]) + {ok, _} = cowboy:start_clear(ar_http_iface_listener, TransportOpts, ProtocolOpts); + _ -> + {ok, _} = cowboy:start_tls(ar_http_iface_listener, TransportOpts ++ [ + {certfile, TlsCertfilePath}, + {keyfile, TlsKeyfilePath} + ], ProtocolOpts) end, - case filelib:is_file(Filename) of - true -> - [{cacertfile, Filename}]; - false -> - [] - end. - -collect_http_response_metrics(Metrics) -> - case maps:get(req, Metrics, no_req) of - no_req -> - ok; - Req -> - prometheus_counter:inc( - http_server_served_bytes_total, - [ar_prometheus_cowboy_labels:label_value(route, #{ req => Req })], - maps:get(resp_body_length, Metrics, 0) - ), - ResponseStatus = maps:get(resp_status, Metrics), - %% Convert the 208 response status binary back to the integer - %% so that it is picked up as a successful response by the cowboy - %% instrumenter. See handle208/1 in ar_http_iface_middleware for the - %% explanation of why 208 is converted into a binary. - prometheus_cowboy2_instrumenter:observe( - Metrics#{ resp_status => convert_208(ResponseStatus) } - ) - end. + ok. -convert_208(<<"208 Already Reported">>) -> 208; -convert_208(Status) -> Status. +stop() -> + cowboy:stop_listener(ar_http_iface_listener). name_route([]) -> "/"; diff --git a/apps/arweave/src/ar_util.erl b/apps/arweave/src/ar_util.erl index 386a086fd..fd654c8b1 100644 --- a/apps/arweave/src/ar_util.erl +++ b/apps/arweave/src/ar_util.erl @@ -7,10 +7,12 @@ genesis_wallets/0, pmap/2, pfilter/2, do_until/3, block_index_entry_from_block/1, bytes_to_mb_string/1, cast_after/3, encode_list_indices/1, parse_list_indices/1, - take_every_nth/2, safe_divide/2, terminal_clear/0, print_stacktrace/0, shuffle_list/1]). + take_every_nth/2, safe_divide/2, terminal_clear/0, print_stacktrace/0, shuffle_list/1, + assert_file_exists_and_readable/1]). -include_lib("arweave/include/ar.hrl"). -include_lib("eunit/include/eunit.hrl"). +-include_lib("kernel/include/file.hrl"). bool_to_int(true) -> 1; bool_to_int(_) -> 0. @@ -360,3 +362,12 @@ print_stacktrace() -> ?LOG_INFO(StacktraceString) end. +% Function to assert that a file exists and is readable +assert_file_exists_and_readable(FilePath) -> + case file:read_file(FilePath) of + {ok, _} -> + ok; + {error, _} -> + io:format("~nThe filepath ~p doesn't exist or isn't readable.~n~n", [FilePath]), + erlang:halt(1) + end. \ No newline at end of file diff --git a/apps/arweave/test/ar_config_tests.erl b/apps/arweave/test/ar_config_tests.erl index b93a98a25..fa642dccb 100644 --- a/apps/arweave/test/ar_config_tests.erl +++ b/apps/arweave/test/ar_config_tests.erl @@ -79,8 +79,6 @@ parse_config() -> transaction_blacklist_urls = ["http://some_blacklist_1", "http://some_blacklist_2/x"], transaction_whitelist_files = ["some_whitelist_1", "some_whitelist_2"], transaction_whitelist_urls = ["http://some_whitelist"], - gateway_domain = <<"gateway.localhost">>, - gateway_custom_domains = [<<"domain1.example">>, <<"domain2.example">>], webhooks = [ #config_webhook{ events = [transaction, block], diff --git a/nix/arweave.nix b/nix/arweave.nix index 7a6d97eaf..0ed7195ce 100644 --- a/nix/arweave.nix +++ b/nix/arweave.nix @@ -261,14 +261,14 @@ let cowboy = buildRebar rec { name = "cowboy"; - version = "2.9.0"; + version = "2.10.0"; buildInputs = [ cowlib rebar3_archive_plugin ranch ]; beamDeps = [ cowlib rebar3_archive_plugin ranch ]; plugins = [ beamPackages.pc ]; src = fetchHex { inherit version; pkg = name; - sha256 = "sha256-LHKfk0tOGqFJr/iC9XxjcsFTmaINVPZcjWe+9YMCG94="; + sha256 = "sha256-Ov3Mtxg8xvFDyxTTz1H6AOU9ueyAzc1SVIL16ZvEHWs="; }; }; @@ -285,12 +285,12 @@ let ranch = buildRebar rec { name = "ranch"; - version = "2.1.0"; + version = "1.8.0"; src = fetchFromGitHub { owner = "ninenines"; repo = name; rev = version; - sha256 = "sha256-Uchp4bE39rWSprNYYdVDE9uk0IZWznsLt9it5dYZQNQ="; + sha256 = "sha256-9tFgIQU5rhYE0/EY4NKRNrKoCG2xlZCoSvtihDNXyg4="; }; }; diff --git a/rebar.config b/rebar.config index f863fa67a..be2ad3aa5 100644 --- a/rebar.config +++ b/rebar.config @@ -2,7 +2,7 @@ {b64fast, {git, "https://github.com/ArweaveTeam/b64fast.git", {ref, "58f0502e49bf73b29d95c6d02460d1fb8d2a5273"}}}, {jiffy, {git, "https://github.com/ArweaveTeam/jiffy.git", {ref, "2f06d848e3ed65897ae76fa96db27be2e7cfa04a"}}}, {gun, "1.3.3"}, - {cowboy, "2.9.0"}, + {cowboy, "2.10.0"}, {graphql, {git, "https://github.com/shopgun/graphql-erlang.git", {branch, "master"}}}, {prometheus, "4.10.0"}, {prometheus_process_collector, diff --git a/rebar.lock b/rebar.lock index aecb20447..f532436ad 100644 --- a/rebar.lock +++ b/rebar.lock @@ -4,8 +4,8 @@ {git,"https://github.com/ArweaveTeam/b64fast.git", {ref,"58f0502e49bf73b29d95c6d02460d1fb8d2a5273"}}, 0}, - {<<"cowboy">>,{pkg,<<"cowboy">>,<<"2.9.0">>},0}, - {<<"cowlib">>,{pkg,<<"cowlib">>,<<"2.11.0">>},1}, + {<<"cowboy">>,{pkg,<<"cowboy">>,<<"2.10.0">>},0}, + {<<"cowlib">>,{pkg,<<"cowlib">>,<<"2.12.1">>},1}, {<<"graphql">>, {git,"https://github.com/shopgun/graphql-erlang.git", {ref,"4fd356294c2acea42a024366bc5a64661e4862d7"}}, @@ -31,8 +31,8 @@ [ {pkg_hash,[ {<<"accept">>, <<"B33B127ABCA7CC948BBE6CAA4C263369ABF1347CFA9D8E699C6D214660F10CD1">>}, - {<<"cowboy">>, <<"865DD8B6607E14CF03282E10E934023A1BD8BE6F6BACF921A7E2A96D800CD452">>}, - {<<"cowlib">>, <<"0B9FF9C346629256C42EBE1EEB769A83C6CB771A6EE5960BD110AB0B9B872063">>}, + {<<"cowboy">>, <<"FF9FFEFF91DAE4AE270DD975642997AFE2A1179D94B1887863E43F681A203E26">>}, + {<<"cowlib">>, <<"A9FA9A625F1D2025FE6B462CB865881329B5CAFF8F1854D1CBC9F9533F00E1E1">>}, {<<"gun">>, <<"CF8B51BEB36C22B9C8DF1921E3F2BC4D2B1F68B49AD4FBC64E91875AA14E16B4">>}, {<<"prometheus">>, <<"792ADBF0130FF61B5FA8826F013772AF24B6E57B984445C8D602C8A0355704A1">>}, {<<"prometheus_cowboy">>, <<"CFCE0BC7B668C5096639084FCD873826E6220EA714BF60A716F5BD080EF2A99C">>}, @@ -41,8 +41,8 @@ {<<"ranch">>, <<"8C7A100A139FD57F17327B6413E4167AC559FBC04CA7448E9BE9057311597A1D">>}]}, {pkg_hash_ext,[ {<<"accept">>, <<"11B18C220BCC2EAB63B5470C038EF10EB6783BCB1FCDB11AA4137DEFA5AC1BB8">>}, - {<<"cowboy">>, <<"2C729F934B4E1AA149AFF882F57C6372C15399A20D54F65C8D67BEF583021BDE">>}, - {<<"cowlib">>, <<"2B3E9DA0B21C4565751A6D4901C20D1B4CC25CBB7FD50D91D2AB6DD287BC86A9">>}, + {<<"cowboy">>, <<"3AFDCCB7183CC6F143CB14D3CF51FA00E53DB9EC80CDCD525482F5E99BC41D6B">>}, + {<<"cowlib">>, <<"163B73F6367A7341B33C794C4E88E7DBFE6498AC42DCD69EF44C5BC5507C8DB0">>}, {<<"gun">>, <<"3106CE167F9C9723F849E4FB54EA4A4D814E3996AE243A1C828B256E749041E0">>}, {<<"prometheus">>, <<"2A99BB6DCE85E238C7236FDE6B0064F9834DC420DDBD962AAC4EA2A3C3D59384">>}, {<<"prometheus_cowboy">>, <<"BA286BECA9302618418892D37BCD5DC669A6CC001F4EB6D6AF85FF81F3F4F34C">>},