196 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | 
						|
## Support de la signature des jars pour WebObjects
 | 
						|
##@cooked nocomments
 | 
						|
##@require webobjects
 | 
						|
uprovide wosign
 | 
						|
urequire webobjects
 | 
						|
 | 
						|
WOSIGN_KEYSTORE=
 | 
						|
WOSIGN_STOREPASS=
 | 
						|
WOSIGN_KEYALIAS=
 | 
						|
 | 
						|
function wosign_setup_maybe() {
 | 
						|
    WOSIGN_CONFDIR="$WOCONFIGURATION/Signatures"
 | 
						|
    WOSIGN_CONF="$WOSIGN_CONFDIR/signature.conf"
 | 
						|
    if [ -f "$WOSIGN_CONF" ]; then
 | 
						|
        eval "$(
 | 
						|
            keystore=
 | 
						|
            storepass=
 | 
						|
            keyalias=
 | 
						|
            source "$WOSIGN_CONF"
 | 
						|
            set_var_cmd WOSIGN_KEYSTORE "$keystore"
 | 
						|
            set_var_cmd WOSIGN_STOREPASS "$storepass"
 | 
						|
            set_var_cmd WOSIGN_KEYALIAS "$keyalias"
 | 
						|
        )"
 | 
						|
 | 
						|
        [ -n "$WOSIGN_XTMPDIR" ] || ac_set_tmpdir WOSIGN_XTMPDIR
 | 
						|
        [ -n "$WOSIGN_JTMPDIR" ] || ac_set_tmpdir WOSIGN_JTMPDIR
 | 
						|
        return 0
 | 
						|
    else
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function __issjar() {
 | 
						|
    [ "${1%.sjar}" != "$1" ]
 | 
						|
}
 | 
						|
 | 
						|
function __tosjar() {
 | 
						|
    local jarname="$(basename "$1")"
 | 
						|
    local jardir="${1%$jarname}"
 | 
						|
    local sjarname= jarbn="$(basename "$jarname" .jar)"
 | 
						|
    if [ "$jarbn" != "$jarname" ]; then
 | 
						|
        sjarname="$jarbn.sjar"
 | 
						|
    else
 | 
						|
        sjarname="$jarname.sjar"
 | 
						|
    fi
 | 
						|
    echo "$jardir$sjarname"
 | 
						|
}
 | 
						|
 | 
						|
function __tojar() {
 | 
						|
    local jarname="$(basename "$1")"
 | 
						|
    local jardir="${1%$jarname}"
 | 
						|
    local jarbn="$(basename "$jarname" .sjar)"
 | 
						|
    [ "$jarbn" != "$jarname" ] && jarname="$jarbn.jar"
 | 
						|
    echo "$jardir$jarname"
 | 
						|
}
 | 
						|
 | 
						|
function wosign_jar() {
 | 
						|
    local default=1 sign= unsign=
 | 
						|
    while [ -n "$1" ]; do
 | 
						|
        case "$1" in
 | 
						|
        -s) default=; sign=1;;
 | 
						|
        -d) default=; unsign=1;;
 | 
						|
        *) break;;
 | 
						|
        esac
 | 
						|
        shift
 | 
						|
    done
 | 
						|
    [ -n "$default" ] && sign=1
 | 
						|
 | 
						|
    local curdir="$(pwd)"
 | 
						|
    local jar="$(abspath "$1")"
 | 
						|
    local cjar="$WOSIGN_JTMPDIR/$(basename "$jar")"
 | 
						|
    local sjar="$(__tosjar "$jar")"
 | 
						|
 | 
						|
    cd "$WOSIGN_XTMPDIR"
 | 
						|
    rm -rf *
 | 
						|
    jar xf "$jar"
 | 
						|
    rm -f META-INF/*.{SF,RSA,DSA}
 | 
						|
    
 | 
						|
    jar cf "$cjar" *
 | 
						|
    if [ -n "$unsign" ]; then
 | 
						|
        cp "$cjar" "$jar"
 | 
						|
    fi
 | 
						|
 | 
						|
    if [ -n "$sign" ]; then
 | 
						|
        rm -f "$sjar"
 | 
						|
        jarsigner -keystore "$WOSIGN_KEYSTORE" ${WOSIGN_STOREPASS:+-storepass "$WOSIGN_STOREPASS" }-signedjar "$sjar" "$cjar" $WOSIGN_KEYALIAS
 | 
						|
    fi
 | 
						|
 | 
						|
    cd "$curdir"
 | 
						|
}
 | 
						|
 | 
						|
function wosignable() {
 | 
						|
    if [ -z "$WOSIGN_KEYSTORE" ]; then
 | 
						|
        echo "Il faut spécifier le paramètre keystore"
 | 
						|
        return 1
 | 
						|
    elif [ -z "$WOSIGN_KEYALIAS" ]; then
 | 
						|
        echo "Il faut spécifier le parammètre keyalias"
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
 | 
						|
    local srcdir="$1"
 | 
						|
    if endswith "$srcdir" .woa; then
 | 
						|
        srcdir="$srcdir/Contents/WebServerResources/Java"
 | 
						|
    elif endswith "$1" .framework; then
 | 
						|
        srcdir="$srcdir/WebServerResources/Java"
 | 
						|
    fi
 | 
						|
    if [ -d "$srcdir" ]; then
 | 
						|
        if [ -z "$(list_files "$srcdir" "*.jar")" ]; then
 | 
						|
            echo "Il n'y a pas de jars à signer"
 | 
						|
            return 1
 | 
						|
        fi
 | 
						|
    elif [ -f "$srcdir" ]; then
 | 
						|
        if ! endswith "$srcdir" .jar; then
 | 
						|
            echo "Le fichier spécifié n'est pas un jar"
 | 
						|
            return 1
 | 
						|
        fi
 | 
						|
    else
 | 
						|
        echo "Il faut spécifier un répertoire ou un jar individuel"
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function __may_sign() {
 | 
						|
    # Si l'option -f est spécifiée, retourner true
 | 
						|
    # Si ce jar a une version signée associée, retourner true
 | 
						|
    # Si ce jar n'a pas de version signée associée, retourner true
 | 
						|
    # Si ce jar est la version signée d'un autre jar, retourner false
 | 
						|
    [ "$1" != "-f" ] && __issjar "$1" && [ -f "$(__tojar "$1")" ] && return 1
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
function __should_sign() {
 | 
						|
    # Si l'option -f est spécifiée, retourner true
 | 
						|
    # Sinon retourner true si la version signée n'existe pas
 | 
						|
    # On assume que __may_sign est vrai.
 | 
						|
    [ "$1" != "-f" ] && [ -f "$(__tosjar "$1")" ] && return 1
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
function wosign() {
 | 
						|
    # Signer un bundle, les jars d'un répertoire, ou un jar
 | 
						|
    # L'option -f force la resignature des jars d'un répertoire ou d'un
 | 
						|
    # bundle. Elle force aussi la signature d'un jar, même s'il semble qu'il
 | 
						|
    # soit la version signée d'un autre jar
 | 
						|
    # on présuppose que wosignable a retourné true
 | 
						|
    local default=1 sign= unsign= resign=
 | 
						|
    while [ -n "$1" ]; do
 | 
						|
        case "$1" in
 | 
						|
        -s) default=; sign=1;;
 | 
						|
        -d) default=; unsign=1;;
 | 
						|
        -f) resign=1;;
 | 
						|
        *) break;;
 | 
						|
        esac
 | 
						|
        shift
 | 
						|
    done
 | 
						|
    [ -n "$default" ] && sign=1
 | 
						|
 | 
						|
    local srcdir="$1"
 | 
						|
    local candidates jars jar jarname jardir
 | 
						|
 | 
						|
    if endswith "$srcdir" .woa; then
 | 
						|
        srcdir="$srcdir/Contents/WebServerResources/Java"
 | 
						|
    elif endswith "$1" .framework; then
 | 
						|
        srcdir="$srcdir/WebServerResources/Java"
 | 
						|
    fi
 | 
						|
    
 | 
						|
    if [ -d "$srcdir" ]; then
 | 
						|
        array_from_lines candidates "$(list_files "$srcdir" "*.jar")"
 | 
						|
        jars=()
 | 
						|
        for jar in "${candidates[@]}"; do
 | 
						|
            __may_sign "$srcdir/$jar" && jars=("${jars[@]}" "$srcdir/$jar")
 | 
						|
        done
 | 
						|
        for jar in "${jars[@]}"; do
 | 
						|
            if __should_sign ${resign:+-f }"$jar"; then
 | 
						|
                ebegin "$(ppath "$jar")"
 | 
						|
                wosign_jar ${sign:+-s }${unsign:+-d }"$jar" &
 | 
						|
                ewait $!
 | 
						|
                eend
 | 
						|
            fi
 | 
						|
        done
 | 
						|
    elif [ -f "$srcdir" ]; then
 | 
						|
        jar="$srcdir"
 | 
						|
        if ! __may_sign ${resign:+-f }"$jar"; then
 | 
						|
            jardir="$(dirname "$jar")"
 | 
						|
            jarname="$(basename "$jar")"
 | 
						|
            eerror "$(ppath "$jar"): Ce jar est la version signée de $(ppath "$jardir/${jarname#s}")"
 | 
						|
        elif __should_sign ${resign:+-f }"$jar"; then
 | 
						|
            ebegin "$(ppath "$jar")"
 | 
						|
            wosign_jar ${sign:+-s }${unsign:+-d }"$jar" &
 | 
						|
            ewait $!
 | 
						|
            eend
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
}
 |