40 Commits

Author SHA1 Message Date
2258aff2b7 complete version update 2024-10-02 18:39:56 +02:00
d0589dfbd7 address security vulnerability in rollup.js - Update coming soon 2024-10-02 14:49:38 +02:00
76bbdff176 fix readme 2024-09-20 09:36:18 +02:00
950431aaea update README.md 2024-09-20 09:34:37 +02:00
340728c838 address security vulnerabilities in dependencies 2024-09-20 09:31:34 +02:00
7ebd61f612 bump to V1.1.3 2024-08-27 15:48:58 +02:00
c074d6c025 prepare for a simpler installation method. Still missing config adjustments (i.e. adjusting how the config is loaded) 2024-08-26 11:45:15 +02:00
a68e42c4bb Revert "Restructuring for new way of installing libreevent"
This reverts commit 688b0616cc.
2024-08-26 11:21:52 +02:00
688b0616cc Restructuring for new way of installing libreevent 2024-08-26 11:16:28 +02:00
4d0b8eb1cb perform version bump && address vulnerability in dependency 2024-08-20 14:22:11 +02:00
80ddf3fac9 update Android App to new Target API (mostly done) 2024-08-20 14:18:49 +02:00
f281289435 finish version bump 2024-08-01 08:23:02 +02:00
0bc9a4e83c bump to v1.0.6, addresses vulnerability in dependency 2024-08-01 08:22:16 +02:00
0175e9120d update docs 2024-06-05 14:06:17 +02:00
Janis Hutz
5cff69fac7 Merge pull request #21 from simplePCBuilding/simplePCBuilding-patch-1
Update README.md
2024-06-05 12:00:26 +00:00
Janis Hutz
c04c0dfd04 Update README.md 2024-06-05 12:00:07 +00:00
Janis Hutz
a3b72966c7 Update README.md 2024-06-05 11:59:46 +00:00
Janis Hutz
36ccf29eac Update README.md 2024-06-05 11:59:15 +00:00
c742d037a6 start updating doc style 2024-05-24 09:56:26 +02:00
8e127a1cb5 update docs 2024-05-24 09:50:23 +02:00
janis
284f96a42d update to latest version 2024-05-08 08:59:40 +02:00
Janis Hutz
c9fd44c337 Merge pull request #19 from simplePCBuilding/dependabot/npm_and_yarn/src/webapp/main/multi-aecc66a090 2024-05-08 06:45:11 +00:00
dependabot[bot]
29ce117898 Bump pdfjs-dist and @pdfme/ui in /src/webapp/main
Bumps [pdfjs-dist](https://github.com/mozilla/pdfjs-dist) to 4.2.67 and updates ancestor dependency [@pdfme/ui](https://github.com/pdfme/pdfme). These dependencies need to be updated together.


Updates `pdfjs-dist` from 2.12.313 to 4.2.67
- [Commits](https://github.com/mozilla/pdfjs-dist/commits)

Updates `@pdfme/ui` from 1.2.3 to 3.2.1
- [Release notes](https://github.com/pdfme/pdfme/releases)
- [Changelog](https://github.com/pdfme/pdfme/blob/main/RELEASE.md)
- [Commits](https://github.com/pdfme/pdfme/compare/1.2.3...3.2.1)

---
updated-dependencies:
- dependency-name: pdfjs-dist
  dependency-type: indirect
- dependency-name: "@pdfme/ui"
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-07 10:46:46 +00:00
Janis Hutz
efee0b4a71 Merge pull request #18 from simplePCBuilding/dependabot/npm_and_yarn/src/server/tar-6.2.1 2024-04-11 08:20:48 +00:00
dependabot[bot]
f2557e5bf6 Bump tar from 6.1.13 to 6.2.1 in /src/server
Bumps [tar](https://github.com/isaacs/node-tar) from 6.1.13 to 6.2.1.
- [Release notes](https://github.com/isaacs/node-tar/releases)
- [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/isaacs/node-tar/compare/v6.1.13...v6.2.1)

---
updated-dependencies:
- dependency-name: tar
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-11 07:46:59 +00:00
Janis Hutz
74263ed71a Merge pull request #17 from simplePCBuilding/dependabot/npm_and_yarn/src/webapp/setup/vite-4.5.3 2024-04-04 05:35:38 +00:00
Janis Hutz
cbbb7d200c Merge pull request #16 from simplePCBuilding/dependabot/npm_and_yarn/src/webapp/main/vite-2.9.18 2024-04-04 05:35:33 +00:00
dependabot[bot]
4f7d945ad0 Bump vite from 4.5.2 to 4.5.3 in /src/webapp/setup
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.5.2 to 4.5.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.3/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-04 01:36:42 +00:00
dependabot[bot]
95af5357d5 Bump vite from 2.9.17 to 2.9.18 in /src/webapp/main
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 2.9.17 to 2.9.18.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v2.9.18/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v2.9.18/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-03 17:52:46 +00:00
0bafd9a96c update version to 1.0.4 2024-04-02 19:14:53 +02:00
Janis Hutz
f58a597b90 Merge pull request #14 from simplePCBuilding/dependabot/npm_and_yarn/src/server/express-4.19.2 2024-04-02 14:12:18 +00:00
dependabot[bot]
60b260c3e2 Bump express from 4.18.2 to 4.19.2 in /src/server
Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-29 02:35:57 +00:00
Janis Hutz
203fc1fdad Merge pull request #13 from simplePCBuilding/dependabot/npm_and_yarn/src/server/follow-redirects-1.15.6 2024-03-19 09:07:44 +01:00
dependabot[bot]
86fe6b27f6 Bump follow-redirects from 1.15.5 to 1.15.6 in /src/server
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.5 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.5...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-17 01:14:54 +00:00
janis
47b1bae815 update package.json for new release 2024-03-07 16:17:17 +01:00
janis
5a5407920b update to V1.0.3 2024-03-07 16:13:41 +01:00
45a38cb36b update nodemailer because security 2024-03-05 17:01:41 +01:00
Janis Hutz
961fa5fc80 Update README.md 2024-01-29 19:31:51 +01:00
Janis Hutz
09633132e0 Update README.md 2024-01-29 19:30:13 +01:00
c3e1411bfe add version update stuff 2024-01-20 09:05:27 +01:00
80 changed files with 5746 additions and 1423 deletions

4
.gitignore vendored
View File

@@ -24,5 +24,9 @@ node_modules
*.synctex.gz
*.fdb_latexmk
._wordcount_selection.tex
/*.zip
AppMarketing
yarn.lock
package-lock.json

View File

@@ -22,6 +22,10 @@
<img alt="App Version" src="https://img.shields.io/github/package-json/v/simplePCBuilding/libreevent.svg?label=Development Version">
</div>
<div id="donate" align="center">
<a href="https://store.janishutz.com/donate" target="_blank"><img src="https://store-cdn.janishutz.com/static/support-me.jpg" width="150px"></a>
</div>
A fully featured, free and open source event management solution you can host yourself, to manage your event and sell tickets. All you need is a webserver that can run node.js!
Visit the project's [website](https://libreevent.janishutz.com)
@@ -39,11 +43,19 @@ Alternatively, you may download the project directly from GitHub (by cloning it
- any CPU from the last 10 years
- Any operating system that can run node.js
# Roadmap
There are a few features planned for libreevent. Please discuss other ideas in the issue I opened specifically for this. (see #12)
# Contributing
If you want to contribute to this project, please read more [here](https://libreevent.janishutz.com/docs/contributing). Until the end of October 2023, no contributions can be accepted into master.
If you want to contribute to this project, please read more [here](https://libreevent.janishutz.com/docs/contributing).
# Supporting the project
If you like this project and it helped you save money, please consider donating to help fund the continuous development. If you are a company, please contact me [here](https://libreevent.janishutz.com/docs/sponsoring) if you want to sponsor the project and become an official partner.
<div id="donate" align="center">
<a href="https://store.janishutz.com/donate">
<img src="https://store-cdn.janishutz.com/static/support-me.jpg" width="150px">
</a>
</div>
# Repository structure
- [assets/](/assets/): contains the logo (as png and GIMP file), also iOS and Android marketing materials, just global assets (images / videos)
@@ -63,3 +75,9 @@ You may notice some additional folders appearing after running
./package.sh
```
This is to shrink the repository size. Distribution ready files can be found in the releases or on our [website](https://libreevent.janishutz.com/download).
<div id="donate" align="center">
<a href="https://store.janishutz.com/donate">
<img src="https://store-cdn.janishutz.com/static/support-me.jpg" width="150px">
</a>
</div>

View File

@@ -1,6 +1,6 @@
{
"name": "libreevent",
"version": "1.0.1",
"version": "1.1.5",
"description": "A free and open source event management solution",
"main": "/dist/app.js",
"scripts": {

View File

@@ -6,7 +6,7 @@
#
#
v="V1.0.1"
v="V1.1.5"
echo "
_ _ _ _
@@ -36,6 +36,10 @@ sleep 0.5
cd src/webapp/setup
npm i
npm audit fix --force
sleep 1
npm run build
echo "
@@ -50,6 +54,10 @@ cd ../main
npm i
npm audit fix --force
sleep 1
npm run build
echo "
@@ -107,11 +115,11 @@ echo "
sleep 1
cd ..
zip -9r libreevent-$v-prebuilt.zip dist
zip -9r libreevent-$v-custom.zip dist
echo "
==> Created prebuilt archive <==
==> Created custom archive <==
==> Creating archive for node_modules <==
"
@@ -120,6 +128,11 @@ sleep 1
cd src/server
npm i
npm audit fix --force
sleep 1
cd ../../
zip -9r libreevent-$v-npm.zip src/server/node_modules
@@ -141,8 +154,22 @@ zip -9r libreevent-$v-full-icu.zip src/server/package.json src/server/package-lo
cd src/server
npm uninstall full-icu
cd ../../
rm -rf dist
echo "
==> Archived full-icu config <==
==> Creating archive for prebuilt install <==
"
cd ../../dist
cp ../README.md .
cd ..
rm -rf ./simple/node_modules
rm ./simple/package-lock.json
rm ./simple/yarn.lock
zip -9r libreevent-$v-prebuilt.zip simple
echo "
@@ -164,5 +191,7 @@ echo "
Next steps:
- Check that everything was packaged correctly
- Create a release on GitHub
- Run 'cd dist && npm publish'
- Delete all newly spawned files
"

16
simple/app.js Normal file
View File

@@ -0,0 +1,16 @@
/*
* libreevent - index.js
*
* Created by Janis Hutz 08/26/2024, Licensed under the GPL V3 License
* https://janishutz.com, development@janishutz.com
*
*
*/
/*
This file is a wrapper for the npm package
*/
const libreevent = require( 'libreevent' );
libreevent.run( __dirname );

View File

@@ -0,0 +1,7 @@
{
"host": "",
"database": "",
"user": "",
"password": "",
"port": 3306
}

View File

@@ -0,0 +1,12 @@
{
"host":"",
"port": 587,
"secure": false,
"auth": {
"user":"",
"pass":""
},
"tls": {
"servername": ""
}
}

View File

@@ -0,0 +1,17 @@
{
"init":false,
"setupDone":false,
"twoFA":"allow",
"twoFAMode":"simple",
"db":"mysql",
"payments":"stripe",
"name":"libreevent",
"yourDomain":"",
"mailSender":"",
"maxTickets":10,
"currency":"USD",
"gcInterval":300,
"ticketTimeout":900,
"startPage":"default",
"version":"1.0.1"
}

26
simple/package.json Normal file
View File

@@ -0,0 +1,26 @@
{
"name": "libreevent-simple",
"version": "1.0.0",
"description": "Simplify libreevent's install using the npm package",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/janishutz/libreevent.git"
},
"keywords": [
"libreevent",
"simple"
],
"author": "Janis Hutz",
"license": "GPL-3.0-or-later",
"bugs": {
"url": "https://github.com/janishutz/libreevent/issues"
},
"homepage": "https://libreevent.janishutz.com",
"dependencies": {
"libreevent": "^1.1.3"
}
}

1
simple/setupkey.txt Normal file
View File

@@ -0,0 +1 @@
awe0g9pü02w 3tvaä9p4'efgt$ä'4fgtaäaw34ftg$a3qwf4t'p93wft3waqäü

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

View File

@@ -4,16 +4,15 @@
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="jbr-17" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>

10
src/apps/Android/.idea/migrations.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

252
src/apps/Android/.idea/other.xml generated Normal file
View File

@@ -0,0 +1,252 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="direct_access_persist.xml">
<option name="deviceSelectionList">
<list>
<PersistentDeviceSelectionData>
<option name="api" value="27" />
<option name="brand" value="DOCOMO" />
<option name="codename" value="F01L" />
<option name="id" value="F01L" />
<option name="manufacturer" value="FUJITSU" />
<option name="name" value="F-01L" />
<option name="screenDensity" value="360" />
<option name="screenX" value="720" />
<option name="screenY" value="1280" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="28" />
<option name="brand" value="DOCOMO" />
<option name="codename" value="SH-01L" />
<option name="id" value="SH-01L" />
<option name="manufacturer" value="SHARP" />
<option name="name" value="AQUOS sense2 SH-01L" />
<option name="screenDensity" value="480" />
<option name="screenX" value="1080" />
<option name="screenY" value="2160" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="31" />
<option name="brand" value="samsung" />
<option name="codename" value="a51" />
<option name="id" value="a51" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy A51" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="google" />
<option name="codename" value="akita" />
<option name="id" value="akita" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 8a" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="samsung" />
<option name="codename" value="b0q" />
<option name="id" value="b0q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy S22 Ultra" />
<option name="screenDensity" value="600" />
<option name="screenX" value="1440" />
<option name="screenY" value="3088" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="32" />
<option name="brand" value="google" />
<option name="codename" value="bluejay" />
<option name="id" value="bluejay" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 6a" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="29" />
<option name="brand" value="samsung" />
<option name="codename" value="crownqlteue" />
<option name="id" value="crownqlteue" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy Note9" />
<option name="screenDensity" value="420" />
<option name="screenX" value="2220" />
<option name="screenY" value="1080" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="dm3q" />
<option name="id" value="dm3q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy S23 Ultra" />
<option name="screenDensity" value="600" />
<option name="screenX" value="1440" />
<option name="screenY" value="3088" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="felix" />
<option name="id" value="felix" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel Fold" />
<option name="screenDensity" value="420" />
<option name="screenX" value="2208" />
<option name="screenY" value="1840" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="felix_camera" />
<option name="id" value="felix_camera" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel Fold (Camera-enabled)" />
<option name="screenDensity" value="420" />
<option name="screenX" value="2208" />
<option name="screenY" value="1840" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="samsung" />
<option name="codename" value="gts8uwifi" />
<option name="id" value="gts8uwifi" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy Tab S8 Ultra" />
<option name="screenDensity" value="320" />
<option name="screenX" value="1848" />
<option name="screenY" value="2960" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="google" />
<option name="codename" value="husky" />
<option name="id" value="husky" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 8 Pro" />
<option name="screenDensity" value="390" />
<option name="screenX" value="1008" />
<option name="screenY" value="2244" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="30" />
<option name="brand" value="motorola" />
<option name="codename" value="java" />
<option name="id" value="java" />
<option name="manufacturer" value="Motorola" />
<option name="name" value="G20" />
<option name="screenDensity" value="280" />
<option name="screenX" value="720" />
<option name="screenY" value="1600" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="lynx" />
<option name="id" value="lynx" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 7a" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="31" />
<option name="brand" value="google" />
<option name="codename" value="oriole" />
<option name="id" value="oriole" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 6" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="panther" />
<option name="id" value="panther" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 7" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="samsung" />
<option name="codename" value="q5q" />
<option name="id" value="q5q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy Z Fold5" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1812" />
<option name="screenY" value="2176" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="30" />
<option name="brand" value="google" />
<option name="codename" value="r11" />
<option name="id" value="r11" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel Watch" />
<option name="screenDensity" value="320" />
<option name="screenX" value="384" />
<option name="screenY" value="384" />
<option name="type" value="WEAR_OS" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="30" />
<option name="brand" value="google" />
<option name="codename" value="redfin" />
<option name="id" value="redfin" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 5" />
<option name="screenDensity" value="440" />
<option name="screenX" value="1080" />
<option name="screenY" value="2340" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="34" />
<option name="brand" value="google" />
<option name="codename" value="shiba" />
<option name="id" value="shiba" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel 8" />
<option name="screenDensity" value="420" />
<option name="screenX" value="1080" />
<option name="screenY" value="2400" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="33" />
<option name="brand" value="google" />
<option name="codename" value="tangorpro" />
<option name="id" value="tangorpro" />
<option name="manufacturer" value="Google" />
<option name="name" value="Pixel Tablet" />
<option name="screenDensity" value="320" />
<option name="screenX" value="1600" />
<option name="screenY" value="2560" />
</PersistentDeviceSelectionData>
<PersistentDeviceSelectionData>
<option name="api" value="29" />
<option name="brand" value="samsung" />
<option name="codename" value="x1q" />
<option name="id" value="x1q" />
<option name="manufacturer" value="Samsung" />
<option name="name" value="Galaxy S20" />
<option name="screenDensity" value="480" />
<option name="screenX" value="1440" />
<option name="screenY" value="3200" />
</PersistentDeviceSelectionData>
</list>
</option>
</component>
</project>

View File

@@ -1,5 +1,5 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.android.application") version "8.1.1" apply false
id("com.android.application") version "8.5.2" apply false
id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

View File

@@ -1,6 +1,6 @@
#Sun Sep 03 11:15:46 CEST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -15,7 +15,7 @@ const mlt = require( 'multer' );
const pngToIco = require( 'png-to-ico' );
const multer = mlt();
const fs = require( 'fs' );
const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../config/settings.config.json' ) ) );
const settings = JSON.parse( fs.readFileSync( path.join( __starterDir + '/config/settings.config.json' ) ) );
const getHandler = new geth( settings );
const postHandler = new posth( settings );

View File

@@ -1,114 +1,3 @@
/*
* libreevent - app.js
*
* Created by Janis Hutz 02/26/2023, Licensed under the GPL V3 License
* https://janishutz.com, development@janishutz.com
*
*
*/
const libreevent = require( './index.js' );
const express = require( 'express' );
let app = express();
const path = require( 'path' );
const expressSession = require( 'express-session' );
const cookieParser = require( 'cookie-parser' );
const http = require( 'http' );
const fs = require( 'fs' );
const token = require( './backend/token.js' );
console.log( `
_ _ _ _
| (_) | | |
| |_| |__ _ __ ___ _____ _____ _ __ | |_
| | | '_ \\| '__/ _ \\/ _ \\ \\ / / _ \\ '_ \\| __|
| | | |_) | | | __/ __/\\ V / __/ | | | |_
|_|_|_.__/|_| \\___|\\___| \\_/ \\___|_| |_|\\__|
-------------------------------
==> Welcome to libreevent!
==> You are running Version V1.0.0
Below you can see all important things that happen during operation.
libreevent logs all errors in the console such that they appear in the
log files when running it with an output pipe (which you should definitely do)
To do this run the following command when starting libreevent:
'node app.js > libreevent_log.txt'
` );
console.log( '[ Server ] loading settings' );
const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/config/settings.config.json' ) ) );
// Route for static html file for start page (page is compiled using
// Vue SSR and gets its support files (e.g. CSS and JS files) from
// the /home/supportFiles/:file route plus its assets from the /otherAssets/:file
// route).
if ( settings.setupDone ) {
app.get( '/', ( req, res ) => {
res.sendFile( path.join( __dirname + '/ui/home/active/en/index.html' ) );
} );
}
// Set up static routes for static file serving (performance wise not
// that good, but way easier to set up)
console.log( '[ Server ] Setting up static routes' );
if ( settings.setupDone ) {
app.use( express.static( 'webapp/main/dist' ) );
} else {
app.use( express.static( 'webapp/setup/dist' ) );
}
// initialise express with middlewares
console.log( '[ Server ] loading and initializing middlewares' );
app.use( expressSession( {
secret: token.generateToken( 60 ),
resave: false,
saveUninitialized: true,
cookie: {
sameSite: 'none',
httpOnly: true,
secure: false,
}
} ) );
app.use( cookieParser() );
let file = path.join( __dirname + '/webapp/main/dist/index.html' );
if ( settings.setupDone ) {
console.log( '[ Server ] loading backend components' );
require( './backend/helperRoutes.js' )( app, settings ); // Helper routes
require( './admin/adminRoutes.js' )( app, settings ); // admin routes
require( './admin/adminAPIRoutes.js' )( app, settings ); // admin api routes
require( './admin/appApiRoutes.js' )( app, settings ); // app api routes
require( './backend/userAPIRoutes.js' )( app, settings ); // user api routes
require( './backend/userRoutes.js' )( app, settings ); // user routes
require( './backend/payments/paymentRoutes.js' )( app, settings ); // payment routes
require( './backend/plugins/pluginLoader.js' )( app, settings ); // plugin loader
} else {
console.log( '[ Setup ] Loading setup routes' );
require( './setup/setupRoutes.js' )( app, settings ); // setup routes
file = path.join( __dirname + '/webapp/setup/dist/index.html' );
}
// handling of any unknown route. Returns the SPA index.html file which
// initiates loading of the SPA
app.use( ( request, response ) => {
response.sendFile( file );
} );
console.log( '\n\n[ Server ] loading complete!\n\n' );
const PORT = process.env.PORT || 8080;
console.log( '[ Server ] listening on port ' + PORT );
http.createServer( app ).listen( PORT );
libreevent.run( __dirname );

View File

@@ -20,7 +20,7 @@ class POSTHandler {
this.temporarilySelectedTotals = {};
this.temporaryTotals = {};
this.freeSeats = {};
this.settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/settings.config.json' ) ) );
this.settings = JSON.parse( fs.readFileSync( path.join( __starterDir + '/config/settings.config.json' ) ) );
/*
Here, GC-Duty is scheduled to run every so often (defined in settings.config.json file, no GUI setting available.

View File

@@ -23,7 +23,7 @@ const token = require( '../token.js' );
let createSSRApp = require( 'vue' ).createSSRApp;
let renderToString = require( 'vue/server-renderer' ).renderToString;
const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/settings.config.json' ) ) );
const settings = JSON.parse( fs.readFileSync( path.join( __starterDir + '/config/settings.config.json' ) ) );
module.exports.checkpassword = function checkpassword ( email, password ) {
return new Promise( resolve => {

View File

@@ -10,7 +10,7 @@
const path = require( 'path' );
const fs = require( 'fs' );
const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/settings.config.json' ) ) );
const settings = JSON.parse( fs.readFileSync( path.join( __starterDir + '/config/settings.config.json' ) ) );
const dbRef = {
'user': 'libreevent_users',
@@ -230,5 +230,5 @@ module.exports.saveSettings = ( settings ) => {
settingsToSave += settingsString[ letter ];
}
}
fs.writeFileSync( path.join( __dirname + '/../../config/settings.config.json' ), settingsToSave );
fs.writeFileSync( path.join( __starterDir + '/config/settings.config.json' ), settingsToSave );
};

View File

@@ -16,7 +16,7 @@ const path = require( 'path' );
class SQLDB {
constructor ( ) {
this.sqlConnection = mysql.createConnection( JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/db.config.json' ) ) ) );
this.sqlConnection = mysql.createConnection( JSON.parse( fs.readFileSync( path.join( __starterDir + '/config/db.config.json' ) ) ) );
}
connect ( ) {

View File

@@ -12,7 +12,7 @@ const html2text = require( 'html-to-text' );
const db = require( '../db/db.js' );
let transporter = mailer.createTransport( db.getJSONDataSync( '/config/mail.config.json' ) );
let transporter = mailer.createTransport( db.getJSONDataSync( __starterDir + '/config/mail.config.json' ) );
class MailManager {

View File

@@ -32,7 +32,7 @@ class PluginManager {
loadPaymentGatewaySettings () {
return new Promise( ( resolve, reject ) => {
this.paymentGateway = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/settings.config.json' ) ) ).payments;
this.paymentGateway = JSON.parse( fs.readFileSync( path.join( __starterDir + '/config/settings.config.json' ) ) ).payments;
fs.readFile( path.join( __dirname + '/payments/' + this.paymentGateway + '/configOptions.json' ), ( err, optionsBuffer ) => {
if ( err ) reject( err );
fs.readFile( path.join( __dirname + '/payments/' + this.paymentGateway + '/config.payments.json' ), ( err, configBuffer ) => {

View File

@@ -18,7 +18,7 @@ const mailManager = new mm();
let createSSRApp = require( 'vue' ).createSSRApp;
let renderToString = require( 'vue/server-renderer' ).renderToString;
const settings = JSON.parse( fs.readFileSync( path.join( __dirname + '/../../config/settings.config.json' ) ) );
const settings = JSON.parse( fs.readFileSync( path.join( __starterDir + '/config/settings.config.json' ) ) );
class TicketGenerator {
constructor () {

118
src/server/index.js Normal file
View File

@@ -0,0 +1,118 @@
/*
* libreevent - app.js
*
* Created by Janis Hutz 02/26/2023, Licensed under the GPL V3 License
* https://janishutz.com, development@janishutz.com
*
*
*/
const express = require( 'express' );
let app = express();
const path = require( 'path' );
const expressSession = require( 'express-session' );
const cookieParser = require( 'cookie-parser' );
const http = require( 'http' );
const fs = require( 'fs' );
const token = require( './backend/token.js' );
module.exports.run = ( rootDir ) => {
global.__starterDir = rootDir ?? __dirname;
console.log( `
_ _ _ _
| (_) | | |
| |_| |__ _ __ ___ _____ _____ _ __ | |_
| | | '_ \\| '__/ _ \\/ _ \\ \\ / / _ \\ '_ \\| __|
| | | |_) | | | __/ __/\\ V / __/ | | | |_
|_|_|_.__/|_| \\___|\\___| \\_/ \\___|_| |_|\\__|
-------------------------------
==> Welcome to libreevent!
==> You are running Version V1.0.0
Below you can see all important things that happen during operation.
libreevent logs all errors in the console such that they appear in the
log files when running it with an output pipe (which you should definitely do)
To do this run the following command when starting libreevent:
'node app.js > libreevent_log.txt'
` );
console.log( '[ Server ] loading settings' );
const settings = JSON.parse( fs.readFileSync( path.join( __starterDir + '/config/settings.config.json' ) ) );
// Route for static html file for start page (page is compiled using
// Vue SSR and gets its support files (e.g. CSS and JS files) from
// the /home/supportFiles/:file route plus its assets from the /otherAssets/:file
// route).
if ( settings.setupDone ) {
app.get( '/', ( req, res ) => {
res.sendFile( path.join( __dirname + '/ui/home/active/en/index.html' ) );
} );
}
// Set up static routes for static file serving (performance wise not
// that good, but way easier to set up)
console.log( '[ Server ] Setting up static routes' );
if ( settings.setupDone ) {
app.use( express.static( __dirname + '/webapp/main/dist' ) );
} else {
console.log( '[ Server ] Booting into setup' );
app.use( express.static( __dirname + '/webapp/setup/dist' ) );
}
// initialise express with middlewares
console.log( '[ Server ] loading and initializing middlewares' );
app.use( expressSession( {
secret: token.generateToken( 60 ),
resave: false,
saveUninitialized: true,
cookie: {
sameSite: 'none',
httpOnly: true,
secure: false,
}
} ) );
app.use( cookieParser() );
let file = path.join( __dirname + '/webapp/main/dist/index.html' );
if ( settings.setupDone ) {
console.log( '[ Server ] loading backend components' );
require( './backend/helperRoutes.js' )( app, settings ); // Helper routes
require( './admin/adminRoutes.js' )( app, settings ); // admin routes
require( './admin/adminAPIRoutes.js' )( app, settings ); // admin api routes
require( './admin/appApiRoutes.js' )( app, settings ); // app api routes
require( './backend/userAPIRoutes.js' )( app, settings ); // user api routes
require( './backend/userRoutes.js' )( app, settings ); // user routes
require( './backend/payments/paymentRoutes.js' )( app, settings ); // payment routes
require( './backend/plugins/pluginLoader.js' )( app, settings ); // plugin loader
} else {
console.log( '[ Setup ] Loading setup routes' );
require( './setup/setupRoutes.js' )( app, settings ); // setup routes
file = path.join( __dirname + '/webapp/setup/dist/index.html' );
}
// handling of any unknown route. Returns the SPA index.html file which
// initiates loading of the SPA
app.use( ( request, response ) => {
response.sendFile( file );
} );
console.log( '\n\n[ Server ] loading complete!\n\n' );
const PORT = process.env.PORT || 8080;
console.log( '[ Server ] listening on port ' + PORT );
http.createServer( app ).listen( PORT );
}

View File

@@ -1,12 +1,12 @@
{
"name": "libreevent",
"version": "1.0.1",
"version": "1.1.5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "libreevent",
"version": "1.0.1",
"version": "1.1.5",
"license": "GPL-3.0-or-later",
"dependencies": {
"@pdfme/generator": "^1.2.6",
@@ -16,7 +16,7 @@
"body-parser": "^1.20.2",
"cookie-parser": "^1.4.6",
"crypto-js": "^4.2.0",
"express": "^4.18.2",
"express": "^4.19.2",
"express-session": "^1.17.3",
"html-to-text": "^9.0.5",
"multer": "^1.4.5-lts.1",
@@ -464,11 +464,12 @@
}
},
"node_modules/axios": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
"integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==",
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz",
"integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.0",
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
@@ -519,9 +520,10 @@
}
},
"node_modules/body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"version": "1.20.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
"integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.5",
@@ -531,7 +533,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"qs": "6.13.0",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@@ -554,20 +556,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/body-parser/node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -641,12 +629,19 @@
}
},
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
"set-function-length": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -869,6 +864,23 @@
"node": ">=0.10.0"
}
},
"node_modules/define-data-property": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"license": "MIT",
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -984,9 +996,10 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -1012,6 +1025,27 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -1031,36 +1065,37 @@
}
},
"node_modules/express": {
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
"integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.1",
"body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
"cookie": "0.6.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"path-to-regexp": "0.1.10",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"send": "0.19.0",
"serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@@ -1110,33 +1145,10 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/express/node_modules/body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/express/node_modules/cookie": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"engines": {
"node": ">= 0.6"
}
@@ -1154,46 +1166,19 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/express/node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/express/node_modules/raw-body": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"node_modules/finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@@ -1208,6 +1193,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@@ -1215,7 +1201,8 @@
"node_modules/finalhandler/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
"node_modules/find-up": {
"version": "6.3.0",
@@ -1234,9 +1221,9 @@
}
},
"node_modules/follow-redirects": {
"version": "1.15.4",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
"integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
"funding": [
{
"type": "individual",
@@ -1333,9 +1320,13 @@
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/gauge": {
"version": "3.0.2",
@@ -1357,13 +1348,19 @@
}
},
"node_modules/get-intrinsic": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
"integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -1399,15 +1396,28 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"node_modules/has-property-descriptors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.1"
"es-define-property": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"license": "MIT",
"engines": {
"node": ">= 0.4.0"
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
@@ -1440,6 +1450,18 @@
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/html-minifier-terser": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
@@ -1765,9 +1787,13 @@
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/methods": {
"version": "1.1.2",
@@ -1781,6 +1807,7 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"license": "MIT",
"bin": {
"mime": "cli.js"
},
@@ -1851,9 +1878,9 @@
}
},
"node_modules/minipass": {
"version": "4.2.8",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
"integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
"integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"engines": {
"node": ">=8"
}
@@ -2026,9 +2053,9 @@
}
},
"node_modules/nodemailer": {
"version": "6.9.3",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.3.tgz",
"integrity": "sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==",
"version": "6.9.11",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.11.tgz",
"integrity": "sha512-UiAkgiERuG94kl/3bKfE8o10epvDnl0vokNEtZDPTq9BWzIl6EFT9336SbIT4oaTBD8NmmUTLsQyXHV82eXSWg==",
"engines": {
"node": ">=6.0.0"
}
@@ -2067,9 +2094,13 @@
}
},
"node_modules/object-inspect": {
"version": "1.12.3",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
"integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
"integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -2194,9 +2225,10 @@
}
},
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
"version": "0.1.10",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
"integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
"license": "MIT"
},
"node_modules/pdf-lib": {
"version": "1.17.1",
@@ -2306,11 +2338,12 @@
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/qs": {
"version": "6.11.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
"integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.0.4"
"side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@@ -2475,9 +2508,10 @@
}
},
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
"integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
@@ -2501,6 +2535,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@@ -2508,7 +2543,17 @@
"node_modules/send/node_modules/debug/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
"node_modules/send/node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/serve-favicon": {
"version": "2.5.0",
@@ -2536,14 +2581,15 @@
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"version": "1.16.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
"integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"license": "MIT",
"dependencies": {
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
"send": "0.19.0"
},
"engines": {
"node": ">= 0.8.0"
@@ -2554,19 +2600,41 @@
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
},
"node_modules/set-function-length": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"license": "MIT",
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
},
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
"call-bind": "^1.0.7",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.4",
"object-inspect": "^1.13.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -2686,13 +2754,13 @@
}
},
"node_modules/tar": {
"version": "6.1.13",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
"integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
"integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^4.0.0",
"minipass": "^5.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"

View File

@@ -1,8 +1,8 @@
{
"name": "libreevent",
"version": "1.0.1",
"version": "1.1.5",
"description": "Free & Open source event management solution",
"main": "app.js",
"main": "index.js",
"directories": {
"doc": "docs"
},
@@ -49,7 +49,7 @@
"body-parser": "^1.20.2",
"cookie-parser": "^1.4.6",
"crypto-js": "^4.2.0",
"express": "^4.18.2",
"express": "^4.19.2",
"express-session": "^1.17.3",
"html-to-text": "^9.0.5",
"multer": "^1.4.5-lts.1",

View File

@@ -21,7 +21,7 @@ module.exports = ( app, settings ) => {
*/
app.post( '/setup/start', bodyParser.json(), ( request, response ) => {
if ( request.body.token === '' + fs.readFileSync( path.join( __dirname + '/../setupkey.txt' ) ) ) {
if ( request.body.token === '' + fs.readFileSync( path.join( __starterDir + '/setupkey.txt' ) ) ) {
request.session.setupKeyOk = true;
response.send( 'ok' );
} else {
@@ -39,7 +39,7 @@ module.exports = ( app, settings ) => {
app.post( '/setup/saveBasicSettings', bodyParser.json(), ( req, res ) => {
if ( req.session.setupKeyOk ) {
fs.writeFileSync( path.join( __dirname + '/../config/db.config.json' ), JSON.stringify( req.body.db ) );
fs.writeFileSync( path.join( __starterDir + '/config/db.config.json' ), JSON.stringify( req.body.db ) );
let emailSettings = {};
emailSettings[ 'host' ] = req.body.email.host;
emailSettings[ 'port' ] = req.body.email.port;
@@ -47,7 +47,7 @@ module.exports = ( app, settings ) => {
emailSettings[ 'auth' ] = { 'user': req.body.email.user, 'pass': req.body.email.pass };
let hostSplit = req.body.email.host.split( '.' );
emailSettings[ 'tls' ] = { 'servername': ( hostSplit[ hostSplit.length - 2 ] + '.' + hostSplit[ hostSplit.length - 1 ] ) };
fs.writeFileSync( path.join( __dirname + '/../config/mail.config.json' ), JSON.stringify( emailSettings ) );
fs.writeFileSync( path.join( __starterDir + '/config/mail.config.json' ), JSON.stringify( emailSettings ) );
if ( db === null ) {
db = require( '../backend/db/db.js' );
pwm = require( '../admin/pwdmanager.js' );

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "libreevent",
"version": "1.0.1",
"version": "1.1.5",
"private": false,
"scripts": {
"dev": "vite --host",
@@ -10,7 +10,7 @@
},
"dependencies": {
"@pdfme/generator": "^1.2.3",
"@pdfme/ui": "^1.2.3",
"@pdfme/ui": "^3.2.1",
"pinia": "^2.0.34",
"vue": "^3.2.13",
"vue-picture-input": "^3.0.1",
@@ -18,9 +18,9 @@
"vue3-draggable-resizable": "^1.6.5"
},
"devDependencies": {
"@vitejs/plugin-vue": "^1.10.2",
"vite": "^2.9.17",
"@vitejs/plugin-vue": "^5.1.4",
"eslint": "^8.39.0",
"eslint-plugin-vue": "^9.17.0"
"eslint-plugin-vue": "^9.17.0",
"vite": "^5.4.6"
}
}

View File

@@ -1,12 +1,12 @@
{
"name": "libreevent-setup",
"version": "1.0.1",
"version": "1.1.5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "libreevent-setup",
"version": "1.0.1",
"version": "1.1.5",
"dependencies": {
"pinia": "^2.1.3",
"vue": "^3.3.4",
@@ -16,7 +16,7 @@
"@vitejs/plugin-vue": "^4.2.3",
"eslint": "^8.39.0",
"eslint-plugin-vue": "^9.11.0",
"vite": "^4.5.2"
"vite": "^4.5.3"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -1705,10 +1705,11 @@
}
},
"node_modules/rollup": {
"version": "3.29.4",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
"integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
"version": "3.29.5",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
"integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
"dev": true,
"license": "MIT",
"bin": {
"rollup": "dist/bin/rollup"
},
@@ -1869,10 +1870,11 @@
"dev": true
},
"node_modules/vite": {
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
"integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
"version": "4.5.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz",
"integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.18.10",
"postcss": "^8.4.27",

View File

@@ -1,6 +1,6 @@
{
"name": "libreevent-setup",
"version": "1.0.1",
"version": "1.1.5",
"private": true,
"scripts": {
"dev": "vite",
@@ -17,6 +17,6 @@
"@vitejs/plugin-vue": "^4.2.3",
"eslint": "^8.39.0",
"eslint-plugin-vue": "^9.11.0",
"vite": "^4.5.2"
"vite": "^4.5.3"
}
}

View File

@@ -179,11 +179,13 @@ function storeHTML( html, filepath ) {
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
${ html }</div>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
${ html }</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,11 +13,12 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Events</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Events</h1>
<p>This is the most feature rich admin page of libreevent. Here you can change everything regarding an event.</p>
<h2>Creating new events</h2>
<p>Creating new events is as simple as clicking the plus icon in the top right corner and following the prompts.</p>
@@ -26,8 +27,9 @@
<h3>Event description</h3>
<p>Describe what your event is about. It will be displayed underneath the event name when users are browsing your events. In the browsing view, the length of the description is limited to 150 characters, after which three dots will be added to the text and a 'continue reading' button will be added. Technically, there's no limit to the length of the event description, but don't overdo it with the length, as the user is unlikely to read more than a couple words anyway.</p>
<h3>Event location</h3>
<p>Choose a location where your event is going to take place. You can do so by selecting an existing location from the dropdown or by adding a new one. In the same step, you'll also need to choose between a seat plan and no seat plan, and if you choose a seat plan, you'll need to create one using out handy seatplan editor. See our seatplan editor guide <a href="/docs/admin-panel/seatplan-editor">here</a></p>
<p>Choose a location where your event is going to take place. You can do so by selecting an existing location from the dropdown or by adding a new one. In the same step, you'll also need to choose between a seat plan and no seat plan, and if you choose a seat plan, you'll need to create one using our handy seat plan editor. See our seat plan editor guide <a href="/docs/admin-panel/seatplan-editor">here</a></p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,11 +13,12 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Home</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Home</h1>
<p>The admin panel is where you can change basically everything about libreevent. It can be reached by visiting your libreevent instance and at the end type '/admin'. Example: 'https://libreevent.janishutz.com/admin' (note that this is not a valid URL!)
</p>
<p>Here's a list of the pages available when logged in as the root user. </p>
@@ -32,6 +33,7 @@
<p></p>
<p></p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,13 +13,15 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Locations</h1>
<p>libreevent allows you to create an infinite amount of locations where you can host events in. These locations all can have a seat plan - or not. This is entirely your choice. You may use libreevent's powerful seat plan editor to edit the seat plan if you choose to add one. All of the locations can be assigned to one or multiple events such that you do not waste any time creating seat plans when it is not necessary.</p>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Locations</h1>
<p>libreevent allows you to create an infinite amount of locations where you can host events in. These locations all can have a seat plan - or not. This is entirely your choice. You may use libreevent's powerful seat plan editor to edit the seat plan if you choose to add one. All the locations can be assigned to one or multiple events such that you do not waste any time creating seat plans when it is not necessary.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,13 +13,15 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Pages</h1>
<p>With the page editor you can easily create the start page (the landing page, so the page that gets displayed when the user visits the website). You may select one of a few templates which you can choose <a href="/templates">here</a>. Then you should upload the promotional text and a few images. The image count depends on the template selected. If you want to use a more feature rich start page, you can create a custom HTML start page. If you need even more customization, please consider moving libreevent to a sub-domain and building a complete website on the main domain. You can get beautiful fully custom websites built for you <a href="https://development.janishutz.com">here</a>.</p>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Pages</h1>
<p>With the page editor you can easily create the start page (the landing page, so the page that gets displayed when the user visits the website). You may select one of a few templates which you can choose <a href="/templates">here</a>. Then you should upload the promotional text and a few images. The image count depends on the template selected. If you want to use a more feature rich start page, you can create a custom HTML start page. If you need even more customization, please consider moving libreevent to a subdomain and building a complete website on the main domain. You can get beautiful fully custom websites built for you <a href="https://development.janishutz.com">here</a>.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,15 +13,17 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Plugins</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Plugins</h1>
<p>libreevent can be extended easily with plugins. Plugins add additional features and can be official or community made. When installing plugins, you need to remember that a server restart is required to activate the plugins as libreevent does not feature hot module loading (yet). You then can manage the plugins using their built-in settings page that they ship with.</p>
<p><strong>Please only install plugins from sources you trust!</strong></p>
<p>You may read on about plugins and how to install them <a href="/docs/plugins/">here</a>.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Seatplan editor :: docs - libreevent</title>
<title>Seat plan editor :: docs - libreevent</title>
<link rel="stylesheet" href="/docs/css/style.css">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -13,25 +13,27 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Seatplan editor</h1>
<p>The seatplan editor is a graphical editor where you can create and modify the seating plan of virtually any room. We recommend that you start in the top left corner of the seatplan and then move down diagonally, as it is the easiest to do. Each so-called component can be either a stand area, a stage area or a seating area, with each of them featuring different layouts. You can change everything in the properties pane.</p>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Seat plan editor</h1>
<p>The seat plan editor is a graphical editor where you can create and modify the seat plan of virtually any room. We recommend that you start in the top left corner of the seat plan and then move down diagonally, as it is the easiest to do. Each so-called component can be either a stand area, a stage area or a seating area, with each of them featuring different layouts. You can change everything in the properties-panel.</p>
<h2>Adding more components</h2>
<p>You may add more components by simply clicking the plus icon in the toolbar of the editor. The component will spawn in the top left corner of the seatplan and the view will automatically be moved towards it.</p>
<p>You may add more components by simply clicking the plus icon in the toolbar of the editor. The component will spawn in the top left corner of the seat plan and the view will automatically be moved towards it.</p>
<h2>Removing components</h2>
<p>You may remove components by clicking the trash icon or by hitting 'delete' on your keyboard.</p>
<h2>Editing history</h2>
<p>The editor features undo and redo functions such that you can undo your mistakes and accidental undos can be reverted. Just hit the corresponding button in the toolbar or use the keyboard shortcuts Ctrl + Z for Undo and Ctrl + Y for Redo.</p>
<p>The editor features undo and redo functions such that you can undo your mistakes and accidental undo can be reverted. Just hit the corresponding button in the toolbar or use the keyboard shortcuts Ctrl + Z for Undo and Ctrl + Y for Redo.</p>
<h2>Component number property</h2>
<p>This property can be used to tell the system in which order to number seats in. You can start at one for every time the numbering should start at 1 again. Just keep in mind that for optimal results, you should use a different sector whenever setting the component number to 1 again as otherwise there might be two seats 1 in a sector which can lead to confusion for the customer. You will be notified if there's such a conflict before deploying the seat plan.</p>
<p>This property can be used to tell the system in which order to number seats in. You can start at one for every time the numbering should start at 1 again. Just keep in mind that for optimal results, you should use a different sector whenever setting the component number to 1 again as otherwise there might be two seats 1 in a sector which can lead to confusion for the customer.</p>
<p><strong>Example:</strong>
You've got a seat plan which has 4 seat components. These 4 components are grouped into two different sectors. Now, for the component where the seat numbering should start for each sector, set the component number property to 1. This will tell the system to start numbering the seats from this component. You may also choose the numbering direction with the option right below called 'Numbering direction'.</p>
<h2>Saving</h2>
<p>The editor does auto-save a draft every minute. Pressing Ctrl + S or hitting the Save button in the toolbar will immediately save the seatplan as a draft. Click the deploy button to save the seatplan permanently, irreversibly overwriting any potentially existing old seatplan of that location, except you change the location name after the fact.</p>
<p>The editor does auto-save a draft every minute. Pressing Ctrl + S or hitting the Save button in the toolbar will immediately save the seat plan as a draft. Click the &quot;deploy&quot; button to save the seat plan permanently, irreversibly overwriting any potentially existing old seat plan of that location, except you change the location name after the fact.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,11 +13,12 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Settings</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Settings</h1>
<h2>2FA</h2>
<p>You can require the users to enable Two-Factor Authentication when confirming their email.
The following settings are available:</p>
@@ -46,7 +47,7 @@ The following settings are available:</p>
<h2>Currency</h2>
<p>This setting allows you to change the currency in which you want your customers to pay. The code has to be a valid ISO 4217 currency code. See more <a href="https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes">here</a> (Wikipedia). This setting defaults to USD.</p>
<h2>Ticket Timeout</h2>
<p>The ticket timeout setting allows you to specify for how much time of inactivity the ticket is reserved for a user. The value is to be entered in seconds. The database is parsed every five minutes by default (can be changed in the config file) and, if the threshold set here is exceeded, the session is garbage collected and all tickets selected are returned to the available tickets pool.</p>
<p>The ticket timeout setting allows you to specify for how much time of inactivity the ticket is reserved for a user. The value is to be entered in seconds. The database is parsed every five minutes by default (can be changed in the config file) and, if the threshold set here is exceeded, the session is garbage-collected and all tickets selected are returned to the available tickets pool.</p>
<h2>Payment gateway</h2>
<h3>Select a gateway</h3>
<p>With this setting, you can select the payment gateway to use. You may follow the link <a href="https://libreevent.janishutz.com/docs/payments">here</a> to get more information on the payment gateway. You need to hit save to enable editing for the gateway settings.</p>
@@ -96,8 +97,9 @@ The following settings are available:</p>
<h2>Modifying an account</h2>
<p>You can update the username and the password of any admin account by clicking onto it.</p>
<h2>Removing an account</h2>
<p>You can delete an admin account by right clicking on it (yes, right click) and hit delete. Confirm again that you want to delete the account and then it's gone.</p>
<p>You can delete an admin account by right-clicking on it (yes, right click) and hit delete. Confirm again that you want to delete the account, and then it's gone.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,21 +13,23 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Code of Conduct</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Code of Conduct</h1>
<p>If you would like to contribute code to libreevent, we'd like you to follow the following guidelines.</p>
<ul>
<li>Any code you want to contribute should have a reason to exist, please, if you find a bug or you have any idea for what you might want to contribute, ask around on GitHub, not that you do something nobody has use for or somebody else is already working on.</li>
<li>Always be polite to other developers. They spend their free-time working on this project. Even if the code is not as good as you might want it to be, don't start to offend people, give them some constructive criticism or suggestions on how they can improve it.</li>
<li>All the code that you produce should in no way be harmful to the consumer. If you have a proof-of-concept for a potential exploit, we'd like you to share it with us.</li>
<li>If you have code that is unfinished and you don't have the time or willingness to finish it, please open a PR as a draft and we'll mark it as up for grabs.</li>
<li>Please do some testing on the code you write to make sure it works as expected. We will also do our own testing, but we expect you to have checked that everything is working as it should beforehands.</li>
<li>If you have code that is unfinished, and you don't have the time or willingness to finish it, please open a PR as a draft, and we'll mark it as up for grabs.</li>
<li>Please do some testing on the code you write to make sure it works as expected. We will also do our own testing, but we expect you to have checked that everything is working as it should beforehand.</li>
<li>Please follow our programming style and make sure that eslint does not show any errors with the code you just wrote.</li>
</ul>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,14 +13,16 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Design Guidelines</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Design Guidelines</h1>
<p>Everything in libreevent should be designed in a way that puts legibility and ease of use as its priority, instead of opting for special effects that are, undeniably, nice, but do not contribute to improved usability and, as every effect needs some lines of code, also wastes bandwidth that is very limited if a lot of people access the sites simultaneously.</p>
<p>All color used in libreevent should be a color variable that is defined in the App.vue files which means those colors can be changed easily in the future or as part of switching to dark mode. When designing something, please avoid adding more colors whenever possible.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,11 +13,12 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Getting Started</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Getting Started</h1>
<p>You are interested in helping develop this project to make it even better? Then let us show you, how you may help and what you should keep in mind!</p>
<h2>Things to contribute to</h2>
<p>You may contribute to any of the following things (list is not exhaustive):</p>
@@ -45,6 +46,7 @@
<h2>Before starting to contribute</h2>
<p>Before you start coding, please make yourself familiar with the code of conduct and the linter settings. Another thing that is not required, but certainly a good idea is to open an issue on our GitHub to have a discussion about the changes you want to make so that you don't waste your time, if the thing you want to do is not something we feel like is necessary.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,11 +13,12 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Packaging</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Packaging</h1>
<p>libreevent has a very simple packaging script built in, it's called package.sh and can be run on any bash-compatible shell. This is another thing that should be improved: Add a batch script for the same purpose, it makes Windows user's life so much easier!</p>
<p>You can just run the script in a terminal by typing</p>
<pre><code>./package.sh
@@ -30,6 +31,7 @@
</code></pre>
<p>in the <em>src/server</em>, <em>src/webapp/main</em> and <em>src/webapp/setup</em> directories. This creates the <em>node_modules</em> folder in each of those directories. This is also what you need to do, if you want to upload the development version of libreevent.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,22 +13,24 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Contributing Plugins</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Contributing Plugins</h1>
<p>If you wish to contribute plugins and have them accepted into the official repository then your plugin has to:</p>
<ul>
<li>fulfill the code layout requirements given by the linter config</li>
<li>fulfil the code layout requirements given by the linter config</li>
<li>follow the libreevent <a href="/docs/contributing/design-guidelines">design guidelines</a></li>
<li>conform to our <a href="/docs/contributing/code-of-conduct">code of conduct</a></li>
<li>not contain any immediately obvious flaws (as layed out in the code of conduct), be it in terms of security or reliability</li>
<li>not contain any immediately obvious flaws (as laid out in the code of conduct), be it in terms of security or reliability</li>
<li>provide all necessary files for libreevent</li>
<li>offer settings if possible and necessary and a way to graphically edit them</li>
<li>have extensive documentation on its usage. Once accepted into the official repos, the documentation will be added to the official documentation.</li>
</ul>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -17,20 +17,22 @@ html, body {
}
body {
height: 100vh;
display: grid;
display: block;
background-color: #648cab;
grid-template-areas:
'header header header header header'
'menu main main main main'
'menu main main main main'
'menu main main main main'
'menu main main main main'
'menu main main main main'
'menu main main main main'
'menu main main main main'
'menu main main main main'
'footer footer footer footer footer';
}
.doc-main {
display: flex;
}
@media only screen and (min-width: 1000px) {
body {
height: 100vh;
}
.doc-main {
display: flex;
height: 85vh;
}
}
.title-wrapper {

View File

@@ -13,20 +13,22 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Errors</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Errors</h1>
<h2>400</h2>
<p>A 400 error is returned if the request that was sent to the server is invalid, contains illegal characters or has any other kind of formatting error. This can most of the time be resolved by starting a new request.</p>
<h2>403</h2>
<p>A 403 error is returned if you are unauthorised to view a certain page or resource. This can mostly be solved by logging in using the login page.</p>
<p>A 403 error is returned if you are unauthorized to view a certain page or resource. This can mostly be solved by logging in using the login page.</p>
<h2>404</h2>
<p>A 404 error is returned if the page was not found on the server. This can be either due to a wrong link or a badly configured server, but is mostly user error, so a misspelled link.</p>
<h2>500</h2>
<p>An internal server error occurs when the server is unable to properly process a request, which in some cases might also return a <a href="#400">400</a> error, if the server first decides that the request is unacceptable.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,17 +13,20 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div class="title-wrapper">
<h1>Docs - libreǝvent</h1>
<footer>Learn how to setup and use libreǝvent!</footer>
</div>
<div class="content">
<h3>Welcome to the libreǝvent docs, THE place to learn all about the project!</h3>
<p>libreǝvent is a free and open source event management solution with which you may sell tickets online at incredibly low prices as you host the application yourself. But don't be afraid, it's easier to set up than you might think! To make it as easy as possible for you to set up libreǝvent, we have our installation guides which you may follow to get up and running very quickly!</p>
<p>If you like this project, please consider giving it a star on GitHub and donating to help fund the development costs.</p>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div class="title-wrapper">
<h1>Docs - libreǝvent</h1>
<footer>Learn how to setup and use libreǝvent!</footer>
</div>
<div class="content">
<h3>Welcome to the libreǝvent docs, THE place to learn all about the project!</h3>
<p>libreǝvent is a free and open source event management solution with which you may sell tickets online at incredibly low prices as you host the application yourself. But don't be afraid, it's easier to set up than you might think! To make it as easy as possible for you to set up libreǝvent, we have our installation guides which you may follow to get up and running very quickly!</p>
<p>If you like this project, please consider giving it a star on GitHub and donating to help fund the development costs.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>

View File

@@ -13,21 +13,22 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Payments</h1>
<p>Including many payment methods can help the user choose the one that fits them best, but can also be overwhelming and a pain to set up. So please try to use as few different payment gateways as possible. Officially, libreevent supports <em>Stripe</em> and <em>Payrexx</em>. More payment gateways might come in the future as a plugin which can be installed by following our guide <a href="/docs/plugins/install#payments">here</a>
Please use our cost efficiency calculator <a href="/docs/payments/cost-efficiency-calculator">here</a> to see which is best suited for you.</p>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Payments</h1>
<p>Including many payment methods can help the user choose the one that fits them best, but can also be overwhelming and a pain to set up. So please try to use as few different payment gateways as possible. Officially, libreevent supports <em>Stripe</em> and <em>Payrexx</em>. More payment gateways might come in the future as a plugin which can be installed by following our guide <a href="/docs/plugins/install#payments">here</a></p>
<h2>Advantages / Disadvantages of each payment gateway</h2>
<h3>payrexx</h3>
<p>Payrexx is a Swiss payment gateway and it features a massive variety in payment methods, ranging from various kinds of credit cards all the way to specific online payment methods. See all their payment methods <a href="https://payrexx.com/en/paymentmethods">here</a>.
<p>Payrexx is a Swiss payment gateway, and it features a massive variety in payment methods, ranging from various kinds of credit cards all the way to specific online payment methods. See all their payment methods <a href="https://payrexx.com/en/paymentmethods">here</a>.
See payrexx <a href="https://www.payrexx.com/en/pricing/">pricing here</a> and sign up <a href="https://signup.payrexx.com">here</a>. You can find a full list of supported payment methods <a href="https://payrexx.com/en/paymentmethods">here</a></p>
<h3>Stripe</h3>
<p>Stripe is one of the most well known payment gateways out there and it is really easy to get started. See all their payment methods <a href="https://stripe.com/en-ch/payments/payment-methods">here</a>. If you choose to use Stripe, you may follow their guides on how to set up more payment options <a href="https://stripe.com/docs/payments/payment-methods/overview">here</a>
See <a href="https://stripe.com/en-gb/pricing">here</a> for pricing information and sign up <a href="https://dashboard.stripe.com/register">here</a></p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,12 +13,13 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Plugins</h1>
<p>libreevent features exensive plugin support, with all internal libreevent libraries also working together with plugins. This though poses a potential risk if the user is installing harmful plugins. This is why there is a curated list of secure plugins that the users might use <a href="/plugins">here</a></p>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Plugins</h1>
<p>libreevent features extensive plugin support, with all internal libreevent libraries also working together with plugins. This though poses a potential risk if the user is installing harmful plugins. This is why there is a curated list of secure plugins that the users might use <a href="/plugins">here</a>. Note that with one of the next major versions, libreevent's plugin API will change and break all plugins in their current form.</p>
<h1>Plugin installation</h1>
<p><strong>Installing plugins currently isn't easy. We expect you to know how to upload files to a server. If you don't know, a guide on how to upload things can be found in the setup guide which is meant for beginners</strong></p>
<h2>Acquiring the plugins</h2>
@@ -28,6 +29,7 @@
<h2>Installing other plugins</h2>
<p>You can install a new plugin by navigating to the libreevent directory on the server and then by navigating to <em>/backend/plugins/others</em> and uploading the plugin folder into there. Now, restart libreevent.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,13 +13,15 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Newsletter plugin</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Newsletter plugin</h1>
<p>Use this plugin to keep people updated about what you do and drive up revenue by doing so. This plugin features a WYSIWYG (What you see is what you get) newsletter editor to create the newsletter.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,13 +13,15 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Polls plugin</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Polls plugin</h1>
<p>The polls plugin allows you to ask users about their ideas for e.g. what DJ to hire or what drinks to order. They can make suggestions and vote on suggestions.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,15 +13,17 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Getting Started</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Getting Started</h1>
<p>In this tutorial, you are going to learn how to set up and configure libreevent.</p>
<p>Installing libreevent will take you about 2 hour, if you have never made anything similar before. If you don't want to deal with the installation, you may contact us <a href="https://api.janishutz.com/contact/setup?origin=libreevent&amp;campaign=installation-docs">here</a>, so we can set it up for you.</p>
<p>Installing libreevent will take you about 2 hour, if you have never made anything similar before. If you don't want to deal with the installation, you may pay so that I can set it up for you <a href="https://store.janishutz.com/product/libreeventSetup">here</a>.</p>
<p>Let's begin the installation <a href="/docs/setup/installation">here</a>!</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,40 +13,38 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Installation</h1>
<p>Let's begin with setting up libreevent! If you are not technically savvy or want somebody else to set it up for you, please contact me <a href="https://api.janishutz.com/contact/setup?origin=libreevent&amp;campaign=installation-docs">here</a>. If you want to set it up yourself, read on below! Soon, there will also be a video tutorial available.</p>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Installation</h1>
<p>Let's begin with setting up libreevent! If you are not technically savvy or want somebody else to set it up for you, you can pay for the setup <a href="https://store.janishutz.com/product/com.janishutz.libreeventSetup">here</a>. If you want to set it up yourself, read on below!</p>
<h1>Selecting a webhosting company</h1>
<p>Choosing the right hosting provider is not easy, especially since libreevent requires node.js. Therefore, we've listed a few really good options. Whatever hosting provider you end up going with, it is important that they explicitly list Node.js as a feature of that hosting account. All hosting providers below also include MySQL which is beneficial to have and a must-have when you are expecting to sell a lot of tickets simultaneously. This website here is hosted by asurahosting. <em>Note: I may receive a small commission when you buy webhosting using one of the links provided below. This won't affect the price you pay.</em></p>
<p>Choosing the right hosting provider is not easy, especially since libreevent requires node.js. Therefore, we've listed a few excellent options. Whatever hosting provider you end up going with, it is important that they explicitly list Node.js as a feature of that hosting account. All hosting providers below also include MySQL which is beneficial to have and a must-have when you are expecting to sell a lot of tickets simultaneously. This website here is hosted by asurahosting. <em>Note: I may receive a small commission when you buy webhosting using one of the links provided below. This won't affect the price you pay.</em></p>
<ul>
<li><a href="https://clients.asurahosting.com/aff.php?aff=1997">asurahosting</a></li>
<li><a href="https://www.novatrend.ch/en/">novatrend</a></li>
<li><a href="https://www.hetzner.com/">hetzner</a> (though make sure that you have a sufficiently high-end account!)</li>
</ul>
<p><em>Affiliate programs: TODO: Sign up</em>
https://affiliates.hostinger.com/users/signup/
https://www.a2hosting.com/about/affiliate-program/
https://www.digitalocean.com/go/affiliates</p>
<p></p>
<h1>Downloading libreevent</h1>
<p>We are going to start off by downloading libreevent. On this website, open the navigation menu and head to &quot;Downloads&quot;. (We would strongly suggest that you open the link in a new tab by right clicking on the link and hitting &quot;Open in new tab&quot;). Below, hit the download button. This will download a production ready build of libreevent as a zip file. Save it to any convenient location. Head there and extract the zip-Archive (On windows, right click, extract; On MacOS, just double click; on Linux, there is either a zip utility installed or otherwise use the unzip utility in the terminal).</p>
<p>We are going to start off by downloading libreevent. On this website, open the navigation menu and head to &quot;Downloads&quot;. (We would strongly suggest that you open the link in a new tab by right-clicking on the link and hitting &quot;Open in new tab&quot;). Below, hit the download button. This will download a production ready build of libreevent as a zip file. Save it to any convenient location. Head there and extract the zip-Archive (On Windows, right click, extract; On MacOS, just double click; on Linux, there is either a zip utility installed or otherwise use the <code>unzip</code> utility in the terminal).</p>
<h1>Defining a setup key</h1>
<p>libreevent uses what we call a setup key. You need to set this manually, as it needs to be different for every install because otherwise the whole point of this setup key is to prevent unauthorized access to the setup program. The setup will be disabled once you have first completed it.</p>
<p>To set the setup key, navigate to the extracted libreevent folder and open it. In there you should find a file called &quot;setupkey.txt&quot;. Open it up and add any random assortment of characters and numbers in there. What we recommend is that you just roll your hand over your keyboard in any way you like as this generates a very much unpredictable assortment of characters. Then, hit Ctrl + S (or Command + S on MacOS) to save the file. We would recommend leaving this file open, as you will need the setup key at a later point.</p>
<h1>Uploading libreevent</h1>
<p>It is now time to upload libreevent to your webhosting account. The recommended way of doing this is to download an FTP client like &quot;FileZilla&quot; and to connect to the hosting account in that way using the credentials provided by the hosting provider. In this guide we assume you use this way.</p>
<p>Download and install FileZilla <a href="https://filezilla-project.org/download.php?platform=win64">for Windows (64-bit)</a>, <a href="https://filezilla-project.org/download.php?platform=osx">for MacOS</a> or for Linux (available in all major distro repos). It is a free and open source FTP client. Open it and you will see a few empty fields towards the top of the app. There you will need to fill in the information given by your hosting provider. Usually, the Host is ftp.yourDomain.com, the username and password are usually your admin account credentials and the port is usually 25552 or can be left empty. Then hit quick connect. At this point, a SSL warning might appear, as the certificate might not (yet) be configured correctly to also include FTP. Accept the certificate and you should be connected.</p>
<p>Now create a new folder called &quot;libreevent&quot; by right clicking onto the empty space on the right pane (where it says &quot;remote site&quot;) and selecting &quot;create directory&quot;. Then on the left side (where it says &quot;local side&quot; navigate to the extracted libreevent folder and upload its contents by selecting it and right clicking to hitting &quot;Upload&quot;). Once that process is completed, you should be set to go to the next session.</p>
<p><strong>IMPORTANT:</strong> Never upload libreevent into any public_html folders ever! This poses a SEVERE security risk and, if a JSON database is used, exposes ALL userdata to the internet! Always upload to a non-publicly accessible folder!</p>
<p>Download and install FileZilla <a href="https://filezilla-project.org/download.php?platform=win64">for Windows (64-bit)</a>, <a href="https://filezilla-project.org/download.php?platform=osx">for MacOS</a> or for Linux (available in all major distro repos). It is a free and open source FTP client. Open it, and you will see a few empty fields towards the top of the app. There you will need to fill in the information given by your hosting provider. Usually, the Host is ftp.yourDomain.com, the username and password are usually your admin account credentials and the port is usually 25552 or can be left empty. Then hit quick connect. At this point, an SSL warning might appear, as the certificate might not (yet) be configured correctly to also include FTP. Accept the certificate and you should be connected.</p>
<p>Now create a new folder called &quot;libreevent&quot; by right-clicking onto the empty space on the right pane (where it says &quot;remote site&quot;) and selecting &quot;create directory&quot;. Then on the left side (where it says &quot;local side&quot; navigate to the extracted libreevent folder and upload its contents by selecting it and right-clicking to hitting &quot;Upload&quot;). Once that process is completed, you should be set to go to the next session.</p>
<p><strong>IMPORTANT:</strong> Never upload libreevent into any public_html folders ever! This poses a SEVERE security risk and, if a JSON database is used, exposes ALL user data to the internet! Always upload to a non-publicly accessible folder!</p>
<h2>npm install</h2>
<p>This project relies on a variety of different node.js modules that need to be installed on the server. Most webhosting providers give you an easy way to run <em>npm install</em>. If not, you might be required to upload the <em>node_modules</em> folder yourself. You can create such a folder either by downloading the <em>node_modules.zip</em> folder from the Download page or by installing npm on your local machine and then by running <em>npm i</em> in the terminal.</p>
<p>To set up the node application in most hosting providers, head to the admin panel of your hosting account once again. Navigate to the main page and scroll down until you find something that says &quot;Setup Node.js App&quot;. Click it and wait for it to load. Click &quot;Create Application&quot; and select the newest available Node.js version and set the Application mode to &quot;Production&quot;. For the application root insert the directory name which you have created just before when uploading.</p>
<p>For the Application URL field, click onto &quot;Choose any value&quot; and select an appropriate domain.</p>
<p>For the Application startup file type &quot;app.js&quot;.</p>
<p>In the section &quot;Environment variables&quot; hit &quot;Add Variable&quot; and in the appearing fields type beneath &quot;Name&quot; the following: &quot;PORT&quot; (without the quotes!) and under &quot;Value&quot; &quot;8080&quot; (again without quotes). Then hit done and at the top &quot;create&quot;. If you end up on the start page again, hit the little pencil icon to get to the application editor. Scroll down to the &quot;Detected configuration files&quot; section and click &quot;Run NPM Install&quot;. Once it shows a success message (at the top!), hit &quot;Restart&quot;.</p>
<p>CONGRATULATIONS! You are all set with the installation of libreevent! Now open a new tab in your webbrowser and type your domain name. If you can connect to your domain and libreevent is accessible, you are all set!</p>
<p>CONGRATULATIONS! You are all set with the installation of libreevent! Now open a new tab in your web browser and type your domain name. If you can connect to your domain and libreevent is accessible, you are all set!</p>
<p>You may now continue reading the <a href="/docs/setup/setup">Setup guide</a></p>
<h1>Troubleshooting</h1>
<p>Here are some tips for the most common problems that might arise from the installation</p>
@@ -61,7 +59,7 @@ https://www.digitalocean.com/go/affiliates</p>
<h3>ERR_ENCODING_NOT_SUPPORTED</h3>
<p>If this error occurs, most likely, the Node.js build of your hosting provider is set to small-icu mode, meaning some localizations are missing, one of which is ascii, which is required by the pdf generator that libreevent uses. To resolve this, you will need to download a special package.json file and add two (more) environment variables:</p>
<ul>
<li>For the package.json file, download it from <a href="https://api.janishutz.com/download/libreevent?v=latest&amp;type=icu">here</a> </li>
<li>For the package.json file, download it from <a href="https://api.janishutz.com/download/libreevent?v=latest&amp;type=icu">here</a></li>
<li>For the environment variables, add the following:</li>
</ul>
<pre><code>NODE_ICU_DATA=./node_modules/full-icu
@@ -69,8 +67,9 @@ FULL_ICU_PREFER_NPM=true
</code></pre>
<p><img src="/assets/environmentVariables.png" alt="EnvVars"></p>
<h3>Any other error</h3>
<p>Please click <a href="https://github.com/simplePCBuilding/libreevent/issues/new">here</a> to head to GitHub and open a new issue. You will need to have a GitHub Account to open an issue. If you don't have a GitHub account, you may also contact me using my <a href="https://api.janishutz.com/contact/report?origin=libreevent?error=unkown?lang=en">Bug reporting tool</a>.</p>
<p>Please click <a href="https://github.com/simplePCBuilding/libreevent/issues/new">here</a> to head to GitHub and open a new issue. You will need to have a GitHub Account to open an issue. If you don't have a GitHub account, you may also contact me using my <a href="https://support.janishutz.com/index.php?a=add&amp;category=9">Bug reporting tool</a>.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,13 +13,15 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Post-Setup</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Post-Setup</h1>
<p>As soon as you have completed setting up libreevent, there are some things you want to change on the admin panel. First off, you want to create an <a href="/docs/admin-panel/locations">event location</a> and an <a href="/docs/admin-panel/events">event</a>. Secondly, you may want to customize the start page, which you can do in the pages settings on the admin panel. You may find documentation for this <a href="/docs/admin-panel/pages">here</a>. Lastly, you need to configure and set up a <a href="/docs/admin-panel/settings#payment-gateway">payment gateway</a> in order for you to accept payments. Additionally, have a look around on the admin panel to change settings where you see fit.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,17 +13,19 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Security best practices</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Security best practices</h1>
<p>Whilst libreevent uses modern security features, no Software is perfect when it comes to security. This is why it is important to keep libreevent updated, as potential security issues are addressed with them, as well as potential bugs. Next to that, an incorrectly set up instance of libreevent might pose a security problem, but we try to make the attack surface as small as possible. The most significant security risk that can arise from improperly setting up libreevent is not using HTTPS for the server.</p>
<h2>Reverse Proxy</h2>
<p>For simplicity reasons, libreevent does not (yet) natively support SSL-Certificates. This is why libreevent should be put behind a reverse proxy to ensure that all users use SSL (Secure Sockets Layer) or TLS (Transport Layer Security) when connecting to it. Most webhosting plans are already behind a reverse proxy, you will just need to force a HTTPS redirect in the settings of the admin panel of the webhosting account. If you are manually deploying libreevent on a server without a reverse proxy, we urge you to use a reverse proxy with e.g. nginx or apache. There are a lot of guides out there on how to set a such up. Please also get yourself a Certificate for your domain and activate it. A common methods for acquiring such Certificates is to use the &quot;Certbot&quot; CLI application on Linux. It works with both apache and nginx and can automatically renew the certificate for you once it expires if set to run on a cronjob (highly recommended).</p>
<p>For simplicity reasons, libreevent does not (yet) natively support SSL-Certificates. This is why libreevent should be put behind a reverse proxy to ensure that all users use SSL (Secure Sockets Layer) or TLS (Transport Layer Security) when connecting to it. Most webhosting plans are already behind a reverse proxy, you will just need to force a HTTPS redirect in the settings of the admin panel of the webhosting account. If you are manually deploying libreevent on a server without a reverse proxy, we urge you to use a reverse proxy with e.g. nginx or apache. There are a lot of guides out there on how to set a such up. Please also get yourself a Certificate for your domain and activate it. A common method for acquiring such Certificates is to use the &quot;Certbot&quot; CLI application on Linux. It works with both Apache and nginx and can automatically renew the certificate for you once it expires if set to run on a cronjob (highly recommended).</p>
<h2>HTTPS</h2>
<p>As mentioned previously in the Reverse Proxy section, you should always have HTTPS enabled using a reverse proxy. Since most hosting accounts already have a reverse proxy installed, you just need to set it to automatically redirect HTTP to HTTPS in the webhosting admin panel.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,12 +13,13 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Setup of libreevent</h1>
<p>At this point we assume you've completed the initial install of libreevent. If not, you may find a guide on how to do it <a href="/docs/setup/installation">here</a>. Let's get started setting up your event management system!</p>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Setup of libreevent</h1>
<p>At this point we assume you've completed the initial installation of libreevent. If not, you may find a guide on how to do it <a href="/docs/setup/installation">here</a>. Let's get started setting up your event management system!</p>
<h2>Connecting to the server</h2>
<p>As discussed in the previous part where we installed the system, you can connect to your server simply by opening a web browser and typing your domain name into the address field. After that you should be greeted by the libreevent post-install landing page. Once there, you'll need the setup key you defined during the installation. Type (or copy) it into the field and hit &quot;Start setup&quot;. You will now land on the setup start page. You may hit &quot;Start setup&quot; below to start the setup.</p>
<p><em>Note: This is only available during the setup process of libreevent and will afterwards be deactivated to ensure safety of the system.</em></p>
@@ -26,14 +27,14 @@
<p>This page prepares libreevent for use, covering all the basics, the name of the website, database and email accounts.
The first setting you may change here is the name of the website. Choose wisely, as changing the name at a later point is hard, not explained in the documentation and also doesn't make for a good image.</p>
<h3>Database</h3>
<p>In the database, all the userdata is stored. libreevent currently supports two different databases, MySQL and a custom database based on JSON. Which one to choose?</p>
<p>In the database, all the user data is stored. libreevent currently supports two different databases, MySQL and a custom database based on JSON. Which one to choose?</p>
<p>Generally MySQL, except:</p>
<ul>
<li>If your organisation is small and does only sell a few tickets at a time, the JSON based database can be an easy to set up alternative.</li>
<li>Your web hosting plan does not includes MySQL and you've got no access to MySQL in any other way. <em>NOTE: Free MySQL services should NEVER be used in such an application, as most hosting plans include MySQL (or MariaDB, which works similarly) which is much more reliable and if you lose access to the database, you can only access the root account and all other user data (and therefore all user accounts) is lost. The event data is always stored in JSON format as it is more efficient this way.</em></li>
<li>If your organization is small and does only sell a few tickets at a time, the JSON based database can be an easy to set up alternative.</li>
<li>Your web hosting plan does not include MySQL, and you've got no access to MySQL in any other way. <em>NOTE: Free MySQL services should NEVER be used in such an application, as most hosting plans include MySQL (or MariaDB, which works similarly) which is much more reliable and if you lose access to the database, you can only access the root account and all other user data (and therefore all user accounts) is lost. The event data is always stored in JSON format as it is more efficient this way.</em></li>
</ul>
<p><strong>NOTE: The JSON database is really slow and should only be used if you have a small event where you expect to sell less than 5 ticket per minute at any time! The amount of tickets sold per minute that the system can handle really depends on the speed of the server the website runs on.</strong></p>
<p>MySQL generally is more time consuming to set up (taking about ten minutes compared to zero), but we'll run you through the process here to make the process easier for you.</p>
<p><strong>NOTE: The JSON database is really slow and should only be used if you have a small event where you expect to sell less than 10 tickets per minute at any time! The amount of tickets sold per minute that the system can handle really depends on the speed of the server the website runs on.</strong></p>
<p>MySQL generally is more time-consuming to set up (taking about ten minutes compared to zero), but we'll run you through the process here to make the process easier for you.</p>
<p>If you are really sure that you want to use the JSON-based database, skip the next section.</p>
<h3>Setting up a MySQL database</h3>
<p>At this point, we assume that you are logged in to the administration panel of your webhosting provider. This guide will use the Web Control Panel called &quot;Direct Admin&quot;, as it is fairly common, along with cPanel. Somewhere, there should be a button that says something like &quot;MySQL Management&quot;. Click it, which will bring you to the MySQL-Database management page. Now, create a new database by clicking the &quot;Create new database&quot; (or similar) button which will bring up the database creation tool. Give the database any name you like (libreevent would though be a reasonable choice) and give the user any name you like. When creating a password, it is important that this password is long and complicated. What we recommend doing is using a password generator or to essentially &quot;sit&quot; onto your keyboard to get a random string of characters as the password.</p>
@@ -45,10 +46,10 @@ The first setting you may change here is the name of the website. Choose wisely,
<p>In the &quot;display&quot; section, you can customize how the email address shows up for customers. What we are doing here is known as email address spoofing, if you change what email address is shown. This is being shunned actively by some email providers, which means, the value entered in the &quot;Email address to show&quot; field should be the same as the actual email address. For the display name, you can get creative.</p>
<p>With the main part of setup complete, hit continue, to advance to root account setup.</p>
<h2>Root account</h2>
<p>This is the most powerful account in this system. From it you can control EVERY aspect of your system.</p>
<p><strong>Remark: You may (and definitely should) add other accounts with less privileges after completing setup and only use the root account when it is actually necessary</strong></p>
<p>This is the most powerful account in this system. From it, you can control EVERY aspect of your system.</p>
<p></p>
<p>Please choose an email address to which you want to link the root account. Two-Factor-Authentication is ALWAYS required when logging into an account that has root privileges to ensure a higher degree of security, so please ensure you have access to that email address at all times.</p>
<p>When choosing a password, please ensure it meets the minimum requirements of the system or let the system generate one for you by clicking the 'generate password' button, which will generate a password that fulfills all requirements and exceeds the minimum requirements for password length. In the table below, you may see all the password requirements:</p>
<p>When choosing a password, please ensure it meets the minimum requirements of the system or let the system generate one for you by clicking the 'generate password' button, which will generate a password that fulfils all requirements and exceeds the minimum requirements for password length. In the table below, you may see all the password requirements:</p>
<table>
<thead>
<tr>
@@ -75,15 +76,16 @@ The first setting you may change here is the name of the website. Choose wisely,
</tr>
</tbody>
</table>
<p>Please avoid using easy to guess combinations like names &amp; birth dates of you or your relatives, zip codes &amp; cities and obvious words like 'password', 'libreevent', 'admin', 'root' and your organisation / event's name.</p>
<p>Please avoid using easy to guess combinations like names &amp; birthdates of you or your relatives, postcodes &amp; cities and obvious words like 'password', 'libreevent', 'admin', 'root' and your organization / event's name.</p>
<p>After this, the system will email you an email confirmation link using the email you've previously configured in the config.json file during installation.</p>
<h2>Setup complete</h2>
<p>With this, you've completed the setup of the event. We now ask you to restart the node application. You may do this by stopping the process (if logged in via SSH, press Ctrl + C, if you've got a graphical user interface for setting up the node app, it should be self explanatory) and restarting it.</p>
<p>With this, you've completed the setup of the event. We now ask you to restart the node application. You may do this by stopping the process (if logged in via SSH, press Ctrl + C, if you've got a graphical user interface for setting up the node app, it should be self-explanatory) and restarting it.</p>
<p>libreevent already gives you the link to the admin panel, which you can click, but if you already closed the page, here's how to reach it:</p>
<p><em>You can find your admin panel at /admin (example: libreevent.janishutz.com/admin, replace libreevent.janishutz.com with your own domain).</em></p>
<p><strong>Congratulations! You've now successfully set up your event management solution.</strong></p>
<p><em>You may find documentation on the admin panel <a href="/docs/admin-panel/">here</a></em></p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -13,15 +13,18 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Updating</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Updating</h1>
<p>Updating libreǝvent is important to keep it secure, performant and bug-free. Currently, updating libreevent involves manually uploading the new files.</p>
<p><strong>IMPORTANT: make sure to ALWAYS download the data and config directories before updating to not lose any data in case something goes wrong! When uploading, do NOT upload the data and config directories except the release note tell you anything else. Please also always follow any notes detailed in the release notes.</strong></p>
<p>There are currently no updates available, this section will be expanded, once there is.</p>
<p>To update, download the latest version of libreevent from the <a href="/download">download</a> page. Then, open up FileZilla or any other FTP client, connect to your webhosting account and navigate to the libreevent directory. Then, unzip the downloaded libreevent package. In FileZilla, navigate to the extracted archive on the local side. Select all folders, bar config and data upload them.</p>
<p>Then, restart libreevent.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -15,7 +15,7 @@
<a class="side-nav-subitem" id="admin-panel-locations" href="/docs/admin-panel/locations">Locations</a>
<a class="side-nav-subitem" id="admin-panel-pages" href="/docs/admin-panel/pages">Pages</a>
<a class="side-nav-subitem" id="admin-panel-plugins" href="/docs/admin-panel/plugins">Plugins</a>
<a class="side-nav-subitem" id="admin-panel-seatplan-editor" href="/docs/admin-panel/seatplan-editor">Seatplan editor</a>
<a class="side-nav-subitem" id="admin-panel-seatplan-editor" href="/docs/admin-panel/seatplan-editor">Seat plan editor</a>
<a class="side-nav-subitem" id="admin-panel-settings" href="/docs/admin-panel/settings">Settings</a>
</div>
<a class="side-nav-item" id="contributingNav" onclick="toggleList( 'contributing' );">Contributing</a>
@@ -44,7 +44,7 @@
<a class="side-nav-subitem" id="setup-update" href="/docs/setup/update">Updating</a>
</div>
<a class="side-nav-item" id="sponsoring" href="/docs/sponsoring">Sponsoring</a>
<a class="side-nav-item" id="systemrequirements" href="/docs/systemrequirements">Systemrequirements</a>
<a class="side-nav-item" id="systemrequirements" href="/docs/systemrequirements">System requirements</a>
</div>
</div>
</div>

View File

@@ -13,14 +13,16 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Sponsoring</h1>
<p>As any project, libreevent also needs funding to keep development going. If you have used and liked libreevent and want to see it grow and become more feature rich, you might want to consider donating to the project. If you are a company and you want to become a sponsor of the project, please <a href="mailto:development@janishutz.com">contact me</a> for a sponsor deal.</p>
<p></p>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Sponsoring</h1>
<p>As any project, libreevent also needs funding to keep development going. If you have used and liked libreevent and want to see it grow and become more feature rich, you might want to consider donating to the project. If you are a company and you want to become a sponsor of the project, please <a href="https://support.janishutz.com/index.php?a=add&amp;category=10">contact me</a> for a sponsor deal.</p>
<p>If you are an individual looking to support the development of libreevent, you may donate <a href="https://store.janishutz.com/donation">here</a></p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Systemrequirements :: docs - libreevent</title>
<title>System requirements :: docs - libreevent</title>
<link rel="stylesheet" href="/docs/css/style.css">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -13,17 +13,19 @@
</head>
<body>
<div id="nav"></div>
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>Systemrequirements</h1>
<div class="doc-main">
<div id="side-bar"></div>
<div id="backToTop" onclick="backToTop();"></div>
<div id="docPage">
<div id="doc-container">
<h1>System requirements</h1>
<p>libreevent's system requirements are low, you only need a PC or Server that can run node.js and is able to install npm packages. If the system you are trying to use is unable to download npm packages, you may download the packages on your own system and upload them together with the rest of the server files. How to do that is described in greater detail in the <a href="/docs/setup/installation">Getting Started guide</a>.</p>
<h2>node.js</h2>
<p>Your system needs to be able to run node.js V &gt; 16.0 and must have access to either npm or the downloaded npm packages.</p>
<h2>Hardware requirements</h2>
<p>Hardware requirements solely depend on the amount of usage it is going to get. A cheap hosting plan should be able to handle about 100 simultaneous people. Failing to meet the CPU recommendation may lead to slow response times when a lot of people try to connect to the server at once. A good way to mitigate this problem is to use cloudflare's DDOS protection or rate limiting feature. Follow their official guide <a href="https://developers.cloudflare.com/waf/rate-limiting-rules/best-practices/">here</a> on how to set it up. Many hosting providers already use Cloudflare and you may have settings for cloudflare already enabled. Otherwise, <a href="https://dash.cloudflare.com/sign-up?lang=en-US">create a cloudflare account</a> and update your website's DNS records to instead of directly pointing to your webserver to point to Cloudflare's DNS where you can re-add the DNS records that were previously configured in your hosting provider's DNS. For more information see <a href="/docs/setup/security">Security best practices</a>.</p>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="/docs/js/index.js"></script>

View File

@@ -11,4 +11,4 @@ This is the name that is being displayed when users are browsing your events. Ca
Describe what your event is about. It will be displayed underneath the event name when users are browsing your events. In the browsing view, the length of the description is limited to 150 characters, after which three dots will be added to the text and a 'continue reading' button will be added. Technically, there's no limit to the length of the event description, but don't overdo it with the length, as the user is unlikely to read more than a couple words anyway.
### Event location
Choose a location where your event is going to take place. You can do so by selecting an existing location from the dropdown or by adding a new one. In the same step, you'll also need to choose between a seat plan and no seat plan, and if you choose a seat plan, you'll need to create one using out handy seatplan editor. See our seatplan editor guide [here](&/admin-panel/seatplan-editor)
Choose a location where your event is going to take place. You can do so by selecting an existing location from the dropdown or by adding a new one. In the same step, you'll also need to choose between a seat plan and no seat plan, and if you choose a seat plan, you'll need to create one using our handy seat plan editor. See our seat plan editor guide [here](&/admin-panel/seatplan-editor)

View File

@@ -1,3 +1,3 @@
# Locations
libreevent allows you to create an infinite amount of locations where you can host events in. These locations all can have a seat plan - or not. This is entirely your choice. You may use libreevent's powerful seat plan editor to edit the seat plan if you choose to add one. All of the locations can be assigned to one or multiple events such that you do not waste any time creating seat plans when it is not necessary.
libreevent allows you to create an infinite amount of locations where you can host events in. These locations all can have a seat plan - or not. This is entirely your choice. You may use libreevent's powerful seat plan editor to edit the seat plan if you choose to add one. All the locations can be assigned to one or multiple events such that you do not waste any time creating seat plans when it is not necessary.

View File

@@ -1,3 +1,3 @@
# Pages
With the page editor you can easily create the start page (the landing page, so the page that gets displayed when the user visits the website). You may select one of a few templates which you can choose [here](/templates). Then you should upload the promotional text and a few images. The image count depends on the template selected. If you want to use a more feature rich start page, you can create a custom HTML start page. If you need even more customization, please consider moving libreevent to a sub-domain and building a complete website on the main domain. You can get beautiful fully custom websites built for you [here](https://development.janishutz.com).
With the page editor you can easily create the start page (the landing page, so the page that gets displayed when the user visits the website). You may select one of a few templates which you can choose [here](/templates). Then you should upload the promotional text and a few images. The image count depends on the template selected. If you want to use a more feature rich start page, you can create a custom HTML start page. If you need even more customization, please consider moving libreevent to a subdomain and building a complete website on the main domain. You can get beautiful fully custom websites built for you [here](https://development.janishutz.com).

View File

@@ -1,20 +1,20 @@
# Seatplan editor
The seatplan editor is a graphical editor where you can create and modify the seating plan of virtually any room. We recommend that you start in the top left corner of the seatplan and then move down diagonally, as it is the easiest to do. Each so-called component can be either a stand area, a stage area or a seating area, with each of them featuring different layouts. You can change everything in the properties pane.
# Seat plan editor
The seat plan editor is a graphical editor where you can create and modify the seat plan of virtually any room. We recommend that you start in the top left corner of the seat plan and then move down diagonally, as it is the easiest to do. Each so-called component can be either a stand area, a stage area or a seating area, with each of them featuring different layouts. You can change everything in the properties-panel.
## Adding more components
You may add more components by simply clicking the plus icon in the toolbar of the editor. The component will spawn in the top left corner of the seatplan and the view will automatically be moved towards it.
You may add more components by simply clicking the plus icon in the toolbar of the editor. The component will spawn in the top left corner of the seat plan and the view will automatically be moved towards it.
## Removing components
You may remove components by clicking the trash icon or by hitting 'delete' on your keyboard.
## Editing history
The editor features undo and redo functions such that you can undo your mistakes and accidental undos can be reverted. Just hit the corresponding button in the toolbar or use the keyboard shortcuts Ctrl + Z for Undo and Ctrl + Y for Redo.
The editor features undo and redo functions such that you can undo your mistakes and accidental undo can be reverted. Just hit the corresponding button in the toolbar or use the keyboard shortcuts Ctrl + Z for Undo and Ctrl + Y for Redo.
## Component number property
This property can be used to tell the system in which order to number seats in. You can start at one for every time the numbering should start at 1 again. Just keep in mind that for optimal results, you should use a different sector whenever setting the component number to 1 again as otherwise there might be two seats 1 in a sector which can lead to confusion for the customer. You will be notified if there's such a conflict before deploying the seat plan.
This property can be used to tell the system in which order to number seats in. You can start at one for every time the numbering should start at 1 again. Just keep in mind that for optimal results, you should use a different sector whenever setting the component number to 1 again as otherwise there might be two seats 1 in a sector which can lead to confusion for the customer.
**Example:**
You've got a seat plan which has 4 seat components. These 4 components are grouped into two different sectors. Now, for the component where the seat numbering should start for each sector, set the component number property to 1. This will tell the system to start numbering the seats from this component. You may also choose the numbering direction with the option right below called 'Numbering direction'.
## Saving
The editor does auto-save a draft every minute. Pressing Ctrl + S or hitting the Save button in the toolbar will immediately save the seatplan as a draft. Click the deploy button to save the seatplan permanently, irreversibly overwriting any potentially existing old seatplan of that location, except you change the location name after the fact.
The editor does auto-save a draft every minute. Pressing Ctrl + S or hitting the Save button in the toolbar will immediately save the seat plan as a draft. Click the "deploy" button to save the seat plan permanently, irreversibly overwriting any potentially existing old seat plan of that location, except you change the location name after the fact.

View File

@@ -15,7 +15,7 @@ disable | Disable Two-Factor-Authentication entirely (only for users, ro
This setting allows you to change the currency in which you want your customers to pay. The code has to be a valid ISO 4217 currency code. See more [here](https://en.wikipedia.org/wiki/ISO_4217#List_of_ISO_4217_currency_codes) (Wikipedia). This setting defaults to USD.
## Ticket Timeout
The ticket timeout setting allows you to specify for how much time of inactivity the ticket is reserved for a user. The value is to be entered in seconds. The database is parsed every five minutes by default (can be changed in the config file) and, if the threshold set here is exceeded, the session is garbage collected and all tickets selected are returned to the available tickets pool.
The ticket timeout setting allows you to specify for how much time of inactivity the ticket is reserved for a user. The value is to be entered in seconds. The database is parsed every five minutes by default (can be changed in the config file) and, if the threshold set here is exceeded, the session is garbage-collected and all tickets selected are returned to the available tickets pool.
## Payment gateway
@@ -67,4 +67,4 @@ You can update the username and the password of any admin account by clicking on
## Removing an account
You can delete an admin account by right clicking on it (yes, right click) and hit delete. Confirm again that you want to delete the account and then it's gone.
You can delete an admin account by right-clicking on it (yes, right click) and hit delete. Confirm again that you want to delete the account, and then it's gone.

View File

@@ -4,6 +4,6 @@ If you would like to contribute code to libreevent, we'd like you to follow the
- Any code you want to contribute should have a reason to exist, please, if you find a bug or you have any idea for what you might want to contribute, ask around on GitHub, not that you do something nobody has use for or somebody else is already working on.
- Always be polite to other developers. They spend their free-time working on this project. Even if the code is not as good as you might want it to be, don't start to offend people, give them some constructive criticism or suggestions on how they can improve it.
- All the code that you produce should in no way be harmful to the consumer. If you have a proof-of-concept for a potential exploit, we'd like you to share it with us.
- If you have code that is unfinished and you don't have the time or willingness to finish it, please open a PR as a draft and we'll mark it as up for grabs.
- Please do some testing on the code you write to make sure it works as expected. We will also do our own testing, but we expect you to have checked that everything is working as it should beforehands.
- If you have code that is unfinished, and you don't have the time or willingness to finish it, please open a PR as a draft, and we'll mark it as up for grabs.
- Please do some testing on the code you write to make sure it works as expected. We will also do our own testing, but we expect you to have checked that everything is working as it should beforehand.
- Please follow our programming style and make sure that eslint does not show any errors with the code you just wrote.

View File

@@ -1,10 +1,10 @@
# Contributing Plugins
If you wish to contribute plugins and have them accepted into the official repository then your plugin has to:
- fulfill the code layout requirements given by the linter config
- fulfil the code layout requirements given by the linter config
- follow the libreevent [design guidelines](&/contributing/design-guidelines)
- conform to our [code of conduct](&/contributing/code-of-conduct)
- not contain any immediately obvious flaws (as layed out in the code of conduct), be it in terms of security or reliability
- not contain any immediately obvious flaws (as laid out in the code of conduct), be it in terms of security or reliability
- provide all necessary files for libreevent
- offer settings if possible and necessary and a way to graphically edit them
- have extensive documentation on its usage. Once accepted into the official repos, the documentation will be added to the official documentation.

View File

@@ -4,7 +4,7 @@
A 400 error is returned if the request that was sent to the server is invalid, contains illegal characters or has any other kind of formatting error. This can most of the time be resolved by starting a new request.
## 403
A 403 error is returned if you are unauthorised to view a certain page or resource. This can mostly be solved by logging in using the login page.
A 403 error is returned if you are unauthorized to view a certain page or resource. This can mostly be solved by logging in using the login page.
## 404
A 404 error is returned if the page was not found on the server. This can be either due to a wrong link or a badly configured server, but is mostly user error, so a misspelled link.

View File

@@ -1,11 +1,10 @@
# Payments
Including many payment methods can help the user choose the one that fits them best, but can also be overwhelming and a pain to set up. So please try to use as few different payment gateways as possible. Officially, libreevent supports *Stripe* and *Payrexx*. More payment gateways might come in the future as a plugin which can be installed by following our guide [here](&/plugins/install#payments)
Please use our cost efficiency calculator [here](&/payments/cost-efficiency-calculator) to see which is best suited for you.
## Advantages / Disadvantages of each payment gateway
### payrexx
Payrexx is a Swiss payment gateway and it features a massive variety in payment methods, ranging from various kinds of credit cards all the way to specific online payment methods. See all their payment methods [here](https://payrexx.com/en/paymentmethods).
Payrexx is a Swiss payment gateway, and it features a massive variety in payment methods, ranging from various kinds of credit cards all the way to specific online payment methods. See all their payment methods [here](https://payrexx.com/en/paymentmethods).
See payrexx [pricing here](https://www.payrexx.com/en/pricing/) and sign up [here](https://signup.payrexx.com). You can find a full list of supported payment methods [here](https://payrexx.com/en/paymentmethods)
### Stripe

View File

@@ -1,6 +1,6 @@
# Plugins
libreevent features exensive plugin support, with all internal libreevent libraries also working together with plugins. This though poses a potential risk if the user is installing harmful plugins. This is why there is a curated list of secure plugins that the users might use [here](/plugins)
libreevent features extensive plugin support, with all internal libreevent libraries also working together with plugins. This though poses a potential risk if the user is installing harmful plugins. This is why there is a curated list of secure plugins that the users might use [here](/plugins). Note that with one of the next major versions, libreevent's plugin API will change and break all plugins in their current form.
# Plugin installation

View File

@@ -1,6 +1,6 @@
# Getting Started
In this tutorial, you are going to learn how to set up and configure libreevent.
Installing libreevent will take you about 2 hour, if you have never made anything similar before. If you don't want to deal with the installation, you may contact us [here](https://api.janishutz.com/contact/setup?origin=libreevent&campaign=installation-docs), so we can set it up for you.
Installing libreevent will take you about 2 hour, if you have never made anything similar before. If you don't want to deal with the installation, you may pay so that I can set it up for you [here](https://store.janishutz.com/product/libreeventSetup).
Let's begin the installation [here](&/setup/installation)!

View File

@@ -1,21 +1,21 @@
# Installation
Let's begin with setting up libreevent! If you are not technically savvy or want somebody else to set it up for you, please contact me [here](https://api.janishutz.com/contact/setup?origin=libreevent&campaign=installation-docs). If you want to set it up yourself, read on below! Soon, there will also be a video tutorial available.
Let's begin with setting up libreevent! If you are not technically savvy or want somebody else to set it up for you, you can pay for the setup [here](https://store.janishutz.com/product/com.janishutz.libreeventSetup). If you want to set it up yourself, read on below!
# Selecting a webhosting company
Choosing the right hosting provider is not easy, especially since libreevent requires node.js. Therefore, we've listed a few really good options. Whatever hosting provider you end up going with, it is important that they explicitly list Node.js as a feature of that hosting account. All hosting providers below also include MySQL which is beneficial to have and a must-have when you are expecting to sell a lot of tickets simultaneously. This website here is hosted by asurahosting. *Note: I may receive a small commission when you buy webhosting using one of the links provided below. This won't affect the price you pay.*
Choosing the right hosting provider is not easy, especially since libreevent requires node.js. Therefore, we've listed a few excellent options. Whatever hosting provider you end up going with, it is important that they explicitly list Node.js as a feature of that hosting account. All hosting providers below also include MySQL which is beneficial to have and a must-have when you are expecting to sell a lot of tickets simultaneously. This website here is hosted by asurahosting. *Note: I may receive a small commission when you buy webhosting using one of the links provided below. This won't affect the price you pay.*
- [asurahosting](https://clients.asurahosting.com/aff.php?aff=1997)
- [novatrend](https://www.novatrend.ch/en/)
- [hetzner](https://www.hetzner.com/) (though make sure that you have a sufficiently high-end account!)
*Affiliate programs: TODO: Sign up*
<!-- *Affiliate programs: TODO: Sign up*
https://affiliates.hostinger.com/users/signup/
https://www.a2hosting.com/about/affiliate-program/
https://www.digitalocean.com/go/affiliates
https://www.digitalocean.com/go/affiliates -->
# Downloading libreevent
We are going to start off by downloading libreevent. On this website, open the navigation menu and head to "Downloads". (We would strongly suggest that you open the link in a new tab by right clicking on the link and hitting "Open in new tab"). Below, hit the download button. This will download a production ready build of libreevent as a zip file. Save it to any convenient location. Head there and extract the zip-Archive (On windows, right click, extract; On MacOS, just double click; on Linux, there is either a zip utility installed or otherwise use the unzip utility in the terminal).
We are going to start off by downloading libreevent. On this website, open the navigation menu and head to "Downloads". (We would strongly suggest that you open the link in a new tab by right-clicking on the link and hitting "Open in new tab"). Below, hit the download button. This will download a production ready build of libreevent as a zip file. Save it to any convenient location. Head there and extract the zip-Archive (On Windows, right click, extract; On MacOS, just double click; on Linux, there is either a zip utility installed or otherwise use the `unzip` utility in the terminal).
# Defining a setup key
@@ -27,11 +27,11 @@ To set the setup key, navigate to the extracted libreevent folder and open it. I
# Uploading libreevent
It is now time to upload libreevent to your webhosting account. The recommended way of doing this is to download an FTP client like "FileZilla" and to connect to the hosting account in that way using the credentials provided by the hosting provider. In this guide we assume you use this way.
Download and install FileZilla [for Windows (64-bit)](https://filezilla-project.org/download.php?platform=win64), [for MacOS](https://filezilla-project.org/download.php?platform=osx) or for Linux (available in all major distro repos). It is a free and open source FTP client. Open it and you will see a few empty fields towards the top of the app. There you will need to fill in the information given by your hosting provider. Usually, the Host is ftp.yourDomain.com, the username and password are usually your admin account credentials and the port is usually 25552 or can be left empty. Then hit quick connect. At this point, a SSL warning might appear, as the certificate might not (yet) be configured correctly to also include FTP. Accept the certificate and you should be connected.
Download and install FileZilla [for Windows (64-bit)](https://filezilla-project.org/download.php?platform=win64), [for MacOS](https://filezilla-project.org/download.php?platform=osx) or for Linux (available in all major distro repos). It is a free and open source FTP client. Open it, and you will see a few empty fields towards the top of the app. There you will need to fill in the information given by your hosting provider. Usually, the Host is ftp.yourDomain.com, the username and password are usually your admin account credentials and the port is usually 25552 or can be left empty. Then hit quick connect. At this point, an SSL warning might appear, as the certificate might not (yet) be configured correctly to also include FTP. Accept the certificate and you should be connected.
Now create a new folder called "libreevent" by right clicking onto the empty space on the right pane (where it says "remote site") and selecting "create directory". Then on the left side (where it says "local side" navigate to the extracted libreevent folder and upload its contents by selecting it and right clicking to hitting "Upload"). Once that process is completed, you should be set to go to the next session.
Now create a new folder called "libreevent" by right-clicking onto the empty space on the right pane (where it says "remote site") and selecting "create directory". Then on the left side (where it says "local side" navigate to the extracted libreevent folder and upload its contents by selecting it and right-clicking to hitting "Upload"). Once that process is completed, you should be set to go to the next session.
**IMPORTANT:** Never upload libreevent into any public_html folders ever! This poses a SEVERE security risk and, if a JSON database is used, exposes ALL userdata to the internet! Always upload to a non-publicly accessible folder!
**IMPORTANT:** Never upload libreevent into any public_html folders ever! This poses a SEVERE security risk and, if a JSON database is used, exposes ALL user data to the internet! Always upload to a non-publicly accessible folder!
## npm install
@@ -45,7 +45,7 @@ For the Application startup file type "app.js".
In the section "Environment variables" hit "Add Variable" and in the appearing fields type beneath "Name" the following: "PORT" (without the quotes!) and under "Value" "8080" (again without quotes). Then hit done and at the top "create". If you end up on the start page again, hit the little pencil icon to get to the application editor. Scroll down to the "Detected configuration files" section and click "Run NPM Install". Once it shows a success message (at the top!), hit "Restart".
CONGRATULATIONS! You are all set with the installation of libreevent! Now open a new tab in your webbrowser and type your domain name. If you can connect to your domain and libreevent is accessible, you are all set!
CONGRATULATIONS! You are all set with the installation of libreevent! Now open a new tab in your web browser and type your domain name. If you can connect to your domain and libreevent is accessible, you are all set!
You may now continue reading the [Setup guide](&/setup/setup)
@@ -67,7 +67,7 @@ The MySQL database you are using is not supported by libreevent or is incorrectl
### ERR_ENCODING_NOT_SUPPORTED
If this error occurs, most likely, the Node.js build of your hosting provider is set to small-icu mode, meaning some localizations are missing, one of which is ascii, which is required by the pdf generator that libreevent uses. To resolve this, you will need to download a special package.json file and add two (more) environment variables:
- For the package.json file, download it from [here](https://api.janishutz.com/download/libreevent?v=latest&type=icu) <!-- TODO: Add download -->
- For the package.json file, download it from [here](https://api.janishutz.com/download/libreevent?v=latest&type=icu)
- For the environment variables, add the following:
```
NODE_ICU_DATA=./node_modules/full-icu
@@ -76,4 +76,4 @@ FULL_ICU_PREFER_NPM=true
![EnvVars](/assets/environmentVariables.png)
### Any other error
Please click [here](https://github.com/simplePCBuilding/libreevent/issues/new) to head to GitHub and open a new issue. You will need to have a GitHub Account to open an issue. If you don't have a GitHub account, you may also contact me using my [Bug reporting tool](https://api.janishutz.com/contact/report?origin=libreevent?error=unkown?lang=en).
Please click [here](https://github.com/simplePCBuilding/libreevent/issues/new) to head to GitHub and open a new issue. You will need to have a GitHub Account to open an issue. If you don't have a GitHub account, you may also contact me using my [Bug reporting tool](https://support.janishutz.com/index.php?a=add&category=9).

View File

@@ -3,7 +3,7 @@
Whilst libreevent uses modern security features, no Software is perfect when it comes to security. This is why it is important to keep libreevent updated, as potential security issues are addressed with them, as well as potential bugs. Next to that, an incorrectly set up instance of libreevent might pose a security problem, but we try to make the attack surface as small as possible. The most significant security risk that can arise from improperly setting up libreevent is not using HTTPS for the server.
## Reverse Proxy
For simplicity reasons, libreevent does not (yet) natively support SSL-Certificates. This is why libreevent should be put behind a reverse proxy to ensure that all users use SSL (Secure Sockets Layer) or TLS (Transport Layer Security) when connecting to it. Most webhosting plans are already behind a reverse proxy, you will just need to force a HTTPS redirect in the settings of the admin panel of the webhosting account. If you are manually deploying libreevent on a server without a reverse proxy, we urge you to use a reverse proxy with e.g. nginx or apache. There are a lot of guides out there on how to set a such up. Please also get yourself a Certificate for your domain and activate it. A common methods for acquiring such Certificates is to use the "Certbot" CLI application on Linux. It works with both apache and nginx and can automatically renew the certificate for you once it expires if set to run on a cronjob (highly recommended).
For simplicity reasons, libreevent does not (yet) natively support SSL-Certificates. This is why libreevent should be put behind a reverse proxy to ensure that all users use SSL (Secure Sockets Layer) or TLS (Transport Layer Security) when connecting to it. Most webhosting plans are already behind a reverse proxy, you will just need to force a HTTPS redirect in the settings of the admin panel of the webhosting account. If you are manually deploying libreevent on a server without a reverse proxy, we urge you to use a reverse proxy with e.g. nginx or apache. There are a lot of guides out there on how to set a such up. Please also get yourself a Certificate for your domain and activate it. A common method for acquiring such Certificates is to use the "Certbot" CLI application on Linux. It works with both Apache and nginx and can automatically renew the certificate for you once it expires if set to run on a cronjob (highly recommended).
## HTTPS
As mentioned previously in the Reverse Proxy section, you should always have HTTPS enabled using a reverse proxy. Since most hosting accounts already have a reverse proxy installed, you just need to set it to automatically redirect HTTP to HTTPS in the webhosting admin panel.

View File

@@ -1,5 +1,5 @@
# Setup of libreevent
At this point we assume you've completed the initial install of libreevent. If not, you may find a guide on how to do it [here](&/setup/installation). Let's get started setting up your event management system!
At this point we assume you've completed the initial installation of libreevent. If not, you may find a guide on how to do it [here](&/setup/installation). Let's get started setting up your event management system!
## Connecting to the server
As discussed in the previous part where we installed the system, you can connect to your server simply by opening a web browser and typing your domain name into the address field. After that you should be greeted by the libreevent post-install landing page. Once there, you'll need the setup key you defined during the installation. Type (or copy) it into the field and hit "Start setup". You will now land on the setup start page. You may hit "Start setup" below to start the setup.
@@ -11,15 +11,15 @@ This page prepares libreevent for use, covering all the basics, the name of the
The first setting you may change here is the name of the website. Choose wisely, as changing the name at a later point is hard, not explained in the documentation and also doesn't make for a good image.
### Database
In the database, all the userdata is stored. libreevent currently supports two different databases, MySQL and a custom database based on JSON. Which one to choose?
In the database, all the user data is stored. libreevent currently supports two different databases, MySQL and a custom database based on JSON. Which one to choose?
Generally MySQL, except:
- If your organisation is small and does only sell a few tickets at a time, the JSON based database can be an easy to set up alternative.
- Your web hosting plan does not includes MySQL and you've got no access to MySQL in any other way. *NOTE: Free MySQL services should NEVER be used in such an application, as most hosting plans include MySQL (or MariaDB, which works similarly) which is much more reliable and if you lose access to the database, you can only access the root account and all other user data (and therefore all user accounts) is lost. The event data is always stored in JSON format as it is more efficient this way.*
- If your organization is small and does only sell a few tickets at a time, the JSON based database can be an easy to set up alternative.
- Your web hosting plan does not include MySQL, and you've got no access to MySQL in any other way. *NOTE: Free MySQL services should NEVER be used in such an application, as most hosting plans include MySQL (or MariaDB, which works similarly) which is much more reliable and if you lose access to the database, you can only access the root account and all other user data (and therefore all user accounts) is lost. The event data is always stored in JSON format as it is more efficient this way.*
**NOTE: The JSON database is really slow and should only be used if you have a small event where you expect to sell less than 5 ticket per minute at any time! The amount of tickets sold per minute that the system can handle really depends on the speed of the server the website runs on.**
**NOTE: The JSON database is really slow and should only be used if you have a small event where you expect to sell less than 10 tickets per minute at any time! The amount of tickets sold per minute that the system can handle really depends on the speed of the server the website runs on.**
MySQL generally is more time consuming to set up (taking about ten minutes compared to zero), but we'll run you through the process here to make the process easier for you.
MySQL generally is more time-consuming to set up (taking about ten minutes compared to zero), but we'll run you through the process here to make the process easier for you.
If you are really sure that you want to use the JSON-based database, skip the next section.
@@ -41,13 +41,13 @@ In the "display" section, you can customize how the email address shows up for c
With the main part of setup complete, hit continue, to advance to root account setup.
## Root account
This is the most powerful account in this system. From it you can control EVERY aspect of your system.
This is the most powerful account in this system. From it, you can control EVERY aspect of your system.
**Remark: You may (and definitely should) add other accounts with less privileges after completing setup and only use the root account when it is actually necessary**
<!-- **Remark: You may (and definitely should) add other accounts with less privileges after completing setup and only use the root account when it is actually necessary** -->
Please choose an email address to which you want to link the root account. Two-Factor-Authentication is ALWAYS required when logging into an account that has root privileges to ensure a higher degree of security, so please ensure you have access to that email address at all times.
When choosing a password, please ensure it meets the minimum requirements of the system or let the system generate one for you by clicking the 'generate password' button, which will generate a password that fulfills all requirements and exceeds the minimum requirements for password length. In the table below, you may see all the password requirements:
When choosing a password, please ensure it meets the minimum requirements of the system or let the system generate one for you by clicking the 'generate password' button, which will generate a password that fulfils all requirements and exceeds the minimum requirements for password length. In the table below, you may see all the password requirements:
Factor | Requirement
--------------------|--------------------------------------------------
@@ -56,12 +56,12 @@ Special characters | At least 2 required
Numbers | At least 2 required
Upper / Lower case | At least 2 upper & 2 lower case letters required
Please avoid using easy to guess combinations like names & birth dates of you or your relatives, zip codes & cities and obvious words like 'password', 'libreevent', 'admin', 'root' and your organisation / event's name.
Please avoid using easy to guess combinations like names & birthdates of you or your relatives, postcodes & cities and obvious words like 'password', 'libreevent', 'admin', 'root' and your organization / event's name.
After this, the system will email you an email confirmation link using the email you've previously configured in the config.json file during installation.
## Setup complete
With this, you've completed the setup of the event. We now ask you to restart the node application. You may do this by stopping the process (if logged in via SSH, press Ctrl + C, if you've got a graphical user interface for setting up the node app, it should be self explanatory) and restarting it.
With this, you've completed the setup of the event. We now ask you to restart the node application. You may do this by stopping the process (if logged in via SSH, press Ctrl + C, if you've got a graphical user interface for setting up the node app, it should be self-explanatory) and restarting it.
libreevent already gives you the link to the admin panel, which you can click, but if you already closed the page, here's how to reach it:

View File

@@ -4,4 +4,6 @@ Updating libreǝvent is important to keep it secure, performant and bug-free. Cu
**IMPORTANT: make sure to ALWAYS download the data and config directories before updating to not lose any data in case something goes wrong! When uploading, do NOT upload the data and config directories except the release note tell you anything else. Please also always follow any notes detailed in the release notes.**
There are currently no updates available, this section will be expanded, once there is.
To update, download the latest version of libreevent from the [download](/download) page. Then, open up FileZilla or any other FTP client, connect to your webhosting account and navigate to the libreevent directory. Then, unzip the downloaded libreevent package. In FileZilla, navigate to the extracted archive on the local side. Select all folders, bar config and data upload them.
Then, restart libreevent.

View File

@@ -1,5 +1,5 @@
# Sponsoring
As any project, libreevent also needs funding to keep development going. If you have used and liked libreevent and want to see it grow and become more feature rich, you might want to consider donating to the project. If you are a company and you want to become a sponsor of the project, please [contact me](mailto:development@janishutz.com) for a sponsor deal.
As any project, libreevent also needs funding to keep development going. If you have used and liked libreevent and want to see it grow and become more feature rich, you might want to consider donating to the project. If you are a company and you want to become a sponsor of the project, please [contact me](https://support.janishutz.com/index.php?a=add&category=10) for a sponsor deal.
<!-- If you are an individual looking to support the development of libreevent, you may donate [here] TODO: Finish -->
If you are an individual looking to support the development of libreevent, you may donate [here](https://store.janishutz.com/donation)

View File

@@ -1,8 +1,9 @@
# Systemrequirements
# System requirements
libreevent's system requirements are low, you only need a PC or Server that can run node.js and is able to install npm packages. If the system you are trying to use is unable to download npm packages, you may download the packages on your own system and upload them together with the rest of the server files. How to do that is described in greater detail in the [Getting Started guide](/docs/setup/installation).
## node.js
Your system needs to be able to run node.js V > 16.0 and must have access to either npm or the downloaded npm packages.
## Hardware requirements
Hardware requirements solely depend on the amount of usage it is going to get. A cheap hosting plan should be able to handle about 100 simultaneous people. Failing to meet the CPU recommendation may lead to slow response times when a lot of people try to connect to the server at once. A good way to mitigate this problem is to use cloudflare's DDOS protection or rate limiting feature. Follow their official guide [here](https://developers.cloudflare.com/waf/rate-limiting-rules/best-practices/) on how to set it up. Many hosting providers already use Cloudflare and you may have settings for cloudflare already enabled. Otherwise, [create a cloudflare account](https://dash.cloudflare.com/sign-up?lang=en-US) and update your website's DNS records to instead of directly pointing to your webserver to point to Cloudflare's DNS where you can re-add the DNS records that were previously configured in your hosting provider's DNS. For more information see [Security best practices](/docs/setup/security).