import from combined repo
This commit is contained in:
commit
115950044e
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
node_modules
|
17
Dockerfile
Normal file
17
Dockerfile
Normal file
@ -0,0 +1,17 @@
|
||||
FROM ubuntu:artful
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
# node stuff
|
||||
RUN apt-get install -y nodejs npm
|
||||
|
||||
COPY package.json /data/
|
||||
COPY src /data/src
|
||||
|
||||
RUN cd /data && npm i
|
||||
|
||||
WORKDIR /data
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
CMD ["node", "src/index.js"]
|
@ -0,0 +1,196 @@
|
||||
<?php
|
||||
/**
|
||||
* This program is a free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*
|
||||
* @file
|
||||
* @ingroup Auth
|
||||
*/
|
||||
|
||||
namespace MediaWiki\Auth;
|
||||
|
||||
use User;
|
||||
|
||||
/**
|
||||
* A primary authentication provider that authenticates the user against a remote Minetest site.
|
||||
*
|
||||
* @ingroup Auth
|
||||
* @since 1.27
|
||||
*/
|
||||
class MinetestPasswordPrimaryAuthenticationProvider extends AbstractPrimaryAuthenticationProvider {
|
||||
|
||||
/** @var string The URL of the Minetest site we authenticate against. */
|
||||
protected $minetestUrl;
|
||||
|
||||
/** @var array */
|
||||
/* protected $tokens = [];*/
|
||||
|
||||
/**
|
||||
* @param array $params Settings
|
||||
* - minetestUrl: The URL of the Minetest site we authenticate against.
|
||||
*/
|
||||
public function __construct( $params = [] ) {
|
||||
|
||||
if ( empty( $params['minetestUrl'] ) ) {
|
||||
throw new \InvalidArgumentException( 'The minetestUrl parameter missing in the auth configuration' );
|
||||
}
|
||||
|
||||
$this->minetestUrl = $params['minetestUrl'];
|
||||
}
|
||||
|
||||
public function beginPrimaryAuthentication( array $reqs ) {
|
||||
$req = AuthenticationRequest::getRequestByClass( $reqs, PasswordAuthenticationRequest::class );
|
||||
if ( !$req ) {
|
||||
return AuthenticationResponse::newAbstain();
|
||||
}
|
||||
|
||||
if ( $req->username === null || $req->password === null ) {
|
||||
return AuthenticationResponse::newAbstain();
|
||||
}
|
||||
|
||||
$username = User::getCanonicalName( $req->username, 'usable' );
|
||||
if ( $username === false ) {
|
||||
return AuthenticationResponse::newAbstain();
|
||||
}
|
||||
|
||||
$token = $this->getMinetestUserToken( $req->username, $req->password );
|
||||
|
||||
if ( $token === false ) {
|
||||
return AuthenticationResponse::newAbstain();
|
||||
|
||||
} else {
|
||||
return AuthenticationResponse::newPass( $username );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares a curl handler to use for querying the Minetest web services.
|
||||
*
|
||||
* @param string $url
|
||||
* @return resource
|
||||
*/
|
||||
protected function getMinetestCurlClient( $url ) {
|
||||
|
||||
$curl = curl_init( $url );
|
||||
|
||||
curl_setopt_array( $curl, [
|
||||
CURLOPT_USERAGENT => 'MWAuthMinetestBot/1.0',
|
||||
//CURLOPT_NOBODY => false,
|
||||
//CURLOPT_HEADER => true,
|
||||
CURLOPT_FOLLOWLOCATION => true,
|
||||
CURLOPT_MAXREDIRS => 10,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_SSL_VERIFYPEER => 1,
|
||||
CURLOPT_SSL_VERIFYHOST => 2,
|
||||
]);
|
||||
|
||||
return $curl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to authenticate the user against Minetest. Checks if user is authenticated.
|
||||
*
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
* @return bool False on error, true otherwise
|
||||
*/
|
||||
protected function getMinetestUserToken( $username, $password ) {
|
||||
|
||||
$curl = $this->getMinetestCurlClient( $this->minetestUrl.'/api/login' );
|
||||
|
||||
$params = json_encode( array(
|
||||
'username' => $username,
|
||||
'password' => $password,
|
||||
) );
|
||||
|
||||
|
||||
curl_setopt_array( $curl, [
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_POSTFIELDS => $params,
|
||||
CURLOPT_HTTPHEADER => array('Content-Type:application/json')
|
||||
]);
|
||||
|
||||
$ret = curl_exec( $curl );
|
||||
$info = curl_getinfo( $curl );
|
||||
$error = curl_error( $curl );
|
||||
curl_close( $curl );
|
||||
|
||||
if ( !empty( $error ) ) {
|
||||
$this->logger->error( 'AuthMinetest: cURL error: '.$error );
|
||||
return false;
|
||||
|
||||
} elseif ( $info['http_code'] != 200 ) {
|
||||
$this->logger->error( 'AuthMinetest: cURL error: unexpected HTTP response code '.$info['http_code'] );
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
$json = json_decode($ret);
|
||||
|
||||
|
||||
return $json->success;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null|\User $user
|
||||
* @param AuthenticationResponse $response
|
||||
*/
|
||||
public function postAuthentication( $user, AuthenticationResponse $response ) {
|
||||
if ( $response->status !== AuthenticationResponse::PASS ) {
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
public function testUserCanAuthenticate( $username ) {
|
||||
return $this->testUserExists( $username );
|
||||
}
|
||||
|
||||
public function testUserExists( $username, $flags = User::READ_NORMAL ) {
|
||||
// TODO - there is no easy way to do this without additional web services on the Minetest side.
|
||||
return false;
|
||||
}
|
||||
|
||||
public function providerAllowsPropertyChange( $property ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function providerAllowsAuthenticationDataChange( AuthenticationRequest $req, $checkData = true) {
|
||||
return \StatusValue::newGood( 'ignored' );
|
||||
}
|
||||
|
||||
public function providerChangeAuthenticationData( AuthenticationRequest $req ) {
|
||||
return;
|
||||
}
|
||||
|
||||
public function accountCreationType() {
|
||||
return self::TYPE_CREATE;
|
||||
}
|
||||
|
||||
public function beginPrimaryAccountCreation( $user, $creator, array $reqs ) {
|
||||
throw new \BadMethodCallException( 'This should not get called' );
|
||||
}
|
||||
|
||||
public function getAuthenticationRequests( $action, array $options ) {
|
||||
switch ( $action ) {
|
||||
case AuthManager::ACTION_LOGIN:
|
||||
return [ new PasswordAuthenticationRequest() ];
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
}
|
||||
}
|
17
mediawiki/AuthMinetest/extension.json
Normal file
17
mediawiki/AuthMinetest/extension.json
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "AuthMinetest",
|
||||
"version": "1.0.0",
|
||||
"author": [
|
||||
"Gabriel Pérez-Cerezo",
|
||||
"David Mudrák",
|
||||
"Thomas Rudin"
|
||||
],
|
||||
"url": "https://github.com/thomasrudin-mt/mt_auth_proxy",
|
||||
"description": "Extension for MediaWiki allowing to authenticate users against Minetest servers",
|
||||
"license-name": "GPL-3.0+",
|
||||
"type": "auth",
|
||||
"AutoloadClasses": {
|
||||
"MediaWiki\\Auth\\MinetestPasswordPrimaryAuthenticationProvider": "MinetestPasswordPrimaryAuthenticationProvider.php"
|
||||
},
|
||||
"manifest_version": 1
|
||||
}
|
27
mediawiki/AuthMinetest/readme.md
Normal file
27
mediawiki/AuthMinetest/readme.md
Normal file
@ -0,0 +1,27 @@
|
||||
|
||||
|
||||
# Source
|
||||
* https://git.bananach.space/AuthMinetest.git
|
||||
|
||||
|
||||
|
||||
```php
|
||||
$wgGroupPermissions['*']['edit'] = false;
|
||||
$wgGroupPermissions['*']['createaccount'] = false;
|
||||
$wgGroupPermissions['*']['autocreateaccount'] = true;
|
||||
|
||||
|
||||
wfLoadExtension( 'AuthMinetest' );
|
||||
|
||||
$wgAuthManagerAutoConfig['primaryauth'] = [
|
||||
MediaWiki\Auth\MinetestPasswordPrimaryAuthenticationProvider::class => [
|
||||
'class' => MediaWiki\Auth\MinetestPasswordPrimaryAuthenticationProvider::class,
|
||||
'args' => [
|
||||
[
|
||||
'minetestUrl' => 'http://your.minetest.url',
|
||||
]
|
||||
],
|
||||
'sort' => 0,
|
||||
],
|
||||
];
|
||||
```
|
379
package-lock.json
generated
Normal file
379
package-lock.json
generated
Normal file
@ -0,0 +1,379 @@
|
||||
{
|
||||
"name": "auth_proxy_app",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"accepts": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
|
||||
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
|
||||
"requires": {
|
||||
"mime-types": "2.1.23",
|
||||
"negotiator": "0.6.1"
|
||||
}
|
||||
},
|
||||
"array-flatten": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
||||
},
|
||||
"body-parser": {
|
||||
"version": "1.18.3",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
|
||||
"integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
|
||||
"requires": {
|
||||
"bytes": "3.0.0",
|
||||
"content-type": "1.0.4",
|
||||
"debug": "2.6.9",
|
||||
"depd": "1.1.2",
|
||||
"http-errors": "1.6.3",
|
||||
"iconv-lite": "0.4.23",
|
||||
"on-finished": "2.3.0",
|
||||
"qs": "6.5.2",
|
||||
"raw-body": "2.3.3",
|
||||
"type-is": "1.6.16"
|
||||
}
|
||||
},
|
||||
"bytes": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
|
||||
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
|
||||
},
|
||||
"content-disposition": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
||||
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
|
||||
},
|
||||
"content-type": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
|
||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
|
||||
},
|
||||
"cookie": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
|
||||
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
|
||||
},
|
||||
"cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
|
||||
},
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"depd": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
|
||||
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
|
||||
},
|
||||
"destroy": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
||||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
|
||||
},
|
||||
"ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||
},
|
||||
"encodeurl": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
|
||||
},
|
||||
"escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
|
||||
},
|
||||
"etag": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
||||
},
|
||||
"express": {
|
||||
"version": "4.16.4",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
|
||||
"integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
|
||||
"requires": {
|
||||
"accepts": "1.3.5",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.18.3",
|
||||
"content-disposition": "0.5.2",
|
||||
"content-type": "1.0.4",
|
||||
"cookie": "0.3.1",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "1.1.2",
|
||||
"encodeurl": "1.0.2",
|
||||
"escape-html": "1.0.3",
|
||||
"etag": "1.8.1",
|
||||
"finalhandler": "1.1.1",
|
||||
"fresh": "0.5.2",
|
||||
"merge-descriptors": "1.0.1",
|
||||
"methods": "1.1.2",
|
||||
"on-finished": "2.3.0",
|
||||
"parseurl": "1.3.3",
|
||||
"path-to-regexp": "0.1.7",
|
||||
"proxy-addr": "2.0.5",
|
||||
"qs": "6.5.2",
|
||||
"range-parser": "1.2.0",
|
||||
"safe-buffer": "5.1.2",
|
||||
"send": "0.16.2",
|
||||
"serve-static": "1.13.2",
|
||||
"setprototypeof": "1.1.0",
|
||||
"statuses": "1.4.0",
|
||||
"type-is": "1.6.16",
|
||||
"utils-merge": "1.0.1",
|
||||
"vary": "1.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"statuses": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
|
||||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"finalhandler": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
|
||||
"integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"encodeurl": "1.0.2",
|
||||
"escape-html": "1.0.3",
|
||||
"on-finished": "2.3.0",
|
||||
"parseurl": "1.3.3",
|
||||
"statuses": "1.4.0",
|
||||
"unpipe": "1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"statuses": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
|
||||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"forwarded": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
|
||||
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
|
||||
},
|
||||
"fresh": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
||||
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "1.6.3",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
|
||||
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
|
||||
"requires": {
|
||||
"depd": "1.1.2",
|
||||
"inherits": "2.0.3",
|
||||
"setprototypeof": "1.1.0",
|
||||
"statuses": "1.5.0"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.23",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
|
||||
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
|
||||
"requires": {
|
||||
"safer-buffer": "2.1.2"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
},
|
||||
"ipaddr.js": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
|
||||
"integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
|
||||
},
|
||||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
|
||||
},
|
||||
"merge-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
|
||||
},
|
||||
"methods": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
|
||||
},
|
||||
"mime": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
|
||||
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.39.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.39.0.tgz",
|
||||
"integrity": "sha512-DTsrw/iWVvwHH+9Otxccdyy0Tgiil6TWK/xhfARJZF/QFhwOgZgOIvA2/VIGpM8U7Q8z5nDmdDWC6tuVMJNibw=="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.23",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.23.tgz",
|
||||
"integrity": "sha512-ROk/m+gMVSrRxTkMlaQOvFmFmYDc7sZgrjjM76abqmd2Cc5fCV7jAMA5XUccEtJ3cYiYdgixUVI+fApc2LkXlw==",
|
||||
"requires": {
|
||||
"mime-db": "1.39.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
},
|
||||
"negotiator": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
|
||||
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
|
||||
},
|
||||
"on-finished": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
||||
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
|
||||
"requires": {
|
||||
"ee-first": "1.1.1"
|
||||
}
|
||||
},
|
||||
"parseurl": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
||||
},
|
||||
"path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
|
||||
"integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
|
||||
"requires": {
|
||||
"forwarded": "0.1.2",
|
||||
"ipaddr.js": "1.9.0"
|
||||
}
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
|
||||
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
|
||||
},
|
||||
"range-parser": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
|
||||
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
|
||||
"integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
|
||||
"requires": {
|
||||
"bytes": "3.0.0",
|
||||
"http-errors": "1.6.3",
|
||||
"iconv-lite": "0.4.23",
|
||||
"unpipe": "1.0.0"
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"send": {
|
||||
"version": "0.16.2",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
|
||||
"integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"depd": "1.1.2",
|
||||
"destroy": "1.0.4",
|
||||
"encodeurl": "1.0.2",
|
||||
"escape-html": "1.0.3",
|
||||
"etag": "1.8.1",
|
||||
"fresh": "0.5.2",
|
||||
"http-errors": "1.6.3",
|
||||
"mime": "1.4.1",
|
||||
"ms": "2.0.0",
|
||||
"on-finished": "2.3.0",
|
||||
"range-parser": "1.2.0",
|
||||
"statuses": "1.4.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"statuses": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
|
||||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"serve-static": {
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
|
||||
"integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
|
||||
"requires": {
|
||||
"encodeurl": "1.0.2",
|
||||
"escape-html": "1.0.3",
|
||||
"parseurl": "1.3.3",
|
||||
"send": "0.16.2"
|
||||
}
|
||||
},
|
||||
"setprototypeof": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
|
||||
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
|
||||
},
|
||||
"statuses": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
|
||||
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
|
||||
},
|
||||
"type-is": {
|
||||
"version": "1.6.16",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
|
||||
"integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
|
||||
"requires": {
|
||||
"media-typer": "0.3.0",
|
||||
"mime-types": "2.1.23"
|
||||
}
|
||||
},
|
||||
"unpipe": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
|
||||
},
|
||||
"utils-merge": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
|
||||
},
|
||||
"vary": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
|
||||
}
|
||||
}
|
||||
}
|
16
package.json
Normal file
16
package.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "auth_proxy_app",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"start": "node src/index.js"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"body-parser": "^1.18.3",
|
||||
"express": "^4.16.4"
|
||||
}
|
||||
}
|
46
readme.md
Normal file
46
readme.md
Normal file
@ -0,0 +1,46 @@
|
||||
|
||||
Authorization proxy app for minetest
|
||||
=================
|
||||
|
||||
|
||||
To be used with https://github.com/thomasrudin-mt/auth_proxy_mod
|
||||
|
||||
# Overview
|
||||
|
||||
Lets third-party apps query username and password of ingame players
|
||||
|
||||
# Implementations
|
||||
|
||||
## Mediawiki
|
||||
|
||||
Thanks to **gpcf** (linuxforks) for his partial Mediawiki implementation!
|
||||
See the folder: `mediawiki`
|
||||
|
||||
## cURL
|
||||
|
||||
```bash
|
||||
curl -X POST -H 'Content-Type: application/json' -i 'http://127.0.0.1:8080/api/login' --data '{"username":"test","password":"enter"}'
|
||||
```
|
||||
|
||||
Returns
|
||||
|
||||
On success:
|
||||
```json
|
||||
{"success": true, "message": null}
|
||||
```
|
||||
|
||||
On failure:
|
||||
```json
|
||||
{"success": false, "message": "Banned!"}
|
||||
```
|
||||
|
||||
Or just:
|
||||
```json
|
||||
{"success": false, "message": ""}
|
||||
```
|
||||
|
||||
# Building / Running
|
||||
|
||||
A `Dockerfile` is included for container usage.
|
||||
|
||||
Otherwise just `npm install && npm start`
|
53
src/api/channel.js
Normal file
53
src/api/channel.js
Normal file
@ -0,0 +1,53 @@
|
||||
|
||||
const app = require("../app");
|
||||
const events = require("../events");
|
||||
|
||||
const bodyParser = require('body-parser')
|
||||
const jsonParser = bodyParser.json()
|
||||
|
||||
const debug = false;
|
||||
|
||||
var tx_queue = [];
|
||||
|
||||
events.on("channel-send", function(data){
|
||||
tx_queue.push(data);
|
||||
});
|
||||
|
||||
// web -> mod
|
||||
app.get('/api/minetest/channel', function(req, res){
|
||||
function trySend(){
|
||||
if (tx_queue.length > 0){
|
||||
var obj = tx_queue.shift();
|
||||
if (debug)
|
||||
console.log("[tx]", obj);
|
||||
res.json(obj);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
const start = Date.now();
|
||||
|
||||
function loop(){
|
||||
if (trySend())
|
||||
return;
|
||||
|
||||
if ((Date.now() - start) < 10000){
|
||||
setTimeout(loop, 200);
|
||||
} else {
|
||||
res.json(null);
|
||||
}
|
||||
}
|
||||
|
||||
loop();
|
||||
});
|
||||
|
||||
// mod -> web
|
||||
app.post('/api/minetest/channel', jsonParser, function(req, res){
|
||||
if (debug)
|
||||
console.log("[rx]", req.body);
|
||||
|
||||
events.emit("channel-recv", req.body);
|
||||
|
||||
res.end();
|
||||
});
|
29
src/api/login.js
Normal file
29
src/api/login.js
Normal file
@ -0,0 +1,29 @@
|
||||
|
||||
const app = require("../app");
|
||||
|
||||
|
||||
const doLogin = require("../promise/login");
|
||||
|
||||
const bodyParser = require('body-parser')
|
||||
const jsonParser = bodyParser.json()
|
||||
|
||||
app.post('/api/login', jsonParser, function(req, res){
|
||||
|
||||
if (!req.body.username || !req.body.password){
|
||||
res.status(500).end()
|
||||
return;
|
||||
}
|
||||
|
||||
doLogin(req.body.username, req.body.password)
|
||||
.then(result => {
|
||||
res.json({
|
||||
success: result.success,
|
||||
message: result.message,
|
||||
});
|
||||
})
|
||||
.catch(e => {
|
||||
res.status(500).end();
|
||||
});
|
||||
|
||||
|
||||
});
|
7
src/app.js
Normal file
7
src/app.js
Normal file
@ -0,0 +1,7 @@
|
||||
const express = require('express')
|
||||
|
||||
const app = express()
|
||||
app.use(express.static('public'));
|
||||
app.disable('etag');
|
||||
|
||||
module.exports = app;
|
5
src/events.js
Normal file
5
src/events.js
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
const EventEmitter = require('events');
|
||||
|
||||
|
||||
module.exports = new EventEmitter();
|
6
src/index.js
Normal file
6
src/index.js
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
const app = require("./app");
|
||||
require("./api/channel");
|
||||
require("./api/login");
|
||||
|
||||
app.listen(8080, () => console.log('Listening on http://127.0.0.1:8080'))
|
29
src/promise/login.js
Normal file
29
src/promise/login.js
Normal file
@ -0,0 +1,29 @@
|
||||
|
||||
|
||||
const events = require("../events");
|
||||
|
||||
module.exports = (username, password) => new Promise(function(resolve, reject){
|
||||
|
||||
events.emit("channel-send", {
|
||||
type: "auth",
|
||||
data: {
|
||||
name: username,
|
||||
password: password
|
||||
}
|
||||
});
|
||||
|
||||
function handleEvent(result){
|
||||
if (result.type == "auth" && result.data && result.data.name == username){
|
||||
events.removeListener("channel-recv", handleEvent);
|
||||
clearTimeout(handle);
|
||||
resolve(result.data);
|
||||
}
|
||||
}
|
||||
|
||||
events.on("channel-recv", handleEvent);
|
||||
|
||||
var handle = setTimeout(function(){
|
||||
events.removeListener("channel-recv", handleEvent);
|
||||
reject("mod-comm timeout");
|
||||
}, 1000);
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user