HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: //snap/google-cloud-cli/396/lib/googlecloudsdk/api_lib/compute/sg_tunnel_utils.py
# Copyright 2023 Google LLC. All Rights Reserved.
# -*- coding: utf-8 -*- #
#
# 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.

"""Utility functions for WebSocket tunnelling with Cloud IAP."""

from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals

import collections
from urllib import parse

from googlecloudsdk.core import exceptions
from googlecloudsdk.core.util import http_proxy_types
import socks

SECURITY_GATEWAY_PROXY_HOST = 'ingress.cloudproxy.app'
SECURITY_GATEWAY_PROXY_PORT = 443

SecurityGatewayTargetInfo = collections.namedtuple(
    'SecurityGatewayTarget',
    ['project', 'region', 'security_gateway', 'host', 'port', 'url_override',
     'proxy_info', 'use_dest_group'])


class MissingSecurityGatewayParameter(exceptions.Error):
  pass


class UnsupportedProxyType(exceptions.Error):
  pass


class PythonVersionUnsupported(exceptions.Error):
  pass


class PythonVersionMissingSNI(exceptions.Error):
  pass


def GenerateSecurityGatewayResourcePath(project, location, sg_id):
  return (
      'projects/{}/locations/{}/securityGateways/{}'.format(
          project, location, sg_id
      )
  )


def GenerateDestGroupResourcePath(project, location, dg_id):
  return (
      'projects/{}/iap_tunnel/locations/{}/destGroups/{}'.format(
          project, location, dg_id
      )
  )


def ValidateParameters(target_info):
  """Validate the necessary Security Gateway parameters are present."""

  missing_parameters = []
  for field_name, field_value in target_info._asdict().items():
    if not field_value and field_name in (
        'project',
        'host',
        'port',
        'region',
        'security_gateway',
    ):
      missing_parameters.append(field_name)

    if missing_parameters:
      str_parameters = ','.join(missing_parameters)
      raise MissingSecurityGatewayParameter(
          'Missing required arguments: ' + str_parameters
      )

  if target_info.proxy_info:
    proxy_type = target_info.proxy_info.proxy_type
    if proxy_type and proxy_type != socks.PROXY_TYPE_HTTP:
      raise UnsupportedProxyType(
          'Unsupported proxy type: '
          + http_proxy_types.REVERSE_PROXY_TYPE_MAP[proxy_type]
      )


def GetProxyHostPort(url):
  proxy_host = SECURITY_GATEWAY_PROXY_HOST
  proxy_port = SECURITY_GATEWAY_PROXY_PORT
  if url:
    info = parse.urlparse(url)
    proxy_host = info.hostname
    proxy_port = info.port
    if not proxy_host or not proxy_port:
      raise ValueError('{} is an invalid url'.format(url))
  return (proxy_host, proxy_port)