allow user to choose whether to send base credentials at approval screen
This commit is contained in:
parent
dd40eb379e
commit
0d9cbc62cc
@ -18,6 +18,7 @@ use tauri::api::dialog::{
|
|||||||
MessageDialogBuilder,
|
MessageDialogBuilder,
|
||||||
MessageDialogKind,
|
MessageDialogKind,
|
||||||
};
|
};
|
||||||
|
use tokio::sync::oneshot::error::RecvError;
|
||||||
use serde::{
|
use serde::{
|
||||||
Serialize,
|
Serialize,
|
||||||
Serializer,
|
Serializer,
|
||||||
@ -164,7 +165,7 @@ pub enum HandlerError {
|
|||||||
#[error("HTTP request too large")]
|
#[error("HTTP request too large")]
|
||||||
RequestTooLarge,
|
RequestTooLarge,
|
||||||
#[error("Internal server error")]
|
#[error("Internal server error")]
|
||||||
Internal,
|
Internal(#[from] RecvError),
|
||||||
#[error("Error accessing credentials: {0}")]
|
#[error("Error accessing credentials: {0}")]
|
||||||
NoCredentials(#[from] GetCredentialsError),
|
NoCredentials(#[from] GetCredentialsError),
|
||||||
#[error("Error getting client details: {0}")]
|
#[error("Error getting client details: {0}")]
|
||||||
|
@ -21,6 +21,7 @@ pub struct AwsRequestNotification {
|
|||||||
pub struct RequestResponse {
|
pub struct RequestResponse {
|
||||||
pub id: u64,
|
pub id: u64,
|
||||||
pub approval: Approval,
|
pub approval: Approval,
|
||||||
|
pub base: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -97,9 +97,10 @@ async fn get_aws_credentials(base: bool, client: Client, app_handle: AppHandle)
|
|||||||
let notification = AwsRequestNotification {id: request_id, client, base};
|
let notification = AwsRequestNotification {id: request_id, client, base};
|
||||||
app_handle.emit_all("credentials-request", ¬ification)?;
|
app_handle.emit_all("credentials-request", ¬ification)?;
|
||||||
|
|
||||||
match chan_recv.await {
|
let response = chan_recv.await?;
|
||||||
Ok(Approval::Approved) => {
|
match response.approval {
|
||||||
if base {
|
Approval::Approved => {
|
||||||
|
if response.base {
|
||||||
let creds = state.base_creds_cloned().await?;
|
let creds = state.base_creds_cloned().await?;
|
||||||
Ok(Response::Aws(Credentials::Base(creds)))
|
Ok(Response::Aws(Credentials::Base(creds)))
|
||||||
}
|
}
|
||||||
@ -108,8 +109,7 @@ async fn get_aws_credentials(base: bool, client: Client, app_handle: AppHandle)
|
|||||||
Ok(Response::Aws(Credentials::Session(creds)))
|
Ok(Response::Aws(Credentials::Session(creds)))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Ok(Approval::Denied) => Err(HandlerError::Denied),
|
Approval::Denied => Err(HandlerError::Denied),
|
||||||
Err(_e) => Err(HandlerError::Internal),
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ use crate::credentials::{
|
|||||||
SessionCredentials,
|
SessionCredentials,
|
||||||
};
|
};
|
||||||
use crate::{config, config::AppConfig};
|
use crate::{config, config::AppConfig};
|
||||||
use crate::ipc::{self, Approval};
|
use crate::ipc::{self, Approval, RequestResponse};
|
||||||
use crate::errors::*;
|
use crate::errors::*;
|
||||||
use crate::shortcuts;
|
use crate::shortcuts;
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ pub struct AppState {
|
|||||||
pub config: RwLock<AppConfig>,
|
pub config: RwLock<AppConfig>,
|
||||||
pub session: RwLock<Session>,
|
pub session: RwLock<Session>,
|
||||||
pub request_count: RwLock<u64>,
|
pub request_count: RwLock<u64>,
|
||||||
pub waiting_requests: RwLock<HashMap<u64, Sender<Approval>>>,
|
pub waiting_requests: RwLock<HashMap<u64, Sender<RequestResponse>>>,
|
||||||
pub pending_terminal_request: RwLock<bool>,
|
pub pending_terminal_request: RwLock<bool>,
|
||||||
// these are never modified and so don't need to be wrapped in RwLocks
|
// these are never modified and so don't need to be wrapped in RwLocks
|
||||||
pub setup_errors: Vec<String>,
|
pub setup_errors: Vec<String>,
|
||||||
@ -161,7 +161,7 @@ impl AppState {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn register_request(&self, sender: Sender<Approval>) -> u64 {
|
pub async fn register_request(&self, sender: Sender<RequestResponse>) -> u64 {
|
||||||
let count = {
|
let count = {
|
||||||
let mut c = self.request_count.write().await;
|
let mut c = self.request_count.write().await;
|
||||||
*c += 1;
|
*c += 1;
|
||||||
@ -193,7 +193,7 @@ impl AppState {
|
|||||||
waiting_requests
|
waiting_requests
|
||||||
.remove(&response.id)
|
.remove(&response.id)
|
||||||
.ok_or(SendResponseError::NotFound)?
|
.ok_or(SendResponseError::NotFound)?
|
||||||
.send(response.approval)
|
.send(response)
|
||||||
.map_err(|_| SendResponseError::Abandoned)
|
.map_err(|_| SendResponseError::Abandoned)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,3 +5,8 @@
|
|||||||
.btn-alert-error {
|
.btn-alert-error {
|
||||||
@apply bg-transparent hover:bg-[#cd5a5a] border border-error-content text-error-content
|
@apply bg-transparent hover:bg-[#cd5a5a] border border-error-content text-error-content
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* I like alert icons to be top-aligned */
|
||||||
|
.alert > :where(*) {
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
@ -11,10 +11,11 @@
|
|||||||
|
|
||||||
// Send response to backend, display error if applicable
|
// Send response to backend, display error if applicable
|
||||||
let error, alert;
|
let error, alert;
|
||||||
|
let base = $appState.currentRequest.base;
|
||||||
async function respond() {
|
async function respond() {
|
||||||
let {id, approval} = $appState.currentRequest;
|
let {id, approval} = $appState.currentRequest;
|
||||||
try {
|
try {
|
||||||
await invoke('respond', {response: {id, approval}});
|
await invoke('respond', {response: {id, approval, base}});
|
||||||
navigate('ShowResponse');
|
navigate('ShowResponse');
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
@ -83,7 +84,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" class="stroke-current flex-shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /></svg>
|
||||||
<span>
|
<span>
|
||||||
WARNING: This application is requesting your base (long-lived) AWS credentials.
|
WARNING: This application is requesting your long-lived AWS credentials.
|
||||||
These credentials are less secure than session credentials, since they don't expire automatically.
|
These credentials are less secure than session credentials, since they don't expire automatically.
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -116,5 +117,12 @@
|
|||||||
</button>
|
</button>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="w-full">
|
||||||
|
<label class="label cursor-pointer justify-end gap-x-2">
|
||||||
|
<span class="label-text">Send long-lived credentials</span>
|
||||||
|
<input type="checkbox" class="checkbox checkbox-success" bind:checked={base}>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
@ -39,8 +39,8 @@
|
|||||||
Launch Terminal
|
Launch Terminal
|
||||||
</button>
|
</button>
|
||||||
<label class="label cursor-pointer flex items-center space-x-2">
|
<label class="label cursor-pointer flex items-center space-x-2">
|
||||||
|
<span class="label-text">Launch with long-lived credentials</span>
|
||||||
<input type="checkbox" class="checkbox checkbox-sm" bind:checked={launchBase}>
|
<input type="checkbox" class="checkbox checkbox-sm" bind:checked={launchBase}>
|
||||||
<span class="label-text">Launch with base credentials</span>
|
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
{:else if status === 'empty'}
|
{:else if status === 'empty'}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user