Как создается идентификатор расширения Chrome для распакованного расширения?

Я хотел бы поделиться распакованным расширением с моими коллегами. Использует метод chrome.runtime.sendMessage(string extensionId, any message, object options, function responseCallback) во введенном сценарии. Для этого мне нужно знать идентификатор расширения заранее.

Будут ли идентификаторы расширения распакованного расширения отличаться в разных системах, или я могу жестко написать код, найденный в моем меню расширений?

1 ответ

Решение

В то время как я ссылался на этот вопрос, который объясняет, как "закрепить" идентификатор распакованного расширения, что решило бы практическую проблему, с которой сталкивается OP, сам вопрос (как указано в заголовке) интересен.

Если мы посмотрим на источник Chromium, то увидим, что идентификатор - это просто хэш SHA (возможно, нормализованный, что бы это ни значило) абсолютного пути к расширению. Основные моменты из кода:

// Copyright 2014 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.

// chromium/src/chrome/browser/extensions/unpacked_installer.cc
int UnpackedInstaller::GetFlags() {
  std::string id = crx_file::id_util::GenerateIdForPath(extension_path_);
  /* ... */
}

// chromium/src/components/crx_file/id_util.cc
std::string GenerateIdForPath(const base::FilePath& path) {
  base::FilePath new_path = MaybeNormalizePath(path);
  std::string path_bytes =
      std::string(reinterpret_cast<const char*>(new_path.value().data()),
                  new_path.value().size() * sizeof(base::FilePath::CharType));
  return GenerateId(path_bytes);
}

std::string GenerateId(const std::string& input) {
  uint8 hash[kIdSize];
  crypto::SHA256HashString(input, hash, sizeof(hash));
  std::string output =
      base::StringToLowerASCII(base::HexEncode(hash, sizeof(hash)));
  ConvertHexadecimalToIDAlphabet(&output);

  return output;
}

Таким образом, он должен зависеть ТОЛЬКО от абсолютного пути файловой системы к папке расширения.

Ксан ответил правильно. Однако, чтобы расширить его для справки, основанной на приведенном выше коде Chromium, можно вычислить идентификатор расширения с помощью этого кода Python.

import hashlib

m = hashlib.sha256()
m.update(bytes(PATH.encode('utf-8')))
EXTID = ''.join([chr(int(i, base=16) + ord('a')) for i in m.hexdigest()][:32])

MaybeNormalizePath влияет на вариант использования Windows:

base::FilePath MaybeNormalizePath(const base::FilePath& path) {
#if defined(OS_WIN)
  // Normalize any drive letter to upper-case. We do this for consistency with
  // net_utils::FilePathToFileURL(), which does the same thing, to make string
  // comparisons simpler.
  base::FilePath::StringType path_str = path.value();
  if (path_str.size() >= 2 && path_str[0] >= L'a' && path_str[0] <= L'z' &&
      path_str[1] == L':')
    path_str[0] = towupper(path_str[0]);
  return base::FilePath(path_str);
#else
  return path;
#endif
}



https://chromium.googlesource.com/chromium/chromium/+/refs/heads/trunk/extensions/common/id_util.cc

Другие вопросы по тегам