This commit is contained in:
damage committed 2026-10-20 20:18:57 +02:00
commit 1f81c383eb
2 files changed
+98

No files matched your search

+45
View File
@@ -0,0 +1,45 @@
<?php
class Config {
private const NEXTCLOUD_BASE_URL = "NCBGW_BASE_URL";
private const SECRET = "NCBGW_SECRET";
private const BASIC_AUTH_USERNAME = 'NCBGW_USERNAME';
private const BASIC_AUTH_PASSWORD = 'NCBGW_PASSWORD';
private $nextCloudBaseUrl;
private $secret;
private $username;
private $password;
function __construct($config) {
$this->nextCloudBaseUrl = $this->getRequired($config, Config::NEXTCLOUD_BASE_URL);
$this->secret = $this->getRequired($config, Config::SECRET);
$this->username = $this->getRequired($config, Config::BASIC_AUTH_USERNAME);
$this->password = $this->getRequired($config, Config::BASIC_AUTH_PASSWORD);
}
private function getRequired($config, $key) {
if (array_key_exists($key, $config)) {
return $config[$key];
} else {
throw new Exception("missing configuration " . $key);
}
}
public function getSecret() {
return $this->secret;
}
public function getUrl() {
return $this->nextCloudBaseUrl . '/ocs/v2.php/apps/spreed/api/v1';
}
public function getUsername() {
return $this->username;
}
public function getPassword() {
return $this->password;
}
}
+53
View File
@@ -0,0 +1,53 @@
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="NCBGW"');
header('HTTP/1.0 401 Unauthorized');
die('provide credentials');
}
require_once 'config.php';
$config = new Config($_ENV);
// check basic auth
if (!$config->getUsername() == $_SERVER['PHP_AUTH_USER']
|| !$config->getPassword() == $_SERVER['PHP_AUTH_PW']) {
die('invalid credentials');
}
if (!array_key_exists('action', $_GET)
|| !array_key_exists('token', $_GET)) {
die("required parameters not given");
}
//$message = file_get_contents('php://stdin');
$message = file_get_contents('php://input');
$token = $_GET['token'];
$url = $config->getUrl() . '/bot/' . $token . '/message';
$random = bin2hex(random_bytes(32));
$digest = hash_hmac('sha256', $random . $message, $config->getSecret());
$data = json_encode(
array(
'message' => $message
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => array(
'X-Nextcloud-Talk-Bot-Random: ' . $random,
'X-Nextcloud-Talk-Bot-Signature: ' . $digest,
'OCS-APIRequest: true',
'Content-Type: application/json'
),
'content' => $data
)
);
$context = stream_context_create($opts);
$result = file_get_contents($url, false, $context);
var_dump($result);