Skip to content

Commit

Permalink
Extract aws-creds crate
Browse files Browse the repository at this point in the history
  • Loading branch information
durch committed Mar 28, 2020
1 parent 8781dbb commit 7d02be5
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 13 deletions.
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[workspace]
members = [
"s3",
"aws-region"
"aws-region",
"aws-creds"
]
23 changes: 23 additions & 0 deletions aws-creds/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[package]
name = "aws-creds"
version = "0.20.0"
authors = ["Drazen Urch"]
description = "Tiny Rust library for working with Amazon IAM credentials, supports `s3` crate"
repository = "https://github.com/durch/rust-s3"
readme = "README.md"
keywords = ["Amazon", "AWS", "S3", "Wasabi", "Minio"]
license = "MIT"
documentation = "https://durch.github.io/rust-s3/"
edition = "2018"

[lib]
name = "awscreds"
path = "src/lib.rs"

[dependencies]
simpl = "0.1.0-alpha"
dirs = "2.0.2"
rust-ini = "0.15.2"
tokio = "0.2.13"
reqwest = {version = "0.10.4", features = ["json"]}

35 changes: 35 additions & 0 deletions aws-creds/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@


# Example

```rust
// AWS access credentials: access key, secret key, and optional token.
# Example
// Loads from the standard AWS credentials file with the given profile name,
// defaults to "default".
use awscreds::Credentials;

// Load credentials from `[default]` profile
let credentials = Credentials::default();
// Also loads credentials from `[default]` profile
let credentials = Credentials::new(None, None, None, None);
// Load credentials from `[my-profile]` profile
let credentials = Credentials::new(None, None, None, Some("my-profile".into()));
// Credentials may also be initialized directly or by the following environment variables:
// - `AWS_ACCESS_KEY_ID`,
// - `AWS_SECRET_ACCESS_KEY`
// - `AWS_SESSION_TOKEN`
// The order of preference is arguments, then environment, and finally AWS
// credentials file.

use s3::credentials::Credentials;
// Load credentials directly
let access_key = String::from("AKIAIOSFODNN7EXAMPLE");
let secret_key = String::from("wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY");
let credentials = Credentials::new(Some(access_key), Some(secret_key), None, None);
// Load credentials from the environment
use std::env;
env::set_var("AWS_ACCESS_KEY_ID", "AKIAIOSFODNN7EXAMPLE");
env::set_var("AWS_SECRET_ACCESS_KEY", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY");
let credentials = Credentials::new(None, None, None, None);
```
18 changes: 9 additions & 9 deletions s3/src/credentials.rs → aws-creds/src/credentials.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::{Result, S3Error};
use crate::{Result, AwsCredsError};
use dirs;
use ini::Ini;
use std::collections::HashMap;
Expand All @@ -14,7 +14,7 @@ use std::env;
/// ```no_run
/// # // Do not execute this as it would cause unit tests to attempt to access
/// # // real user credentials.
/// use s3::credentials::Credentials;
/// use awscreds::Credentials;
///
/// // Load credentials from `[default]` profile
/// let credentials = Credentials::default();
Expand All @@ -36,7 +36,7 @@ use std::env;
/// credentials file.
///
/// ```
/// use s3::credentials::Credentials;
/// use awscreds::Credentials;
///
/// // Load credentials directly
/// let access_key = String::from("AKIAIOSFODNN7EXAMPLE");
Expand Down Expand Up @@ -140,7 +140,7 @@ impl Credentials {

async fn from_instance_metadata() -> Result<Credentials> {
if !Credentials::is_ec2() {
return Err(S3Error::from("Not an EC2 instance"));
return Err(AwsCredsError::from("Not an EC2 instance"));
}
let resp: HashMap<String, String> =
match env::var("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI") {
Expand Down Expand Up @@ -205,25 +205,25 @@ impl Credentials {
pub fn from_profile(section: Option<String>) -> Result<Credentials> {
let home_dir = match dirs::home_dir() {
Some(path) => Ok(path),
None => Err(S3Error::from("Invalid home dir")),
None => Err(AwsCredsError::from("Invalid home dir")),
};
let profile = format!("{}/.aws/credentials", home_dir?.display());
let conf = Ini::load_from_file(&profile)?;
let section = match section {
Some(s) => s,
None => String::from("default"),
};
let mut access_key = Err(S3Error::from("Missing aws_access_key_id section"));
let mut secret_key = Err(S3Error::from("Missing aws_secret_access_key section"));
let mut access_key = Err(AwsCredsError::from("Missing aws_access_key_id section"));
let mut secret_key = Err(AwsCredsError::from("Missing aws_secret_access_key section"));
let mut token = None;
if let Some(data) = conf.section(Some(section)) {
access_key = match data.get("aws_access_key_id") {
Some(x) => Ok(x.to_owned()),
None => Err(S3Error::from("Missing aws_access_key_id section")),
None => Err(AwsCredsError::from("Missing aws_access_key_id section")),
};
secret_key = match data.get("aws_secret_access_key") {
Some(x) => Ok(x.to_owned()),
None => Err(S3Error::from("Missing aws_secret_access_key section")),
None => Err(AwsCredsError::from("Missing aws_secret_access_key section")),
};
token = match data.get("aws_security_token") {
Some(x) => Some(x.to_owned()),
Expand Down
12 changes: 12 additions & 0 deletions aws-creds/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#![allow(unused_imports)]

simpl::err!(AwsCredsError, {
Utf8@std::str::Utf8Error;
Reqwest@reqwest::Error;
Env@std::env::VarError;
Ini@ini::ini::Error;
});

mod credentials;

pub use credentials::*;
3 changes: 0 additions & 3 deletions aws-region/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,3 @@ path = "src/lib.rs"
[dependencies]
simpl = "0.1.0-alpha"

[features]
no-verify-ssl = []

0 comments on commit 7d02be5

Please sign in to comment.