526 Commits

Author SHA1 Message Date
oysteikt ecdb89c096 WIP 2025-12-17 12:57:57 +09:00
oysteikt 3d07547f80 src/pvv/side/agenda: fix type 2025-12-17 05:58:16 +09:00
oysteikt fc8ca571fb Remove reference to previously used gitmodule 2025-12-17 05:11:48 +09:00
oysteikt 6fd4a0599c dist/simplesamlphp-config: renew to 2.5 2025-12-17 04:50:44 +09:00
oysteikt f782d20e56 Run php-cs-fixer on src 2025-12-17 04:25:47 +09:00
oysteikt 0a77f46fe1 flake.lock: bump, composer.lock: bump 2025-12-17 04:01:26 +09:00
oysteikt ed720af80b Add hosting instructions 2025-12-17 03:49:17 +09:00
oysteikt f8acc4b815 Mark data classes and functions with types 2025-12-17 03:44:44 +09:00
vegardbm da1113341a Merge pull request 'simplify mobile view' (#92) from mobile_view into main
Reviewed-on: #92
2025-09-08 13:58:02 +02:00
vegardbm cd31bd4476 simplify mobile view 2025-09-08 13:25:54 +02:00
adriangl 77e5d336eb Merge pull request 'remove unused border and fix navbar width' (#91) from navbar into main
Reviewed-on: #91
2025-09-08 11:46:19 +02:00
vegardbm 403afdc472 remove unused border and fix navbar width 2025-09-08 11:35:41 +02:00
vegardbm 86816489e3 Merge pull request 'fix /tjenester mobile view' (#90) from mobile_view into main
Reviewed-on: #90
Reviewed-by: Oystein Kristoffer Tveit <oysteikt@pvv.ntnu.no>
2025-09-03 23:08:21 +02:00
felixalb c38c502598 Start recurring events, and remove fadderuke 2025-poster 2025-09-01 20:15:44 +02:00
vegardbm 3d843667ad update /tjenester for mobile devices 2025-08-31 01:13:26 +02:00
vegardbm 617a799ad8 Merge pull request 'remove duplicated Kalender button at /hendelser' (#89) from vegardbm/nettsiden:main into main
Reviewed-on: #89
2025-08-18 02:03:29 +02:00
vegardbm 0be8e51af4 remove duplicated Kalender button at /hendelser 2025-08-18 01:59:37 +02:00
vegardbm 381f67189a Merge pull request 'fix missing port for buttercup' (#88) from vegardbm/nettsiden:main into main
Reviewed-on: #88
2025-08-17 20:57:52 +02:00
vegardbm 2e56c7aed4 fix missing port for buttercup 2025-08-17 20:54:21 +02:00
vegardbm 5b7a04dc69 Merge pull request 'update dead links for VM hosts at /tjenester' (#87) from vegardbm/nettsiden:main into main
Reviewed-on: #87
2025-08-17 20:45:06 +02:00
vegardbm 485110bf43 update dead links for VM hosts at /tjenester 2025-08-17 20:43:05 +02:00
vegardbm 3498cb7d8e Merge pull request 'fix minecraft map link at /tjenester' (#86) from vegardbm/nettsiden:main into main
Reviewed-on: #86
2025-08-17 00:13:58 +02:00
vegardbm ed3f307b9b fix minecraft map link at /tjenester 2025-08-17 00:04:51 +02:00
vegardbm 7070a12e16 Merge pull request 'render /hendelser tid, sted, arrangør nicely on mobile' (#85) from vegardbm/nettsiden:main into main
Reviewed-on: #85
Reviewed-by: Oystein Kristoffer Tveit <oysteikt@pvv.ntnu.no>
2025-08-14 22:47:21 +02:00
vegardbm 6bda1a91bd render /hendelser tid, sted, arrangør nicely on mobile 2025-08-14 22:46:06 +02:00
vegardbm 559b7ec03b Merge pull request 'fix mobile experience for /aktiviteter' (#84) from vegardbm/nettsiden:main into main
Reviewed-on: #84
Reviewed-by: Oystein Kristoffer Tveit <oysteikt@pvv.ntnu.no>
2025-08-14 22:20:24 +02:00
vegardbm 602ae1f396 fix mobile experience for /aktiviteter 2025-08-14 22:17:25 +02:00
vegardbm f3c439d038 fix README 2025-08-14 21:20:05 +02:00
vegardbm 2b3a9dd6ec update README to reflect changes in dev environment 2025-08-14 21:09:33 +02:00
felixalb 59b071d8be Fix oopsie, gitignore cache 2025-08-14 19:00:44 +02:00
felixalb f732582d0d Merge pull request 'Høst 2025; Legg til fadderuke, pause events' (#83) from fall-2025 into main
Reviewed-on: #83
Reviewed-by: Peder Bergebakken Sundt <pederbs@pvv.ntnu.no>
2025-07-18 21:05:40 +02:00
felixalb de72342018 activities: disable recurring events for the summer 2025-07-17 23:39:56 +02:00
felixalb b54bbda71f index.php: add fadderuke 2025 poster 2025-07-17 23:35:07 +02:00
oysteikt 20bab54235 dist/simplesamlphp-authsources: set entityID for service provider 2025-03-19 01:34:39 +01:00
oysteikt c3d8ce017d shell.nix: find rootlevel in shell hook 2025-03-18 21:25:41 +01:00
oysteikt 02cfe9feaa pvv_mysql.sql: format 2025-03-18 21:18:24 +01:00
oysteikt 4d4ec78ea3 pvv_sqlite.sql: format 2025-03-18 21:17:36 +01:00
oysteikt a74ea31356 .envrc: init 2025-03-18 21:15:59 +01:00
oysteikt 0653672a17 shell.nix: add sql formatter 2025-03-18 21:15:59 +01:00
oysteikt 8a1ff1a265 dist/pvv.sql -> dist/pvv_sqlite.sql 2025-03-18 21:10:48 +01:00
oysteikt c1802e7cf2 treewide: strict comparisons 2025-03-12 01:09:08 +01:00
oysteikt 84de16fc25 shell.nix: fix simplesamlphp symlink 2025-03-12 00:43:22 +01:00
oysteikt 23b8e91a6c git blame ignore the formattening 2025-03-12 00:43:21 +01:00
oysteikt da8afe735c The formattening, part 2 2025-03-12 00:42:34 +01:00
oysteikt b6697e5750 The formattening, part 1 2025-03-12 00:20:04 +01:00
oysteikt ece3c8ab80 .php-cs-fixer: init 2025-03-12 00:19:41 +01:00
oysteikt 7297c83cea shell.nix: add some more tools 2025-03-11 22:28:54 +01:00
oysteikt 74662af3ef flake.lock: bump 2025-03-11 22:28:15 +01:00
oysteikt 32e147fd02 nix: php82 -> php84 2025-03-11 22:28:05 +01:00
oysteikt d5c28d4e0f package.nix bump vendorHash 2025-03-11 21:23:32 +01:00
oysteikt f1b3c63311 composer: bump deps 2025-03-11 20:37:24 +01:00
felixalb a4ebe6ded0 Vårsemester; Nå med events!
Revert "Reapply "Calendar: Remove recurring events for summer break 2024""

This reverts commit 2930f9863f.
2025-01-17 23:09:18 +01:00
felixalb 2930f9863f Reapply "Calendar: Remove recurring events for summer break 2024"
Christmas break 2024

This reverts commit e7b66b4bc6.
2024-12-21 23:32:29 +01:00
felixalb e7b66b4bc6 Revert "Calendar: Remove recurring events for summer break 2024"
This reverts commit ce99b309f8.
2024-09-01 19:45:59 +02:00
oysteikt c62f4d4705 www/tjenester: update wiki link for hjemmesider 2024-08-21 10:46:43 +02:00
oysteikt 814e5bc6c7 www/tjenester: move nettsiden from github to gitea 2024-08-21 10:46:43 +02:00
oysteikt f57edf60c1 flake.nix: remove abundant todos
One had already been fixed, the other one has been converted to a proper
issue on gitea
2024-08-21 07:37:08 +02:00
felixalb a29d3fe803 Err, try again 2024-08-17 23:59:17 +02:00
felixalb 8bcadd1d2d Merge pull request 'Replace deprecated functions to support php 8.3' (#68) from php83-fixes-fr-fr into master
Reviewed-on: #68
Reviewed-by: Oystein Kristoffer Tveit <oysteikt@pvv.ntnu.no>
2024-08-17 20:45:08 +02:00
felixalb 8a82e2795c Various: Replace deprecated functions to support php 8.3 2024-08-17 18:31:43 +02:00
felixalb 4ee8b73044 nix/shell: create slideshow dir 2024-08-17 01:35:14 +02:00
oysteikt 6580cfe546 Merge pull request 'treewide: flip arg order for implode()' (#63) from i-am-imploding into master
Reviewed-on: #63
Reviewed-by: Felix Albrigtsen <felixalb@pvv.ntnu.no>
2024-08-04 00:08:52 +02:00
oysteikt a0f9e71d46 treewide: flip arg order for implode() 2024-08-04 00:01:34 +02:00
oysteikt 6e4a79ed3d Merge pull request 'Calendar: Remove recurring events for summer break 2024' (#61) from calendar-disable-events into master
Reviewed-on: #61
2024-06-15 00:36:32 +02:00
felixalb ce99b309f8 Calendar: Remove recurring events for summer break 2024 2024-06-11 17:09:35 +02:00
felixalb 37445f42b5 Merge pull request 'Oppdater Matrix-server til Matrix Space™' (#50) from info-updates into master
Reviewed-on: #50
2024-05-30 21:19:42 +02:00
eirikwit 9717c11af5 Fix discord-server og matrix space 2024-05-30 21:19:29 +02:00
adriangl 2cab4df4b1 Merge pull request 'fix: updated spaceapi coords' (#60) from adriangl-patch-spaceapi-coords into master
Reviewed-on: #60
2024-05-19 22:25:52 +02:00
adriangl 18c8426246 fix: updated spaceapi coords 2024-05-19 22:09:37 +02:00
oysteikt 4890a0af04 nix/module: fix spaceapi endpoint 2024-05-19 20:06:22 +02:00
felixalb 7bf2c31db3 feat: adds spaceapi endpoint (#57)
A basic implementation of the https://spaceapi.io/ specification.
Tested working door sensor status. Added basic info about us, our website, git forge and wiki.

Co-authored with @sindos and @oysteikt.

Reviewed-on: #57
Co-authored-by: Felix Albrigtsen <felix@albrigtsen.it>
Co-committed-by: Felix Albrigtsen <felix@albrigtsen.it>
2024-05-18 20:05:13 +02:00
adriangl 13a6df92ce Merge pull request 'Gitea istedenfor gogs på tjenester-siden' (#56) from gitea-i-tjenester into master
Reviewed-on: #56
2024-05-11 22:55:36 +02:00
adriangl f87c6820d7 services: move gitea above github and remove trac 2024-05-07 21:31:42 +02:00
adriangl 592c6d46c4 services: replaced gogs with gitea 2024-05-07 21:31:20 +02:00
felixalb 9d9d99e6ba gallery: sort by timestamp. slideshow: fix transition bug on firefox 2024-04-14 01:59:12 +02:00
oysteikt 216e153f89 nix/module: correct some nginx locations directives 2024-04-11 13:19:59 +02:00
felixalb d528df5f99 Merge pull request 'Fix links after moving from spikkje to bekka' (#55) from www2-www-fixes into master
Reviewed-on: #55
2024-04-11 00:43:32 +02:00
felixalb faf93cc45a Fix links after moving from spikkje to bekka 2024-04-11 00:42:12 +02:00
felixalb 1aa4f4fc8a Merge pull request 'Mega PR: Update deps, consolidate config, build with nix, gallery fixes, etc.' (#53) from nixify-ng into master
Reviewed-on: #53
2024-04-10 21:45:10 +02:00
felixalb f1958d9afc galleri: Support .thumbnails 2024-04-10 21:44:58 +02:00
felixalb 7f269f05d6 gallery: Fix usernames/paths in the gallery 2024-04-10 21:44:58 +02:00
oysteikt 7e158c9fc3 Update dependencies 2024-04-10 21:44:58 +02:00
oysteikt d79cd3ad37 dist/pvv.sql: fix failing parts 2024-04-10 21:44:58 +02:00
felixalb f5a6868301 Build new nix {module,package,flake}. Adapt to new config variables
Co-authored-by: h7x4 <h7x4@nani.wtf>
2024-04-10 21:44:58 +02:00
felixalb 310246dd20 Update global config variables 2024-04-10 21:44:58 +02:00
felixalb 151a0d44f6 move gallery/slideshow directories 2024-04-10 21:44:58 +02:00
felixalb 10c70e89f6 Remove 'ticker', deprecated since 1da1785e46 2024-04-10 21:44:58 +02:00
felixalb 318e9cfe6b Update dependencies, fix broken flake 2024-04-10 21:44:58 +02:00
felixalb 1f60b80b98 move sql_config.php to config.php 2024-04-10 21:44:58 +02:00
felixalb 517f39eee9 Update SimpleSamlPHP 2024-04-10 21:44:58 +02:00
felixalb 2f6553225a remove deprecated options and dependencies for dataporten/oauth 2024-04-10 21:44:58 +02:00
felixalb 1eb84eaec8 Merge pull request 'Fix navbar links' (#54) from fix-navbar-links into master
Reviewed-on: #54
2024-04-10 21:38:58 +02:00
oysteikt 3e1a21741f navbar: redirect webmail to modern roundcube 2024-04-08 23:46:28 +02:00
oysteikt da6c1963f8 navbar: redirect wiki to wiki.pvv.ntnu.no 2024-04-08 23:43:06 +02:00
felixalb 0da5d44ea1 Manually cast door state to int (#49) 2023-09-12 20:31:14 +02:00
felixalb 133c4e269d Re-enable recurring events for Fall 2023 (#48) 2023-09-02 21:25:07 +02:00
felixalb 850c8da95a Initial nix flake, automate devshell (#47) 2023-09-02 19:55:24 +02:00
eirikwit 1ae6356aa5 Update contact information (#46)
* Update contact information

* Minor fixes to contact page

---------

Co-authored-by: Felix Albrigtsen <felix@albrigtsen.it>
2023-08-20 01:31:53 +02:00
felixalb fa4fa9ad7d Stop bots scraping mediawiki special pages/diffs/history (#45) 2023-06-14 23:26:28 +02:00
felixalb d43e5faf3c Summer break; Disable recurring events (#44) 2023-06-11 22:19:14 +02:00
felixalb 57055c9c6f Fix previous merge (#43)
The previous merge contained a commit and a revert, but the original change remained on master.
2023-04-27 16:05:14 +02:00
felixalb 5fbc1dbc00 Re-enable brettspillkveld (#42)
* Re-add brettspillkveld

Plz fix #40
2023-04-27 16:01:40 +02:00
felixalb e364a5fee0 Stop including BrettspillActivity (#41)
Temporary until april 23
2023-04-17 01:21:15 +02:00
oysteikt a4a6553329 Merge pull request #39 from Programvareverkstedet/add-thunderbird-autoconfig
Add thunderbird autoconfig to .well-known
2023-02-25 23:28:10 +01:00
oysteikt ae81d269fa Add thunderbird autoconfig to .well-known
This file will make it easier for people to set up thunderbird with a
pvv mail.

Relevant links:
- https://wiki.mozilla.org/Thunderbird:Autoconfiguration
- https://wiki.mozilla.org/Thunderbird:Autoconfiguration:ConfigFileFormat
2023-02-25 23:10:34 +01:00
felixalb 31d9a955df Merge pull request #37 from Programvareverkstedet/patch
Various patches; Fix admin groups, update deps
2023-01-19 13:58:10 +01:00
felixalb 6bd3ce7731 Add notice on empty image gallery 2023-01-19 13:46:39 +01:00
felixalb 9f45271b18 Update deprecated template syntax 2023-01-19 11:28:29 +01:00
felixalb 567962c947 Fix admins addGroup and removeGroup, missing parameter 2023-01-19 11:27:48 +01:00
felixalb 7defd8b388 Update minor dependency changes 2023-01-19 11:26:56 +01:00
felixalb a7f2c4f2d3 Merge pull request #36 from Programvareverkstedet/linkdash 2023-01-16 16:27:28 +01:00
felixalb 847fe67534 Merge pull request #35 from Programvareverkstedet/2023events 2023-01-16 16:26:01 +01:00
felixalb 79854aee6f Improved linkdash-minecraft-map 2023-01-16 16:22:53 +01:00
felixalb 699876405c Inverted week offset on recurring events 2023-01-16 16:20:54 +01:00
felixalb a734fe6bd3 Add brettspill, drift and hack activities 2023-01-16 14:18:30 +01:00
felixalb c33736a501 Fix minecraft map link 2023-01-16 14:09:09 +01:00
bjornoka 3a39ca0f73 Merge pull request #34 from Programvareverkstedet/linkdash
Add wrapper to services page, fix css and favicon
2022-11-29 17:56:29 +01:00
felixalb d8f8aafdd9 Add wrapper to services page, fix css and favicon 2022-11-29 17:52:39 +01:00
bjornoka 79ffb1fff5 Merge pull request #33 from Programvareverkstedet/linkdash
Fix top margin on services
2022-11-29 17:35:56 +01:00
felixalb 29c4c67645 Fix top margin on services 2022-11-29 17:31:22 +01:00
bjornoka 98da6ada23 Merge pull request #32 from Programvareverkstedet/linkdash
Added linkdash - list of our services
2022-11-29 17:26:10 +01:00
felixalb 1c1656c3bc Added photo gallery to services list 2022-11-29 17:14:03 +01:00
felixalb c489f303ea Add services, fix column styling 2022-11-29 17:07:36 +01:00
amalieem fc0286c277 Merge pull request #31 from Programvareverkstedet/calenderFix
Disabled brettspillkveld and hackekveld
2022-11-27 10:14:21 +01:00
amalieem f4407fde4a Disabled brettspillkveld and hackekveld 2022-11-19 21:23:41 +01:00
felixalb 9f11d442fe Merge pull request #30 from Programvareverkstedet/video-til-karusell
Replace promo video with slideshow
2022-11-05 20:51:12 +01:00
alekskn 1bc41124c0 Replace promo video with slideshow 2022-11-05 19:06:22 +01:00
bjornoka 72fb9e9915 Merge pull request #28 from Programvareverkstedet/brettspillkveld
Added brettspillkveld
2022-09-24 22:05:21 +02:00
bjornoka b555f915a0 Added brettspillkveld 2022-09-24 21:58:28 +02:00
felixalb 4b9957e9c5 Add more services, make two columns 2022-09-18 01:24:57 +02:00
felixalb b42214b404 Establish layout for /tjenester 2022-09-17 17:09:35 +02:00
felixalb fcef05d439 Merge pull request #27 from Programvareverkstedet/calendar-changes
Add driftkveld and hackekveld
2022-09-04 00:56:41 +02:00
felixalb 0f8b15715b Add driftkveld and hackekveld 2022-09-04 00:53:30 +02:00
felixalb 8a79d9d016 Merge pull request #26 from Programvareverkstedet/video-embed
Replace old promo-video in /om/
2022-08-09 21:17:18 +02:00
felixalb f507b0cddd Replace old promo-video in /om/ 2022-08-09 20:53:24 +02:00
felixalb 0b25f8d54a Merge pull request #25 from Programvareverkstedet/video-embed
Front page: Fix missing closing tag
2022-08-08 19:55:44 +02:00
felixalb 4f504e9456 Fix missing closing tag 2022-08-08 19:53:37 +02:00
felixalb 1f32c03d86 Merge pull request #23 from Programvareverkstedet/video-embed
Replace slideshow with promo video
2022-08-08 17:24:53 +02:00
felixalb fc6d5d5f8e Update CSS to preserve video aspect ratio 2022-08-08 16:36:58 +02:00
felixalb 1cde0a2a93 Replace slideshow with promo video 2022-08-08 15:43:23 +02:00
torsteno 65c0bad9b0 Merge pull request #21 from Programvareverkstedet/calendarChanges
Removed driftskveld
2022-05-26 16:16:52 +02:00
felixalb 9fa6066724 Removed driftskveld temporarily 2022-05-26 14:08:41 +02:00
felixalb a506dc44cc Merge pull request #20 from Programvareverkstedet/origin/calendarChanges
Removed hackekveld temporarily
2022-03-26 20:39:46 +01:00
felixalb a80114be7a Removed hackekveld temporarily 2022-03-26 20:34:05 +01:00
felixalb ab6edd92e1 Merge pull request #19 from Programvareverkstedet/calendarChanges
Lagt til hackekveld fjerdehver uke
2022-03-15 13:11:13 +01:00
felixalb 6070cf4bd3 Lagt til hackekveld fjerdehver uke 2022-02-17 16:04:42 +01:00
pederbs fdd1d12e9e allow uppercase file extensions 2022-01-31 12:32:33 +01:00
pederbs 6cae4cb0e2 :) 2022-01-29 22:54:52 +01:00
pederbs 15c9431c10 remove nerdepitsa
no-one whent there
2022-01-29 19:34:13 +01:00
felixalb 500ea63c77 Merge pull request #17 from Programvareverkstedet/AddDriftkveld
Added biweekly driftkveld
2022-01-29 19:33:54 +01:00
torsteno bbe51e702b Added biweekly driftkveld 2022-01-29 19:21:16 +01:00
felixalb ab1bbdd3df Forgot login 2022-01-25 16:23:14 +01:00
felixalb 893f57c9b7 Forgot to remove line 2022-01-25 15:08:37 +01:00
felixalb 184d40266b Clarify dependencies 2022-01-25 15:06:27 +01:00
felixalb 516287ee85 redo css, adaptive scaling 2022-01-25 15:04:00 +01:00
felixalb 3335f5958e Fix typos and missing gitignore 2022-01-25 10:06:59 +01:00
felixalb a7d7ce4da0 Fix typos and missing gitignore 2022-01-25 09:28:42 +01:00
felixalb 1711ce2e5d Fix typo and missing gitignore 2022-01-25 09:22:50 +01:00
felixalb 31e104a150 Merge pull request #16 from Programvareverkstedet/gallery
Gallery of user images on the home page
2022-01-25 09:07:29 +01:00
felixalb c57276b779 Performance, input sanitization, cleanup 2022-01-25 09:05:34 +01:00
felixalb 9e7436684c Modal view, navbar, js folder structure 2022-01-24 16:12:31 +01:00
felixalb a500b5eecc Started visual gallery, expanded fetch-script 2022-01-24 00:22:14 +01:00
felixalb fb5b66f12b Script for fetching pictures from home folders 2022-01-23 01:34:48 +01:00
pederbs e7f9799285 PIIIIIITSAAAAA 2021-11-19 22:44:24 +01:00
felixalb 25212940dd lib/OAuth2-Client: Update submodule 2021-10-25 23:09:21 +02:00
Charlie Root a1d56570b1 Merge branch 'master' of https://github.com/programvareverkstedet/nettsiden 2021-10-17 05:57:17 +02:00
felixalb 15f2154f6a gitignore gallery photos 2021-10-17 05:54:47 +02:00
Charlie Root 6b81b0785f Cleaned gitignore, gallery photos 2021-10-17 05:52:43 +02:00
felixalb 6b243ad91b Added matrix serverfile 2021-10-17 05:43:25 +02:00
felixalb 63e49417a7 UU fix for door sensor 2021-10-13 22:15:35 +02:00
felixalb 6c891b3f79 New door-graph, Improved slideshow, moved video 2021-10-13 10:10:17 +02:00
felixalb a4ce890a36 Testing door sensor graphing 2021-10-11 16:23:18 +02:00
felixalb 2ba0266fca Fix folder structure pt3 2021-10-10 22:11:44 +02:00
felixalb 9f3812b8a5 Fix folder structure pt2 2021-10-10 22:03:36 +02:00
felixalb a9ee7cd6f7 Fix folder structure pt1 2021-10-10 22:02:50 +02:00
felixalb 1c4eb5cfe4 Replaced video with slideshow 2021-10-10 22:01:27 +02:00
felixalb 9162ee70a7 Outdated banner on nerdepitsa 2021-10-05 18:08:19 +02:00
felixalb bdbab5be9e Mobile friendly styling 2021-09-28 00:48:27 +02:00
felixalb 0d87d37c72 Oppdatert romnummer og kontaktinformasjon 2021-09-27 23:37:10 +02:00
pederbs 728f8a6179 Woa, testing a PR on windows was fun 2021-09-08 22:38:17 +02:00
pederbs 8fd03c9824 Merge pull request #15 from Programvareverkstedet/doorsensor
Uploaded door sensor
2021-09-08 22:23:37 +02:00
felixalb fdbbaee175 Handled suggestions -pullrequestreview-749376540 2021-09-08 21:29:36 +02:00
felixalb 9dad49738c Uploaded door sensor 2021-09-04 14:56:48 +02:00
eirikwit 0336236fda Removed recurring events for now 2021-08-17 18:38:31 +02:00
pederbs 9a5e444041 mobile layout 2021-08-13 14:15:54 +02:00
eirikwit cfeba9f8da fixed cache issue 2021-08-12 22:35:50 +02:00
eirikwit 9691433917 Put video on homepage 2021-08-12 22:33:09 +02:00
pederbs db6af95063 Bugfix 2021-08-12 13:44:47 +02:00
pederbs cd1792c130 Add instructions for adding yourself as admin 2021-08-12 13:44:22 +02:00
pederbs dc99df21c2 add .gitattributes 2021-08-12 12:50:01 +02:00
pederbs ecf40334e4 Update dependencies 2021-08-11 22:29:06 +02:00
pederbs e1686cd8c5 Add dockerfile for local development 2021-08-11 22:28:48 +02:00
dependabot[bot] 06bfa81d6e Bump phpmailer/phpmailer from 6.1.6 to 6.5.0
Bumps phpmailer/phpmailer from 6.1.6 to 6.5.0.

---
updated-dependencies:
- dependency-name: phpmailer/phpmailer
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-24 15:37:53 +02:00
torsteno 5ade47f6dd Merge pull request #13 from Programvareverkstedet/driftkveld
Fast driftkveld i kalender
2021-03-16 21:13:42 +01:00
torsteno 7b237f1656 WIP: Fikset typo i include 2021-03-16 21:09:28 +01:00
pederbs 80198d0d98 Make dev.sh download gitmodules
Untested, it'll probably work
2021-03-16 20:49:36 +01:00
torsteno 3c24435688 WIP: driftkveld i kalenderen 2021-03-16 20:26:38 +01:00
pederbs b50a4a7ad4 Improve readme even more 2021-03-16 20:07:56 +01:00
pederbs 523b30d6f5 Fix dev.sh 2021-03-16 20:00:47 +01:00
pederbs 06e530061d Update readme 2021-03-16 20:00:02 +01:00
pederbs c0c324217c Merge pull request #12 from Programvareverkstedet/dependabot/composer/symfony/http-kernel-4.4.13
Bump symfony/http-kernel from 4.4.7 to 4.4.13
2020-09-04 23:59:08 +02:00
sondrhel 9b3735ea75 edit "veibeskrivelse" link 2020-09-03 21:25:43 +02:00
sondrhel 9997b8fca9 Merge branch 'master' of https://github.com/Programvareverkstedet/nettsiden 2020-09-03 20:39:58 +02:00
sondrhel 27986e0b1d Update room location and animekveld information 2020-09-03 20:37:55 +02:00
emmalei fe129fe1b0 updated veibeskrivelse to new location at oppredning/gruvedrift 2020-09-03 20:01:01 +02:00
emmalei e08b23be05 updated veibeskrivelse to new location at oppredning/gruvedrift 2020-09-03 19:46:34 +02:00
dependabot[bot] 089b34833b Bump symfony/http-kernel from 4.4.7 to 4.4.13
Bumps [symfony/http-kernel](https://github.com/symfony/http-kernel) from 4.4.7 to 4.4.13.
- [Release notes](https://github.com/symfony/http-kernel/releases)
- [Changelog](https://github.com/symfony/http-kernel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/symfony/http-kernel/compare/v4.4.7...v4.4.13)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-03 09:11:16 +00:00
dependabot[bot] 995b8d7ae7 Bump phpmailer/phpmailer from 6.1.5 to 6.1.6
Bumps [phpmailer/phpmailer](https://github.com/PHPMailer/PHPMailer) from 6.1.5 to 6.1.6.
- [Release notes](https://github.com/PHPMailer/PHPMailer/releases)
- [Changelog](https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md)
- [Commits](https://github.com/PHPMailer/PHPMailer/compare/v6.1.5...v6.1.6)

Signed-off-by: dependabot[bot] <support@github.com>
2020-05-28 16:07:46 +02:00
pederbs d248c94a3d Merge pull request #10 from Programvareverkstedet/dependabot/composer/simplesamlphp/simplesamlphp-1.18.6
Bump simplesamlphp/simplesamlphp from 1.18.4 to 1.18.6
2020-04-24 18:47:29 +02:00
dependabot[bot] d3584dae44 Bump simplesamlphp/simplesamlphp from 1.18.4 to 1.18.6
Bumps [simplesamlphp/simplesamlphp](https://github.com/simplesamlphp/simplesamlphp) from 1.18.4 to 1.18.6.
- [Release notes](https://github.com/simplesamlphp/simplesamlphp/releases)
- [Changelog](https://github.com/simplesamlphp/simplesamlphp/blob/v1.18.6/docs/simplesamlphp-changelog.md)
- [Commits](https://github.com/simplesamlphp/simplesamlphp/compare/v1.18.4...v1.18.6)

Signed-off-by: dependabot[bot] <support@github.com>
2020-04-22 21:01:55 +00:00
pederbs a45eaab050 Merge pull request #9 from Programvareverkstedet/dependabot/composer/symfony/http-foundation-4.4.7
Bump symfony/http-foundation from 4.4.3 to 4.4.7
2020-04-03 13:35:19 +02:00
dependabot[bot] c6795dc1bf Bump symfony/http-foundation from 4.4.3 to 4.4.7
Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.4.3 to 4.4.7.
- [Release notes](https://github.com/symfony/http-foundation/releases)
- [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md)
- [Commits](https://github.com/symfony/http-foundation/compare/v4.4.3...v4.4.7)

Signed-off-by: dependabot[bot] <support@github.com>
2020-03-31 15:09:04 +00:00
pederbs d1734e8762 Broen er oppe 2020-02-28 16:26:57 +01:00
dependabot[bot] 69582db88f Bump simplesamlphp/simplesamlphp from 1.15.4 to 1.18.4
Bumps [simplesamlphp/simplesamlphp](https://github.com/simplesamlphp/simplesamlphp) from 1.15.4 to 1.18.4.
- [Release notes](https://github.com/simplesamlphp/simplesamlphp/releases)
- [Changelog](https://github.com/simplesamlphp/simplesamlphp/blob/master/docs/simplesamlphp-changelog.md)
- [Commits](https://github.com/simplesamlphp/simplesamlphp/compare/v1.15.4...v1.18.4)

Signed-off-by: dependabot[bot] <support@github.com>
2020-01-29 15:54:39 +01:00
dependabot[bot] 66eb6f0907 Bump robrichards/xmlseclibs from 3.0.1 to 3.0.4
Bumps [robrichards/xmlseclibs](https://github.com/robrichards/xmlseclibs) from 3.0.1 to 3.0.4.
- [Release notes](https://github.com/robrichards/xmlseclibs/releases)
- [Changelog](https://github.com/robrichards/xmlseclibs/blob/master/CHANGELOG.txt)
- [Commits](https://github.com/robrichards/xmlseclibs/compare/3.0.1...3.0.4)

Signed-off-by: dependabot[bot] <support@github.com>
2019-11-19 11:19:09 +01:00
pederbs 74e86ded33 Add Afterlogic Lite mail 2019-09-02 17:42:24 +02:00
pederbs ea7c33cb8e Add git.pvv.ntnu.no to the website 2019-04-08 19:34:31 +02:00
pederbs 5ad772fc26 Add white rasterized logo 2019-04-01 19:36:19 +02:00
pederbs 39126936b0 Fix bug with single digit dates 2018-10-25 00:32:04 +02:00
pederbs c549890b7e Add info on Aktive, and some links pointing to the wiki 2018-09-21 19:39:54 +02:00
pederbs 09d5ebc249 Update kontaktinformasjon to point towards the wiki 2018-09-09 17:46:09 +02:00
pederbs ead8f3a19c Add payment info to /paamelding/ 2018-09-06 13:31:54 +02:00
pederbs c3ada63c69 Whoops
I really feel like doing a commit ammend with force push...
2018-08-29 19:18:22 +02:00
pederbs eb39821f20 Fix some cases of overflowing hendelse text breaking styles here and there 2018-08-29 19:12:39 +02:00
pederbs 59463ebdfb Fix bug where days with string length 1 would break mysql 2018-08-29 19:03:05 +02:00
pederbs d1612e2804 Fix utf8 and JSON issues resulting from MYSQL being weird 2018-08-24 13:53:18 +02:00
pederbs 07c1a90845 Whoops again 2018-08-24 13:24:42 +02:00
pederbs d0613a8734 Whoops 2018-08-24 12:41:28 +02:00
pederbs dd2ca22bba Add door sensor REST api
We have yet to add the door states to the frontpage or something
2018-08-24 12:28:06 +02:00
pederbs 69ed1df0d1 Change casing on frontpage activities 2018-08-23 19:09:58 +02:00
pederbs 386b0bfcbf Fix spacing on project info pages on smaller mobiles 2018-08-23 16:05:35 +02:00
markuswh 2b3d6d7026 Add info pages for individual events 2018-08-19 15:33:10 +02:00
markuswh b29106bcbe Touch up project info member list
Small stuff like not showing the members title when there are no members, hiding leave/join buttons to the owner, etc.
2018-08-19 14:51:08 +02:00
markuswh 6cc8e5e0da Don't show projects you don't own in my projects 2018-08-19 14:44:44 +02:00
pederbs 221f61c496 Fix kalender button overlaying with header on hendelser on mobile 2018-08-14 22:55:36 +02:00
pederbs f37919c850 Fix subtext on hendelser page on mobile 2018-08-14 22:53:30 +02:00
pederbs d3234d0204 Fix hendelses page on mobile 2018-08-14 22:47:25 +02:00
pederbs 6d13f47815 Set theme-color to #024 2018-08-14 03:29:10 +02:00
pederbs e54142021a Tweak project edit page, making it use the available space better and react better 2018-08-14 03:25:24 +02:00
pederbs cc2241f71a Make the project info page mobile friendly 2018-08-14 02:53:11 +02:00
pederbs cb9283be16 Move rainloop to the left, making it the first choice on mobile
The rainloop mobile interface is actually pretty good.
2018-08-14 02:26:22 +02:00
pederbs 22a08bfb04 Make the awesome carrier pidgin respect my phone 2018-08-14 02:24:07 +02:00
pederbs 2f22451fa6 Make labels in list of webmail clients have larger text 2018-08-14 02:10:21 +02:00
pederbs 7dc892b757 Ensure all pages react to mobile browsers
In addition: add <header> to all pages
2018-08-14 02:09:57 +02:00
pederbs 7b08ea6a22 Remove old PR and trikom project pages 2018-08-14 02:02:28 +02:00
pederbs fc35b804e4 Make the buttons on the landing page a little less intrusive 2018-08-13 19:07:08 +02:00
pederbs 376c7ad890 Fix markdown header formatting in motd 2018-08-13 18:57:26 +02:00
pederbs 9f7ef8bdb1 Remove debug statement from motd editor 2018-08-13 18:57:07 +02:00
pederbs d4bdad8d5e Fix /hendelser styling for events with no body 2018-08-13 18:48:03 +02:00
pederbs 7669566f81 Expand agenda->getNextDays() to include events on current day which have passed. 2018-08-13 18:47:17 +02:00
pederbs 023b53fa95 Remove old admin interface logo 2018-08-13 18:33:37 +02:00
pederbs 17ef9288ef Replace the awesome carrier pidgin with something a little less watermarked 2018-08-12 03:57:31 +02:00
pederbs a600f8170a Fix webmail title 2018-08-12 03:57:22 +02:00
pederbs 1540292458 Delete two unnused pages 2018-08-12 03:56:58 +02:00
pederbs 3dc3b37044 Minor styling tweaks 2018-08-12 03:56:45 +02:00
pederbs 52a50017c6 Hide unnused <header>s for now 2018-08-12 03:56:18 +02:00
pederbs fbcae7b67d Fix pagination buttons and mobile view of kalender 2018-08-12 03:55:41 +02:00
pederbs 69dcc15bea Fix navbar in brettspill 2018-08-12 03:55:04 +02:00
pederbs 31a7470b37 Fix aktiviter in mobile mode 2018-08-12 03:54:39 +02:00
pederbs 79e413d194 Switch to useing markdown for user formatted text 2018-08-12 03:52:55 +02:00
pederbs 307eba4218 Disallow visiting unexisting project pages 2018-08-12 03:43:50 +02:00
pederbs 5ef3bc68a0 Revert pagesize test value commited in 5205a3f0 2018-08-12 00:59:28 +02:00
pederbs 5205a3f095 Fix filter and pagination combo on admin event page 2018-08-12 00:52:34 +02:00
pederbs 309e308518 My solution is better 2018-08-10 23:51:34 +02:00
yorinad 90297af982 Change design for project cards 2018-08-10 23:30:36 +02:00
yorinad e1e053af27 Make image borders sharper 2018-08-10 23:24:08 +02:00
yorinad e72bd066be Prevent wrong aligning of calendar items on the homepage 2018-08-10 23:20:32 +02:00
yorinad 474895c2a3 Make shadow behind user menu semi-transparent 2018-08-10 23:13:52 +02:00
yorinad 1066f42861 User menu on hover 2018-08-10 22:37:26 +02:00
yorinad 928647e6cc Move user button before user menu, for later CSS changes 2018-08-10 22:30:01 +02:00
yorinad 47c8ac90cb Larger line height for events to make it look less compressed 2018-08-10 22:22:04 +02:00
yorinad 618c7c3eef Make image borders sharper 2018-08-10 22:19:25 +02:00
yorinad 2c2d1ab446 Replace Raleway with Lato 2018-08-10 22:19:14 +02:00
pederbs 88e258a0fb Add some HTML5 doctypes 2018-08-10 00:20:03 +02:00
pederbs 29a41f5ad8 Fix admin event editor
The date field was a lot of work, but it's a lot easier to use now.
2018-08-10 00:19:16 +02:00
pederbs 13518f7fff Fix admin event list style 2018-08-10 00:18:28 +02:00
pederbs 90ece46dd7 Minor tweaks to design, labels and navbar 2018-08-09 22:28:34 +02:00
pederbs d92e53f0b7 Disallow invalid event dates.
this froze the simpleevent class
2018-08-09 22:27:28 +02:00
pederbs b965da0a6c Add ability to join and leave groups, get row id in a way supported by both mysql and sqlite 2018-08-09 00:50:31 +02:00
pederbs a63bc3e6a9 Fix the project editor and a delete feature 2018-08-09 00:48:53 +02:00
pederbs 1147c1a7af Fix the filter in Mine Projekter to seach description and pagination
I also expanded the page size from 4 to 8
2018-08-09 00:46:36 +02:00
pederbs 34668cb0ea Make it possible to view projects in more detail 2018-08-09 00:45:06 +02:00
pederbs adab82964d Update animekveld and nerdepitsa sales pitches 2018-08-09 00:43:22 +02:00
pederbs 21390d8ce8 Fix /mail navbar 2018-08-09 00:42:36 +02:00
pederbs 6601ec041e Make list of projects look nice. Added Drift and Styret on the top 2018-08-09 00:41:54 +02:00
pederbs 4445f659a7 Fix ugly form submit buttons
Chrome, and maybe other browsers, for some reason add a border to these
2018-08-09 00:34:41 +02:00
pederbs 202f2ce12a Disable annoying navbar behaviour
Navbar would link to the url "#" if the buttons is "active". Being nested inside some menu is annoying when you want to return to the toplevel
2018-08-09 00:33:14 +02:00
pederbs 734a3b023f Add an awesome carrier pidgin to the Kontakt page 2018-08-09 00:32:44 +02:00
pederbs be5b1d7b81 Fix webpages being larger than the viewport despite being empty 2018-08-07 00:30:34 +02:00
pederbs cb3949f6e8 Fix changing user permissions. usernames with _ in them would be split into multiple users
This page is utterly broken and deserves a rewrite.
delimiting fields with "_" is a bad idea.
But i'm too lazy to be bothered. Don't call me when the db breaks
2018-08-06 23:33:04 +02:00
pederbs f5c088fdc1 Remove kalender and aktiviteter from navbar, add Hendelser. Change webmail to /mail
Finally
2018-08-06 23:34:54 +02:00
pederbs 6c7241a2ac Add /mail
This page will replace the current webmail subdomain
2018-08-06 23:34:52 +02:00
pederbs 8dcc899c34 Add "Kalender" button to /hendelser
Makes navigation a bit more intuitive. The label is subject to change.
It might even be changed from a button style link to a normal link.
2018-08-06 23:34:09 +02:00
pederbs 32cc4ec27f Fix MOTD
It now won't require there to be at least one entry in the motd table.
I also tidied up the motd class
2018-08-06 23:33:32 +02:00
pederbs 29ac0ece7e Add /PNG and /pvv.svg
This page was not checked into the git repository. Untracked files in the git repo on the server makes my head hurt
2018-08-06 23:33:04 +02:00
pederbs 3117f466b5 Update dependencies and dist files 2018-03-05 19:20:22 +01:00
markuswh 9fec2d56f4 Don't allow people who don't own a project to update it 2018-02-26 16:26:10 +01:00
markuswh e60195d431 Migrate project owners to the project member table
... to keep project membership tidy and centralized
This puts organizer fitlers out of commission for now
2018-02-26 16:24:50 +01:00
markuswh 54467ab9b9 Small project member related fixes 2018-02-24 21:09:31 +01:00
markuswh 30c8aa2032 Groundwork for project members
Tools for adding/removing members are coming soon (tm)
2018-02-24 21:09:15 +01:00
markuswh d984dfb89c Begin work on project pages
Also store project owners' emails as contact info
2018-02-24 19:41:57 +01:00
markuswh 63200f863b Fix login button font when not active 2018-02-24 19:23:27 +01:00
markuswh 2a3f0d7be7 Add MOTD table to SQL schema 2018-02-24 19:20:34 +01:00
markuswh 5412414ce1 Assimilate hendelser into the new standard 2018-02-24 17:56:42 +01:00
markuswh ebe3ce0e1e Better text breaking on hendelser 2018-02-24 17:49:17 +01:00
markuswh 43fb843b17 Fix missing p tag without violating the purity of plaintext 2018-02-24 17:45:51 +01:00
markuswh 3ccaf69549 Fix påmelding
screwed this up during merge prep, it ended up with basically the same content twice
2018-02-24 17:30:56 +01:00
markuswh ec69d5f724 Merge pull request #2 from halworsen/redesign
New design
2018-02-24 17:15:31 +01:00
markuswh 6777048dac Fix login button on all pages
By passing PDO to the login bar so admins get their link
2018-02-24 17:02:00 +01:00
markuswh 3832d3fde0 Fix project description error in my projects page 2018-02-24 16:57:38 +01:00
markuswh 32f9653a6d Prepare for merge 2018-02-24 16:53:17 +01:00
pederbs 48d79f2635 Design tweaks 2018-02-20 20:45:03 +01:00
pederbs 54428c2bab Tweak calendar design 2018-02-20 20:31:28 +01:00
pederbs 4ca408b8fe Add colors to events and day-numbers in calendar 2018-02-20 20:07:32 +01:00
pederbs 550161bba2 Add colors to each event in hendelse 2018-02-20 19:36:06 +01:00
pederbs f6174706f8 Started work on /hendelser/
This may replace /aktiviteter/ and /kalender/ in the navbar, and further link to those two
2018-02-20 18:57:38 +01:00
pederbs c2374d999d Fix bug with simpleevents where the description didn't start with <p> tags 2018-02-20 18:56:02 +01:00
pederbs 66504057b2 Fix bug in /aktiviteter/ when viewing a spesific date 2018-02-20 16:18:43 +01:00
pederbs f3b95fe641 Fix bug with webmail link in navbar not working
the webmail link in the  navbar didn't work properly on other pages than the frontpage, due to prepending a "../" to the external link
2018-02-19 15:48:51 +01:00
pederbs b016d27adb Fix /nerdepitsa and /anime navbar 2018-02-17 17:25:30 +01:00
markuswh d44cf95736 Create MOTD table in SQL setup 2018-02-17 13:58:57 +01:00
markuswh cf058dc7a9 Project cards 2018-02-14 17:56:19 +01:00
markuswh 9f935cd810 Implode with <br> 2018-02-14 17:55:41 +01:00
yorinad e88411eea4 Make the top menu as wide as possible 2018-02-13 23:15:51 +01:00
yorinad 0bce2053cf Fix missing namespace 2018-02-13 19:19:32 +01:00
yorinad 1d65cab11d Add hover effect for user menu 2018-02-13 19:17:09 +01:00
yorinad 8f2299cee5 Fix regression where login button was not enabled when menu is open 2018-02-13 19:14:41 +01:00
yorinad ba0fe09d06 Workaround for PHP 5 2018-02-13 19:10:47 +01:00
yorinad 73efba625b Add a central include file 2018-02-13 19:08:41 +01:00
yorinad f2b75c81c1 Make sure that the user menu appears over the login button 2018-02-13 18:52:38 +01:00
yorinad 060d37c040 Better styling of the user menu 2018-02-13 18:44:36 +01:00
yorinad 24b6af1799 Add admin button to user menu, if admin 2018-02-13 18:30:49 +01:00
yorinad edde8b6927 Prevent strange jumping when opening menu, and add hover effects 2018-02-13 18:17:41 +01:00
yorinad 528ea62f38 Set link to anchor for current page, to easily dismiss menu 2018-02-13 17:24:08 +01:00
markuswh 87c6523f35 Responsive design for landing page content 2018-02-13 17:23:21 +01:00
yorinad a4b01d1259 Add link to favicon 2018-02-13 17:11:39 +01:00
yorinad f811286e52 Align login menu 2018-02-13 17:11:11 +01:00
yorinad c38932046a Small alignment fix 2018-02-13 17:05:09 +01:00
markuswh f2a14f3791 Only show MOTD title if it is set 2018-02-13 17:02:03 +01:00
yorinad 53af8dae44 Fix a regression where it is hard to close the menu on mobile 2018-02-13 17:00:01 +01:00
markuswh 1db31b9e56 Add MOTD 2018-02-13 16:58:54 +01:00
markuswh af97383e01 last one of these i promise 2018-02-13 16:54:39 +01:00
yorinad c12f38f133 No user menu when not logged in 2018-02-13 16:51:43 +01:00
yorinad e7f11aee54 Improve login/logout buttons 2018-02-13 16:48:00 +01:00
markuswh 98f882233c Implode project description everywhere else
Forgot these
2018-02-13 16:41:03 +01:00
markuswh 5e10d53c36 Fix newlines in project descriptions 2018-02-13 16:28:59 +01:00
yorinad fe1e012db3 Add login icon 2018-02-13 16:24:16 +01:00
yorinad e93b07f890 Strange hack when using position:absolute 2018-02-13 16:11:14 +01:00
yorinad 46eed1c223 Make navbar absolute positioned, so it scrolls 2018-02-13 16:07:28 +01:00
yorinad 1e973c31b2 Concentrate position statement in one rule 2018-02-13 16:06:54 +01:00
yorinad 84b6b60a37 Use CSS tables for the navbar 2018-02-13 16:01:19 +01:00
markuswh 774f2754a0 Remove rogue header tag 2018-02-13 15:51:57 +01:00
markuswh 89ce6773a8 Redo landing page main body
MOTD is WIP
2018-02-13 15:50:45 +01:00
yorinad 1f2de139eb Add McDonalds menu 2018-02-13 15:24:27 +01:00
yorinad 4efe0aaefa Capitalize menu items 2018-02-13 15:23:38 +01:00
markuswh 05dee57ded Remove gender inequality
Got a complaint that the admin tools title wasn't very inclusive towards the fairer sex. The title has been edited to be gender neutral
2018-02-13 15:00:14 +01:00
yorinad 2d850c719d Make navbar darker and have fancy underline hover-effect 2018-02-13 14:53:51 +01:00
yorinad 0d0305cf04 Fix bug that prevented the active page from being marked in nav 2018-02-13 14:53:33 +01:00
yorinad 02f54c4458 Fix indentation for font CSS 2018-02-13 14:46:48 +01:00
yorinad 39dfafd538 Revert "Add 32x32 favicon"
Some browsers take the 32x32 and scale it down to 16x16,
instead of taking the 16x16 sprite.

This reverts commit 6162e2662c.
2018-02-12 00:08:51 +01:00
yorinad 6162e2662c Add 32x32 favicon 2018-02-11 02:48:55 +01:00
pederbs 8a47ad96de Fix sendmail bounce 2018-02-11 01:18:43 +01:00
pederbs 61e7c73901 Fix db activities on frontpage without url 2018-02-11 01:01:05 +01:00
pederbs e98084aaf4 Remove /kurs 2018-02-10 18:38:09 +01:00
pederbs 9f38e2af1a Move agenda creation to single include
This is to minimize problems arizing from adding and removing recurring events
2018-02-10 18:37:02 +01:00
yorinad 8b148fe0e3 Add 16x16 favicon 2018-02-10 18:34:09 +01:00
yorinad ebedc31fb6 Norwegian localisation fixes 2018-02-10 18:08:53 +01:00
pederbs 25da4a80f2 Fix navbar on some pages 2018-02-10 18:05:38 +01:00
pederbs b914590ea8 Reduce the use of Raleways to headers and list items 2018-02-10 18:05:01 +01:00
pederbs 5dd2260948 Fix dbactivity queries, missing a required column 2018-02-10 18:01:53 +01:00
pederbs 6f2ab1ac00 Add mysql schemes and add test admin user for sqlite 2018-02-10 18:00:32 +01:00
markuswh 689428241c Fix html for project pages 2018-02-10 16:39:30 +01:00
markuswh 0b0707eafe Fix html for the rest of the main pages 2018-02-10 16:23:17 +01:00
markuswh c4c5389fe8 Fix admin css 2018-02-10 16:13:18 +01:00
markuswh 32aa9e077c Show admin page link to admins 2018-02-10 15:42:01 +01:00
markuswh 56e6766520 Move navbar CSS to its own file 2018-02-10 15:04:57 +01:00
pederbs 49048fc973 Add Raleway font as default 2018-01-31 01:23:45 +01:00
markuswh b1623f9da1 Minor navbar adjustments 2017-11-14 11:40:28 +01:00
markuswh 1ea96f5c0d New navbar
mobile still wip
2017-11-13 23:13:24 +01:00
markuswh 2ee9a98277 white logos 2017-11-13 22:01:33 +01:00
pederbs cf95f90f5e A word
Totally not copy-pasted from the wiki
2017-11-13 20:43:10 +01:00
pederbs 68f3bdb097 Add sane login button 2017-11-13 20:38:16 +01:00
pederbs 7dbce0bd24 Add webmail to navbar, add generalized navbar to /om 2017-11-13 20:35:25 +01:00
markuswh 1f47b3849e Landing changes i forgot to stage
im smart :)
2017-11-13 14:20:07 +01:00
markuswh ede224c2f2 Move general info to landing header 2017-11-13 14:18:08 +01:00
markuswh c6cd02486d Redesign navbar and landing page 2017-11-13 13:21:51 +01:00
pederbs 518ee8baf2 Started making /paamelding 2017-11-11 22:11:10 +01:00
pederbs 5981eea827 Make parts of kalender non-selectable 2017-11-11 22:10:43 +01:00
pederbs f890b07d54 Minor cleanup in imports 2017-11-11 22:10:05 +01:00
pederbs d18315aa39 Fix https on simplesaml and remove /login 2017-11-11 22:08:24 +01:00
pederbs 1258b68ef0 Add dataporten config 2017-11-11 21:57:17 +01:00
markuswh 689975f262 Admins can add new users to usergroup system
new users meaning users who aren't in the usergroup system for the website yet.

also spicier no access messages
2017-11-11 20:37:04 +01:00
markuswh bb965aadd2 Admins can now set groups for new users
new users meaning users who don't already have any usergroups set
2017-11-11 19:13:59 +01:00
markuswh 9241a0404a Only show buttons for admin pages you can access 2017-11-11 17:21:04 +01:00
markuswh ee42e932e9 Fix requires for admin landing page 2017-11-11 17:15:02 +01:00
markuswh 3d3903eadc Check usergroups when accessing admin panel 2017-11-11 17:06:56 +01:00
markuswh 1ce3490ff0 Usergroup system 2017-11-11 17:00:08 +01:00
yorinad 53aec5edf5 Prevent double slashes at the end of URL 2017-11-11 15:44:23 +01:00
yorinad 6364325198 Update OAuth2 client library 2017-11-11 15:37:13 +01:00
yorinad 6574bd576e Generalize navigation and PHP configuration 2017-11-11 15:20:58 +01:00
pederbs 9068042a7e Remove "active" in navbar in adminpanel 2017-11-11 14:08:35 +01:00
pederbs eb62ce4d99 Fix navbar in /admin/prosjekter/ 2017-11-11 13:55:01 +01:00
pederbs 8a12ee1843 Add composer.phar to .gitignore 2017-10-28 20:59:35 +02:00
pederbs 53d97b5ccd Fix navbar in adminpanel 2017-10-28 20:55:40 +02:00
pederbs 60ef214e1b Fix bug displaying single prosjekt 2017-10-28 20:55:40 +02:00
pederbs c1def5fd7d Pretty up admin and prosjekter 2017-10-28 20:55:40 +02:00
markuswh e5dcb07659 My projects page 2017-10-28 20:09:54 +02:00
markuswh 446d966e80 Add simple login button & indicator to navbar 2017-10-28 17:19:40 +02:00
markuswh 7e3d256f93 Add project admin interface 2017-10-28 16:44:56 +02:00
markuswh 751967c5fa Add filtering to activity admin page 2017-10-28 16:11:36 +02:00
pederbs e1b2f00a38 Fix projekter/ny navbar and header 2017-10-28 14:40:17 +02:00
markuswh eb1adc0311 Restructure projects page 2017-10-28 14:01:49 +02:00
markuswh 1da1785e46 Add project creation
The projects page will also display a few random projects now
2017-10-22 17:57:55 +02:00
yorinad 68bba332f1 Remove BrettspilActivity from agendas 2017-10-22 17:48:58 +02:00
yorinad 9d22f444b4 No need for composer from package manager 2017-10-22 17:44:15 +02:00
pederbs 731663e4c0 Fixed logout 2017-10-22 17:32:54 +02:00
pederbs d047a99fd3 Add simplesaml setup 2017-10-22 15:43:47 +02:00
pederbs 473cd000d0 Remove url on simpleevent 2017-10-22 14:15:11 +02:00
pederbs c8ac8f7297 Add composer.json 2017-10-22 14:14:46 +02:00
markuswh c7d4c6c524 Fix admin interface hrefs 2017-10-22 13:46:19 +02:00
pederbs 2be094c905 Fix link to /kontakt/ in navbar 2017-10-22 13:34:53 +02:00
markuswh 1abb7813a8 Add event editing to admin interface 2017-10-12 00:38:28 +02:00
pederbs efb0e3d711 Add submodule and Windows info to README 2017-10-11 01:51:51 +02:00
markuswh d8f5dd4ad9 Split activities into pages in the admin interface
and other trivial fixes
2017-10-08 03:33:42 +02:00
markuswh 56f71eb9ab Merge branch 'master' of https://github.com/Programvareverkstedet/nettsiden 2017-10-07 23:13:39 +02:00
markuswh 89c2a59fd6 Beginning of the admin interface 2017-10-07 23:12:10 +02:00
pederbs b30889dcca Fix kalenderverkstedet title 2017-10-07 23:10:10 +02:00
markuswh 7cd78ac3bb Merge branch 'master' of https://github.com/Programvareverkstedet/nettsiden 2017-10-07 23:10:01 +02:00
pederbs f7506d57da Fix some norsk 2017-10-07 23:09:04 +02:00
pederbs aef3488c80 Make days clickable in kalender 2017-10-07 23:06:09 +02:00
markuswh e6ad3fb47a Remove ticker 2017-10-07 23:05:40 +02:00
yorinad 34e09667e5 Let "aktiviteter" also show events from database 2017-10-07 22:21:30 +02:00
yorinad d4794ce85f Add ID to events table 2017-10-07 22:19:43 +02:00
pederbs 24678ffb11 Add kalender to navbar 2017-10-07 21:57:15 +02:00
pederbs 93aaffd500 Add translation to kalender and append . to dates 2017-10-07 21:53:40 +02:00
pederbs a2703988f0 Add calendar 2017-10-07 21:26:49 +02:00
pederbs d89625558b Remove bad joke 2017-10-07 21:26:49 +02:00
johnche a3c68c3c79 add feide authentication 2017-10-07 21:25:44 +02:00
johnche 3d2f07418d Merge branch 'master' of github.com:Programvareverkstedet/nettsiden 2017-10-07 19:42:18 +02:00
johnche c885e71ba0 New registration page, move some info from the old page to a separate 'om' page 2017-10-07 19:22:22 +02:00
yorinad acad759bb0 Move sosiale pictures back, fix regression 2017-10-07 17:34:27 +02:00
yorinad faff3a2a8d Better alignment of date/time for today 2017-10-07 16:58:27 +02:00
yorinad 0a2c08eb9b Move date to the right 2017-10-07 16:42:11 +02:00
yorinad cd150d73c5 Cleanup code 2017-10-07 16:41:50 +02:00
pederbs 8c8af74783 Move sosiale to aktiviteter 2017-10-07 15:16:22 +02:00
pederbs 980e5ba9ac Update title in prosjekter after its previous move 2017-10-07 15:05:11 +02:00
pederbs 434d25cac5 Rename aktiviterer to prosjekter and hide prosjekter 2017-10-07 14:58:08 +02:00
yorinad 615b66da39 Use UTF8 2017-10-07 14:19:43 +02:00
fredrils 8feb9cc1ad Remove duplicate file 2016-09-30 15:18:45 +02:00
fredrils d0577fe62c s/kommunikasjon/kontakt/g 2016-09-29 18:27:28 +02:00
fredrils 2fccac4f2d Add comm tab to some more pages 2016-09-02 14:54:14 +02:00
fredrils c0a892789e Use common date formatter in sosiale page 2016-09-02 14:49:48 +02:00
fredrils 980d4018c2 Communication tab/page 2016-09-02 14:41:32 +02:00
fredrils bc573a53c7 Image at brettspill page 2016-08-31 18:34:45 +02:00
pederbs 4f1d3ee6b3 Updated navbar, added aktiviteter, deleted soek, made the ticker into an include 2016-08-30 18:13:31 +02:00
yorinad cbe73d9505 Add description field in sqlite. 2016-08-29 20:14:34 +02:00
kristovm bfee784bc4 Added documentation from outdated repo. Covers alot of the wishes for the new website for the uninformed. 2016-08-29 19:46:52 +02:00
yorinad 871ffc9182 Move navigation down in code, add ul element. 2016-08-29 19:37:49 +02:00
yorinad 6e8c8b22c2 Add instructions about PHP installation. 2016-08-29 18:50:24 +02:00
yorinad c7b297eeb9 Make headers appear black, even when they are links. 2016-08-29 18:30:07 +02:00
yorinad 9ffaf26f1d Remove "Remind Me" buttons. 2016-08-29 18:29:33 +02:00
yorinad db2ade9da0 Read kurs from database. 2016-08-29 18:27:31 +02:00
yorinad 60cadc9284 Make description in HTML. 2016-08-29 18:24:21 +02:00
yorinad 772dd62a55 Make development script only listen on localhost. 2016-08-29 18:23:05 +02:00
yorinad 399d54b1c3 Make today activities green. 2016-08-27 00:14:12 +02:00
yorinad b8f71db554 Add image for brettspillkveld 2016-08-27 00:13:58 +02:00
yorinad 305b4e7064 Remove empty events from Agenda::getNextOfEach 2016-08-27 00:13:28 +02:00
yorinad d9ff461877 Remove redundant PHP close tag. 2016-08-26 23:56:06 +02:00
yorinad d19bd1d08b Update links so that they can point to PHP files. 2016-08-26 23:54:58 +02:00
fredrils 1543363b10 Use tabs to make Yorn happy 2016-08-26 23:46:41 +02:00
fredrils d56dfcab46 Fetch event description from event class 2016-08-26 23:31:44 +02:00
yorinad 9d7a0d686f Improve limit calculation for Social page. 2016-08-26 23:30:32 +02:00
yorinad 5a241a84a5 Fix regression, placeholders for database events. 2016-08-26 23:23:57 +02:00
yorinad ee000d2d67 Perfectionism. 2016-08-26 23:19:27 +02:00
yorinad b1266aa448 Set social activity text through class functions. 2016-08-26 23:18:14 +02:00
yorinad 1650328ccd Add Agenda::getNextOfEach() 2016-08-26 23:18:14 +02:00
fredrils f39389ead4 Global date formatting function 2016-08-26 23:14:46 +02:00
fredrils a4787387dd Show date status for nerdepitsa & animekveld 2016-08-26 22:58:20 +02:00
fredrils a92f0af57a Add brettspill page 2016-08-26 22:52:59 +02:00
yorinad 07d3e47735 Add import for DateInterval. 2016-08-26 22:47:47 +02:00
fredrils 3e4c2d0ab1 Dynamic dates for animekveld page 2016-08-26 22:35:39 +02:00
fredrils f83384d15f Dynamic date on nerdepitsa event page 2016-08-26 22:23:58 +02:00
yorinad 4cd3f90459 Add getRelativeDate() in Event. 2016-08-26 22:16:54 +02:00
pederbs 6d1bf247c5 Merge branch 'master' of https://github.com/Programvareverkstedet/nettsiden 2016-08-26 18:39:48 +02:00
pederbs d7885ddfe6 Updated ticker to support multible events a day 2016-08-26 18:39:36 +02:00
yorinad 5b5023e696 Rename OnceEvent to SimpleEvent, fix regression. 2016-08-26 17:58:43 +02:00
yorinad 0ea3b934dd Make dev script Linux compatible. 2016-08-26 17:55:01 +02:00
pederbs e0fcf5f265 Merge branch 'master' of https://github.com/Programvareverkstedet/nettsiden 2016-08-26 17:49:53 +02:00
pederbs fab5827ebb Fixed title in soek/ and added dev.bat 2016-08-26 17:49:29 +02:00
yorinad 963973bc6b Show upcoming activity in the header on the main page. 2016-08-26 17:29:09 +02:00
yorinad 328a2a31e6 Add URL property to events. 2016-08-26 17:22:11 +02:00
yorinad 8519c00a57 Show more relevant times in upcoming activities. 2016-08-26 17:05:19 +02:00
yorinad 66114f36f9 Simplify class structure. 2016-08-26 17:04:20 +02:00
yorinad 6c3ac94804 Remove macOS cruft. 2016-08-20 00:00:49 +02:00
liangzh b14c37c22b added paamelding page 2016-08-19 23:47:48 +02:00
liangzh 29f0afa31f added brettspillkvled event 2016-08-19 23:46:30 +02:00
yorinad 10fdc27b2b New style for dates in "upcoming events". 2016-08-19 22:03:15 +02:00
yorinad 2c1bc0a2cb Add "next week" and show relative dates. 2016-08-19 22:01:25 +02:00
yorinad 70db345b12 Remove duplicate PHP close tag. 2016-08-19 22:00:46 +02:00
yorinad 3655883c9f Write database configuration through dev-script. 2016-08-18 23:17:24 +02:00
yorinad 32c6721ff0 Add development instruction. 2016-08-18 23:08:31 +02:00
yorinad 1f13604613 Add script for starting dev server with SQLite. 2016-08-18 22:49:58 +02:00
yorinad 72b3a1f535 Add PDO-activity for reading events from database. 2016-08-18 22:43:48 +02:00
aleksanw 2949aba2bb Autohyphenate <p>
Add hyphens:auto to <p> to remove the ugly gaps introduced by
text-align: justified. This may cause some unwanted hyphenation on e.g.
email addresses. We should strive to not have long unbreakable words.

For record; command for adding html tag to all relevant files:
$ find -type f -exec sed -i '/DOCTYPE/ a <html lang="no">' {} +
2016-08-18 09:45:30 +02:00
liangzh 8ac5b801ef added bli medlem page. updated sosiale page 2016-08-18 00:30:59 +02:00
yorinad 2b5c561369 Add timezone statement to accommodate older PHP servers. 2016-08-18 00:00:34 +02:00
yorinad f91d62e69f Remove merge cruft. 2016-08-17 23:58:54 +02:00
yorinad a4181b98ac Fix typo. 2016-08-17 23:57:15 +02:00
yorinad b6970d3f03 Add automatic agenda on front page. 2016-08-17 23:57:15 +02:00
fredrils e4e8b0972b Dynamic event dates 2016-08-15 21:55:50 +02:00
yorinad c18b49e992 Fix endless loop in AnimekveldActivity. 2016-08-15 21:30:16 +02:00
liangzh 6922cbeb23 Animekveld. 2016-08-15 21:12:30 +02:00
karlaho 41f72b647f Merge branch 'master' of github.com:Programvareverkstedet/nettsiden 2016-08-15 20:58:47 +02:00
karlaho 9653716ff5 Get all events from MySQL DB 2016-08-15 20:56:24 +02:00
yorinad 2aa0839120 Fix but that may cause an endless loop. 2016-08-15 20:38:56 +02:00
yorinad fdf6e29990 Add classes for social activities. 2016-08-15 20:33:44 +02:00
yorinad b19ef0e25b Use immutable date/time objects. 2016-08-15 20:33:44 +02:00
karlaho 4ac73d0113 Merge branch 'master' of github.com:Programvareverkstedet/nettsiden 2016-08-15 19:57:45 +02:00
karlaho 28397845a0 Event-getter classes 2016-08-15 19:57:27 +02:00
pederbs 976da028e5 Merge branch 'pjuddu' 2016-08-15 19:31:43 +02:00
pederbs 66c160ec40 Fikset wiki link, la til WIP søkeside 2016-08-15 19:30:45 +02:00
karlaho dc84fc0133 Merge branch 'master' of github.com:Programvareverkstedet/nettsiden 2016-08-15 18:50:35 +02:00
yorinad 89ffb4cd12 Add boilerplate and initial interfaces. 2016-08-15 18:48:02 +02:00
yorinad e6657a95cd Add boilerplate and initial activity classes. 2016-08-15 18:47:07 +02:00
karlaho 2fc2dc4da5 PHP events start 2016-08-15 18:19:41 +02:00
yorinad a1a3d12409 Initial hacking. 2016-08-15 17:43:41 +02:00
165 changed files with 19624 additions and 194 deletions
+1
View File
@@ -0,0 +1 @@
use flake
+3
View File
@@ -0,0 +1,3 @@
# The formattening
c5d308654744e116090e9ba165a968b8bf66006c
da8afe735c62e1f8ee9ad5f71291d87102fe126b
+2
View File
@@ -0,0 +1,2 @@
*.sh text eol=lf
*.bat text eol=crlf
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

+8
View File
@@ -0,0 +1,8 @@
*.sqlite
/cache
/config.php
/result
/test.sql
/vendor/
/www/simplesaml
composer.phar
+58
View File
@@ -0,0 +1,58 @@
<?php
$finder = (new PhpCsFixer\Finder())
->ignoreDotFiles(false)
->ignoreVCSIgnored(true)
->in([
'inc',
'src',
'dist',
])
->exclude([
'vendor',
])
->append([
__DIR__ . '/config.php',
__DIR__ . '/.php-cs-fixer',
])
;
return (new PhpCsFixer\Config())
->setRiskyAllowed(true)
->setRules([
'@PhpCsFixer' => true,
'@Symfony' => true,
'@PER-CS' => true,
'@PHP71Migration' => true,
'@PHP73Migration' => true,
'@PHP74Migration' => true,
'@PHP80Migration' => true,
'@PHP81Migration' => true,
'@PHP82Migration' => true,
'@PHP83Migration' => true,
'@PHP84Migration' => true,
'@PhpCsFixer:risky' => true,
'@Symfony:risky' => true,
'@PER-CS:risky' => true,
'@PHP74Migration:risky' => true,
'@PHP80Migration:risky' => true,
'@PHP82Migration:risky' => true,
'strict_param' => true,
'array_syntax' => ['syntax' => 'short'],
'braces_position' => [
'functions_opening_brace' => 'same_line',
'classes_opening_brace' => 'same_line',
],
'simplified_if_return' => true,
'simplified_null_return' => true,
'yoda_style' => false,
// TODO: fix these
'psr_autoloading' => false,
])
->setFinder($finder)
->setIndent(" ")
->setLineEnding("\n")
;
+7
View File
@@ -0,0 +1,7 @@
# this is a development container, not hardened for hosting
FROM php:7.4-cli
RUN apt-get update && \
apt-get install -y \
sqlite3 \
unzip \
git
-21
View File
@@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2016 Kasper Rynning-Tønnesen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-122
View File
@@ -1,122 +0,0 @@
<?php
namespace Kasperrt;
class OAuth2 {
private $client_id;
private $client_secret;
private $redirect_uri;
private $scope;
private $access_token;
private $url;
private $URL_AUTH;
private $URL_TOKEN;
private $auth_type;
private $session;
private $grant_type;
private $response_type;
public function __construct($params){
/* REQUIRED */
$this->client_id = $params["client_id"];
$this->client_secret = $params["client_secret"];
$this->redirect_uri = $params["redirect_uri"];
$this->URL_AUTH = $params["auth"] . "?";
$this->URL_TOKEN = $params["token"] . "?";
/* OPTIONAL */
$this->auth_type = isset($params["authorization_type"]) ? $params["authorization_type"] : "Bearer";
$this->session = isset($params["session"]) ? $params["session"] : false;
$this->verify_ssl_peer = isset($params["verify"]) ? ($params["verify"] ? 1 : 0) : 1;
$this->verify_ssl_host = $this->verify_ssl_peer === 1 ? 2 : 0;
$this->grant_type = isset($params["grant_type"]) ? $params["grant_type"] : "authorization_code";
$this->response_type = isset($params["response_type"]) ? $params["response_type"] : "code";
}
public function get_access_token($state = false, $code = false) {
if(!$state) {
$state = htmlspecialchars($_GET['state']);
}
if(!$code) {
$state = htmlspecialchars($_GET['code']);
}
if($this->session && $state) {
if($_SESSION['state'] != $state) {
die('States does not match');
}
}
$access_token = $this->get_oauth_token($code);
return $access_token;
}
private function get_oauth_token($code) {
$params = array(
'grant_type' => $this->grant_type,
'client_id' => $this->client_id,
'client_secret' => $this->client_secret,
'code' => $code,
'redirect_uri' => $this->redirect_uri,
);
$url_params = http_build_query($params);
$url = $this->URL_TOKEN . $url_params;
$result = curl_exec($this->create_curl($url, false, $params));
$result_obj = json_decode($result, true);
$access_token = $result_obj['access_token'];
return $access_token;
}
public function get_identity($access_token, $identity_url) {
if(!$access_token || !$identity_url) throw new \Exception("Missing either \$access_token or \$identity_url in get_identity function.");
$params = array(
'access_token' => $access_token,
);
$url_params = http_build_query($params);
$url = $identity_url . "?" . $url_params;
$result = curl_exec($this->create_curl($url, array('Authorization: ' . $this->auth_type . ' ' . $access_token), false));
$result_obj = json_decode($result, true);
return $result_obj;
}
public function redirect($state = false) {
if(!$state) $state = uniqid('', true);
$params = array(
'client_id' => $this->client_id,
'response_type' => $this->response_type,
'redirect_uri' => $this->redirect_uri,
'state' => $state,
);
if($this->session) $_SESSION['state'] = $state;
$url = $this->URL_AUTH . http_build_query($params);
header("Location: $url");
exit;
}
private function create_curl($url, $header, $extended) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
if ($header){
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
if ($extended) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $extended);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verify_ssl_peer);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $this->verify_ssl_host);
}
return $curl;
}
}
?>
+21 -38
View File
@@ -1,56 +1,39 @@
# General Authorization Code Flow OAuth2-Client
This client is made for Authorization Code Flow and Bearer as authorization option for now.
# Programvareverkstedets nettside
To use this general OAuth2 client-class, include it with
```
require_once('OAuth2Client.php');
$oauth2 = new OAuth2([
"client_id" => $client_id,
"client_secret" => $client_secret,
"redirect_uri" => $redirect_uri,
"auth" => $auth,
"token" => $token,
"authorization_type" => $authorization_type,
"session" => $session,
"verify" => $verify,
"grant_type" => $grant_type,
"response_type" => $response_type
]);
```
A website created with the latest and greatest web technologies.
May contain blackjack and other things one tends to include in awesome projects.
```(string) $client_id``` is client id of the OAuth2 application
```(string) $client_secret``` is client secret of the OAuth2 application
```(string) $redirect_uri``` is the specified redirect-uri for the OAuth2 application
```(string) $auth``` is the full url for authorization
```(string) $token``` is the full token url
## Installation
Optional -
git clone --recursive https://github.com/Programvareverkstedet/nettsiden.git
```(string) $authorization_type``` defaults to Bearer
```(boolean) $session``` specifies whether the state is to be saved in _SESSION storage, defaults to false
```(boolean) $verify``` is whether to verify SSL of host and peer, defaults to true
```(string) $grant_type``` defaults to 'authorization_code'
```(string) $response_type``` defaults to "code"
Put it in a folder your webserver can find.
## Development setup
To start the redirect phase
The development environment can be setup with:
```$oauth2->redirect($state);``` ($state defaults to false)
nix develop
For this you will need to install the nix package manager and possibly set the experimental features in your nix config, likely located at /etc/nix/nix.conf or $HOME/.config/nix/nix.conf.
To get access token
Installing nix with your package manager might not work without some tweaking, but the upstream script should just work which you can find [here](https://nixos.org/download/).
```$oauth2->get_access_token();``` returns the access_token.
experimental-features = flakes nix-command
You can then run the server with:
(Optional value is $state, to check up against _SESSION variables)
runDev
### Admin account
To get identity
Login goes through `idp.pvv.ntnu.no` via SAML, so you have to use your PVV account.
(This only works if you use access the local development site via the the hostname `localhost`)
To make your account into an admin account, run:
```$oauth->get_identity($access_token, $user_url);```
sqlite3 pvv.sqlite "INSERT INTO users (uname, groups) VALUES ('YOUR_USERNAME', 1);"
```(string) $user_url``` is the endpoint for fetching info, example: https://auth.dataporten.no/userinfo
## Hosting
returns the identity-object as returned from the OAuth2-provider.
![](./.gitea/hosting.jpg)
+13 -13
View File
@@ -1,16 +1,16 @@
{
"name": "kasperrt/oauth2-client",
"description": "OAuth2 Client with Bearer tokens",
"license": "MIT",
"keywords": ["authentication"],
"homepage": "https://github.com/kasperrt/oauth2-client",
"authors": [
{
"name": "Kasper Rynning-Tønnesen",
"homepage": "https://kasperrt.no"
"name": "programvareverkstedet/nettsiden",
"description": "Programvareverkstedets nettside",
"license": "proprietary",
"config": {
"allow-plugins": {
"simplesamlphp/composer-module-installer": true,
"simplesamlphp/composer-xmlprovider-installer": true
}
},
"require": {
"simplesamlphp/simplesamlphp": "^2.2.1",
"erusev/parsedown": "^1.7.4"
}
],
"autoload": {
"classmap": [""]
}
}
Generated
+4587
View File
File diff suppressed because it is too large Load Diff
+24
View File
@@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
$DB_DSN = 'sqlite:' . __DIR__ . \DIRECTORY_SEPARATOR . 'pvv.sqlite';
$DB_USER = null;
$DB_PASS = null;
$DOOR_SECRET = 'changeme';
$GALLERY_DIR = __DIR__ . \DIRECTORY_SEPARATOR . 'www' . \DIRECTORY_SEPARATOR . 'galleri' . \DIRECTORY_SEPARATOR . 'bilder' . \DIRECTORY_SEPARATOR . 'gallery';
$GALLERY_SERVER_PATH = '/images/gallery/';
$SLIDESHOW_DIR = __DIR__ . \DIRECTORY_SEPARATOR . 'www' . \DIRECTORY_SEPARATOR . 'galleri' . \DIRECTORY_SEPARATOR . 'bilder' . \DIRECTORY_SEPARATOR . 'slideshow';
$SLIDESHOW_SERVER_PATH = '/images/slideshow/';
$SAML_COOKIE_SALT = 'changeme';
$SAML_COOKIE_SECURE = false;
$SAML_TRUSTED_DOMAINS = ['localhost:1080'];
$SAML_ADMIN_PASSWORD = 'changeme';
$SAML_ADMIN_NAME = 'PVV Drift';
$SAML_ADMIN_EMAIL = 'drift@pvv.ntnu.no';
$CACHE_DIRECTORY = __DIR__ . \DIRECTORY_SEPARATOR . 'cache';
+6
View File
@@ -0,0 +1,6 @@
<?php
declare(strict_types=1);
$configFile = getenv('PVV_CONFIG_FILE');
require_once $configFile;
+45
View File
@@ -0,0 +1,45 @@
CREATE TABLE events (
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
`name` TEXT,
`start` TEXT,
`stop` TEXT,
`organiser` TEXT,
`location` TEXT,
`description` TEXT
);
CREATE TABLE projects (
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
`name` TEXT,
`description` TEXT,
`active` BOOLEAN
);
CREATE TABLE projectmembers (
`projectid` INTEGER,
`name` TEXT,
`uname` TEXT,
`mail` TEXT,
`role` TEXT,
`lead` BOOLEAN DEFAULT 0,
`owner` BOOLEAN DEFAULT 0
);
CREATE TABLE users (`uname` TEXT, `groups` INT DEFAULT 0);
CREATE TABLE motd (
`id` INTEGER PRIMARY KEY AUTO_INCREMENT,
`title` TEXT,
`content` TEXT
);
/*
INSERT INTO motd (title, content)
VALUES ("MOTD ./dev.sh", "du kan endre motd i admin panelet");
*/
CREATE TABLE door (`time` INTEGER PRIMARY KEY, `open` BOOLEAN);
INSERT INTO
door (time, open)
VALUES
(0, FALSE);
+49
View File
@@ -0,0 +1,49 @@
CREATE TABLE events (
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT,
start TEXT,
stop TEXT,
organiser TEXT,
location TEXT,
description TEXT
);
CREATE TABLE projects (
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT,
description TEXT,
active BOOLEAN
);
CREATE TABLE projectmembers (
projectid INTEGER,
name TEXT,
uname TEXT,
mail TEXT,
role TEXT,
lead BOOLEAN DEFAULT FALSE,
owner BOOLEAN DEFAULT FALSE
);
CREATE TABLE users (
uname TEXT,
groups INT DEFAULT 0
);
CREATE TABLE motd (
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
title TEXT,
content TEXT
);
-- INSERT example
-- INSERT INTO motd (title, content)
-- VALUES ('MOTD ./dev.sh', 'du kan endre motd i admin panelet');
CREATE TABLE door (
time INTEGER PRIMARY KEY,
open BOOLEAN
);
INSERT INTO door (time, open)
VALUES (0, FALSE);
+54
View File
@@ -0,0 +1,54 @@
CREATE TABLE "events" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"name" TEXT,
"start" TEXT,
"stop" TEXT,
"organiser" TEXT,
"location" TEXT,
"description" TEXT
);
CREATE TABLE "projects" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"name" TEXT,
"description" TEXT,
"active" BOOLEAN
);
CREATE TABLE "projectmembers" (
"projectid" INTEGER,
"name" TEXT,
"uname" TEXT,
"mail" TEXT,
"role" TEXT,
"lead" BOOLEAN DEFAULT 0,
"owner" BOOLEAN DEFAULT 0
);
CREATE TABLE "users" ("uname" TEXT, "groups" INT DEFAULT 0);
CREATE TABLE "motd" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" TEXT,
"content" TEXT
);
INSERT INTO
motd (title, content)
VALUES
(
'MOTD ./dev.sh',
'du kan endre motd i admin panelet'
);
CREATE TABLE "door" ("time" INTEGER PRIMARY KEY, "open" BOOLEAN);
INSERT INTO
door (time, open)
VALUES
(0, FALSE);
INSERT INTO
users (uname, groups)
VALUES
('min_test_bruker', 1);
+12
View File
@@ -0,0 +1,12 @@
<?php
declare(strict_types=1);
$config = [
/* This is the name of this authentication source, and will be used to access it later. */
'default-sp' => [
'saml:SP',
'entityID' => 'https://www.pvv.ntnu.no/simplesaml/',
'idp' => 'https://idp.pvv.ntnu.no/',
],
];
+1408
View File
File diff suppressed because it is too large Load Diff
+21
View File
@@ -0,0 +1,21 @@
<?php
declare(strict_types=1);
$metadata['https://idp.pvv.ntnu.no/'] = [
'metadata-set' => 'saml20-idp-remote',
'entityid' => 'https://idp.pvv.ntnu.no/',
'SingleSignOnService' => [
0 => [
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://idp.pvv.ntnu.no/simplesaml/saml2/idp/SSOService.php',
],
],
'SingleLogoutService' => [
0 => [
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://idp.pvv.ntnu.no/simplesaml/saml2/idp/SingleLogoutService.php',
],
],
'certData' => 'MIIDpTCCAo2gAwIBAgIJAJIgibrB7NvsMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAk5PMR4wHAYDVQQKDBVQcm9ncmFtdmFyZXZlcmtzdGVkZXQxGDAWBgNVBAMMD2lkcC5wdnYubnRudS5ubzEgMB4GCSqGSIb3DQEJARYRZHJpZnRAcHZ2Lm50bnUubm8wHhcNMTcxMTEzMjI0NTQyWhcNMjcxMTEzMjI0NTQyWjBpMQswCQYDVQQGEwJOTzEeMBwGA1UECgwVUHJvZ3JhbXZhcmV2ZXJrc3RlZGV0MRgwFgYDVQQDDA9pZHAucHZ2Lm50bnUubm8xIDAeBgkqhkiG9w0BCQEWEWRyaWZ0QHB2di5udG51Lm5vMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAveLujCsgVCRA360y5yezy8FcSPhaqodggDqY12UTkYOMQLBFaph6uUL4oCUlXZqxScrAYVRt9yw+7BYpcm0p51VZzVCsfMxRVkn+O1eUvsaXq3f13f87QHKYP2f0uqkGf5PvnKIdSaI/ix8WJhD8XT+h0OkHEcaBvUtSG7zbEhvG21WPHwgw2rvZSneArQ8tOitZC0u8VXSfdhtf6ynRseo0xC95634UwQAZivhQ2v4A6Tp57QG5DCXIJ9/z3PkINx3KB/hOeh0EP6Dpbp+7V0/t9778E3whpm4llrH144kzROhA7EgUgkZOjAVjxGCYlcj3xQPnnItihVOZ5B5qLwIDAQABo1AwTjAdBgNVHQ4EFgQUPLhrB+Qb/Kzz7Car9GJkKmEkz6swHwYDVR0jBBgwFoAUPLhrB+Qb/Kzz7Car9GJkKmEkz6swDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAd+4E6t0j8/p8rbZE8y/gZ9GsiRhxkR4l6JbMRUfEpqHKi415qstChRcP2Lo3Yd5qdmj9tLDWoPsqet1QgyTTmQTgUmPhhMOQDqSh90LuqEJseKWafXGS/SfWLH6MWVmzDV5YofJEw2ThPiU58GiS06OLS2poq1eAesa2LQ22J8yYisXM4sxImIFte+LYQ1+1evfBWcvU1vrGsQ0VLJHdef9WoXp1swUFhq4Zk0c7gjHiB1CFVlExAAlk9L6W3CVXmKIYlf4eUnEBGkC061Ir42+uhAMWO9Y/L1NEuboTyd2KAI/6JdKdzpmfk7zPVxWlNxNCZ7OPNuvOKp6VlpB2EA==',
'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
];
+21
View File
@@ -0,0 +1,21 @@
version: "3.9"
# cleanup:
# docker container prune -f && docker volume prune -f
# docker system prune -a
services:
nettside: # https://hub.docker.com/_/php
#image: php:7.4-cli
build: .
volumes:
- .:/usr/src/nettside
working_dir: /usr/src/nettside
command: ./dev.sh
environment:
- DOCKER_HOST=0.0.0.0
- DOCKER_PORT=1080
ports:
- 1080:1080
user: "${DOCKER_USER}"
Generated
+27
View File
@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1765803225,
"narHash": "sha256-xwaZV/UgJ04+ixbZZfoDE8IsOWjtvQZICh9aamzPnrg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "ac9a217389ee622d4e1e727c4efcc9c4bc9089ba",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}
+37
View File
@@ -0,0 +1,37 @@
{
description = "Programvareverkstedet/nettsiden PHP environment";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
};
outputs = { self, nixpkgs }:
let
systems = [
"x86_64-linux"
"aarch64-linux"
"aarch64-darwin"
];
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: let
pkgs = nixpkgs.legacyPackages.${system};
in f system pkgs);
in {
packages = forAllSystems (system: pkgs: {
default = self.packages.${system}.pvv-nettsiden;
pvv-nettsiden = pkgs.callPackage ./nix/package.nix { php = pkgs.php84; };
});
overlays.default = final: prev: {
inherit (self.packages.${final.system}) pvv-nettsiden;
formats = prev.formats // {
php = import ./nix/php-generator.nix { pkgs = prev; lib = prev.lib; };
};
};
nixosModules.default = nix/module.nix;
devShells = forAllSystems (system: pkgs: {
default = pkgs.callPackage ./nix/shell.nix { inherit pkgs; };
});
};
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 477 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

+25
View File
@@ -0,0 +1,25 @@
# Forsiden til pvv.no
* NB! Anbefaler at pvv.org og pvv.ntnu.no/pvv/Programvareverkstedet redirecter til pvv.no, eller vice-versa, om mulig. Det er lettest for folk å huske pvv.no, og er lett å dele. Akkurat nå pointer pvv.no til ingenting, og det er teit.
Følgende punkt er viktigst mtp forsiden:
* Det skal være lett å finne ut hva PVV er
* En skal raskt kunne se oppkommende kurs og hendelser, og melde seg på disse
* Rask oppmelding som medlem, synlig
* Vise hvor vi er
* Åpningsindikator (dørsensor) eller tentative åpningstider
* Vis lite (få events, kort om det å bli medlem), og få brukeren til å gå til mer utfyllende sider med mer info via "les mer" lenker e.l.
## Utkast til skrivebordsversjon
Under kickoffmøtet kom vi fram til følgende førsteutkast:
![Førsteutkast av skrivebordsversjon](/Images/PVVdotNO_desktop.jpg)
I tillegg må vi plassere åpen-status ett eller annet sted (øverst til høyre?), samt gjøre det lett å komme seg til wikien. Det kom fram et sterkt ønske om å ha få menyer, og å gjøre nettsiden så ren og lett som mulig.
Et sentralt mål bør være å tillate brukeren å melde seg inn som medlem, og/eller melde seg inn på kurs og events med så få klikk som mulig. Må se på løsninger rundt dette.
## Utkast til mobilversjon
Sketsjene er relativt like, men mobilversjonen bør ha langt lettere funksjonalitet enn skrivebordsversjonen. På mobil bør nettsiden heller fokusere på å oppdatere besøkende på farten om kurs, åpenstatus, og gjøre det mulig å få varsler eller legge inn kursevents i google calendar e.l.. Vi må presse så mye nyttig informasjon som mulig, presentert på en oversiktlig og ikke-overveldende måte, uten at brukeren må scrolle.
![Førsteutkast av mobilversjon](/Images/PVVdotNO_mobil.jpg)
+13
View File
@@ -0,0 +1,13 @@
<?php
declare(strict_types=1);
require __DIR__ . '/../src/_autoload.php';
require __DIR__ . '/../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$agenda = new pvv\side\Agenda([
new pvv\side\social\NerdepitsaActivity(),
new pvv\side\social\AnimekveldActivity(),
new pvv\side\DBActivity($pdo),
]);
+36
View File
@@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
// Set up database and user system,
// and include common files such as HTML includes or SimplSAMLphp.
require_once __DIR__ . \DIRECTORY_SEPARATOR . 'agenda.php';
require_once __DIR__ . \DIRECTORY_SEPARATOR . 'navbar.php';
require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'config.php']);
require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'src', '_autoload.php']);
require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'vendor', 'simplesamlphp', 'simplesamlphp', 'lib', '_autoload.php']);
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
$sp = 'default-sp';
$as = new SimpleSAML\Auth\Simple($sp);
use pvv\side\Agenda;
$agenda = new Agenda([
// new \pvv\side\social\NerdepitsaActivity,
// new \pvv\side\social\AnimekveldActivity,
new pvv\side\social\HackekveldActivity(),
new pvv\side\social\BrettspillActivity(),
new pvv\side\social\DriftkveldActivity(),
new pvv\side\DBActivity($pdo),
]);
$months_translations = ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'];
+74
View File
@@ -0,0 +1,74 @@
<?php
declare(strict_types=1);
function navbar($depth, $active = null) {
$result = "\n\t<ul id=\"menu\">\n";
$menuItems = [
'Hjem' => '',
'Hendelser' => 'hendelser',
// 'Kalender' => 'kalender',
// 'Aktiviteter' => 'aktiviteter',
'Prosjekter' => 'prosjekt',
'Kontakt' => 'kontakt',
'Webmail' => 'https://webmail.pvv.ntnu.no/roundcube/',
'Galleri' => 'galleri',
'Wiki' => 'https://wiki.pvv.ntnu.no/',
'Git' => 'https://git.pvv.ntnu.no/',
'Tjenester' => 'tjenester',
];
foreach ($menuItems as $caption => $link) {
$isActive = $active === $link;
if (substr($link, 0, 4) !== 'http') {
$link = rtrim(str_repeat('../', $depth) . $link, '/') . '/';
}
// if ($isActive) $link = '#';
$result .= "\t\t<li" . ($isActive ? ' class="active"' : '') . '>'
. '<a href="' . $link . '">'
. $caption
. "</a></li>\n";
}
return $result . "\t</ul>\n";
}
function loginBar($sp = null, $pdo = null) {
if (null === $sp) {
$sp = 'default-sp';
}
$result = "\n";
require_once __DIR__ . '/../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple($sp);
$svg = '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 64 64">
<circle cx="32" cy="27" r="14" stroke-width="0" />
<ellipse cx="32" cy="66" rx="24" ry="28" stroke-width="0" />
</svg>
';
$attr = $as->getAttributes();
if ($attr) {
$uname = $attr['uid'][0];
$isAdmin = false;
if (isset($pdo)) {
$userManager = new pvv\admin\UserManager($pdo);
$isAdmin = $userManager->isAdmin($uname);
}
$result .= "\t<a id=\"login\" href=\"#usermenu\" aria-hidden=\"true\">{$svg}" . htmlspecialchars($uname) . "</a>\n";
$result .= "\n\t<ul id=\"usermenu\">\n";
$result .= "\n\t\t<li><a id=\"login\" href=\"#\">{$svg}" . htmlspecialchars($uname) . "</a></li>\n";
if ($isAdmin) {
$result .= "\n\t\t<li><a href=\"/admin/\">Admin</a></li>\n";
}
$result .= "\n\t\t<li><a href=\"" . htmlspecialchars($as->getLogoutURL()) . "\">Logg ut</a></li>\n";
$result .= "\n\t</ul>\n";
} else {
$result .= "\t<a id=\"login\" href=\"" . htmlspecialchars($as->getLoginURL()) . "\">{$svg}Logg inn</a>\n";
}
$result .= "\n\t<a href=\"#menu\" id=\"menu_toggle\" aria-hidden=\"true\"><big>&#9776;&nbsp;</big>MENU</a>\n";
return $result;
}
+254
View File
@@ -0,0 +1,254 @@
{ config, lib, pkgs, ... }:
let
cfg = config.services.pvv-nettsiden;
inherit (lib) mkDefault mkEnableOption mkPackageOption mkIf mkOption types mdDoc;
format = pkgs.formats.php { };
in
{
options.services.pvv-nettsiden = {
enable = mkEnableOption (lib.mdDoc "Enable pvv-nettsiden");
package = mkPackageOption pkgs "pvv-nettsiden" { };
user = mkOption {
type = types.str;
default = "pvv-nettsiden";
description = mdDoc "User to run php-fpm and own the image directories";
};
group = mkOption {
type = types.str;
default = "pvv-nettsiden";
description = mdDoc "Group to run php-fpm and own the image directories";
};
domainName = mkOption {
type = types.str;
default = "www.pvv.no";
description = mdDoc "Domain name for the website";
};
enableNginx = mkEnableOption "nginx" // { default = true; };
useSSL = mkEnableOption "secure cookies" // { default = true; };
settings = mkOption {
description = "Settings for the website";
default = { };
type = types.submodule {
freeformType = format.type;
options = lib.mapAttrsRecursiveCond
(attrs: !(attrs ? "type"))
(_: option: option // { type = types.either option.type format.lib.types.raw; })
{
DOOR_SECRET = mkOption {
type = types.str;
description = mdDoc "Secret for the door sensor API";
};
GALLERY = {
DIR = mkOption {
type = types.path;
default = "/var/lib/pvv-nettsiden/gallery";
description = mdDoc "Directory where the gallery is located. See documentation at TODO";
};
SERVER_PATH = mkOption {
type = types.str;
default = "/static/gallery";
description = mdDoc "Path to the gallery on the server";
};
};
SLIDESHOW = {
DIR = mkOption {
type = types.path;
default = "/var/lib/pvv-nettsiden/slideshow";
description = mdDoc "Directory where the slideshow is located. See documentation at TODO";
};
SERVER_PATH = mkOption {
type = types.str;
default = "/static/slideshow";
description = mdDoc "Path to the slideshow on the server";
};
};
DB = {
DSN = mkOption {
type = types.str;
default = "sqlite:/var/lib/pvv-nettsiden/pvv-nettsiden.db";
example = "pgsql:host=localhost;port=5432;dbname=testdb;user=bruce;password=mypass";
description = mdDoc "Database connection string, see https://www.php.net/manual/en/pdo.construct.php";
};
USER = mkOption {
type = with types; nullOr str;
default = null;
example = "pvv-nettsiden";
description = mdDoc "Database user";
};
PASS = mkOption {
type = with types; nullOr str;
default = null;
description = mdDoc "Database password. Recommends: null, set in extraConfig";
};
};
SAML = {
COOKIE_SALT = mkOption {
type = types.str;
description = mdDoc "Salt for the SAML cookies";
};
COOKIE_SECURE = mkOption {
type = types.bool;
default = true;
description = mdDoc "Whether to set the secure flag on the SAML cookies";
};
ADMIN_NAME = mkOption {
type = types.str;
description = mdDoc "Name for the admin user";
};
ADMIN_EMAIL = mkOption {
type = types.str;
description = mdDoc "Email for the admin user";
};
ADMIN_PASSWORD = mkOption {
type = types.str;
description = mdDoc "Password for the admin user";
};
TRUSTED_DOMAINS = mkOption {
type = types.listOf types.str;
default = [ cfg.domainName ];
description = mdDoc "List of trusted domains for the SAML service";
};
};
CACHE_DIRECTORY = mkOption {
type = types.path;
default = "/var/cache/pvv-nettsiden/simplesamlphp";
description = mdDoc "List of trusted domains for the SAML service";
};
};
};
};
};
config = mkIf cfg.enable (let
# NOTE: This should absolutely not be necessary, but for some reason this file refuses to import
# the toplevel configuration file.
# NOTE: Nvm, don't this this was the problem after all?
finalPackage = cfg.package.overrideAttrs (_: _: {
postInstall = let
f = x: lib.escapeShellArg (format.lib.valueToString x);
in cfg.package.postInstall + ''
substituteInPlace $out/${cfg.package.passthru.simplesamlphpPath}/config/config.php \
--replace '$SAML_COOKIE_SECURE' ${f cfg.settings.SAML.COOKIE_SECURE} \
--replace '$SAML_COOKIE_SALT' ${f cfg.settings.SAML.COOKIE_SALT} \
--replace '$SAML_ADMIN_PASSWORD' ${f cfg.settings.SAML.ADMIN_PASSWORD} \
--replace '$SAML_ADMIN_NAME' ${f cfg.settings.SAML.ADMIN_NAME} \
--replace '$SAML_ADMIN_EMAIL' ${f cfg.settings.SAML.ADMIN_EMAIL} \
--replace '$SAML_TRUSTED_DOMAINS' ${f cfg.settings.SAML.TRUSTED_DOMAINS} \
--replace '$CACHE_DIRECTORY' ${f cfg.settings.CACHE_DIRECTORY}
'';
});
in {
users.users = mkIf (cfg.user == "pvv-nettsiden") {
"pvv-nettsiden" = {
description = "PVV Website Service User";
group = cfg.group;
createHome = false;
isSystemUser = true;
};
};
users.groups = mkIf (cfg.group == "pvv-nettsiden") {
"pvv-nettsiden" = { };
};
systemd.tmpfiles.settings."10-pvv-nettsiden".${cfg.settings.CACHE_DIRECTORY}.d = {
inherit (cfg) user group;
mode = "0770";
};
services.nginx = mkIf cfg.enableNginx {
enable = true;
recommendedGzipSettings = mkDefault true;
recommendedProxySettings = mkDefault true;
virtualHosts."${cfg.domainName}" = {
forceSSL = mkDefault cfg.useSSL;
enableACME = mkDefault true;
locations = {
"/" = {
root = "${finalPackage}/share/php/pvv-nettsiden/www/";
index = "index.php";
};
"~ \\.php$".extraConfig = ''
include ${pkgs.nginx}/conf/fastcgi_params;
fastcgi_param SCRIPT_FILENAME ${finalPackage}/share/php/pvv-nettsiden/www$fastcgi_script_name;
fastcgi_pass unix:${config.services.phpfpm.pools."pvv-nettsiden".socket};
'';
# based on https://simplesamlphp.org/docs/stable/simplesamlphp-install.html#configuring-nginx
"^~ /simplesaml/" = {
alias = "${finalPackage}/${finalPackage.passthru.simplesamlphpPath}/public/";
index = "index.php";
extraConfig = ''
location ~ ^/simplesaml/(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
include ${pkgs.nginx}/conf/fastcgi_params;
fastcgi_pass unix:${config.services.phpfpm.pools."pvv-nettsiden".socket};
fastcgi_param SCRIPT_FILENAME ${finalPackage}/${finalPackage.passthru.simplesamlphpPath}/public/$phpfile;
# Must be prepended with the baseurlpath
fastcgi_param SCRIPT_NAME /simplesaml/$phpfile;
fastcgi_param PATH_INFO $pathinfo if_not_empty;
}
'';
};
"^~ ${cfg.settings.GALLERY.SERVER_PATH}" = {
root = cfg.settings.GALLERY.DIR;
extraConfig = ''
rewrite ^${cfg.settings.GALLERY.SERVER_PATH}/(.*)$ /$1 break;
'';
};
"^~ ${cfg.settings.SLIDESHOW.SERVER_PATH}" = {
root = cfg.settings.SLIDESHOW.DIR;
extraConfig = ''
rewrite ^${cfg.settings.SLIDESHOW.SERVER_PATH}/(.*)$ /$1 break;
'';
};
};
};
};
services.phpfpm.pools.pvv-nettsiden = {
user = cfg.user;
group = cfg.group;
phpEnv.PVV_CONFIG_FILE = toString (format.generate "pvv-nettsiden-conf.php" cfg.settings);
settings = {
"listen.owner" = config.services.nginx.user;
"listen.group" = config.services.nginx.group;
"pm" = mkDefault "ondemand";
"pm.max_children" = mkDefault 32;
"pm.process_idle_timeout" = mkDefault "10s";
"pm.max_requests" = mkDefault 500;
};
};
});
}
+28
View File
@@ -0,0 +1,28 @@
{ lib
, php
, extra_files ? { }
}:
php.buildComposerProject rec {
src = ./..;
pname = "pvv-nettsiden";
version = "0.0.1";
vendorHash = "sha256-7I7Fdp5DvCwCdYY66Mv0hZ+a8xRzQt+WMUKG544k7Fc=";
passthru.simplesamlphpPath = "share/php/pvv-nettsiden/vendor/simplesamlphp/simplesamlphp";
postInstall = ''
install -Dm644 dist/simplesamlphp-config.php $out/${passthru.simplesamlphpPath}/config/config.php
install -Dm644 dist/simplesamlphp-authsources.php $out/${passthru.simplesamlphpPath}/config/authsources.php
install -Dm644 dist/simplesamlphp-idp.php $out/${passthru.simplesamlphpPath}/metadata/saml20-idp-remote.php
install -Dm644 dist/config.source-env.php $out/share/php/pvv-nettsiden/config.php
${lib.pipe extra_files [
(lib.mapAttrsToList (target_path: source_path: ''
mkdir -p $(dirname "$out/${target_path}")
cp -r "${source_path}" "$out/${target_path}"
''))
(lib.concatStringsSep "\n")
]}
'';
}
+62
View File
@@ -0,0 +1,62 @@
{ pkgs, lib }:
with lib;
{ }: let
valueToString = val:
if val == null then
"null"
else if isString val then
builtins.toJSON val
else if isBool val then
boolToString val
else if isInt val || isFloat val then
toString val
else if isList val then
"array(${concatMapStringsSep ", " valueToString val})"
else if isAttrs val && val ? value && (val._type or "") == "raw" then
val.value
else if isAttrs val then
throw "Found unexpected attrs, that were not created by mkRaw. Have you put attrs in an array?\n${val}"
else throw "unsupported :')";
in {
inherit (pkgs.formats.json { }) type;
generate = name: value: let
flattenStructuredSettings = attrs: let
partitionAttrs = pred: attrs: lib.pipe attrs [
attrsToList
(partition ({ name, value }: pred name value))
(mapAttrs (_: listToAttrs))
];
partitionedAttrs = partitionAttrs (_: v: isAttrs v && !(v ? value && (v._type or "") == "raw")) attrs;
flattenedAttrs = lib.pipe partitionedAttrs.right [
(mapAttrs (n1: mapAttrs' (n2: v2: nameValuePair "${n1}_${n2}" v2)))
attrValues
(map flattenStructuredSettings)
(foldl recursiveUpdate { })
];
in recursiveUpdate flattenedAttrs partitionedAttrs.wrong;
content = lib.pipe value [
flattenStructuredSettings
(mapAttrs (_: valueToString))
(mapAttrsToList (n: v: ''''$${n} = ${v};''))
(concatStringsSep "\n")
(content: "<?php\n${content}\n?>")
];
in pkgs.writeText name content;
lib = {
inherit valueToString;
mkRaw = value: {
inherit value;
_type = "raw";
};
types.raw = lib.types.attrs;
};
}
+41
View File
@@ -0,0 +1,41 @@
{ pkgs, lib }:
let
phpEnv = pkgs.php84.buildEnv {
extensions = { enabled, all }: enabled ++ (with all; [ iconv mbstring pdo_mysql pdo_sqlite ]);
};
in
pkgs.mkShellNoCC {
buildInputs = with pkgs; [
phpEnv
php84Packages.composer
php84Packages.php-parallel-lint
php84Packages.php-cs-fixer
sqlite-interactive
sql-formatter
];
# Prepare dev environment with sqlite and config files
shellHook = ''
alias runDev='php -S localhost:1080 -d error_reporting=E_ALL -d display_errors=1 -t www/'
declare -a PROJECT_ROOT="$("${lib.getExe pkgs.git}" rev-parse --show-toplevel)"
mkdir -p "$PROJECT_ROOT/www/galleri/bilder/slideshow"
test -e "$PROJECT_ROOT/pvv.sqlite" || sqlite3 "$PROJECT_ROOT/pvv.sqlite" < "$PROJECT_ROOT/dist/pvv_sqlite.sql"
test -e "$PROJECT_ROOT/config.php" || cp -v "$PROJECT_ROOT/dist/config.local.php" "$PROJECT_ROOT/config.php"
if [ ! -d "$PROJECT_ROOT/vendor" ] ; then
pushd "$PROJECT_ROOT"
composer install || exit $?
cp dist/simplesamlphp-authsources.php vendor/simplesamlphp/simplesamlphp/config/authsources.php
cp dist/simplesamlphp-idp.php vendor/simplesamlphp/simplesamlphp/metadata/saml20-idp-remote.php
cp dist/simplesamlphp-config.php vendor/simplesamlphp/simplesamlphp/config/config.php
cp dist/config.local.php config.php
ln -s ../vendor/simplesamlphp/simplesamlphp/public/ www/simplesaml
popd
fi
'';
}
+41
View File
@@ -0,0 +1,41 @@
<?php
declare(strict_types=1);
/*
* Copyright (c) 2014-2015, Jørn Åne de Jong <@jornane>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* Register SPL autoloading for classes and interfaces. Put this file in your
* namespace root and make sure it gets included from your PHP entry-point.
*
* There is no requirement for capitalisation for your namespaces and classes,
* but all folders and files MUST be lower-case. Class names are automatically
* lower-cased on autoload. This conforms to the PHP design philosophy that
* functions and class names must be case-insensitive.
*
* The include path is changed to prefer the current directory over the
* established include path. This is because manual include/require statements
* will likely not be used, because it will be handled by autoloading.
* Feel free to change this behaviour if that works better for you.
*
* @author Jørn Åne de Jong <@jornane>
* @copyright Copyright (c) 2014-2015, Jørn Åne de Jong <@jornane>
* @link https://gist.github.com/jornane/667f2e3acc262ce6bf44
* @link http://php.net/manual/en/function.spl-autoload.php
* @license http://choosealicense.com/licenses/isc/ ISC license
*/
spl_autoload_extensions('.php');
spl_autoload_register('spl_autoload');
set_include_path(realpath(__DIR__) . \PATH_SEPARATOR . get_include_path());
+144
View File
@@ -0,0 +1,144 @@
<?php
declare(strict_types=1);
namespace pvv\admin;
class UserManager {
private \PDO $pdo;
public array $usergroups = [
'admin' => 1,
'prosjekt' => 2,
'aktiviteter' => 4,
];
public function __construct(\PDO $pdo) {
$this->pdo = $pdo;
}
public function setupUser(string $uname, int $groups = 0): void {
$query = 'INSERT INTO users (uname, groups) VALUES (:uname, :groups)';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->bindParam(':groups', $groups, \PDO::PARAM_INT);
$statement->execute();
}
public function updateFlags(string $uname, int $flags): void {
$query = 'UPDATE users set groups=:groups WHERE uname=:uname';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':groups', $flags, \PDO::PARAM_INT);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
}
public function addGroup(string $uname, int $group): void {
$userFlags = $this->getUsergroups($uname);
if ($userFlags) {
$newFlags = ($group | $userFlags);
$this->updateFlags($uname, $newFlags);
}
}
public function removeGroup(string $uname, int $group): void {
$userFlags = $this->getUsergroups($uname);
if ($userFlags) {
$newFlags = ($userFlags & (~ $group));
$this->updateFlags($uname, $newFlags);
}
}
public function setGroups(string $uname, int $groups): void {
$query = 'SELECT * FROM users WHERE uname=:uname LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute();
$row = $statement->fetch();
if ($row) {
$query = 'UPDATE users set groups=:groups WHERE uname=:uname';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':groups', $groups, \PDO::PARAM_INT);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute();
} else {
$this->setupUser($uname, $groups);
}
}
public function hasGroup(string $uname, string $groupName): bool {
$userFlags = $this->getUsergroups($uname);
return (bool) ($userFlags & $this->usergroups[$groupName]);
}
// for convenience
public function isAdmin(string $uname): bool {
return $this->hasGroup($uname, 'admin');
}
public function getFlagfromNames(array $names): int {
$resultFlag = 0;
foreach ($this->usergroups as $name => $flag) {
if (\in_array($name, $names, true)) {
$resultFlag = ($resultFlag | $flag);
}
}
return $resultFlag;
}
public function getUsergroups(string $uname): int {
$query = 'SELECT groups FROM users WHERE uname=:uname LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute();
$row = $statement->fetch();
if ($row === false) {
return 0;
}
return $row[0];
}
/**
* @return string[]
*/
public function getUsergroupNames($uname): array {
$usersGroups = [];
$userFlags = $this->getUsergroups($uname);
foreach ($this->usergroups as $name => $flag) {
if ($userFlags & $flag) {
$usersGroups[] = $name;
}
}
return $usersGroups;
}
/**
* @return array<int,array{name:string,groups:string[]}>
*/
public function getAllUserData(): array {
$query = 'SELECT uname FROM users ORDER BY uname ASC';
$statement = $this->pdo->prepare($query);
$statement->execute();
$users = [];
foreach ($statement->fetchAll() as $userData) {
$uname = $userData['uname'];
$users[] = [
'name' => $uname,
'groups' => $this->getUsergroupNames($uname),
];
}
return $users;
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace pvv\side;
interface Activity {
public function getNextEventFrom(\DateTimeImmutable $date): ?Event;
public function getPreviousEventFrom(\DateTimeImmutable $date): ?Event;
}
+136
View File
@@ -0,0 +1,136 @@
<?php
declare(strict_types=1);
namespace pvv\side;
class Agenda {
private array $activities;
public const int TODAY = 0;
public const int TOMORROW = 1;
public const int THIS_WEEK = 2;
public const int NEXT_WEEK = 3;
public const int THIS_MONTH = 4;
public const int NEXT_MONTH = 5;
/**
* @param array<int,DBActivity> $activities
*/
public function __construct(array $activities) {
$this->activities = $activities;
}
public static function getFormattedDate(\DateTimeImmutable $date): string {
return $date->format('l j. M H.i');
}
/**
* @return array<Event>
*/
public function getEventsBetween(
\DateTimeImmutable $from,
\DateTimeImmutable $to,
) {
$results = [];
for ($i = 0; $i < \count($this->activities); ++$i) {
$result = [];
do {
$run = false;
if (\count($result)) {
$date = end($result)->getStop();
} else {
$date = $from;
}
$next = $this->activities[$i]->getNextEventFrom($date);
if (isset($next) && $next->getStart() < $to) {
$result[] = $this->activities[$i]->getNextEventFrom($date);
$run = true;
}
} while ($run);
$results[] = $result;
}
$result = [];
foreach ($results as $a) {
foreach ($a as $b) {
$result[] = $b;
}
}
usort(
$result,
static fn($a, $b) => $a->getStart() < $b->getStart() ? -1 : 1,
);
return $result;
}
/**
* @return array<int,array>
*/
public function getNextDays(): array {
$result = [[], [], [], [], [], []];
$events = $this->getEventsBetween(
new \DateTimeImmutable()->setTime(0, 0),
new \DateTimeImmutable()->setTime(23, 59)->add(new \DateInterval('P1M')),
);
foreach ($events as $event) {
$index = self::NEXT_MONTH;
if (self::isToday($event->getStart())) {
$index = self::TODAY;
} elseif (self::isTomorrow($event->getStart())) {
$index = self::TOMORROW;
} elseif (self::isThisWeek($event->getStart())) {
$index = self::THIS_WEEK;
} elseif (self::isNextWeek($event->getStart())) {
$index = self::NEXT_WEEK;
} elseif (self::isThisMonth($event->getStart())) {
$index = self::THIS_MONTH;
}
$result[$index][] = $event;
}
return $result;
}
/**
* @return array<Event>
*/
public function getNextOfEach(\DateTimeImmutable $startDate): array {
$result = array_filter(
array_map(
static fn($a) => $a->getNextEventFrom($startDate),
$this->activities,
),
static fn($a) => isset($a),
);
usort(
$result,
static fn($a, $b) => $a->getStart()->getTimeStamp()
< $b->getStart()->getTimeStamp()
? -1
: 1,
);
return $result;
}
public static function isToday(\DateTimeImmutable $date): bool {
return $date->format('dmY') === date('dmY');
}
public static function isTomorrow(\DateTimeImmutable $date): bool {
return $date->sub(new \DateInterval('P1D'))->format('dmY') === date('dmY');
}
public static function isThisWeek(\DateTimeImmutable $date): bool {
return $date->format('WY') === date('WY');
}
public static function isNextWeek(\DateTimeImmutable $date): bool {
return $date->sub(new \DateInterval('P7D'))->format('WY') === date('WY');
}
public static function isThisMonth(\DateTimeImmutable $date): bool {
return $date->format('mY') === date('mY');
}
}
+93
View File
@@ -0,0 +1,93 @@
<?php
declare(strict_types=1);
namespace pvv\side;
class DBActivity implements Activity {
private $pdo;
public function __construct(\PDO $pdo) {
$this->pdo = $pdo;
}
/**
* @return SimpleEvent[]
*/
public function getAllEvents(): array {
$query = 'SELECT * FROM events ORDER BY id DESC';
$statement = $this->pdo->prepare($query);
$statement->execute();
$events = [];
foreach ($statement->fetchAll() as $dbEvent) {
$event = new SimpleEvent(
$dbEvent['id'],
$dbEvent['name'],
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']),
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']),
$dbEvent['organiser'],
$dbEvent['location'],
$dbEvent['description'],
);
$events[] = $event;
}
return $events;
}
public function getEventByID(int $id): SimpleEvent {
$query = 'SELECT * FROM events WHERE id=:id LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute();
$dbEvent = $statement->fetch();
return new SimpleEvent(
$dbEvent['id'],
$dbEvent['name'],
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']),
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']),
$dbEvent['organiser'],
$dbEvent['location'],
$dbEvent['description'],
);
}
public function getNextEventFrom(\DateTimeImmutable $date): ?Event {
$query
= 'SELECT id,name,start,stop,organiser,location,description FROM events WHERE start > :date ORDER BY start ASC LIMIT 1';
return $this->retrieve($date, $query);
}
public function getPreviousEventFrom(\DateTimeImmutable $date): ?Event {
$query
= 'SELECT id,name,start,stop,organiser,location,description FROM events WHERE start < :date ORDER BY start DESC LIMIT 1';
return $this->retrieve($date, $query);
}
private function retrieve(
\DateTimeImmutable $date,
string $query,
): ?SimpleEvent {
$stmt = $this->pdo->prepare($query);
$stmt->execute(['date' => $date->format('Y-m-d H:i:s')]);
if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
return new SimpleEvent(
$result['id'],
$result['name'],
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['start']),
\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['stop']),
$result['organiser'],
$result['location'],
$result['description'],
);
}
return null;
}
}
+86
View File
@@ -0,0 +1,86 @@
<?php
declare(strict_types=1);
namespace pvv\side;
class Door {
private $pdo;
public function __construct(\PDO $pdo) {
$this->pdo = $pdo;
}
/**
* @return array{time: int, open: bool}[]
*/
public function getAll(): array {
$query = 'SELECT time, open FROM door ORDER BY time DESC';
$statement = $this->pdo->prepare($query);
$statement->execute();
$doorEvents = [];
foreach ($statement->fetchAll() as $row) {
$doorEvents[] = [
'time' => (int) $row['time'],
'open' => (bool) $row['open'],
];
}
return $doorEvents;
}
/**
* @return array{time: int, open: bool}[]
*/
public function getEntriesAfter(\DateTimeImmutable $startTime): array {
$query
= 'SELECT time, open FROM door WHERE time > :startTime ORDER BY time DESC';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':startTime', $startTime, \PDO::PARAM_STR);
$statement->execute();
$doorEvents = [];
foreach ($statement->fetchAll() as $row) {
$doorEvents[] = [
'time' => (int) $row['time'],
'open' => (bool) $row['open'],
];
}
return $doorEvents;
}
/**
* @return array{time: int, open: bool}
*/
public function getCurrent(): array {
$query = 'SELECT time, open FROM door ORDER BY time DESC LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->execute();
$row = $statement->fetch();
return [
'time' => (int) $row['time'],
'open' => (bool) $row['open'],
];
}
private function removeOld(): void {
$firstValidTime = time() - 60 * 60 * 24 * 7; // One week before now
$query = 'DELETE FROM door WHERE time < :firstValid';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':firstValid', $firstValidTime, \PDO::PARAM_STR);
$statement->execute();
}
public function createEvent(\DateTimeImmutable $time, bool $open): void {
$query = 'INSERT INTO door(time, open) VALUES (:time, :open)';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':time', $time, \PDO::PARAM_STR);
$statement->bindParam(':open', $open, \PDO::PARAM_STR);
$statement->execute();
$this->removeOld();
}
}
+59
View File
@@ -0,0 +1,59 @@
<?php
declare(strict_types=1);
namespace pvv\side;
abstract class Event {
private \DateTimeImmutable $start;
public function __construct(\DateTimeImmutable $start) {
$this->start = $start;
}
public function getStart(): \DateTimeImmutable {
return $this->start;
}
public function getRelativeDate(): string {
if (Agenda::isToday($this->getStart())) {
return 'i dag';
}
if (Agenda::isTomorrow($this->getStart())) {
return 'i morgen';
}
if (
Agenda::isThisWeek($this->getStart())
|| $this->getStart()->sub(new \DateInterval('P4D'))->getTimestamp() < time()
) {
return $this->getStart()->format('l');
}
if (Agenda::isNextWeek($this->getStart())) {
return 'neste uke';
}
if (Agenda::isThisMonth($this->getStart())) {
return 'denne måneden';
}
return $this->getStart()->format('j. F');
}
abstract public function getStop(): \DateTimeImmutable;
abstract public function getName(): string;
abstract public function getLocation(): string;
abstract public function getOrganiser(): string;
abstract public function getURL(): string;
abstract public function getImageURL(): string;
/**
* @return string[]
*/
abstract public function getDescription(): array;
abstract public function getColor(): string;
}
+55
View File
@@ -0,0 +1,55 @@
<?php
declare(strict_types=1);
namespace pvv\side;
class MOTD {
private $pdo;
public function __construct(\PDO $pdo) {
$this->pdo = $pdo;
}
public function setMOTD(string $title, string $content): void {
if (\is_array($content)) {
$content = implode('_', $content);
}
$query = 'INSERT INTO motd(title, content) VALUES (:title, :content);';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':title', $title, \PDO::PARAM_STR);
$statement->bindParam(':content', $content, \PDO::PARAM_STR);
$statement->execute();
}
/**
* @return array{title: string, content: string[]}
*/
public function getMOTD(): array {
$query
= 'SELECT motd.title, motd.content FROM motd ORDER BY motd.id DESC LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->execute();
$data = $statement->fetch();
return ['title' => $data[0], 'content' => explode("\n", $data[1])];
}
/**
* @return array{title: string, content: string[]}
*/
public function getMOTD_history(int $limit = 5): array {
$query
= 'SELECT motd.title, motd.content FROM motd ORDER BY motd.id DESC LIMIT :limit';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':limit', $limit, \PDO::PARAM_STR);
$statement->execute();
$data = $statement->fetch();
return ['title' => $data[0], 'content' => explode("\n", $data[1])];
}
}
+40
View File
@@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
namespace pvv\side;
class Project {
private int $id;
private string $name;
private array $descr;
private bool $active;
public function __construct(
int $id,
string $name,
string $descr,
bool $active,
) {
$this->id = $id;
$this->name = $name;
$this->descr = explode("\n", $descr);
$this->active = $active;
}
public function getID(): int {
return $this->id;
}
public function getName(): string {
return $this->name;
}
public function getDescription(): array {
return $this->descr;
}
public function getActive(): bool {
return $this->active;
}
}
+132
View File
@@ -0,0 +1,132 @@
<?php
declare(strict_types=1);
namespace pvv\side;
class ProjectManager {
private $pdo;
public function __construct(\PDO $pdo) {
$this->pdo = $pdo;
}
/**
* @return Project[]
*/
public function getAll(): array {
$query = 'SELECT * FROM projects ORDER BY id ASC';
$statement = $this->pdo->prepare($query);
$statement->execute();
$projects = [];
foreach ($statement->fetchAll() as $dbProj) {
$project = new Project(
$dbProj['id'],
$dbProj['name'],
$dbProj['description'],
$dbProj['active'],
);
$projects[] = $project;
}
return $projects;
}
public function getByID(int $id): ?Project {
$query = 'SELECT * FROM projects WHERE id=:id LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute();
$dbProj = $statement->fetch();
if (!$dbProj) {
return null;
}
return new Project(
$dbProj['id'],
$dbProj['name'],
$dbProj['description'],
$dbProj['active'],
);
}
/**
* @return Project[]
*/
public function getByOwner(string $uname): array {
$query = 'SELECT projectid FROM projectmembers WHERE uname=:uname';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute();
$projectIDs = $statement->fetchAll();
$projects = [];
foreach ($projectIDs as $id) {
$id = $id['projectid'];
$query = 'SELECT * FROM projects WHERE id=:id';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute();
foreach ($statement->fetchAll() as $dbProj) {
$project = new Project(
$dbProj['id'],
$dbProj['name'],
$dbProj['description'],
$dbProj['active'],
);
$projects[] = $project;
}
}
return $projects;
}
/**
* @return array<int,array>
*/
public function getProjectMembers(int $id): array {
$query = 'SELECT * FROM projectmembers WHERE projectid=:id';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, \PDO::PARAM_STR);
$statement->execute();
$members = [];
foreach ($statement->fetchAll() as $dbUsr) {
$members[] = [
'name' => $dbUsr['name'],
'uname' => $dbUsr['uname'],
'mail' => $dbUsr['mail'],
'role' => $dbUsr['role'],
'lead' => $dbUsr['lead'],
'owner' => $dbUsr['owner'],
];
}
return $members;
}
/**
* @return array<string,mixed>
*/
public function getProjectOwner(int $id): array {
$query = 'SELECT * FROM projectmembers WHERE (projectid=:id AND owner=1)';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, \PDO::PARAM_STR);
$statement->execute();
$dbOwner = $statement->fetch();
return [
'name' => $dbOwner['name'],
'uname' => $dbOwner['uname'],
'mail' => $dbOwner['mail'],
'role' => $dbOwner['role'],
'lead' => $dbOwner['lead'],
'owner' => $dbOwner['owner'],
];
}
}
+74
View File
@@ -0,0 +1,74 @@
<?php
declare(strict_types=1);
namespace pvv\side;
class SimpleEvent extends Event {
private int $id;
private string $name;
private array $descr;
private \DateTimeImmutable $start;
private \DateTimeImmutable $end;
private string $org;
private string $loc;
public function __construct(
int $id,
string $name,
\DateTimeImmutable $start,
\DateTimeImmutable $end,
string $org,
string $loc,
string $descr,
bool $_isDBEvent = false,
) {
$this->id = $id;
$this->name = $name;
$this->start = $start;
$this->end = $end;
$this->org = $org;
$this->loc = $loc;
$this->descr = explode("\n", $descr);
}
public function getID(): int {
return $this->id;
}
public function getStart(): \DateTimeImmutable {
return $this->start;
}
public function getStop(): \DateTimeImmutable {
return $this->end;
}
public function getOrganiser(): string {
return $this->org;
}
public function getLocation(): string {
return $this->loc;
}
public function getName(): string {
return $this->name;
}
public function getURL(): string {
return '/hendelser/info.php?id=' . $this->id;
}
public function getImageURL(): string {
return '/';
}
public function getDescription(): array {
return $this->descr;
}
public function getColor(): string {
return '#3b7';
}
}
@@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Activity;
class AnimekveldActivity implements Activity {
public function nextDate(\DateTimeImmutable $date): \DateTimeImmutable {
if (
(int) $date->format('H') > 20
|| ((int) $date->format('H') === 19 && (int) $date->format('i') > 30)
) {
return $this->nextDate(
$date->add(new \DateInterval('P1D'))->setTime(19, 30, 0),
);
}
$date = $date->setTime(19, 30, 0);
if ((int) $date->format('N') !== 5) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
return $date;
}
public function prevDate(\DateTimeImmutable $date): \DateTimeImmutable {
if (
(int) $date->format('H') < 19
|| ((int) $date->format('H') === 20 && (int) $date->format('i') < 30)
) {
return $this->prevDate(
$date->sub(new \DateInterval('P1D'))->setTime(19, 30, 0),
);
}
$date = $date->setTime(19, 30, 0);
if ((int) $date->format('N') !== 5) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
return $date;
}
public function getNextEventFrom(\DateTimeImmutable $date): AnimekveldEvent {
return new AnimekveldEvent($this->nextDate($date));
}
public function getPreviousEventFrom(
\DateTimeImmutable $date,
): AnimekveldEvent {
return new AnimekveldEvent($this->prevDate($date));
}
}
+48
View File
@@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Event;
class AnimekveldEvent extends Event {
public function getStop(): \DateTimeImmutable {
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
}
public function getName(): string {
return 'Animekveld';
}
public function getLocation(): string {
/* : Location */
return 'Koserommet';
}
public function getOrganiser(): string {
return 'Christoffer Viken';
}
public function getURL(): string {
return '/anime/';
}
public function getImageURL(): string {
return '/sosiale/animekveld.jpg';
}
public function getDescription(): array {
return [
'Er du glad i japanske tegneserier eller bare nysgjerrig på hva anime er?',
'Bli med oss hver fredag, der vi finner frem de nyeste episodene for sesongen!',
'',
'Alle kan være med på å anbefale eller veto serier.',
'',
];
}
public function getColor(): string {
return '#35a';
}
}
@@ -0,0 +1,59 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Activity;
class BrettspillActivity implements Activity {
public function nextDate(\DateTimeImmutable $date): \DateTimeImmutable {
if (
(int) $date->format('H') > 17
|| ((int) $date->format('H') === 16 && (int) $date->format('i') > 15)
) {
return $this->nextDate(
$date->add(new \DateInterval('P1D'))->setTime(16, 15, 0),
);
}
$date = $date->setTime(16, 15, 0);
if ((int) $date->format('N') !== 7) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
if (((int) $date->format('W') % 2) - 1) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date;
}
public function prevDate(\DateTimeImmutable $date): \DateTimeImmutable {
if (
(int) $date->format('H') < 16
|| ((int) $date->format('H') === 17 && (int) $date->format('i') < 15)
) {
return $this->prevDate(
$date->sub(new \DateInterval('P1D'))->setTime(16, 15, 0),
);
}
$date = $date->setTime(16, 15, 0);
if ((int) $date->format('N') !== 7) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
if (((int) $date->format('W') % 2) - 1) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(\DateTimeImmutable $date): BrettspillEvent {
return new BrettspillEvent($this->nextDate($date));
}
public function getPreviousEventFrom(
\DateTimeImmutable $date,
): BrettspillEvent {
return new BrettspillEvent($this->prevDate($date));
}
}
+64
View File
@@ -0,0 +1,64 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Event;
class BrettspillEvent extends Event {
public function getStop(): \DateTimeImmutable {
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
}
public function getName(): string {
return 'Brettspillkveld';
}
public function getLocation(): string {
return 'Programvareverkstedet';
}
public function getOrganiser(): string {
return 'Programvareverkstedet';
}
public function getURL(): string {
return '/brettspill/';
}
public function getImageURL(): string {
return '/sosiale/brettspill.jpg';
}
public function getDescription(): array {
return [
'Er du en hardcore brettspillentusiast eller en nybegynner som har så vidt spilt ludo? '
. 'Da er vår brettspillkveld noe for deg! '
. 'Vi tar ut et par spill fra vårt samling of spiller så mye vi orker. Kom innom!',
'',
'## Vår samling',
'',
'* Dominion\\*',
'* Three cheers for master',
'* Avalon',
'* Hanabi',
'* Cards aginst humanity\\*',
'* Citadels',
'* Munchkin\\*\\*',
'* Exploding kittens\\*\\*',
'* Aye dark overlord',
'* Settlers of catan\\*',
'* Risk\\*\\*',
'* og mange flere...',
'',
'\\* Vi har flere ekspansjoner til spillet',
'',
'\\*\\* Vi har flere varianter av spillet',
];
}
public function getColor(): string {
return '#000';
}
}
@@ -0,0 +1,59 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Activity;
class DriftkveldActivity implements Activity {
public function nextDate(\DateTimeImmutable $date): \DateTimeImmutable {
if (
(int) $date->format('H') > 18
|| ((int) $date->format('H') === 17 && (int) $date->format('i') > 30)
) {
return $this->nextDate(
$date->add(new \DateInterval('P1D'))->setTime(18, 15, 0),
);
}
$date = $date->setTime(18, 15, 0);
if ((int) $date->format('N') !== 6) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
if (((int) $date->format('W') % 2) - 1) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date;
}
public function prevDate(\DateTimeImmutable $date): \DateTimeImmutable {
if (
(int) $date->format('H') < 17
|| ((int) $date->format('H') === 18 && (int) $date->format('i') < 30)
) {
return $this->prevDate(
$date->sub(new \DateInterval('P1D'))->setTime(18, 15, 0),
);
}
$date = $date->setTime(18, 15, 0);
if ((int) $date->format('N') !== 6) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
if (((int) $date->format('W') % 2) - 1) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(\DateTimeImmutable $date): DriftkveldEvent {
return new DriftkveldEvent($this->nextDate($date));
}
public function getPreviousEventFrom(
\DateTimeImmutable $date,
): DriftkveldEvent {
return new DriftkveldEvent($this->prevDate($date));
}
}
+48
View File
@@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Event;
class DriftkveldEvent extends Event {
public function getStop(): \DateTimeImmutable {
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
}
public function getName(): string {
return 'Driftkveld';
}
public function getLocation(): string {
return 'Terminalrommet / Discord / IRC';
}
public function getOrganiser(): string {
return 'Torstein Nordgård-Hansen';
}
public function getURL(): string {
return '/driftkveld/';
}
public function getImageURL(): string {
return '/sosiale/drift.jpg';
}
public function getDescription(): array {
return [
'Vil du drifte?',
'Vil du være kul kis TM?',
'Kom på driftkveld!',
'',
'Vi møtes annenhver uke for å ta unna driftarbeid og drikke kaffe.',
'Alle PVVere er velkommene, enten de er erfarne driftere eller helt utenforstående!',
];
}
public function getColor(): string {
return '#35a';
}
}
@@ -0,0 +1,47 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Activity;
class HackekveldActivity implements Activity {
public function nextDate(\DateTimeImmutable $date): \DateTimeImmutable {
if ((int) $date->format('H') > 18 || (int) $date->format('H') === 17 && (int) $date->format('i') > 30) {
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(18, 15, 0));
}
$date = $date->setTime(16, 15, 0);
if ((int) $date->format('N') !== 6) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
if ((int) $date->format('W') % 2) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date;
}
public function prevDate(\DateTimeImmutable $date): \DateTimeImmutable {
if ((int) $date->format('H') < 17 || (int) $date->format('H') === 18 && (int) $date->format('i') < 30) {
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(18, 15, 0));
}
$date = $date->setTime(18, 15, 0);
if ((int) $date->format('N') !== 6) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
if ((int) $date->format('W') % 2) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(\DateTimeImmutable $date): HackekveldEvent {
return new HackekveldEvent($this->nextDate($date));
}
public function getPreviousEventFrom(\DateTimeImmutable $date): HackekveldEvent {
return new HackekveldEvent($this->prevDate($date));
}
}
+44
View File
@@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Event;
class HackekveldEvent extends Event {
public function getStop(): \DateTimeImmutable {
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
}
public function getName(): string {
return 'Hackekveld';
}
public function getLocation(): string {
return 'Terminalrommet / Discord / IRC';
}
public function getOrganiser(): string {
return 'PVV';
}
public function getURL(): string {
return '#';
}
public function getImageURL(): string {
return '/pvv-logo.png';
}
public function getDescription(): array {
return [
'Mange PVV-medlemmer liker å programmere.',
'Hvis du også liker å programmere, så bli med! Her kan du jobbe med dine egne prosjekter eller starte noe med andre nerder her på huset. Vi møtes for en hyggelig prat, mye god programmering og delsponset pizza.',
];
}
public function getColor(): string {
return '#35a';
}
}
@@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Activity;
use pvv\side\Event;
class NerdepitsaActivity implements Activity {
public function nextDate(\DateTimeImmutable $date): \DateTimeImmutable {
if ((int) $date->format('H') > 19) {
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(19, 0, 0));
}
$date = $date->setTime(19, 0, 0);
if ((int) $date->format('N') !== 5) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
if ((int) $date->format('W') % 2) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date;
}
public function prevDate(\DateTimeImmutable $date): \DateTimeImmutable {
if ((int) $date->format('H') < 19) {
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(19, 0, 0));
}
$date = $date->setTime(19, 0, 0);
if ((int) $date->format('N') !== 5) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
if ((int) $date->format('W') % 2) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(\DateTimeImmutable $date): ?Event {
return new NerdepitsaEvent($this->nextDate($date));
}
public function getPreviousEventFrom(\DateTimeImmutable $date): ?Event {
return new NerdepitsaEvent($this->prevDate($date));
}
}
+49
View File
@@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
use pvv\side\Event;
class NerdepitsaEvent extends Event {
public function getStop(): \DateTimeImmutable {
return $this->getStart()->add(new \DateInterval('PT2H1800S'));
}
public function getName(): string {
return 'Nerdepitsa';
}
public function getLocation(): string {
return 'Peppes Kjøpmansgata';
}
public function getOrganiser(): string {
return 'Anders Christensen';
}
public function getURL(): string {
return '/nerdepitsa/';
}
public function getImageURL(): string {
return '/sosiale/nerdepitsa.jpg';
}
public function getDescription(): array {
return [
'Hei, har du lyst til å bli med på pizzaspising annenhver fredag? Vi møtes på Peppes i Kjøpmannsgata fredag klokken 19.00 hver partallsuke!',
'',
'Vi er en trivelig gjeng hvis der fellestrekk er en viss interesse for data, samt har eller har hatt en tilknytning til studentmiljøet ved NTNU. For å treffe andre som også faller inn under disse kriteriene treffes vi over pizza på Peppes annenhver fredag. (Definisjon: En fredag er annenhver dersom den ligger i en partallsuke). Vi har reservasjon under navnet Christensen med storkunderabatt.',
'',
'Det er ikke noe krav at du er nerd... noen av oss virker faktisk nesten normale! Det er heller ikke noe krav at du kjenner noen fra før. Det er ikke engang et krav at du må like pizza! (selv om det hjelper) Dersom du har lyst til å treffe personer fra datamiljøet ved NTNU så bare still opp! Vi biter ikke, vel, bortsett fra pizzaen da.',
'',
'Vi bestiller så mye pizza som vi i fellesskap klarer å stappe i oss, og splitter dermed pizza-regningen broderlig, mens hver enkelt betaler for sin egen drikke, dessert mm. Vell møtt!',
];
}
public function getColor(): string {
return '#c35';
}
}
+12
View File
@@ -0,0 +1,12 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
ini_set('date.timezone', 'Europe/Oslo');
require implode(\DIRECTORY_SEPARATOR, [\dirname(__DIR__, 3), '', '_autoload.php']);
$c = new AnimekveldActivity();
exit($c->nextDate(new \DateTimeImmutable())->format(\DATE_RFC2822));
+12
View File
@@ -0,0 +1,12 @@
<?php
declare(strict_types=1);
namespace pvv\side\social;
ini_set('date.timezone', 'Europe/Oslo');
require implode(\DIRECTORY_SEPARATOR, [\dirname(__DIR__, 3), '', '_autoload.php']);
$c = new NerdepitsaActivity();
exit($c->prevDate(new \DateTimeImmutable())->format(\DATE_RFC2822));
@@ -0,0 +1,31 @@
<?xml version="1.0"?>
<clientConfig version="1.1">
<emailProvider id="pvv.ntnu.no">
<domain>pvv.ntnu.no</domain>
<domain>pvv.org</domain>
<displayName>Programvareverkstedet</displayName>
<incomingServer type="imap">
<hostname>imap.pvv.ntnu.no</hostname>
<port>993</port>
<socketType>SSL</socketType>
<username>%EMAILLOCALPART%</username>
<authentication>password-cleartext</authentication>
</incomingServer>
<outgoingServer type="smtp">
<hostname>smtp.pvv.ntnu.no</hostname>
<port>587</port>
<socketType>STARTTLS</socketType>
<username>%EMAILLOCALPART%</username>
<authentication>password-cleartext</authentication>
<useGlobalPreferredServer>true</useGlobalPreferredServer>
</outgoingServer>
<documentation url="https://www.pvv.ntnu.no/pvv/Drift/Mail/IMAP_POP3">
<descr lang="en">Setup programvareverkstedet email user with IMAP or POP3</descr>
<descr lang="nb">Sett opp programvareverkstedet email bruker med IMAP eller POP3</descr>
</documentation>
</emailProvider>
</clientConfig>
+3
View File
@@ -0,0 +1,3 @@
{
"m.server": "matrix.pvv.ntnu.no:443"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

+141
View File
@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 800 800"
style="enable-background:new 0 0 800 800;"
xml:space="preserve"
id="svg45"
sodipodi:docname="Pvv logoBW.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
id="metadata51"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs49" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1027"
id="namedview47"
showgrid="false"
inkscape:zoom="0.834386"
inkscape:cx="590.94635"
inkscape:cy="338.49599"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_5" /><style
type="text/css"
id="style2">
.st0{fill:#ffffff;}
.st1{fill:none;stroke:#ffffff;stroke-width:2;stroke-miterlimit:10;}
.st2{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
.st3{fill:none;}
.st4{stroke:#000000;stroke-miterlimit:10;}
.st5{font-family:'OCRAStd';}
.st6{font-size:126px;}
</style><g
id="Layer_2"><rect
y="0"
class="st0"
width="800"
height="800"
id="rect4" /></g><g
id="Layer_4"><path
class="st1"
d="M294.6,720.3"
id="path7" /><line
class="st1"
x1="478.4"
y1="720.3"
x2="313.2"
y2="720.3"
id="line9" /><path
class="st1"
d="M478.4,720.3"
id="path11" /><polyline
class="st2"
points="717.1,223.3 717.1,720.3 497.3,720.3 "
id="polyline13" /><path
class="st2"
d="M498.3,720.3c0-5.6-4.5-10.1-10.1-10.1c-5.6,0-10.1,4.5-10.1,10.1H314.3c0-5.6-4.5-10.1-10.1-10.1 c-5.6,0-10.1,4.5-10.1,10.1h0.6H76.5V79.7h640.5v120.8v-0.8h-17.3v24.8h17.3"
id="path15" /></g><g
id="Layer_3"><circle
class="st2"
cx="396.8"
cy="400"
r="320.3"
id="circle18" /></g><g
id="Layer_1"><polyline
class="st2"
points="514.5,173.5 170.2,173.5 170.3,626.6 623.3,626.5 623.3,215.7 584.4,173.4 557,173.4 548,180.6 526.5,180.7 "
id="polyline21" /><path
class="st1"
d="M396.8,173.5"
id="path23" /><path
class="st1"
d="M396.8,173.3"
id="path25" /><path
class="st2"
d="M526.5,331.8c0,7.6-5.4,13.7-12,13.7H227.7c-6.6,0-12-6.1-12-13.7V187.2c0-7.6,5.4-13.7,12-13.7h286.8 c6.6,0,12,6.1,12,13.7V331.8z"
id="path27" /><path
class="st2"
d="M526.7,333.6c0,6.6-5.4,12-12,12H296.8c-6.6,0-12-5.4-12-12V185.5c0-6.6,5.4-12,12-12h217.9 c6.6,0,12,5.4,12,12V333.6z"
id="path29" /><path
class="st2"
d="M577.9,613.7c0,6.6-5.4,12-12,12H227.7c-6.6,0-12-5.4-12-12V381.1c0-6.6,5.4-12,12-12h338.2 c6.6,0,12,5.4,12,12V613.7z"
id="path31" /><rect
x="179.9"
y="590.2"
class="st2"
width="25.7"
height="23"
id="rect33" /><rect
x="587.6"
y="590.2"
class="st2"
width="25.7"
height="23"
id="rect35" /><rect
x="433.6"
y="193.5"
class="st2"
width="64.9"
height="137.8"
id="rect37" /></g><g
id="Layer_5"><rect
x="258"
y="442.5"
class="st3"
width="277.5"
height="109.7"
id="rect40" /><g
aria-label="PVV"
transform="matrix(1 0 0 1 260.7021 547.998)"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:126px;font-family:OCRA;-inkscape-font-specification:OCRA;stroke:#000000;stroke-miterlimit:10"
id="text42"><path
d="m 14.238,-6.426 c 0,3.528 2.772,6.426 6.3,6.426 3.528,0 6.426,-2.898 6.426,-6.426 v -30.996 h 30.87 c 10.458,0 19.152,-8.694 19.152,-19.152 v -22.68 c 0,-10.332 -8.694,-19.026 -19.152,-19.026 H 14.238 Z m 12.726,-43.722 v -35.406 h 30.87 c 3.276,0 6.426,2.898 6.426,6.3 v 22.68 c 0,3.528 -3.024,6.426 -6.426,6.426 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:126px;font-family:OCRA;-inkscape-font-specification:OCRA;stroke:#000000;stroke-miterlimit:10"
id="path55" /><path
d="m 105.29269,-69.174 25.326,65.142 c 1.008,2.394 3.276,4.032 6.048,4.032 2.646,0 4.914,-1.638 5.922,-4.032 l 25.452,-65.268 v -22.68 c 0,-3.402 -2.898,-6.3 -6.426,-6.3 -3.528,0 -6.3,2.898 -6.3,6.3 v 20.286 l -18.648,47.628 -18.648,-47.628 V -91.98 c 0,-3.402 -2.898,-6.3 -6.426,-6.3 -3.528,0 -6.3,2.898 -6.3,6.3 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:126px;font-family:OCRA;-inkscape-font-specification:OCRA;stroke:#000000;stroke-miterlimit:10"
id="path57" /><path
d="m 196.34737,-69.174 25.326,65.142 c 1.008,2.394 3.276,4.032 6.048,4.032 2.646,0 4.914,-1.638 5.922,-4.032 l 25.452,-65.268 v -22.68 c 0,-3.402 -2.898,-6.3 -6.426,-6.3 -3.528,0 -6.3,2.898 -6.3,6.3 v 20.286 l -18.648,47.628 -18.648,-47.628 V -91.98 c 0,-3.402 -2.898,-6.3 -6.426,-6.3 -3.528,0 -6.3,2.898 -6.3,6.3 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:126px;font-family:OCRA;-inkscape-font-specification:OCRA;stroke:#000000;stroke-miterlimit:10"
id="path59" /></g></g></svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

+28
View File
@@ -0,0 +1,28 @@
<?php
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->hasGroup($uname, 'aktiviteter')) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
$eventID = $_GET['id'];
$query = 'DELETE FROM events WHERE id=\'' . $eventID . '\'';
$statement = $pdo->prepare($query);
$statement->execute();
header('Location: ' . $_SERVER['HTTP_REFERER']);
?>
<a href=".?page=1">Om du ikke ble omdirigert tilbake klikk her</a>
+142
View File
@@ -0,0 +1,142 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../../inc/navbar.php';
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
$name = $attrs['cn'][0];
if (!$userManager->hasGroup($uname, 'aktiviteter')) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
$customActivity = new pvv\side\DBActivity($pdo);
$new = 0;
if (isset($_GET['new'])) {
$new = $_GET['new'];
}
$eventID = 0;
if (isset($_GET['id'])) {
$eventID = $_GET['id'];
} elseif ($new == 0) {
echo "\nID not set";
exit;
}
$today = new DateTimeImmutable();
$today = $today->setTime(18, 15);
$defaultStart = $today->format('Y-m-d H:15:00');
$inTwoHours = $today->add(new DateInterval('PT1H45M'));
$defaultEnd = $inTwoHours->format('Y-m-d H:00:00');
if ($new == 0) {
$event = $customActivity->getEventByID($eventID);
} else {
$event = new pvv\side\SimpleEvent(
0,
'',
$today,
$inTwoHours,
'',
'',
''
);
}
?>
<!DOCTYPE html>
<html lang="no" locale="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../../css/normalize.css">
<link rel="stylesheet" href="../../css/style.css">
<link rel="stylesheet" href="../../css/nav.css">
<link rel="stylesheet" href="../../css/events.css">
<link rel="stylesheet" href="../../css/admin.css">
<meta name="theme-color" content="#024" />
<title>Adminverkstedet</title>
<header>Admin&shy;verk&shy;stedet</header>
<body>
<nav>
<?php echo navbar(3, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Aktivietsadministrasjon</h2>
<hr class="ruler">
<h2><?php echo $new == 1 ? 'Ny hendelse' : 'Rediger hendelse'; ?></h2>
<form action="update.php", method="post" class="gridsplit fullwidth_inputs">
<div class="gridl">
<p class="subtitle">Tittel</p>
<input type="text" name="title" value="<?php echo $event->getName(); ?>" class="boxinput" required placeholder="En kul hendelse"><br>
<div class="gridsplit5050">
<div class="gridl">
<p class="subtitle">Arrangør</p>
<input type="text" name="organiser" value="<?php echo $event->getOrganiser(); ?>" class="boxinput" required placeholder="<?php echo $name; ?>"><br>
</div>
<div class="gridr noborder">
<p class="subtitle">Sted</p>
<input type="text" name="location" value="<?php echo $event->getLocation(); ?>" class="boxinput" required placeholder="Terminalrommet"><br>
</div>
</div>
<p class="subtitle">Beskrivelse (<i>markdown</i>)</p>
<textarea name="desc" rows="8" class="boxinput" placeholder="Beskrivelse" required><?php echo implode("\n", $event->getDescription()); ?></textarea>
</div>
<div class="gridr" style="line-height: 1.3em;">
<h4>Starttid</h4><br>
<i>Måned:</i><br>
<input name="start_mon" type="month" class="boxinput" required value="<?php echo $event->getStart()->format('Y-m'); ?>"><br>
<i>Dag:</i><br>
<input name="start_day" type="number" min="1" max="31" required class="boxinput" value="<?php echo $event->getStart()->format('d'); ?>"><br>
<i>Klokkeslett:</i><br>
<input name="start_time" type="time" class="boxinput" required value="<?php echo $event->getStart()->format('H:i:s'); ?>"><br>
<br>
<h4>Varighet</h4><br>
<?php $diff = $event->getStart()->diff($event->getStop()); ?>
<i>Timer:</i><br>
<input name="lasts_hours" type="number" min="0" class="boxinput" required value="<?php echo $diff->h; ?>"><br>
<i>Minutter:</i><br>
<input name="lasts_minutes" type="number" min="0" max="59" class="boxinput" required value="<?php echo $diff->i; ?>"><br>
</div>
<input type="hidden" name="id" value="<?php echo $event->getID(); ?>" />
<div class="allgrids" style="margin-top: 2em;">
<hr class="ruler">
<input type="submit" class="btn" value="Lagre"></a>
</div>
</form>
<p>
</main>
</body>
+146
View File
@@ -0,0 +1,146 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../../inc/navbar.php';
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->hasGroup($uname, 'aktiviteter')) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
$customActivity = new pvv\side\DBActivity($pdo);
$events = $customActivity->getAllEvents();
$page = 1;
if (isset($_GET['page'])) {
$page = $_GET['page'];
}
$filterTitle = '';
if (isset($_GET['title'])) {
$filterTitle = $_GET['title'];
}
$filterOrganiser = '';
if (isset($_GET['organiser'])) {
$filterOrganiser = $_GET['organiser'];
}
// filter
$events = array_values(array_filter(
$events,
static fn($event) => (preg_match('/.*' . $filterTitle . '.*/i', $event->getName()) && preg_match('/.*' . $filterOrganiser . '.*/i', $event->getOrganiser()))
));
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../../css/normalize.css">
<link rel="stylesheet" href="../../css/style.css">
<link rel="stylesheet" href="../../css/nav.css">
<link rel="stylesheet" href="../../css/events.css">
<link rel="stylesheet" href="../../css/admin.css">
<meta name="theme-color" content="#024" />
<title>Aktivitetsadministrasjonsverkstedet</title>
<header>Aktivitets&shy;administrasjons&shy;verk&shy;stedet</header>
<body>
<nav>
<?php echo navbar(2, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Aktivitetsadministrasjon</h2>
<hr class="ruler">
<div class="gridsplit">
<div class="gridl">
<h2 class="no-chin">Aktive aktiviteter</h2>
<p class="subnote">Gjentagende aktiviteter vises ikke</p>
<ul class="event-list">
<?php
$counter = 0;
$pageLimit = 10;
for ($i = ($pageLimit * ($page - 1)); $i < count($events); ++$i) {
if ($counter == $pageLimit) {
break;
}
$event = $events[$i];
$eventID = $event->getID();
?>
<li>
<div class="event admin">
<div class="event-info">
<h3 class="no-chin"><?php echo $event->getName() . ' (ID: ' . $eventID . ')'; ?></h3>
<p class="subnote">
<?php echo $event->getStart()->format('(Y-m-d H:i:s)') . ' - ' . $event->getStop()->format('(Y-m-d H:i:s)'); ?>
</p>
<?php
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $event->getDescription()));
?>
</div>
<div class="event-actions">
<a class="btn" href="edit.php?id=<?php echo $eventID; ?>">Rediger</a><br>
<a class="btn" href="delete.php?id=<?php echo $eventID; ?>" onclick="return confirm('Knallsikker? (ID: <?php echo $eventID; ?>)');">Slett</a>
</div>
</div>
</li>
<?php
++$counter;
}
?>
</ul>
<?php
if ($page != 1) {
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '&title=' . urlencode($filterTitle) . '&organiser=' . urlencode($filterOrganiser) . '">Forrige side</a>';
}
if (($counter == $pageLimit) && (($pageLimit * $page) < count($events))) {
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '&title=' . urlencode($filterTitle) . '&organiser=' . urlencode($filterOrganiser) . '">Neste side</a>';
}
?>
</div>
<div class="gridr">
<h2>Verktøy</h2>
<a class="btn adminbtn" href="edit.php?new=1">Legg inn ny aktivitet</a>
<h2>Filter</h2>
<form action="." method="get">
<p class="no-chin">Navn</p>
<?php echo '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">'; ?><br>
<p class="no-chin">Organisator</p>
<?php echo '<input type="text" name="organiser" class="boxinput" value="' . $filterOrganiser . '">'; ?><br>
<div style="margin-top: 2em;">
<input type="submit" class="btn" value="Filtrer"></input>
</div>
</form>
</div>
</div>
</main>
</body>
+100
View File
@@ -0,0 +1,100 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->hasGroup($uname, 'aktiviteter')) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
if ((!isset($_POST['title']))
|| (!isset($_POST['desc']))
|| (!isset($_POST['organiser']))
|| (!isset($_POST['location']))
|| (!isset($_POST['start_mon']))
|| (!isset($_POST['start_day']))
|| (!isset($_POST['start_time']))
|| (!isset($_POST['lasts_hours']))
|| (!isset($_POST['lasts_minutes']))) {
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;
}
$id = 0;
if (isset($_POST['id'])) {
$id = $_POST['id'];
}
$title = $_POST['title'];
$desc = $_POST['desc'];
// $start = $_POST['start'];
// $stop = $_POST['end'];
$organiser = $_POST['organiser'];
$location = $_POST['location'];
$date_part_start_mon = $_POST['start_mon'];
$date_part_start_day = $_POST['start_day'];
$date_part_start_time = $_POST['start_time'];
$date_part_lasts_hours = $_POST['lasts_hours'];
$date_part_lasts_minutes = $_POST['lasts_minutes'];
while (strlen($date_part_start_day) < 2) {
$date_part_start_day = '0' . $date_part_start_day;
}
$start = ($date_part_start_mon . '-' . $date_part_start_day . ' ' . $date_part_start_time);
if (count(explode(':', $date_part_start_time)) == 2) {
$start .= ':00';
}
$start_date = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $start);
$stop_date = $start_date->add(new DateInterval('PT' . $date_part_lasts_hours . 'H' . $date_part_lasts_minutes . 'M'));
$start = $start_date->format('Y-m-d H:i:s');
$stop = $stop_date->format('Y-m-d H:i:s');
if ($start_date >= $stop_date) {
echo 'Invalid dates. End date must come after the start date!';
exit;
}
if ($id == 0) {
$query = 'INSERT INTO events (name, start, stop, organiser, location, description) VALUES (:title, :start, :stop, :organiser, :loc, :desc)';
$statement = $pdo->prepare($query);
$statement->bindParam(':title', $title, PDO::PARAM_STR);
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
$statement->bindParam(':start', $start, PDO::PARAM_STR);
$statement->bindParam(':stop', $stop, PDO::PARAM_STR);
$statement->bindParam(':organiser', $organiser, PDO::PARAM_STR);
$statement->bindParam(':loc', $location, PDO::PARAM_STR);
} else {
$query = 'UPDATE events SET name=:title, start=:start, stop=:stop, organiser=:organiser, location=:loc, description=:desc WHERE id=:id';
$statement = $pdo->prepare($query);
$statement->bindParam(':title', $title, PDO::PARAM_STR);
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
$statement->bindParam(':start', $start, PDO::PARAM_STR);
$statement->bindParam(':stop', $stop, PDO::PARAM_STR);
$statement->bindParam(':organiser', $organiser, PDO::PARAM_STR);
$statement->bindParam(':loc', $location, PDO::PARAM_STR);
$statement->bindParam(':id', $id, PDO::PARAM_INT);
}
$statement->execute();
header('Location: .');
?>
<a href=".?page=1">Om du ikke ble automatisk omdirigert tilbake klikk her</a>
+99
View File
@@ -0,0 +1,99 @@
<?php
ini_set('display_errors', '1');
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
error_reporting(\E_ALL);
require __DIR__ . '/../../../inc/navbar.php';
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$attrs = $as->getAttributes();
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->isAdmin($uname)) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
$users = $userManager->getAllUserData();
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../../css/normalize.css">
<link rel="stylesheet" href="../../css/style.css">
<link rel="stylesheet" href="../../css/events.css">
<link rel="stylesheet" href="../../css/admin.css">
<meta name="theme-color" content="#024" />
<title>Brukeradministrasjonsverkstedet</title>
<header>Bruker&shy;administrasjons&shy;verk&shy;stedet</header>
<body>
<nav>
<?php echo navbar(2, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Brukeradministrasjon</h2>
<hr class="ruler">
<form action="./update.php" method="post">
<table class="userlist">
<tr>
<th>Brukernavn</th>
<th>Brukergrupper</th>
</tr>
<?php
$users_to_update = [];
foreach ($users as $i => $data) {
$uname = $data['name'];
$groupFlag = $userManager->getUsergroups($uname);
$users_to_update[] = $uname;
?>
<tr>
<td><?php echo $uname; ?></td>
<?php
foreach ($userManager->usergroups as $name => $group) {
echo '<td><input type="checkbox" ' . (($groupFlag & $group) ? 'checked' : '') . ' name="' . $uname . '_' . $name . '" class="usergroupcheckbox">' . $name . '</td>';
}
?>
</tr>
<?php
}
foreach ($users_to_update as $uname) {
echo '<input type="hidden" name="user_to_update" value="' . $uname . '" />';
}
?>
<tr class="newuserrow">
<td class="newuserelement"><input type="text" name="newuser" class="newuserinput"></td>
<?php
foreach ($userManager->usergroups as $name => $group) {
echo '<td><input type="checkbox" name="newuser_' . $name . '" class="usergroupcheckbox">' . $name . '</td>';
}
?>
</tr>
</table>
<input type="submit" class="btn" value="Lagre">
</form>
</main>
</body>
+76
View File
@@ -0,0 +1,76 @@
<?php
ini_set('display_errors', '1');
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
error_reporting(\E_ALL);
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->isAdmin($uname)) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
if (isset($_POST['newuser'])) {
$newUser = $_POST['newuser'];
unset($_POST['newuser']);
}
// $updatingUsers = explode('_', $_POST['users']);
$updatingUsers = [];
foreach ($_POST as $key => $value) {
if ($key === 'user_to_update') {
$updatingUsers[] = $value;
}
}
unset($_POST['user_to_update']);
// 2d array of usernames and their corresponding group flags
$userFlags = [];
if ($newUser) {
$userFlags[$newUser] = 0;
}
foreach ($_POST as $namegroup => $info) {
$data = explode('_', $namegroup);
$group = array_pop($data);
$uname = implode('_', $data);
if ($uname == 'newuser') {
if (!$newUser) {
continue;
}
$uname = $newUser;
}
if (!isset($userFlags[$uname])) {
$userFlags[$uname] = 0;
}
$userFlags[$uname] = ($userFlags[$uname] | $userManager->usergroups[$group]);
}
foreach ($updatingUsers as $uname) {
if (!array_key_exists($uname, $userFlags)) {
$userFlags[$uname] = 0;
}
}
foreach ($userFlags as $uname => $flag) {
$userManager->setGroups($uname, $flag);
}
header('Location: .');
?>
<a href=".">Om du ikke ble automatisk omdirigert tilbake klikk her</a>
+66
View File
@@ -0,0 +1,66 @@
<?php
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
$isAdmin = $userManager->isAdmin($uname);
$projectGroup = $userManager->hasGroup($uname, 'prosjekt');
$activityGroup = $userManager->hasGroup($uname, 'aktiviteter');
if (!($isAdmin | $projectGroup | $activityGroup)) {
header('Content-Type: text/plain', true, 403);
echo "Her har du ikke lov't'å'værra!!!\r\n";
exit;
}
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../css/normalize.css">
<link rel="stylesheet" href="../css/style.css">
<link rel="stylesheet" href="../css/events.css">
<link rel="stylesheet" href="../css/admin.css">
<meta name="theme-color" content="#024" />
<title>Administrasjonsverkstedet</title>
<header>Administrasjons&shy;verk&shy;stedet</header>
<body>
<nav id="navbar">
<?php echo navbar(1, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Administrasjon</h2>
<ul class="tools">
<?php
if ($isAdmin | $activityGroup) {
echo '<li><a class="btn" href="aktiviteter/?page=1">Aktiviteter/Hendelser</a></li>';
}
if ($isAdmin | $projectGroup) {
echo '<li><a class="btn" href="prosjekter/">Prosjekter</a></li>';
}
if ($isAdmin) {
echo '<li><a class="btn" href="motd/">Dagens melding</a></li>';
}
if ($isAdmin) {
echo '<li><a class="btn" href="brukere/">Brukerrettigheter</a></li>';
}
?>
<ul>
</main>
</body>
+71
View File
@@ -0,0 +1,71 @@
<?php
ini_set('display_errors', '1');
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'no_NO');
error_reporting(\E_ALL);
require __DIR__ . '/../../../inc/navbar.php';
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$attrs = $as->getAttributes();
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->isAdmin($uname)) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
$motdfetcher = new pvv\side\MOTD($pdo);
$motd = $motdfetcher->getMOTD();
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../../css/normalize.css">
<link rel="stylesheet" href="../../css/style.css">
<link rel="stylesheet" href="../../css/nav.css">
<link rel="stylesheet" href="../../css/events.css">
<link rel="stylesheet" href="../../css/admin.css">
<meta name="theme-color" content="#024" />
<title>MOTDadministrasjonsverkstedet</title>
<header>MOTD&shy;administrasjons&shy;verk&shy;stedet</header>
<body>
<nav>
<?php echo navbar(2, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Dagens melding</h2>
<hr class="ruler">
<form action="update.php", method="post">
<p class="subtitle no-chin">Tittel</p>
<p class="subnote">Ikke nødvendig</p>
<input type="text" name="title" value="<?php echo $motd['title']; ?>" class="boxinput" style="width:66%;"><br>
<p class="subtitle no-chin">Innhold (<i>markdown</i>)</p>
<textarea name="content" style="width:100%" rows="8" class="boxinput"><?php echo implode("\n", $motd['content']); ?></textarea>
<div style="margin-top: 2em;">
<hr class="ruler">
<?php echo '<input type="submit" class="btn" value="Lagre endringer"></a>'; ?>
</div>
</form>
</main>
</body>
+35
View File
@@ -0,0 +1,35 @@
<?php
ini_set('display_errors', '1');
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'no_NO');
error_reporting(\E_ALL);
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!isset($_POST['title']) || !isset($_POST['content'])) {
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;
}
if (!$userManager->isAdmin($uname)) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
$motdfetcher = new pvv\side\MOTD($pdo);
$motdfetcher->setMOTD($_POST['title'], $_POST['content']);
header('Location: .');
?>
<a href=".">Om du ikke ble automatisk omdirigert tilbake klikk her</a>
+28
View File
@@ -0,0 +1,28 @@
<?php
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->hasGroup($uname, 'prosjekt')) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
$projectID = $_GET['id'];
$query = 'DELETE FROM projects WHERE id=\'' . $projectID . '\'';
$statement = $pdo->prepare($query);
$statement->execute();
header('Location: ' . $_SERVER['HTTP_REFERER']);
?>
<a href=".?page=1">Om du ikke ble omdirigert tilbake klikk her</a>
+148
View File
@@ -0,0 +1,148 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../../inc/navbar.php';
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->hasGroup($uname, 'prosjekt')) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
$projectManager = new pvv\side\ProjectManager($pdo);
$projects = $projectManager->getAll();
$new = 0;
if (isset($_GET['new'])) {
$new = $_GET['new'];
}
$projectID = 0;
if (isset($_GET['id'])) {
$projectID = $_GET['id'];
} elseif ($new == 0) {
echo "\nID not set";
exit;
}
$project = new pvv\side\Project(
0,
'Kult Prosjekt',
'',
'kåre knoll',
'pvvadmin',
'drift@pvv.ntnu.no',
0
);
if ($new == 0) {
$project = $projectManager->getByID($projectID);
}
$members = $projectManager->getProjectMembers($projectID);
$owner = [
'name' => '',
'uname' => '',
'mail' => '',
];
foreach ($members as $i => $data) {
if ($data['owner']) {
$owner = $data;
}
}
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../../css/normalize.css">
<link rel="stylesheet" href="../../css/style.css">
<link rel="stylesheet" href="../../css/events.css">
<link rel="stylesheet" href="../../css/admin.css">
<meta name="theme-color" content="#024" />
<title>Prosjektadministrasjonsverkstedet</title>
<header>Prosjekt&shy;administrasjons&shy;verk&shy;stedet</header>
<body>
<nav>
<?php echo navbar(3, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Prosjektadministrasjon</h2>
<hr class="ruler">
<h2><?php echo $new == 1 ? 'Nytt prosjekt' : 'Rediger prosjekt'; ?></h2>
<form action="update.php", method="post" class="gridsplit5050">
<div class="gridl">
<p class="subtitle">Tittel</p>
<?php echo '<input type="text" name="title" value="' . $project->getName() . '" class="boxinput">'; ?><br>
<p class="subtitle">Beskrivelse (<i>markdown</i>)</p>
<textarea name="desc" cols="40" rows="5" class="boxinput"><?php echo implode("\n", $project->getDescription()); ?></textarea>
</div>
<div class="gridr noborder">
<p class="subtitle">Prosjektleder (Brukernavn)</p>
<?php echo '<input type="text" name="organiser" value="' . $owner['uname'] . '" class="boxinput">'; ?><br>
<p class="subtitle">Prosjektleder (Navn)</p>
<?php echo '<input type="text" name="organisername" value="' . $owner['name'] . '" class="boxinput">'; ?>
<p class="subtitle">Prosjektleder E-post</p>
<?php echo '<input type="text" name="organiseremail" value="' . $owner['mail'] . '" class="boxinput">'; ?><br>
<p class="subtitle">Aktiv</p>
<?php echo '<input type="checkbox" ' . ($project->getActive() ? 'checked' : '') . ' name="active"/>'; ?>
</div>
<?php echo '<input type="hidden" name="id" value="' . $project->getID() . '" />'; ?>
<?php if (!$new) { ?>
<div style="grid-column: span 2;">
<hr class="ruler">
</div>
<h2 style="grid-column: span 2">Prosjektmedlemmer</h2>
<table class="userlist" style="grid-column: span 2;">
<tr><th>Brukernavn</th><th>Navn</th><th>Rolle</th></tr>
<?php foreach ($members as $i => $data) { ?>
<tr>
<td><?php echo $data['uname']; ?></td>
<td><?php echo $data['name']; ?></td>
<td><?php echo $data['role']; ?></td>
</tr>
<?php } ?>
<tr class="newuserrow">
<td class="newuserelement"><input type="text" name="newuser_uname"></td>
<td class="newuserelement"><input type="text" name="newuser_name"></td>
<td class="newuserelement"><input type="text" name="newuser_role"></td>
</tr>
</table>
<?php } ?>
<div class="allgrids" style="margin-top: 2em;">
<hr class="ruler">
<input type="submit" class="btn" value="Lagre">
</div>
</form>
<p>
</main>
</body>
+146
View File
@@ -0,0 +1,146 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../../inc/navbar.php';
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->hasGroup($uname, 'prosjekt')) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
$projectManager = new pvv\side\ProjectManager($pdo);
$projects = $projectManager->getAll();
$page = 1;
if (isset($_GET['page'])) {
$page = $_GET['page'];
}
$filterTitle = '';
if (isset($_POST['title'])) {
$filterTitle = $_POST['title'];
}
/* Temporarily out of service :<
$filterOrganiser = '';
if(isset($_POST['organiser'])){
$filterOrganiser = $_POST['organiser'];
}
*/
// filter
$projects = array_values(array_filter(
$projects,
static fn($project) => preg_match('/.*' . $filterTitle . '.*/i', $project->getName())
));
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../../css/normalize.css">
<link rel="stylesheet" href="../../css/style.css">
<link rel="stylesheet" href="../../css/nav.css">
<link rel="stylesheet" href="../../css/events.css">
<link rel="stylesheet" href="../../css/admin.css">
<meta name="theme-color" content="#024" />
<title>Prosjektadministrasjonsverkstedet</title>
<header>Prosjekt&shy;administrasjons&shy;verk&shy;stedet</header>
<body>
<nav>
<?php echo navbar(2, 'admin'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<h2>Prosjektadministrasjon</h2>
<hr class="ruler">
<div class="gridsplit">
<div class="gridl">
<h2 class="no-chin">Prosjekter</h2>
<ul class="event-list">
<?php
$counter = 0;
$pageLimit = 4;
for ($i = ($pageLimit * ($page - 1)); $i < count($projects); ++$i) {
if ($counter == $pageLimit) {
break;
}
$project = $projects[$i];
$projectID = $project->getID();
$owner = $projectManager->getProjectOwner($projectID);
?>
<li>
<div class="event admin">
<div class="event-info">
<h3 class="no-chin"><?php echo $project->getName() . ' (ID: ' . $projectID . ')'; ?></h3>
<p class="subnote"><?php echo 'Organisert av: ' . $owner['name']; ?></p>
<?php
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $project->getDescription()));
?>
</div>
<div class="event-actions">
<?php echo '<a href="edit.php?id=' . $projectID . '">🖊</a>'; ?>
<?php echo '<a href="delete.php?id=' . $projectID . '" onclick="return confirm(\'Knallsikker? (ID: ' . $projectID . ')\');">🗑</a>'; ?>
</div>
</div>
</li>
<?php
++$counter;
}
?>
</ul>
<?php
if ($page != 1) {
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '">Forrige side</a>';
}
if (($counter == $pageLimit) && (($pageLimit * $page) < count($projects))) {
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '">Neste side</a>';
}
?>
</div>
<div class="gridr">
<h2>Verktøy</h2>
<a class="btn adminbtn" href="edit.php?new=1">Legg inn nytt prosjekt</a>
<h2>Filter</h2>
<form action="." method="post">
<p class="no-chin">Prosjektnavn</p>
<?php echo '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">'; ?><br>
<p class="no-chin">Leders brukernavn</p>
<?php echo '<input type="text" name="organiser" class="boxinput" value="">'; ?><br>
<div style="margin-top: 2em;">
<input type="submit" class="btn" value="Filtrer"></input>
</div>
</form>
</div>
</div>
</main>
</body>
+80
View File
@@ -0,0 +1,80 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new pvv\admin\UserManager($pdo);
require_once __DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
if (!$userManager->hasGroup($uname, 'prosjekt')) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit;
}
if (!isset($_POST['title']) || !isset($_POST['desc']) || !isset($_POST['organisername']) || !isset($_POST['organiser'])) {
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;
}
$id = 0;
if (isset($_POST['id'])) {
$id = $_POST['id'];
}
$title = $_POST['title'];
$desc = $_POST['desc'];
$name = $_POST['organisername'];
$uname = $_POST['organiser'];
$mail = $_POST['organiseremail'];
$active = ($_POST['active'] ?? false);
if ($id == 0) {
$query = 'INSERT INTO projects (name, description, active) VALUES (:title, :desc, :active)';
$statement = $pdo->prepare($query);
$statement->bindParam(':title', $title, PDO::PARAM_STR);
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
$statement->bindParam(':active', $active, PDO::PARAM_BOOL);
$statement->execute();
$ownerQuery = 'INSERT INTO projectmembers (projectid, name, uname, mail, role, lead, owner) VALUES (last_insert_rowid(), :owner, :owneruname, :owneremail, \'Prosjektleder\', 1, 1)';
$statement = $pdo->prepare($ownerQuery);
$statement->bindParam(':owner', $name, PDO::PARAM_STR);
$statement->bindParam(':owneruname', $uname, PDO::PARAM_STR);
$statement->bindParam(':owneremail', $mail, PDO::PARAM_STR);
$statement->execute();
} else {
$query = 'UPDATE projects SET name=:title, description=:desc, active=:active WHERE id=:id';
$statement = $pdo->prepare($query);
$statement->bindParam(':title', $title, PDO::PARAM_STR);
$statement->bindParam(':desc', $desc, PDO::PARAM_STR);
$statement->bindParam(':active', $active, PDO::PARAM_BOOL);
$statement->bindParam(':id', $id, PDO::PARAM_INT);
$statement->execute();
$query = 'UPDATE projectmembers SET name=:name, uname=:uname, mail=:mail';
$statement = $pdo->prepare($query);
$statement->bindParam(':name', $name, PDO::PARAM_STR);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
$statement->bindParam(':mail', $mail, PDO::PARAM_STR);
$statement->execute();
}
header('Location: .');
?>
<a href=".?page=1">Om du ikke ble automatisk omdirigert tilbake klikk her</a>
+86
View File
@@ -0,0 +1,86 @@
<?php
namespace pvv\side;
require_once \dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$year = (isset($_GET['year']))
? $_GET['year']
: date('Y');
$month = (isset($_GET['month']))
? $_GET['month']
: date('m');
$day = (isset($_GET['day']))
? $_GET['day']
: -1;
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../css/normalize.css">
<link rel="stylesheet" href="../css/style.css">
<link rel="stylesheet" href="../css/events.css">
<meta name="theme-color" content="#024" />
<title>Aktivitetsverkstedet</title>
<header>Aktivitets&shy;verk&shy;stedet</header>
<body>
<nav>
<?php echo navbar(1, 'aktiviteter'); ?>
<?php echo loginbar(null, $pdo); ?>
</nav>
<main>
<?php
use DateTimeImmutable;
$events = ($day == -1)
? $agenda->getNextOfEach(new DateTimeImmutable())
: $agenda->getEventsBetween(
new DateTimeImmutable("{$year}-{$month}-{$day} 00:00:00"),
new DateTimeImmutable("{$year}-{$month}-{$day} 23:59:59")
);
$limit = 0;
foreach ($events as $event) {
?>
<article>
<h2>
<?php if (Agenda::isToday($event->getStart())) { ?><strong><?php } ?>
<em><?php echo $event->getRelativeDate(); ?></em>
<?php if (Agenda::isToday($event->getStart())) { ?></strong><?php } ?>
<?php if ($event->getURL()) { ?>
<br>
<a href="<?php echo $event->getURL(); ?>"><?php echo $event->getName(); ?></a>
<?php } else { ?>
<?php echo $event->getName(); ?>
<?php } ?>
<?php if ($event->getImageURL()) { ?>
<img src="<?php echo $event->getImageURL(); ?>">
<?php } ?>
</h2>
<ul class="subtext">
<li>Tid: <strong><?php echo Agenda::getFormattedDate($event->getStart()); ?></strong></li>
<li>Sted: <strong><?php echo $event->getLocation(); ?></strong></li>
<li>Arrangør: <strong><?php echo $event->getOrganiser(); ?></strong></li>
</ul>
<?php $description = $event->getDescription(); ?>
<?php if ($limit) {
array_splice($description, $limit);
} ?>
<?php
$Parsedown = new \Parsedown();
echo $Parsedown->text(implode("\n", $description));
?>
</article>
<?php } ?>
</main>
</body>
+60
View File
@@ -0,0 +1,60 @@
<?php
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use pvv\side\Agenda;
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../css/normalize.css">
<link rel="stylesheet" href="../css/style.css">
<link rel="stylesheet" href="../css/nav.css">
<link rel="stylesheet" href="../css/events.css">
<meta name="theme-color" content="#024" />
<title>Animeverkstedet</title>
<header>Sosial&shy;verk&shy;stedet</header>
<main>
<?php
$activity = new pvv\side\social\AnimekveldActivity();
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable());
?>
<article>
<h2><em><?php echo $nextEvent->getRelativeDate(); ?></em> Animekveld
<?php if ($nextEvent->getImageURL()) { ?>
<img src="<?php echo $nextEvent->getImageURL(); ?>">
<?php } ?>
</h2>
<ul class="subtext">
<li>Tid:
<strong>
<?php echo Agenda::getFormattedDate($nextEvent->getStart()); ?>
</strong>
<li>Sted:
<strong>
<?php echo $nextEvent->getLocation(); ?>
</strong>
<li>Arrangør:
<strong>
<?php echo $nextEvent->getOrganiser(); ?>
</strong>
</ul>
<?php
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $nextEvent->getDescription()));
?>
</article>
</main>
<nav>
<?php echo navbar(1, 'aktiviteter'); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>
+61
View File
@@ -0,0 +1,61 @@
<?php
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use pvv\side\Agenda;
?>
<!DOCTYPE html>
<html lang="no">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="favicon.ico">
<link rel="stylesheet" href="../css/normalize.css">
<link rel="stylesheet" href="../css/style.css">
<link rel="stylesheet" href="../css/nav.css">
<link rel="stylesheet" href="../css/events.css">
<meta name="theme-color" content="#024" />
<title>Sosialverkstedet</title>
<header>Sosial&shy;verk&shy;stedet</header>
<main>
<?php
$activity = new pvv\side\social\BrettspillActivity();
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable());
?>
<article>
<h2><em><?php echo $nextEvent->getRelativeDate(); ?></em> Brettspillkveld
<?php if ($nextEvent->getImageURL()) { ?>
<img src="<?php echo $nextEvent->getImageURL(); ?>">
<?php } ?>
</h2>
<ul class="subtext">
<li>Tid:
<strong>
<?php echo Agenda::getFormattedDate($nextEvent->getStart()); ?>
</strong>
<li>Sted:
<strong>
<?php echo $nextEvent->getLocation(); ?>
</strong>
<li>Arrangør:
<strong>
<?php echo $nextEvent->getOrganiser(); ?>
</strong>
</ul>
<?php
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $nextEvent->getDescription()));
?>
</article>
</main>
<nav>
<?php echo navbar(1, 'aktiviteter'); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>
+107
View File
@@ -0,0 +1,107 @@
.tools {
width: 100%;
margin: 0;
padding: 0;
list-style: none;
}
.tools li {
margin: 1.5em 0;
}
.event-list {
padding: 0;
list-style: none;
}
.event {
display: grid;
grid-template-columns: auto 5em;
margin-bottom: 2em;
padding-bottom: .5em;
border-bottom: 1px dotted rgba(0,0,0,0.5);
}
.event-info {
grid-column: 1;
overflow-x: hidden; /*force text wrap*/
word-wrap: break-word;
}
.event-info h3 {
padding: 0;
margin-top: 0;
}
.event-info p {
word-wrap: break-word;
}
.event-info a {
color: black;
text-decoration: none;
}
.event-info a:hover {
text-decoration: underline;
}
.event-actions {
grid-column: 2;
text-align: right;
}
.event-actions .btn {
margin: 0.3em 0;
display: inline-block;
}
.fullwidth_inputs input,
.fullwidth_inputs textarea {
width: 100%;
}
.allgrids {
grid-column: 1 / -1;
}
.float-right {
float: right;
}
.float-left {
float: left;
}
.userlist {
table-layout: fixed;
width: 100%;
margin: 1em 0;
}
.userlist tr th {
text-align: left;
}
.userlist tr {
border-bottom: 1px solid gray;
min-width: 100%;
}
.usergroupcheckbox {
margin-right: .3em;
}
.newuserrow {
background-color: #ddd;
}
.newuserelement {
background-color: #ddd;
border-bottom: 2px dotted gray;
}
.newuserelement input {
border: none;
background-color: #ddd;
}
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17.01 14.258" enable-background="new 0 0 17.01 14.258"><style type="text/css">.st0{fill:#004166;}</style><path class="st0" d="M14.009 8.551l.01-.019.005-.023.003-.014-.001-.006-.004-.022-.007-.021-.002-.006-4.629-8.382-.006-.006-.009-.013-.01-.01-.012-.009-.006-.005-.006-.002-.013-.005-.015-.004-.016-.002-.006-.002h-1.642l-.015.003-.021.004-.02.01-.017.012-.015.017-.009.011-4.233 7.425-.002.006-.007.021-.005.022-.001.006v2.86l.003.014.005.023.009.019.012.018.017.015.011.009.008.003.009.004.039.008h1.421l.038-.008.009-.004.031-.021.001-.001.019-.025 1.017-1.844h5.067l1.007 1.844.019.025.002.001.03.02.009.004.038.008h1.125l.04-.008.011-.005.023-.015.01-.009.015-.023.006-.011.002-.004.649-1.869.009-.014zm-.843 1.734h-.859l.582-1.678h.859l-.582 1.678zm-1.996-1.855l-.015-.018-.017-.012-.019-.01-.023-.005-.014-.003h-5.2l-.015.003-.023.005-.019.01-.018.012-.015.018-.01.011-1.017 1.844h-1.161l5.679-9.944 4.44 8.041h-.846l-3.426-6.236-.006-.007-.014-.017-.018-.015-.006-.006-.012-.003-.022-.007-.021-.002-.021.002-.021.007-.012.003-.007.006-.017.014-.014.018-.006.006-2.776 5.035-.002.005-.006.021-.005.023-.001.005.003.014.005.024.009.018.012.018.017.015.012.01.007.003.008.003.039.007h3.788l.039-.008.009-.004.007-.003.011-.009.018-.015.012-.017.01-.019.005-.023.003-.015-.001-.006-.004-.022-.007-.022-.002-.005-1.842-3.315-.037-.038.768-1.392 3.335 6.073-.572 1.649-.936-1.714-.01-.011zm-7.647-.863l4.186-7.342h1.383l-5.569 9.75v-2.408zm3.619-1.127h2.653l.378.682h-3.407l.376-.682zm.124-.225l1.198-2.173 1.206 2.173h-2.404zM1.197 14.258l-.13-.325h-.729l-.13.325h-.208l.588-1.464h.226l.591 1.464h-.208zm-.494-1.276l-.312.788h.621l-.309-.788zM2.123 14.258v-1.464h.959v.162h-.776v.472h.762v.162h-.762v.667h-.183zM4.22 14.258v-1.302h-.463v-.162h1.111v.162h-.465v1.302h-.183zM5.637 14.258v-1.464h.959v.162h-.777v.472h.762v.162h-.762v.505h.777v.162h-.959zM8.261 14.258l-.373-.582h-.292v.582h-.183v-1.464h.588c.268 0 .459.171.459.441 0 .263-.18.408-.38.426l.395.597h-.214zm.011-1.023c0-.165-.119-.279-.292-.279h-.384v.56h.384c.173 0 .292-.117.292-.281zM9.275 14.258v-1.464h.182v1.302h.681v.162h-.863zM10.613 13.527c0-.433.292-.757.727-.757.432 0 .727.325.727.757 0 .433-.294.758-.727.758-.435-.001-.727-.326-.727-.758zm1.264 0c0-.342-.211-.595-.538-.595-.329 0-.538.252-.538.595 0 .34.209.595.538.595.328 0 .538-.255.538-.595zM12.644 13.527c0-.454.336-.757.753-.757.259 0 .439.114.569.275l-.145.09c-.092-.119-.248-.202-.424-.202-.321 0-.564.246-.564.595 0 .347.244.597.564.597.176 0 .321-.086.393-.158v-.299h-.503v-.162h.685v.529c-.136.151-.336.252-.575.252-.417-.001-.753-.306-.753-.76zM14.84 14.258v-1.464h.182v1.464h-.182zM15.699 13.527c0-.45.332-.757.753-.757.259 0 .439.125.555.29l-.154.086c-.083-.123-.235-.213-.402-.213-.321 0-.564.246-.564.595 0 .347.244.595.564.595.167 0 .318-.088.402-.213l.156.086c-.123.167-.299.29-.558.29-.421-.002-.752-.309-.752-.759z"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

+113
View File
@@ -0,0 +1,113 @@
.pagination_bar {
display: grid;
grid-template-columns: 8em auto 8em;
grid-template-areas: "left . right";
text-align: center;
}
.pagination_bar >*:nth-child(1) {
grid-area: left;
}
.pagination_bar >*:nth-child(2) {
grid-area: right;
}
figure.calendar {
margin: 0;
padding:0;
overflow-x: auto;
}
.calendar ul {
min-width: 43em;
list-style-type: none;
padding-left:0;
display: grid;
grid-template-columns: repeat(7, 4fr);
grid-template-rows: auto;
}
.calendar ul a {
text-decoration: none;
color: inherit;
}
.calendar ul a div {
min-height: 4.8em;
}
.calendar ul li {
margin: 2px;
border-style: solid;
border-color: #e0e0e0;
border-width: 1px;
border-radius: 5px;
background-color: #f3f3f3;
padding: 0.2em 0.5em;
padding-bottom: 0.5em;
min-height: 4.8em;
font-size: 0.8em;
color: #444;
overflow: hidden;
}
.calendar ul li.header {
text-align: center;
min-height: 1em;
background-color: #fff;
border: None;
border-radius: 0;
margin: 0px;
padding: 0.2em 0;
font-size: 1em;
font-weight: 500;
color: #666;
}
.calendar ul li.outOfMonth {
opacity: 0;
}
.calendar ul li.active {
color: #222;
border-color: #679;
box-shadow: 0 0 3px #89f;
}
.calendar ul li:hover {
background-color: #fff;
}
.calendar ul li .day{
display: inline-block;
width: 1.75em;
height: 1.75em;
text-align: center;
line-height: 1.75em;
background: #9ab;
color: white;
border-radius: 0.875em;
margin-bottom: 0.1em;
font-size: 0.8em;
}
.calendar ul li.active .day{
background: #248;
}
.calendar ul li section {
line-height: 1.5em;
background: #038;
color: white;
border-radius: 0.75em;
text-align: center;
padding: 0 0.2em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.calendar ul li section + section {
margin-top: 0.1em;
}
+138
View File
@@ -0,0 +1,138 @@
h2 a, h4 a {
color: black;
text-decoration: none;
}
h2 a:hover, h4 a:hover {
text-decoration: underline;
}
h2 em {
display: inline-block;
color: gray;
font-size: .5em;
line-height: 2em;
float: left;
border: .1em solid gray;
padding: 0 1em;
border-radius: .25em;
font-style: normal;
}
h2 strong em {
background: #084;
border-color: #084;
color: white;
}
h2 img {
float: right;
max-width: 10em;
border: .1em solid white;
border-radius: 0.1em;
box-shadow: 0 2px 2px gray;
margin-left: 1em;
clear: right;
margin-bottom: 0.8em;
clear: left;
}
h4 {
margin-top: 0;
margin-bottom: -0.6em;
}
h2 + .subtext {
margin: -1.5em 0 1em 0;
}
p + .subtext {
margin: -0.5em 0 1em 0;
}
.subtext {
padding: 0;
list-style: none;
clear: left;
}
.subtext li {
display: inline;
margin-right: 3em;
font-size: .7em;
color: gray;
}
.subtext li a, .subtext li strong {
color: black;
font-size: 1.2em;
font-weight: normal;
}
.events:before {
height: 1px;
width: 100%;
display: block;
content: " ";
background-image: -webkit-linear-gradient(left, transparent, rgba(0,0,0,.1), transparent);
background-image: -moz-linear-gradient(left, transparent, rgba(0,0,0,.1), transparent);
background-image: -o-linear-gradient(left, transparent, rgba(0,0,0,.1), transparent);
margin: 0;
padding: 0;
border: 0;
}
.events {
margin-top: -1.5em;
margin-left: 0.3em;
margin-bottom: 2em;
list-style: none;
padding: 0;
}
.events >li {
padding-left: 0.5em;
border-left: 4px solid #35a;
margin-top: 0.9em;
}
.events li p {
text-align: left;
line-height: 1.5em;
word-wrap: break-word;
}
.events .subtext {
margin-bottom: 0;
}
.events li h4 +.subtext {
margin-top: 1em;
}
@media screen and (min-width: 50rem) {
article:first-child h2 img {
max-width: 12em;
}
}
@media screen and (max-width: 50rem) {
h2 {
position: relative;
border-bottom-left-radius: 0.3em;
border-bottom-right-radius: 0.3em;
max-height: 30vh;
overflow-y: hidden;
}
h2 em {
display: block;
top:0;
left: 0;
position: absolute;
}
h2 img {
border: none;
box-shadow: none;
border-radius: 0.3em;
float: none;
margin: 0;
max-width: none;
width: 100%;
}
article >.subtext {
margin-top: -1em !important;
}
.subtext li {
display: block;
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More