Initial commit
This commit is contained in:
parent
bb91ab3643
commit
f5af62ece2
63
.gitignore
vendored
Normal file
63
.gitignore
vendored
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
favicon.*
|
||||||
|
\#*
|
||||||
|
*.log
|
||||||
|
*.out
|
||||||
|
*.version*
|
||||||
|
*~
|
||||||
|
robots.txt
|
||||||
|
|
||||||
|
#ignore local config
|
||||||
|
!/config/local-sample.config.php
|
||||||
|
/config/*.config.php
|
||||||
|
|
||||||
|
#ignore config files from eclipse, we don't want IDE files in our repository
|
||||||
|
.project
|
||||||
|
.buildpath
|
||||||
|
.externalToolBuilders
|
||||||
|
.settings
|
||||||
|
|
||||||
|
#ignore OSX .DS_Store files
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
#ignore NetBeans IDE's private files (at least)
|
||||||
|
/nbproject/private/
|
||||||
|
|
||||||
|
#Ignore config files from VSCode
|
||||||
|
/.vscode/
|
||||||
|
|
||||||
|
#ignore cache folders
|
||||||
|
nbproject
|
||||||
|
|
||||||
|
#ignore local folder
|
||||||
|
/local/
|
||||||
|
|
||||||
|
#ignore config files from Visual Studio
|
||||||
|
/.vs/
|
||||||
|
/php_friendica.phpproj
|
||||||
|
/php_friendica.sln
|
||||||
|
/php_friendica.phpproj.user
|
||||||
|
|
||||||
|
#ignore config files from JetBrains
|
||||||
|
/.idea
|
||||||
|
|
||||||
|
#ignore base .htaccess
|
||||||
|
/.htaccess
|
||||||
|
|
||||||
|
#Ignore log folder
|
||||||
|
/log
|
||||||
|
|
||||||
|
#Ignore temporary installed phpunit
|
||||||
|
/bin/phpunit
|
||||||
|
|
||||||
|
#Ignore cache files
|
||||||
|
.php_cs.cache
|
||||||
|
.php-cs-fixer.cache
|
||||||
|
|
||||||
|
#Ignore autotest results
|
||||||
|
autotest-results.xml
|
||||||
|
|
||||||
|
#ignore phpunit result cache
|
||||||
|
tests/.phpunit.result.cache
|
||||||
|
|
||||||
|
#ignore .php_cs (local copy)
|
||||||
|
.php_cs
|
25
README.md
25
README.md
|
@ -1,3 +1,24 @@
|
||||||
# bluesky-handles
|
Bluesky handle registration for Friendica
|
||||||
|
=========================================
|
||||||
|
|
||||||
With this tool you enable your Friendica users to use a subdomains of your Friendica hostname as their Bluesky handle.
|
This tool enables your Friendica users to rename their existing Bluesky handles to a subdomain of your Friendica system.
|
||||||
|
So for example user "nickname" on your server "myfriendica.tld" can then use "nickname.myfriendica.tld" as their Bluesky handle.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Webserver
|
||||||
|
|
||||||
|
You need an additional configuration for your webserver to serve wildcard requests.
|
||||||
|
Best way is to copy your Friendica configuration and to simply change the following parameters and the directory:
|
||||||
|
|
||||||
|
ServerName atproto.myfriendica.tld
|
||||||
|
ServerAlias *.myfriendica.tld
|
||||||
|
|
||||||
|
Please be aware, that no SSL certificate is needed, serving HTTP only is completely okay.
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
Please copy the sample file local-sample.config.php to local.config.php and set the database configuration parameters like in ypur Friendica configuration.
|
||||||
|
Also don't forget to enter your Friendica hostname, that's all.
|
||||||
|
You can check your installation by visiting the page "nickname.myfriendica.tld" (with an existing handle and your real Friendica hostname).
|
||||||
|
If everything is configured correctly, this subdomain will then redirect you to the profile page of this user.
|
107
index.php
Normal file
107
index.php
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
<?php
|
||||||
|
$config = include 'config/local.config.php';
|
||||||
|
if (empty($config['config']['hostname'])) {
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
$connection = connectDatabase($config);
|
||||||
|
if (empty($connection)) {
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!in_array($_REQUEST['pagename'], ['.well-known/atproto-did', ''])) {
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
$server = '.' . trim($config['config']['hostname'], '.');
|
||||||
|
|
||||||
|
if (!strpos($_SERVER['SERVER_NAME'], $server)) {
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
$nick = str_replace($server, '', $_SERVER['SERVER_NAME']);
|
||||||
|
|
||||||
|
$user = selectFirst($connection, "SELECT `uid` FROM `user` WHERE `nickname` = ?", [$nick]);
|
||||||
|
if (empty($user['uid'])) {
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_REQUEST['pagename'] == '') {
|
||||||
|
header('Location: http://' . $config['config']['hostname'] . '/profile/' . $nick);
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
$did = selectFirst($connection, "SELECT `v` FROM `pconfig` WHERE `uid` = ? AND `cat` = ? AND `k` = ?", [$user['uid'], 'bluesky', 'did']);
|
||||||
|
if (empty($did['v'])) {
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
header('Content-Type: text/plain');
|
||||||
|
echo $did['v'];
|
||||||
|
|
||||||
|
function notFound()
|
||||||
|
{
|
||||||
|
header('HTTP/1.0 404 Not Found');
|
||||||
|
|
||||||
|
echo '<h1>404 - Page Not Found</h1>';
|
||||||
|
echo 'The requested resource could not be found but may be available in the future.';
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
function connectDatabase(array $config): PDO
|
||||||
|
{
|
||||||
|
if (!empty($config['database']['socket'])) {
|
||||||
|
$connect = 'mysql:unix_socket=' . $config['database']['socket'];
|
||||||
|
} else {
|
||||||
|
$connect = 'mysql:host=' . $config['database']['hostname'];
|
||||||
|
if (!empty($config['database']['port'])) {
|
||||||
|
$connect .= ';port=' . $config['database']['port'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($config['database']['charset'])) {
|
||||||
|
$connect .= ';charset=' . $config['database']['charset'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$connect .= ';dbname=' . $config['database']['database'];
|
||||||
|
|
||||||
|
try {
|
||||||
|
$connection = @new PDO($connect, $config['database']['username'], $config['database']['password'], [PDO::ATTR_PERSISTENT => false]);
|
||||||
|
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
$connection = null;
|
||||||
|
}
|
||||||
|
return $connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectFirst(PDO $connection, $query, $parameters = []): ?array
|
||||||
|
{
|
||||||
|
if (!$stmt = $connection->prepare($query)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (array_keys($parameters) as $param) {
|
||||||
|
$data_type = PDO::PARAM_STR;
|
||||||
|
if (is_int($parameters[$param])) {
|
||||||
|
$data_type = PDO::PARAM_INT;
|
||||||
|
} elseif ($parameters[$param] !== null) {
|
||||||
|
$parameters[$param] = (string)$parameters[$param];
|
||||||
|
}
|
||||||
|
|
||||||
|
$stmt->bindParam($param + 1, $parameters[$param], $data_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$stmt->execute()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$columns = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
$stmt->closeCursor();
|
||||||
|
|
||||||
|
if (!is_array($columns)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $columns;
|
||||||
|
}
|
||||||
|
?>
|
Loading…
Reference in a new issue