XRootD
XrdOucUtils.cc File Reference
#include <cctype>
#include <grp.h>
#include <cstdio>
#include <list>
#include <vector>
#include <unordered_set>
#include <algorithm>
#include <charconv>
#include <regex.h>
#include <fcntl.h>
#include <math.h>
#include <pwd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <map>
#include <iomanip>
#include "XrdNet/XrdNetUtils.hh"
#include "XrdOuc/XrdOucCRC.hh"
#include "XrdOuc/XrdOucEnv.hh"
#include "XrdOuc/XrdOucSHA3.hh"
#include "XrdOuc/XrdOucStream.hh"
#include "XrdOuc/XrdOucString.hh"
#include "XrdOuc/XrdOucUtils.hh"
#include "XrdOuc/XrdOucPrivateUtils.hh"
#include "XrdSys/XrdSysE2T.hh"
#include "XrdSys/XrdSysError.hh"
#include "XrdSys/XrdSysPlatform.hh"
#include "XrdSys/XrdSysPthread.hh"
+ Include dependency graph for XrdOucUtils.cc:

Go to the source code of this file.

Macros

#define ENODATA   ENOATTR
 
#define SHFT(k)   if (n >= (1ULL << k)) { i += k; n >>= k; }
 
#define SHFT(k, m)   if (n >= m) { i += k; n /= m; }
 

Functions

static int from_hex (char c)
 
static bool is_rfc3986_unreserved (unsigned char c)
 
static bool is_token_character (int c)
 
std::string obfuscateAuth (const std::string &input)
 
void stripCgi (std::string &url, const std::unordered_set< std::string > &cgiKeys)
 
void stripCgi (XrdOucString &url, const std::unordered_set< std::string > &cgiKeys)
 

Macro Definition Documentation

◆ ENODATA

#define ENODATA   ENOATTR

Definition at line 68 of file XrdOucUtils.cc.

◆ SHFT [1/2]

#define SHFT (   k)    if (n >= (1ULL << k)) { i += k; n >>= k; }

◆ SHFT [2/2]

#define SHFT (   k,
 
)    if (n >= m) { i += k; n /= m; }

Function Documentation

◆ from_hex()

static int from_hex ( char  c)
static

Definition at line 1654 of file XrdOucUtils.cc.

1655 {
1656  if (c >= '0' && c <= '9') return c - '0';
1657  if (c >= 'A' && c <= 'F') return c - 'A' + 10;
1658  if (c >= 'a' && c <= 'f') return c - 'a' + 10;
1659  return -1;
1660 }

Referenced by XrdOucUtils::UrlDecode().

+ Here is the caller graph for this function:

◆ is_rfc3986_unreserved()

static bool is_rfc3986_unreserved ( unsigned char  c)
static

Definition at line 1623 of file XrdOucUtils.cc.

1624 {
1625  return std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~';
1626 }

Referenced by XrdOucUtils::UrlEncode().

+ Here is the caller graph for this function:

◆ is_token_character()

static bool is_token_character ( int  c)
static

Returns a boolean indicating whether 'c' is a valid token character or not. See https://datatracker.ietf.org/doc/html/rfc6750#section-2.1 for details.

Definition at line 1569 of file XrdOucUtils.cc.

1570 {
1571  if (isalnum(c))
1572  return true;
1573 
1574  static constexpr char token_chars[] = "-._~+/=:%";
1575 
1576  for (char ch : token_chars)
1577  if (c == ch)
1578  return true;
1579 
1580  return false;
1581 }

Referenced by obfuscateAuth(), and stripCgi().

+ Here is the caller graph for this function:

◆ obfuscateAuth()

std::string obfuscateAuth ( const std::string &  input)

This function obfuscates away authz= cgi elements and/or HTTP authorization headers from URL or other log line strings which might contain them.

Parameters
inputthe string to obfuscate
Returns
the string with token values obfuscated

Definition at line 1591 of file XrdOucUtils.cc.

1592 {
1593  static const regex_t auth_regex = []() {
1594  constexpr char re[] =
1595  "(access_token=|authz=|(transferheader)?(www-|proxy-)?auth(orization|enticate)[[:space:]]*:[[:space:]]*)"
1596  "(Bearer([[:space:]]|%20)?(token([[:space:]]|%20)?)?)?";
1597 
1598  regex_t regex;
1599 
1600  if (regcomp(&regex, re, REG_EXTENDED | REG_ICASE) != 0)
1601  throw std::runtime_error("Failed to compile regular expression");
1602 
1603  return regex;
1604  }();
1605 
1606  regmatch_t match;
1607  size_t offset = 0;
1608  std::string redacted;
1609  const char *const text = input.c_str();
1610 
1611  while (regexec(&auth_regex, text + offset, 1, &match, 0) == 0) {
1612  redacted.append(text + offset, match.rm_eo).append("REDACTED");
1613 
1614  offset += match.rm_eo;
1615 
1616  while (offset < input.size() && is_token_character(input[offset]))
1617  ++offset;
1618  }
1619 
1620  return redacted.append(text + offset);
1621 }
static bool is_token_character(int c)

References is_token_character().

Referenced by XrdPfc::Cache::Attach(), XrdPosixXrootd::Close(), XrdPosixFile::DelayedDestroy(), XrdPosixPrepIO::Disable(), XrdCl::URL::FromString(), XrdPssSys::FSctl(), XrdPssCks::Get(), XrdCl::URL::GetObfuscatedURL(), XrdCl::Utils::LogPropertyList(), main(), XrdPssSys::Mkdir(), XrdPssFile::Open(), XrdPssDir::Opendir(), XrdHttpProtocol::Process(), XrdHttpReq::ProcessHTTPReq(), XrdPssSys::Remdir(), XrdPssSys::Rename(), XrdCl::Message::SetDescription(), XrdPssSys::Stat(), XrdPssSys::Truncate(), and XrdPssSys::Unlink().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ stripCgi() [1/2]

void stripCgi ( std::string &  url,
const std::unordered_set< std::string > &  cgiKeys 
)

Strip selected CGI elements (e.g. "authz=...") from a string/URL.

Parameters
urlthe string/URL to sanitize
cgiKeysCGI parameter names to remove (without the trailing '=')

Definition at line 1698 of file XrdOucUtils.cc.

1699 {
1700  for (const auto &key : cgiKeys) {
1701  if (key.empty())
1702  continue;
1703 
1704  const std::string needle = key + "=";
1705  size_t spos = 0, epos = 0;
1706 
1707  while ((spos = url.find(needle, spos)) != std::string::npos) {
1708  epos = spos;
1709  while (epos < url.size() && is_token_character(url[epos]))
1710  ++epos;
1711  url.erase(spos, epos - spos);
1712  }
1713  }
1714 
1715  // If a stripped CGI was the first element, remove the extra &
1716  size_t spos = 0;
1717  if ((spos = url.find("?&")) != std::string::npos)
1718  url.erase(spos + 1, 1);
1719 
1720  // If stripping removed the only query parameter, remove the dangling ?
1721  if (!url.empty() && url.back() == '?')
1722  url.pop_back();
1723 }

References is_token_character().

Referenced by XrdHttpReq::Redir(), and stripCgi().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ stripCgi() [2/2]

void stripCgi ( XrdOucString url,
const std::unordered_set< std::string > &  cgiKeys 
)

Definition at line 1725 of file XrdOucUtils.cc.

1726 {
1727  std::string tmp = url.c_str();
1728  stripCgi(tmp, cgiKeys);
1729  url = tmp.c_str();
1730 }
void stripCgi(std::string &url, const std::unordered_set< std::string > &cgiKeys)
const char * c_str() const

References XrdOucString::c_str(), and stripCgi().

+ Here is the call graph for this function: