Permissões de modelos personalizados do lado do servidor

Este documento descreve as permissões para modelos personalizados no servidor.


Todas as permissões são:

  • verificadas pelas APIs que as exigem;
  • detectadas automaticamente em JavaScript em sandbox, com base em quais APIs são usadas. Isso acontece porque as edições são feitas no editor de modelos personalizados (para um loop de feedback rápido) e quando o código é compilado (para validar se as permissões corretas foram aplicadas);
  • modificáveis no editor de modelos personalizados para tornar a permissão mais específica;
  • consultáveis em JavaScript no modo sandbox pela API queryPermission.

access_bigquery

Nome de exibição: acessa o BigQuery.

Descrição: permite acesso ao BigQuery no Google Cloud Platform.

Configuração: opção que permite que as combinações de projeto, conjunto de dados e tabela especificadas sejam usadas com o BigQuery. Defina o ID do projeto como GOOGLE_CLOUD_PROJECT para permitir o uso da variável de ambiente GOOGLE_CLOUD_PROJECT como ID quando projectId for excluído de BigQuery API parameter.

Solicitado por: BigQuery

Assinatura da consulta: queryPermission('access_bigquery', <operation>, <options>)

Observações: <operation> é uma string e pode ter os valores listados a seguir.

  • write

<options> é um objeto que contém os seguintes itens:

{
  'projectId': <project_id>,
  'datasetId': <dataset_id>,
  'tableId': <table_id>
}

Código de exemplo

const BigQuery = require('BigQuery');
const queryPermission = require('queryPermission');

const connectionInfo = {
  'projectId': 'gcp-cloud-project-id',
  'datasetId': 'destination-dataset',
  'tableId': 'destination-table',
};

if (queryPermission('access_bigquery', 'write', connectionInfo)) {
  const rows = [{
    'column1': 'String1',
    'column2': 1234,
  }];
  const options = {
    'ignoreUnknownValues': true,
    'skipInvalidRows': false,
  };

  BigQuery.insert(connectionInfo, rows, options)
      .then(data.gtmOnSuccess, data.gtmOnFailure);
}

access_firestore

Nome de exibição: acessa o Google Firestore.

Descrição: permite acesso ao Google Firestore.

Configuração: opção que permite que as combinações de projeto e caminho (sintaxe de caractere curinga compatível) especificadas sejam usadas com o Firestore. Defina o ID do projeto como GOOGLE_CLOUD_PROJECT para permitir o uso da variável de ambiente GOOGLE_CLOUD_PROJECT como ID quando projectId for excluído de Firestore API parameter.

Solicitado por: Firestore

Assinatura da consulta: queryPermission('access_firestore', <operation>, <options>)

Observações: <operation> é uma string e pode ter os valores listados a seguir.

  • read: dá acesso para ler e consultar APIs
  • write: dá acesso para gravar nas APIs
  • read_write: dá acesso para ler, gravar e consultar as APIs

<options> é um objeto que contém os seguintes itens:

{
  'projectId': <project_id>,
  'path': <path>
}

Código de exemplo

const Firestore = require('Firestore');
const queryPermission = require('queryPermission');

const options = {
  'projectId': 'gcp-cloud-project-id',
  'path': 'collection/document',
};

if (queryPermission('access_firestore', 'read', options)) {
  Firestore.read('collection/document', {
    projectId: 'gcp-cloud-project-id',
  }).then(data.gtmOnSuccess, data.gtmOnFailure);
}

access_response

Nome de exibição: acessa a resposta.

Descrição: acessa o corpo, os cabeçalhos ou o status da resposta.

Configuração: opção que permite acessos gerais ou específicos, com subopções para controlar o acesso a vários subcomponentes.

Solicitado por: setPixelResponse, setResponseBody, setResponseHeader e setResponseStatus

Assinatura da consulta: queryPermission('access_response', 'write', <component>[, <optional component name>])

Observações: controla se o componente de saída da resposta HTTP pode ser acessado.

Código de exemplo

const queryPermission = require('queryPermission');
const setResponseBody = require('setResponseBody');
const setResponseHeader = require('setResponseHeader');
const setResponseStatus = require('setResponseStatus');
if (queryPermission('access_response', 'write', 'header', 'Content-Type')) {
  setResponseHeader('Content-Type', 'text/plain');
}
if (queryPermission('access_response', 'write', 'body')) {
  setResponseBody('Not Found');
}
if (queryPermission('access_response', 'write', 'status')) {
  setResponseStatus(404);
}

access_template_storage

Nome de exibição: acessa o armazenamento de modelos.

Descrição: permite acesso ao armazenamento temporário para modelos que duram por todo o ciclo de vida do processo do lado do servidor.

Configuração: nenhuma

Solicitado por: templateDataStorage.

Assinatura da consulta: queryPermission('access_template_storage').

Código de exemplo

const queryPermission = require('queryPermission');
const templateDataStorage = require('templateDataStorage');
const key = 'my_key';
if (queryPermission('access_template_storage')) {
  const value = templateDataStorage.getItemCopy(key);
}

get_cookies

Nome de exibição: Reads cookie value(s)

Descrição: lê os valores dos cookies com os nomes especificados.

Configuração: lista de nomes dos cookies permitidos para leitura.

Solicitado por: getCookieValues.

Assinatura da consulta: queryPermission('get_cookies', <name>).

Observações: determina se um cookie pode ser lido, dependendo do nome.

Código de exemplo

const queryPermission = require('queryPermission');
const getCookieValues = require('getCookieValues');
const cookieName = 'info';
let cookieValues;
if (queryPermission('get_cookies', cookieName)) {
  cookieValues = getCookieValues(cookieName);
}

logging

Nome de exibição: registra no console.

Descrição: registra mensagens no console do desenvolvedor e no modo de visualização do Gerenciador de tags.

Configuração: opção para ativar registros em produção. O padrão é ativar os registros apenas na depuração/visualização. Quando a permissão é negada, logToConsole não gera um erro, mas suprime a mensagem de registro.

Solicitado por: logToConsole.

Assinatura da consulta: queryPermission('logging').

Observações: define se um modelo personalizado pode fazer registros no console do desenvolvedor.

Código de exemplo

const queryPermission = require('queryPermission');
const logToConsole = require('logToConsole');
// Note that it's fine to call log, since the log call will be ignored if
// logging isn't permitted in the current environment.
logToConsole('diagnostic info');

use_message

Nome de exibição: usa mensagens.

Descrição: envia ou recebe mensagens usando as APIs addMessageListener ou sendMessage.

Configuração: opção para especificar o tipo de mensagem e se o modelo pode ouvir, enviar ou ambos.

Solicitado por: addMessageListener, sendMessage

Assinatura da consulta: queryPermission('use_message', <usage>, <message type>).

Observações: o uso pode ser listen, send ou listen_and_send.

Código de exemplo

const queryPermission = require('queryPermission');
const sendMessage = require('sendMessage');
if (queryPermission('use_message', 'send', 'set_cookie')) {
  sendMessage('set_cookie', {name: 'foo', value: 'bar'});
}

read_container_data

Nome de exibição: lê dados do contêiner.

Descrição: lê dados sobre o contêiner.

Configuração: nenhuma.

Solicitado por: getClientName, getContainerVersion.

Assinatura da consulta: queryPermission('read_container_data').

Observações: controla se um modelo personalizado pode ler dados do contêiner.

Código de exemplo

const getContainerVersion = require('getContainerVersion');
const queryPermission = require('queryPermission');
if (queryPermission('read_container_data')) {
  return getContainerVersion();
}

read_event_data

Nome de exibição: lê dados do evento.

Descrição: lê dados que vieram do evento.

Configuração: opção que permite acesso geral ou acesso controlado específico por uma lista de caminhos de chave permitidos (sintaxe de caractere curinga compatível).

Solicitado por: getAllEventData, getEventData

Assinatura da consulta: queryPermission('read_event_data'[, <optional key>])

Observações: controla se um modelo personalizado pode ler dados de eventos em um determinado caminho de chave (ou todos os dados do evento, se nenhum caminho desses for informado).

Código de exemplo

const getAllEventData = require('getAllEventData');
const queryPermission = require('queryPermission');
if (queryPermission('read_event_data')) {
  return getAllEventData();
}
const getEventData = require('getEventData');
const queryPermission = require('queryPermission');
const keyPath = 'parentField.childField';
if (queryPermission('read_event_data', keyPath)) {
  return getEventData(keyPath);
}

read_event_metadata

Nome de exibição: lê metadados de evento.

Descrição: lê metadados de evento em callbacks de evento.

Configuração: nenhuma

Solicitado por: addEventCallback.

Assinatura da consulta: queryPermission('read_event_metadata').

Observações: controla se um modelo personalizado pode ler metadados de evento em callbacks.

Código de exemplo

const queryPermission = require('queryPermission');
const addEventCallback = require('addEventCallback');
if (queryPermission('read_event_metadata')) {
  addEventCallback((containerId, eventMetadata) => {
    // Read event metadata.
  });
}

read_request

Nome de exibição: lê a solicitação HTTP.

Descrição: lê cabeçalhos da solicitação, parâmetros de consulta, corpo, caminho ou endereço IP remoto.

Configuração: opção que permite acessos gerais ou específicos, com subopções para controlar o acesso a vários subcomponentes.

Solicitado por: extractEventsFromMpv1, extractEventsFromMpv2, getRemoteAddress, getRequestBody, getRequestHeader, getRequestPath, getRequestQueryParameter, getRequestQueryParameters, getRequestQueryString

Assinatura da consulta: queryPermission('read_request', <component>[, <optional component name>])

Observações: determina se o componente de entrada da resposta HTTP pode ser acessado.

Código de exemplo

const queryPermission = require('queryPermission');
const getRequestBody = require('getRequestBody');
const getRequestHeader = require('getRequestHeader');
let body, contentType;
if (queryPermission('read_request', 'body')) {
  body = getRequestBody();
}
if (queryPermission('read_request', 'header', 'content-type')) {
  contentType = getRequestHeader('content-type');
}
if (body && contentType == 'application/json') { ... }

return_response

Nome de exibição: retorna a resposta.

Descrição: retorna a resposta ao autor da chamada.

Configuração: nenhuma

Solicitado por: returnResponse.

Assinatura da consulta: queryPermission('return_response')

Observações: essa permissão não tem campos para servir de critério e normalmente não é consultada.

run_container

Nome de exibição: executa o contêiner.

Descrição: executa o contêiner com um evento.

Configuração: nenhuma

Solicitado por: runContainer.

Assinatura da consulta: queryPermission('run_container')

Observações: essa permissão não tem campos para servir de critério e normalmente não é consultada.

send_http

Nome de exibição: envia solicitações HTTP.

Descrição: envia uma solicitação HTTP para um URL especificado.

Solicitado por: getGoogleScript, sendEventToGoogleAnalytics, sendHttpGet e sendHttpRequest

Assinatura da consulta: queryPermission('send_http', <url>)

Observações: determina se uma solicitação HTTP pode ser feita, dependendo do URL. Para garantir uma conexão segura, apenas URLs (HTTPS) seguros são permitidos.

Código de exemplo

const queryPermission = require('queryPermission');
const sendHttpGet = require('sendHttpGet');
const url = 'https://example.com/search?query=foo&results=10';
if (queryPermission('send_http', url)) {
  sendHttpGet(url);
}

send_pixel_from_browser

Nome de exibição: envia pixels dos navegadores

Descrição: envia uma solicitação GET a um URL especificado do navegador.

Solicitado por: sendPixelFromBrowser.

Assinatura da consulta: queryPermission('send_pixel_from_browser', <url>).

Observações: controla se uma solicitação pode ser enviada do navegador, dependendo do URL.

Código de exemplo

const queryPermission = require('queryPermission');
const sendPixelFromBrowser = require('sendPixelFromBrowser');
const url = 'https://example.com/search?query=foo&results=10';
if (queryPermission('send_pixel_from_browser', url)) {
  sendPixelFromBrowser(url);
}

set_cookies

Nome de exibição: Sets a cookie

Descrição: define um cookie com o nome e os parâmetros especificados.

Configuração: tabela com os nomes dos cookies permitidos, cada um com restrições opcionais de nome, domínio, caminho, atributo secure e validade.

Solicitado por: setCookie.

Assinatura da consulta: queryPermission('set_cookies', <name>, <options>)

Observações: determina se algum cabeçalho "Set-Cookie" pode ser adicionado à resposta, dependendo do nome, do domínio, do caminho e do atributo secure e da validade do cookie.

Código de exemplo

const queryPermission = require('queryPermission');
const setCookie = require('setCookie');
const options = {
  'domain': 'www.example.com',
  'path': '/',
  'max-age': 60*60*24*365,
  'secure': true
};
if (queryPermission('set_cookies', 'info', options)) {
  setCookie('info', 'xyz', options);
}