Fix upgrade script for cert db 53/146753/4
authorJunghyun Yeon <jungh.yeon@samsung.com>
Wed, 30 Aug 2017 08:49:32 +0000 (17:49 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Fri, 1 Sep 2017 02:03:28 +0000 (11:03 +0900)
- Signature file has removed by previous platform for security purpose
  so there are no way to determine privilege level while upgrading.
- So, now upgrade script will make file which stores root cert value
  each package and installer will retrieve it at runtime when there are
  no signature file to read.
- After migration, cert db will be migrated directly into pkg cert db.
- Remove chsmack in script.
- Now tpk related functions will handle rpm packages, too.

Change-Id: Ia6ae1716d586d2f82dbe32add90b33c6d27fd9f9
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
data/700.pkgmgr.patch.sh.in

index 7bf1c09f9dab862b9607864ea9a8ac3854515c3d..fa0c31f4c1f2c850a567498194ec81e435e0764e 100644 (file)
@@ -3,6 +3,12 @@ PATH=/bin:/usr/bin:/sbin:/usr/sbin
 
 source /etc/tizen-platform.conf
 
+CERT_DB_NAME=.pkgmgr_cert.db
+CERT_BACKUP_DB_NAME=.pkgmgr_cert_backup.db
+CERT_BACKUP_DB_PATH=$TZ_SYS_DB/$CERT_BACKUP_DB_NAME
+CERT_DB_PATH=$TZ_SYS_DB/$CERT_DB_NAME
+CERT_TEMP_FILEPATH=/tmp
+
 PARSER_DB_NAME=.pkgmgr_parser.db
 PARSER_BACKUP_DB_NAME=.pkgmgr_parser_backup.db
 PARSER_DB_PATH=$TZ_SYS_DB/$PARSER_DB_NAME
@@ -48,6 +54,7 @@ RESTRICTION_DBNAME=restriction.db
 function backup_db(){
        echo "#backup previous DB"
        mv $PARSER_DB_PATH $PARSER_BACKUP_DB_PATH
+       mv $CERT_DB_PATH $CERT_BACKUP_DB_PATH
 }
 
 function create_restriction_db(){
@@ -82,41 +89,20 @@ function move_user_tpk_ro_files(){
        local package=$1
        cp -af $OPT_USR_APPS/$package $DEFAULT_PKG_APP_LOCATION/
        chown -R $DEFAULT_RO_OWNER_GROUP $DEFAULT_PKG_APP_LOCATION/$package
-       chsmack -r -t -a $DEFAULT_RO_SMACK_LABEL $DEFAULT_PKG_APP_LOCATION/$package
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package::RO $DEFAULT_PKG_APP_LOCATION/$package/bin
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package::RO $DEFAULT_PKG_APP_LOCATION/$package/lib
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package::RO $DEFAULT_PKG_APP_LOCATION/$package/res
-       chsmack -r -t -a $DEFAULT_RO_SMACK_LABEL $DEFAULT_PKG_APP_LOCATION/$package/shared
 
 }
 
 function move_user_tpk_rw_files(){
        local package=$1
-       mkdir -m 751 $DEFAULT_USER_APPS_RW/$package
-       chsmack -r -t -a $DEFAULT_RO_SMACK_LABEL $DEFAULT_USER_APPS_RW/$package
-       mkdir $DEFAULT_USER_APPS_RW/$package/shared
-       chown -R $DEFAULT_RW_OWNER_GROUP $DEFAULT_USER_APPS_RW/$package
-
-       mv $DEFAULT_PKG_APP_LOCATION/$package/cache $DEFAULT_USER_APPS_RW/$package/
-       mv $DEFAULT_PKG_APP_LOCATION/$package/data $DEFAULT_USER_APPS_RW/$package/
-       chmod g+s $DEFAULT_USER_APPS_RW/$package/data
-       chmod 771 $DEFAULT_USER_APPS_RW/$package/data
-       mv $DEFAULT_PKG_APP_LOCATION/$package/shared/data $DEFAULT_USER_APPS_RW/$package/shared/
-       mv $DEFAULT_PKG_APP_LOCATION/$package/shared/trusted $DEFAULT_USER_APPS_RW/$package/shared/
-
-       chown -R $DEFAULT_RW_OWNER_GROUP $DEFAULT_USER_APPS_RW/$package/cache
-       chown -R $OWNER_SYSTEM_SHARE $DEFAULT_USER_APPS_RW/$package/data
-       chown -R $DEFAULT_RW_OWNER_GROUP $DEFAULT_USER_APPS_RW/$package/shared
-       chown -R $OWNER_SYSTEM_SHARE $DEFAULT_USER_APPS_RW/$package/shared/data
-
-       chsmack -r -t -a $TRUSTED_LABEL $DEFAULT_USER_APPS_RW/$package/shared/trusted
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package::SharedRO $DEFAULT_USER_APPS_RW/$package/shared/data
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package $DEFAULT_USER_APPS_RW/$package/cache
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package $DEFAULT_USER_APPS_RW/$package/data
-
-       #remove shared/cache
-       echo "deleting $DEFAULT_PKG_APP_LOCATION/$package/shared/cache"
-       rm -rf $DEFAULT_PKG_APP_LOCATION/$package/shared/cache
+
+       local target="$DEFAULT_USER_APPS_RW/$package"
+       local source="$OPT_USR_APPS/$package"
+
+       rm -rf $source/shared/cache
+       cp -Rf $source/cache/* $target/cache/
+       cp -Rf $source/data/* $target/data/
+       cp -Rf $source/shared/* $target/shared/
+       rm -rf $source
 }
 
 function copy_user_tpk_manifest(){
@@ -126,14 +112,13 @@ function copy_user_tpk_manifest(){
 
 function move_user_tpk_files(){
        echo "#move user TPK's files"
-       echo "SELECT package FROM package_info WHERE package_readonly='false' COLLATE NOCASE AND package_type='tpk' COLLATE NOCASE;" |
+       echo "SELECT package FROM package_info WHERE package_readonly='false' COLLATE NOCASE AND package_type COLLATE NOCASE IN ('tpk', 'rpm');" |
        sqlite3 $PARSER_BACKUP_DB_PATH > $DB_RESULT_FILE
 
        while read package
        do
                echo "processing user tpk $package..."
                move_user_tpk_ro_files $package
-               move_user_tpk_rw_files $package
                copy_user_tpk_manifest $package
        done < $DB_RESULT_FILE
        rm -f $DB_RESULT_FILE
@@ -144,38 +129,19 @@ function move_user_wgt_ro_files(){
        local package=$1
        cp -af --no-preserve=ownership $OPT_USR_APPS/$package $DEFAULT_PKG_APP_LOCATION/
        chown -R $DEFAULT_RO_OWNER_GROUP $DEFAULT_PKG_APP_LOCATION/$package
-       chsmack -r -t -a $DEFAULT_RO_SMACK_LABEL $DEFAULT_PKG_APP_LOCATION/$package
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package::RO $DEFAULT_PKG_APP_LOCATION/$package/bin
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package::RO $DEFAULT_PKG_APP_LOCATION/$package/res
-       chsmack -r -t -a $DEFAULT_RO_SMACK_LABEL $DEFAULT_PKG_APP_LOCATION/$package/shared
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package $DEFAULT_PKG_APP_LOCATION/$package/tmp
 }
 
 function move_user_wgt_rw_files(){
        local package=$1
-       mkdir -m 751 $DEFAULT_USER_APPS_RW/$package
-       chsmack -r -t -a $DEFAULT_RO_SMACK_LABEL $DEFAULT_USER_APPS_RW/$package
-
-       mkdir -m 751 $DEFAULT_USER_APPS_RW/$package/shared
-       mkdir -m 751 $DEFAULT_USER_APPS_RW/$package/cache
 
-       chown -R $DEFAULT_RW_OWNER_GROUP $DEFAULT_USER_APPS_RW/$package
+       local target="$DEFAULT_USER_APPS_RW/$package"
+       local source="$OPT_USR_APPS/$package"
 
-       mv $DEFAULT_PKG_APP_LOCATION/$package/data $DEFAULT_USER_APPS_RW/$package/
-       mv $DEFAULT_PKG_APP_LOCATION/$package/shared/data $DEFAULT_USER_APPS_RW/$package/shared/
-       mv $DEFAULT_PKG_APP_LOCATION/$package/shared/trusted $DEFAULT_USER_APPS_RW/$package/shared/
-       chmod 751 $DEFAULT_USER_APPS_RW/$package/shared/trusted
-       chmod g+s $DEFAULT_USER_APPS_RW/$package/data
-       chmod 771 $DEFAULT_USER_APPS_RW/$package/data
-
-       chown -R $OWNER_SYSTEM_SHARE $DEFAULT_USER_APPS_RW/$package/data
-       chown -R $DEFAULT_RW_OWNER_GROUP $DEFAULT_USER_APPS_RW/$package/shared
-       chown -R $OWNER_SYSTEM_SHARE $DEFAULT_USER_APPS_RW/$package/shared/data
-
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package $DEFAULT_USER_APPS_RW/$package/cache
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package $DEFAULT_USER_APPS_RW/$package/data
-       chsmack -r -t -a $TRUSTED_LABEL $DEFAULT_USER_APPS_RW/$package/shared/trusted
-       chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package::SharedRO $DEFAULT_USER_APPS_RW/$package/shared/data
+       rm -rf $source/shared/cache
+       cp -Rf $source/cache/* $target/cache/
+       cp -Rf $source/data/* $target/data/
+       cp -Rf $source/shared/* $target/shared/
+       rm -r $source
 }
 
 
@@ -188,24 +154,11 @@ function move_user_wgt_files(){
        do
                echo "processing user wgt $package..."
                move_user_wgt_ro_files $package
-               move_user_wgt_rw_files $package
        done < $DB_RESULT_FILE
        rm -f $DB_RESULT_FILE
 
 }
 
-function remove_previous_files(){
-       echo "#remove files from previous location"
-       echo "SELECT package FROM package_info WHERE package_readonly='false' COLLATE NOCASE;" |
-       sqlite3 $PARSER_BACKUP_DB_PATH > $DB_RESULT_FILE
-       
-       while read package
-       do
-               rm -rf $OPT_USR_APPS/$package
-       done < $DB_RESULT_FILE
-       rm -f $DB_RESULT_FILE
-}
-
 function initdb(){
        echo "#pkg_initdb"
        pkg_initdb --ro --partial-rw
@@ -243,24 +196,14 @@ function move_preload_pkg_userdata(){
        while read package
        do
                echo "processing preload pkg $package..."
-               cp -af $OPT_USR_APPS/$package $DEFAULT_USER_APPS_RW/
-               chown -R $DEFAULT_RW_OWNER_GROUP $DEFAULT_USER_APPS_RW/$package
-               chown -R $OWNER_SYSTEM_SHARE $DEFAULT_USER_APPS_RW/$package/data
-               chmod g+s $DEFAULT_USER_APPS_RW/$package/data
-               chmod 771 $DEFAULT_USER_APPS_RW/$package/data
-               rm -rf $OPT_USR_APPS/$package
-
-               rm -rf $DEFAULT_USER_APPS_RW/$package/shared/cache
-               rm -rf $DEFAULT_USER_APPS_RW/$package/shared/data
-
-               chsmack -r -t -a $DEFAULT_RO_SMACK_LABEL $DEFAULT_USER_APPS_RW/$package
-               chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package $DEFAULT_USER_APPS_RW/$package/cache
-               chsmack -r -t -a $DEFAULT_RW_SMACK_LABEL$package $DEFAULT_USER_APPS_RW/$package/data
-               if [ -d $DEFAULT_USER_APPS_RW/$package/shared/trusted ];
-               then
-                       chsmack -r -t -a $TRUSTED_LABEL $DEFAULT_USER_APPS_RW/$package/shared/trusted
-               fi
-
+               local source="$OPT_USR_APPS/$package"
+               local target="$DEFAULT_USER_APPS_RW/$package"
+               rm -rf $source/shared/cache
+               cp -Rf $source/cache/* $target/cache/
+               cp -Rf $source/data/* $target/data/
+               cp -Rf $source/shared $target/shared/
+
+               rm -rf $source
        done < $DB_RESULT_FILE
        rm -f $DB_RESULT_FILE
 }
@@ -312,18 +255,25 @@ function disable_user_pkg(){
 
 function remove_backup_db(){
        rm $PARSER_BACKUP_DB_PATH
+       rm $CERT_BACKUP_DB_PATH
 }
 
 function init_user_tpk_preload_rw_packages() {
        echo "#init tpk preload rw packages"
        echo ".separator \" \"
-           SELECT package FROM package_info WHERE package_readonly='false' COLLATE NOCASE AND package_preload='true' COLLATE NOCASE AND package_type='tpk';" |
+           SELECT package FROM package_info WHERE package_readonly='false' COLLATE NOCASE AND package_preload='true' COLLATE NOCASE AND package_type COLLATE NOCASE IN ('tpk', 'rpm');" |
        sqlite3 $PARSER_BACKUP_DB_PATH > $DB_RESULT_FILE
 
        while read package
        do
                echo "init tpk preload rw package $package..."
+               echo "SELECT cert_info FROM package_cert_index_info WHERE cert_id=(SELECT dist_root_cert FROM package_cert_info WHERE package='$package');" |
+               sqlite3 $CERT_BACKUP_DB_PATH > $CERT_TEMP_FILEPATH/$package.txt
+
                tpk-backend -y $package --preload-rw
+               rm -f $CERT_TEMP_FILEPATH/$package.txt
+               migrate_cert_info $package
+               move_user_tpk_rw_files $package
        done < $DB_RESULT_FILE
        rm -f $DB_RESULT_FILE
 }
@@ -338,20 +288,150 @@ function init_user_wgt_preload_rw_packages() {
        do
                echo "init wgt preload rw package $package..."
                wgt-backend -y $package --preload-rw
+               move_user_wgt_rw_files $package
        done < $DB_RESULT_FILE
        rm -f $DB_RESULT_FILE
 }
 
+function insert_cert_index_info() {
+       local cert_index=$1
+       if [ ! $cert_index ] || [ $cert_index -eq 0 ]; then
+               echo "given cert_index is null"
+               return
+       fi
+
+       local cert_value=`sqlite3 $CERT_BACKUP_DB_PATH "SELECT cert_info FROM package_cert_index_info WHERE cert_id=$cert_index"`
+       if [ ! $cert_value ]; then
+               echo "retrieved cert value with id [$cert_index] is null."
+               return
+       fi
+
+       sqlite3 $CERT_DB_PATH "INSERT OR REPLACE INTO package_cert_index_info(cert_info, cert_id, cert_ref_count)
+               VALUES('$cert_value',
+               (SELECT cert_id FROM package_cert_index_info WHERE cert_info='$cert_value'),
+               COALESCE(((SELECT cert_ref_count FROM package_cert_index_info WHERE cert_info='$cert_value')+1), 1))"
+}
+
+function insert_cert_info() {
+       local package=$1
+       local author_root_index=$2
+       local author_im_index=$3
+       local author_signer_index=$4
+       local dist_root_index=$5
+       local dist_im_index=$6
+       local dist_signer_index=$7
+       local dist2_root_index=$8
+       local dist2_im_index=$9
+       local dist2_signer_index=${10}
+
+       local dist_root_value=`sqlite3 $CERT_DB_PATH "ATTACH database '$CERT_BACKUP_DB_PATH' as backup;
+               SELECT cert_id FROM package_cert_index_info WHERE cert_info=
+               (SELECT cert_info FROM backup.package_cert_index_info WHERE cert_id='$dist_root_index')"`
+       local dist_im_value=`sqlite3 $CERT_DB_PATH "ATTACH database '$CERT_BACKUP_DB_PATH' as backup;
+               SELECT cert_id FROM package_cert_index_info WHERE cert_info=
+               (SELECT cert_info FROM backup.package_cert_index_info WHERE cert_id='$dist_im_index')"`
+       local dist_signer_value=`sqlite3 $CERT_DB_PATH "ATTACH database '$CERT_BACKUP_DB_PATH' as backup;
+               SELECT cert_id FROM package_cert_index_info WHERE cert_info=
+               (SELECT cert_info FROM backup.package_cert_index_info WHERE cert_id='$dist_signer_index')"`
+
+       local dist2_root_value=`sqlite3 $CERT_DB_PATH "ATTACH database '$CERT_BACKUP_DB_PATH' as backup;
+               SELECT cert_id FROM package_cert_index_info WHERE cert_info=
+               (SELECT cert_info FROM backup.package_cert_index_info WHERE cert_id='$dist2_root_index')"`
+       local dist2_im_value=`sqlite3 $CERT_DB_PATH "ATTACH database '$CERT_BACKUP_DB_PATH' as backup;
+               SELECT cert_id FROM package_cert_index_info WHERE cert_info=
+               (SELECT cert_info FROM backup.package_cert_index_info WHERE cert_id='$dist2_im_index')"`
+       local dist2_signer_value=`sqlite3 $CERT_DB_PATH "ATTACH database '$CERT_BACKUP_DB_PATH' as backup;
+               SELECT cert_id FROM package_cert_index_info WHERE cert_info=
+               (SELECT cert_info FROM backup.package_cert_index_info WHERE cert_id='$dist2_signer_index')"`
+
+       #update dist, dist2 value of package_cert_info determined by given pkg
+       local is_update_needed=""
+       local query="UPDATE package_cert_info SET "
+       if [ "$dist_root_value" != "" ]; then
+               is_update_needed="true"
+               query=$query"dist_root_cert='$dist_root_value'"
+       fi
+
+       if [ "$dist_im_value" != "" ]; then
+               is_update_needed="true"
+               query=$query", dist_im_cert='$dist_im_value'"
+       fi
+
+       if [ "$dist_signer_value" != "" ]; then
+               is_update_needed="true"
+               query=$query", dist_signer_cert='$dist_signer_value'"
+       fi
+
+       if [ "$dist2_root_value" != "" ]; then
+               is_update_needed="true"
+               query=$query"dist2_root_cert='$dist2_root_value'"
+       fi
+
+       if [ "$dist2_im_value" != "" ]; then
+               is_update_needed="true"
+               query=$query", dist2_im_cert='$dist2_im_value'"
+       fi
+
+       if [ "$dist2_signer_value" != "" ]; then
+               is_update_needed="true"
+               query=$query", dist2_signer_cert='$dist2_signer_value'"
+       fi
+
+       if [ "$is_update_needed" != "true" ]; then
+               echo "no update needed"
+               return
+       fi
+
+       query=$query" WHERE package='$package'"
+       sqlite3 $CERT_DB_PATH "$query"
+}
+
+function migrate_cert_info() {
+       local package=$1
+
+       #get certificate value from old cert db and insert into new cert db
+       echo ".separator \" \"
+               SELECT author_root_cert, author_im_cert, author_signer_cert, dist_root_cert, dist_im_cert, dist_signer_cert, dist2_root_cert, dist2_im_cert, dist2_signer_cert
+               FROM package_cert_info WHERE package='$package';" |
+       sqlite3 $CERT_BACKUP_DB_PATH > $CERT_TEMP_FILEPATH/$package.txt
+
+       while read author_root_cert author_im_cert author_signer_cert dist_root_cert dist_im_cert dist_signer_cert dist2_root_cert dist2_im_cert dist2_signer_cert
+       do
+               insert_cert_index_info $author_root_cert
+               insert_cert_index_info $author_im_cert
+               insert_cert_index_info $author_signer_cert
+               insert_cert_index_info $dist_root_cert
+               insert_cert_index_info $dist_im_cert
+               insert_cert_index_info $dist_signer_cert
+               insert_cert_index_info $dist2_root_cert
+               insert_cert_index_info $dist2_im_cert
+               insert_cert_index_info $dist2_signer_cert
+
+               insert_cert_info $package $author_root_cert $author_im_cert $author_signer_cert $dist_root_cert $dist_im_cert $dist_signer_cert $dist2_root_cert $dist2_im_cert $dist2_signer_cert
+       done < $CERT_TEMP_FILEPATH/$package.txt
+       rm -f $CERT_TEMP_FILEPATH/$package.txt
+}
+
 function init_user_tpk_packages() {
        echo "#init user tpk packages"
        echo ".separator \" \"
-           SELECT package FROM package_info WHERE package_readonly='false' COLLATE NOCASE AND package_preload='false' COLLATE NOCASE AND package_type='tpk';" |
+           SELECT package FROM package_info WHERE package_readonly='false' COLLATE NOCASE AND
+           package_preload='false' COLLATE NOCASE AND package_type='tpk';" |
        sqlite3 $PARSER_BACKUP_DB_PATH > $DB_RESULT_FILE
 
        while read package
        do
                echo "init user tpk package $package..."
+
+               echo "SELECT cert_info FROM package_cert_index_info WHERE cert_id=
+               (SELECT dist_root_cert FROM package_cert_info WHERE package='$package');" |
+               sqlite3 $CERT_BACKUP_DB_PATH > $CERT_TEMP_FILEPATH/$package.txt
+
                tpk-backend -y $package
+               rm -f $CERT_TEMP_FILEPATH/$package.txt
+
+               migrate_cert_info $package
+               move_user_tpk_rw_files $package
        done < $DB_RESULT_FILE
        rm -f $DB_RESULT_FILE
 }
@@ -366,6 +446,7 @@ function init_user_wgt_packages(){
        do
                echo "init user wgt package $package..."
                wgt-backend -y $package
+               move_user_wgt_rw_files $package
        done < $DB_RESULT_FILE
        rm -f $DB_RESULT_FILE
 }
@@ -373,7 +454,8 @@ function init_user_wgt_packages(){
 function migrate_external_info(){
        echo "#migrate external storage info"
        echo "ATTACH DATABASE '$PARSER_BACKUP_DB_PATH' AS backup;
-               UPDATE package_info set installed_storage='installed_external' WHERE package IN (SELECT package FROM backup.package_info WHERE installed_storage='installed_external' COLLATE NOCASE);" |
+               UPDATE package_info set installed_storage='installed_external' WHERE package IN
+               (SELECT package FROM backup.package_info WHERE installed_storage='installed_external' COLLATE NOCASE);" |
        sqlite3 $PARSER_DB_PATH
 }
 
@@ -386,7 +468,6 @@ remove_unregistered_pkg
 
 move_user_tpk_files
 move_user_wgt_files
-remove_previous_files
 
 initdb
 init_user_tpk_packages