blob: ab5b43e36eae44802560dfdbbd8e44de73bdb99c [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_INSTALLER_UTIL_INSTALLATION_VALIDATOR_H_
#define CHROME_INSTALLER_UTIL_INSTALLATION_VALIDATOR_H_
#include <map>
#include <set>
#include <utility>
#include <vector>
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "chrome/installer/util/browser_distribution.h"
namespace base {
class CommandLine;
class FilePath;
}
namespace installer {
class InstallationState;
class AppCommand;
class ProductState;
// A class that validates the state of an installation. Violations are logged
// via LOG(ERROR).
class InstallationValidator {
public:
class ProductBits {
public:
// Bits that form the components of an installation type.
enum {
CHROME_SINGLE = 0x01,
CHROME_MULTI = 0x02,
CHROME_FRAME_SINGLE = 0x04,
CHROME_FRAME_MULTI = 0x08,
};
}; // class ProductBits
// Identifiers of all valid installation types.
enum InstallationType {
NO_PRODUCTS = 0,
CHROME_SINGLE =
ProductBits::CHROME_SINGLE,
CHROME_MULTI =
ProductBits::CHROME_MULTI,
CHROME_FRAME_SINGLE =
ProductBits::CHROME_FRAME_SINGLE,
CHROME_FRAME_SINGLE_CHROME_SINGLE =
ProductBits::CHROME_FRAME_SINGLE | ProductBits::CHROME_SINGLE,
CHROME_FRAME_SINGLE_CHROME_MULTI =
ProductBits::CHROME_FRAME_SINGLE | ProductBits::CHROME_MULTI,
CHROME_FRAME_MULTI =
ProductBits::CHROME_FRAME_MULTI,
CHROME_FRAME_MULTI_CHROME_MULTI =
ProductBits::CHROME_FRAME_MULTI | ProductBits::CHROME_MULTI,
};
// Validates |machine_state| at user or system level, returning true if valid.
// |type| is populated in either case, although it is a best-guess when the
// method returns false.
static bool ValidateInstallationTypeForState(
const InstallationState& machine_state,
bool system_level,
InstallationType* type);
// Validates the machine's current installation at user or system level,
// returning true and populating |type| if valid.
static bool ValidateInstallationType(bool system_level,
InstallationType* type);
protected:
struct ProductContext;
typedef std::vector<std::pair<std::string, bool> > SwitchExpectations;
typedef void (*CommandValidatorFn)(const ProductContext& ctx,
const AppCommand& app_cmd,
bool* is_valid);
typedef std::map<base::string16, CommandValidatorFn> CommandExpectations;
// An interface to product-specific validation rules.
class ProductRules {
public:
virtual ~ProductRules() { }
virtual BrowserDistribution::Type distribution_type() const = 0;
virtual void AddUninstallSwitchExpectations(
const ProductContext& ctx,
SwitchExpectations* expectations) const = 0;
virtual void AddRenameSwitchExpectations(
const ProductContext& ctx,
SwitchExpectations* expectations) const = 0;
// Return true if the rules allow usagestats setting.
virtual bool UsageStatsAllowed(const ProductContext& ctx) const = 0;
};
// Validation rules for the Chrome browser.
class ChromeRules : public ProductRules {
public:
BrowserDistribution::Type distribution_type() const override;
void AddUninstallSwitchExpectations(
const ProductContext& ctx,
SwitchExpectations* expectations) const override;
void AddRenameSwitchExpectations(
const ProductContext& ctx,
SwitchExpectations* expectations) const override;
bool UsageStatsAllowed(const ProductContext& ctx) const override;
};
// Validation rules for Chrome Frame.
class ChromeFrameRules : public ProductRules {
public:
BrowserDistribution::Type distribution_type() const override;
void AddUninstallSwitchExpectations(
const ProductContext& ctx,
SwitchExpectations* expectations) const override;
void AddRenameSwitchExpectations(
const ProductContext& ctx,
SwitchExpectations* expectations) const override;
bool UsageStatsAllowed(const ProductContext& ctx) const override;
};
// Validation rules for the multi-install Chrome binaries.
class ChromeBinariesRules : public ProductRules {
public:
BrowserDistribution::Type distribution_type() const override;
void AddUninstallSwitchExpectations(
const ProductContext& ctx,
SwitchExpectations* expectations) const override;
void AddRenameSwitchExpectations(
const ProductContext& ctx,
SwitchExpectations* expectations) const override;
bool UsageStatsAllowed(const ProductContext& ctx) const override;
};
struct ProductContext {
ProductContext(const InstallationState& machine_state_in,
bool system_install_in,
const ProductState& state_in,
const ProductRules& rules_in)
: machine_state(machine_state_in),
system_install(system_install_in),
dist(BrowserDistribution::GetSpecificDistribution(
rules_in.distribution_type())),
state(state_in),
rules(rules_in) {
}
const InstallationState& machine_state;
bool system_install;
BrowserDistribution* dist;
const ProductState& state;
const ProductRules& rules;
};
// Helper to validate the values of bool elements in AppCommand, and to output
// error messages. |flag_expect| is a bit mask specifying the expected
// presence/absence of bool variables.
static void ValidateAppCommandFlags(
const ProductContext& ctx,
const AppCommand& app_cmd,
const std::set<base::string16>& flags_expected,
const base::string16& name,
bool* is_valid);
static void ValidateOnOsUpgradeCommand(const ProductContext& ctx,
const AppCommand& app_cmd,
bool* is_valid);
static void ValidateAppCommandExpectations(
const ProductContext& ctx,
const CommandExpectations& expectations,
bool* is_valid);
static void ValidateBinaries(const InstallationState& machine_state,
bool system_install,
const ProductState& binaries_state,
bool* is_valid);
static void ValidateSetupPath(const ProductContext& ctx,
const base::FilePath& setup_exe,
const base::string16& purpose,
bool* is_valid);
static void ValidateCommandExpectations(const ProductContext& ctx,
const base::CommandLine& command,
const SwitchExpectations& expected,
const base::string16& source,
bool* is_valid);
static void ValidateUninstallCommand(const ProductContext& ctx,
const base::CommandLine& command,
const base::string16& source,
bool* is_valid);
static void ValidateRenameCommand(const ProductContext& ctx,
bool* is_valid);
static void ValidateOldVersionValues(const ProductContext& ctx,
bool* is_valid);
static void ValidateMultiInstallProduct(const ProductContext& ctx,
bool* is_valid);
static void ValidateAppCommands(const ProductContext& ctx,
bool* is_valid);
static void ValidateUsageStats(const ProductContext& ctx,
bool* is_valid);
static void ValidateProduct(const InstallationState& machine_state,
bool system_install,
const ProductState& product_state,
const ProductRules& rules,
bool* is_valid);
// A collection of all valid installation types.
static const InstallationType kInstallationTypes[];
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(InstallationValidator);
};
} // namespace installer
#endif // CHROME_INSTALLER_UTIL_INSTALLATION_VALIDATOR_H_