Design fixes, agreement in md file

This commit is contained in:
Varakh 2018-05-18 15:01:16 +02:00
parent 2423fd6e23
commit ee1d4d4786
11 changed files with 82 additions and 26 deletions

1
.gitignore vendored
View file

@ -11,6 +11,7 @@ composer.phar
# do not commit environment vars # do not commit environment vars
config/env config/env
config/legal.md
# only keep folder # only keep folder
cache/* cache/*

View file

@ -32,6 +32,7 @@ as dependencies.
* Install composer * Install composer
* Change directory to project home * Change directory to project home
* Copy `config/env.example` to `config/env` and adjust to your needs * Copy `config/env.example` to `config/env` and adjust to your needs
* Copy `config/legal.example.md` to `config/legal.md` and adjust to your needs
* `composer install` * `composer install`
* `php bin/phpmig migrate` * `php bin/phpmig migrate`
@ -78,6 +79,9 @@ as dependencies.
This app uses Symfony Translator. It's bootstraped in `Util\BootstrapHelper` and locales are placed under `data/locale/`. Adjust to your needs or help translating. This app uses Symfony Translator. It's bootstraped in `Util\BootstrapHelper` and locales are placed under `data/locale/`. Adjust to your needs or help translating.
## Changelog ## ## Changelog ##
- 0.2.0.1
- Design fixes
- GDPR adjustments (specify agreement in a `.md` file)
- 0.1.3.3 to 0.2.0.0 - 0.1.3.3 to 0.2.0.0
- update to latest yaml - update to latest yaml
- Force to lower on email and username - Force to lower on email and username

View file

@ -3,6 +3,7 @@
"slim/slim": "^3.0", "slim/slim": "^3.0",
"monolog/monolog": "^1.18", "monolog/monolog": "^1.18",
"slim/twig-view": "^2.1", "slim/twig-view": "^2.1",
"jralph/twig-markdown": "^2.0",
"slim/flash": "^0.1.0", "slim/flash": "^0.1.0",
"wixel/gump": "^1.3", "wixel/gump": "^1.3",
"curl/curl": "^1.4", "curl/curl": "^1.4",

21
config/legal.example.md Normal file
View file

@ -0,0 +1,21 @@
# Accountable
```
Contact data
```
# Preliminary
- I agree that accepting the policies mentioned below are required in order to use the service.
- I agree to not sue the operator of this (free) service for any misconfiguration concering any data protection laws.
# Website
- Cookies: This website uses small files called cookies to help the operator customise your experience. Cookies are small text files that are stored by the browser on your device. They allow websites to store things like user preferences. Functionality might be affected if you disable cookies for this website.
- Registration: An email is stored (maximal: 7 days, typical: deleted after verification process is completed) and credentials (minimal: stored as long as the account exists, typical: check user JID against well-known spammer patterns) are stored.
- Log: Access logs are not stored except for fixing bugs in case of an error or an attack on this service. Logs will be removed once the [log rotates](https://en.wikipedia.org/wiki/Log_rotation).
# Using the service
- [What data is processed?](https://wiki.xmpp.org/web/GDPR#Q1.1b_List_what_data_is_processed)
- [How is data processing done?](https://wiki.xmpp.org/web/GDPR#Q1.1c_List_what_processing_is_done)

View file

@ -20,26 +20,14 @@ sign.up.form.email.help: Only used for one time email verification, not persiste
sign.up.form.email.placeholder: xyz@domain.tld sign.up.form.email.placeholder: xyz@domain.tld
sign.up.form.password: Password sign.up.form.password: Password
sign.up.form.password.placeholder: password sign.up.form.password.placeholder: password
sign.up.form.legalmodal.open: I've read the privacy policy and I agree to it.
sign.up.form.legalmodal.header: Privacy Policy
sign.up.form.legalmodal.text: |
<h5>Signing up process</h5>
<ul>
<li>Email (maximal: 7 days, typical: deleted after verification process is completed)</li>
<li>Credentials (minimal: stored as long as the account exists, typical: check user JID against well-known spammer patterns)</li>
</ul>
<h5>Using the service</h5> # Legal modal
<ul> legalmodal.open: I've read the agreement and I agree to it.
<li><a href="https://wiki.xmpp.org/web/GDPR#Q1.1b_List_what_data_is_processed">What data is processed?</a></li> legalmodal.title: Agreement
<li><a href="https://wiki.xmpp.org/web/GDPR#Q1.1c_List_what_processing_is_done">How is data processing done?</a></li>
</ul>
<h5>General</h5> # Cookie modal
<ul> cookiemodal.dismiss: "OK"
<li>I agree that accepting the privacy policy is required in order to use the service.</li> cookiemodal.message: "This website uses cookies to ensure you get the best experience."
<li>I agree to not sue the operator of this (free) service for any misconfiguration concering any data protection laws (e.g. the General Data Protection Regulation).</li>
</ul>
# Verification # Verification
verification.mail.subject: "%server%: jabber account verification" verification.mail.subject: "%server%: jabber account verification"

6
public/css/cookieconsent.min.css vendored Normal file
View file

@ -0,0 +1,6 @@
.cc-window{opacity:1;transition:opacity 1s ease}.cc-window.cc-invisible{opacity:0}.cc-animate.cc-revoke{transition:transform 1s ease}.cc-animate.cc-revoke.cc-top{transform:translateY(-2em)}.cc-animate.cc-revoke.cc-bottom{transform:translateY(2em)}.cc-animate.cc-revoke.cc-active.cc-bottom,.cc-animate.cc-revoke.cc-active.cc-top,.cc-revoke:hover{transform:translateY(0)}.cc-grower{max-height:0;overflow:hidden;transition:max-height 1s}
.cc-link,.cc-revoke:hover{text-decoration:underline}.cc-revoke,.cc-window{position:fixed;overflow:hidden;box-sizing:border-box;font-family:Helvetica,Calibri,Arial,sans-serif;font-size:16px;line-height:1.5em;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;z-index:9999}.cc-window.cc-static{position:static}.cc-window.cc-floating{padding:2em;max-width:24em;-ms-flex-direction:column;flex-direction:column}.cc-window.cc-banner{padding:1em 1.8em;width:100%;-ms-flex-direction:row;flex-direction:row}.cc-revoke{padding:.5em}.cc-header{font-size:18px;font-weight:700}.cc-btn,.cc-close,.cc-link,.cc-revoke{cursor:pointer}.cc-link{opacity:.8;display:inline-block;padding:.2em}.cc-link:hover{opacity:1}.cc-link:active,.cc-link:visited{color:initial}.cc-btn{display:block;padding:.4em .8em;font-size:.9em;font-weight:700;border-width:2px;border-style:solid;text-align:center;white-space:nowrap}.cc-banner .cc-btn:last-child{min-width:140px}.cc-highlight .cc-btn:first-child{background-color:transparent;border-color:transparent}.cc-highlight .cc-btn:first-child:focus,.cc-highlight .cc-btn:first-child:hover{background-color:transparent;text-decoration:underline}.cc-close{display:block;position:absolute;top:.5em;right:.5em;font-size:1.6em;opacity:.9;line-height:.75}.cc-close:focus,.cc-close:hover{opacity:1}
.cc-revoke.cc-top{top:0;left:3em;border-bottom-left-radius:.5em;border-bottom-right-radius:.5em}.cc-revoke.cc-bottom{bottom:0;left:3em;border-top-left-radius:.5em;border-top-right-radius:.5em}.cc-revoke.cc-left{left:3em;right:unset}.cc-revoke.cc-right{right:3em;left:unset}.cc-top{top:1em}.cc-left{left:1em}.cc-right{right:1em}.cc-bottom{bottom:1em}.cc-floating>.cc-link{margin-bottom:1em}.cc-floating .cc-message{display:block;margin-bottom:1em}.cc-window.cc-floating .cc-compliance{-ms-flex:1;flex:1}.cc-window.cc-banner{-ms-flex-align:center;align-items:center}.cc-banner.cc-top{left:0;right:0;top:0}.cc-banner.cc-bottom{left:0;right:0;bottom:0}.cc-banner .cc-message{-ms-flex:1;flex:1}.cc-compliance{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:justify;align-content:space-between}.cc-compliance>.cc-btn{-ms-flex:1;flex:1}.cc-btn+.cc-btn{margin-left:.5em}
@media print{.cc-revoke,.cc-window{display:none}}@media screen and (max-width:900px){.cc-btn{white-space:normal}}@media screen and (max-width:414px) and (orientation:portrait),screen and (max-width:736px) and (orientation:landscape){.cc-window.cc-top{top:0}.cc-window.cc-bottom{bottom:0}.cc-window.cc-banner,.cc-window.cc-left,.cc-window.cc-right{left:0;right:0}.cc-window.cc-banner{-ms-flex-direction:column;flex-direction:column}.cc-window.cc-banner .cc-compliance{-ms-flex:1;flex:1}.cc-window.cc-floating{max-width:none}.cc-window .cc-message{margin-bottom:1em}.cc-window.cc-banner{-ms-flex-align:unset;align-items:unset}}
.cc-floating.cc-theme-classic{padding:1.2em;border-radius:5px}.cc-floating.cc-type-info.cc-theme-classic .cc-compliance{text-align:center;display:inline;-ms-flex:none;flex:none}.cc-theme-classic .cc-btn{border-radius:5px}.cc-theme-classic .cc-btn:last-child{min-width:140px}.cc-floating.cc-type-info.cc-theme-classic .cc-btn{display:inline-block}
.cc-theme-edgeless.cc-window{padding:0}.cc-floating.cc-theme-edgeless .cc-message{margin:2em 2em 1.5em}.cc-banner.cc-theme-edgeless .cc-btn{margin:0;padding:.8em 1.8em;height:100%}.cc-banner.cc-theme-edgeless .cc-message{margin-left:1em}.cc-floating.cc-theme-edgeless .cc-btn+.cc-btn{margin-left:0}

View file

@ -2,6 +2,8 @@
use Auth\XmppAdapter; use Auth\XmppAdapter;
use Auth\XmppValidator; use Auth\XmppValidator;
use Jralph\Twig\Markdown\Extension;
use Jralph\Twig\Markdown\Parsedown\ParsedownExtraMarkdown;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
@ -83,6 +85,9 @@ $container['view'] = function ($container) use ($translator) {
$view['flash'] = $container['flash']; $view['flash'] = $container['flash'];
$view['config'] = $container['config']; $view['config'] = $container['config'];
$view['currentUser'] = ($container['authenticator']->hasIdentity() ? $container['authenticator']->getIdentity() : NULL); // currentUser in Twig $view['currentUser'] = ($container['authenticator']->hasIdentity() ? $container['authenticator']->getIdentity() : NULL); // currentUser in Twig
$view->addExtension(new Extension( // markdown
new ParsedownExtraMarkdown
));
return $view; return $view;
}; };

1
public/js/cookieconsent.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -121,9 +121,19 @@ final class SignUpAction
return $response->withRedirect('signup'); return $response->withRedirect('signup');
} }
// legal information
$legalFilePath = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR;
if ($legalFile = file_exists($legalFilePath . 'legal.md')) {
$legalFileContent = file_get_contents($legalFilePath . 'legal.md');
} else {
$legalFileContent = file_get_contents($legalFilePath . 'legal.example.md');
}
// render GET // render GET
$this->view->render($response, 'signup.twig', [ $this->view->render($response, 'signup.twig', [
'title' => $this->translator->trans('sign.up.title'), 'title' => $this->translator->trans('sign.up.title'),
'legal' => $legalFileContent
]); ]);
return $response; return $response;

View file

@ -9,6 +9,7 @@
<!-- CSS & fonts --> <!-- CSS & fonts -->
<link rel="stylesheet" href="{{ base_url() }}/css/bootstrap.min.css"> <link rel="stylesheet" href="{{ base_url() }}/css/bootstrap.min.css">
<link rel="stylesheet" href="{{ base_url() }}/css/font-awesome.css"> <link rel="stylesheet" href="{{ base_url() }}/css/font-awesome.css">
<link rel="stylesheet" href="{{ base_url() }}/css/cookieconsent.min.css" />
<!-- Custom styles for this template --> <!-- Custom styles for this template -->
<style> <style>
@ -23,8 +24,7 @@
#container { #container {
margin-top: 56px; margin-top: 56px;
margin-left: 10px; overflow-x: hidden;
margin-right: 10px;
} }
</style> </style>
</head> </head>
@ -84,9 +84,8 @@
<!-- Main content --> <!-- Main content -->
<div id="container"> <div id="container">
<div class="row"> <div class="row">
<div class="col-md-7 mx-auto"> <div class="col-md-6 mx-auto">
{% if flash is not empty %} {% if flash is not empty %}
<div id="flashMessage"> <div id="flashMessage">
{% if flash.getMessage('info').0 %} {% if flash.getMessage('info').0 %}
@ -114,7 +113,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-7 mx-auto"> <div class="col-md-6 mx-auto">
{% block content %} {% block content %}
{% endblock %} {% endblock %}
</div> </div>
@ -131,5 +130,25 @@
$(".alert-info" ).delay(10000).fadeOut(300); $(".alert-info" ).delay(10000).fadeOut(300);
</script> </script>
<script src="{{ base_url() }}/js/cookieconsent.min.js"></script>
<script>
window.addEventListener("load", function(){
window.cookieconsent.initialise({
"palette": {
"popup": {
"background": "#252e39"
},
"button": {
"background": "#14a7d0"
}
},
"content": {
"message": "{{ 'cookiemodal.message'|trans }}",
"dismiss": "{{ 'cookiemodal.dismiss'|trans }}",
"href": "/signup"
}
})});
</script>
</body> </body>
</html> </html>

View file

@ -35,7 +35,7 @@
<div class="form-check"> <div class="form-check">
<input type="checkbox" id="legal" name="legal" class="form-check-input" /> <input type="checkbox" id="legal" name="legal" class="form-check-input" />
<label class="form-check-label" for="legal"><a href="#" data-target="#legalModal" data-toggle="modal">{% trans %}sign.up.form.legalmodal.open{% endtrans %}</a></label> <label class="form-check-label" for="legal"><a href="#" data-target="#legalModal" data-toggle="modal">{% trans %}legalmodal.open{% endtrans %}</a></label>
</div> </div>
<br /> <br />
<input class="btn btn-primary" type="submit" name="signup_button" value="{% trans %}sign.up.form.button{% endtrans %}"/> <input class="btn btn-primary" type="submit" name="signup_button" value="{% trans %}sign.up.form.button{% endtrans %}"/>
@ -47,13 +47,13 @@
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title">{% trans %}sign.up.form.legalmodal.header{% endtrans %}</h5> <h5 class="modal-title">{% trans %}legalmodal.title{% endtrans %}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p>{{ 'sign.up.form.legalmodal.text'|trans|raw }}</p> <p>{{ legal|markdown }}</p>
</div> </div>
</div> </div>
</div> </div>