diff --git a/.flake8 b/.flake8
index 20fe9bd..ed93163 100644
--- a/.flake8
+++ b/.flake8
@@ -21,6 +21,8 @@ exclude =
# Exclude generated code.
**/proto/**
**/gapic/**
+ **/services/**
+ **/types/**
*_pb2.py
# Standard linting exemptions.
diff --git a/.gitignore b/.gitignore
index 3fb06e0..b87e1ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,7 @@
dist
build
eggs
+.eggs
parts
bin
var
@@ -49,6 +50,7 @@ bigquery/docs/generated
# Virtual environment
env/
coverage.xml
+sponge_log.xml
# System test environment variables.
system_tests/local_test_setup
diff --git a/.kokoro/publish-docs.sh b/.kokoro/publish-docs.sh
index 3617404..4e03e6c 100755
--- a/.kokoro/publish-docs.sh
+++ b/.kokoro/publish-docs.sh
@@ -13,8 +13,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-#!/bin/bash
-
set -eo pipefail
# Disable buffering, so that the logs stream through.
diff --git a/.kokoro/release.sh b/.kokoro/release.sh
index 6c9aba0..698b035 100755
--- a/.kokoro/release.sh
+++ b/.kokoro/release.sh
@@ -13,8 +13,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-#!/bin/bash
-
set -eo pipefail
# Start the releasetool reporter
diff --git a/.kokoro/samples/lint/common.cfg b/.kokoro/samples/lint/common.cfg
new file mode 100644
index 0000000..df23af2
--- /dev/null
+++ b/.kokoro/samples/lint/common.cfg
@@ -0,0 +1,34 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+# Specify which tests to run
+env_vars: {
+ key: "RUN_TESTS_SESSION"
+ value: "lint"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/python-webrisk/.kokoro/test-samples.sh"
+}
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker"
+}
+
+# Download secrets for samples
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples"
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "python-webrisk/.kokoro/trampoline.sh"
\ No newline at end of file
diff --git a/.kokoro/samples/lint/continuous.cfg b/.kokoro/samples/lint/continuous.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/lint/continuous.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/lint/periodic.cfg b/.kokoro/samples/lint/periodic.cfg
new file mode 100644
index 0000000..50fec96
--- /dev/null
+++ b/.kokoro/samples/lint/periodic.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "False"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/lint/presubmit.cfg b/.kokoro/samples/lint/presubmit.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/lint/presubmit.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.6/common.cfg b/.kokoro/samples/python3.6/common.cfg
new file mode 100644
index 0000000..0a7c1e2
--- /dev/null
+++ b/.kokoro/samples/python3.6/common.cfg
@@ -0,0 +1,34 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+# Specify which tests to run
+env_vars: {
+ key: "RUN_TESTS_SESSION"
+ value: "py-3.6"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/python-webrisk/.kokoro/test-samples.sh"
+}
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker"
+}
+
+# Download secrets for samples
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples"
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "python-webrisk/.kokoro/trampoline.sh"
\ No newline at end of file
diff --git a/.kokoro/samples/python3.6/continuous.cfg b/.kokoro/samples/python3.6/continuous.cfg
new file mode 100644
index 0000000..7218af1
--- /dev/null
+++ b/.kokoro/samples/python3.6/continuous.cfg
@@ -0,0 +1,7 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
+
diff --git a/.kokoro/samples/python3.6/periodic.cfg b/.kokoro/samples/python3.6/periodic.cfg
new file mode 100644
index 0000000..50fec96
--- /dev/null
+++ b/.kokoro/samples/python3.6/periodic.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "False"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.6/presubmit.cfg b/.kokoro/samples/python3.6/presubmit.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.6/presubmit.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.7/common.cfg b/.kokoro/samples/python3.7/common.cfg
new file mode 100644
index 0000000..97d2e49
--- /dev/null
+++ b/.kokoro/samples/python3.7/common.cfg
@@ -0,0 +1,34 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+# Specify which tests to run
+env_vars: {
+ key: "RUN_TESTS_SESSION"
+ value: "py-3.7"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/python-webrisk/.kokoro/test-samples.sh"
+}
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker"
+}
+
+# Download secrets for samples
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples"
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "python-webrisk/.kokoro/trampoline.sh"
\ No newline at end of file
diff --git a/.kokoro/samples/python3.7/continuous.cfg b/.kokoro/samples/python3.7/continuous.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.7/continuous.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.7/periodic.cfg b/.kokoro/samples/python3.7/periodic.cfg
new file mode 100644
index 0000000..50fec96
--- /dev/null
+++ b/.kokoro/samples/python3.7/periodic.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "False"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.7/presubmit.cfg b/.kokoro/samples/python3.7/presubmit.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.7/presubmit.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.8/common.cfg b/.kokoro/samples/python3.8/common.cfg
new file mode 100644
index 0000000..ad1f4fa
--- /dev/null
+++ b/.kokoro/samples/python3.8/common.cfg
@@ -0,0 +1,34 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+# Specify which tests to run
+env_vars: {
+ key: "RUN_TESTS_SESSION"
+ value: "py-3.8"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/python-webrisk/.kokoro/test-samples.sh"
+}
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker"
+}
+
+# Download secrets for samples
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples"
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "python-webrisk/.kokoro/trampoline.sh"
\ No newline at end of file
diff --git a/.kokoro/samples/python3.8/continuous.cfg b/.kokoro/samples/python3.8/continuous.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.8/continuous.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.8/periodic.cfg b/.kokoro/samples/python3.8/periodic.cfg
new file mode 100644
index 0000000..50fec96
--- /dev/null
+++ b/.kokoro/samples/python3.8/periodic.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "False"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.8/presubmit.cfg b/.kokoro/samples/python3.8/presubmit.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.8/presubmit.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/test-samples.sh b/.kokoro/test-samples.sh
new file mode 100755
index 0000000..8283182
--- /dev/null
+++ b/.kokoro/test-samples.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# `-e` enables the script to automatically fail when a command fails
+# `-o pipefail` sets the exit code to the rightmost comment to exit with a non-zero
+set -eo pipefail
+# Enables `**` to include files nested inside sub-folders
+shopt -s globstar
+
+cd github/python-webrisk
+
+# Run periodic samples tests at latest release
+if [[ $KOKORO_BUILD_ARTIFACTS_SUBDIR = *"periodic"* ]]; then
+ LATEST_RELEASE=$(git describe --abbrev=0 --tags)
+ git checkout $LATEST_RELEASE
+fi
+
+# Disable buffering, so that the logs stream through.
+export PYTHONUNBUFFERED=1
+
+# Debug: show build environment
+env | grep KOKORO
+
+# Install nox
+python3.6 -m pip install --upgrade --quiet nox
+
+# Use secrets acessor service account to get secrets
+if [[ -f "${KOKORO_GFILE_DIR}/secrets_viewer_service_account.json" ]]; then
+ gcloud auth activate-service-account \
+ --key-file="${KOKORO_GFILE_DIR}/secrets_viewer_service_account.json" \
+ --project="cloud-devrel-kokoro-resources"
+fi
+
+# This script will create 3 files:
+# - testing/test-env.sh
+# - testing/service-account.json
+# - testing/client-secrets.json
+./scripts/decrypt-secrets.sh
+
+source ./testing/test-env.sh
+export GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/testing/service-account.json
+
+# For cloud-run session, we activate the service account for gcloud sdk.
+gcloud auth activate-service-account \
+ --key-file "${GOOGLE_APPLICATION_CREDENTIALS}"
+
+export GOOGLE_CLIENT_SECRETS=$(pwd)/testing/client-secrets.json
+
+echo -e "\n******************** TESTING PROJECTS ********************"
+
+# Switch to 'fail at end' to allow all tests to complete before exiting.
+set +e
+# Use RTN to return a non-zero value if the test fails.
+RTN=0
+ROOT=$(pwd)
+# Find all requirements.txt in the samples directory (may break on whitespace).
+for file in samples/**/requirements.txt; do
+ cd "$ROOT"
+ # Navigate to the project folder.
+ file=$(dirname "$file")
+ cd "$file"
+
+ echo "------------------------------------------------------------"
+ echo "- testing $file"
+ echo "------------------------------------------------------------"
+
+ # Use nox to execute the tests for the project.
+ python3.6 -m nox -s "$RUN_TESTS_SESSION"
+ EXIT=$?
+
+ # If this is a periodic build, send the test log to the Build Cop Bot.
+ # See https://github.com/googleapis/repo-automation-bots/tree/master/packages/buildcop.
+ if [[ $KOKORO_BUILD_ARTIFACTS_SUBDIR = *"periodic"* ]]; then
+ chmod +x $KOKORO_GFILE_DIR/linux_amd64/buildcop
+ $KOKORO_GFILE_DIR/linux_amd64/buildcop
+ fi
+
+ if [[ $EXIT -ne 0 ]]; then
+ RTN=1
+ echo -e "\n Testing failed: Nox returned a non-zero exit code. \n"
+ else
+ echo -e "\n Testing completed.\n"
+ fi
+
+done
+cd "$ROOT"
+
+# Workaround for Kokoro permissions issue: delete secrets
+rm testing/{test-env.sh,client-secrets.json,service-account.json}
+
+exit "$RTN"
\ No newline at end of file
diff --git a/MANIFEST.in b/MANIFEST.in
index 68855ab..e9e29d1 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -20,3 +20,6 @@ recursive-include google *.json *.proto
recursive-include tests *
global-exclude *.py[co]
global-exclude __pycache__
+
+# Exclude scripts for samples readmegen
+prune scripts/readme-gen
\ No newline at end of file
diff --git a/docs/conf.py b/docs/conf.py
index 6a0a8a8..bb699fc 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -38,21 +38,18 @@
"sphinx.ext.napoleon",
"sphinx.ext.todo",
"sphinx.ext.viewcode",
+ "recommonmark",
]
# autodoc/autosummary flags
autoclass_content = "both"
-autodoc_default_flags = ["members"]
+autodoc_default_options = {"members": True}
autosummary_generate = True
# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]
-# Allow markdown includes (so releases.md can include CHANGLEOG.md)
-# http://www.sphinx-doc.org/en/master/markdown.html
-source_parsers = {".md": "recommonmark.parser.CommonMarkParser"}
-
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
@@ -340,7 +337,7 @@
intersphinx_mapping = {
"python": ("http://python.readthedocs.org/en/latest/", None),
"google-auth": ("https://google-auth.readthedocs.io/en/stable", None),
- "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None),
+ "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None,),
"grpc": ("https://grpc.io/grpc/python/", None),
}
diff --git a/docs/index.rst b/docs/index.rst
index a73df25..5bcdf54 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,5 +1,7 @@
.. include:: README.rst
+.. include:: multiprocessing.rst
+
v1
-------------
.. toctree::
diff --git a/docs/multiprocessing.rst b/docs/multiprocessing.rst
new file mode 100644
index 0000000..1cb29d4
--- /dev/null
+++ b/docs/multiprocessing.rst
@@ -0,0 +1,7 @@
+.. note::
+
+ Because this client uses :mod:`grpcio` library, it is safe to
+ share instances across threads. In multiprocessing scenarios, the best
+ practice is to create client instances *after* the invocation of
+ :func:`os.fork` by :class:`multiprocessing.Pool` or
+ :class:`multiprocessing.Process`.
diff --git a/google/cloud/webrisk.py b/google/cloud/webrisk.py
index a5d83db..c457e09 100644
--- a/google/cloud/webrisk.py
+++ b/google/cloud/webrisk.py
@@ -22,4 +22,8 @@
from google.cloud.webrisk_v1 import types
-__all__ = ("enums", "types", "WebRiskServiceClient")
+__all__ = (
+ "enums",
+ "types",
+ "WebRiskServiceClient",
+)
diff --git a/google/cloud/webrisk_v1/__init__.py b/google/cloud/webrisk_v1/__init__.py
index 6ee9a05..e67716f 100644
--- a/google/cloud/webrisk_v1/__init__.py
+++ b/google/cloud/webrisk_v1/__init__.py
@@ -26,8 +26,8 @@
if sys.version_info[:2] == (2, 7):
message = (
- "A future version of this library will drop support for Python 2.7."
- "More details about Python 2 support for Google Cloud Client Libraries"
+ "A future version of this library will drop support for Python 2.7. "
+ "More details about Python 2 support for Google Cloud Client Libraries "
"can be found at https://cloud.google.com/python/docs/python2-sunset/"
)
warnings.warn(message, DeprecationWarning)
@@ -38,4 +38,8 @@ class WebRiskServiceClient(web_risk_service_client.WebRiskServiceClient):
enums = enums
-__all__ = ("enums", "types", "WebRiskServiceClient")
+__all__ = (
+ "enums",
+ "types",
+ "WebRiskServiceClient",
+)
diff --git a/google/cloud/webrisk_v1/gapic/transports/web_risk_service_grpc_transport.py b/google/cloud/webrisk_v1/gapic/transports/web_risk_service_grpc_transport.py
index 8ba6a67..e0afe69 100644
--- a/google/cloud/webrisk_v1/gapic/transports/web_risk_service_grpc_transport.py
+++ b/google/cloud/webrisk_v1/gapic/transports/web_risk_service_grpc_transport.py
@@ -53,7 +53,7 @@ def __init__(
# exception (channels come with credentials baked in already).
if channel is not None and credentials is not None:
raise ValueError(
- "The `channel` and `credentials` arguments are mutually " "exclusive."
+ "The `channel` and `credentials` arguments are mutually " "exclusive.",
)
# Create the channel.
@@ -72,7 +72,7 @@ def __init__(
# gRPC uses objects called "stubs" that are bound to the
# channel and provide a basic method for each RPC.
self._stubs = {
- "web_risk_service_stub": webrisk_pb2_grpc.WebRiskServiceStub(channel)
+ "web_risk_service_stub": webrisk_pb2_grpc.WebRiskServiceStub(channel),
}
@classmethod
@@ -163,9 +163,14 @@ def search_hashes(self):
def create_submission(self):
"""Return the gRPC stub for :meth:`WebRiskServiceClient.create_submission`.
- The maximum size in number of entries. The diff will not contain
- more entries than this value. This should be a power of 2 between
- 2\ **10 and 2**\ 20. If zero, no diff size limit is set.
+ Creates a Submission of a URI suspected of containing phishing
+ content to be reviewed. If the result verifies the existence of
+ malicious phishing content, the site will be added to the `Google's
+ Social Engineering
+ lists `__ in
+ order to protect users that could get exposed to this threat in the
+ future. Only projects with CREATE_SUBMISSION_USERS visibility can use
+ this method.
Returns:
Callable: A callable which accepts the appropriate
diff --git a/google/cloud/webrisk_v1/gapic/web_risk_service_client.py b/google/cloud/webrisk_v1/gapic/web_risk_service_client.py
index feab403..739adfc 100644
--- a/google/cloud/webrisk_v1/gapic/web_risk_service_client.py
+++ b/google/cloud/webrisk_v1/gapic/web_risk_service_client.py
@@ -36,7 +36,7 @@
from google.cloud.webrisk_v1.proto import webrisk_pb2_grpc
-_GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution("google-cloud-webrisk").version
+_GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution("google-cloud-webrisk",).version
class WebRiskServiceClient(object):
@@ -76,7 +76,7 @@ def from_service_account_file(cls, filename, *args, **kwargs):
def project_path(cls, project):
"""Return a fully-qualified project string."""
return google.api_core.path_template.expand(
- "projects/{project}", project=project
+ "projects/{project}", project=project,
)
def __init__(
@@ -166,12 +166,12 @@ def __init__(
self.transport = transport
else:
self.transport = web_risk_service_grpc_transport.WebRiskServiceGrpcTransport(
- address=api_endpoint, channel=channel, credentials=credentials
+ address=api_endpoint, channel=channel, credentials=credentials,
)
if client_info is None:
client_info = google.api_core.gapic_v1.client_info.ClientInfo(
- gapic_version=_GAPIC_LIBRARY_VERSION
+ gapic_version=_GAPIC_LIBRARY_VERSION,
)
else:
client_info.gapic_version = _GAPIC_LIBRARY_VERSION
@@ -182,7 +182,7 @@ def __init__(
# (Ordinarily, these are the defaults specified in the `*_config.py`
# file next to this one.)
self._method_configs = google.api_core.gapic_v1.config.parse_method_configs(
- client_config["interfaces"][self._INTERFACE_NAME]
+ client_config["interfaces"][self._INTERFACE_NAME],
)
# Save a dictionary of cached API call functions.
@@ -335,7 +335,7 @@ def search_uris(
client_info=self._client_info,
)
- request = webrisk_pb2.SearchUrisRequest(uri=uri, threat_types=threat_types)
+ request = webrisk_pb2.SearchUrisRequest(uri=uri, threat_types=threat_types,)
return self._inner_api_calls["search_uris"](
request, retry=retry, timeout=timeout, metadata=metadata
)
@@ -401,7 +401,7 @@ def search_hashes(
)
request = webrisk_pb2.SearchHashesRequest(
- threat_types=threat_types, hash_prefix=hash_prefix
+ threat_types=threat_types, hash_prefix=hash_prefix,
)
return self._inner_api_calls["search_hashes"](
request, retry=retry, timeout=timeout, metadata=metadata
@@ -416,9 +416,14 @@ def create_submission(
metadata=None,
):
"""
- The maximum size in number of entries. The diff will not contain
- more entries than this value. This should be a power of 2 between
- 2\ **10 and 2**\ 20. If zero, no diff size limit is set.
+ Creates a Submission of a URI suspected of containing phishing
+ content to be reviewed. If the result verifies the existence of
+ malicious phishing content, the site will be added to the `Google's
+ Social Engineering
+ lists `__ in
+ order to protect users that could get exposed to this threat in the
+ future. Only projects with CREATE_SUBMISSION_USERS visibility can use
+ this method.
Example:
>>> from google.cloud import webrisk_v1
@@ -433,10 +438,8 @@ def create_submission(
>>> response = client.create_submission(parent, submission)
Args:
- parent (str): The encoded local, lexicographically-sorted list indices, using a
- Golomb-Rice encoding. Used for sending compressed removal indices. The
- removal indices (uint32) are sorted in ascending order, then delta
- encoded and stored as encoded_data.
+ parent (str): Required. The name of the project that is making the submission.
+ This string is in the format "projects/{project_number}".
submission (Union[dict, ~google.cloud.webrisk_v1.types.Submission]): Required. The submission that contains the content of the phishing report.
If a dict is provided, it must be of the same form as the protobuf
@@ -472,7 +475,7 @@ def create_submission(
)
request = webrisk_pb2.CreateSubmissionRequest(
- parent=parent, submission=submission
+ parent=parent, submission=submission,
)
if metadata is None:
metadata = []
diff --git a/google/cloud/webrisk_v1/gapic/web_risk_service_client_config.py b/google/cloud/webrisk_v1/gapic/web_risk_service_client_config.py
index a476101..ca541aa 100644
--- a/google/cloud/webrisk_v1/gapic/web_risk_service_client_config.py
+++ b/google/cloud/webrisk_v1/gapic/web_risk_service_client_config.py
@@ -2,40 +2,59 @@
"interfaces": {
"google.cloud.webrisk.v1.WebRiskService": {
"retry_codes": {
- "idempotent": ["DEADLINE_EXCEEDED", "UNAVAILABLE"],
- "non_idempotent": [],
+ "retry_policy_1_codes": ["DEADLINE_EXCEEDED", "UNAVAILABLE"],
+ "no_retry_codes": [],
+ "no_retry_1_codes": [],
},
"retry_params": {
- "default": {
+ "retry_policy_1_params": {
"initial_retry_delay_millis": 100,
"retry_delay_multiplier": 1.3,
"max_retry_delay_millis": 60000,
- "initial_rpc_timeout_millis": 20000,
+ "initial_rpc_timeout_millis": 600000,
"rpc_timeout_multiplier": 1.0,
- "max_rpc_timeout_millis": 20000,
+ "max_rpc_timeout_millis": 600000,
"total_timeout_millis": 600000,
- }
+ },
+ "no_retry_params": {
+ "initial_retry_delay_millis": 0,
+ "retry_delay_multiplier": 0.0,
+ "max_retry_delay_millis": 0,
+ "initial_rpc_timeout_millis": 0,
+ "rpc_timeout_multiplier": 1.0,
+ "max_rpc_timeout_millis": 0,
+ "total_timeout_millis": 0,
+ },
+ "no_retry_1_params": {
+ "initial_retry_delay_millis": 0,
+ "retry_delay_multiplier": 0.0,
+ "max_retry_delay_millis": 0,
+ "initial_rpc_timeout_millis": 60000,
+ "rpc_timeout_multiplier": 1.0,
+ "max_rpc_timeout_millis": 60000,
+ "total_timeout_millis": 60000,
+ },
},
"methods": {
"ComputeThreatListDiff": {
- "timeout_millis": 60000,
- "retry_codes_name": "idempotent",
- "retry_params_name": "default",
+ "timeout_millis": 600000,
+ "retry_codes_name": "retry_policy_1_codes",
+ "retry_params_name": "retry_policy_1_params",
},
"SearchUris": {
- "timeout_millis": 60000,
- "retry_codes_name": "idempotent",
- "retry_params_name": "default",
+ "timeout_millis": 600000,
+ "retry_codes_name": "retry_policy_1_codes",
+ "retry_params_name": "retry_policy_1_params",
},
"SearchHashes": {
- "timeout_millis": 60000,
- "retry_codes_name": "idempotent",
- "retry_params_name": "default",
+ "timeout_millis": 600000,
+ "retry_codes_name": "retry_policy_1_codes",
+ "retry_params_name": "retry_policy_1_params",
},
"CreateSubmission": {
"timeout_millis": 60000,
- "retry_codes_name": "non_idempotent",
- "retry_params_name": "default",
+ "retry_codes_name": "no_retry_1_codes",
+ "retry_params_name": "no_retry_1_params",
},
},
}
diff --git a/google/cloud/webrisk_v1/proto/webrisk.proto b/google/cloud/webrisk_v1/proto/webrisk.proto
new file mode 100644
index 0000000..71b6b44
--- /dev/null
+++ b/google/cloud/webrisk_v1/proto/webrisk.proto
@@ -0,0 +1,353 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.cloud.webrisk.v1;
+
+import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
+import "google/protobuf/timestamp.proto";
+
+option csharp_namespace = "Google.Cloud.WebRisk.V1";
+option go_package = "google.golang.org/genproto/googleapis/cloud/webrisk/v1;webrisk";
+option java_multiple_files = true;
+option java_outer_classname = "WebRiskProto";
+option java_package = "com.google.webrisk.v1";
+option objc_class_prefix = "GCWR";
+option php_namespace = "Google\\Cloud\\WebRisk\\V1";
+option ruby_package = "Google::Cloud::WebRisk::V1";
+
+// Web Risk API defines an interface to detect malicious URLs on your
+// website and in client applications.
+service WebRiskService {
+ option (google.api.default_host) = "webrisk.googleapis.com";
+ option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";
+
+ // Gets the most recent threat list diffs. These diffs should be applied to
+ // a local database of hashes to keep it up-to-date. If the local database is
+ // empty or excessively out-of-date, a complete snapshot of the database will
+ // be returned. This Method only updates a single ThreatList at a time. To
+ // update multiple ThreatList databases, this method needs to be called once
+ // for each list.
+ rpc ComputeThreatListDiff(ComputeThreatListDiffRequest) returns (ComputeThreatListDiffResponse) {
+ option (google.api.http) = {
+ get: "/v1/threatLists:computeDiff"
+ };
+ option (google.api.method_signature) = "threat_type,version_token,constraints";
+ }
+
+ // This method is used to check whether a URI is on a given threatList.
+ // Multiple threatLists may be searched in a single query.
+ // The response will list all requested threatLists the URI was found to
+ // match. If the URI is not found on any of the requested ThreatList an
+ // empty response will be returned.
+ rpc SearchUris(SearchUrisRequest) returns (SearchUrisResponse) {
+ option (google.api.http) = {
+ get: "/v1/uris:search"
+ };
+ option (google.api.method_signature) = "uri,threat_types";
+ }
+
+ // Gets the full hashes that match the requested hash prefix.
+ // This is used after a hash prefix is looked up in a threatList
+ // and there is a match. The client side threatList only holds partial hashes
+ // so the client must query this method to determine if there is a full
+ // hash match of a threat.
+ rpc SearchHashes(SearchHashesRequest) returns (SearchHashesResponse) {
+ option (google.api.http) = {
+ get: "/v1/hashes:search"
+ };
+ option (google.api.method_signature) = "hash_prefix,threat_types";
+ }
+
+ // Creates a Submission of a URI suspected of containing phishing content to
+ // be reviewed. If the result verifies the existence of malicious phishing
+ // content, the site will be added to the [Google's Social Engineering
+ // lists](https://support.google.com/webmasters/answer/6350487/) in order to
+ // protect users that could get exposed to this threat in the future. Only
+ // projects with CREATE_SUBMISSION_USERS visibility can use this method.
+ rpc CreateSubmission(CreateSubmissionRequest) returns (Submission) {
+ option (google.api.http) = {
+ post: "/v1/{parent=projects/*}/submissions"
+ body: "submission"
+ };
+ option (google.api.method_signature) = "parent,submission";
+ }
+}
+
+// Describes an API diff request.
+message ComputeThreatListDiffRequest {
+ // The constraints for this diff.
+ message Constraints {
+ // The maximum size in number of entries. The diff will not contain more
+ // entries than this value. This should be a power of 2 between 2**10 and
+ // 2**20. If zero, no diff size limit is set.
+ int32 max_diff_entries = 1;
+
+ // Sets the maximum number of entries that the client is willing to have
+ // in the local database. This should be a power of 2 between 2**10 and
+ // 2**20. If zero, no database size limit is set.
+ int32 max_database_entries = 2;
+
+ // The compression types supported by the client.
+ repeated CompressionType supported_compressions = 3;
+ }
+
+ // Required. The threat list to update. Only a single ThreatType should be specified.
+ ThreatType threat_type = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // The current version token of the client for the requested list (the
+ // client version that was received from the last successful diff).
+ // If the client does not have a version token (this is the first time calling
+ // ComputeThreatListDiff), this may be left empty and a full database
+ // snapshot will be returned.
+ bytes version_token = 2;
+
+ // Required. The constraints associated with this request.
+ Constraints constraints = 3 [(google.api.field_behavior) = REQUIRED];
+}
+
+message ComputeThreatListDiffResponse {
+ // The expected state of a client's local database.
+ message Checksum {
+ // The SHA256 hash of the client state; that is, of the sorted list of all
+ // hashes present in the database.
+ bytes sha256 = 1;
+ }
+
+ // The type of response sent to the client.
+ enum ResponseType {
+ // Unknown.
+ RESPONSE_TYPE_UNSPECIFIED = 0;
+
+ // Partial updates are applied to the client's existing local database.
+ DIFF = 1;
+
+ // Full updates resets the client's entire local database. This means
+ // that either the client had no state, was seriously out-of-date,
+ // or the client is believed to be corrupt.
+ RESET = 2;
+ }
+
+ // The type of response. This may indicate that an action must be taken by the
+ // client when the response is received.
+ ResponseType response_type = 4;
+
+ // A set of entries to add to a local threat type's list.
+ ThreatEntryAdditions additions = 5;
+
+ // A set of entries to remove from a local threat type's list.
+ // This field may be empty.
+ ThreatEntryRemovals removals = 6;
+
+ // The new opaque client version token. This should be retained by the client
+ // and passed into the next call of ComputeThreatListDiff as 'version_token'.
+ // A separate version token should be stored and used for each threatList.
+ bytes new_version_token = 7;
+
+ // The expected SHA256 hash of the client state; that is, of the sorted list
+ // of all hashes present in the database after applying the provided diff.
+ // If the client state doesn't match the expected state, the client must
+ // discard this diff and retry later.
+ Checksum checksum = 8;
+
+ // The soonest the client should wait before issuing any diff
+ // request. Querying sooner is unlikely to produce a meaningful diff.
+ // Waiting longer is acceptable considering the use case.
+ // If this field is not set clients may update as soon as they want.
+ google.protobuf.Timestamp recommended_next_diff = 2;
+}
+
+// Request to check URI entries against threatLists.
+message SearchUrisRequest {
+ // Required. The URI to be checked for matches.
+ string uri = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The ThreatLists to search in. Multiple ThreatLists may be specified.
+ repeated ThreatType threat_types = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+message SearchUrisResponse {
+ // Contains threat information on a matching uri.
+ message ThreatUri {
+ // The ThreatList this threat belongs to.
+ repeated ThreatType threat_types = 1;
+
+ // The cache lifetime for the returned match. Clients must not cache this
+ // response past this timestamp to avoid false positives.
+ google.protobuf.Timestamp expire_time = 2;
+ }
+
+ // The threat list matches. This may be empty if the URI is on no list.
+ ThreatUri threat = 1;
+}
+
+// Request to return full hashes matched by the provided hash prefixes.
+message SearchHashesRequest {
+ // A hash prefix, consisting of the most significant 4-32 bytes of a SHA256
+ // hash. For JSON requests, this field is base64-encoded.
+ bytes hash_prefix = 1;
+
+ // Required. The ThreatLists to search in. Multiple ThreatLists may be specified.
+ repeated ThreatType threat_types = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+message SearchHashesResponse {
+ // Contains threat information on a matching hash.
+ message ThreatHash {
+ // The ThreatList this threat belongs to.
+ // This must contain at least one entry.
+ repeated ThreatType threat_types = 1;
+
+ // A 32 byte SHA256 hash. This field is in binary format. For JSON
+ // requests, hashes are base64-encoded.
+ bytes hash = 2;
+
+ // The cache lifetime for the returned match. Clients must not cache this
+ // response past this timestamp to avoid false positives.
+ google.protobuf.Timestamp expire_time = 3;
+ }
+
+ // The full hashes that matched the requested prefixes.
+ // The hash will be populated in the key.
+ repeated ThreatHash threats = 1;
+
+ // For requested entities that did not match the threat list, how long to
+ // cache the response until.
+ google.protobuf.Timestamp negative_expire_time = 2;
+}
+
+// Contains the set of entries to add to a local database.
+// May contain a combination of compressed and raw data in a single response.
+message ThreatEntryAdditions {
+ // The raw SHA256-formatted entries.
+ // Repeated to allow returning sets of hashes with different prefix sizes.
+ repeated RawHashes raw_hashes = 1;
+
+ // The encoded 4-byte prefixes of SHA256-formatted entries, using a
+ // Golomb-Rice encoding. The hashes are converted to uint32, sorted in
+ // ascending order, then delta encoded and stored as encoded_data.
+ RiceDeltaEncoding rice_hashes = 2;
+}
+
+// Contains the set of entries to remove from a local database.
+message ThreatEntryRemovals {
+ // The raw removal indices for a local list.
+ RawIndices raw_indices = 1;
+
+ // The encoded local, lexicographically-sorted list indices, using a
+ // Golomb-Rice encoding. Used for sending compressed removal indices. The
+ // removal indices (uint32) are sorted in ascending order, then delta encoded
+ // and stored as encoded_data.
+ RiceDeltaEncoding rice_indices = 2;
+}
+
+// The type of threat. This maps dirrectly to the threat list a threat may
+// belong to.
+enum ThreatType {
+ // Unknown.
+ THREAT_TYPE_UNSPECIFIED = 0;
+
+ // Malware targeting any platform.
+ MALWARE = 1;
+
+ // Social engineering targeting any platform.
+ SOCIAL_ENGINEERING = 2;
+
+ // Unwanted software targeting any platform.
+ UNWANTED_SOFTWARE = 3;
+}
+
+// The ways in which threat entry sets can be compressed.
+enum CompressionType {
+ // Unknown.
+ COMPRESSION_TYPE_UNSPECIFIED = 0;
+
+ // Raw, uncompressed data.
+ RAW = 1;
+
+ // Rice-Golomb encoded data.
+ RICE = 2;
+}
+
+// A set of raw indices to remove from a local list.
+message RawIndices {
+ // The indices to remove from a lexicographically-sorted local list.
+ repeated int32 indices = 1;
+}
+
+// The uncompressed threat entries in hash format.
+// Hashes can be anywhere from 4 to 32 bytes in size. A large majority are 4
+// bytes, but some hashes are lengthened if they collide with the hash of a
+// popular URI.
+//
+// Used for sending ThreatEntryAdditons to clients that do not support
+// compression, or when sending non-4-byte hashes to clients that do support
+// compression.
+message RawHashes {
+ // The number of bytes for each prefix encoded below. This field can be
+ // anywhere from 4 (shortest prefix) to 32 (full SHA256 hash).
+ // In practice this is almost always 4, except in exceptional circumstances.
+ int32 prefix_size = 1;
+
+ // The hashes, in binary format, concatenated into one long string. Hashes are
+ // sorted in lexicographic order. For JSON API users, hashes are
+ // base64-encoded.
+ bytes raw_hashes = 2;
+}
+
+// The Rice-Golomb encoded data. Used for sending compressed 4-byte hashes or
+// compressed removal indices.
+message RiceDeltaEncoding {
+ // The offset of the first entry in the encoded data, or, if only a single
+ // integer was encoded, that single integer's value. If the field is empty or
+ // missing, assume zero.
+ int64 first_value = 1;
+
+ // The Golomb-Rice parameter, which is a number between 2 and 28. This field
+ // is missing (that is, zero) if `num_entries` is zero.
+ int32 rice_parameter = 2;
+
+ // The number of entries that are delta encoded in the encoded data. If only a
+ // single integer was encoded, this will be zero and the single value will be
+ // stored in `first_value`.
+ int32 entry_count = 3;
+
+ // The encoded deltas that are encoded using the Golomb-Rice coder.
+ bytes encoded_data = 4;
+}
+
+// Wraps a URI that might be displaying phishing content.
+message Submission {
+ // Required. The URI that is being reported for phishing content to be analyzed.
+ string uri = 1 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request to send a potentially phishy URI to WebRisk.
+message CreateSubmissionRequest {
+ // Required. The name of the project that is making the submission. This string is in
+ // the format "projects/{project_number}".
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "cloudresourcemanager.googleapis.com/Project"
+ }
+ ];
+
+ // Required. The submission that contains the content of the phishing report.
+ Submission submission = 2 [(google.api.field_behavior) = REQUIRED];
+}
diff --git a/google/cloud/webrisk_v1/proto/webrisk_pb2.py b/google/cloud/webrisk_v1/proto/webrisk_pb2.py
index bb38a84..876d27e 100644
--- a/google/cloud/webrisk_v1/proto/webrisk_pb2.py
+++ b/google/cloud/webrisk_v1/proto/webrisk_pb2.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: google/cloud/webrisk_v1/proto/webrisk.proto
-
+"""Generated protocol buffer code."""
from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
@@ -25,6 +25,7 @@
package="google.cloud.webrisk.v1",
syntax="proto3",
serialized_options=b"\n\025com.google.webrisk.v1B\014WebRiskProtoP\001Z>google.golang.org/genproto/googleapis/cloud/webrisk/v1;webrisk\242\002\004GCWR\252\002\027Google.Cloud.WebRisk.V1\312\002\027Google\\Cloud\\WebRisk\\V1\352\002\032Google::Cloud::WebRisk::V1",
+ create_key=_descriptor._internal_create_key,
serialized_pb=b'\n+google/cloud/webrisk_v1/proto/webrisk.proto\x12\x17google.cloud.webrisk.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\xe3\x02\n\x1c\x43omputeThreatListDiffRequest\x12=\n\x0bthreat_type\x18\x01 \x01(\x0e\x32#.google.cloud.webrisk.v1.ThreatTypeB\x03\xe0\x41\x02\x12\x15\n\rversion_token\x18\x02 \x01(\x0c\x12[\n\x0b\x63onstraints\x18\x03 \x01(\x0b\x32\x41.google.cloud.webrisk.v1.ComputeThreatListDiffRequest.ConstraintsB\x03\xe0\x41\x02\x1a\x8f\x01\n\x0b\x43onstraints\x12\x18\n\x10max_diff_entries\x18\x01 \x01(\x05\x12\x1c\n\x14max_database_entries\x18\x02 \x01(\x05\x12H\n\x16supported_compressions\x18\x03 \x03(\x0e\x32(.google.cloud.webrisk.v1.CompressionType"\x86\x04\n\x1d\x43omputeThreatListDiffResponse\x12Z\n\rresponse_type\x18\x04 \x01(\x0e\x32\x43.google.cloud.webrisk.v1.ComputeThreatListDiffResponse.ResponseType\x12@\n\tadditions\x18\x05 \x01(\x0b\x32-.google.cloud.webrisk.v1.ThreatEntryAdditions\x12>\n\x08removals\x18\x06 \x01(\x0b\x32,.google.cloud.webrisk.v1.ThreatEntryRemovals\x12\x19\n\x11new_version_token\x18\x07 \x01(\x0c\x12Q\n\x08\x63hecksum\x18\x08 \x01(\x0b\x32?.google.cloud.webrisk.v1.ComputeThreatListDiffResponse.Checksum\x12\x39\n\x15recommended_next_diff\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a\x1a\n\x08\x43hecksum\x12\x0e\n\x06sha256\x18\x01 \x01(\x0c"B\n\x0cResponseType\x12\x1d\n\x19RESPONSE_TYPE_UNSPECIFIED\x10\x00\x12\x08\n\x04\x44IFF\x10\x01\x12\t\n\x05RESET\x10\x02"e\n\x11SearchUrisRequest\x12\x10\n\x03uri\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12>\n\x0cthreat_types\x18\x02 \x03(\x0e\x32#.google.cloud.webrisk.v1.ThreatTypeB\x03\xe0\x41\x02"\xd4\x01\n\x12SearchUrisResponse\x12\x45\n\x06threat\x18\x01 \x01(\x0b\x32\x35.google.cloud.webrisk.v1.SearchUrisResponse.ThreatUri\x1aw\n\tThreatUri\x12\x39\n\x0cthreat_types\x18\x01 \x03(\x0e\x32#.google.cloud.webrisk.v1.ThreatType\x12/\n\x0b\x65xpire_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"j\n\x13SearchHashesRequest\x12\x13\n\x0bhash_prefix\x18\x01 \x01(\x0c\x12>\n\x0cthreat_types\x18\x02 \x03(\x0e\x32#.google.cloud.webrisk.v1.ThreatTypeB\x03\xe0\x41\x02"\xa4\x02\n\x14SearchHashesResponse\x12I\n\x07threats\x18\x01 \x03(\x0b\x32\x38.google.cloud.webrisk.v1.SearchHashesResponse.ThreatHash\x12\x38\n\x14negative_expire_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a\x86\x01\n\nThreatHash\x12\x39\n\x0cthreat_types\x18\x01 \x03(\x0e\x32#.google.cloud.webrisk.v1.ThreatType\x12\x0c\n\x04hash\x18\x02 \x01(\x0c\x12/\n\x0b\x65xpire_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\x8f\x01\n\x14ThreatEntryAdditions\x12\x36\n\nraw_hashes\x18\x01 \x03(\x0b\x32".google.cloud.webrisk.v1.RawHashes\x12?\n\x0brice_hashes\x18\x02 \x01(\x0b\x32*.google.cloud.webrisk.v1.RiceDeltaEncoding"\x91\x01\n\x13ThreatEntryRemovals\x12\x38\n\x0braw_indices\x18\x01 \x01(\x0b\x32#.google.cloud.webrisk.v1.RawIndices\x12@\n\x0crice_indices\x18\x02 \x01(\x0b\x32*.google.cloud.webrisk.v1.RiceDeltaEncoding"\x1d\n\nRawIndices\x12\x0f\n\x07indices\x18\x01 \x03(\x05"4\n\tRawHashes\x12\x13\n\x0bprefix_size\x18\x01 \x01(\x05\x12\x12\n\nraw_hashes\x18\x02 \x01(\x0c"k\n\x11RiceDeltaEncoding\x12\x13\n\x0b\x66irst_value\x18\x01 \x01(\x03\x12\x16\n\x0erice_parameter\x18\x02 \x01(\x05\x12\x13\n\x0b\x65ntry_count\x18\x03 \x01(\x05\x12\x14\n\x0c\x65ncoded_data\x18\x04 \x01(\x0c"\x1e\n\nSubmission\x12\x10\n\x03uri\x18\x01 \x01(\tB\x03\xe0\x41\x02"\x9c\x01\n\x17\x43reateSubmissionRequest\x12\x43\n\x06parent\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12<\n\nsubmission\x18\x02 \x01(\x0b\x32#.google.cloud.webrisk.v1.SubmissionB\x03\xe0\x41\x02*e\n\nThreatType\x12\x1b\n\x17THREAT_TYPE_UNSPECIFIED\x10\x00\x12\x0b\n\x07MALWARE\x10\x01\x12\x16\n\x12SOCIAL_ENGINEERING\x10\x02\x12\x15\n\x11UNWANTED_SOFTWARE\x10\x03*F\n\x0f\x43ompressionType\x12 \n\x1c\x43OMPRESSION_TYPE_UNSPECIFIED\x10\x00\x12\x07\n\x03RAW\x10\x01\x12\x08\n\x04RICE\x10\x02\x32\xa3\x06\n\x0eWebRiskService\x12\xd3\x01\n\x15\x43omputeThreatListDiff\x12\x35.google.cloud.webrisk.v1.ComputeThreatListDiffRequest\x1a\x36.google.cloud.webrisk.v1.ComputeThreatListDiffResponse"K\x82\xd3\xe4\x93\x02\x1d\x12\x1b/v1/threatLists:computeDiff\xda\x41%threat_type,version_token,constraints\x12\x91\x01\n\nSearchUris\x12*.google.cloud.webrisk.v1.SearchUrisRequest\x1a+.google.cloud.webrisk.v1.SearchUrisResponse"*\x82\xd3\xe4\x93\x02\x11\x12\x0f/v1/uris:search\xda\x41\x10uri,threat_types\x12\xa1\x01\n\x0cSearchHashes\x12,.google.cloud.webrisk.v1.SearchHashesRequest\x1a-.google.cloud.webrisk.v1.SearchHashesResponse"4\x82\xd3\xe4\x93\x02\x13\x12\x11/v1/hashes:search\xda\x41\x18hash_prefix,threat_types\x12\xb6\x01\n\x10\x43reateSubmission\x12\x30.google.cloud.webrisk.v1.CreateSubmissionRequest\x1a#.google.cloud.webrisk.v1.Submission"K\x82\xd3\xe4\x93\x02\x31"#/v1/{parent=projects/*}/submissions:\nsubmission\xda\x41\x11parent,submission\x1aJ\xca\x41\x16webrisk.googleapis.com\xd2\x41.https://www.googleapis.com/auth/cloud-platformB\xbf\x01\n\x15\x63om.google.webrisk.v1B\x0cWebRiskProtoP\x01Z>google.golang.org/genproto/googleapis/cloud/webrisk/v1;webrisk\xa2\x02\x04GCWR\xaa\x02\x17Google.Cloud.WebRisk.V1\xca\x02\x17Google\\Cloud\\WebRisk\\V1\xea\x02\x1aGoogle::Cloud::WebRisk::V1b\x06proto3',
dependencies=[
google_dot_api_dot_annotations__pb2.DESCRIPTOR,
@@ -40,6 +41,7 @@
full_name="google.cloud.webrisk.v1.ThreatType",
filename=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
values=[
_descriptor.EnumValueDescriptor(
name="THREAT_TYPE_UNSPECIFIED",
@@ -47,9 +49,15 @@
number=0,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="MALWARE", index=1, number=1, serialized_options=None, type=None
+ name="MALWARE",
+ index=1,
+ number=1,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
name="SOCIAL_ENGINEERING",
@@ -57,6 +65,7 @@
number=2,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
name="UNWANTED_SOFTWARE",
@@ -64,6 +73,7 @@
number=3,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
],
containing_type=None,
@@ -79,6 +89,7 @@
full_name="google.cloud.webrisk.v1.CompressionType",
filename=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
values=[
_descriptor.EnumValueDescriptor(
name="COMPRESSION_TYPE_UNSPECIFIED",
@@ -86,12 +97,23 @@
number=0,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="RAW", index=1, number=1, serialized_options=None, type=None
+ name="RAW",
+ index=1,
+ number=1,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="RICE", index=2, number=2, serialized_options=None, type=None
+ name="RICE",
+ index=2,
+ number=2,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
],
containing_type=None,
@@ -116,6 +138,7 @@
full_name="google.cloud.webrisk.v1.ComputeThreatListDiffResponse.ResponseType",
filename=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
values=[
_descriptor.EnumValueDescriptor(
name="RESPONSE_TYPE_UNSPECIFIED",
@@ -123,12 +146,23 @@
number=0,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="DIFF", index=1, number=1, serialized_options=None, type=None
+ name="DIFF",
+ index=1,
+ number=1,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="RESET", index=2, number=2, serialized_options=None, type=None
+ name="RESET",
+ index=2,
+ number=2,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
],
containing_type=None,
@@ -145,6 +179,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="max_diff_entries",
@@ -163,6 +198,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="max_database_entries",
@@ -181,6 +217,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="supported_compressions",
@@ -199,6 +236,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -219,6 +257,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threat_type",
@@ -237,6 +276,7 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="version_token",
@@ -255,6 +295,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="constraints",
@@ -273,10 +314,11 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
- nested_types=[_COMPUTETHREATLISTDIFFREQUEST_CONSTRAINTS],
+ nested_types=[_COMPUTETHREATLISTDIFFREQUEST_CONSTRAINTS,],
enum_types=[],
serialized_options=None,
is_extendable=False,
@@ -294,6 +336,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="sha256",
@@ -312,7 +355,8 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
- )
+ create_key=_descriptor._internal_create_key,
+ ),
],
extensions=[],
nested_types=[],
@@ -332,6 +376,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="response_type",
@@ -350,6 +395,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="additions",
@@ -368,6 +414,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="removals",
@@ -386,6 +433,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="new_version_token",
@@ -404,6 +452,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="checksum",
@@ -422,6 +471,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="recommended_next_diff",
@@ -440,11 +490,12 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
- nested_types=[_COMPUTETHREATLISTDIFFRESPONSE_CHECKSUM],
- enum_types=[_COMPUTETHREATLISTDIFFRESPONSE_RESPONSETYPE],
+ nested_types=[_COMPUTETHREATLISTDIFFRESPONSE_CHECKSUM,],
+ enum_types=[_COMPUTETHREATLISTDIFFRESPONSE_RESPONSETYPE,],
serialized_options=None,
is_extendable=False,
syntax="proto3",
@@ -461,6 +512,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="uri",
@@ -479,6 +531,7 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="threat_types",
@@ -497,6 +550,7 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -518,6 +572,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threat_types",
@@ -536,6 +591,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="expire_time",
@@ -554,6 +610,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -574,6 +631,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threat",
@@ -592,10 +650,11 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
- )
+ create_key=_descriptor._internal_create_key,
+ ),
],
extensions=[],
- nested_types=[_SEARCHURISRESPONSE_THREATURI],
+ nested_types=[_SEARCHURISRESPONSE_THREATURI,],
enum_types=[],
serialized_options=None,
is_extendable=False,
@@ -613,6 +672,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="hash_prefix",
@@ -631,6 +691,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="threat_types",
@@ -649,6 +710,7 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -670,6 +732,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threat_types",
@@ -688,6 +751,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="hash",
@@ -706,6 +770,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="expire_time",
@@ -724,6 +789,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -744,6 +810,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threats",
@@ -762,6 +829,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="negative_expire_time",
@@ -780,10 +848,11 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
- nested_types=[_SEARCHHASHESRESPONSE_THREATHASH],
+ nested_types=[_SEARCHHASHESRESPONSE_THREATHASH,],
enum_types=[],
serialized_options=None,
is_extendable=False,
@@ -801,6 +870,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="raw_hashes",
@@ -819,6 +889,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="rice_hashes",
@@ -837,6 +908,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -858,6 +930,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="raw_indices",
@@ -876,6 +949,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="rice_indices",
@@ -894,6 +968,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -915,6 +990,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="indices",
@@ -933,7 +1009,8 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
- )
+ create_key=_descriptor._internal_create_key,
+ ),
],
extensions=[],
nested_types=[],
@@ -954,6 +1031,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="prefix_size",
@@ -972,6 +1050,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="raw_hashes",
@@ -990,6 +1069,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -1011,6 +1091,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="first_value",
@@ -1029,6 +1110,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="rice_parameter",
@@ -1047,6 +1129,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="entry_count",
@@ -1065,6 +1148,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="encoded_data",
@@ -1083,6 +1167,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -1104,6 +1189,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="uri",
@@ -1122,7 +1208,8 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
- )
+ create_key=_descriptor._internal_create_key,
+ ),
],
extensions=[],
nested_types=[],
@@ -1143,6 +1230,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="parent",
@@ -1161,6 +1249,7 @@
extension_scope=None,
serialized_options=b"\340A\002\372A-\n+cloudresourcemanager.googleapis.com/Project",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="submission",
@@ -1179,6 +1268,7 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -1281,7 +1371,6 @@
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
"__doc__": """The constraints for this diff.
-
Attributes:
max_diff_entries:
The maximum size in number of entries. The diff will not
@@ -1303,7 +1392,6 @@
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
"__doc__": """Describes an API diff request.
-
Attributes:
threat_type:
Required. The threat list to update. Only a single ThreatType
@@ -1335,7 +1423,6 @@
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
"__doc__": """The expected state of a client’s local database.
-
Attributes:
sha256:
The SHA256 hash of the client state; that is, of the sorted
@@ -1388,7 +1475,6 @@
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
"__doc__": """Request to check URI entries against threatLists.
-
Attributes:
uri:
Required. The URI to be checked for matches.
@@ -1413,7 +1499,6 @@
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
"__doc__": """Contains threat information on a matching uri.
-
Attributes:
threat_types:
The ThreatList this threat belongs to.
@@ -1445,9 +1530,7 @@
{
"DESCRIPTOR": _SEARCHHASHESREQUEST,
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
- "__doc__": """Request to return full hashes matched by the provided hash
- prefixes.
-
+ "__doc__": """Request to return full hashes matched by the provided hash prefixes.
Attributes:
hash_prefix:
@@ -1475,7 +1558,6 @@
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
"__doc__": """Contains threat information on a matching hash.
-
Attributes:
threat_types:
The ThreatList this threat belongs to. This must contain at
@@ -1514,10 +1596,8 @@
{
"DESCRIPTOR": _THREATENTRYADDITIONS,
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
- "__doc__": """Contains the set of entries to add to a local database.
- May contain a combination of compressed and raw data in a single
- response.
-
+ "__doc__": """Contains the set of entries to add to a local database. May contain a
+ combination of compressed and raw data in a single response.
Attributes:
raw_hashes:
@@ -1540,9 +1620,7 @@
{
"DESCRIPTOR": _THREATENTRYREMOVALS,
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
- "__doc__": """Contains the set of entries to remove from a local
- database.
-
+ "__doc__": """Contains the set of entries to remove from a local database.
Attributes:
raw_indices:
@@ -1567,7 +1645,6 @@
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
"__doc__": """A set of raw indices to remove from a local list.
-
Attributes:
indices:
The indices to remove from a lexicographically-sorted local
@@ -1584,16 +1661,13 @@
{
"DESCRIPTOR": _RAWHASHES,
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
- "__doc__": """The uncompressed threat entries in hash format. Hashes can
- be anywhere from 4 to 32 bytes in size. A large majority are 4 bytes,
- but some hashes are lengthened if they collide with the hash of a
- popular URI.
-
+ "__doc__": """The uncompressed threat entries in hash format. Hashes can be anywhere
+ from 4 to 32 bytes in size. A large majority are 4 bytes, but some
+ hashes are lengthened if they collide with the hash of a popular URI.
Used for sending ThreatEntryAdditons to clients that do not support
compression, or when sending non-4-byte hashes to clients that do
support compression.
-
Attributes:
prefix_size:
The number of bytes for each prefix encoded below. This field
@@ -1616,9 +1690,8 @@
{
"DESCRIPTOR": _RICEDELTAENCODING,
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
- "__doc__": """The Rice-Golomb encoded data. Used for sending compressed
- 4-byte hashes or compressed removal indices.
-
+ "__doc__": """The Rice-Golomb encoded data. Used for sending compressed 4-byte
+ hashes or compressed removal indices.
Attributes:
first_value:
@@ -1650,7 +1723,6 @@
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
"__doc__": """Wraps a URI that might be displaying phishing content.
-
Attributes:
uri:
Required. The URI that is being reported for phishing content
@@ -1669,7 +1741,6 @@
"__module__": "google.cloud.webrisk_v1.proto.webrisk_pb2",
"__doc__": """Request to send a potentially phishy URI to WebRisk.
-
Attributes:
parent:
Required. The name of the project that is making the
@@ -1701,6 +1772,7 @@
file=DESCRIPTOR,
index=0,
serialized_options=b"\312A\026webrisk.googleapis.com\322A.https://www.googleapis.com/auth/cloud-platform",
+ create_key=_descriptor._internal_create_key,
serialized_start=2675,
serialized_end=3478,
methods=[
@@ -1712,6 +1784,7 @@
input_type=_COMPUTETHREATLISTDIFFREQUEST,
output_type=_COMPUTETHREATLISTDIFFRESPONSE,
serialized_options=b"\202\323\344\223\002\035\022\033/v1/threatLists:computeDiff\332A%threat_type,version_token,constraints",
+ create_key=_descriptor._internal_create_key,
),
_descriptor.MethodDescriptor(
name="SearchUris",
@@ -1721,6 +1794,7 @@
input_type=_SEARCHURISREQUEST,
output_type=_SEARCHURISRESPONSE,
serialized_options=b"\202\323\344\223\002\021\022\017/v1/uris:search\332A\020uri,threat_types",
+ create_key=_descriptor._internal_create_key,
),
_descriptor.MethodDescriptor(
name="SearchHashes",
@@ -1730,6 +1804,7 @@
input_type=_SEARCHHASHESREQUEST,
output_type=_SEARCHHASHESRESPONSE,
serialized_options=b"\202\323\344\223\002\023\022\021/v1/hashes:search\332A\030hash_prefix,threat_types",
+ create_key=_descriptor._internal_create_key,
),
_descriptor.MethodDescriptor(
name="CreateSubmission",
@@ -1739,6 +1814,7 @@
input_type=_CREATESUBMISSIONREQUEST,
output_type=_SUBMISSION,
serialized_options=b'\202\323\344\223\0021"#/v1/{parent=projects/*}/submissions:\nsubmission\332A\021parent,submission',
+ create_key=_descriptor._internal_create_key,
),
],
)
diff --git a/google/cloud/webrisk_v1/proto/webrisk_pb2_grpc.py b/google/cloud/webrisk_v1/proto/webrisk_pb2_grpc.py
index 6b3906e..84d12c0 100644
--- a/google/cloud/webrisk_v1/proto/webrisk_pb2_grpc.py
+++ b/google/cloud/webrisk_v1/proto/webrisk_pb2_grpc.py
@@ -1,4 +1,5 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
import grpc
from google.cloud.webrisk_v1.proto import (
@@ -8,15 +9,15 @@
class WebRiskServiceStub(object):
"""Web Risk API defines an interface to detect malicious URLs on your
- website and in client applications.
- """
+ website and in client applications.
+ """
def __init__(self, channel):
"""Constructor.
- Args:
- channel: A grpc.Channel.
- """
+ Args:
+ channel: A grpc.Channel.
+ """
self.ComputeThreatListDiff = channel.unary_unary(
"/google.cloud.webrisk.v1.WebRiskService/ComputeThreatListDiff",
request_serializer=google_dot_cloud_dot_webrisk__v1_dot_proto_dot_webrisk__pb2.ComputeThreatListDiffRequest.SerializeToString,
@@ -41,51 +42,51 @@ def __init__(self, channel):
class WebRiskServiceServicer(object):
"""Web Risk API defines an interface to detect malicious URLs on your
- website and in client applications.
- """
+ website and in client applications.
+ """
def ComputeThreatListDiff(self, request, context):
"""Gets the most recent threat list diffs. These diffs should be applied to
- a local database of hashes to keep it up-to-date. If the local database is
- empty or excessively out-of-date, a complete snapshot of the database will
- be returned. This Method only updates a single ThreatList at a time. To
- update multiple ThreatList databases, this method needs to be called once
- for each list.
- """
+ a local database of hashes to keep it up-to-date. If the local database is
+ empty or excessively out-of-date, a complete snapshot of the database will
+ be returned. This Method only updates a single ThreatList at a time. To
+ update multiple ThreatList databases, this method needs to be called once
+ for each list.
+ """
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")
def SearchUris(self, request, context):
"""This method is used to check whether a URI is on a given threatList.
- Multiple threatLists may be searched in a single query.
- The response will list all requested threatLists the URI was found to
- match. If the URI is not found on any of the requested ThreatList an
- empty response will be returned.
- """
+ Multiple threatLists may be searched in a single query.
+ The response will list all requested threatLists the URI was found to
+ match. If the URI is not found on any of the requested ThreatList an
+ empty response will be returned.
+ """
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")
def SearchHashes(self, request, context):
"""Gets the full hashes that match the requested hash prefix.
- This is used after a hash prefix is looked up in a threatList
- and there is a match. The client side threatList only holds partial hashes
- so the client must query this method to determine if there is a full
- hash match of a threat.
- """
+ This is used after a hash prefix is looked up in a threatList
+ and there is a match. The client side threatList only holds partial hashes
+ so the client must query this method to determine if there is a full
+ hash match of a threat.
+ """
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")
def CreateSubmission(self, request, context):
"""Creates a Submission of a URI suspected of containing phishing content to
- be reviewed. If the result verifies the existence of malicious phishing
- content, the site will be added to the [Google's Social Engineering
- lists](https://support.google.com/webmasters/answer/6350487/) in order to
- protect users that could get exposed to this threat in the future. Only
- projects with CREATE_SUBMISSION_USERS visibility can use this method.
- """
+ be reviewed. If the result verifies the existence of malicious phishing
+ content, the site will be added to the [Google's Social Engineering
+ lists](https://support.google.com/webmasters/answer/6350487/) in order to
+ protect users that could get exposed to this threat in the future. Only
+ projects with CREATE_SUBMISSION_USERS visibility can use this method.
+ """
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")
@@ -118,3 +119,118 @@ def add_WebRiskServiceServicer_to_server(servicer, server):
"google.cloud.webrisk.v1.WebRiskService", rpc_method_handlers
)
server.add_generic_rpc_handlers((generic_handler,))
+
+
+# This class is part of an EXPERIMENTAL API.
+class WebRiskService(object):
+ """Web Risk API defines an interface to detect malicious URLs on your
+ website and in client applications.
+ """
+
+ @staticmethod
+ def ComputeThreatListDiff(
+ request,
+ target,
+ options=(),
+ channel_credentials=None,
+ call_credentials=None,
+ compression=None,
+ wait_for_ready=None,
+ timeout=None,
+ metadata=None,
+ ):
+ return grpc.experimental.unary_unary(
+ request,
+ target,
+ "/google.cloud.webrisk.v1.WebRiskService/ComputeThreatListDiff",
+ google_dot_cloud_dot_webrisk__v1_dot_proto_dot_webrisk__pb2.ComputeThreatListDiffRequest.SerializeToString,
+ google_dot_cloud_dot_webrisk__v1_dot_proto_dot_webrisk__pb2.ComputeThreatListDiffResponse.FromString,
+ options,
+ channel_credentials,
+ call_credentials,
+ compression,
+ wait_for_ready,
+ timeout,
+ metadata,
+ )
+
+ @staticmethod
+ def SearchUris(
+ request,
+ target,
+ options=(),
+ channel_credentials=None,
+ call_credentials=None,
+ compression=None,
+ wait_for_ready=None,
+ timeout=None,
+ metadata=None,
+ ):
+ return grpc.experimental.unary_unary(
+ request,
+ target,
+ "/google.cloud.webrisk.v1.WebRiskService/SearchUris",
+ google_dot_cloud_dot_webrisk__v1_dot_proto_dot_webrisk__pb2.SearchUrisRequest.SerializeToString,
+ google_dot_cloud_dot_webrisk__v1_dot_proto_dot_webrisk__pb2.SearchUrisResponse.FromString,
+ options,
+ channel_credentials,
+ call_credentials,
+ compression,
+ wait_for_ready,
+ timeout,
+ metadata,
+ )
+
+ @staticmethod
+ def SearchHashes(
+ request,
+ target,
+ options=(),
+ channel_credentials=None,
+ call_credentials=None,
+ compression=None,
+ wait_for_ready=None,
+ timeout=None,
+ metadata=None,
+ ):
+ return grpc.experimental.unary_unary(
+ request,
+ target,
+ "/google.cloud.webrisk.v1.WebRiskService/SearchHashes",
+ google_dot_cloud_dot_webrisk__v1_dot_proto_dot_webrisk__pb2.SearchHashesRequest.SerializeToString,
+ google_dot_cloud_dot_webrisk__v1_dot_proto_dot_webrisk__pb2.SearchHashesResponse.FromString,
+ options,
+ channel_credentials,
+ call_credentials,
+ compression,
+ wait_for_ready,
+ timeout,
+ metadata,
+ )
+
+ @staticmethod
+ def CreateSubmission(
+ request,
+ target,
+ options=(),
+ channel_credentials=None,
+ call_credentials=None,
+ compression=None,
+ wait_for_ready=None,
+ timeout=None,
+ metadata=None,
+ ):
+ return grpc.experimental.unary_unary(
+ request,
+ target,
+ "/google.cloud.webrisk.v1.WebRiskService/CreateSubmission",
+ google_dot_cloud_dot_webrisk__v1_dot_proto_dot_webrisk__pb2.CreateSubmissionRequest.SerializeToString,
+ google_dot_cloud_dot_webrisk__v1_dot_proto_dot_webrisk__pb2.Submission.FromString,
+ options,
+ channel_credentials,
+ call_credentials,
+ compression,
+ wait_for_ready,
+ timeout,
+ metadata,
+ )
diff --git a/google/cloud/webrisk_v1/types.py b/google/cloud/webrisk_v1/types.py
index 7af0d2c..852b9bf 100644
--- a/google/cloud/webrisk_v1/types.py
+++ b/google/cloud/webrisk_v1/types.py
@@ -24,9 +24,13 @@
from google.protobuf import timestamp_pb2
-_shared_modules = [timestamp_pb2]
+_shared_modules = [
+ timestamp_pb2,
+]
-_local_modules = [webrisk_pb2]
+_local_modules = [
+ webrisk_pb2,
+]
names = []
diff --git a/google/cloud/webrisk_v1beta1/__init__.py b/google/cloud/webrisk_v1beta1/__init__.py
index bf228d2..deb723c 100644
--- a/google/cloud/webrisk_v1beta1/__init__.py
+++ b/google/cloud/webrisk_v1beta1/__init__.py
@@ -26,8 +26,8 @@
if sys.version_info[:2] == (2, 7):
message = (
- "A future version of this library will drop support for Python 2.7."
- "More details about Python 2 support for Google Cloud Client Libraries"
+ "A future version of this library will drop support for Python 2.7. "
+ "More details about Python 2 support for Google Cloud Client Libraries "
"can be found at https://cloud.google.com/python/docs/python2-sunset/"
)
warnings.warn(message, DeprecationWarning)
@@ -40,4 +40,8 @@ class WebRiskServiceV1Beta1Client(
enums = enums
-__all__ = ("enums", "types", "WebRiskServiceV1Beta1Client")
+__all__ = (
+ "enums",
+ "types",
+ "WebRiskServiceV1Beta1Client",
+)
diff --git a/google/cloud/webrisk_v1beta1/gapic/transports/web_risk_service_v1_beta1_grpc_transport.py b/google/cloud/webrisk_v1beta1/gapic/transports/web_risk_service_v1_beta1_grpc_transport.py
index cd461a8..70e1b3e 100644
--- a/google/cloud/webrisk_v1beta1/gapic/transports/web_risk_service_v1_beta1_grpc_transport.py
+++ b/google/cloud/webrisk_v1beta1/gapic/transports/web_risk_service_v1_beta1_grpc_transport.py
@@ -53,7 +53,7 @@ def __init__(
# exception (channels come with credentials baked in already).
if channel is not None and credentials is not None:
raise ValueError(
- "The `channel` and `credentials` arguments are mutually " "exclusive."
+ "The `channel` and `credentials` arguments are mutually " "exclusive.",
)
# Create the channel.
@@ -74,7 +74,7 @@ def __init__(
self._stubs = {
"web_risk_service_v1_beta1_stub": webrisk_pb2_grpc.WebRiskServiceV1Beta1Stub(
channel
- )
+ ),
}
@classmethod
diff --git a/google/cloud/webrisk_v1beta1/gapic/web_risk_service_v1_beta1_client.py b/google/cloud/webrisk_v1beta1/gapic/web_risk_service_v1_beta1_client.py
index 73c30ef..2bb2413 100644
--- a/google/cloud/webrisk_v1beta1/gapic/web_risk_service_v1_beta1_client.py
+++ b/google/cloud/webrisk_v1beta1/gapic/web_risk_service_v1_beta1_client.py
@@ -36,7 +36,7 @@
from google.cloud.webrisk_v1beta1.proto import webrisk_pb2_grpc
-_GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution("google-cloud-webrisk").version
+_GAPIC_LIBRARY_VERSION = pkg_resources.get_distribution("google-cloud-webrisk",).version
class WebRiskServiceV1Beta1Client(object):
@@ -159,12 +159,12 @@ def __init__(
self.transport = transport
else:
self.transport = web_risk_service_v1_beta1_grpc_transport.WebRiskServiceV1Beta1GrpcTransport(
- address=api_endpoint, channel=channel, credentials=credentials
+ address=api_endpoint, channel=channel, credentials=credentials,
)
if client_info is None:
client_info = google.api_core.gapic_v1.client_info.ClientInfo(
- gapic_version=_GAPIC_LIBRARY_VERSION
+ gapic_version=_GAPIC_LIBRARY_VERSION,
)
else:
client_info.gapic_version = _GAPIC_LIBRARY_VERSION
@@ -175,7 +175,7 @@ def __init__(
# (Ordinarily, these are the defaults specified in the `*_config.py`
# file next to this one.)
self._method_configs = google.api_core.gapic_v1.config.parse_method_configs(
- client_config["interfaces"][self._INTERFACE_NAME]
+ client_config["interfaces"][self._INTERFACE_NAME],
)
# Save a dictionary of cached API call functions.
@@ -316,7 +316,7 @@ def search_uris(
client_info=self._client_info,
)
- request = webrisk_pb2.SearchUrisRequest(uri=uri, threat_types=threat_types)
+ request = webrisk_pb2.SearchUrisRequest(uri=uri, threat_types=threat_types,)
return self._inner_api_calls["search_uris"](
request, retry=retry, timeout=timeout, metadata=metadata
)
@@ -382,7 +382,7 @@ def search_hashes(
)
request = webrisk_pb2.SearchHashesRequest(
- threat_types=threat_types, hash_prefix=hash_prefix
+ threat_types=threat_types, hash_prefix=hash_prefix,
)
return self._inner_api_calls["search_hashes"](
request, retry=retry, timeout=timeout, metadata=metadata
diff --git a/google/cloud/webrisk_v1beta1/gapic/web_risk_service_v1_beta1_client_config.py b/google/cloud/webrisk_v1beta1/gapic/web_risk_service_v1_beta1_client_config.py
index dd153e4..f2d199b 100644
--- a/google/cloud/webrisk_v1beta1/gapic/web_risk_service_v1_beta1_client_config.py
+++ b/google/cloud/webrisk_v1beta1/gapic/web_risk_service_v1_beta1_client_config.py
@@ -2,35 +2,44 @@
"interfaces": {
"google.cloud.webrisk.v1beta1.WebRiskServiceV1Beta1": {
"retry_codes": {
- "idempotent": ["DEADLINE_EXCEEDED", "UNAVAILABLE"],
- "non_idempotent": [],
+ "retry_policy_1_codes": ["DEADLINE_EXCEEDED", "UNAVAILABLE"],
+ "no_retry_codes": [],
},
"retry_params": {
- "default": {
+ "retry_policy_1_params": {
"initial_retry_delay_millis": 100,
"retry_delay_multiplier": 1.3,
"max_retry_delay_millis": 60000,
- "initial_rpc_timeout_millis": 20000,
+ "initial_rpc_timeout_millis": 600000,
"rpc_timeout_multiplier": 1.0,
- "max_rpc_timeout_millis": 20000,
+ "max_rpc_timeout_millis": 600000,
"total_timeout_millis": 600000,
- }
+ },
+ "no_retry_params": {
+ "initial_retry_delay_millis": 0,
+ "retry_delay_multiplier": 0.0,
+ "max_retry_delay_millis": 0,
+ "initial_rpc_timeout_millis": 0,
+ "rpc_timeout_multiplier": 1.0,
+ "max_rpc_timeout_millis": 0,
+ "total_timeout_millis": 0,
+ },
},
"methods": {
"ComputeThreatListDiff": {
- "timeout_millis": 60000,
- "retry_codes_name": "idempotent",
- "retry_params_name": "default",
+ "timeout_millis": 600000,
+ "retry_codes_name": "retry_policy_1_codes",
+ "retry_params_name": "retry_policy_1_params",
},
"SearchUris": {
- "timeout_millis": 60000,
- "retry_codes_name": "idempotent",
- "retry_params_name": "default",
+ "timeout_millis": 600000,
+ "retry_codes_name": "retry_policy_1_codes",
+ "retry_params_name": "retry_policy_1_params",
},
"SearchHashes": {
- "timeout_millis": 60000,
- "retry_codes_name": "idempotent",
- "retry_params_name": "default",
+ "timeout_millis": 600000,
+ "retry_codes_name": "retry_policy_1_codes",
+ "retry_params_name": "retry_policy_1_params",
},
},
}
diff --git a/google/cloud/webrisk_v1beta1/proto/webrisk.proto b/google/cloud/webrisk_v1beta1/proto/webrisk.proto
new file mode 100644
index 0000000..0226425
--- /dev/null
+++ b/google/cloud/webrisk_v1beta1/proto/webrisk.proto
@@ -0,0 +1,303 @@
+// Copyright 2019 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+syntax = "proto3";
+
+package google.cloud.webrisk.v1beta1;
+
+import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/protobuf/timestamp.proto";
+
+option csharp_namespace = "Google.Cloud.WebRisk.V1Beta1";
+option go_package = "google.golang.org/genproto/googleapis/cloud/webrisk/v1beta1;webrisk";
+option java_multiple_files = true;
+option java_outer_classname = "WebRiskProto";
+option java_package = "com.google.webrisk.v1beta1";
+option objc_class_prefix = "GCWR";
+option php_namespace = "Google\\Cloud\\WebRisk\\V1beta1";
+option ruby_package = "Google::Cloud::WebRisk::V1beta1";
+
+// Web Risk v1beta1 API defines an interface to detect malicious URLs on your
+// website and in client applications.
+service WebRiskServiceV1Beta1 {
+ option (google.api.default_host) = "webrisk.googleapis.com";
+ option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";
+
+ // Gets the most recent threat list diffs.
+ rpc ComputeThreatListDiff(ComputeThreatListDiffRequest) returns (ComputeThreatListDiffResponse) {
+ option (google.api.http) = {
+ get: "/v1beta1/threatLists:computeDiff"
+ };
+ option (google.api.method_signature) = "threat_type,version_token,constraints";
+ }
+
+ // This method is used to check whether a URI is on a given threatList.
+ rpc SearchUris(SearchUrisRequest) returns (SearchUrisResponse) {
+ option (google.api.http) = {
+ get: "/v1beta1/uris:search"
+ };
+ option (google.api.method_signature) = "uri,threat_types";
+ }
+
+ // Gets the full hashes that match the requested hash prefix.
+ // This is used after a hash prefix is looked up in a threatList
+ // and there is a match. The client side threatList only holds partial hashes
+ // so the client must query this method to determine if there is a full
+ // hash match of a threat.
+ rpc SearchHashes(SearchHashesRequest) returns (SearchHashesResponse) {
+ option (google.api.http) = {
+ get: "/v1beta1/hashes:search"
+ };
+ option (google.api.method_signature) = "hash_prefix,threat_types";
+ }
+}
+
+// Describes an API diff request.
+message ComputeThreatListDiffRequest {
+ // The constraints for this diff.
+ message Constraints {
+ // The maximum size in number of entries. The diff will not contain more
+ // entries than this value. This should be a power of 2 between 2**10 and
+ // 2**20. If zero, no diff size limit is set.
+ int32 max_diff_entries = 1;
+
+ // Sets the maximum number of entries that the client is willing to have
+ // in the local database. This should be a power of 2 between 2**10 and
+ // 2**20. If zero, no database size limit is set.
+ int32 max_database_entries = 2;
+
+ // The compression types supported by the client.
+ repeated CompressionType supported_compressions = 3;
+ }
+
+ // The ThreatList to update.
+ ThreatType threat_type = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // The current version token of the client for the requested list (the
+ // client version that was received from the last successful diff).
+ bytes version_token = 2;
+
+ // Required. The constraints associated with this request.
+ Constraints constraints = 3 [(google.api.field_behavior) = REQUIRED];
+}
+
+message ComputeThreatListDiffResponse {
+ // The expected state of a client's local database.
+ message Checksum {
+ // The SHA256 hash of the client state; that is, of the sorted list of all
+ // hashes present in the database.
+ bytes sha256 = 1;
+ }
+
+ // The type of response sent to the client.
+ enum ResponseType {
+ // Unknown.
+ RESPONSE_TYPE_UNSPECIFIED = 0;
+
+ // Partial updates are applied to the client's existing local database.
+ DIFF = 1;
+
+ // Full updates resets the client's entire local database. This means
+ // that either the client had no state, was seriously out-of-date,
+ // or the client is believed to be corrupt.
+ RESET = 2;
+ }
+
+ // The type of response. This may indicate that an action must be taken by the
+ // client when the response is received.
+ ResponseType response_type = 4;
+
+ // A set of entries to add to a local threat type's list.
+ ThreatEntryAdditions additions = 5;
+
+ // A set of entries to remove from a local threat type's list.
+ // This field may be empty.
+ ThreatEntryRemovals removals = 6;
+
+ // The new opaque client version token.
+ bytes new_version_token = 7;
+
+ // The expected SHA256 hash of the client state; that is, of the sorted list
+ // of all hashes present in the database after applying the provided diff.
+ // If the client state doesn't match the expected state, the client must
+ // disregard this diff and retry later.
+ Checksum checksum = 8;
+
+ // The soonest the client should wait before issuing any diff
+ // request. Querying sooner is unlikely to produce a meaningful diff.
+ // Waiting longer is acceptable considering the use case.
+ // If this field is not set clients may update as soon as they want.
+ google.protobuf.Timestamp recommended_next_diff = 2;
+}
+
+// Request to check URI entries against threatLists.
+message SearchUrisRequest {
+ // Required. The URI to be checked for matches.
+ string uri = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The ThreatLists to search in.
+ repeated ThreatType threat_types = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+message SearchUrisResponse {
+ // Contains threat information on a matching uri.
+ message ThreatUri {
+ // The ThreatList this threat belongs to.
+ repeated ThreatType threat_types = 1;
+
+ // The cache lifetime for the returned match. Clients must not cache this
+ // response past this timestamp to avoid false positives.
+ google.protobuf.Timestamp expire_time = 2;
+ }
+
+ // The threat list matches. This may be empty if the URI is on no list.
+ ThreatUri threat = 1;
+}
+
+// Request to return full hashes matched by the provided hash prefixes.
+message SearchHashesRequest {
+ // A hash prefix, consisting of the most significant 4-32 bytes of a SHA256
+ // hash. For JSON requests, this field is base64-encoded.
+ bytes hash_prefix = 1;
+
+ // Required. The ThreatLists to search in.
+ repeated ThreatType threat_types = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+message SearchHashesResponse {
+ // Contains threat information on a matching hash.
+ message ThreatHash {
+ // The ThreatList this threat belongs to.
+ // This must contain at least one entry.
+ repeated ThreatType threat_types = 1;
+
+ // A 32 byte SHA256 hash. This field is in binary format. For JSON
+ // requests, hashes are base64-encoded.
+ bytes hash = 2;
+
+ // The cache lifetime for the returned match. Clients must not cache this
+ // response past this timestamp to avoid false positives.
+ google.protobuf.Timestamp expire_time = 3;
+ }
+
+ // The full hashes that matched the requested prefixes.
+ // The hash will be populated in the key.
+ repeated ThreatHash threats = 1;
+
+ // For requested entities that did not match the threat list, how long to
+ // cache the response until.
+ google.protobuf.Timestamp negative_expire_time = 2;
+}
+
+// Contains the set of entries to add to a local database.
+// May contain a combination of compressed and raw data in a single response.
+message ThreatEntryAdditions {
+ // The raw SHA256-formatted entries.
+ // Repeated to allow returning sets of hashes with different prefix sizes.
+ repeated RawHashes raw_hashes = 1;
+
+ // The encoded 4-byte prefixes of SHA256-formatted entries, using a
+ // Golomb-Rice encoding. The hashes are converted to uint32, sorted in
+ // ascending order, then delta encoded and stored as encoded_data.
+ RiceDeltaEncoding rice_hashes = 2;
+}
+
+// Contains the set of entries to remove from a local database.
+message ThreatEntryRemovals {
+ // The raw removal indices for a local list.
+ RawIndices raw_indices = 1;
+
+ // The encoded local, lexicographically-sorted list indices, using a
+ // Golomb-Rice encoding. Used for sending compressed removal indices. The
+ // removal indices (uint32) are sorted in ascending order, then delta encoded
+ // and stored as encoded_data.
+ RiceDeltaEncoding rice_indices = 2;
+}
+
+// The type of threat. This maps dirrectly to the threat list a threat may
+// belong to.
+enum ThreatType {
+ // Unknown.
+ THREAT_TYPE_UNSPECIFIED = 0;
+
+ // Malware targeting any platform.
+ MALWARE = 1;
+
+ // Social engineering targeting any platform.
+ SOCIAL_ENGINEERING = 2;
+
+ // Unwanted software targeting any platform.
+ UNWANTED_SOFTWARE = 3;
+}
+
+// The ways in which threat entry sets can be compressed.
+enum CompressionType {
+ // Unknown.
+ COMPRESSION_TYPE_UNSPECIFIED = 0;
+
+ // Raw, uncompressed data.
+ RAW = 1;
+
+ // Rice-Golomb encoded data.
+ RICE = 2;
+}
+
+// A set of raw indices to remove from a local list.
+message RawIndices {
+ // The indices to remove from a lexicographically-sorted local list.
+ repeated int32 indices = 1;
+}
+
+// The uncompressed threat entries in hash format.
+// Hashes can be anywhere from 4 to 32 bytes in size. A large majority are 4
+// bytes, but some hashes are lengthened if they collide with the hash of a
+// popular URI.
+//
+// Used for sending ThreatEntryAdditons to clients that do not support
+// compression, or when sending non-4-byte hashes to clients that do support
+// compression.
+message RawHashes {
+ // The number of bytes for each prefix encoded below. This field can be
+ // anywhere from 4 (shortest prefix) to 32 (full SHA256 hash).
+ int32 prefix_size = 1;
+
+ // The hashes, in binary format, concatenated into one long string. Hashes are
+ // sorted in lexicographic order. For JSON API users, hashes are
+ // base64-encoded.
+ bytes raw_hashes = 2;
+}
+
+// The Rice-Golomb encoded data. Used for sending compressed 4-byte hashes or
+// compressed removal indices.
+message RiceDeltaEncoding {
+ // The offset of the first entry in the encoded data, or, if only a single
+ // integer was encoded, that single integer's value. If the field is empty or
+ // missing, assume zero.
+ int64 first_value = 1;
+
+ // The Golomb-Rice parameter, which is a number between 2 and 28. This field
+ // is missing (that is, zero) if `num_entries` is zero.
+ int32 rice_parameter = 2;
+
+ // The number of entries that are delta encoded in the encoded data. If only a
+ // single integer was encoded, this will be zero and the single value will be
+ // stored in `first_value`.
+ int32 entry_count = 3;
+
+ // The encoded deltas that are encoded using the Golomb-Rice coder.
+ bytes encoded_data = 4;
+}
diff --git a/google/cloud/webrisk_v1beta1/proto/webrisk_pb2.py b/google/cloud/webrisk_v1beta1/proto/webrisk_pb2.py
index 6d6f84a..3bf7f58 100644
--- a/google/cloud/webrisk_v1beta1/proto/webrisk_pb2.py
+++ b/google/cloud/webrisk_v1beta1/proto/webrisk_pb2.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: google/cloud/webrisk_v1beta1/proto/webrisk.proto
-
+"""Generated protocol buffer code."""
from google.protobuf.internal import enum_type_wrapper
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
@@ -24,6 +24,7 @@
package="google.cloud.webrisk.v1beta1",
syntax="proto3",
serialized_options=b"\n\032com.google.webrisk.v1beta1B\014WebRiskProtoP\001ZCgoogle.golang.org/genproto/googleapis/cloud/webrisk/v1beta1;webrisk\242\002\004GCWR\252\002\034Google.Cloud.WebRisk.V1Beta1\312\002\034Google\\Cloud\\WebRisk\\V1beta1\352\002\037Google::Cloud::WebRisk::V1beta1",
+ create_key=_descriptor._internal_create_key,
serialized_pb=b'\n0google/cloud/webrisk_v1beta1/proto/webrisk.proto\x12\x1cgoogle.cloud.webrisk.v1beta1\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\xf2\x02\n\x1c\x43omputeThreatListDiffRequest\x12\x42\n\x0bthreat_type\x18\x01 \x01(\x0e\x32(.google.cloud.webrisk.v1beta1.ThreatTypeB\x03\xe0\x41\x02\x12\x15\n\rversion_token\x18\x02 \x01(\x0c\x12`\n\x0b\x63onstraints\x18\x03 \x01(\x0b\x32\x46.google.cloud.webrisk.v1beta1.ComputeThreatListDiffRequest.ConstraintsB\x03\xe0\x41\x02\x1a\x94\x01\n\x0b\x43onstraints\x12\x18\n\x10max_diff_entries\x18\x01 \x01(\x05\x12\x1c\n\x14max_database_entries\x18\x02 \x01(\x05\x12M\n\x16supported_compressions\x18\x03 \x03(\x0e\x32-.google.cloud.webrisk.v1beta1.CompressionType"\x9a\x04\n\x1d\x43omputeThreatListDiffResponse\x12_\n\rresponse_type\x18\x04 \x01(\x0e\x32H.google.cloud.webrisk.v1beta1.ComputeThreatListDiffResponse.ResponseType\x12\x45\n\tadditions\x18\x05 \x01(\x0b\x32\x32.google.cloud.webrisk.v1beta1.ThreatEntryAdditions\x12\x43\n\x08removals\x18\x06 \x01(\x0b\x32\x31.google.cloud.webrisk.v1beta1.ThreatEntryRemovals\x12\x19\n\x11new_version_token\x18\x07 \x01(\x0c\x12V\n\x08\x63hecksum\x18\x08 \x01(\x0b\x32\x44.google.cloud.webrisk.v1beta1.ComputeThreatListDiffResponse.Checksum\x12\x39\n\x15recommended_next_diff\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a\x1a\n\x08\x43hecksum\x12\x0e\n\x06sha256\x18\x01 \x01(\x0c"B\n\x0cResponseType\x12\x1d\n\x19RESPONSE_TYPE_UNSPECIFIED\x10\x00\x12\x08\n\x04\x44IFF\x10\x01\x12\t\n\x05RESET\x10\x02"j\n\x11SearchUrisRequest\x12\x10\n\x03uri\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12\x43\n\x0cthreat_types\x18\x02 \x03(\x0e\x32(.google.cloud.webrisk.v1beta1.ThreatTypeB\x03\xe0\x41\x02"\xde\x01\n\x12SearchUrisResponse\x12J\n\x06threat\x18\x01 \x01(\x0b\x32:.google.cloud.webrisk.v1beta1.SearchUrisResponse.ThreatUri\x1a|\n\tThreatUri\x12>\n\x0cthreat_types\x18\x01 \x03(\x0e\x32(.google.cloud.webrisk.v1beta1.ThreatType\x12/\n\x0b\x65xpire_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"o\n\x13SearchHashesRequest\x12\x13\n\x0bhash_prefix\x18\x01 \x01(\x0c\x12\x43\n\x0cthreat_types\x18\x02 \x03(\x0e\x32(.google.cloud.webrisk.v1beta1.ThreatTypeB\x03\xe0\x41\x02"\xae\x02\n\x14SearchHashesResponse\x12N\n\x07threats\x18\x01 \x03(\x0b\x32=.google.cloud.webrisk.v1beta1.SearchHashesResponse.ThreatHash\x12\x38\n\x14negative_expire_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a\x8b\x01\n\nThreatHash\x12>\n\x0cthreat_types\x18\x01 \x03(\x0e\x32(.google.cloud.webrisk.v1beta1.ThreatType\x12\x0c\n\x04hash\x18\x02 \x01(\x0c\x12/\n\x0b\x65xpire_time\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\x99\x01\n\x14ThreatEntryAdditions\x12;\n\nraw_hashes\x18\x01 \x03(\x0b\x32\'.google.cloud.webrisk.v1beta1.RawHashes\x12\x44\n\x0brice_hashes\x18\x02 \x01(\x0b\x32/.google.cloud.webrisk.v1beta1.RiceDeltaEncoding"\x9b\x01\n\x13ThreatEntryRemovals\x12=\n\x0braw_indices\x18\x01 \x01(\x0b\x32(.google.cloud.webrisk.v1beta1.RawIndices\x12\x45\n\x0crice_indices\x18\x02 \x01(\x0b\x32/.google.cloud.webrisk.v1beta1.RiceDeltaEncoding"\x1d\n\nRawIndices\x12\x0f\n\x07indices\x18\x01 \x03(\x05"4\n\tRawHashes\x12\x13\n\x0bprefix_size\x18\x01 \x01(\x05\x12\x12\n\nraw_hashes\x18\x02 \x01(\x0c"k\n\x11RiceDeltaEncoding\x12\x13\n\x0b\x66irst_value\x18\x01 \x01(\x03\x12\x16\n\x0erice_parameter\x18\x02 \x01(\x05\x12\x13\n\x0b\x65ntry_count\x18\x03 \x01(\x05\x12\x14\n\x0c\x65ncoded_data\x18\x04 \x01(\x0c*e\n\nThreatType\x12\x1b\n\x17THREAT_TYPE_UNSPECIFIED\x10\x00\x12\x0b\n\x07MALWARE\x10\x01\x12\x16\n\x12SOCIAL_ENGINEERING\x10\x02\x12\x15\n\x11UNWANTED_SOFTWARE\x10\x03*F\n\x0f\x43ompressionType\x12 \n\x1c\x43OMPRESSION_TYPE_UNSPECIFIED\x10\x00\x12\x07\n\x03RAW\x10\x01\x12\x08\n\x04RICE\x10\x02\x32\x9e\x05\n\x15WebRiskServiceV1Beta1\x12\xe2\x01\n\x15\x43omputeThreatListDiff\x12:.google.cloud.webrisk.v1beta1.ComputeThreatListDiffRequest\x1a;.google.cloud.webrisk.v1beta1.ComputeThreatListDiffResponse"P\x82\xd3\xe4\x93\x02"\x12 /v1beta1/threatLists:computeDiff\xda\x41%threat_type,version_token,constraints\x12\xa0\x01\n\nSearchUris\x12/.google.cloud.webrisk.v1beta1.SearchUrisRequest\x1a\x30.google.cloud.webrisk.v1beta1.SearchUrisResponse"/\x82\xd3\xe4\x93\x02\x16\x12\x14/v1beta1/uris:search\xda\x41\x10uri,threat_types\x12\xb0\x01\n\x0cSearchHashes\x12\x31.google.cloud.webrisk.v1beta1.SearchHashesRequest\x1a\x32.google.cloud.webrisk.v1beta1.SearchHashesResponse"9\x82\xd3\xe4\x93\x02\x18\x12\x16/v1beta1/hashes:search\xda\x41\x18hash_prefix,threat_types\x1aJ\xca\x41\x16webrisk.googleapis.com\xd2\x41.https://www.googleapis.com/auth/cloud-platformB\xd8\x01\n\x1a\x63om.google.webrisk.v1beta1B\x0cWebRiskProtoP\x01ZCgoogle.golang.org/genproto/googleapis/cloud/webrisk/v1beta1;webrisk\xa2\x02\x04GCWR\xaa\x02\x1cGoogle.Cloud.WebRisk.V1Beta1\xca\x02\x1cGoogle\\Cloud\\WebRisk\\V1beta1\xea\x02\x1fGoogle::Cloud::WebRisk::V1beta1b\x06proto3',
dependencies=[
google_dot_api_dot_annotations__pb2.DESCRIPTOR,
@@ -38,6 +39,7 @@
full_name="google.cloud.webrisk.v1beta1.ThreatType",
filename=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
values=[
_descriptor.EnumValueDescriptor(
name="THREAT_TYPE_UNSPECIFIED",
@@ -45,9 +47,15 @@
number=0,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="MALWARE", index=1, number=1, serialized_options=None, type=None
+ name="MALWARE",
+ index=1,
+ number=1,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
name="SOCIAL_ENGINEERING",
@@ -55,6 +63,7 @@
number=2,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
name="UNWANTED_SOFTWARE",
@@ -62,6 +71,7 @@
number=3,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
],
containing_type=None,
@@ -77,6 +87,7 @@
full_name="google.cloud.webrisk.v1beta1.CompressionType",
filename=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
values=[
_descriptor.EnumValueDescriptor(
name="COMPRESSION_TYPE_UNSPECIFIED",
@@ -84,12 +95,23 @@
number=0,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="RAW", index=1, number=1, serialized_options=None, type=None
+ name="RAW",
+ index=1,
+ number=1,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="RICE", index=2, number=2, serialized_options=None, type=None
+ name="RICE",
+ index=2,
+ number=2,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
],
containing_type=None,
@@ -114,6 +136,7 @@
full_name="google.cloud.webrisk.v1beta1.ComputeThreatListDiffResponse.ResponseType",
filename=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
values=[
_descriptor.EnumValueDescriptor(
name="RESPONSE_TYPE_UNSPECIFIED",
@@ -121,12 +144,23 @@
number=0,
serialized_options=None,
type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="DIFF", index=1, number=1, serialized_options=None, type=None
+ name="DIFF",
+ index=1,
+ number=1,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.EnumValueDescriptor(
- name="RESET", index=2, number=2, serialized_options=None, type=None
+ name="RESET",
+ index=2,
+ number=2,
+ serialized_options=None,
+ type=None,
+ create_key=_descriptor._internal_create_key,
),
],
containing_type=None,
@@ -143,6 +177,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="max_diff_entries",
@@ -161,6 +196,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="max_database_entries",
@@ -179,6 +215,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="supported_compressions",
@@ -197,6 +234,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -217,6 +255,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threat_type",
@@ -235,6 +274,7 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="version_token",
@@ -253,6 +293,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="constraints",
@@ -271,10 +312,11 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
- nested_types=[_COMPUTETHREATLISTDIFFREQUEST_CONSTRAINTS],
+ nested_types=[_COMPUTETHREATLISTDIFFREQUEST_CONSTRAINTS,],
enum_types=[],
serialized_options=None,
is_extendable=False,
@@ -292,6 +334,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="sha256",
@@ -310,7 +353,8 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
- )
+ create_key=_descriptor._internal_create_key,
+ ),
],
extensions=[],
nested_types=[],
@@ -330,6 +374,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="response_type",
@@ -348,6 +393,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="additions",
@@ -366,6 +412,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="removals",
@@ -384,6 +431,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="new_version_token",
@@ -402,6 +450,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="checksum",
@@ -420,6 +469,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="recommended_next_diff",
@@ -438,11 +488,12 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
- nested_types=[_COMPUTETHREATLISTDIFFRESPONSE_CHECKSUM],
- enum_types=[_COMPUTETHREATLISTDIFFRESPONSE_RESPONSETYPE],
+ nested_types=[_COMPUTETHREATLISTDIFFRESPONSE_CHECKSUM,],
+ enum_types=[_COMPUTETHREATLISTDIFFRESPONSE_RESPONSETYPE,],
serialized_options=None,
is_extendable=False,
syntax="proto3",
@@ -459,6 +510,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="uri",
@@ -477,6 +529,7 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="threat_types",
@@ -495,6 +548,7 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -516,6 +570,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threat_types",
@@ -534,6 +589,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="expire_time",
@@ -552,6 +608,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -572,6 +629,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threat",
@@ -590,10 +648,11 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
- )
+ create_key=_descriptor._internal_create_key,
+ ),
],
extensions=[],
- nested_types=[_SEARCHURISRESPONSE_THREATURI],
+ nested_types=[_SEARCHURISRESPONSE_THREATURI,],
enum_types=[],
serialized_options=None,
is_extendable=False,
@@ -611,6 +670,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="hash_prefix",
@@ -629,6 +689,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="threat_types",
@@ -647,6 +708,7 @@
extension_scope=None,
serialized_options=b"\340A\002",
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -668,6 +730,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threat_types",
@@ -686,6 +749,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="hash",
@@ -704,6 +768,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="expire_time",
@@ -722,6 +787,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -742,6 +808,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="threats",
@@ -760,6 +827,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="negative_expire_time",
@@ -778,10 +846,11 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
- nested_types=[_SEARCHHASHESRESPONSE_THREATHASH],
+ nested_types=[_SEARCHHASHESRESPONSE_THREATHASH,],
enum_types=[],
serialized_options=None,
is_extendable=False,
@@ -799,6 +868,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="raw_hashes",
@@ -817,6 +887,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="rice_hashes",
@@ -835,6 +906,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -856,6 +928,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="raw_indices",
@@ -874,6 +947,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="rice_indices",
@@ -892,6 +966,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -913,6 +988,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="indices",
@@ -931,7 +1007,8 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
- )
+ create_key=_descriptor._internal_create_key,
+ ),
],
extensions=[],
nested_types=[],
@@ -952,6 +1029,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="prefix_size",
@@ -970,6 +1048,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="raw_hashes",
@@ -988,6 +1067,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -1009,6 +1089,7 @@
filename=None,
file=DESCRIPTOR,
containing_type=None,
+ create_key=_descriptor._internal_create_key,
fields=[
_descriptor.FieldDescriptor(
name="first_value",
@@ -1027,6 +1108,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="rice_parameter",
@@ -1045,6 +1127,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="entry_count",
@@ -1063,6 +1146,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
_descriptor.FieldDescriptor(
name="encoded_data",
@@ -1081,6 +1165,7 @@
extension_scope=None,
serialized_options=None,
file=DESCRIPTOR,
+ create_key=_descriptor._internal_create_key,
),
],
extensions=[],
@@ -1180,7 +1265,6 @@
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
"__doc__": """The constraints for this diff.
-
Attributes:
max_diff_entries:
The maximum size in number of entries. The diff will not
@@ -1202,7 +1286,6 @@
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
"__doc__": """Describes an API diff request.
-
Attributes:
threat_type:
The ThreatList to update.
@@ -1231,7 +1314,6 @@
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
"__doc__": """The expected state of a client’s local database.
-
Attributes:
sha256:
The SHA256 hash of the client state; that is, of the sorted
@@ -1281,7 +1363,6 @@
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
"__doc__": """Request to check URI entries against threatLists.
-
Attributes:
uri:
Required. The URI to be checked for matches.
@@ -1305,7 +1386,6 @@
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
"__doc__": """Contains threat information on a matching uri.
-
Attributes:
threat_types:
The ThreatList this threat belongs to.
@@ -1339,7 +1419,6 @@
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
"__doc__": """Request to return full hashes matched by the provided hash prefixes.
-
Attributes:
hash_prefix:
A hash prefix, consisting of the most significant 4-32 bytes
@@ -1365,7 +1444,6 @@
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
"__doc__": """Contains threat information on a matching hash.
-
Attributes:
threat_types:
The ThreatList this threat belongs to. This must contain at
@@ -1404,10 +1482,8 @@
{
"DESCRIPTOR": _THREATENTRYADDITIONS,
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
- "__doc__": """Contains the set of entries to add to a local database.
- May contain a combination of compressed and raw data in a single
- response.
-
+ "__doc__": """Contains the set of entries to add to a local database. May contain a
+ combination of compressed and raw data in a single response.
Attributes:
raw_hashes:
@@ -1430,9 +1506,7 @@
{
"DESCRIPTOR": _THREATENTRYREMOVALS,
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
- "__doc__": """Contains the set of entries to remove from a local
- database.
-
+ "__doc__": """Contains the set of entries to remove from a local database.
Attributes:
raw_indices:
@@ -1457,7 +1531,6 @@
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
"__doc__": """A set of raw indices to remove from a local list.
-
Attributes:
indices:
The indices to remove from a lexicographically-sorted local
@@ -1474,16 +1547,13 @@
{
"DESCRIPTOR": _RAWHASHES,
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
- "__doc__": """The uncompressed threat entries in hash format. Hashes can
- be anywhere from 4 to 32 bytes in size. A large majority are 4 bytes,
- but some hashes are lengthened if they collide with the hash of a
- popular URI.
-
+ "__doc__": """The uncompressed threat entries in hash format. Hashes can be anywhere
+ from 4 to 32 bytes in size. A large majority are 4 bytes, but some
+ hashes are lengthened if they collide with the hash of a popular URI.
Used for sending ThreatEntryAdditons to clients that do not support
compression, or when sending non-4-byte hashes to clients that do
support compression.
-
Attributes:
prefix_size:
The number of bytes for each prefix encoded below. This field
@@ -1505,9 +1575,8 @@
{
"DESCRIPTOR": _RICEDELTAENCODING,
"__module__": "google.cloud.webrisk_v1beta1.proto.webrisk_pb2",
- "__doc__": """The Rice-Golomb encoded data. Used for sending compressed
- 4-byte hashes or compressed removal indices.
-
+ "__doc__": """The Rice-Golomb encoded data. Used for sending compressed 4-byte
+ hashes or compressed removal indices.
Attributes:
first_value:
@@ -1545,6 +1614,7 @@
file=DESCRIPTOR,
index=0,
serialized_options=b"\312A\026webrisk.googleapis.com\322A.https://www.googleapis.com/auth/cloud-platform",
+ create_key=_descriptor._internal_create_key,
serialized_start=2552,
serialized_end=3222,
methods=[
@@ -1556,6 +1626,7 @@
input_type=_COMPUTETHREATLISTDIFFREQUEST,
output_type=_COMPUTETHREATLISTDIFFRESPONSE,
serialized_options=b'\202\323\344\223\002"\022 /v1beta1/threatLists:computeDiff\332A%threat_type,version_token,constraints',
+ create_key=_descriptor._internal_create_key,
),
_descriptor.MethodDescriptor(
name="SearchUris",
@@ -1565,6 +1636,7 @@
input_type=_SEARCHURISREQUEST,
output_type=_SEARCHURISRESPONSE,
serialized_options=b"\202\323\344\223\002\026\022\024/v1beta1/uris:search\332A\020uri,threat_types",
+ create_key=_descriptor._internal_create_key,
),
_descriptor.MethodDescriptor(
name="SearchHashes",
@@ -1574,6 +1646,7 @@
input_type=_SEARCHHASHESREQUEST,
output_type=_SEARCHHASHESRESPONSE,
serialized_options=b"\202\323\344\223\002\030\022\026/v1beta1/hashes:search\332A\030hash_prefix,threat_types",
+ create_key=_descriptor._internal_create_key,
),
],
)
diff --git a/google/cloud/webrisk_v1beta1/proto/webrisk_pb2_grpc.py b/google/cloud/webrisk_v1beta1/proto/webrisk_pb2_grpc.py
index be5a844..6458d2f 100644
--- a/google/cloud/webrisk_v1beta1/proto/webrisk_pb2_grpc.py
+++ b/google/cloud/webrisk_v1beta1/proto/webrisk_pb2_grpc.py
@@ -1,4 +1,5 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
import grpc
from google.cloud.webrisk_v1beta1.proto import (
@@ -8,15 +9,15 @@
class WebRiskServiceV1Beta1Stub(object):
"""Web Risk v1beta1 API defines an interface to detect malicious URLs on your
- website and in client applications.
- """
+ website and in client applications.
+ """
def __init__(self, channel):
"""Constructor.
- Args:
- channel: A grpc.Channel.
- """
+ Args:
+ channel: A grpc.Channel.
+ """
self.ComputeThreatListDiff = channel.unary_unary(
"/google.cloud.webrisk.v1beta1.WebRiskServiceV1Beta1/ComputeThreatListDiff",
request_serializer=google_dot_cloud_dot_webrisk__v1beta1_dot_proto_dot_webrisk__pb2.ComputeThreatListDiffRequest.SerializeToString,
@@ -36,30 +37,30 @@ def __init__(self, channel):
class WebRiskServiceV1Beta1Servicer(object):
"""Web Risk v1beta1 API defines an interface to detect malicious URLs on your
- website and in client applications.
- """
+ website and in client applications.
+ """
def ComputeThreatListDiff(self, request, context):
"""Gets the most recent threat list diffs.
- """
+ """
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")
def SearchUris(self, request, context):
"""This method is used to check whether a URI is on a given threatList.
- """
+ """
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")
def SearchHashes(self, request, context):
"""Gets the full hashes that match the requested hash prefix.
- This is used after a hash prefix is looked up in a threatList
- and there is a match. The client side threatList only holds partial hashes
- so the client must query this method to determine if there is a full
- hash match of a threat.
- """
+ This is used after a hash prefix is looked up in a threatList
+ and there is a match. The client side threatList only holds partial hashes
+ so the client must query this method to determine if there is a full
+ hash match of a threat.
+ """
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details("Method not implemented!")
raise NotImplementedError("Method not implemented!")
@@ -87,3 +88,91 @@ def add_WebRiskServiceV1Beta1Servicer_to_server(servicer, server):
"google.cloud.webrisk.v1beta1.WebRiskServiceV1Beta1", rpc_method_handlers
)
server.add_generic_rpc_handlers((generic_handler,))
+
+
+# This class is part of an EXPERIMENTAL API.
+class WebRiskServiceV1Beta1(object):
+ """Web Risk v1beta1 API defines an interface to detect malicious URLs on your
+ website and in client applications.
+ """
+
+ @staticmethod
+ def ComputeThreatListDiff(
+ request,
+ target,
+ options=(),
+ channel_credentials=None,
+ call_credentials=None,
+ compression=None,
+ wait_for_ready=None,
+ timeout=None,
+ metadata=None,
+ ):
+ return grpc.experimental.unary_unary(
+ request,
+ target,
+ "/google.cloud.webrisk.v1beta1.WebRiskServiceV1Beta1/ComputeThreatListDiff",
+ google_dot_cloud_dot_webrisk__v1beta1_dot_proto_dot_webrisk__pb2.ComputeThreatListDiffRequest.SerializeToString,
+ google_dot_cloud_dot_webrisk__v1beta1_dot_proto_dot_webrisk__pb2.ComputeThreatListDiffResponse.FromString,
+ options,
+ channel_credentials,
+ call_credentials,
+ compression,
+ wait_for_ready,
+ timeout,
+ metadata,
+ )
+
+ @staticmethod
+ def SearchUris(
+ request,
+ target,
+ options=(),
+ channel_credentials=None,
+ call_credentials=None,
+ compression=None,
+ wait_for_ready=None,
+ timeout=None,
+ metadata=None,
+ ):
+ return grpc.experimental.unary_unary(
+ request,
+ target,
+ "/google.cloud.webrisk.v1beta1.WebRiskServiceV1Beta1/SearchUris",
+ google_dot_cloud_dot_webrisk__v1beta1_dot_proto_dot_webrisk__pb2.SearchUrisRequest.SerializeToString,
+ google_dot_cloud_dot_webrisk__v1beta1_dot_proto_dot_webrisk__pb2.SearchUrisResponse.FromString,
+ options,
+ channel_credentials,
+ call_credentials,
+ compression,
+ wait_for_ready,
+ timeout,
+ metadata,
+ )
+
+ @staticmethod
+ def SearchHashes(
+ request,
+ target,
+ options=(),
+ channel_credentials=None,
+ call_credentials=None,
+ compression=None,
+ wait_for_ready=None,
+ timeout=None,
+ metadata=None,
+ ):
+ return grpc.experimental.unary_unary(
+ request,
+ target,
+ "/google.cloud.webrisk.v1beta1.WebRiskServiceV1Beta1/SearchHashes",
+ google_dot_cloud_dot_webrisk__v1beta1_dot_proto_dot_webrisk__pb2.SearchHashesRequest.SerializeToString,
+ google_dot_cloud_dot_webrisk__v1beta1_dot_proto_dot_webrisk__pb2.SearchHashesResponse.FromString,
+ options,
+ channel_credentials,
+ call_credentials,
+ compression,
+ wait_for_ready,
+ timeout,
+ metadata,
+ )
diff --git a/google/cloud/webrisk_v1beta1/types.py b/google/cloud/webrisk_v1beta1/types.py
index 17bf6f0..410776a 100644
--- a/google/cloud/webrisk_v1beta1/types.py
+++ b/google/cloud/webrisk_v1beta1/types.py
@@ -24,9 +24,13 @@
from google.protobuf import timestamp_pb2
-_shared_modules = [timestamp_pb2]
+_shared_modules = [
+ timestamp_pb2,
+]
-_local_modules = [webrisk_pb2]
+_local_modules = [
+ webrisk_pb2,
+]
names = []
diff --git a/noxfile.py b/noxfile.py
index a3290d3..0516d80 100644
--- a/noxfile.py
+++ b/noxfile.py
@@ -23,14 +23,15 @@
import nox
-BLACK_VERSION = "black==19.3b0"
+BLACK_VERSION = "black==19.10b0"
BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"]
-if os.path.exists("samples"):
- BLACK_PATHS.append("samples")
+DEFAULT_PYTHON_VERSION = "3.8"
+SYSTEM_TEST_PYTHON_VERSIONS = ["2.7", "3.8"]
+UNIT_TEST_PYTHON_VERSIONS = ["2.7", "3.5", "3.6", "3.7", "3.8"]
-@nox.session(python="3.7")
+@nox.session(python=DEFAULT_PYTHON_VERSION)
def lint(session):
"""Run linters.
@@ -38,7 +39,9 @@ def lint(session):
serious code quality issues.
"""
session.install("flake8", BLACK_VERSION)
- session.run("black", "--check", *BLACK_PATHS)
+ session.run(
+ "black", "--check", *BLACK_PATHS,
+ )
session.run("flake8", "google", "tests")
@@ -53,10 +56,12 @@ def blacken(session):
check the state of the `gcp_ubuntu_config` we use for that Kokoro run.
"""
session.install(BLACK_VERSION)
- session.run("black", *BLACK_PATHS)
+ session.run(
+ "black", *BLACK_PATHS,
+ )
-@nox.session(python="3.7")
+@nox.session(python=DEFAULT_PYTHON_VERSION)
def lint_setup_py(session):
"""Verify that setup.py is valid (including RST check)."""
session.install("docutils", "pygments")
@@ -84,13 +89,13 @@ def default(session):
)
-@nox.session(python=["2.7", "3.5", "3.6", "3.7", "3.8"])
+@nox.session(python=UNIT_TEST_PYTHON_VERSIONS)
def unit(session):
"""Run the unit test suite."""
default(session)
-@nox.session(python=["2.7", "3.7"])
+@nox.session(python=SYSTEM_TEST_PYTHON_VERSIONS)
def system(session):
"""Run the system test suite."""
system_test_path = os.path.join("tests", "system.py")
@@ -110,8 +115,9 @@ def system(session):
# Install all test dependencies, then install this package into the
# virtualenv's dist-packages.
- session.install("mock", "pytest")
- session.install("git+https://github.com/googleapis/python-test-utils")
+ session.install(
+ "mock", "pytest", "google-cloud-testutils",
+ )
session.install("-e", ".")
# Run py.test against the system tests.
@@ -121,7 +127,7 @@ def system(session):
session.run("py.test", "--quiet", system_test_folder_path, *session.posargs)
-@nox.session(python="3.7")
+@nox.session(python=DEFAULT_PYTHON_VERSION)
def cover(session):
"""Run the final coverage report.
@@ -134,7 +140,7 @@ def cover(session):
session.run("coverage", "erase")
-@nox.session(python="3.7")
+@nox.session(python=DEFAULT_PYTHON_VERSION)
def docs(session):
"""Build the docs for this library."""
diff --git a/scripts/decrypt-secrets.sh b/scripts/decrypt-secrets.sh
new file mode 100755
index 0000000..ff599eb
--- /dev/null
+++ b/scripts/decrypt-secrets.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# Copyright 2015 Google Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+ROOT=$( dirname "$DIR" )
+
+# Work from the project root.
+cd $ROOT
+
+# Use SECRET_MANAGER_PROJECT if set, fallback to cloud-devrel-kokoro-resources.
+PROJECT_ID="${SECRET_MANAGER_PROJECT:-cloud-devrel-kokoro-resources}"
+
+gcloud secrets versions access latest --secret="python-docs-samples-test-env" \
+ > testing/test-env.sh
+gcloud secrets versions access latest \
+ --secret="python-docs-samples-service-account" \
+ > testing/service-account.json
+gcloud secrets versions access latest \
+ --secret="python-docs-samples-client-secrets" \
+ > testing/client-secrets.json
\ No newline at end of file
diff --git a/scripts/readme-gen/readme_gen.py b/scripts/readme-gen/readme_gen.py
new file mode 100644
index 0000000..d309d6e
--- /dev/null
+++ b/scripts/readme-gen/readme_gen.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+# Copyright 2016 Google Inc
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Generates READMEs using configuration defined in yaml."""
+
+import argparse
+import io
+import os
+import subprocess
+
+import jinja2
+import yaml
+
+
+jinja_env = jinja2.Environment(
+ trim_blocks=True,
+ loader=jinja2.FileSystemLoader(
+ os.path.abspath(os.path.join(os.path.dirname(__file__), 'templates'))))
+
+README_TMPL = jinja_env.get_template('README.tmpl.rst')
+
+
+def get_help(file):
+ return subprocess.check_output(['python', file, '--help']).decode()
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('source')
+ parser.add_argument('--destination', default='README.rst')
+
+ args = parser.parse_args()
+
+ source = os.path.abspath(args.source)
+ root = os.path.dirname(source)
+ destination = os.path.join(root, args.destination)
+
+ jinja_env.globals['get_help'] = get_help
+
+ with io.open(source, 'r') as f:
+ config = yaml.load(f)
+
+ # This allows get_help to execute in the right directory.
+ os.chdir(root)
+
+ output = README_TMPL.render(config)
+
+ with io.open(destination, 'w') as f:
+ f.write(output)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/scripts/readme-gen/templates/README.tmpl.rst b/scripts/readme-gen/templates/README.tmpl.rst
new file mode 100644
index 0000000..4fd2397
--- /dev/null
+++ b/scripts/readme-gen/templates/README.tmpl.rst
@@ -0,0 +1,87 @@
+{# The following line is a lie. BUT! Once jinja2 is done with it, it will
+ become truth! #}
+.. This file is automatically generated. Do not edit this file directly.
+
+{{product.name}} Python Samples
+===============================================================================
+
+.. image:: https://gstatic.com/cloudssh/images/open-btn.png
+ :target: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/GoogleCloudPlatform/python-docs-samples&page=editor&open_in_editor={{folder}}/README.rst
+
+
+This directory contains samples for {{product.name}}. {{product.description}}
+
+{{description}}
+
+.. _{{product.name}}: {{product.url}}
+
+{% if required_api_url %}
+To run the sample, you need to enable the API at: {{required_api_url}}
+{% endif %}
+
+{% if required_role %}
+To run the sample, you need to have `{{required_role}}` role.
+{% endif %}
+
+{{other_required_steps}}
+
+{% if setup %}
+Setup
+-------------------------------------------------------------------------------
+
+{% for section in setup %}
+
+{% include section + '.tmpl.rst' %}
+
+{% endfor %}
+{% endif %}
+
+{% if samples %}
+Samples
+-------------------------------------------------------------------------------
+
+{% for sample in samples %}
+{{sample.name}}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+{% if not sample.hide_cloudshell_button %}
+.. image:: https://gstatic.com/cloudssh/images/open-btn.png
+ :target: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/GoogleCloudPlatform/python-docs-samples&page=editor&open_in_editor={{folder}}/{{sample.file}},{{folder}}/README.rst
+{% endif %}
+
+
+{{sample.description}}
+
+To run this sample:
+
+.. code-block:: bash
+
+ $ python {{sample.file}}
+{% if sample.show_help %}
+
+ {{get_help(sample.file)|indent}}
+{% endif %}
+
+
+{% endfor %}
+{% endif %}
+
+{% if cloud_client_library %}
+
+The client library
+-------------------------------------------------------------------------------
+
+This sample uses the `Google Cloud Client Library for Python`_.
+You can read the documentation for more details on API usage and use GitHub
+to `browse the source`_ and `report issues`_.
+
+.. _Google Cloud Client Library for Python:
+ https://googlecloudplatform.github.io/google-cloud-python/
+.. _browse the source:
+ https://github.com/GoogleCloudPlatform/google-cloud-python
+.. _report issues:
+ https://github.com/GoogleCloudPlatform/google-cloud-python/issues
+
+{% endif %}
+
+.. _Google Cloud SDK: https://cloud.google.com/sdk/
\ No newline at end of file
diff --git a/scripts/readme-gen/templates/auth.tmpl.rst b/scripts/readme-gen/templates/auth.tmpl.rst
new file mode 100644
index 0000000..1446b94
--- /dev/null
+++ b/scripts/readme-gen/templates/auth.tmpl.rst
@@ -0,0 +1,9 @@
+Authentication
+++++++++++++++
+
+This sample requires you to have authentication setup. Refer to the
+`Authentication Getting Started Guide`_ for instructions on setting up
+credentials for applications.
+
+.. _Authentication Getting Started Guide:
+ https://cloud.google.com/docs/authentication/getting-started
diff --git a/scripts/readme-gen/templates/auth_api_key.tmpl.rst b/scripts/readme-gen/templates/auth_api_key.tmpl.rst
new file mode 100644
index 0000000..11957ce
--- /dev/null
+++ b/scripts/readme-gen/templates/auth_api_key.tmpl.rst
@@ -0,0 +1,14 @@
+Authentication
+++++++++++++++
+
+Authentication for this service is done via an `API Key`_. To obtain an API
+Key:
+
+1. Open the `Cloud Platform Console`_
+2. Make sure that billing is enabled for your project.
+3. From the **Credentials** page, create a new **API Key** or use an existing
+ one for your project.
+
+.. _API Key:
+ https://developers.google.com/api-client-library/python/guide/aaa_apikeys
+.. _Cloud Console: https://console.cloud.google.com/project?_
diff --git a/scripts/readme-gen/templates/install_deps.tmpl.rst b/scripts/readme-gen/templates/install_deps.tmpl.rst
new file mode 100644
index 0000000..a0406db
--- /dev/null
+++ b/scripts/readme-gen/templates/install_deps.tmpl.rst
@@ -0,0 +1,29 @@
+Install Dependencies
+++++++++++++++++++++
+
+#. Clone python-docs-samples and change directory to the sample directory you want to use.
+
+ .. code-block:: bash
+
+ $ git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
+
+#. Install `pip`_ and `virtualenv`_ if you do not already have them. You may want to refer to the `Python Development Environment Setup Guide`_ for Google Cloud Platform for instructions.
+
+ .. _Python Development Environment Setup Guide:
+ https://cloud.google.com/python/setup
+
+#. Create a virtualenv. Samples are compatible with Python 2.7 and 3.4+.
+
+ .. code-block:: bash
+
+ $ virtualenv env
+ $ source env/bin/activate
+
+#. Install the dependencies needed to run the samples.
+
+ .. code-block:: bash
+
+ $ pip install -r requirements.txt
+
+.. _pip: https://pip.pypa.io/
+.. _virtualenv: https://virtualenv.pypa.io/
diff --git a/scripts/readme-gen/templates/install_portaudio.tmpl.rst b/scripts/readme-gen/templates/install_portaudio.tmpl.rst
new file mode 100644
index 0000000..5ea33d1
--- /dev/null
+++ b/scripts/readme-gen/templates/install_portaudio.tmpl.rst
@@ -0,0 +1,35 @@
+Install PortAudio
++++++++++++++++++
+
+Install `PortAudio`_. This is required by the `PyAudio`_ library to stream
+audio from your computer's microphone. PyAudio depends on PortAudio for cross-platform compatibility, and is installed differently depending on the
+platform.
+
+* For Mac OS X, you can use `Homebrew`_::
+
+ brew install portaudio
+
+ **Note**: if you encounter an error when running `pip install` that indicates
+ it can't find `portaudio.h`, try running `pip install` with the following
+ flags::
+
+ pip install --global-option='build_ext' \
+ --global-option='-I/usr/local/include' \
+ --global-option='-L/usr/local/lib' \
+ pyaudio
+
+* For Debian / Ubuntu Linux::
+
+ apt-get install portaudio19-dev python-all-dev
+
+* Windows may work without having to install PortAudio explicitly (it will get
+ installed with PyAudio).
+
+For more details, see the `PyAudio installation`_ page.
+
+
+.. _PyAudio: https://people.csail.mit.edu/hubert/pyaudio/
+.. _PortAudio: http://www.portaudio.com/
+.. _PyAudio installation:
+ https://people.csail.mit.edu/hubert/pyaudio/#downloads
+.. _Homebrew: http://brew.sh
diff --git a/synth.metadata b/synth.metadata
index 1663324..ec123ab 100644
--- a/synth.metadata
+++ b/synth.metadata
@@ -4,22 +4,22 @@
"git": {
"name": ".",
"remote": "https://github.com/googleapis/python-webrisk.git",
- "sha": "acf43c60e7e6ba17c4f91a8d985da3508775abf2"
+ "sha": "eca6fae845d2fb92b758df7baa44b3de291553a5"
}
},
{
"git": {
"name": "googleapis",
"remote": "https://github.com/googleapis/googleapis.git",
- "sha": "42ee97c1b93a0e3759bbba3013da309f670a90ab",
- "internalRef": "307114445"
+ "sha": "b882b8e6bfcd708042ff00f7adc67ce750817dd0",
+ "internalRef": "318028816"
}
},
{
"git": {
"name": "synthtool",
"remote": "https://github.com/googleapis/synthtool.git",
- "sha": "f5e4c17dc78a966dbf29961dd01f9bbd63e20a04"
+ "sha": "2a29860e484695a07aa8670f9e750bfeeb308a43"
}
}
],
diff --git a/synth.py b/synth.py
index eb9cfd1..2e51818 100644
--- a/synth.py
+++ b/synth.py
@@ -49,4 +49,7 @@
templated_files = common.py_library(cov_level=75)
s.move(templated_files)
+# TODO(busunkim): Use latest sphinx after microgenerator transition
+s.replace("noxfile.py", """['"]sphinx['"]""", '"sphinx<3.0.0"')
+
s.shell.run(["nox", "-s", "blacken"], hide_output=False)
diff --git a/testing/.gitignore b/testing/.gitignore
new file mode 100644
index 0000000..b05fbd6
--- /dev/null
+++ b/testing/.gitignore
@@ -0,0 +1,3 @@
+test-env.sh
+service-account.json
+client-secrets.json
\ No newline at end of file