//moving computers

This commit is contained in:
flash 2019-12-14 23:47:36 +01:00
parent 227349a4d9
commit c7f06979b2
10 changed files with 130 additions and 0 deletions

18
assets/less/confirm.less Normal file
View file

@ -0,0 +1,18 @@
.confirm {
max-width: 400px;
margin: 0 auto;
&__message {
padding: 2px 5px;
}
&__buttons {
display: flex;
padding: 5px;
justify-content: center;
}
&__button {
margin-right: 5px;
}
}

View file

@ -161,6 +161,7 @@ html {
@import "header";
@import "footer";
@import "permissions";
@import "confirm";
// Main page styling
@import "home";

View file

@ -2,6 +2,7 @@
namespace Misuzu;
use Misuzu\Http\HttpServerRequestMessage;
use Misuzu\Http\Filters\Filter;
use Misuzu\Http\Handlers\Handler;
use Misuzu\Http\Routing\Router;
use Misuzu\Http\Routing\Route;
@ -20,6 +21,9 @@ $router->addRoutes(
Route::get('/info', Handler::call('index@InfoHandler')),
Route::get('/info/([A-Za-z0-9_/]+)', true, Handler::call('page@InfoHandler')),
// Forum
Route::create(['GET', 'POST'], '/forum/mark-as-read', Handler::call('markAsRead@ForumHandler')),
// Sock Chat
Route::create(['GET', 'POST'], '/_sockchat.php', Handler::call('phpFile@SockChatHandler')),
Route::get('/_sockchat/emotes', Handler::call('emotes@SockChatHandler')),

View file

@ -0,0 +1,15 @@
<?php
namespace Misuzu\Http\Filters;
use Misuzu\Http\HttpResponseMessage;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class EnforceLoggedInFilter implements FilterInterface {
public function process(ServerRequestInterface $request): ?ResponseInterface {
if(!user_session_active())
return new HttpResponseMessage(403);
return null;
}
}

View file

@ -0,0 +1,15 @@
<?php
namespace Misuzu\Http\Filters;
use Misuzu\Http\HttpResponseMessage;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class EnforceLoggedOutFilter implements FilterInterface {
public function process(ServerRequestInterface $request): ?ResponseInterface {
if(user_session_active())
return new HttpResponseMessage(404);
return null;
}
}

View file

@ -0,0 +1,9 @@
<?php
namespace Misuzu\Http\Filters;
final class Filter {
public static function call(string $name): array {
[$funcName, $className] = explode('@', $name, 2);
return [__NAMESPACE__ . '\\' . $className, $funcName];
}
}

View file

@ -0,0 +1,9 @@
<?php
namespace Misuzu\Http\Filters;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
interface FilterInterface {
public function process(ServerRequestInterface $request): ?ResponseInterface;
}

View file

@ -0,0 +1,20 @@
<?php
namespace Hanyuu\Filters;
use Misuzu\CSRF;
use Misuzu\Http\HttpResponseMessage;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class ValidateCsrfFilter implements FilterInterface {
public function process(ServerRequestInterface $request): ?ResponseInterface {
if($request->getMethod() !== 'GET' && $request->getMethod() !== 'DELETE') {
$token = $request->getBodyParam('_csrf');
if(empty($token) || !CSRF::validate($token))
return new HttpResponseMessage(400);
}
return null;
}
}

View file

@ -0,0 +1,17 @@
<?php
namespace Misuzu\Http\Handlers;
final class ForumHandler extends Handler {
public function markAsRead(Response $response, Request $request) {
if($request->getMethod() === 'GET') {
$response->setTemplate('confirm', [
'message' => 'Are you sure you want to mark the entire forum as read?',
'return' => url('forum-index'),
]);
return;
}
return 'now POSTing';
}
}

22
templates/confirm.twig Normal file
View file

@ -0,0 +1,22 @@
{% extends 'master.twig' %}
{% from 'macros.twig' import container_title %}
{% from '_layout/input.twig' import input_csrf %}
{% set title = title|default('Confirm your action') %}
{% block content %}
<form action="{{ action|default('') }}" method="{{ method|default('post') }}" class="container confirm">
{{ container_title('<i class="' ~ class|default('fas fa-exclamation-circle') ~ ' fa-fw"></i> ' ~ title) }}
{{ input_csrf() }}
{% for name, value in params|default([]) %}
<input type="hidden" name="{{ name }}" value="{{ value }}">
{% endfor %}
<div class="confirm__message">
{{ message|default('Are you sure you w') }}
</div>
<div class="confirm__buttons">
<button class="input__button confirm__button">Yes</button>
<a href="{{ return|default('/') }}" class="input__button confirm__button">No</a>
</div>
</form>
{% endblock %}