credential cleanup/working on Windows
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is failing
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	continuous-integration/drone/push Build is failing
				
			This commit is contained in:
		
							parent
							
								
									1f0e3d0632
								
							
						
					
					
						commit
						691a32d719
					
				
					 4 changed files with 71 additions and 14 deletions
				
			
		
							
								
								
									
										19
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										19
									
								
								README.md
									
										
									
									
									
								
							|  | @ -1,4 +1,4 @@ | |||
| # AWS SDK for Zig (zig-native branch) | ||||
| # AWS SDK for Zig (zig native branch) | ||||
| 
 | ||||
| [](https://drone.lerch.org/api/badges/lobo/aws-sdk-for-zig/) | ||||
| 
 | ||||
|  | @ -10,9 +10,19 @@ services only support XML, and zig 0.8.0 and master both trigger compile | |||
| errors while incorporating the XML parser. S3 also requires some plumbing | ||||
| tweaks in the signature calculation. Examples of usage are in src/main.zig. | ||||
| 
 | ||||
| Current executable size for the demo is 868k after compiling with -Drelease-safe | ||||
| and [stripping the executable after compilation](https://github.com/ziglang/zig/issues/351). | ||||
| This is for x86_linux, (which is all that's tested at the moment). | ||||
| Current executable size for the demo is 953k (90k of which is the AWS PEM file) | ||||
| after compiling with -Drelease-safe and | ||||
| [stripping the executable after compilation](https://github.com/ziglang/zig/issues/351). | ||||
| This is for x86_linux. Tested targets: | ||||
| 
 | ||||
| * x86_64-linux | ||||
| * riscv64-linux | ||||
| * aarch64-linux | ||||
| * x86_64 Windows | ||||
| 
 | ||||
| Tested/not working: | ||||
| 
 | ||||
| * arm-linux | ||||
| 
 | ||||
| ## Building | ||||
| 
 | ||||
|  | @ -51,6 +61,7 @@ Only environment variable based credentials can be used at the moment. | |||
| TODO List: | ||||
| 
 | ||||
| * Add STS key support | ||||
| * Add option to cache signature keys | ||||
| * Implement credentials provider | ||||
| * Implement jitter/exponential backoff | ||||
| * Implement timeouts and other TODO's in the code | ||||
|  |  | |||
|  | @ -1,6 +1,33 @@ | |||
| const std = @import("std"); | ||||
| 
 | ||||
| pub const Credentials = struct { | ||||
|     access_key: []const u8, | ||||
|     secret_key: []const u8, | ||||
|     secret_key: []u8, | ||||
|     session_token: ?[]const u8, | ||||
|     // uint64_t expiration_timepoint_seconds); | ||||
| 
 | ||||
|     allocator: std.mem.Allocator, | ||||
| 
 | ||||
|     const Self = @This(); | ||||
| 
 | ||||
|     pub fn init( | ||||
|         allocator: std.mem.Allocator, | ||||
|         access_key: []const u8, | ||||
|         secret_key: []u8, | ||||
|         session_token: ?[]const u8, | ||||
|     ) Self { | ||||
|         return .{ | ||||
|             .access_key = access_key, | ||||
|             .secret_key = secret_key, | ||||
|             .session_token = session_token, | ||||
| 
 | ||||
|             .allocator = allocator, | ||||
|         }; | ||||
|     } | ||||
|     pub fn deinit(self: Self) void { | ||||
|         for (self.secret_key) |_, i| self.secret_key[i] = 0; | ||||
|         self.allocator.free(self.access_key); | ||||
|         self.allocator.free(self.secret_key); | ||||
|         if (self.session_token) |t| self.allocator.free(t); | ||||
|     } | ||||
| }; | ||||
|  |  | |||
|  | @ -5,19 +5,31 @@ | |||
| //! 4. ECS Container credentials, using AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | ||||
| //! 5. EC2 instance profile credentials | ||||
| const std = @import("std"); | ||||
| const builtin = @import("builtin"); | ||||
| const auth = @import("aws_authentication.zig"); | ||||
| 
 | ||||
| pub fn getCredentials(allocator: std.mem.Allocator) !auth.Credentials { | ||||
|     _ = allocator; | ||||
|     if (getEnvironmentCredentials()) |cred| return cred; | ||||
|     if (try getEnvironmentCredentials(allocator)) |cred| return cred; | ||||
|     // TODO: 2-5 | ||||
|     return error.NotImplemented; | ||||
| } | ||||
| 
 | ||||
| fn getEnvironmentCredentials() ?auth.Credentials { | ||||
|     return auth.Credentials{ | ||||
|         .access_key = std.os.getenv("AWS_ACCESS_KEY_ID") orelse return null, | ||||
|         .secret_key = std.os.getenv("AWS_SECRET_ACCESS_KEY") orelse return null, | ||||
|         .session_token = std.os.getenv("AWS_SESSION_TOKEN"), | ||||
| fn getEnvironmentCredentials(allocator: std.mem.Allocator) !?auth.Credentials { | ||||
|     const secret_key = (try getEnvironmentVariable(allocator, "AWS_SECRET_ACCESS_KEY")) orelse return null; | ||||
|     defer allocator.free(secret_key); //yes, we're not zeroing. But then, the secret key is in an environment var anyway | ||||
|     const mutable_key = try allocator.dupe(u8, secret_key); | ||||
|     // Use cross-platform API (requires allocation) | ||||
|     return auth.Credentials.init( | ||||
|         allocator, | ||||
|         (try getEnvironmentVariable(allocator, "AWS_ACCESS_KEY_ID")) orelse return null, | ||||
|         mutable_key, | ||||
|         try getEnvironmentVariable(allocator, "AWS_SESSION_TOKEN"), | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| fn getEnvironmentVariable(allocator: std.mem.Allocator, key: []const u8) !?[]const u8 { | ||||
|     return std.process.getEnvVarOwned(allocator, key) catch |e| switch (e) { | ||||
|         std.process.GetEnvVarOwnedError.EnvironmentVariableNotFound => return null, | ||||
|         else => return e, | ||||
|     }; | ||||
| } | ||||
|  |  | |||
|  | @ -98,7 +98,7 @@ pub const AwsHttp = struct { | |||
|         defer endpoint.deinit(); | ||||
|         log.debug("Calling endpoint {s}", .{endpoint.uri}); | ||||
|         const creds = try credentials.getCredentials(self.allocator); | ||||
|         // defer allocator.free(), except sometimes we don't need freeing... | ||||
|         defer creds.deinit(); | ||||
|         const signing_config: signing.Config = .{ | ||||
|             .region = options.region, | ||||
|             .service = options.sigv4_service_name orelse service, | ||||
|  | @ -217,8 +217,15 @@ fn addHeaders(allocator: std.mem.Allocator, headers: *std.ArrayList(base.Header) | |||
|     return null; | ||||
| } | ||||
| 
 | ||||
| fn getEnvironmentVariable(allocator: std.mem.Allocator, key: []const u8) !?[]const u8 { | ||||
|     return std.process.getEnvVarOwned(allocator, key) catch |e| switch (e) { | ||||
|         std.process.GetEnvVarOwnedError.EnvironmentVariableNotFound => return null, | ||||
|         else => return e, | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| fn regionSubDomain(allocator: std.mem.Allocator, service: []const u8, region: []const u8, useDualStack: bool) !EndPoint { | ||||
|     const environment_override = std.os.getenv("AWS_ENDPOINT_URL"); | ||||
|     const environment_override = try getEnvironmentVariable(allocator, "AWS_ENDPOINT_URL"); | ||||
|     if (environment_override) |override| { | ||||
|         const uri = try allocator.dupeZ(u8, override); | ||||
|         return endPointFromUri(allocator, uri); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue