Packages

Pre-signed S3 upload helper for client-side multipart POSTs, using ExAWS for authentication. Allows use of Instance Role for authentication.

Current section

5 Versions

Jump to

Compare versions

3 files changed
+40 additions
-18 deletions
  @@ -40,4 +40,4 @@
40 40 {<<"optional">>,false},
41 41 {<<"repository">>,<<"hexpm">>},
42 42 {<<"requirement">>,<<"~> 2.0.1">>}]]}.
43 - {<<"version">>,<<"1.0.2">>}.
43 + {<<"version">>,<<"1.0.3">>}.
  @@ -71,15 +71,7 @@ defmodule ExAws.S3.DirectUpload do
71 71 def presigned(%ExAws.S3.DirectUpload{} = upload) do
72 72 %{
73 73 url: url(upload),
74 - credentials: %{
75 - policy: policy(upload),
76 - "x-amz-algorithm": "AWS4-HMAC-SHA256",
77 - "x-amz-credential": credential(),
78 - "x-amz-date": @date_util.today_datetime(),
79 - "x-amz-signature": signature(upload),
80 - acl: upload.acl,
81 - key: file_path(upload)
82 - }
74 + credentials: credentials(upload)
83 75 }
84 76 end
85 77
  @@ -96,7 +88,24 @@ defmodule ExAws.S3.DirectUpload do
96 88 |> Poison.encode!
97 89 end
98 90
99 - defp signature(upload) do
91 + defp credentials(%ExAws.S3.DirectUpload{} = upload) do
92 + credentials = %{
93 + policy: policy(upload),
94 + "x-amz-algorithm": "AWS4-HMAC-SHA256",
95 + "x-amz-credential": credential(),
96 + "x-amz-date": @date_util.today_datetime(),
97 + "x-amz-signature": signature(upload),
98 + acl: upload.acl,
99 + key: file_path(upload)
100 + }
101 + unless security_token() == nil do
102 + credentials
103 + |> Map.put(:"x-amz-security-token", security_token())
104 + end
105 + credentials
106 + end
107 +
108 + defp signature(%ExAws.S3.DirectUpload{} = upload) do
100 109 signing_key()
101 110 |> hmac(policy(upload))
102 111 |> Base.encode16(case: :lower)
  @@ -110,7 +119,7 @@ defmodule ExAws.S3.DirectUpload do
110 119 |> hmac("aws4_request")
111 120 end
112 121
113 - defp policy(upload) do
122 + defp policy(%ExAws.S3.DirectUpload{} = upload) do
114 123 %{
115 124 expiration: @date_util.expiration_datetime,
116 125 conditions: conditions(upload)
  @@ -119,8 +128,8 @@ defmodule ExAws.S3.DirectUpload do
119 128 |> Base.encode64
120 129 end
121 130
122 - defp conditions(upload) do
123 - [
131 + defp conditions(%ExAws.S3.DirectUpload{} = upload) do
132 + conditions = [
124 133 %{"bucket" => upload.bucket},
125 134 %{"acl" => upload.acl},
126 135 %{"x-amz-algorithm": "AWS4-HMAC-SHA256"},
  @@ -129,6 +138,11 @@ defmodule ExAws.S3.DirectUpload do
129 138 ["starts-with", "$Content-Type", upload.mimetype],
130 139 ["starts-with", "$key", upload.path]
131 140 ]
141 + conditions = case security_token() do
142 + nil -> conditions
143 + _ -> [%{"x-amz-security-token" => security_token()} | conditions]
144 + end
145 + conditions
132 146 end
133 147
134 148 defp url(%ExAws.S3.DirectUpload{bucket: bucket}) do
  @@ -147,16 +161,24 @@ defmodule ExAws.S3.DirectUpload do
147 161 :crypto.hmac(:sha256, key, data)
148 162 end
149 163
164 + defp security_token do
165 + ExAws.Config.new(:s3)
166 + |> Map.get(:security_token)
167 + end
168 +
150 169 defp access_key do
151 - ExAws.Config.new(:s3) |> Map.get(:access_key_id)
170 + ExAws.Config.new(:s3)
171 + |> Map.get(:access_key_id)
152 172 end
153 173
154 174 defp secret_key do
155 - ExAws.Config.new(:s3) |> Map.get(:secret_access_key)
175 + ExAws.Config.new(:s3)
176 + |> Map.get(:secret_access_key)
156 177 end
157 178
158 179 defp region do
159 - ExAws.Config.new(:s3) |> Map.get(:region)
180 + ExAws.Config.new(:s3)
181 + |> Map.get(:region)
160 182 end
161 183
162 184 end
  @@ -4,7 +4,7 @@ defmodule ExAws.S3.DirectUpload.Mixfile do
4 4 def project do
5 5 [
6 6 app: :ex_aws_s3_direct_upload,
7 - version: "1.0.2",
7 + version: "1.0.3",
8 8 elixir: "~> 1.4",
9 9 build_embedded: Mix.env == :prod,
10 10 start_permanent: Mix.env == :prod,