This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/main by this push:
     new ff4ca2a  Erlang 24 support
ff4ca2a is described below

commit ff4ca2ab5b1d696f819342c18c16aaf523f1dd30
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Thu May 13 02:21:36 2021 -0400

    Erlang 24 support
    
    Switching crypto functions to use the new ones such as:
    
    ```
    crypto:hmac(Alg, Key, Message) -> crypto:mac(hmac, Alg, Key, Message)
    ```
    
    To simplify Erlang 24 support, in which some crypto functions have
    been removed, bump the minimum version to 22.
    
    Other fixes were in dependencies:
    
      * Bumped meck to 0.9.2. New meck from upstream supports Erlang
        24. Also required bumping folsom since it depends on meck
    
      * Example in passage module would not compile, so commented out
      the parse transform. Required bumping jaeger passage since it
      depends on passage
---
 build-aux/Jenkinsfile.pr           |  1 +
 rebar.config.script                | 10 +++++-----
 src/couch/src/couch_hotp.erl       |  2 +-
 src/couch/src/couch_httpd_auth.erl |  6 +++---
 src/couch/src/couch_passwords.erl  |  4 ++--
 src/couch/src/couch_util.erl       | 26 ++++++++++++++++++++++++++
 src/jwtf/src/jwtf.erl              | 29 +++++++++++++++++++++++++++--
 7 files changed, 65 insertions(+), 13 deletions(-)

diff --git a/build-aux/Jenkinsfile.pr b/build-aux/Jenkinsfile.pr
index 77362b1..8d89b33 100644
--- a/build-aux/Jenkinsfile.pr
+++ b/build-aux/Jenkinsfile.pr
@@ -107,6 +107,7 @@ pipeline {
         axes {
           axis {
             name 'ERLANG_VERSION'
+            // kerl can't build 24 yet
             values '21.3.8.22', '22.3.4.17', '23.3.1'
           }
         }
diff --git a/rebar.config.script b/rebar.config.script
index 2149182..eb37d5b 100644
--- a/rebar.config.script
+++ b/rebar.config.script
@@ -149,16 +149,16 @@ DepDescs = [
 {fauxton,          {url, "https://github.com/apache/couchdb-fauxton"},
                    {tag, "v1.2.6"}, [raw]},
 %% Third party deps
-{folsom,           "folsom",           {tag, "CouchDB-0.8.3"}},
+{folsom,           "folsom",           {tag, "CouchDB-0.8.4"}},
 {hyper,            "hyper",            {tag, "CouchDB-2.2.0-6"}},
 {ibrowse,          "ibrowse",          {tag, "CouchDB-4.4.2-2"}},
-{jaeger_passage,   "jaeger-passage",   {tag, "CouchDB-0.1.14-2"}},
+{jaeger_passage,   "jaeger-passage",   {tag, "CouchDB-0.1.14-4"}},
 {jiffy,            "jiffy",            {tag, "CouchDB-1.0.5-1"}},
 {local,            "local",            {tag, "0.2.1"}},
 {mochiweb,         "mochiweb",         {tag, "v2.20.0"}},
-{meck,             "meck",             {tag, "0.8.8"}},
+{meck,             "meck",             {tag, "0.9.2"}},
 {recon,            "recon",            {tag, "2.5.0"}},
-{passage,          "passage",          {tag, "0.2.6"}},
+{passage,          "passage",          {tag, "CouchDB-0.2.6-1"}},
 {thrift_protocol,  "thrift-protocol",  {tag, "0.1.5"}}
 ].
 
@@ -192,7 +192,7 @@ ErlOpts = case os:getenv("ERL_OPTS") of
 end.
 
 AddConfig = [
-    {require_otp_vsn, "21|22|23"},
+    {require_otp_vsn, "21|22|23|24"},
     {deps_dir, "src"},
     {deps, lists:map(MakeDep, DepDescs ++ OptionalDeps)},
     {sub_dirs, SubDirs},
diff --git a/src/couch/src/couch_hotp.erl b/src/couch/src/couch_hotp.erl
index 9a620fa..4ba81c9 100644
--- a/src/couch/src/couch_hotp.erl
+++ b/src/couch/src/couch_hotp.erl
@@ -16,7 +16,7 @@
 
 generate(Alg, Key, Counter, OutputLen)
   when is_atom(Alg), is_binary(Key), is_integer(Counter), 
is_integer(OutputLen) ->
-    Hmac = crypto:hmac(Alg, Key, <<Counter:64>>),
+    Hmac = couch_util:hmac(Alg, Key, <<Counter:64>>),
     Offset = binary:last(Hmac) band 16#f,
     Code =
         ((binary:at(Hmac, Offset) band 16#7f) bsl 24) +
diff --git a/src/couch/src/couch_httpd_auth.erl 
b/src/couch/src/couch_httpd_auth.erl
index b740220..93b00bd 100644
--- a/src/couch/src/couch_httpd_auth.erl
+++ b/src/couch/src/couch_httpd_auth.erl
@@ -176,7 +176,7 @@ proxy_auth_user(Req) ->
                         undefined ->
                             Req#httpd{user_ctx=#user_ctx{name=?l2b(UserName), 
roles=Roles}};
                         Secret ->
-                            ExpectedToken = couch_util:to_hex(crypto:hmac(sha, 
Secret, UserName)),
+                            ExpectedToken = 
couch_util:to_hex(couch_util:hmac(sha, Secret, UserName)),
                             case header_value(Req, XHeaderToken) of
                                 Token when Token == ExpectedToken ->
                                     
Req#httpd{user_ctx=#user_ctx{name=?l2b(UserName),
@@ -263,7 +263,7 @@ 
cookie_authentication_handler(#httpd{mochi_req=MochiReq}=Req, AuthModule) ->
             {ok, UserProps, _AuthCtx} ->
                 UserSalt = couch_util:get_value(<<"salt">>, UserProps, <<"">>),
                 FullSecret = <<Secret/binary, UserSalt/binary>>,
-                ExpectedHash = crypto:hmac(sha, FullSecret, User ++ ":" ++ 
TimeStr),
+                ExpectedHash = couch_util:hmac(sha, FullSecret, User ++ ":" ++ 
TimeStr),
                 Hash = ?l2b(HashStr),
                 Timeout = list_to_integer(
                     config:get("couch_httpd_auth", "timeout", "600")),
@@ -315,7 +315,7 @@ cookie_auth_header(_Req, _Headers) -> [].
 
 cookie_auth_cookie(Req, User, Secret, TimeStamp) ->
     SessionData = User ++ ":" ++ erlang:integer_to_list(TimeStamp, 16),
-    Hash = crypto:hmac(sha, Secret, SessionData),
+    Hash = couch_util:hmac(sha, Secret, SessionData),
     mochiweb_cookies:cookie("AuthSession",
         couch_util:encodeBase64Url(SessionData ++ ":" ++ ?b2l(Hash)),
         [{path, "/"}] ++ cookie_scheme(Req) ++ max_age() ++ cookie_domain() ++ 
same_site()).
diff --git a/src/couch/src/couch_passwords.erl 
b/src/couch/src/couch_passwords.erl
index baf78f5..87ed151 100644
--- a/src/couch/src/couch_passwords.erl
+++ b/src/couch/src/couch_passwords.erl
@@ -114,12 +114,12 @@ pbkdf2(_Password, _Salt, Iterations, _BlockIndex, 
Iteration, _Prev, Acc)
     when Iteration > Iterations ->
     Acc;
 pbkdf2(Password, Salt, Iterations, BlockIndex, 1, _Prev, _Acc) ->
-    InitialBlock = crypto:hmac(sha, Password,
+    InitialBlock = couch_util:hmac(sha, Password,
         <<Salt/binary,BlockIndex:32/integer>>),
     pbkdf2(Password, Salt, Iterations, BlockIndex, 2,
         InitialBlock, InitialBlock);
 pbkdf2(Password, Salt, Iterations, BlockIndex, Iteration, Prev, Acc) ->
-    Next = crypto:hmac(sha, Password, Prev),
+    Next = couch_util:hmac(sha, Password, Prev),
     pbkdf2(Password, Salt, Iterations, BlockIndex, Iteration + 1,
                    Next, crypto:exor(Next, Acc)).
 
diff --git a/src/couch/src/couch_util.erl b/src/couch/src/couch_util.erl
index af7b7ff..37bf2fc 100644
--- a/src/couch/src/couch_util.erl
+++ b/src/couch/src/couch_util.erl
@@ -40,6 +40,7 @@
 -export([check_md5/2]).
 -export([set_mqd_off_heap/1]).
 -export([set_process_priority/2]).
+-export([hmac/3]).
 
 -include_lib("couch/include/couch_db.hrl").
 
@@ -769,3 +770,28 @@ check_config_blacklist(Section) ->
         end
     end, ?BLACKLIST_CONFIG_SECTIONS),
     ok.
+
+
+-ifdef(OTP_RELEASE).
+
+-if(?OTP_RELEASE >= 22).
+
+% OTP >= 22
+hmac(Alg, Key, Message) ->
+    crypto:mac(hmac, Alg, Key, Message).
+
+-else.
+
+% OTP >= 21, < 22
+hmac(Alg, Key, Message) ->
+    crypto:hmac(Alg, Key, Message).
+
+-endif. % -if(?OTP_RELEASE >= 22)
+
+-else.
+
+% OTP < 21
+hmac(Alg, Key, Message) ->
+    crypto:hmac(Alg, Key, Message).
+
+-endif. % -ifdef(OTP_RELEASE)
diff --git a/src/jwtf/src/jwtf.erl b/src/jwtf/src/jwtf.erl
index a0bbf1f..4c4f80c 100644
--- a/src/jwtf/src/jwtf.erl
+++ b/src/jwtf/src/jwtf.erl
@@ -65,7 +65,7 @@ encode(Header = {HeaderProps}, Claims, Key) ->
             {public_key, Algorithm} ->
                 public_key:sign(Message, Algorithm, Key);
             {hmac, Algorithm} ->
-                crypto:hmac(Algorithm, Key, Message)
+                hmac(Algorithm, Key, Message)
         end,
         EncodedSignatureOrMac = b64url:encode(SignatureOrMac),
         {ok, <<Message/binary, $., EncodedSignatureOrMac/binary>>}
@@ -290,7 +290,7 @@ public_key_verify(Algorithm, Message, Signature, PublicKey) 
->
 
 
 hmac_verify(Algorithm, Message, HMAC, SecretKey) ->
-    case crypto:hmac(Algorithm, SecretKey, Message) of
+    case hmac(Algorithm, SecretKey, Message) of
         HMAC ->
             ok;
         _ ->
@@ -352,6 +352,31 @@ prop(Prop, Props) ->
     proplists:get_value(Prop, Props).
 
 
+-ifdef(OTP_RELEASE).
+
+-if(?OTP_RELEASE >= 22).
+
+% OTP >= 22
+hmac(Alg, Key, Message) ->
+    crypto:mac(hmac, Alg, Key, Message).
+
+-else.
+
+% OTP >= 21, < 22
+hmac(Alg, Key, Message) ->
+    crypto:hmac(Alg, Key, Message).
+
+-endif. % -if(?OTP_RELEASE >= 22)
+
+-else.
+
+% OTP < 21
+hmac(Alg, Key, Message) ->
+    crypto:hmac(Alg, Key, Message).
+
+-endif. % -ifdef(OTP_RELEASE)
+
+
 -ifdef(TEST).
 -include_lib("eunit/include/eunit.hrl").
 

Reply via email to