Skip to content

Commit fe78d07

Browse files
authored
[SQSERVICES-1942] Fix DPoP access token error propagation (2/2) (#3142)
1 parent d4426d1 commit fe78d07

File tree

5 files changed

+47
-77
lines changed

5 files changed

+47
-77
lines changed

changelog.d/5-internal/pr-3142

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Rust library `rusty-jwt-tools` upgraded to latest version

libs/jwt-tools/src/Data/Jwt/Tools.hs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,8 @@ import Control.Exception
4040
import Control.Monad.Trans.Except
4141
import Data.ByteString.Conversion
4242
import Data.String.Conversions (cs)
43-
import Foreign.C (CUChar (..))
4443
import Foreign.C.String (CString, newCString, peekCString)
4544
import Foreign.Ptr (Ptr, nullPtr)
46-
import Foreign.Storable (peek)
4745
import Imports
4846
import Network.HTTP.Types (StdMethod (..))
4947

@@ -88,7 +86,7 @@ foreign import ccall unsafe "generate_dpop_access_token"
8886

8987
foreign import ccall unsafe "free_dpop_access_token" free_dpop_access_token :: Ptr HsResult -> IO ()
9088

91-
foreign import ccall unsafe "get_error" get_error :: Ptr HsResult -> Ptr CUChar
89+
foreign import ccall unsafe "get_error" get_error :: Ptr HsResult -> Word8
9290

9391
foreign import ccall unsafe "get_token" get_token :: Ptr HsResult -> CString
9492

@@ -113,9 +111,9 @@ generateDpopAccessTokenFfi dpopProof user client domain nonce uri method maxSkew
113111

114112
getErrorFfi :: Ptr HsResult -> IO (Maybe Word8)
115113
getErrorFfi ptr = do
116-
let errorPtr = get_error ptr
117-
if errorPtr /= nullPtr
118-
then Just . fromIntegral <$> peek errorPtr
114+
let err = get_error ptr
115+
if err /= 0
116+
then pure $ Just err
119117
else pure Nothing
120118

121119
getTokenFfi :: Ptr HsResult -> IO (Maybe String)

libs/jwt-tools/test/Spec.hs

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ main :: IO ()
2525
main = hspec $ do
2626
describe "generateDpopToken FFI when passing valid inputs" $ do
2727
it "should return an access token" $ do
28-
actual <- callFFIWithValidValuesValidUntil2038
28+
actual <- runExceptT $ generateDpopToken proof uid cid domain nonce uri method maxSkewSecs expires now pem
2929
isRight actual `shouldBe` True
30-
describe "generateDpopToken FFI when passing nonsense values" $ do
31-
it "should return an error" $ do
32-
actual <- callFFIWithNonsenseValues
33-
isRight actual `shouldBe` False
30+
describe "generateDpopToken FFI when passing a wrong nonce value" $ do
31+
it "should return BackendNonceMismatchError" $ do
32+
actual <- runExceptT $ generateDpopToken proof uid cid domain (Nonce "foobar") uri method maxSkewSecs expires now pem
33+
actual `shouldBe` Left BackendNonceMismatchError
3434
describe "toResult" $ do
3535
it "should convert to correct error" $ do
3636
toResult Nothing (Just token) `shouldBe` Right (cs token)
@@ -72,36 +72,7 @@ main = hspec $ do
7272
toResult (Just 18) (Just token) `shouldBe` Left ExpError
7373
toResult Nothing Nothing `shouldBe` Left UnknownError
7474
where
75-
token :: String
7675
token = "eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
77-
78-
callFFIWithNonsenseValues :: IO (Either DPoPTokenGenerationError ByteString)
79-
callFFIWithNonsenseValues =
80-
runExceptT $ generateDpopToken proof uid cid domain nonce uri method maxSkewSecs expires now pem
81-
where
82-
proof = Proof "xxxx.yyyy.zzzz"
83-
uid = UserId "8a6e8a6e-8a6e-8a6e-8a6e-8a6e8a6e8a6e"
84-
cid = ClientId 8899
85-
domain = Domain "example.com"
86-
nonce = Nonce "123"
87-
uri = Uri "/foo"
88-
method = POST
89-
maxSkewSecs = MaxSkewSecs 1
90-
now = NowEpoch 5435234232
91-
expires = ExpiryEpoch $ 5435234232 + 360
92-
pem =
93-
PemBundle $
94-
"-----BEGIN PRIVATE KEY-----\n\
95-
\MC4CAQAwBQYDK2VwBCIEIFANnxZLNE4p+GDzWzR3wm/v8x/0bxZYkCyke1aTRucX\n\
96-
\-----END PRIVATE KEY-----\n\
97-
\-----BEGIN PUBLIC KEY-----\n\
98-
\MCowBQYDK2VwAyEACPvhIdimF20tOPjbb+fXJrwS2RKDp7686T90AZ0+Th8=\n\
99-
\-----END PUBLIC KEY-----\n"
100-
101-
callFFIWithValidValuesValidUntil2038 :: IO (Either DPoPTokenGenerationError ByteString)
102-
callFFIWithValidValuesValidUntil2038 =
103-
runExceptT $ generateDpopToken proof uid cid domain nonce uri method maxSkewSecs expires now pem
104-
where
10576
proof = Proof "eyJhbGciOiJFZERTQSIsInR5cCI6ImRwb3Arand0IiwiandrIjp7Imt0eSI6Ik9LUCIsImNydiI6IkVkMjU1MTkiLCJ4IjoiZ0tYSHpIV3QtRUh1N2ZQbmlWMXFXWGV2Rmk1eFNKd3RNcHJlSjBjdTZ3SSJ9fQ.eyJpYXQiOjE2NzgxMDcwMDksImV4cCI6MjA4ODA3NTAwOSwibmJmIjoxNjc4MTA3MDA5LCJzdWIiOiJpbXBwOndpcmVhcHA9WXpWbE1qRTVNelpqTTJKak5EQXdOMkpsWTJJd1lXTm1OVGszTW1FMVlqTS9lYWZhMDI1NzMwM2Q0MDYwQHdpcmUuY29tIiwianRpIjoiMmQzNzAzYTItNTc4Yi00MmRjLWE2MGUtYmM0NzA3OWVkODk5Iiwibm9uY2UiOiJRV1J4T1VaUVpYVnNTMlJZYjBGS05sWkhXbGgwYUV4amJUUmpTM2M1U2xnIiwiaHRtIjoiUE9TVCIsImh0dSI6Imh0dHBzOi8vd2lyZS5leGFtcGxlLmNvbS9jbGllbnRzLzE2OTMxODQ4MzIyNTQ3NTMxODcyL2FjY2Vzcy10b2tlbiIsImNoYWwiOiJZVE5HTkRSNlRqZHFabGRRZUVGYWVrMTZWMmhqYXpCVmJ6UlFWVXRWUlZJIn0.0J2sx5y0ubZ4NwmQhbKXDj6i5UWTx3cvuTPKbeXXOJFDamr-iFtE6sOnAQT90kfTx1cEoIyDfoUkj3h5GEanAA"
10677
uid = UserId "c5e21936-c3bc-4007-becb-0acf5972a5b3"
10778
cid = ClientId 16931848322547531872

nix/pkgs/rusty_jwt_tools_ffi/add-Cargo.lock.patch

Lines changed: 34 additions & 34 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nix/pkgs/rusty_jwt_tools_ffi/default.nix

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ rustPlatform.buildRustPackage rec {
1414
owner = "wireapp";
1515
repo = "rusty-jwt-tools";
1616
# if you update this, please generate a new Cargo.lock file es described below at `cargoPatches`
17-
rev = "a68ed483f7e98613c0d5c3608c684f25225a58d3";
18-
sha256 = "sha256-+2fjwtG80l8Vt48QWKm4wevY7MQRAwuo4YFbjB+6w9I=";
17+
rev = "c213978cf0552237dc71e255a83110b18ee95972";
18+
sha256 = "sha256-7jVKReJEXKui6BOJZ3Cm2ykcAVVaSXgKhsZuu3wJoH0=";
1919
};
2020
doCheck = false;
21-
cargoSha256 = "sha256-BHq28U3OzYCPNmfnxlmXsz9XYEy1kRiNrFM9OTnAkk0=";
21+
cargoSha256 = "sha256-ylvsbpgwPfENz0TP0uM9kYLyx7NjQbUv9cpT5het+xE=";
2222
cargoDepsHook = ''
2323
mkdir -p rusty_jwt-tools_ffi-${version}-vendor.tar.gz/ring/.git
2424
'';

0 commit comments

Comments
 (0)