summaryrefslogtreecommitdiff
path: root/lib/mysql.php
blob: f7ca3edc043fbfba0eb91ab7846634dc5e65e7a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php

# do not include twice
if (isset($mysql))
  return;

include_once BASE . "/lib/http.php";
include_once BASE . "/lib/mysql-joins.php";

$mysql = new mysqli("localhost", "webserver", "empty", "buildmaster");
if ( $mysql -> connect_error ) {
  die_500( "Connection failed: " . $mysql -> connect_error );
}

function print_important_trace_components($call) {
  return substr($call['file'], strlen(BASE)+1) . '(' . $call['line'] . ')';
}

function mysql_log_duration_and_trace($start) {
  $start = round((microtime(true) - $start) * 1000000);
  $trace = debug_backtrace();
  array_shift($trace);
  // silently fail if logfile is unavailable
/*  if (($fp = fopen(BASE . '/log', 'a')) !== false) {
    flock($fp, LOCK_EX);
    fwrite($fp,
      date('Y-m-d H:i:s') . " " .
      $start . " " .
      implode(' ', array_map('print_important_trace_components', $trace)) . " - " .
      $trace[0]['args'][0] . "\n"
    );
    flock($fp, LOCK_UN);
    fclose($fp);
  } */
}

function mysql_run_query($query) {
  global $mysql;
  $start = microtime(true);
  if ( ! $result = $mysql -> query($query) )
    die_500( "Query failed: " .  $mysql -> error );
  mysql_log_duration_and_trace($start);
  return $result;
}

function mysql_prepare_query($query) {
  global $mysql;
  $start = microtime(true);
  if ( ! $result = $mysql -> prepare($query) )
    die_500( "Prepare failed: " . $mysql -> error );
  mysql_log_duration_and_trace($start);
  return $result;
}

function show_warning_on_offline_slave() {
  if (gethostname() != 'buildmaster.archlinux32.org') {
    $result = mysql_run_query("SHOW STATUS LIKE \"Slave_running\"");
    if (($result -> num_rows == 0) ||
      ($result -> fetch_assoc() ["Value"] != "ON")) {
      print "<div><font color=\"ff0000\">The replication slave is currently not running. The database might be outdated.</font></div>\n";
    }
  }
}

function mysql_url_encode($input) {
  return
    "REPLACE(" . $input . ",\"+\",\"%2B\")";
}

function mysql_query_package_version($table) {
  return
    "CONCAT(" .
      "IF(" .
        "`" .$table . "`.`epoch`=\"0\"," .
        "\"\"," .
        "CONCAT(" .
          "`" . $table . "`.`epoch`," .
          "\":\"" .
        ")" .
      ")," .
      "`" . $table . "`.`pkgver`,\"-\"," .
      "`" . $table . "`.`pkgrel`," .
      "IF(`" . $table . "`.`sub_pkgrel_omitted`," .
        "\"\"," .
        "CONCAT(" .
          "\".\"," .
          "`" . $table . "`.`sub_pkgrel`" .
        ")" .
      ")" .
    ")";
}

function arch_filter_query($table) {
  $arch_filter="`" . $table . "`.`name` IN (\"\"";
  foreach (explode("&", $_SERVER["QUERY_STRING"]) as $param) {
    if (strpos($param, "arch=")!==0)
      continue;
    $arch_filter .= ",from_base64(\"" . base64_encode(substr($param,5)) . "\")";
  }
  $arch_filter .= ")";
  return $arch_filter;
}

function abort_iff_webspider() {
  $is_a_bot = in_array(
    $_SERVER['HTTP_USER_AGENT'],
    array(
      '',
      'Googlebot-Image/1.0',
      'Linguee Bot (http://www.linguee.com/bot; bot@linguee.com)',
      'Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)',
      'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)',
      'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
      "'Mozilla/5.0 (compatible; DuckDuckBot-Https/1.1; https://duckduckgo.com/duckduckbot)'",
      'Mozilla/5.0 (compatible; FemtosearchBot/1.0; http://femtosearch.com)',
      'Mozilla/5.0 (compatible; Qwantify/2.4w; +https://www.qwant.com/)/2.4w',
      'Mozilla/5.0 (compatible; SeznamBot/3.2; +http://napoveda.seznam.cz/en/seznambot-intro/)',
      'Mozilla/5.0 (Compatible; Supybot 2019.02.23)',
      'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
      'Mozilla/5.0 (compatible; Yeti/1.1; +http://naver.me/spd)',
      'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
      'ZoominfoBot (zoominfobot at zoominfo dot com)'
    )
  );
  if (($fp = fopen(BASE . '/user-agent-log', 'a')) !== false) {
    flock($fp, LOCK_EX);
    fwrite($fp,
      date('Y-m-d H:i:s') . " " . ($is_a_bot ? 'bot' : 'human') . " " .
      $_SERVER['HTTP_USER_AGENT'] . "\n"
    );
    flock($fp, LOCK_UN);
    fclose($fp);
  }
  if ($is_a_bot) {
    include_once BASE . "/lib/http.php";
    throw_http_error(403, 'Forbidden', 'Access forbidden for bots');
  }
}