Initial version with functionality to log into the component using frontend
This commit is contained in:
commit
773eb1092d
6
.buildpath
Normal file
6
.buildpath
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<buildpath>
|
||||
<buildpathentry kind="src" path="src"/>
|
||||
<buildpathentry external="true" kind="lib" path="/srv/slt-dev"/>
|
||||
<buildpathentry kind="con" path="org.eclipse.php.core.LANGUAGE"/>
|
||||
</buildpath>
|
28
.project
Normal file
28
.project
Normal file
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>com_clubs</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.wst.common.project.facet.core.builder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.wst.validation.validationbuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.dltk.core.scriptbuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.php.core.PHPNature</nature>
|
||||
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
2
.settings/org.eclipse.php.core.prefs
Normal file
2
.settings/org.eclipse.php.core.prefs
Normal file
@ -0,0 +1,2 @@
|
||||
eclipse.preferences.version=1
|
||||
include_path=1;/srv/slt-dev
|
7
.settings/org.eclipse.wst.common.project.facet.core.xml
Normal file
7
.settings/org.eclipse.wst.common.project.facet.core.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<faceted-project>
|
||||
<fixed facet="php.component"/>
|
||||
<fixed facet="php.core.component"/>
|
||||
<installed facet="php.core.component" version="1"/>
|
||||
<installed facet="php.component" version="7.3"/>
|
||||
</faceted-project>
|
4
src/.directory
Normal file
4
src/.directory
Normal file
@ -0,0 +1,4 @@
|
||||
[Dolphin]
|
||||
Timestamp=2019,3,30,10,20,7
|
||||
Version=4
|
||||
ViewMode=1
|
5
src/admin/clubs.php
Normal file
5
src/admin/clubs.php
Normal file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
1
src/admin/clubs.xml
Symbolic link
1
src/admin/clubs.xml
Symbolic link
@ -0,0 +1 @@
|
||||
../clubs.xml
|
11
src/admin/controller.php
Normal file
11
src/admin/controller.php
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\MVC\Controller\BaseController;
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
class ClubsController extends BaseController
|
||||
{
|
||||
|
||||
}
|
80
src/clubs.xml
Normal file
80
src/clubs.xml
Normal file
@ -0,0 +1,80 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<extension
|
||||
version="3.0"
|
||||
method="upgrade"
|
||||
type="component">
|
||||
|
||||
<!-- SOLLTE, Der Annzeige-Name in Joomla -->
|
||||
<name>Vereinsmanagement</name>
|
||||
<title>Vereinsportal des saarländischen Tanzsportverbands</title>
|
||||
|
||||
<!--SOLLTE Erstellungsdatum -->
|
||||
<creationDate>30.03.2019</creationDate>
|
||||
|
||||
<!-- SOLLTE, Wer ist der Urheber -->
|
||||
<author>Christian Wolf</author>
|
||||
<!-- SOLLTE, für ausgelieferte Templates immer eine Kontakt-E-Mail-Adressse -->
|
||||
<authorEmail>homepage@slt.wolf-stuttgart.net</authorEmail>
|
||||
<!-- SOLLTE, klar, die Webseite gehört dazu -->
|
||||
<!--<authorUrl>http://www.joomla-templates.de</authorUrl>-->
|
||||
|
||||
<!-- SOLLTE, die eigene Versionsnummer des Templates -->
|
||||
<version>0.0.1</version>
|
||||
|
||||
<!-- SOLLTE, Die Template-Beschreibung wird hier als Joomla language mit einem Platzhalter versehen. In diesem Template-Ordner befindet sich die Sprachdatei in der TPL_TEST_TEMPLATE_XML_DESCRIPTION hinterlegt ist -->
|
||||
<!--<description>TPL_TEST_TEMPLATE_XML_DESCRIPTION</description>-->
|
||||
|
||||
<!-- MUSS, der Files-Tag bezeichnet den Block mit den Dateien und Ordnern die mit installiert werden -->
|
||||
<files from='site'>
|
||||
<filename>clubs.php</filename>
|
||||
<filename>controller.php</filename>
|
||||
<folder>controller</folder>
|
||||
<folder>helpers</folder>
|
||||
<folder>models</folder>
|
||||
<folder>views</folder>
|
||||
</files>
|
||||
|
||||
<!--Sollte, Sollten unterschiedliche Sprachen genutzt werden, ist hier der richtige Platz um diese zu installieren-->
|
||||
<!--<languages folder="language">
|
||||
<language tag="de-DE">de-DE/de-DE.tpl_test_template.sys.ini</language>
|
||||
<language tag="de-DE">de-DE/de-DE.tpl_test_template.ini</language>
|
||||
<language tag="de-DE">en-GB/en-GB.tpl_test_template.sys.ini</language>
|
||||
<language tag="de-DE">en-GB/en-GB.tpl_test_template.ini</language>
|
||||
</languages>-->
|
||||
|
||||
<administration>
|
||||
<menu>Vereinsmanagement</menu>
|
||||
<submenu>
|
||||
<!-- <menu link='link' view='v'>Test</menu> -->
|
||||
</submenu>
|
||||
<files from='admin'>
|
||||
<filename>clubs.php</filename>
|
||||
<filename>controller.php</filename>
|
||||
<folder>sql</folder>
|
||||
</files>
|
||||
</administration>
|
||||
|
||||
<install>
|
||||
<sql>
|
||||
<file driver='mysql'>sql/mysql/install.sql</file>
|
||||
</sql>
|
||||
</install>
|
||||
<uninstall>
|
||||
<sql>
|
||||
<file driver='mysql'>sql/mysql/uninstall.sql</file>
|
||||
</sql>
|
||||
</uninstall>
|
||||
<update>
|
||||
<schemas>
|
||||
<schemapath type='mysql'>sql/updates/mysql</schemapath>
|
||||
</schemas>
|
||||
</update>
|
||||
|
||||
<!-- <scriptfile></scriptfile> -->
|
||||
|
||||
<!-- Parameter Block ende -->
|
||||
<updateservers>
|
||||
<server type="extension" name="SLT Update Site of Christian Wolf" priority="1">http://slt.wolf-stuttgart.net/update/clubs/slt-update.xml</server>
|
||||
</updateservers>
|
||||
|
||||
</extension>
|
15
src/site/clubs.php
Normal file
15
src/site/clubs.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\MVC\Controller\BaseController;
|
||||
use Joomla\CMS\Factory;
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
$controller = BaseController::getInstance("Clubs");
|
||||
$input = Factory::getApplication()->input;
|
||||
|
||||
$task = $input->getCmd("task", "display");
|
||||
|
||||
$controller->execute($task);
|
||||
$controller->redirect();
|
20
src/site/controller.php
Normal file
20
src/site/controller.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\MVC\Controller\BaseController;
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
class ClubsController extends BaseController
|
||||
{
|
||||
|
||||
public function display($cachable = false, $params = array())
|
||||
{
|
||||
parent::display($cachable, $params);
|
||||
}
|
||||
|
||||
public function foo()
|
||||
{
|
||||
echo "dsfh";
|
||||
}
|
||||
}
|
43
src/site/controllers/login.php
Normal file
43
src/site/controllers/login.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\MVC\Controller\BaseController;
|
||||
use Joomla\CMS\Factory;
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
JLoader::register("ClubsHelperAuth", JPATH_ROOT . "/components/com_clubs/helpers/auth.php");
|
||||
|
||||
class ClubsControllerLogin extends BaseController
|
||||
{
|
||||
public function login()
|
||||
{
|
||||
$helper = new ClubsHelperAuth();
|
||||
$helper->logoffCookie();
|
||||
|
||||
$input = Factory::getApplication()->input;
|
||||
$user = $input->get('user');
|
||||
$pwd = $input->get('password');
|
||||
$success = $helper->checkUser($user, $pwd);
|
||||
|
||||
if($success)
|
||||
{
|
||||
// Login succeeded
|
||||
$keep = (bool) $input->get('keep', false);
|
||||
$helper->loginCookie($user, $keep);
|
||||
|
||||
$this->setRedirect("?option=com_clubs");
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->setRedirect("?option=com_clubs&view=login&state=failed");
|
||||
}
|
||||
}
|
||||
|
||||
public function logout()
|
||||
{
|
||||
$helper = new ClubsHelperAuth();
|
||||
$helper->logoffCookie();
|
||||
$this->setRedirect("?option=com_clubs&view=login");
|
||||
}
|
||||
}
|
109
src/site/helpers/auth.php
Normal file
109
src/site/helpers/auth.php
Normal file
@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
|
||||
use Joomla\CMS\Factory;
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
class ClubsHelperAuth
|
||||
{
|
||||
|
||||
public function checkUser($user, $pwd)
|
||||
{
|
||||
$userModel = BaseDatabaseModel::getInstance("user", "ClubsModel");
|
||||
$savedHash = $userModel->getPassword($user);
|
||||
|
||||
return password_verify($pwd, $savedHash);
|
||||
}
|
||||
|
||||
public function logoffCookie()
|
||||
{
|
||||
Factory::getApplication()->input->cookie->set("clubsLogin", "");
|
||||
}
|
||||
|
||||
public function loginCookie($user, $keep)
|
||||
{
|
||||
$authCookie = array();
|
||||
$authCookie['user'] = $user;
|
||||
$authCookie['start'] = time();
|
||||
|
||||
$value = array();
|
||||
$value['auth'] = $authCookie;
|
||||
|
||||
$keys = $this->getKeys();
|
||||
$pkey = openssl_pkey_get_private($keys['priv']);
|
||||
$signature = '';
|
||||
openssl_sign(json_encode($authCookie), $signature, $pkey) or die("Problem signing request.");
|
||||
$value['sign'] = convert_uuencode($signature);
|
||||
|
||||
$jsonValue = json_encode($value);
|
||||
$uue = convert_uuencode($jsonValue);
|
||||
|
||||
$c = Factory::getApplication()->input->cookie;
|
||||
if(! $keep)
|
||||
{
|
||||
$time = 0;
|
||||
$c->set('clubsLoginKeepLoggedIn', '', 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
$time = time() + 3600*24*15;
|
||||
$c->set('clubsLoginKeepLoggedIn', 'true', time() + 3600*24*356*10);
|
||||
}
|
||||
$c->set('clubsLogin', $uue, $time);
|
||||
}
|
||||
|
||||
public function checkCookie()
|
||||
{
|
||||
$cookie = Factory::getApplication()->input->cookie;
|
||||
$uue = $cookie->get('clubsLogin', '', 'raw');
|
||||
|
||||
if($uue === '')
|
||||
return false;
|
||||
|
||||
$jsonValue = convert_uudecode($uue);
|
||||
|
||||
$value = json_decode($jsonValue, true);
|
||||
$keys = $this->getKeys();
|
||||
$pubkey = openssl_pkey_get_public($keys['public']);
|
||||
$ret = openssl_verify(json_encode($value['auth']), convert_uudecode($value['sign']), $pubkey);
|
||||
|
||||
if($ret == -1)
|
||||
die("Error checking signature.");
|
||||
|
||||
if($ret == 1)
|
||||
{
|
||||
// correct signature
|
||||
$this->loginCookie($value['auth']['user'], Factory::getApplication()->input->cookie->get('clubsLoginKeepLoggedIn', false));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// wrong signature
|
||||
$this->logoffCookie();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private function getKeys()
|
||||
{
|
||||
$keyModel = BaseDatabaseModel::getInstance('signkey', 'ClubsModel');
|
||||
return $keyModel->getKeys();
|
||||
}
|
||||
|
||||
public function setKeepLoggedIn($keep)
|
||||
{
|
||||
$c = Factory::getApplication()->input->cookie;
|
||||
|
||||
if($keep)
|
||||
{
|
||||
$c->set('clubsLoginKeepLoggedIn', 'true', time() + 3600*24*365*10);
|
||||
}
|
||||
else
|
||||
{
|
||||
$c->set('clubsLoginKeepLoggedIn', '', 0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
60
src/site/models/signkey.php
Normal file
60
src/site/models/signkey.php
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
|
||||
use Joomla\CMS\Factory;
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
class ClubsModelSignkey extends BaseDatabaseModel
|
||||
{
|
||||
|
||||
public function getKeys()
|
||||
{
|
||||
$db = Factory::getDbo();
|
||||
$query = $db->getQuery(true);
|
||||
$query->select('privkey,publickey')
|
||||
->from("#__club_keys");
|
||||
$db->setQuery($query);
|
||||
$result = $db->loadAssoc();
|
||||
$query->clear();
|
||||
|
||||
$ret = array();
|
||||
if($result == null)
|
||||
{
|
||||
// No key was yet generated
|
||||
$ret = $this->genKeyPair();
|
||||
$this->saveKeyPair($db, $ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
$ret['priv'] = $result['privkey'];
|
||||
$ret['public'] = $result['publickey'];
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
private function genKeyPair()
|
||||
{
|
||||
$ret = array();
|
||||
|
||||
$pkey = openssl_pkey_new();
|
||||
openssl_pkey_export($pkey, $ret['priv']) or die ("Error generating key.");
|
||||
$details = openssl_pkey_get_details($pkey);
|
||||
$ret['public'] = $details['key'];
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
private function saveKeyPair($db, $ret)
|
||||
{
|
||||
$query = $db->getQuery(true);
|
||||
$query->insert('#__club_keys');
|
||||
$query->into('privkey, publickey');
|
||||
$query->values($db->q($ret['priv']) . ', ' . $db->q($ret['public']));
|
||||
$db->setQuery($query);
|
||||
$db->execute();
|
||||
$query->clear();
|
||||
}
|
||||
|
||||
}
|
24
src/site/models/user.php
Normal file
24
src/site/models/user.php
Normal file
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\MVC\Model\ItemModel;
|
||||
use Joomla\CMS\Factory;
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
class ClubsModelUser extends ItemModel
|
||||
{
|
||||
|
||||
public function getPassword($username)
|
||||
{
|
||||
$dbo = Factory::getDbo();
|
||||
$query = $dbo->getQuery(true);
|
||||
$query->select('password')
|
||||
->from("#__club_users")
|
||||
->where("user = " . $dbo->quote($username));
|
||||
$dbo->setQuery($query);
|
||||
$result = $dbo->loadResult();
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
7
src/site/views/clubs/tmpl/default.php
Normal file
7
src/site/views/clubs/tmpl/default.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
?>
|
||||
asd
|
10
src/site/views/clubs/view.html.php
Normal file
10
src/site/views/clubs/view.html.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\MVC\View\HtmlView;
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
class ClubsViewClubs extends HtmlView
|
||||
{
|
||||
}
|
22
src/site/views/login/tmpl/default.php
Normal file
22
src/site/views/login/tmpl/default.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
use Joomla\CMS\Factory;
|
||||
|
||||
if($this->state === "failed")
|
||||
{
|
||||
?>
|
||||
<p class='error'>Benutzername oder Passwort sind falsch.</p>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<form method="post" action="?option=com_clubs&task=login.login">
|
||||
<p>
|
||||
Username:<br />
|
||||
<input name="user" type="text">
|
||||
</p>
|
||||
<p>
|
||||
Passwort:<br />
|
||||
<input name="password" type="password">
|
||||
</p>
|
||||
<p><input type="checkbox" name='keep' value='true' <?php if(Factory::getApplication()->input->cookie->get('clubsLoginKeepLoggedIn','') === 'true') echo "checked";?>> Keep me logged in</p>
|
||||
<p><input type="submit" value="Einloggen"></p>
|
||||
</form>
|
7
src/site/views/login/tmpl/logout.php
Normal file
7
src/site/views/login/tmpl/logout.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
?>
|
||||
<a href='?option=com_clubs&task=login.logout'>Logout</a>
|
30
src/site/views/login/view.html.php
Normal file
30
src/site/views/login/view.html.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use Joomla\CMS\MVC\View\HtmlView;
|
||||
use Joomla\CMS\Factory;
|
||||
|
||||
// No direct access.
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
JLoader::register("ClubsHelperAuth", JPATH_ROOT . "/components/com_clubs/helpers/auth.php");
|
||||
|
||||
class ClubsViewLogin extends HtmlView
|
||||
{
|
||||
|
||||
public function display($tpl = null)
|
||||
{
|
||||
$helper = new ClubsHelperAuth();
|
||||
if($helper->checkCookie())
|
||||
{
|
||||
// we are logged in
|
||||
$this->setLayout('logout');
|
||||
parent::display(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->state = Factory::getApplication()->input->get("state", "");
|
||||
parent::display($tpl);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user