namespace Friendica\Module;
use Friendica\BaseModule;
-use Friendica\Database\DBM;
-use Friendica\Network\Probe;
-use Friendica\Util\HTTPSig;
+use Friendica\Database\DBA;
+use Friendica\Model\Contact;
+use Friendica\Util\HTTPSignature;
use Friendica\Util\Network;
-use dba;
-
+/**
+ * Magic Auth (remote authentication) module.
+ *
+ * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/Zotlabs/Module/Magic.php
+ */
class Magic extends BaseModule
{
public static function init()
$test = ((x($_REQUEST, 'test')) ? intval($_REQUEST['test']) : 0);
$owa = ((x($_REQUEST, 'owa')) ? intval($_REQUEST['owa']) : 0);
- // NOTE: I guess $dest isn't just the profile url (could be also
+ // NOTE: I guess $dest isn't just the profile url (could be also
// other profile pages e.g. photo). We need to find a solution
// to be able to redirct to other pages than the contact profile.
- $fields = ["id", "nurl", "url"];
- $condition = ["nurl" => normalise_link($dest)];
+ $cid = Contact::getIdForURL($dest);
- $contact = dba::selectFirst("contact", $fields, $condition);
-
- if (!DBM::is_result($contact)) {
- // If we don't have a contact record, try to probe it.
- /// @todo: Also check against the $addr.
- Probe::uri($dest, '', -1, true, true);
- $contact = dba::selectFirst("contact", $fields, $condition);
+ if (!$cid && !empty($addr)) {
+ $cid = Contact::getIdForURL($addr);
}
- if (!DBM::is_result($contact)) {
- logger("No contact record found: " . print_r($_REQUEST, true), LOGGER_DEBUG);
+ if (!$cid) {
+ logger('No contact record found: ' . print_r($_REQUEST, true), LOGGER_DEBUG);
goaway($dest);
}
+ $contact = DBA::selectFirst('contact', ['id', 'nurl', 'url'], ['id' => $cid]);
+
// Redirect if the contact is already authenticated on this site.
- if (array_key_exists("id", $a->contact) && strpos($contact['nurl'], normalise_link(self::getApp()->get_baseurl())) !== false) {
- if($test) {
+ if (!empty($a->contact) && array_key_exists('id', $a->contact) && strpos($contact['nurl'], normalise_link(self::getApp()->get_baseurl())) !== false) {
+ if ($test) {
$ret['success'] = true;
$ret['message'] .= 'Local site - you are already authenticated.' . EOL;
return $ret;
}
- logger("Contact is already authenticated", LOGGER_DEBUG);
+ logger('Contact is already authenticated', LOGGER_DEBUG);
goaway($dest);
}
// NOTE: we need another solution because this does only work
// for friendica contacts :-/ . We should have the basepath
// of a contact also in the contact table.
- $exp = explode("/profile/", $contact['url']);
+ $exp = explode('/profile/', $contact['url']);
$basepath = $exp[0];
$headers = [];
$headers['X-Open-Web-Auth'] = random_string();
// Create a header that is signed with the local users private key.
- $headers = HTTPSig::createSig(
- '',
- $headers,
- $user['prvkey'],
- 'acct:' . $user['nickname'] . '@' . $a->get_hostname() . ($a->path ? '/' . $a->path : ''),
- false,
- true,
- 'sha512'
+ $headers = HTTPSignature::createSig(
+ '',
+ $headers,
+ $user['prvkey'],
+ 'acct:' . $user['nickname'] . '@' . $a->get_hostname() . ($a->urlpath ? '/' . $a->urlpath : ''),
+ false,
+ true,
+ 'sha512'
);
// Try to get an authentication token from the other instance.
}
}
- if($test) {
+ if ($test) {
$ret['message'] = 'Not authenticated or invalid arguments' . EOL;
return $ret;
}