|
@@ -0,0 +1,96 @@
|
|
|
|
|
+#!/bin/bash
|
|
|
|
|
+# filepath: /Users/kevin_heinicke/repos/apollo/bw-login.sh
|
|
|
|
|
+
|
|
|
|
|
+# Bitwarden CLI Login Manager with macOS Keychain Integration
|
|
|
|
|
+# Usage: ./bw-login.sh
|
|
|
|
|
+
|
|
|
|
|
+set -e
|
|
|
|
|
+
|
|
|
|
|
+KEYCHAIN_SERVICE="bitwarden-cli"
|
|
|
|
|
+KEYCHAIN_ACCOUNT="session-key"
|
|
|
|
|
+
|
|
|
|
|
+# Function to check if already logged in
|
|
|
|
|
+check_login_status() {
|
|
|
|
|
+ bw status | grep -q '"status":"unlocked"'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# Function to get session key from keychain
|
|
|
|
|
+get_session_from_keychain() {
|
|
|
|
|
+ security find-generic-password -s "$KEYCHAIN_SERVICE" -a "$KEYCHAIN_ACCOUNT" -w 2>/dev/null || echo ""
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# Function to store session key in keychain
|
|
|
|
|
+store_session_in_keychain() {
|
|
|
|
|
+ local session_key="$1"
|
|
|
|
|
+ # Delete existing entry if it exists
|
|
|
|
|
+ security delete-generic-password -s "$KEYCHAIN_SERVICE" -a "$KEYCHAIN_ACCOUNT" 2>/dev/null || true
|
|
|
|
|
+ # Add new entry
|
|
|
|
|
+ security add-generic-password -s "$KEYCHAIN_SERVICE" -a "$KEYCHAIN_ACCOUNT" -w "$session_key"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# Function to validate session key
|
|
|
|
|
+validate_session() {
|
|
|
|
|
+ local session_key="$1"
|
|
|
|
|
+ BW_SESSION="$session_key" bw status | grep -q '"status":"unlocked"'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+# Main logic
|
|
|
|
|
+main() {
|
|
|
|
|
+ echo "Checking Bitwarden CLI login status..."
|
|
|
|
|
+
|
|
|
|
|
+ # Check if already logged in and unlocked
|
|
|
|
|
+ if check_login_status; then
|
|
|
|
|
+ echo "✅ Already logged in and unlocked"
|
|
|
|
|
+ return 0
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ # Try to get session from keychain
|
|
|
|
|
+ stored_session=$(get_session_from_keychain)
|
|
|
|
|
+
|
|
|
|
|
+ if [ -n "$stored_session" ]; then
|
|
|
|
|
+ echo "Found stored session, validating..."
|
|
|
|
|
+ if validate_session "$stored_session"; then
|
|
|
|
|
+ echo "✅ Using stored session from keychain"
|
|
|
|
|
+ export BW_SESSION="$stored_session"
|
|
|
|
|
+ echo "Session exported as BW_SESSION environment variable"
|
|
|
|
|
+ return 0
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "⚠️ Stored session is invalid, removing from keychain"
|
|
|
|
|
+ security delete-generic-password -s "$KEYCHAIN_SERVICE" -a "$KEYCHAIN_ACCOUNT" 2>/dev/null || true
|
|
|
|
|
+ fi
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ # Need to login
|
|
|
|
|
+ echo "Logging in to Bitwarden..."
|
|
|
|
|
+
|
|
|
|
|
+ # Check if we need to login to the server first
|
|
|
|
|
+ if bw status | grep -q '"status":"unauthenticated"'; then
|
|
|
|
|
+ echo "Please enter your Bitwarden credentials:"
|
|
|
|
|
+ bw login
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ # Unlock the vault
|
|
|
|
|
+ echo "Unlocking vault..."
|
|
|
|
|
+ session_key=$(bw unlock --raw)
|
|
|
|
|
+
|
|
|
|
|
+ if [ $? -eq 0 ] && [ -n "$session_key" ]; then
|
|
|
|
|
+ echo "✅ Successfully logged in"
|
|
|
|
|
+
|
|
|
|
|
+ # Store session in keychain
|
|
|
|
|
+ store_session_in_keychain "$session_key"
|
|
|
|
|
+ echo "✅ Session stored in macOS Keychain"
|
|
|
|
|
+
|
|
|
|
|
+ # Export session for current shell
|
|
|
|
|
+ export BW_SESSION="$session_key"
|
|
|
|
|
+ echo "✅ Session exported as BW_SESSION environment variable"
|
|
|
|
|
+
|
|
|
|
|
+ echo ""
|
|
|
|
|
+ echo "To use this session in your current shell, run:"
|
|
|
|
|
+ echo "export BW_SESSION=\"$session_key\""
|
|
|
|
|
+ else
|
|
|
|
|
+ echo "❌ Failed to login or unlock vault"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+main "$@"
|