242
build.sh
242
build.sh
@@ -14,13 +14,43 @@ echo ""
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Configuración
|
||||
VERSION="3.0.0"
|
||||
DIST_DIR="dist"
|
||||
KEYS_DIR="private-keys"
|
||||
FIREFOX_PACKAGE="ca-archive-${VERSION}.xpi"
|
||||
CHROME_PACKAGE="ca-archive-${VERSION}-chrome.zip"
|
||||
CHROME_CRX="ca-archive-${VERSION}-chrome.crx"
|
||||
CHROME_KEY="$KEYS_DIR/chrome-extension.pem"
|
||||
FIREFOX_JWT="$KEYS_DIR/firefox-amo-credentials.json"
|
||||
|
||||
# Opciones de línea de comandos
|
||||
SIGN_MODE=""
|
||||
for arg in "$@"; do
|
||||
case $arg in
|
||||
--sign)
|
||||
SIGN_MODE="all"
|
||||
shift
|
||||
;;
|
||||
--sign-chrome)
|
||||
SIGN_MODE="chrome"
|
||||
shift
|
||||
;;
|
||||
--sign-firefox)
|
||||
SIGN_MODE="firefox"
|
||||
shift
|
||||
;;
|
||||
--list|-l)
|
||||
LIST_CONTENTS=true
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Archivos a incluir (relativos al directorio raíz)
|
||||
INCLUDE_FILES=(
|
||||
@@ -134,7 +164,7 @@ fi
|
||||
|
||||
# Verificar integridad de los paquetes
|
||||
echo ""
|
||||
echo "Verificando paquetes..."
|
||||
print_status "Verificando paquetes..."
|
||||
|
||||
# Verificar Firefox
|
||||
if unzip -t "$DIST_DIR/$FIREFOX_PACKAGE" > /dev/null 2>&1; then
|
||||
@@ -152,8 +182,159 @@ else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Firma de paquetes si se solicitó
|
||||
if [ "$SIGN_MODE" = "firefox" ] || [ "$SIGN_MODE" = "all" ]; then
|
||||
echo ""
|
||||
echo "=================================================="
|
||||
echo " Firmando paquete Firefox"
|
||||
echo "=================================================="
|
||||
|
||||
if [ ! -f "$FIREFOX_JWT" ]; then
|
||||
print_error "No se encontraron credenciales de Firefox: $FIREFOX_JWT"
|
||||
print_warning "Ejecuta: ./scripts/generate-keys.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Buscar web-ext: primero en node_modules, luego global
|
||||
WEB_EXT=""
|
||||
if [ -f "node_modules/.bin/web-ext" ]; then
|
||||
WEB_EXT="./node_modules/.bin/web-ext"
|
||||
print_status "Usando web-ext local: $WEB_EXT"
|
||||
elif command -v npx &> /dev/null; then
|
||||
WEB_EXT="npx web-ext"
|
||||
print_status "Usando web-ext via npx"
|
||||
elif command -v web-ext &> /dev/null; then
|
||||
WEB_EXT="web-ext"
|
||||
print_status "Usando web-ext global"
|
||||
else
|
||||
print_error "web-ext no está instalado"
|
||||
print_warning "Instalar con: npm install"
|
||||
print_warning "O globalmente: npm install -g web-ext"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_status "Firmando con AMO..."
|
||||
|
||||
# Leer credenciales del JSON
|
||||
API_KEY=$(grep -o '"apiKey"[[:space:]]*:[[:space:]]*"[^"]*"' "$FIREFOX_JWT" | cut -d'"' -f4)
|
||||
API_SECRET=$(grep -o '"apiSecret"[[:space:]]*:[[:space:]]*"[^"]*"' "$FIREFOX_JWT" | cut -d'"' -f4)
|
||||
|
||||
if [ -z "$API_KEY" ] || [ -z "$API_SECRET" ]; then
|
||||
print_error "Credenciales de AMO inválidas en $FIREFOX_JWT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Firmar con web-ext
|
||||
# Nota: El ID se lee automáticamente de manifest.json, no se pasa como parámetro
|
||||
$WEB_EXT sign \
|
||||
--source-dir=. \
|
||||
--artifacts-dir="$DIST_DIR" \
|
||||
--api-key="$API_KEY" \
|
||||
--api-secret="$API_SECRET" \
|
||||
--channel=unlisted \
|
||||
2>&1 | tee "$DIST_DIR/firefox-sign.log"
|
||||
|
||||
# Verificar el código de salida
|
||||
SIGN_EXIT_CODE=${PIPESTATUS[0]}
|
||||
|
||||
if [ $SIGN_EXIT_CODE -eq 0 ]; then
|
||||
print_status "Paquete Firefox firmado exitosamente"
|
||||
# Buscar el archivo firmado
|
||||
SIGNED_XPI=$(ls -t "$DIST_DIR"/*.xpi 2>/dev/null | head -1)
|
||||
if [ -f "$SIGNED_XPI" ]; then
|
||||
print_status "Archivo firmado: $(basename "$SIGNED_XPI")"
|
||||
fi
|
||||
else
|
||||
print_error "Error al firmar paquete Firefox (código: $SIGN_EXIT_CODE)"
|
||||
print_warning "Revisa: $DIST_DIR/firefox-sign.log"
|
||||
exit $SIGN_EXIT_CODE
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$SIGN_MODE" = "chrome" ] || [ "$SIGN_MODE" = "all" ]; then
|
||||
echo ""
|
||||
echo "=================================================="
|
||||
echo " Firmando paquete Chrome"
|
||||
echo "=================================================="
|
||||
|
||||
if [ ! -f "$CHROME_KEY" ]; then
|
||||
print_error "No se encontró clave de Chrome: $CHROME_KEY"
|
||||
print_warning "Ejecuta: ./scripts/generate-keys.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v google-chrome &> /dev/null && ! command -v chromium &> /dev/null; then
|
||||
print_warning "Chrome/Chromium no encontrado, usando método alternativo..."
|
||||
|
||||
# Método alternativo: crear .crx manualmente
|
||||
print_status "Generando .crx con openssl..."
|
||||
|
||||
# Extraer clave pública
|
||||
openssl rsa -in "$CHROME_KEY" -pubout -outform DER > "$DIST_DIR/public.der" 2>/dev/null
|
||||
|
||||
# Crear firma
|
||||
openssl dgst -sha256 -sign "$CHROME_KEY" -out "$DIST_DIR/signature.bin" "$DIST_DIR/$CHROME_PACKAGE"
|
||||
|
||||
# Leer tamaños
|
||||
pub_size=$(wc -c < "$DIST_DIR/public.der")
|
||||
sig_size=$(wc -c < "$DIST_DIR/signature.bin")
|
||||
|
||||
# Crear header CRX3
|
||||
(
|
||||
printf "Cr24" # Magic number
|
||||
printf '\x03\x00\x00\x00' # Version 3
|
||||
printf "$(printf '%08x' $pub_size | sed 's/\(..\)/\\x\1/g' | tac -s'\\')" # Public key length (little endian)
|
||||
printf "$(printf '%08x' $sig_size | sed 's/\(..\)/\\x\1/g' | tac -s'\\')" # Signature length (little endian)
|
||||
cat "$DIST_DIR/public.der"
|
||||
cat "$DIST_DIR/signature.bin"
|
||||
cat "$DIST_DIR/$CHROME_PACKAGE"
|
||||
) > "$DIST_DIR/$CHROME_CRX"
|
||||
|
||||
# Limpiar archivos temporales
|
||||
rm -f "$DIST_DIR/public.der" "$DIST_DIR/signature.bin"
|
||||
|
||||
if [ -f "$DIST_DIR/$CHROME_CRX" ]; then
|
||||
CRX_SIZE=$(du -h "$DIST_DIR/$CHROME_CRX" | cut -f1)
|
||||
print_status "Paquete Chrome firmado: $CHROME_CRX ($CRX_SIZE)"
|
||||
|
||||
# Calcular hash
|
||||
CRX_HASH=$(sha256sum "$DIST_DIR/$CHROME_CRX" | cut -d' ' -f1)
|
||||
echo "$CRX_HASH" > "$DIST_DIR/${CHROME_CRX}.sha256"
|
||||
print_status "Hash SHA256 guardado"
|
||||
else
|
||||
print_error "Error al crear .crx"
|
||||
fi
|
||||
else
|
||||
print_status "Empaquetando con Chrome..."
|
||||
|
||||
# Usar Chrome para empaquetar
|
||||
CHROME_BIN=$(command -v google-chrome || command -v chromium)
|
||||
|
||||
"$CHROME_BIN" --pack-extension=. --pack-extension-key="$CHROME_KEY" --no-message-box 2>/dev/null
|
||||
|
||||
if [ -f "$(basename $(pwd)).crx" ]; then
|
||||
mv "$(basename $(pwd)).crx" "$DIST_DIR/$CHROME_CRX"
|
||||
print_status "Paquete Chrome firmado: $CHROME_CRX"
|
||||
else
|
||||
print_error "Error al firmar con Chrome"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Calcular Extension ID
|
||||
if [ -f "$CHROME_KEY" ]; then
|
||||
CHROME_ID=$(openssl rsa -in "$CHROME_KEY" -pubout -outform DER 2>/dev/null | \
|
||||
openssl dgst -sha256 -binary | \
|
||||
head -c 16 | \
|
||||
od -An -tx1 | \
|
||||
tr -d ' \n' | \
|
||||
tr '0-9a-f' 'a-p')
|
||||
echo "$CHROME_ID" > "$DIST_DIR/chrome-extension-id.txt"
|
||||
print_status "Extension ID: $CHROME_ID"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Listar contenido (opcional)
|
||||
if [ "$1" = "--list" ] || [ "$1" = "-l" ]; then
|
||||
if [ "$LIST_CONTENTS" = true ]; then
|
||||
echo ""
|
||||
echo "Contenido del paquete Firefox:"
|
||||
unzip -l "$DIST_DIR/$FIREFOX_PACKAGE"
|
||||
@@ -169,23 +350,52 @@ echo "Paquetes generados en: $DIST_DIR/"
|
||||
echo ""
|
||||
echo " Firefox: $FIREFOX_PACKAGE ($FIREFOX_SIZE)"
|
||||
echo " Chrome: $CHROME_PACKAGE ($CHROME_SIZE)"
|
||||
|
||||
if [ "$SIGN_MODE" = "chrome" ] || [ "$SIGN_MODE" = "all" ]; then
|
||||
if [ -f "$DIST_DIR/$CHROME_CRX" ]; then
|
||||
CRX_SIZE=$(du -h "$DIST_DIR/$CHROME_CRX" | cut -f1)
|
||||
echo " Chrome (firmado): $CHROME_CRX ($CRX_SIZE)"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
if [ -z "$SIGN_MODE" ]; then
|
||||
echo " ℹ️ Paquetes sin firmar. Para firmar usa:"
|
||||
echo " ./build.sh --sign # Firmar ambos"
|
||||
echo " ./build.sh --sign-firefox # Solo Firefox"
|
||||
echo " ./build.sh --sign-chrome # Solo Chrome"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo "Próximos pasos:"
|
||||
echo ""
|
||||
echo " Firefox:"
|
||||
echo " 1. Ir a about:debugging#/runtime/this-firefox"
|
||||
echo " 2. Click en 'Cargar complemento temporal'"
|
||||
echo " 3. Seleccionar: $DIST_DIR/$FIREFOX_PACKAGE"
|
||||
echo ""
|
||||
echo " Chrome:"
|
||||
echo " 1. Ir a chrome://extensions/"
|
||||
echo " 2. Activar 'Modo de desarrollador'"
|
||||
echo " 3. Click en 'Cargar extensión sin empaquetar'"
|
||||
echo " 4. Extraer y seleccionar la carpeta de $CHROME_PACKAGE"
|
||||
echo ""
|
||||
echo " Para publicar:"
|
||||
echo " - Firefox AMO: https://addons.mozilla.org/developers/"
|
||||
echo " - Chrome Web Store: https://chrome.google.com/webstore/devconsole"
|
||||
|
||||
if [ -n "$SIGN_MODE" ]; then
|
||||
echo " Paquetes firmados ✓"
|
||||
echo ""
|
||||
echo " Para publicar:"
|
||||
if [ "$SIGN_MODE" = "firefox" ] || [ "$SIGN_MODE" = "all" ]; then
|
||||
echo " Firefox AMO: El archivo firmado está listo para subir"
|
||||
echo " https://addons.mozilla.org/developers/"
|
||||
fi
|
||||
if [ "$SIGN_MODE" = "chrome" ] || [ "$SIGN_MODE" = "all" ]; then
|
||||
echo " Chrome Web Store: Sube el archivo .zip (no .crx)"
|
||||
echo " https://chrome.google.com/webstore/devconsole"
|
||||
fi
|
||||
else
|
||||
echo " Firefox:"
|
||||
echo " 1. Ir a about:debugging#/runtime/this-firefox"
|
||||
echo " 2. Click en 'Cargar complemento temporal'"
|
||||
echo " 3. Seleccionar: $DIST_DIR/$FIREFOX_PACKAGE"
|
||||
echo ""
|
||||
echo " Chrome:"
|
||||
echo " 1. Ir a chrome://extensions/"
|
||||
echo " 2. Activar 'Modo de desarrollador'"
|
||||
echo " 3. Click en 'Cargar extensión sin empaquetar'"
|
||||
echo " 4. Extraer y seleccionar la carpeta de $CHROME_PACKAGE"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=================================================="
|
||||
|
||||
|
||||
Referencia en una nueva incidencia
Block a user