#!/bin/sh
#
# Copyright 2009 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This script is part of the vivaldi package.
#
# It creates the repository configuration file for package updates, and it
# monitors that config to see if it has been disabled by the overly aggressive
# distro upgrade process (e.g.  intrepid -> jaunty). When this situation is
# detected, the respository will be re-enabled. If the respository is disabled
# for any other reason, this won't re-enable it.
#
# This functionality can be controlled by creating the $DEFAULTS_FILE and
# setting "repo_reenable_on_distupgrade" to "true" or "false" as desired.
# An empty $DEFAULTS_FILE is the same as setting it to "false".
#
# The $DEFAULTS_FILE also has a setting "repo_add_once" which can be set
# to "false" to prevent the package install from adding the repo altogether.

# System-wide package configuration.
DEFAULTS_FILE="/etc/default/vivaldi"

# sources.list setting for vivaldi updates.
REPOCONFIG="deb [arch=amd64] https://repo.vivaldi.com/stable/deb/ stable main"
REPOCONFIGREGEX="deb (\[arch=[^]]*\bamd64\b[^]]*\][[:space:]]*) https?://repo.vivaldi.com/stable/deb/ stable main"
# key.include is not used in Vivaldi

APT_CONFIG="$(command -v apt-config 2>/dev/null)"

# Set variables for the locations of the apt trusted keyrings.
find_apt_trusted() {
  eval $("$APT_CONFIG" shell APT_TRUSTEDDIR 'Dir::Etc::trustedparts/d')
}

# Set variables for the locations of the apt sources lists.
find_apt_sources() {
  eval $("$APT_CONFIG" shell APT_SOURCESDIR 'Dir::Etc::sourceparts/d')
  SOURCES_FILE="$APT_SOURCESDIR/vivaldi.sources"
}

# import Vivaldi public key updates from Vivaldi repo
# Vivaldi public key updates

# GPG_FILE is also used in apt.include
GPG_FILE="/usr/share/keyrings/vivaldi-16BD9233.gpg"
FUTURE_GPG_FILE="/usr/share/keyrings/vivaldi-5220E3E9.gpg"

# Install the repository/package signing key (16BD9233), if it isn't already.
install_key() {
  # ASCII-armored keyrings are only supported in apt 1.4 and later, but we must
  # continue supporting Trusty and Xenial which have older versions of apt, so
  # the keyring is installed as a binary blob.  base64 is used to decode the
  # ASCII keyring, which should always be available since it comes from the
  # coreutils.
  (base64 -d > "$GPG_FILE") <<KEYDATA
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
PZ2s3lTwkFW64dyrrmIWzspj0qSATQPm130tpeA=
KEYDATA

# Install another key (5220E3E9), if it isn't already, for future use.
  (base64 -d > "$FUTURE_GPG_FILE") <<KEYDATA
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
N34yugRNB8VjKLPki90Rr9IEF/Df0KCAghhDCjE=
KEYDATA
}

uninstall_key() {
  rm -f "$GPG_FILE" "$FUTURE_GPG_FILE"
}

remove_legacy_list() {
  find_apt_sources
  LEGACY_LIST="$APT_SOURCESDIR/vivaldi.list"
  if [ ! -f "$LEGACY_LIST" ]; then
    return
  fi

  # Check for other sources (strict check for 'ours')
  # If there are any lines starting with 'deb' (commented or not) that do NOT
  # match our strict regex, keep the file.
  if grep -E "^[[:space:]]*#?[[:space:]]*deb" "$LEGACY_LIST" |
    grep -v -E \
    "^[[:space:]]*#?[[:space:]]*$REPOCONFIGREGEX" >/dev/null;
  then
    # Other sources exist, comment out ours (strict match)
    sed -i -E "s|^[[:space:]]*($REPOCONFIGREGEX)|# \1|" "$LEGACY_LIST"
  else
    # No other sources, safe to remove
    rm -f "$LEGACY_LIST"
  fi
}

# Generate the content of the .sources file
gen_sources_content() {
  cat <<EOF
### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# Changes to this file will not be preserved.
# This file will not be recreated if removed.
X-Repolib-Name: Vivaldi
Types: deb
URIs: https://repo.vivaldi.com/stable/deb/
Suites: stable
Components: main
Architectures: amd64 arm64
Signed-By: $GPG_FILE
EOF
}

# Add the Google repository to the apt sources. The sources cannot be part of
# the package since it's still needed if the package is removed but not purged.
create_sources_lists() {
  find_apt_sources

  gen_sources_content >"$SOURCES_FILE.$$.tmp"
  chmod 644 "$SOURCES_FILE.$$.tmp"
  mv "$SOURCES_FILE.$$.tmp" "$SOURCES_FILE"

  if [ -r "$DEFAULTS_FILE" ]; then
    if grep -q "^[[:space:]]*repo_add_once=" "$DEFAULTS_FILE"; then
      sed -i -e \
        's/^[[:space:]]*repo_add_once=.*/repo_add_once="false"/' \
        "$DEFAULTS_FILE"
    else
      echo 'repo_add_once="false"' >>"$DEFAULTS_FILE"
    fi
  fi
}

# Remove our custom sources file.
clean_sources_lists() {
  find_apt_sources
  rm -f "$SOURCES_FILE"
}

install_deb822_sources() {
  find_apt_sources
  LEGACY_LIST="$APT_SOURCESDIR/vivaldi.list"

  SHOULD_INSTALL_SOURCES=0
  # Detect new installs.
  if [ -r "$DEFAULTS_FILE" ]; then
    if grep -E -q \
      '^[[:space:]]*repo_add_once=[[:space:]]*["'\'']?true["'\'']?' \
      "$DEFAULTS_FILE"; then
      SHOULD_INSTALL_SOURCES=1
    fi
  else
    SHOULD_INSTALL_SOURCES=1
    echo 'repo_add_once="true"' >"$DEFAULTS_FILE"
    echo 'repo_reenable_on_distupgrade="true"' >>"$DEFAULTS_FILE"
  fi

  if [ -f "$SOURCES_FILE" ]; then
    # The new .sources file already exists. Recreate it in case it got disabled
    # during a dist upgrade.
    SHOULD_INSTALL_SOURCES=1
  elif [ -f "$LEGACY_LIST" ]; then
    # Migrate a legacy .list file to the new .sources format.
    if grep -E -q "^[[:space:]]*$REPOCONFIGREGEX" "$LEGACY_LIST"; then
      SHOULD_INSTALL_SOURCES=1
    elif grep -E -q \
      "^[[:space:]]*#[[:space:]]*$REPOCONFIGREGEX[[:space:]]*# disabled on \
upgrade to .*" \
      "$LEGACY_LIST"; then
      SHOULD_INSTALL_SOURCES=1
    fi
  fi

  if [ "$SHOULD_INSTALL_SOURCES" -eq 1 ]; then
    create_sources_lists
  fi
}

## MAIN ##
if [ -r "$DEFAULTS_FILE" ]; then
  . "$DEFAULTS_FILE"
fi

install_key

if [ "$repo_add_once" = "true" ]; then
  create_sources_lists
elif [ "$repo_reenable_on_distupgrade" = "true" ]; then
  install_deb822_sources
fi
