37 Commits

Author SHA1 Message Date
20bab54235 dist/simplesamlphp-authsources: set entityID for service provider 2025-03-19 01:34:39 +01:00
c3d8ce017d shell.nix: find rootlevel in shell hook 2025-03-18 21:25:41 +01:00
02cfe9feaa pvv_mysql.sql: format 2025-03-18 21:18:24 +01:00
4d4ec78ea3 pvv_sqlite.sql: format 2025-03-18 21:17:36 +01:00
a74ea31356 .envrc: init 2025-03-18 21:15:59 +01:00
0653672a17 shell.nix: add sql formatter 2025-03-18 21:15:59 +01:00
8a1ff1a265 dist/pvv.sql -> dist/pvv_sqlite.sql 2025-03-18 21:10:48 +01:00
c1802e7cf2 treewide: strict comparisons 2025-03-12 01:09:08 +01:00
84de16fc25 shell.nix: fix simplesamlphp symlink 2025-03-12 00:43:22 +01:00
23b8e91a6c git blame ignore the formattening 2025-03-12 00:43:21 +01:00
da8afe735c The formattening, part 2 2025-03-12 00:42:34 +01:00
b6697e5750 The formattening, part 1 2025-03-12 00:20:04 +01:00
ece3c8ab80 .php-cs-fixer: init 2025-03-12 00:19:41 +01:00
7297c83cea shell.nix: add some more tools 2025-03-11 22:28:54 +01:00
74662af3ef flake.lock: bump 2025-03-11 22:28:15 +01:00
32e147fd02 nix: php82 -> php84 2025-03-11 22:28:05 +01:00
d5c28d4e0f package.nix bump vendorHash 2025-03-11 21:23:32 +01:00
f1b3c63311 composer: bump deps 2025-03-11 20:37:24 +01:00
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
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
e7b66b4bc6 Revert "Calendar: Remove recurring events for summer break 2024"
This reverts commit ce99b309f8.
2024-09-01 19:45:59 +02:00
c62f4d4705 www/tjenester: update wiki link for hjemmesider 2024-08-21 10:46:43 +02:00
814e5bc6c7 www/tjenester: move nettsiden from github to gitea 2024-08-21 10:46:43 +02:00
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
a29d3fe803 Err, try again 2024-08-17 23:59:17 +02:00
8bcadd1d2d Merge pull request 'Replace deprecated functions to support php 8.3' () from php83-fixes-fr-fr into master
Reviewed-on: 
Reviewed-by: Oystein Kristoffer Tveit <oysteikt@pvv.ntnu.no>
2024-08-17 20:45:08 +02:00
8a82e2795c Various: Replace deprecated functions to support php 8.3 2024-08-17 18:31:43 +02:00
4ee8b73044 nix/shell: create slideshow dir 2024-08-17 01:35:14 +02:00
6580cfe546 Merge pull request 'treewide: flip arg order for implode()' () from i-am-imploding into master
Reviewed-on: 
Reviewed-by: Felix Albrigtsen <felixalb@pvv.ntnu.no>
2024-08-04 00:08:52 +02:00
a0f9e71d46 treewide: flip arg order for implode() 2024-08-04 00:01:34 +02:00
6e4a79ed3d Merge pull request 'Calendar: Remove recurring events for summer break 2024' () from calendar-disable-events into master
Reviewed-on: 
2024-06-15 00:36:32 +02:00
37445f42b5 Merge pull request 'Oppdater Matrix-server til Matrix Space™' () from info-updates into master
Reviewed-on: 
2024-05-30 21:19:42 +02:00
9717c11af5 Fix discord-server og matrix space 2024-05-30 21:19:29 +02:00
2cab4df4b1 Merge pull request 'fix: updated spaceapi coords' () from adriangl-patch-spaceapi-coords into master
Reviewed-on: 
2024-05-19 22:25:52 +02:00
18c8426246 fix: updated spaceapi coords 2024-05-19 22:09:37 +02:00
4890a0af04 nix/module: fix spaceapi endpoint 2024-05-19 20:06:22 +02:00
7bf2c31db3 feat: adds spaceapi endpoint ()
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: 
Co-authored-by: Felix Albrigtsen <felix@albrigtsen.it>
Co-committed-by: Felix Albrigtsen <felix@albrigtsen.it>
2024-05-18 20:05:13 +02:00
79 changed files with 3603 additions and 2935 deletions

1
.envrc Normal file

@ -0,0 +1 @@
use flake

3
.git-blame-ignore-revs Normal file

@ -0,0 +1,3 @@
# The formattening
c5d308654744e116090e9ba165a968b8bf66006c
da8afe735c62e1f8ee9ad5f71291d87102fe126b

58
.php-cs-fixer.php Normal 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")
;

@ -5,11 +5,12 @@
"config": {
"allow-plugins": {
"simplesamlphp/composer-module-installer": true
"simplesamlphp/composer-module-installer": true,
"simplesamlphp/composer-xmlprovider-installer": true
}
},
"require": {
"simplesamlphp/simplesamlphp": "^2.2",
"erusev/parsedown": "^1.7"
"simplesamlphp/simplesamlphp": "^2.2.1",
"erusev/parsedown": "^1.7.4"
}
}

1269
composer.lock generated

File diff suppressed because it is too large Load Diff

18
dist/config.local.php vendored

@ -1,24 +1,24 @@
<?php
$DB_DSN = 'sqlite:'.__DIR__.DIRECTORY_SEPARATOR.'pvv.sqlite';
declare(strict_types=1);
$DB_DSN = 'sqlite:' . __DIR__ . \DIRECTORY_SEPARATOR . 'pvv.sqlite';
$DB_USER = null;
$DB_PASS = null;
$DOOR_SECRET = "changeme";
$DOOR_SECRET = 'changeme';
$GALLERY_DIR = __DIR__.DIRECTORY_SEPARATOR.'www'.DIRECTORY_SEPARATOR.'galleri'.DIRECTORY_SEPARATOR.'bilder'.DIRECTORY_SEPARATOR.'gallery';
$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_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 = array("localhost:1080");
$SAML_ADMIN_PASSWORD = "changeme";
$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';
?>
$CACHE_DIRECTORY = __DIR__ . \DIRECTORY_SEPARATOR . 'cache';

@ -1,6 +1,6 @@
<?php
$configFile = getenv('PVV_CONFIG_FILE');
require_once($configFile);
declare(strict_types=1);
?>
$configFile = getenv('PVV_CONFIG_FILE');
require_once $configFile;

50
dist/pvv.sql vendored

@ -1,50 +0,0 @@
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);

16
dist/pvv_mysql.sql vendored

@ -25,23 +25,21 @@ CREATE TABLE projectmembers (
`owner` BOOLEAN DEFAULT 0
);
CREATE TABLE users (
`uname` TEXT,
`groups` INT 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);
CREATE TABLE door (
`time` INTEGER PRIMARY KEY,
`open` BOOLEAN
);
INSERT INTO door(time, open) VALUES (0, FALSE);
INSERT INTO
door (time, open)
VALUES
(0, FALSE);

54
dist/pvv_sqlite.sql vendored Normal 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);

@ -1,9 +1,12 @@
<?php
$config = array(
declare(strict_types=1);
$config = [
/* This is the name of this authentication source, and will be used to access it later. */
'default-sp' => array(
'default-sp' => [
'saml:SP',
'entityID' => 'https://www.pvv.ntnu.no/simplesaml/',
'idp' => 'https://idp.pvv.ntnu.no/',
),
);
],
];

@ -1,18 +1,19 @@
<?php
require_once(dirname(dirname(dirname(dirname(__DIR__)))) . DIRECTORY_SEPARATOR . 'config.php');
declare(strict_types=1);
require_once dirname(__DIR__, 4) . \DIRECTORY_SEPARATOR . 'config.php';
/**
* The configuration of SimpleSAMLphp
* The configuration of SimpleSAMLphp.
*/
$httpUtils = new \SimpleSAML\Utils\HTTP();
$httpUtils = new SimpleSAML\Utils\HTTP();
$config = [
/*******************************
/*
| BASIC CONFIGURATION OPTIONS |
*******************************/
*/
/*
* Setup the following parameters to match your installation.
@ -179,9 +180,9 @@ $config = [
/**********************************
/*
| SECURITY CONFIGURATION OPTIONS |
**********************************/
*/
/*
* This is a secret salt used by SimpleSAMLphp when it needs to generate a secure hash
@ -287,9 +288,9 @@ $config = [
*/
/************************
/*
| ERRORS AND DEBUGGING |
************************/
*/
/*
* The 'debug' option allows you to control how SimpleSAMLphp behaves in certain
@ -347,9 +348,9 @@ $config = [
*/
/**************************
/*
| LOGGING AND STATISTICS |
**************************/
*/
/*
* Define the minimum log level to log. Available levels:
@ -409,7 +410,7 @@ $config = [
*
* The default is to use LOG_LOCAL5 if available, and fall back to LOG_USER if not.
*/
'logging.facility' => defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : LOG_USER,
'logging.facility' => defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : \LOG_USER,
/*
* The process name that should be used when logging to syslog.
@ -445,9 +446,9 @@ $config = [
/***********************
/*
| PROXY CONFIGURATION |
***********************/
*/
/*
* Proxy to use for retrieving URLs.
@ -466,9 +467,9 @@ $config = [
/**************************
/*
| DATABASE CONFIGURATION |
**************************/
*/
/*
* This database configuration is optional. If you are not using
@ -528,9 +529,9 @@ $config = [
/*************
/*
| PROTOCOLS |
*************/
*/
/*
* Which functionality in SimpleSAMLphp do you want to enable. Normally you would enable only
@ -542,9 +543,9 @@ $config = [
/***********
/*
| MODULES |
***********/
*/
/*
* Configuration for enabling/disabling modules. By default the 'core', 'admin' and 'saml' modules are enabled.
@ -562,13 +563,13 @@ $config = [
'exampleauth' => false,
'core' => true,
'admin' => true,
'saml' => true
'saml' => true,
],
/*************************
/*
| SESSION CONFIGURATION |
*************************/
*/
/*
* This value is the duration of the session in seconds. Make sure that the time duration of
@ -692,9 +693,9 @@ $config = [
/**************************
/*
| MEMCACHE CONFIGURATION |
**************************/
*/
/*
* Configuration for the 'memcache' session store. This allows you to store
@ -814,9 +815,9 @@ $config = [
/*************************************
/*
| LANGUAGE AND INTERNATIONALIZATION |
*************************************/
*/
/*
* Languages available, RTL languages, and what language is the default.
@ -846,7 +847,7 @@ $config = [
'language.cookie.lifetime' => (60 * 60 * 24 * 900),
'language.cookie.samesite' => $httpUtils->canSetSameSiteNone() ? 'None' : null,
/**
/*
* Custom getLanguage function called from SimpleSAML\Locale\Language::getLanguage().
* Function should return language code of one of the available languages or NULL.
* See SimpleSAML\Locale\Language::getLanguage() source code for more info.
@ -858,9 +859,9 @@ $config = [
* 'language.get_language_function' => ['\SimpleSAML\Module\example\Template', 'getLanguage'],
*/
/**************
/*
| APPEARANCE |
**************/
*/
/*
* Which theme directory should be used?
@ -873,7 +874,7 @@ $config = [
*/
// 'theme.header' => 'SimpleSAMLphp',
/**
/*
* A template controller, if any.
*
* Used to intercept certain parts of the template handling, while keeping away unwanted/unexpected hooks. Set
@ -937,16 +938,16 @@ $config = [
],
],
/**
/*
* Set to a full URL if you want to redirect users that land on SimpleSAMLphp's
* front page to somewhere more useful. If left unset, a basic welcome message
* is shown.
*/
// 'frontpage.redirect' => 'https://example.com/',
/*********************
/*
| DISCOVERY SERVICE |
*********************/
*/
/*
* Whether the discovery service should allow the user to save his choice of IdP.
@ -975,9 +976,9 @@ $config = [
/*************************************
/*
| AUTHENTICATION PROCESSING FILTERS |
*************************************/
*/
/*
* Authentication processing filters that will be executed for all IdPs
@ -1059,9 +1060,9 @@ $config = [
/**************************
/*
| METADATA CONFIGURATION |
**************************/
*/
/*
* This option allows you to specify a directory for your metadata outside of the standard metadata directory
@ -1181,9 +1182,9 @@ $config = [
'metadata.sign.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
/****************************
/*
| DATA STORE CONFIGURATION |
****************************/
*/
/*
* Configure the data store for SimpleSAMLphp.
@ -1287,9 +1288,9 @@ $config = [
*/
'store.redis.sentinels' => [],
/*********************
/*
| IdP/SP PROXY MODE |
*********************/
*/
/*
* If the IdP in front of SimpleSAMLphp in IdP/SP proxy mode sends

@ -1,23 +1,21 @@
<?php
$metadata['https://idp.pvv.ntnu.no/'] = array (
declare(strict_types=1);
$metadata['https://idp.pvv.ntnu.no/'] = [
'metadata-set' => 'saml20-idp-remote',
'entityid' => 'https://idp.pvv.ntnu.no/',
'SingleSignOnService' =>
array (
0 =>
array (
'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' =>
array (
0 =>
array (
],
],
'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',
);
];

6
flake.lock generated

@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1707939175,
"narHash": "sha256-D1xan0lgxbmXDyzVqXTiSYHLmAMrMRdD+alKzEO/p3w=",
"lastModified": 1741678040,
"narHash": "sha256-rmBsz7BBcDwfvDkxnKHmolKceGJrr0nyz5PQYZg0kMk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f7e8132daca31b1e3859ac0fb49741754375ac3d",
"rev": "3ee8818da146871cd570b164fc4f438f78479a50",
"type": "github"
},
"original": {

@ -18,7 +18,7 @@
in {
packages = forAllSystems (system: pkgs: {
default = self.packages.${system}.pvv-nettsiden;
pvv-nettsiden = pkgs.callPackage ./nix/package.nix { php = pkgs.php82; };
pvv-nettsiden = pkgs.callPackage ./nix/package.nix { php = pkgs.php84; };
});
overlays.default = final: prev: {
@ -33,9 +33,5 @@
devShells = forAllSystems (system: pkgs: {
default = pkgs.callPackage ./nix/shell.nix { inherit pkgs; };
});
# TODO:
# - Relicense the project to GPL or something
# - Write a module for the project
};
}

@ -1,11 +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 = 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),
$agenda = new pvv\side\Agenda([
new pvv\side\social\NerdepitsaActivity(),
new pvv\side\social\AnimekveldActivity(),
new pvv\side\DBActivity($pdo),
]);

@ -1,33 +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 __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, ['', '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']);
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');
setlocale(\LC_ALL, 'nb_NO');
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
$sp = 'default-sp';
$as = new \SimpleSAML\Auth\Simple($sp);
$as = new SimpleSAML\Auth\Simple($sp);
use \pvv\side\Agenda;
$agenda = new \pvv\side\Agenda([
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),
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'];

@ -1,5 +1,7 @@
<?php
function navbar($depth, $active = NULL) {
declare(strict_types=1);
function navbar($depth, $active = null) {
$result = "\n\t<ul id=\"menu\">\n";
$menuItems = [
'Hjem' => '',
@ -16,7 +18,7 @@ function navbar($depth, $active = NULL) {
];
foreach ($menuItems as $caption => $link) {
$isActive = $active === $link;
if (substr( $link, 0, 4 ) != "http") {
if (substr($link, 0, 4) !== 'http') {
$link = rtrim(str_repeat('../', $depth) . $link, '/') . '/';
}
@ -25,17 +27,19 @@ function navbar($depth, $active = NULL) {
$result .= "\t\t<li" . ($isActive ? ' class="active"' : '') . '>'
. '<a href="' . $link . '">'
. $caption
. "</a></li>\n"
;
. "</a></li>\n";
}
return $result . "\t</ul>\n";
}
function loginBar($sp = null, $pdo = null) {
if (is_null($sp)) $sp = 'default-sp';
if (null === $sp) {
$sp = 'default-sp';
}
$result = "\n";
require_once(__DIR__ . '/../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple($sp);
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" />
@ -48,7 +52,7 @@ function loginBar($sp = null, $pdo = null) {
$uname = $attr['uid'][0];
$isAdmin = false;
if (isset($pdo)) {
$userManager = new \pvv\admin\UserManager($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";

@ -7,7 +7,7 @@ php.buildComposerProject rec {
src = ./..;
pname = "pvv-nettsiden";
version = "0.0.1";
vendorHash = "sha256-sWC5E60toa95re2NugvHVPT+vKYXc1I6Z3rSqXxTUu0=";
vendorHash = "sha256-8UYf7FhrTKgCa2e8GwhU8EF1AfWzZtgseTZqUAGOL0U=";
passthru.simplesamlphpPath = "share/php/pvv-nettsiden/vendor/simplesamlphp/simplesamlphp";

@ -1,26 +1,31 @@
{ pkgs }:
{ pkgs, lib }:
let
phpEnv = pkgs.php82.buildEnv {
phpEnv = pkgs.php84.buildEnv {
extensions = { enabled, all }: enabled ++ (with all; [ iconv mbstring pdo_mysql pdo_sqlite ]);
};
in
pkgs.mkShellNoCC {
buildInputs = with pkgs; [
phpEnv
php82Packages.composer
sqlite
git
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/'
# Prepare dev environment with sqlite and config files
test -e pvv.sqlite || sqlite3 pvv.sqlite < dist/pvv.sql
test -e config.php || cp -v dist/config.local.php config.php
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 vendor ] ; then
if [ ! -d "$PROJECT_ROOT/vendor" ] ; then
pushd "$PROJECT_ROOT"
composer install || exit $?
cp dist/simplesamlphp-authsources.php vendor/simplesamlphp/simplesamlphp/config/authsources.php
@ -29,7 +34,8 @@ pkgs.mkShellNoCC {
cp dist/config.local.php config.php
ln -s ../vendor/simplesamlphp/simplesamlphp/www/ www/simplesaml
ln -s ../vendor/simplesamlphp/simplesamlphp/public/ www/simplesaml
popd "$PROJECT_ROOT"
fi
'';
}

@ -1,4 +1,6 @@
<?php
declare(strict_types=1);
/*
* Copyright (c) 2014-2015, Jørn Åne de Jong <@jornane>
*
@ -14,7 +16,7 @@
* 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.
*
@ -36,4 +38,4 @@
*/
spl_autoload_extensions('.php');
spl_autoload_register('spl_autoload');
set_include_path( realpath( __DIR__ ) . PATH_SEPARATOR . get_include_path() );
set_include_path(realpath(__DIR__) . \PATH_SEPARATOR . get_include_path());

@ -1,7 +1,8 @@
<?php
namespace pvv\admin;
use \PDO;
declare(strict_types=1);
namespace pvv\admin;
class UserManager {
private $pdo;
@ -9,29 +10,29 @@ class UserManager{
public $usergroups = [
'admin' => 1,
'prosjekt' => 2,
'aktiviteter' => 4
'aktiviteter' => 4,
];
public function __construct($pdo) {
$this->pdo = $pdo;
}
public function setupUser($uname, $groups=0){
public function setupUser($uname, $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->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->bindParam(':groups', $groups, \PDO::PARAM_INT);
$statement->execute();
}
public function updateFlags($uname, $flags){
public function updateFlags($uname, $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);
$statement->bindParam(':groups', $flags, \PDO::PARAM_INT);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
}
public function addGroup($uname, $group){
public function addGroup($uname, $group): void {
$userFlags = $this->getUsergroups($uname);
if ($userFlags) {
@ -40,7 +41,7 @@ class UserManager{
}
}
public function removeGroup($uname, $group){
public function removeGroup($uname, $group): void {
$userFlags = $this->getUsergroups($uname);
if ($userFlags) {
@ -49,18 +50,18 @@ class UserManager{
}
}
public function setGroups($uname, $groups){
public function setGroups($uname, $groups): void {
$query = 'SELECT * FROM users WHERE uname=:uname LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
$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->bindParam(':groups', $groups, \PDO::PARAM_INT);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute();
} else {
$this->setupUser($uname, $groups);
@ -70,7 +71,7 @@ class UserManager{
public function hasGroup($uname, $groupName) {
$userFlags = $this->getUsergroups($uname);
return ($userFlags & $this->usergroups[$groupName]);
return $userFlags & $this->usergroups[$groupName];
}
// for convenience
@ -82,7 +83,7 @@ class UserManager{
$resultFlag = 0;
foreach ($this->usergroups as $name => $flag) {
if(in_array($name, $names)){
if (\in_array($name, $names, true)) {
$resultFlag = ($resultFlag | $flag);
}
}
@ -93,11 +94,14 @@ class UserManager{
public function getUsergroups($uname) {
$query = 'SELECT groups FROM users WHERE uname=:uname LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute();
$row = $statement->fetch();
if ($row == false) return 0;
if ($row === false) {
return 0;
}
return $row[0];
}
@ -125,7 +129,7 @@ class UserManager{
$uname = $userData['uname'];
$users[] = [
'name' => $uname,
'groups' => $this->getUsergroupNames($uname)
'groups' => $this->getUsergroupNames($uname),
];
}

@ -1,12 +1,11 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side;
use \DateTimeImmutable;
interface Activity {
public function getNextEventFrom(\DateTimeImmutable $date) /* : Event */;
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */;
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */;
public function getPreviousEventFrom(\DateTimeImmutable $date) /* : Event */;
}

@ -1,33 +1,34 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side;
use \DateTimeImmutable;
use \DateInterval;
class Agenda {
private $activities;
const TODAY = 0;
const TOMORROW = 1;
const THIS_WEEK = 2;
const NEXT_WEEK = 3;
const THIS_MONTH = 4;
const NEXT_MONTH = 5;
public const TODAY = 0;
public const TOMORROW = 1;
public const THIS_WEEK = 2;
public const NEXT_WEEK = 3;
public const THIS_MONTH = 4;
public const NEXT_MONTH = 5;
public function __construct($activities) {
$this->activities = $activities;
}
public static function getFormattedDate($date) {
return trim(strftime('%A %e. %b %H.%M', $date->getTimeStamp()));
return $date->format('l j. M H.i');
}
public function getEventsBetween(DateTimeImmutable $from, DateTimeImmutable $to) {
public function getEventsBetween(\DateTimeImmutable $from, \DateTimeImmutable $to) {
$results = [];
for($i = 0; $i < sizeof($this->activities); $i++) {
for ($i = 0; $i < \count($this->activities); ++$i) {
$result = [];
do {
$run = false;
if (sizeof($result)) {
if (\count($result)) {
$date = end($result)->getStop();
} else {
$date = $from;
@ -41,66 +42,73 @@ class Agenda {
$results[] = $result;
}
$result = [];
foreach($results as $a) foreach($a as $b) $result[] = $b;
usort($result, function($a, $b) {
return ($a->getStart() < $b->getStart()) ? -1 : 1;
});
foreach ($results as $a) {
foreach ($a as $b) {
$result[] = $b;
}
}
usort($result, static fn($a, $b) => ($a->getStart() < $b->getStart()) ? -1 : 1);
return $result;
}
public function getNextDays() {
$result = [[], [], [], [], [], []];
$events = $this->getEventsBetween(
(new DateTimeImmutable)->setTime(0, 0),
(new DateTimeImmutable)->setTime(23, 59)->add(new DateInterval('P1M'))
(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;
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;
}
public function getNextOfEach(DateTimeImmutable $startDate) {
public function getNextOfEach(\DateTimeImmutable $startDate) {
$result = array_filter(array_map(
function($a) use ($startDate){
return $a->getNextEventFrom($startDate);
}, $this->activities
), function($a){
return isset($a);
});
usort($result, function($a, $b) {
return ($a->getStart()->getTimeStamp() < $b->getStart()->getTimeStamp())
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) {
public static function isToday(\DateTimeImmutable $date) {
return $date->format('dmY') == date('dmY');
}
public static function isTomorrow(DateTimeImmutable $date) {
return $date->sub(new DateInterval('P1D'))->format('dmY') == date('dmY');
public static function isTomorrow(\DateTimeImmutable $date) {
return $date->sub(new \DateInterval('P1D'))->format('dmY') == date('dmY');
}
public static function isThisWeek(DateTimeImmutable $date) {
public static function isThisWeek(\DateTimeImmutable $date) {
return $date->format('WY') == date('WY');
}
public static function isNextWeek(DateTimeImmutable $date) {
return $date->sub(new DateInterval('P7D'))->format('WY') == date('WY');
public static function isNextWeek(\DateTimeImmutable $date) {
return $date->sub(new \DateInterval('P7D'))->format('WY') == date('WY');
}
public static function isThisMonth(DateTimeImmutable $date) {
public static function isThisMonth(\DateTimeImmutable $date) {
return $date->format('mY') == date('mY');
}
}

@ -1,12 +1,13 @@
<?php
declare(strict_types=1);
namespace pvv\side;
use \DateTimeImmutable;
use \PDO;
class DBActivity implements Activity {
private $pdo;
public function __construct(PDO $pdo) {
public function __construct(\PDO $pdo) {
$this->pdo = $pdo;
}
@ -20,8 +21,8 @@ class DBActivity implements Activity {
$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']),
\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']
@ -35,50 +36,48 @@ class DBActivity implements Activity {
public function getEventByID($id) {
$query = 'SELECT * FROM events WHERE id=:id LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_INT);
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute();
$dbEvent = $statement->fetch();
$event = new SimpleEvent(
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']),
\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']
);
return $event;
}
public function getNextEventFrom(DateTimeImmutable $date) {
public function getNextEventFrom(\DateTimeImmutable $date) {
$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) {
public function getPreviousEventFrom(\DateTimeImmutable $date) {
$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($date, $query) {
$stmt = $this->pdo->prepare($query);
$stmt->execute(['date' => $date->format('Y-m-d H:i:s')]);
if ($result = $stmt->fetch(PDO::FETCH_ASSOC)){
$ev = new SimpleEvent(
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']),
\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 $ev;
}
return null;
}
}
}

@ -1,12 +1,13 @@
<?php
namespace pvv\side;
use \PDO;
declare(strict_types=1);
namespace pvv\side;
class Door {
private $pdo;
public function __construct(PDO $pdo){
public function __construct(\PDO $pdo) {
$this->pdo = $pdo;
}
@ -19,7 +20,7 @@ class Door{
foreach ($statement->fetchAll() as $row) {
$doorEvents[] = [
'time' => (int) $row['time'],
'open' => (bool)$row['open']
'open' => (bool) $row['open'],
];
}
@ -29,14 +30,14 @@ class Door{
public function getEntriesAfter($startTime) {
$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->bindParam(':startTime', $startTime, \PDO::PARAM_STR);
$statement->execute();
$doorEvents = [];
foreach ($statement->fetchAll() as $row) {
$doorEvents[] = [
'time' => (int) $row['time'],
'open' => (bool)$row['open']
'open' => (bool) $row['open'],
];
}
@ -48,25 +49,26 @@ class Door{
$statement = $this->pdo->prepare($query);
$statement->execute();
$row = $statement->fetch();
return [
'time' => (int) $row['time'],
'open' => (bool)$row['open']
'open' => (bool) $row['open'],
];
}
private function removeOld() {
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->bindParam(':firstValid', $firstValidTime, \PDO::PARAM_STR);
$statement->execute();
}
public function createEvent($time, $open) {
public function createEvent($time, $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->bindParam(':time', $time, \PDO::PARAM_STR);
$statement->bindParam(':open', $open, \PDO::PARAM_STR);
$statement->execute();
$this->removeOld();

@ -1,14 +1,15 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side;
use \DateTimeImmutable;
use \DateInterval;
use DateTimeImmutable;
abstract class Event {
private $start;
public function __construct(DateTimeImmutable $start) {
public function __construct(\DateTimeImmutable $start) {
$this->start = $start;
}
@ -23,8 +24,8 @@ abstract class Event {
if (Agenda::isTomorrow($this->getStart())) {
return 'i morgen';
}
if (Agenda::isThisWeek($this->getStart()) || $this->getStart()->sub(new DateInterval('P4D'))->getTimestamp() < time()) {
return strftime('%A', $this->getStart()->getTimestamp());
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';
@ -32,22 +33,23 @@ abstract class Event {
if (Agenda::isThisMonth($this->getStart())) {
return 'denne måneden';
}
return trim(strftime('%e. %B', $this->getStart()->getTimestamp()));
return $this->getStart()->format('j. F');
}
public abstract function getStop(); /* : DateTimeImmutable */
abstract public function getStop(); /* : DateTimeImmutable */
public abstract function getName();
abstract public function getName();
public abstract function getLocation();
abstract public function getLocation();
public abstract function getOrganiser();
abstract public function getOrganiser();
public abstract function getURL(); /* : string */
abstract public function getURL(); /* : string */
public abstract function getImageURL(); /* : string */
abstract public function getImageURL(); /* : string */
public abstract function getDescription(); /* : string */
abstract public function getDescription(); /* : string */
public abstract function getColor(); /* : string */
abstract public function getColor(); /* : string */
}

@ -1,7 +1,8 @@
<?php
namespace pvv\side;
use \PDO;
declare(strict_types=1);
namespace pvv\side;
class MOTD {
private $pdo;
@ -10,15 +11,15 @@ class MOTD{
$this->pdo = $pdo;
}
public function setMOTD($title, $content) {
if (is_array($content)) {
$content = implode("_", $content);
public function setMOTD($title, $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->bindParam(':title', $title, \PDO::PARAM_STR);
$statement->bindParam(':content', $content, \PDO::PARAM_STR);
$statement->execute();
}
@ -29,21 +30,18 @@ class MOTD{
$statement->execute();
$data = $statement->fetch();
$motd = array("title" => $data[0], "content" => explode("\n", $data[1]));
return $motd;
return ['title' => $data[0], 'content' => explode("\n", $data[1])];
}
public function getMOTD_history($limit = 5) {
$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->bindParam(':limit', $limit, \PDO::PARAM_STR);
$statement->execute();
$data = $statement->fetch();
$motd = array("title" => $data[0], "content" => explode("\n", $data[1]));
return $motd;
return ['title' => $data[0], 'content' => explode("\n", $data[1])];
}
}

@ -1,8 +1,14 @@
<?php
declare(strict_types=1);
namespace pvv\side;
class Project {
private $id, $name, $descr, $active;
private $id;
private $name;
private $descr;
private $active;
public function __construct($id, $name, $descr, $active) {
$this->id = $id;

@ -1,12 +1,13 @@
<?php
namespace pvv\side;
use \PDO;
declare(strict_types=1);
namespace pvv\side;
class ProjectManager {
private $pdo;
public function __construct(PDO $pdo){
public function __construct(\PDO $pdo) {
$this->pdo = $pdo;
}
@ -32,27 +33,26 @@ class ProjectManager{
public function getByID($id) {
$query = 'SELECT * FROM projects WHERE id=:id LIMIT 1';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_INT);
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute();
$dbProj = $statement->fetch();
if (!$dbProj) {
return false;
}
$project = new Project(
return new Project(
$dbProj['id'],
$dbProj['name'],
$dbProj['description'],
$dbProj['active']
);
return $project;
}
public function getByOwner($uname) {
$query = 'SELECT projectid FROM projectmembers WHERE uname=:uname';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
$statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute();
$projectIDs = $statement->fetchAll();
@ -62,7 +62,7 @@ class ProjectManager{
$query = 'SELECT * FROM projects WHERE id=:id';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_INT);
$statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute();
foreach ($statement->fetchAll() as $dbProj) {
@ -82,7 +82,7 @@ class ProjectManager{
public function getProjectMembers($id) {
$query = 'SELECT * FROM projectmembers WHERE projectid=:id';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_STR);
$statement->bindParam(':id', $id, \PDO::PARAM_STR);
$statement->execute();
$members = [];
@ -93,7 +93,7 @@ class ProjectManager{
'mail' => $dbUsr['mail'],
'role' => $dbUsr['role'],
'lead' => $dbUsr['lead'],
'owner' => $dbUsr['owner']
'owner' => $dbUsr['owner'],
];
}
@ -103,19 +103,18 @@ class ProjectManager{
public function getProjectOwner($id) {
$query = 'SELECT * FROM projectmembers WHERE (projectid=:id AND owner=1)';
$statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_STR);
$statement->bindParam(':id', $id, \PDO::PARAM_STR);
$statement->execute();
$dbOwner = $statement->fetch();
$owner = [
return [
'name' => $dbOwner['name'],
'uname' => $dbOwner['uname'],
'mail' => $dbOwner['mail'],
'role' => $dbOwner['role'],
'lead' => $dbOwner['lead'],
'owner' => $dbOwner['owner']
'owner' => $dbOwner['owner'],
];
return $owner;
}
}

@ -1,11 +1,19 @@
<?php
declare(strict_types=1);
namespace pvv\side;
class SimpleEvent extends Event {
private $id;
private $name;
private $descr;
private $start;
private $end;
private $org;
private $loc;
private $id, $name, $descr, $start, $end, $org, $loc;
public function __construct($id, $name,\DateTimeImmutable $start,\DateTimeImmutable $end,$org, $loc, $descr, $isDBEvent = false){
public function __construct($id, $name, \DateTimeImmutable $start, \DateTimeImmutable $end, $org, $loc, $descr, $_isDBEvent = false) {
$this->id = $id;
$this->name = $name;
$this->start = $start;
@ -13,7 +21,6 @@ class SimpleEvent extends Event {
$this->org = $org;
$this->loc = $loc;
$this->descr = explode("\n", $descr);
$this->isDBEvent = $isDBEvent;
}
public function getID() {
@ -41,23 +48,16 @@ class SimpleEvent extends Event {
}
public function getURL() {
return ('/hendelser/info.php?id=' . $this->id);
return '/hendelser/info.php?id=' . $this->id;
}
public function getImageURL() {
return null;
}
public function getImageURL(): void {}
public function getDescription() {
return $this->descr;
}
public function isDBEvent() {
return $this->isDBEvent;
}
public function getColor() {
return "#3b7";
return '#3b7';
}
}

@ -1,36 +1,41 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
use pvv\side\Activity;
class AnimekveldActivity implements Activity {
public function nextDate(DateTimeImmutable $date) {
if ($date->format('H') > 20 || $date->format('H') == 19 && $date->format('i') > 30)
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(19, 30, 0));
public function nextDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) > 20 || intval($date->format('H')) === 19 && intval($date->format('i')) > 30) {
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(19, 30, 0));
}
$date = $date->setTime(19, 30, 0);
if ($date->format('N') != 5)
return $this->nextDate($date->add(new DateInterval('P1D')));
if (intval($date->format('N')) !== 5) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
return $date;
}
public function prevDate(DateTimeImmutable $date) {
if ($date->format('H') < 19 || $date->format('H') == 20 && $date->format('i') < 30)
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(19, 30, 0));
public function prevDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) < 19 || intval($date->format('H')) === 20 && intval($date->format('i')) < 30) {
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(19, 30, 0));
}
$date = $date->setTime(19, 30, 0);
if ($date->format('N') != 5)
return $this->prevDate($date->sub(new DateInterval('P1D')));
if (intval($date->format('N')) !== 5) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
return $date;
}
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ {
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new AnimekveldEvent($this->nextDate($date));
}
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ {
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new AnimekveldEvent($this->prevDate($date));
}
}

@ -1,29 +1,29 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Event;
use \DateInterval;
use pvv\side\Event;
class AnimekveldEvent extends Event {
public function getStop() {
return $this->getStart()->add(new DateInterval('PT4H1800S'));
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
}
public function getName() /* : string */ {
return "Animekveld";
public function getName() { /* : string */
return 'Animekveld';
}
public function getLocation() /* : Location */ {
return "Koserommet";
public function getLocation() { /* : Location */
return 'Koserommet';
}
public function getOrganiser() /* : User */ {
return "Christoffer Viken";
public function getOrganiser() { /* : User */
return 'Christoffer Viken';
}
public function getURL() /* : string */ {
public function getURL() { /* : string */
return '/anime/';
}
@ -38,12 +38,10 @@ class AnimekveldEvent extends Event {
'',
'Alle kan være med på å anbefale eller veto serier.',
'',
'I disse tider blir visningene i all hovedsak holdt online på vår <a href="https://discord.gg/cx4aXU7">Discord server</a>'
];
}
public function getColor() {
return "#35a";
return '#35a';
}
}

@ -1,41 +1,47 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
use pvv\side\Activity;
class BrettspillActivity implements Activity {
public function nextDate(DateTimeImmutable $date) {
if ($date->format('H') > 17 || $date->format('H') == 16 && $date->format('i') > 15)
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(16, 15, 0));
$date = $date->setTime(16, 15, 0);
if ($date->format('N') != 7)
return $this->nextDate($date->add(new DateInterval('P1D')));
if ($date->format('W') % 2 - 1)
return $this->nextDate($date->add(new DateInterval('P7D')));
return $date;
public function nextDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) > 17 || intval($date->format('H')) === 16 && intval($date->format('i')) > 15) {
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(16, 15, 0));
}
public function prevDate(DateTimeImmutable $date) {
if ($date->format('H') < 16 || $date->format('H') == 17 && $date->format('i') < 15)
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(16, 15, 0));
$date = $date->setTime(16, 15, 0);
if ($date->format('N') != 7)
return $this->prevDate($date->sub(new DateInterval('P1D')));
if ($date->format('W') % 2 - 1)
return $this->prevDate($date->sub(new DateInterval('P7D')));
if (intval($date->format('N')) !== 7) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
if (intval($date->format('W')) % 2 - 1) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ {
public function prevDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) < 16 || intval($date->format('H')) === 17 && intval($date->format('i')) < 15) {
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(16, 15, 0));
}
$date = $date->setTime(16, 15, 0);
if (intval($date->format('N')) !== 7) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
if (intval($date->format('W')) % 2 - 1) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new BrettspillEvent($this->nextDate($date));
}
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ {
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new BrettspillEvent($this->prevDate($date));
}
}

@ -1,29 +1,29 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Event;
use \DateInterval;
use pvv\side\Event;
class BrettspillEvent extends Event {
public function getStop() {
return $this->getStart()->add(new DateInterval('PT4H1800S'));
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
}
public function getName() /* : string */ {
return "Brettspillkveld";
public function getName() { /* : string */
return 'Brettspillkveld';
}
public function getLocation() /* : Location */ {
return "Programvareverkstedet";
public function getLocation() { /* : Location */
return 'Programvareverkstedet';
}
public function getOrganiser() /* : User */ {
return "Programvareverkstedet";
public function getOrganiser() { /* : User */
return 'Programvareverkstedet';
}
public function getURL() /* : string */ {
public function getURL() { /* : string */
return '/brettspill/';
}
@ -59,7 +59,6 @@ class BrettspillEvent extends Event {
}
public function getColor() {
return "#000";
return '#000';
}
}

@ -1,40 +1,47 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
use pvv\side\Activity;
class DriftkveldActivity implements Activity {
public function nextDate(DateTimeImmutable $date) {
if ($date->format('H') > 18 || $date->format('H') == 17 && $date->format('i') > 30)
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(18, 15, 0));
public function nextDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) > 18 || intval($date->format('H')) === 17 && intval($date->format('i')) > 30) {
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(18, 15, 0));
}
$date = $date->setTime(18, 15, 0);
if ($date->format('N') != 6)
return $this->nextDate($date->add(new DateInterval('P1D')));
if ($date->format('W') % 2 - 1)
return $this->nextDate($date->add(new DateInterval('P7D')));
if (intval($date->format('N')) !== 6) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
if (intval($date->format('W')) % 2 - 1) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date;
}
public function prevDate(DateTimeImmutable $date) {
if ($date->format('H') < 17 || $date->format('H') == 18 && $date->format('i') < 30)
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(18, 15, 0));
public function prevDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) < 17 || intval($date->format('H')) === 18 && intval($date->format('i')) < 30) {
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(18, 15, 0));
}
$date = $date->setTime(18, 15, 0);
if ($date->format('N') != 6)
return $this->prevDate($date->sub(new DateInterval('P1D')));
if ($date->format('W') % 2 - 1)
return $this->prevDate($date->sub(new DateInterval('P7D')));
if (intval($date->format('N')) !== 6) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
if (intval($date->format('W')) % 2 - 1) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ {
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new DriftkveldEvent($this->nextDate($date));
}
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ {
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new DriftkveldEvent($this->prevDate($date));
}
}

@ -1,29 +1,29 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Event;
use \DateInterval;
use pvv\side\Event;
class DriftkveldEvent extends Event {
public function getStop() {
return $this->getStart()->add(new DateInterval('PT4H1800S'));
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
}
public function getName() /* : string */ {
return "Driftkveld";
public function getName() { /* : string */
return 'Driftkveld';
}
public function getLocation() /* : Location */ {
return "Terminalrommet / Discord / IRC";
public function getLocation() { /* : Location */
return 'Terminalrommet / Discord / IRC';
}
public function getOrganiser() /* : User */ {
return "Torstein Nordgård-Hansen";
public function getOrganiser() { /* : User */
return 'Torstein Nordgård-Hansen';
}
public function getURL() /* : string */ {
public function getURL() { /* : string */
return '/driftkveld/';
}
@ -38,12 +38,11 @@ class DriftkveldEvent extends Event {
'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!'
'Alle PVVere er velkommene, enten de er erfarne driftere eller helt utenforstående!',
];
}
public function getColor() {
return "#35a";
return '#35a';
}
}

@ -1,40 +1,47 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
use pvv\side\Activity;
class HackekveldActivity implements Activity {
public function nextDate(DateTimeImmutable $date) {
if ($date->format('H') > 18 || $date->format('H') == 17 && $date->format('i') > 30)
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(18, 15, 0));
public function nextDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) > 18 || intval($date->format('H')) === 17 && intval($date->format('i')) > 30) {
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(18, 15, 0));
}
$date = $date->setTime(16, 15, 0);
if ($date->format('N') != 6)
return $this->nextDate($date->add(new DateInterval('P1D')));
if ($date->format('W') % 2)
return $this->nextDate($date->add(new DateInterval('P7D')));
if (intval($date->format('N')) !== 6) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
if (intval($date->format('W')) % 2) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date;
}
public function prevDate(DateTimeImmutable $date) {
if ($date->format('H') < 17 || $date->format('H') == 18 && $date->format('i') < 30)
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(18, 15, 0));
public function prevDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) < 17 || intval($date->format('H')) === 18 && intval($date->format('i')) < 30) {
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(18, 15, 0));
}
$date = $date->setTime(18, 15, 0);
if ($date->format('N') != 6)
return $this->prevDate($date->sub(new DateInterval('P1D')));
if ($date->format('W') % 2)
return $this->prevDate($date->sub(new DateInterval('P7D')));
if (intval($date->format('N')) !== 6) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
if (intval($date->format('W')) % 2) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ {
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new HackekveldEvent($this->nextDate($date));
}
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ {
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new HackekveldEvent($this->prevDate($date));
}
}

@ -1,29 +1,29 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Event;
use \DateInterval;
use pvv\side\Event;
class HackekveldEvent extends Event {
public function getStop() {
return $this->getStart()->add(new DateInterval('PT4H1800S'));
return $this->getStart()->add(new \DateInterval('PT4H1800S'));
}
public function getName() /* : string */ {
return "Hackekveld";
public function getName() { /* : string */
return 'Hackekveld';
}
public function getLocation() /* : Location */ {
return "Terminalrommet / Discord / IRC";
public function getLocation() { /* : Location */
return 'Terminalrommet / Discord / IRC';
}
public function getOrganiser() /* : User */ {
return "PVV";
public function getOrganiser() { /* : User */
return 'PVV';
}
public function getURL() /* : string */ {
public function getURL() { /* : string */
return '#';
}
@ -34,12 +34,11 @@ class HackekveldEvent extends Event {
public function getDescription() {
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.'
'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() {
return "#35a";
return '#35a';
}
}

@ -1,40 +1,47 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
use pvv\side\Activity;
class NerdepitsaActivity implements Activity {
public function nextDate(DateTimeImmutable $date) {
if ($date->format('H') > 19)
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(19, 0, 0));
public function nextDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) > 19) {
return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(19, 0, 0));
}
$date = $date->setTime(19, 0, 0);
if ($date->format('N') != 5)
return $this->nextDate($date->add(new DateInterval('P1D')));
if ($date->format('W') % 2)
return $this->nextDate($date->add(new DateInterval('P7D')));
if (intval($date->format('N')) !== 5) {
return $this->nextDate($date->add(new \DateInterval('P1D')));
}
if (intval($date->format('W')) % 2) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date;
}
public function prevDate(DateTimeImmutable $date) {
if ($date->format('H') < 19)
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(19, 0, 0));
public function prevDate(\DateTimeImmutable $date) {
if (intval($date->format('H')) < 19) {
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(19, 0, 0));
}
$date = $date->setTime(19, 0, 0);
if ($date->format('N') != 5)
return $this->prevDate($date->sub(new DateInterval('P1D')));
if ($date->format('W') % 2)
return $this->prevDate($date->sub(new DateInterval('P7D')));
if (intval($date->format('N')) !== 5) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
if (intval($date->format('W')) % 2) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ {
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new NerdepitsaEvent($this->nextDate($date));
}
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ {
public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new NerdepitsaEvent($this->prevDate($date));
}
}

@ -1,29 +1,29 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
use \pvv\side\Event;
use \DateInterval;
use pvv\side\Event;
class NerdepitsaEvent extends Event {
public function getStop() {
return $this->getStart()->add(new DateInterval('PT2H1800S'));
return $this->getStart()->add(new \DateInterval('PT2H1800S'));
}
public function getName() {
return "Nerdepitsa";
return 'Nerdepitsa';
}
public function getLocation() /* : Location */ {
return "Peppes Kjøpmansgata";
public function getLocation() { /* : Location */
return 'Peppes Kjøpmansgata';
}
public function getOrganiser() /* : User */ {
return "Anders Christensen";
public function getOrganiser() { /* : User */
return 'Anders Christensen';
}
public function getURL() /* : string */ {
public function getURL() { /* : string */
return '/nerdepitsa/';
}
@ -39,12 +39,11 @@ class NerdepitsaEvent extends Event {
'',
'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!'
'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() {
return "#c35";
return '#c35';
}
}

@ -1,9 +1,12 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
ini_set('date.timezone', 'Europe/Oslo');
require implode(DIRECTORY_SEPARATOR, [dirname(dirname(dirname(__DIR__))), '', '_autoload.php']);
require implode(\DIRECTORY_SEPARATOR, [\dirname(__DIR__, 3), '', '_autoload.php']);
$c = new AnimekveldActivity;
die($c->nextDate(new \DateTimeImmutable)->format(DATE_RFC2822));
$c = new AnimekveldActivity();
exit($c->nextDate(new \DateTimeImmutable())->format(\DATE_RFC2822));

@ -1,9 +1,12 @@
<?php //declare(strict_types=1);
<?php
declare(strict_types=1);
namespace pvv\side\social;
ini_set('date.timezone', 'Europe/Oslo');
require implode(DIRECTORY_SEPARATOR, [dirname(dirname(dirname(__DIR__))), '', '_autoload.php']);
require implode(\DIRECTORY_SEPARATOR, [\dirname(__DIR__, 3), '', '_autoload.php']);
$c = new NerdepitsaActivity;
die($c->prevDate(new \DateTimeImmutable)->format(DATE_RFC2822));
$c = new NerdepitsaActivity();
exit($c->prevDate(new \DateTimeImmutable())->format(\DATE_RFC2822));

@ -1,19 +1,19 @@
<?php
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
$eventID = $_GET['id'];

@ -1,16 +1,16 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
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 = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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];
@ -18,10 +18,10 @@ $name = $attrs['cn'][0];
if (!$userManager->hasGroup($uname, 'aktiviteter')) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit();
exit;
}
$customActivity = new \pvv\side\DBActivity($pdo);
$customActivity = new pvv\side\DBActivity($pdo);
$new = 0;
if (isset($_GET['new'])) {
@ -33,21 +33,20 @@ if(isset($_GET['id'])){
$eventID = $_GET['id'];
} elseif ($new == 0) {
echo "\nID not set";
exit();
exit;
}
$today = new DateTimeImmutable;
$today = new DateTimeImmutable();
$today = $today->setTime(18, 15);
$defaultStart = $today->format("Y-m-d H:15:00");
$defaultStart = $today->format('Y-m-d H:15:00');
$inTwoHours = $today->add(new DateInterval('PT1H45M'));
$defaultEnd = $inTwoHours->format("Y-m-d H:00:00");
$defaultEnd = $inTwoHours->format('Y-m-d H:00:00');
$event;
if ($new == 0) {
$event = $customActivity->getEventByID($eventID);
}
else {
$event = new \pvv\side\SimpleEvent(
} else {
$event = new pvv\side\SimpleEvent(
0,
'',
$today,
@ -86,26 +85,26 @@ else {
<h2>Aktivietsadministrasjon</h2>
<hr class="ruler">
<h2><?= ($new == 1 ? "Ny hendelse" : "Rediger hendelse"); ?></h2>
<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="<?= $event->getName() ?>" class="boxinput" required placeholder="En kul hendelse"><br>
<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="<?= $event->getOrganiser() ?>" class="boxinput" required placeholder="<?= $name ?>"><br>
<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="<?= $event->getLocation() ?>" class="boxinput" required placeholder="Terminalrommet"><br>
<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="Beskrivese" required><?= implode($event->getDescription(), "\n"); ?></textarea>
<textarea name="desc" rows="8" class="boxinput" placeholder="Beskrivelse" required><?php echo implode("\n", $event->getDescription()); ?></textarea>
</div>
@ -113,22 +112,22 @@ else {
<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="<?= $event->getStart()->format('Y-m') ?>"><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="<?= $event->getStart()->format('d') ?>"><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="<?= $event->getStart()->format('H:i:s') ?>"><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="<?= $diff->h ?>"><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="<?= $diff->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="<?= $event->getID() ?>" />
<input type="hidden" name="id" value="<?php echo $event->getID(); ?>" />
<div class="allgrids" style="margin-top: 2em;">
<hr class="ruler">

@ -1,26 +1,26 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
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 = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
$customActivity = new \pvv\side\DBActivity($pdo);
$customActivity = new pvv\side\DBActivity($pdo);
$events = $customActivity->getAllEvents();
$page = 1;
@ -41,9 +41,7 @@ if(isset($_GET['organiser'])){
// filter
$events = array_values(array_filter(
$events,
function($event) use ($filterTitle, $filterOrganiser){
return (preg_match('/.*'.$filterTitle.'.*/i', $event->getName()) and preg_match('/.*'.$filterOrganiser.'.*/i', $event->getOrganiser()));
}
static fn($event) => (preg_match('/.*' . $filterTitle . '.*/i', $event->getName()) && preg_match('/.*' . $filterOrganiser . '.*/i', $event->getOrganiser()))
));
?>
<!DOCTYPE html>
@ -82,7 +80,7 @@ $events = array_values(array_filter(
$counter = 0;
$pageLimit = 10;
for($i = ($pageLimit * ($page - 1)); $i < count($events) ;$i++){
for ($i = ($pageLimit * ($page - 1)); $i < count($events); ++$i) {
if ($counter == $pageLimit) {
break;
}
@ -94,25 +92,25 @@ $events = array_values(array_filter(
<li>
<div class="event admin">
<div class="event-info">
<h3 class="no-chin"><?= $event->getName() . " (ID: " . $eventID . ")"; ?></h3>
<h3 class="no-chin"><?php echo $event->getName() . ' (ID: ' . $eventID . ')'; ?></h3>
<p class="subnote">
<?= $event->getStart()->format("(Y-m-d H:i:s)") . " - " . $event->getStop()->format("(Y-m-d H:i:s)"); ?>
<?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();
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $event->getDescription()));
?>
</div>
<div class="event-actions">
<a class="btn" href="edit.php?id=<?= $eventID ?>">Rediger</a><br>
<a class="btn" href="delete.php?id=<?= $eventID ?>" onclick="return confirm('Knallsikker? (ID: <?= $eventID ?>)');">Slett</a>
<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++;
++$counter;
}
?>
</ul>
@ -122,7 +120,7 @@ $events = array_values(array_filter(
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '&title=' . urlencode($filterTitle) . '&organiser=' . urlencode($filterOrganiser) . '">Forrige side</a>';
}
if(($counter == $pageLimit) and (($pageLimit * $page) < count($events))){
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>';
}
?>
@ -134,9 +132,9 @@ $events = array_values(array_filter(
<h2>Filter</h2>
<form action="." method="get">
<p class="no-chin">Navn</p>
<?= '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">' ?><br>
<?php echo '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">'; ?><br>
<p class="no-chin">Organisator</p>
<?= '<input type="text" name="organiser" class="boxinput" value="' . $filterOrganiser . '">' ?><br>
<?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>

@ -1,34 +1,34 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
if ((!isset($_POST['title']))
or (!isset($_POST['desc']))
or (!isset($_POST['organiser']))
or (!isset($_POST['location']))
or (!isset($_POST['start_mon']))
or (!isset($_POST['start_day']))
or (!isset($_POST['start_time']))
or (!isset($_POST['lasts_hours']))
or (!isset($_POST['lasts_minutes']))) {
|| (!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();
exit;
}
$id = 0;
@ -50,12 +50,12 @@ $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;
$date_part_start_day = '0' . $date_part_start_day;
}
$start = ($date_part_start_mon . "-" . $date_part_start_day . " " . $date_part_start_time);
if (sizeof(explode(":", $date_part_start_time))==2) {
$start .= ":00";
$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);
@ -65,10 +65,10 @@ $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();
exit;
}
$statement;
if ($id == 0) {
$query = 'INSERT INTO events (name, start, stop, organiser, location, description) VALUES (:title, :start, :stop, :organiser, :loc, :desc)';
$statement = $pdo->prepare($query);

@ -1,28 +1,28 @@
<?php
ini_set('display_errors', '1');
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
error_reporting(E_ALL);
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');
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 = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
$users = $userManager->getAllUserData();
@ -59,16 +59,16 @@ $users = $userManager->getAllUserData();
</tr>
<?php
$users_to_update = array();
$users_to_update = [];
foreach ($users as $i => $data) {
$uname = $data['name'];
$groupFlag = $userManager->getUsergroups($uname);
array_push($users_to_update, $uname);
$users_to_update[] = $uname;
?>
<tr>
<td><?= $uname ?></td>
<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>';

@ -1,35 +1,36 @@
<?php
ini_set('display_errors', '1');
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
error_reporting(E_ALL);
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 = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
$newUser;
if (isset($_POST['newuser'])) {
$newUser = $_POST['newuser'];
unset($_POST['newuser']);
}
// $updatingUsers = explode('_', $_POST['users']);
$updatingUsers = array();
foreach ($_POST as $key => $value) { if ($key === "user_to_update") {
array_push($updatingUsers, $value);
$updatingUsers = [];
foreach ($_POST as $key => $value) {
if ($key === 'user_to_update') {
$updatingUsers[] = $value;
}
}
unset($_POST['user_to_update']);
@ -43,7 +44,7 @@ if($newUser){
foreach ($_POST as $namegroup => $info) {
$data = explode('_', $namegroup);
$group = array_pop($data);
$uname = implode("_", $data);
$uname = implode('_', $data);
if ($uname == 'newuser') {
if (!$newUser) {
continue;

@ -1,11 +1,11 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
$as = new \SimpleSAML\Auth\Simple('default-sp');
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$uname = $attrs['uid'][0];
@ -17,7 +17,7 @@ $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();
exit;
}
?>
<!DOCTYPE html>

@ -1,31 +1,31 @@
<?php
ini_set('display_errors', '1');
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'no_NO');
error_reporting(E_ALL);
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');
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 = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
$motdfetcher = new \pvv\side\MOTD($pdo);
$motdfetcher = new pvv\side\MOTD($pdo);
$motd = $motdfetcher->getMOTD();
?>
<!DOCTYPE html>
@ -56,15 +56,15 @@ $motd = $motdfetcher->getMOTD();
<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="<?= $motd['title'] ?>" class="boxinput" style="width:66%;"><br>
<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"><?= implode("\n", $motd["content"]) ?></textarea>
<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">
<?= '<input type="submit" class="btn" value="Lagre endringer"></a>'; ?>
<?php echo '<input type="submit" class="btn" value="Lagre endringer"></a>'; ?>
</div>
</form>
</main>

@ -1,32 +1,32 @@
<?php
ini_set('display_errors', '1');
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'no_NO');
error_reporting(E_ALL);
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 = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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']) or !isset($_POST['content'])){
if (!isset($_POST['title']) || !isset($_POST['content'])) {
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit();
exit;
}
if (!$userManager->isAdmin($uname)) {
echo 'Her har du ikke lov\'t\'å\'værra!!!';
exit();
exit;
}
$motdfetcher = new \pvv\side\MOTD($pdo);
$motdfetcher = new pvv\side\MOTD($pdo);
$motdfetcher->setMOTD($_POST['title'], $_POST['content']);
header('Location: .');

@ -1,19 +1,19 @@
<?php
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
$projectID = $_GET['id'];

@ -1,26 +1,26 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
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 = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
$projectManager = new \pvv\side\ProjectManager($pdo);
$projectManager = new pvv\side\ProjectManager($pdo);
$projects = $projectManager->getAll();
$new = 0;
@ -33,10 +33,10 @@ if(isset($_GET['id'])){
$projectID = $_GET['id'];
} elseif ($new == 0) {
echo "\nID not set";
exit();
exit;
}
$project = new \pvv\side\Project(
$project = new pvv\side\Project(
0,
'Kult Prosjekt',
'',
@ -85,32 +85,32 @@ foreach($members as $i => $data){
<h2>Prosjektadministrasjon</h2>
<hr class="ruler">
<h2><?= ($new == 1 ? "Nytt prosjekt" : "Rediger prosjekt"); ?></h2>
<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>
<?= '<input type="text" name="title" value="' . $project->getName() . '" class="boxinput">' ?><br>
<?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"><?= implode($project->getDescription(), "\n"); ?></textarea>
<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>
<?= '<input type="text" name="organiser" value="' . $owner['uname'] . '" class="boxinput">' ?><br>
<?php echo '<input type="text" name="organiser" value="' . $owner['uname'] . '" class="boxinput">'; ?><br>
<p class="subtitle">Prosjektleder (Navn)</p>
<?= '<input type="text" name="organisername" value="' . $owner['name'] . '" class="boxinput">' ?>
<?php echo '<input type="text" name="organisername" value="' . $owner['name'] . '" class="boxinput">'; ?>
<p class="subtitle">Prosjektleder E-post</p>
<?= '<input type="text" name="organiseremail" value="' . $owner['mail'] . '" class="boxinput">' ?><br>
<?php echo '<input type="text" name="organiseremail" value="' . $owner['mail'] . '" class="boxinput">'; ?><br>
<p class="subtitle">Aktiv</p>
<?= '<input type="checkbox" '. ($project->getActive() ? 'checked' : '') . ' name="active"/>' ?>
<?php echo '<input type="checkbox" ' . ($project->getActive() ? 'checked' : '') . ' name="active"/>'; ?>
</div>
<?= '<input type="hidden" name="id" value="' . $project->getID() . '" />' ?>
<?php echo '<input type="hidden" name="id" value="' . $project->getID() . '" />'; ?>
<?php if (!$new) { ?>
<div style="grid-column: span 2;">
@ -123,9 +123,9 @@ foreach($members as $i => $data){
<tr><th>Brukernavn</th><th>Navn</th><th>Rolle</th></tr>
<?php foreach ($members as $i => $data) { ?>
<tr>
<td><?= $data['uname']; ?></td>
<td><?= $data['name']; ?></td>
<td><?= $data['role']; ?></td>
<td><?php echo $data['uname']; ?></td>
<td><?php echo $data['name']; ?></td>
<td><?php echo $data['role']; ?></td>
</tr>
<?php } ?>

@ -1,26 +1,26 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
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 = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
$projectManager = new \pvv\side\ProjectManager($pdo);
$projectManager = new pvv\side\ProjectManager($pdo);
$projects = $projectManager->getAll();
$page = 1;
@ -43,9 +43,7 @@ if(isset($_POST['organiser'])){
// filter
$projects = array_values(array_filter(
$projects,
function($project) use ($filterTitle){
return (preg_match('/.*'.$filterTitle.'.*/i', $project->getName()));
}
static fn($project) => preg_match('/.*' . $filterTitle . '.*/i', $project->getName())
));
?>
<!DOCTYPE html>
@ -82,7 +80,7 @@ $projects = array_values(array_filter(
$counter = 0;
$pageLimit = 4;
for($i = ($pageLimit * ($page - 1)); $i < count($projects); $i++){
for ($i = ($pageLimit * ($page - 1)); $i < count($projects); ++$i) {
if ($counter == $pageLimit) {
break;
}
@ -95,23 +93,23 @@ $projects = array_values(array_filter(
<li>
<div class="event admin">
<div class="event-info">
<h3 class="no-chin"><?= $project->getName() . " (ID: " . $projectID . ")"; ?></h3>
<p class="subnote"><?= 'Organisert av: ' . $owner['name']; ?></p>
<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();
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $project->getDescription()));
?>
</div>
<div class="event-actions">
<?= '<a href="edit.php?id=' . $projectID . '">🖊</a>'; ?>
<?= '<a href="delete.php?id=' . $projectID . '" onclick="return confirm(\'Knallsikker? (ID: ' . $projectID . ')\');">🗑</a>'; ?>
<?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++;
++$counter;
}
?>
</ul>
@ -121,7 +119,7 @@ $projects = array_values(array_filter(
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '">Forrige side</a>';
}
if(($counter == $pageLimit) and (($pageLimit * $page) < count($projects))){
if (($counter == $pageLimit) && (($pageLimit * $page) < count($projects))) {
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '">Neste side</a>';
}
?>
@ -133,9 +131,9 @@ $projects = array_values(array_filter(
<h2>Filter</h2>
<form action="." method="post">
<p class="no-chin">Prosjektnavn</p>
<?= '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">' ?><br>
<?php echo '<input type="text" name="title" class="boxinput" value="' . $filterTitle . '">'; ?><br>
<p class="no-chin">Leders brukernavn</p>
<?= '<input type="text" name="organiser" class="boxinput" value="">' ?><br>
<?php echo '<input type="text" name="organiser" class="boxinput" value="">'; ?><br>
<div style="margin-top: 2em;">
<input type="submit" class="btn" value="Filtrer"></input>

@ -1,26 +1,26 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../../src/_autoload.php';
require __DIR__ . '/../../../config.php';
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
require_once(__DIR__ . '/../../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
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();
exit;
}
if(!isset($_POST['title']) or !isset($_POST['desc']) or !isset($_POST['organisername']) or !isset($_POST['organiser'])){
if (!isset($_POST['title']) || !isset($_POST['desc']) || !isset($_POST['organisername']) || !isset($_POST['organiser'])) {
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit();
exit;
}
$id = 0;
@ -33,9 +33,9 @@ $desc = $_POST['desc'];
$name = $_POST['organisername'];
$uname = $_POST['organiser'];
$mail = $_POST['organiseremail'];
$active = (isset($_POST['active']) ? $_POST['active'] : 0);
$active = ($_POST['active'] ?? 0);
$statement;
if ($id == 0) {
$query = 'INSERT INTO projects (name, description, active) VALUES (:title, :desc, :active)';
$statement = $pdo->prepare($query);

@ -1,12 +1,15 @@
<?php namespace pvv\side;
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
<?php
namespace pvv\side;
require_once \dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$year = (isset($_GET['year']))
? $_GET['year']
: date("Y");
: date('Y');
$month = (isset($_GET['month']))
? $_GET['month']
: date("m");
: date('m');
$day = (isset($_GET['day']))
? $_GET['day']
: -1;
@ -34,38 +37,42 @@ $day = (isset($_GET['day']))
<main>
<?php
use \DateTimeImmutable;
use DateTimeImmutable;
$events = ($day == -1)
? $agenda->getNextOfEach(new \DateTimeImmutable)
? $agenda->getNextOfEach(new DateTimeImmutable())
: $agenda->getEventsBetween(
new DateTimeImmutable("$year-$month-$day 00:00:00"),
new DateTimeImmutable("$year-$month-$day 23:59:59"));
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 (\pvv\side\Agenda::isToday($event->getStart())) { ?><strong><?php } ?>
<em><?= $event->getRelativeDate() ?></em>
<?php if (\pvv\side\Agenda::isToday($event->getStart())) { ?></strong><?php } ?>
<?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()) { ?>
<a href="<?= $event->getURL() ?>"><?= $event->getName() ?></a>
<a href="<?php echo $event->getURL(); ?>"><?php echo $event->getName(); ?></a>
<?php } else { ?>
<?= $event->getName() ?>
<?php echo $event->getName(); ?>
<?php } ?>
<?php if ($event->getImageURL()) { ?>
<img src="<?= $event->getImageURL() ?>">
<img src="<?php echo $event->getImageURL(); ?>">
<?php } ?>
</h2>
<ul class="subtext">
<li>Tid: <strong><?= Agenda::getFormattedDate($event->getStart()) ?></strong></li>
<li>Sted: <strong><?= $event->getLocation() ?></strong></li>
<li>Arrangør: <strong><?= $event->getOrganiser() ?></strong></li>
<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 if ($limit) {
array_splice($description, $limit);
} ?>
<?php
$Parsedown = new \Parsedown();
echo $Parsedown->text(implode("\n", $description));

@ -1,6 +1,7 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use \pvv\side\Agenda;
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use pvv\side\Agenda;
?>
<!DOCTYPE html>
<html lang="no">
@ -20,33 +21,33 @@ use \pvv\side\Agenda;
<main>
<?php
$activity = new \pvv\side\social\AnimekveldActivity;
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
$activity = new pvv\side\social\AnimekveldActivity();
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable());
?>
<article>
<h2><em><?= $nextEvent->getRelativeDate()?></em> Animekveld
<h2><em><?php echo $nextEvent->getRelativeDate(); ?></em> Animekveld
<?php if ($nextEvent->getImageURL()) { ?>
<img src="<?= $nextEvent->getImageURL() ?>">
<img src="<?php echo $nextEvent->getImageURL(); ?>">
<?php } ?>
</h2>
<ul class="subtext">
<li>Tid:
<strong>
<?= Agenda::getFormattedDate($nextEvent->getStart());?>
<?php echo Agenda::getFormattedDate($nextEvent->getStart()); ?>
</strong>
<li>Sted:
<strong>
<?= $nextEvent->getLocation();?>
<?php echo $nextEvent->getLocation(); ?>
</strong>
<li>Arrangør:
<strong>
<?= $nextEvent->getOrganiser();?>
<?php echo $nextEvent->getOrganiser(); ?>
</strong>
</ul>
<?php
$Parsedown = new \Parsedown();
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $nextEvent->getDescription()));
?>
</article>
@ -54,6 +55,6 @@ $nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
</main>
<nav>
<?= navbar(1, 'aktiviteter'); ?>
<?= loginbar($sp, $pdo); ?>
<?php echo navbar(1, 'aktiviteter'); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>

@ -1,6 +1,7 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use \pvv\side\Agenda;
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use pvv\side\Agenda;
?>
<!DOCTYPE html>
<html lang="no">
@ -20,34 +21,34 @@ use \pvv\side\Agenda;
<main>
<?php
$activity = new \pvv\side\social\BrettspillActivity;
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
$activity = new pvv\side\social\BrettspillActivity();
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable());
?>
<article>
<h2><em><?= $nextEvent->getRelativeDate()?></em> Brettspillkveld
<h2><em><?php echo $nextEvent->getRelativeDate(); ?></em> Brettspillkveld
<?php if ($nextEvent->getImageURL()) { ?>
<img src="<?= $nextEvent->getImageURL() ?>">
<img src="<?php echo $nextEvent->getImageURL(); ?>">
<?php } ?>
</h2>
<ul class="subtext">
<li>Tid:
<strong>
<?= Agenda::getFormattedDate($nextEvent->getStart());?>
<?php echo Agenda::getFormattedDate($nextEvent->getStart()); ?>
</strong>
<li>Sted:
<strong>
<?= $nextEvent->getLocation();?>
<?php echo $nextEvent->getLocation(); ?>
</strong>
<li>Arrangør:
<strong>
<?= $nextEvent->getOrganiser();?>
<?php echo $nextEvent->getOrganiser(); ?>
</strong>
</ul>
<?php
$Parsedown = new \Parsedown();
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $nextEvent->getDescription()));
?>
</article>
@ -55,6 +56,6 @@ $nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
</main>
<nav>
<?= navbar(1, 'aktiviteter'); ?>
<?= loginbar($sp, $pdo); ?>
<?php echo navbar(1, 'aktiviteter'); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>

@ -65,39 +65,23 @@ img.float-right {
list-style: none;
}
.calendar-events ul li :not(.date):not(.time) {
display: inline-block;
width: calc(100% - 7em);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.calendar-events ul .date {
color: rgba(0, 0, 0, 0.5);
font-size: 0.8em;
margin-top: 0.2em;
}
.calendar-events > li > p {
border-bottom: 0.1em dotted rgba(0, 0, 0, 0.2);
}
.calendar-events ul {
list-style: none;
padding: 0;
}
.calendar-events a,
.calendar-events ul .time {
color: rgba(0, 0, 0, 0.5);
float: right;
.calendar-events a {
color: rgba(0,0,0, 0.85);
}
.calendar-events ul .icon,
.calendar-events ul .date {
.calendar-events ul .datetime {
color: rgba(0, 0, 0, 0.5);
float: right;
margin-right: 0.5em;
margin-left: 0.2em;
}
.calendar-events ul li {
margin-bottom: 0.4em;
}
main.contentsplit {

@ -1,65 +1,67 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
declare(strict_types=1);
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
header('Content-Type: application/json');
$door = new \pvv\side\Door($pdo);
$door = new pvv\side\Door($pdo);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_SERVER["HTTP_AUTHORIZATION"])) {
list($type, $data) = explode(" ", $_SERVER["HTTP_AUTHORIZATION"], 2);
if (strcasecmp($type, "Bearer") == 0) {
if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
[$type, $data] = explode(' ', $_SERVER['HTTP_AUTHORIZATION'], 2);
if (strcasecmp($type, 'Bearer') == 0) {
if (hash_equals($data, $DOOR_SECRET)) {
handleSetState();
} else {
echo '{"status": "error", "message": "Invalid authentication key"}';
die();
exit;
}
} else {
echo '{"status": "error", "message": "Invalid authentication method"}';
die();
exit;
}
} else {
echo '{"status": "error", "message": "Missing authentication"}';
die();
exit;
}
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') {
if (isset($_GET["period"])) {
$period = (string)htmlspecialchars($_GET["period"]);
if (isset($_GET['period'])) {
$period = (string) htmlspecialchars($_GET['period']);
if ($period == "day") {
if ($period == 'day') {
$startTime = time() - (60 * 60 * 24);
} else if ($period == "week") {
} elseif ($period == 'week') {
$startTime = time() - (60 * 60 * 24 * 7);
} else {
echo '{"status": "error", "message": "Invalid period"}';
die();
exit;
}
$lines = $door->getEntriesAfter($startTime);
if (isset($_GET["edgeonly"]) && (bool)htmlspecialchars($_GET["edgeonly"])) {
if (isset($_GET['edgeonly']) && (bool) htmlspecialchars($_GET['edgeonly'])) {
// Ignore repeats
$lines = getChanges($lines);
}
echo json_encode([
'status' => "OK",
'entries' => $lines
'status' => 'OK',
'entries' => $lines,
]);
} else {
// Only last entry
$line = (object) $door->getCurrent();
echo json_encode([
'status' => "OK",
'status' => 'OK',
'time' => $line->time,
'open' => $line->open
'open' => $line->open,
]);
}
}
function handleSetState() {
function handleSetState(): void {
global $door;
$jsonobj = file_get_contents('php://input');
@ -67,14 +69,14 @@ function handleSetState() {
if ((!isset($event->time)) || (!is_numeric($event->time))) {
echo '{"status": "error", "message": "Invalid timestamp"}';
die();
exit;
}
if ((!isset($event->isDoorOpen)) || (!is_bool($event->isDoorOpen))) {
echo '{"status": "error", "message": "Invalid door state"}';
die();
exit;
}
$door->createEvent((int)($event->time), $event->isDoorOpen ? 1 : 0);
$door->createEvent((int) $event->time, $event->isDoorOpen ? 1 : 0);
echo '{"status": "OK"}';
}
@ -83,9 +85,9 @@ function getChanges($items) {
$res = [];
foreach ($items as $item) {
if ($item["open"] !== $prevState) {
array_push($res, $item);
$prevState = $item["open"];
if ($item['open'] !== $prevState) {
$res[] = $item;
$prevState = $item['open'];
}
}

@ -1,6 +1,7 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use \pvv\side\Agenda;
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use pvv\side\Agenda;
?>
<!DOCTYPE html>
<html lang="no">
@ -20,33 +21,33 @@ use \pvv\side\Agenda;
<main>
<?php
$activity = new \pvv\side\social\DriftkveldActivity;
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
$activity = new pvv\side\social\DriftkveldActivity();
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable());
?>
<article>
<h2><em><?= $nextEvent->getRelativeDate()?></em> Driftkveld
<h2><em><?php echo $nextEvent->getRelativeDate(); ?></em> Driftkveld
<?php if ($nextEvent->getImageURL()) { ?>
<img src="<?= $nextEvent->getImageURL() ?>">
<img src="<?php echo $nextEvent->getImageURL(); ?>">
<?php } ?>
</h2>
<ul class="subtext">
<li>Tid:
<strong>
<?= Agenda::getFormattedDate($nextEvent->getStart());?>
<?php echo Agenda::getFormattedDate($nextEvent->getStart()); ?>
</strong>
<li>Sted:
<strong>
<?= $nextEvent->getLocation();?>
<?php echo $nextEvent->getLocation(); ?>
</strong>
<li>Arrangør:
<strong>
<?= $nextEvent->getOrganiser();?>
<?php echo $nextEvent->getOrganiser(); ?>
</strong>
</ul>
<?php
$Parsedown = new \Parsedown();
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $nextEvent->getDescription()));
?>
</article>
@ -54,6 +55,6 @@ $nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
</main>
<nav>
<?= navbar(1, 'aktiviteter'); ?>
<?= loginbar($sp, $pdo); ?>
<?php echo navbar(1, 'aktiviteter'); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>

@ -1,13 +1,13 @@
<?php
error_reporting(0);
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo);
$userManager = new pvv\admin\UserManager($pdo);
$as = new \SimpleSAML\Auth\Simple('default-sp');
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$loginname = $attrs['uid'][0];
@ -15,39 +15,40 @@ $loginname = $attrs['uid'][0];
if (!$loginname) {
header('Content-Type: text/plain', true, 403);
echo "Du må være logget inn for å se bildegalleriet.\r\n";
exit();
exit;
}
# Sourced from config.php through include.php
// Sourced from config.php through include.php
$galleryDir = $GALLERY_DIR;
$serverPath = $GALLERY_SERVER_PATH;
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp'];
$unamefile = $galleryDir . "/usernames.txt";
$unamefile = $galleryDir . '/usernames.txt';
$unamepairs = file($unamefile);
function getDirContents($dir, &$results = array()) {
function getDirContents($dir, &$results = []) {
$files = scandir($dir);
foreach ($files as $key => $value) {
$path = realpath($dir . DIRECTORY_SEPARATOR . $value);
$path = realpath($dir . \DIRECTORY_SEPARATOR . $value);
if (!is_dir($path)) {
// Remove the full path on disk, keep username and relative path to image.
$pos = strpos($path, $GLOBALS["galleryDir"]);
$pos = strpos($path, $GLOBALS['galleryDir']);
if ($pos !== false) {
$cleanPath = substr_replace($path, "", $pos, strlen($GLOBALS["galleryDir"]));
$cleanPath = substr_replace($path, '', $pos, strlen($GLOBALS['galleryDir']));
}
// Check if the file is an image
$ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
if (in_array($ext, $GLOBALS["allowedExtensions"])) {
$ext = strtolower(pathinfo($path, \PATHINFO_EXTENSION));
if (in_array($ext, $GLOBALS['allowedExtensions'], true)) {
$results[] = $cleanPath;
}
} else if ($value != "." && $value != ".." && $value != ".thumbnails") {
} elseif ($value != '.' && $value != '..' && $value != '.thumbnails') {
// recursively scan directories
getDirContents($path, $results);
}
}
return $results;
}
$images = getDirContents($galleryDir);
@ -61,7 +62,7 @@ function cmpModifyTime($a, $b) {
return ($mtime_a > $mtime_b) ? -1 : 1;
}
usort($images, "cmpModifyTime");
usort($images, 'cmpModifyTime');
$imageTemplate = '
<div class="card">
@ -77,7 +78,7 @@ $imageTemplate = '
<p class="card-footer-item">%time</p>
</div>
</div>
'
';
?>
@ -101,12 +102,12 @@ $imageTemplate = '
<main class="gallery-container">
<?php
foreach ($images as $key => $value) {
$modTime = date("d.m.Y H:i", filemtime($galleryDir . $value));
$imguser = explode("/", $value)[1];
$displaypath = implode("/", array_slice(explode("/", $value), 2));
$realname = "Ukjent";
$modTime = date('d.m.Y H:i', filemtime($galleryDir . $value));
$imguser = explode('/', $value)[1];
$displaypath = implode('/', array_slice(explode('/', $value), 2));
$realname = 'Ukjent';
foreach ($unamepairs as $unamepair) {
$unamepair = explode(":", $unamepair);
$unamepair = explode(':', $unamepair);
if ($unamepair[0] == $imguser) {
$realname = $unamepair[1];
break;
@ -114,12 +115,12 @@ $imageTemplate = '
}
$vars = [
"%user" => htmlspecialchars($imguser),
"%time" => $modTime,
"%name" => htmlspecialchars($displaypath),
"%path" => $serverPath . $value,
"%thumbnail" => $serverPath . "/.thumbnails" . $value . ".png",
"%realname" => htmlspecialchars($realname)
'%user' => htmlspecialchars($imguser),
'%time' => $modTime,
'%name' => htmlspecialchars($displaypath),
'%path' => $serverPath . $value,
'%thumbnail' => $serverPath . '/.thumbnails' . $value . '.png',
'%realname' => htmlspecialchars($realname),
];
echo strtr($imageTemplate, $vars);
}

@ -1,34 +1,36 @@
<?php
declare(strict_types=1);
require __DIR__ . '/../../config.php';
$searchDir = $SLIDESHOW_DIR;
$serverPath = $SLIDESHOW_SERVER_PATH;
$splashImg = "/PNG/PVV-logo-big-bluebg.png";
$splashImg = '/PNG/PVV-logo-big-bluebg.png';
// Note: This does not support nested directories
$filenames = sCaNdIr($searchDir);
$filenames = scandir($searchDir);
// Remove the expected non-images
foreach ($filenames as $k => $value) {
if(in_array($value, [".", ".."])) {
if (in_array($value, ['.', '..'], true)) {
unset($filenames[$k]);
}
}
function getFullPath($fname) { return ($GLOBALS["serverPath"] . "/" . $fname ); }
function getFullPath($fname) {
return $GLOBALS['serverPath'] . '/' . $fname;
}
// Sort filenames alphabetically and prepend the path prefix to each item.
asort($filenames);
$slideshowimagefilenames = aRrAy_MaP("getFullPath", $filenames);
$slideshowimagefilenames = aRrAy_MaP('getFullPath', $filenames);
// Prepend the cover photo
ArRaY_uNsHiFt($slideshowimagefilenames, $splashImg);
eChO('<img class="slideshowimg slideshowactive" id="slideshowImage1" src="' . $slideshowimagefilenames[0] . '">');
ecHo('<img class="slideshowimg" id="slideshowImage2" src="' . $slideshowimagefilenames[1] . '">');
eChO '<img class="slideshowimg slideshowactive" id="slideshowImage1" src="' . $slideshowimagefilenames[0] . '">';
ecHo '<img class="slideshowimg" id="slideshowImage2" src="' . $slideshowimagefilenames[1] . '">';
// Store list of file names in a globel JS variable
EchO("<script> const slideshowFnames =" . jSoN_eNcOdE($slideshowimagefilenames) . "; </script>");
?>
EchO '<script> const slideshowFnames =' . jSoN_eNcOdE($slideshowimagefilenames) . '; </script>';

@ -1,5 +1,8 @@
<?php namespace pvv\side;
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
<?php
namespace pvv\side;
require_once \dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$translation = ['I dag', 'I morgen', 'Denne uka', 'Neste uke', 'Denne måneden', 'Neste måned'];
?>
@ -18,8 +21,8 @@ $translation = ['I dag', 'I morgen', 'Denne uka', 'Neste uke', 'Denne måneden',
<body>
<nav>
<?= navbar(1, 'hendelser'); ?>
<?= loginbar($sp, $pdo); ?>
<?php echo navbar(1, 'hendelser'); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>
<main>
<h1 style="pointer-events:none; text-align: left;">Hendelser</h1>
@ -30,20 +33,22 @@ $translation = ['I dag', 'I morgen', 'Denne uka', 'Neste uke', 'Denne måneden',
$description_paragraphs = 2; // description length
foreach ($agenda->getNextDays() as $period => $events) {
if ($events) { ?>
<h2 style="text-align: left;"><?= $translation[$period] ?></h2>
<h2 style="text-align: left;"><?php echo $translation[$period]; ?></h2>
<ul class="events">
<?php foreach ($events as $event) {?>
<li style="border-color: <?= $event->getColor() ?>">
<li style="border-color: <?php echo $event->getColor(); ?>">
<h4><strong>
<?php if ($event->getURL()) { ?>
<a href="<?= $event->getURL() ?>"><?= $event->getName() ?></a>
<a href="<?php echo $event->getURL(); ?>"><?php echo $event->getName(); ?></a>
<?php } else { ?>
<?= $event->getName() ?>
<?php echo $event->getName(); ?>
<?php } ?>
</strong></h4>
<?php $description = $event->getDescription(); ?>
<?php if ($description_paragraphs) array_splice($description, $description_paragraphs); ?>
<?php if ($description_paragraphs) {
array_splice($description, $description_paragraphs);
} ?>
<?php
$Parsedown = new \Parsedown();
@ -51,9 +56,9 @@ $translation = ['I dag', 'I morgen', 'Denne uka', 'Neste uke', 'Denne måneden',
?>
<ul class="subtext">
<li>Tid: <strong><?= Agenda::getFormattedDate($event->getStart()) ?></strong></li>
<li>Sted: <strong><?= $event->getLocation() ?></strong></li>
<li>Arrangør: <strong><?= $event->getOrganiser() ?></strong></li>
<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>
</li>
<?php } ?>

@ -1,20 +1,20 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use \pvv\side\Agenda;
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use pvv\side\Agenda;
$eventID = 0;
if (isset($_GET['id'])) {
$eventID = $_GET['id'];
} else {
echo 'No event ID provided';
exit();
exit;
}
$dbActivity = new \pvv\side\DBActivity($pdo);
$dbActivity = new pvv\side\DBActivity($pdo);
$event = $dbActivity->getEventByID($eventID);
if (!$event) {
echo 'Failed to retrieve event info';
exit();
exit;
}
?>
<!DOCTYPE html>
@ -34,21 +34,21 @@ if(!$event){
<main>
<article>
<h2>
<?php if (\pvv\side\Agenda::isToday($event->getStart())) { ?><strong><?php } ?>
<em><?= $event->getRelativeDate() ?></em>
<?php if (\pvv\side\Agenda::isToday($event->getStart())) { ?></strong><?php } ?>
<?php if (Agenda::isToday($event->getStart())) { ?><strong><?php } ?>
<em><?php echo $event->getRelativeDate(); ?></em>
<?php if (Agenda::isToday($event->getStart())) { ?></strong><?php } ?>
<?= $event->getName() ?>
<?php echo $event->getName(); ?>
</h2>
<ul class="subtext">
<li>Tid: <strong><?= Agenda::getFormattedDate($event->getStart()) ?></strong></li>
<li>Sted: <strong><?= $event->getLocation() ?></strong></li>
<li>Arrangør: <strong><?= $event->getOrganiser() ?></strong></li>
<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
$Parsedown = new \Parsedown();
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $description));
?>
</article>

@ -1,22 +1,25 @@
<?php
require_once dirname(__DIR__) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$translation = ['I dag', 'I morgen', 'Denne uka', 'Neste uke', 'Denne måneden', 'Neste måned'];
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$motdfetcher = new \pvv\side\MOTD($pdo);
$motdfetcher = new pvv\side\MOTD($pdo);
$motd = $motdfetcher->getMOTD();
$door = new \pvv\side\Door($pdo);
$doorEntry = (object)($door->getCurrent());
$door = new pvv\side\Door($pdo);
$doorEntry = (object) $door->getCurrent();
if ($doorEntry->time < (time() - 60 * 30)) {
$doorStateText = "Ingen data fra dørsensor";
$doorStateText = 'Ingen data fra dørsensor';
} else {
if ($doorEntry->open) { $doorStateText = "Døren er <b>åpen</b>";
} else { $doorStateText = "Døren er <b>ikke åpen</b>"; }
if ($doorEntry->open) {
$doorStateText = 'Døren er <b>åpen</b>';
} else {
$doorStateText = 'Døren er <b>ikke åpen</b>';
}
$doorTime = date("H:i", $doorEntry->time);
}
$doorTime = date('H:i', $doorEntry->time);
?>
<!DOCTYPE html>
<html lang="no">
@ -41,7 +44,7 @@ $doorTime = date("H:i", $doorEntry->time);
<header class="landing">
<div id="imageSlideshow">
<?php include("galleri/slideshow.php"); ?>
<?php include 'galleri/slideshow.php'; ?>
<script src="js/slideshow.js"></script>
</div>
<div class="info">
@ -52,9 +55,9 @@ $doorTime = date("H:i", $doorEntry->time);
<a class="btn" href="om/"><li>Om PVV</li></a>
<a class="btn focus" href="paamelding/"><li>Bli medlem!</li></a>
<a class="btn" href="https://use.mazemap.com/#config=ntnu&v=1&zlevel=2&center=10.406281,63.417093&zoom=19.5&campuses=ntnu&campusid=1&sharepoitype=poi&sharepoi=38159&utm_medium=longurl">Veibeskrivelse</li></a>
<div id="doorIndicator" class="<?php echo($doorEntry->open ? "doorIndicator_OPEN" : "doorIndicator_CLOSED"); ?>" onclick="location.href='/door/graph.html'">
<p class="doorStateText"><?php echo($doorStateText) ?></p>
<p class="doorStateTime">(Oppdatert <?php echo($doorTime) ?>)</p>
<div id="doorIndicator" class="<?php echo $doorEntry->open ? 'doorIndicator_OPEN' : 'doorIndicator_CLOSED'; ?>" onclick="location.href='/door/graph.html'">
<p class="doorStateText"><?php echo $doorStateText; ?></p>
<p class="doorStateTime">(Oppdatert <?php echo $doorTime; ?>)</p>
</div>
</ul>
</div>
@ -66,51 +69,59 @@ $doorTime = date("H:i", $doorEntry->time);
<div class="calendar-events">
<?php $counter1 = 0; ?>
<?php $counter2 = 0; ?>
<?php foreach($agenda->getNextDays() as $period => $events) if ($events && $counter1 < 3 && $counter2 < 10) { $counter1++ ?>
<p class="no-chin"><?= $translation[$period] ?></p>
<?php foreach ($agenda->getNextDays() as $period => $events) {
if ($events && $counter1 < 3 && $counter2 < 10) {
$counter1++; ?>
<p class="no-chin"><?php echo $translation[$period]; ?></p>
<hr>
<ul>
<?php foreach($events as $event) { $counter2++ ?>
<?php foreach ($events as $event) {
$counter2++; ?>
<li>
<?php if ($event->getURL()) { ?>
<a href="<?= htmlspecialchars($event->getURL()) ?>"><?= $event->getName(); ?></a>
<a href="<?php echo htmlspecialchars($event->getURL()); ?>"><?php echo $event->getName(); ?></a>
<?php } else { ?>
<strong><?= $event->getName(); ?></strong>
<strong><?php echo $event->getName(); ?></strong>
<?php } ?>
<?php /* <a class="icon subscribe">+</a> */ ?>
<?php if ($period !== \pvv\side\Agenda::TODAY) {
echo '<span class="time">' . $event->getStart()->format('H:i') . '</span>';
if (\pvv\side\Agenda::isThisWeek($event->getStart()) || $event->getStart()->sub(new DateInterval('P3D'))->getTimestamp() < time()) {
echo '<span class="date">' . strftime('%a', $event->getStart()->getTimestamp()) . '</span>';
<span class="datetime">
<?php if ($period !== pvv\side\Agenda::TODAY) {
echo $event->getStart()->format('H:i') . ' ';
if (pvv\side\Agenda::isThisWeek($event->getStart()) || $event->getStart()->sub(new DateInterval('P3D'))->getTimestamp() < time()) {
echo $event->getStart()->format('D');
} else {
echo '<span class="date">' . strftime('%e. %b', $event->getStart()->getTimestamp()) . '</span>';
echo $event->getStart()->format('j. F');
}
} else {
echo '<span class="time">' . $event->getStart()->format('H:i') . '</span>';
echo $event->getStart()->format('H:i');
}
?>
</span>
</li>
<?php } ?>
</ul>
<?php } ?>
<?php
}
}
?>
</div>
<p><a class="btn" href="hendelser/">Flere aktiviteter</a></p>
</div>
<div class="gridl">
<?php
$title = $motd["title"];
$title = $motd['title'];
echo "<h1>";
if($title == ""){
echo "Dagens melding";
echo '<h1>';
if ($title == '') {
echo 'Dagens melding';
} else {
echo $title;
}
echo "</h1>";
echo '</h1>';
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $motd["content"]));
echo $Parsedown->text(implode("\n", $motd['content']));
?>
</div>
</main>

@ -1,16 +1,18 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$year = (isset($_GET['year']))
? $_GET['year']
: date("Y");
: date('Y');
$month = (isset($_GET['month']))
? $_GET['month']
: date("m");
$days_before_the_first = (new DateTime($year."-".$month."-01"))->format("w") - 1;
if ($days_before_the_first==-1) {$days_before_the_first = 6;}
$day_of_month = ($month == date("m"))
? date("j")
: date('m');
$days_before_the_first = (new DateTime($year . '-' . $month . '-01'))->format('w') - 1;
if ($days_before_the_first == -1) {
$days_before_the_first = 6;
}
$day_of_month = ($month == date('m'))
? date('j')
: -1;
$days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year));
@ -36,18 +38,25 @@ $days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year));
</nav>
<main>
<h2 style="text-align:center;">PVV Kalender for <?=$months_translations[$month-1]?> <?=$year?></h2>
<h2 style="text-align:center;">PVV Kalender for <?php echo $months_translations[$month - 1]; ?> <?php echo $year; ?></h2>
<div class="pagination_bar"><?php
<div class="pagination_bar">
<?php
$pmonth = $month - 1;
$nmonth = $month + 1;
$pyear = $year;
$nyear = $year;
if ($pmonth==0) {$pmonth=12; $pyear--;}
if ($nmonth==13) {$nmonth=1; $nyear++;}
if ($pmonth == 0) {
$pmonth = 12;
--$pyear;
}
if ($nmonth == 13) {
$nmonth = 1;
++$nyear;
}
?>
<a class="btn noselect" href="../kalender?year=<?=$pyear?>&amp;month=<?=$pmonth?>">Forrige måned</a>
<a class="btn noselect" href="../kalender?year=<?=$nyear?>&amp;month=<?=$nmonth?>">Neste måned</a>
<a class="btn noselect" href="../kalender?year=<?php echo $pyear; ?>&amp;month=<?php echo $pmonth; ?>">Forrige måned</a>
<a class="btn noselect" href="../kalender?year=<?php echo $nyear; ?>&amp;month=<?php echo $nmonth; ?>">Neste måned</a>
</div>
<figure class="calendar">
@ -61,30 +70,30 @@ $days_in_month = date('t', mktime(0, 0, 0, $month, 1, $year));
<li class="header noselect">søndag
<?php if ($days_before_the_first != 0) { ?>
<li class="outOfMonth" style="grid-column: 1/<?=$days_before_the_first+1?>;">
<li class="outOfMonth" style="grid-column: 1/<?php echo $days_before_the_first + 1; ?>;">
<?php } ?>
<?php for ($day=1; $day <= $days_in_month; $day++) { ?>
<?php for ($day = 1; $day <= $days_in_month; ++$day) { ?>
<?php $events = $agenda->getEventsBetween(
new DateTimeImmutable("$year-$month-$day 00:00:00"),
new DateTimeImmutable("$year-$month-$day 23:59:59")); ?>
new DateTimeImmutable("{$year}-{$month}-{$day} 00:00:00"),
new DateTimeImmutable("{$year}-{$month}-{$day} 23:59:59")
); ?>
<?php if ($day == $day_of_month) { ?>
<li class="active">
<?php } else { ?>
<li>
<?php } ?>
<?php if (sizeof($events)!=0) { ?>
<a href="../aktiviteter/?<?="year=$year&amp;month=$month&amp;day=$day"?>"><div>
<span class="noselect day"><?= $day ?>.</span>
<?php if (count($events) != 0) { ?>
<a href="../aktiviteter/?<?php echo "year={$year}&amp;month={$month}&amp;day={$day}"; ?>"><div>
<span class="noselect day"><?php echo $day; ?>.</span>
<?php foreach ($events as $event) { ?>
<section style="background: <?=$event->getColor()?>"><?=$event->getName()?></section>
<section style="background: <?php echo $event->getColor(); ?>"><?php echo $event->getName(); ?></section>
<?php } ?>
</div></a>
<?php } else { ?>
<span class="noselect day"><?= $day ?>.</span>
<span class="noselect day"><?php echo $day; ?>.</span>
<?php } ?>
<?php } ?>
</ul>
</figure>
</main>

@ -1,5 +1,5 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
?>
<!DOCTYPE html>
<html lang="no">
@ -43,11 +43,11 @@ require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc'
<p>Vi har en <a href="http://list.pvv.org/mailman/listinfo/aktive">e-postliste for aktive medlemmer</a>. All offisiell informasjon blir sendt på denne listen, og alle arrengementer blir også annonsert her.</p>
<p>Vi har en <a target="_blank" href="https://matrix.to/#/#pvv:pvv.ntnu.no">Matrix-server</a> for chat, memes, og all annen kommunikasjon. Den er bridget med IRC-kanalen og Discord-guilden vår. Hvis du er medlem kan du bruke vår <a href="https://chat.pvv.ntnu.no">self-hosted web client</a>.</p>
<p>Vi har et <a target="_blank" href="https://matrix.to/#/#pvv:pvv.ntnu.no">Matrix Space™</a> for chat, memes, og all annen kommunikasjon. Den er bridget med IRC-kanalen og Discord-serveren vår. Hvis du er medlem kan du bruke vår egen instans av <a href="https://chat.pvv.ntnu.no">Element web</a>.</p>
<p>Vi har en IRC-kanal på <a href="http://webchat.ircnet.net/">IRCnet</a> kalt #pvv.</p>
<p>Vi har en <a target="_blank" href="https://discord.gg/8VTBr6Q">Discord-guild</a> for de som foretrekker Discord over Matrix. </p>
<p>Vi har en <a target="_blank" href="https://discord.gg/8VTBr6Q">Discord-server</a> for de som foretrekker Discord over Matrix. </p>
</main>
</body>

@ -1,6 +1,7 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use \pvv\side\Agenda;
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
use pvv\side\Agenda;
?>
<!DOCTYPE html>
<html lang="no">
@ -34,28 +35,28 @@ use \pvv\side\Agenda;
<main>
<div id="outDatedBanner"><p><br>Denne siden er trolig utdatert! Hvis du er interessert, ta kontakt i discord-kanalen. <br> This page is probably outdated! If you're interested, check in with someone in our discord-channel. </p></div>
<?php
$activity = new \pvv\side\social\NerdepitsaActivity;
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
$activity = new pvv\side\social\NerdepitsaActivity();
$nextEvent = $activity->getNextEventFrom(new DateTimeImmutable());
?>
<article>
<h2><em><?= $nextEvent->getRelativeDate()?></em> Nerdepitsa
<h2><em><?php echo $nextEvent->getRelativeDate(); ?></em> Nerdepitsa
<?php if ($nextEvent->getImageURL()) { ?>
<img src="<?= $nextEvent->getImageURL() ?>">
<img src="<?php echo $nextEvent->getImageURL(); ?>">
<?php } ?>
</h2>
<ul class="subtext">
<li>Tid:
<strong>
<?= Agenda::getFormattedDate($nextEvent->getStart());?>
<?php echo Agenda::getFormattedDate($nextEvent->getStart()); ?>
</strong>
<li>Sted:
<strong>
<?= $nextEvent->getLocation();?>
<?php echo $nextEvent->getLocation(); ?>
</strong>
<li>Arrangør:
<strong>
<?= $nextEvent->getOrganiser();?>
<?php echo $nextEvent->getOrganiser(); ?>
</strong>
</ul>
@ -68,6 +69,6 @@ $nextEvent = $activity->getNextEventFrom(new DateTimeImmutable);
</main>
<nav>
<?= navbar(1, 'aktiviteter'); ?>
<?= loginbar($sp, $pdo); ?>
<?php echo navbar(1, 'aktiviteter'); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>

@ -1,5 +1,5 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
?>
<!DOCTYPE html>
<html lang="no">
@ -89,6 +89,6 @@ p {hyphens: auto;}
</main>
<nav>
<?= navbar(1); ?>
<?= loginbar($sp, $pdo); ?>
<?php echo navbar(1); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>

@ -1,5 +1,5 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
session_start();
@ -59,7 +59,7 @@ $attrs = $as->getAttributes();
<?php if ($attrs) { // logged in with pvv account?>
<p>
Du er nå logget in som <i><?= htmlspecialchars($attrs['uid'][0]) ?></i>,
Du er nå logget in som <i><?php echo htmlspecialchars($attrs['uid'][0]); ?></i>,
og trenger klart ikke sende melding om å få ny PVV bruker.
</p>
<?php } ?>

@ -1,18 +1,18 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
setlocale(\LC_ALL, 'nb_NO');
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');
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$projectManager = new \pvv\side\ProjectManager($pdo);
$projectManager = new pvv\side\ProjectManager($pdo);
$new = 0;
if (isset($_GET['new'])) {
@ -24,26 +24,26 @@ if(isset($_GET['id'])){
$projectID = $_GET['id'];
} elseif ($new == 0) {
echo "\nID not set";
exit();
exit;
}
$project = new \pvv\side\Project(
$project = new pvv\side\Project(
0,
'Nytt Prosjekt',
'',
$attrs["cn"][0],
$attrs["uid"][0],
$attrs["mail"][0],
$attrs['cn'][0],
$attrs['uid'][0],
$attrs['mail'][0],
1
);
if ($new == 0) {
$project = $projectManager->getByID($projectID);
$owner = $projectManager->getProjectOwner($projectID);
if($owner['uname'] != $attrs["uid"][0]){
if ($owner['uname'] != $attrs['uid'][0]) {
header('HTTP/1.0 403 Forbidden');
echo "wrong user";
exit();
echo 'wrong user';
exit;
}
}
?>
@ -74,19 +74,19 @@ if($new == 0){
<form action="update.php", method="post">
<p class="subtitle no-chin">Prosjektnavn</p>
<p class="subnote">Gi prosjektet ditt et passende navn</p>
<input class="wide" type="text" name="title" value="<?= $project->getName() ?>" class="boxinput"><br>
<input class="wide" type="text" name="title" value="<?php echo $project->getName(); ?>" class="boxinput"><br>
<p class="subtitle no-chin">Beskrivelse (<i style="opacity:0.5;">markdown</i>)</p>
<p class="subnote no-chin">Hva går prosjektet ditt ut på?</p>
<p class="subnote">De første to linjene blir vist på prosjektkortet, prøv å gjøre de til et fint sammendrag eller intro!</p>
<textarea class="tall" name="desc" style="width:100%" rows="8" class="boxinput"><?= implode($project->getDescription(), "\n"); ?></textarea>
<textarea class="tall" name="desc" style="width:100%" rows="8" class="boxinput"><?php echo implode("\n", $project->getDescription()); ?></textarea>
<?= '<input type="hidden" name="id" value="' . $project->getID() . '" />' ?>
<?php echo '<input type="hidden" name="id" value="' . $project->getID() . '" />'; ?>
<input type="hidden" name="active" value="1"/>
<div style="margin-top: 0.2em;">
<hr class="ruler">
<input type="submit" class="btn" value="<?= ($new ? 'Opprett prosjekt' : 'Lagre endringer') ?>"></input>
<input type="submit" class="btn" value="<?php echo $new ? 'Opprett prosjekt' : 'Lagre endringer'; ?>"></input>
<?php if (!$new) {?><input type="submit" class="btn" name="delete" value="Slett"></input><?php } ?>
</div>
</form>

@ -1,8 +1,8 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$translation = ['i dag', 'i morgen', 'denne uka', 'neste uke', 'denne måneden', 'neste måned'];
$projectManager = new \pvv\side\ProjectManager($pdo);
$projectManager = new pvv\side\ProjectManager($pdo);
$projects = $projectManager->getAll();
?>
<!DOCTYPE html>
@ -87,21 +87,21 @@ $projects = $projectManager->getAll();
$randProjects = array_rand($projects, min(6, count($projects)));
if (!is_array($randProjects)) {
$randProjects = [$randProjects];
};
}
foreach ($randProjects as $i) {
$project = $projects[$i];
$owner = $projectManager->getProjectOwner($project->getID());
?>
<a class="nostyle" href="info.php?id=<?= $project->getID() ?>"><div class="project-card">
<a class="nostyle" href="info.php?id=<?php echo $project->getID(); ?>"><div class="project-card">
<div class="card-content">
<h4 class="project-title"><?= $project->getName(); ?></h4>
<h4 class="project-title"><?php echo $project->getName(); ?></h4>
<?php
$Parsedown = new \Parsedown();
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", array_slice($project->getDescription(), 0, 2)));
?>
</div>
<p class="project-organizer">Organisert av <?= $owner['name']; ?></p>
<p class="project-organizer">Organisert av <?php echo $owner['name']; ?></p>
</div></a>
<?php } ?>
</div>

@ -1,23 +1,23 @@
<?php
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
require_once dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$projectID = 0;
if (isset($_GET['id'])) {
$projectID = $_GET['id'];
} else {
echo 'No project ID provided';
exit();
exit;
}
require_once(__DIR__ . '/../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
require_once __DIR__ . '/../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$attrs = $as->getAttributes();
$projectManager = new \pvv\side\ProjectManager($pdo);
$projectManager = new pvv\side\ProjectManager($pdo);
$project = $projectManager->getByID($projectID);
if (!$project) {
echo ":^)";
exit();
echo ':^)';
exit;
}
$members = $projectManager->getProjectMembers($projectID);
@ -28,17 +28,16 @@ foreach($normal_members as $i => $data){
}
}
$is_owner = False;
$is_member = False;
$is_owner = false;
$is_member = false;
if ($attrs) {
$uname = $attrs['uid'][0];
foreach ($members as $member) {
if ($member['uname'] == $uname) {
if ($member['owner'] == 1) {
$is_owner = True;
}
else if ($member['owner']==0){
$is_member = True;
$is_owner = true;
} elseif ($member['owner'] == 0) {
$is_member = true;
}
}
}
@ -66,9 +65,9 @@ if ($attrs){
<main class="contentsplit">
<div class="gridr">
<h2><?= $project->getName(); ?></h2>
<h2><?php echo $project->getName(); ?></h2>
<?php
$Parsedown = new \Parsedown();
$Parsedown = new Parsedown();
echo $Parsedown->text(implode("\n", $project->getDescription()));
?>
</div>
@ -82,27 +81,27 @@ if ($attrs){
<?php foreach ($members as $i => $data) {
if ($data['lead']) {
?>
<p><?= $data['name']; ?></p>
<p class="memberrole"><?= $data['role'] ?></p>
<p class="memberuname"><?= $data['uname']; ?></p>
<p class="memberemail"><?= $data['mail']; ?></p>
<p><?php echo $data['name']; ?></p>
<p class="memberrole"><?php echo $data['role']; ?></p>
<p class="memberuname"><?php echo $data['uname']; ?></p>
<p class="memberemail"><?php echo $data['mail']; ?></p>
<?php }
} ?>
</div>
</div>
<?php
if(sizeof($normal_members) > 0){
if (count($normal_members) > 0) {
?>
<div class="projectmembers">
<h2>Medlemmer</h2>
<?php foreach ($normal_members as $i => $data) {
?>
<div class="projectmember" style="border-color: #6a0;">
<p><?= $data['name']; ?></p>
<p class="memberrole"><?= $data['role'] ? $data['role'] : 'Deltaker' ?></p>
<p class="memberuname"><?= $data['uname']; ?></p>
<p class="memberemail"><?= $data['mail']; ?></p>
<p><?php echo $data['name']; ?></p>
<p class="memberrole"><?php echo $data['role'] ?: 'Deltaker'; ?></p>
<p class="memberuname"><?php echo $data['uname']; ?></p>
<p class="memberemail"><?php echo $data['mail']; ?></p>
</div>
<?php } ?>
</div>
@ -116,8 +115,8 @@ if ($attrs){
<input type="hidden" name="title" value="derp"/>
<input type="hidden" name="desc" value="derp"/>
<input type="hidden" name="active" value="derp"/>
<input type="hidden" name="id" value="<?= $projectID ?>"/>
<input type="submit" class="btn" name="join_or_leave" value="<?= ($is_member ? 'Forlat' : 'Bli med!') ?>"></input>
<input type="hidden" name="id" value="<?php echo $projectID; ?>"/>
<input type="submit" class="btn" name="join_or_leave" value="<?php echo $is_member ? 'Forlat' : 'Bli med!'; ?>"></input>
</p></form>
<?php
}

@ -1,18 +1,18 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
setlocale(\LC_ALL, 'nb_NO');
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');
require_once __DIR__ . '/../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$projectManager = new \pvv\side\ProjectManager($pdo);
$projectManager = new pvv\side\ProjectManager($pdo);
$projects = $projectManager->getByOwner($attrs['uid'][0]);
$page = 1;
@ -28,9 +28,7 @@ if(isset($_GET['filter'])){
// filter
$projects = array_values(array_filter(
$projects,
function($project) use ($filter){
return (preg_match('/.*'.$filter.'.*/i', $project->getName()) or preg_match('/.*'.$filter.'.*/i', implode(" ", $project->getDescription())));
}
static fn($project) => (preg_match('/.*' . $filter . '.*/i', $project->getName()) || preg_match('/.*' . $filter . '.*/i', implode(' ', $project->getDescription())))
));
?>
<!DOCTYPE html>
@ -50,8 +48,8 @@ $projects = array_values(array_filter(
<body>
<nav>
<?= navbar(1, 'prosjekt'); ?>
<?= loginbar(); ?>
<?php echo navbar(1, 'prosjekt'); ?>
<?php echo loginbar(); ?>
</nav>
<main class="gridsplit">
@ -63,7 +61,7 @@ $projects = array_values(array_filter(
$counter = 0;
$pageLimit = 8;
for($i = ($pageLimit * ($page - 1)); $i < count($projects); $i++){
for ($i = ($pageLimit * ($page - 1)); $i < count($projects); ++$i) {
if ($counter == $pageLimit) {
break;
}
@ -80,16 +78,16 @@ $projects = array_values(array_filter(
<li>
<div class="event">
<div class="event-info">
<a href="edit.php?id=<?= $project->getID() ?>">
<h3 class="no-chin"><?= $project->getName()?></h3>
<a href="edit.php?id=<?php echo $project->getID(); ?>">
<h3 class="no-chin"><?php echo $project->getName(); ?></h3>
</a>
<p style="text-decoration: none;"><?= implode("<br>", array_slice($project->getDescription(), 0, 4)); ?></p>
<p style="text-decoration: none;"><?php echo implode('<br>', array_slice($project->getDescription(), 0, 4)); ?></p>
</div>
</div>
</li>
<?php
$counter++;
++$counter;
}
?>
</ul>
@ -99,7 +97,7 @@ $projects = array_values(array_filter(
echo '<a class="btn float-left" href="?page=' . ($page - 1) . '&filter=' . urlencode($filter) . '">Forrige side</a>';
}
if(($counter == $pageLimit) and (($pageLimit * $page) < count($projects))){
if (($counter == $pageLimit) && (($pageLimit * $page) < count($projects))) {
echo '<a class="btn float-right" href="?page=' . ($page + 1) . '&filter=' . urlencode($filter) . '">Neste side</a>';
}
?>
@ -111,7 +109,7 @@ $projects = array_values(array_filter(
<h2>Filter</h2>
<form action="mine.php" method="get">
<p class="no-chin">Navn</p>
<?= '<input type="text" name="filter" class="boxinput" value="' . $filter . '">' ?><br>
<?php echo '<input type="text" name="filter" class="boxinput" value="' . $filter . '">'; ?><br>
<div style="margin-top: 2em;">
<input type="submit" class="btn" value="Filtrer"></input>

@ -1,18 +1,18 @@
<?php
date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO');
setlocale(\LC_ALL, 'nb_NO');
require __DIR__ . '/../../src/_autoload.php';
require __DIR__ . '/../../config.php';
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if(!isset($_POST['title']) or !isset($_POST['desc']) or !isset($_POST['active'])){
if (!isset($_POST['title']) || !isset($_POST['desc']) || !isset($_POST['active'])) {
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit();
exit;
}
require_once(__DIR__ . '/../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php');
$as = new \SimpleSAML\Auth\Simple('default-sp');
require_once __DIR__ . '/../../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new SimpleSAML\Auth\Simple('default-sp');
$as->requireAuth();
$attrs = $as->getAttributes();
@ -28,7 +28,7 @@ $name = $attrs['cn'][0];
$uname = $attrs['uid'][0];
$mail = $attrs['mail'][0];
$statement;
if ($id == 0) {
$query = 'INSERT INTO projects (name, description, active) VALUES (:title, :desc, 1)';
$statement = $pdo->prepare($query);
@ -47,31 +47,29 @@ if($id == 0){
$statement->bindParam(':owneremail', $mail, PDO::PARAM_STR);
$statement->execute();
}
else {
$projectManager = new \pvv\side\ProjectManager($pdo);
} else {
$projectManager = new pvv\side\ProjectManager($pdo);
$owner = $projectManager->getProjectOwner($id);
$members = $projectManager->getProjectMembers($id);
// if ($do_join_or_leave and $owner['uname'] != $uname) {
if ($do_join_or_leave) {
$is_member = False;
$is_member = false;
foreach ($members as $member) {
if ($member['uname'] == $uname and $member['owner']==0){
$is_member = True;
if ($member['uname'] == $uname && $member['owner'] == 0) {
$is_member = true;
break;
}
}
if ($is_member) {// leave
$query = "DELETE FROM projectmembers WHERE projectid=:id AND uname=:uname and lead=0 and owner=0;";
$query = 'DELETE FROM projectmembers WHERE projectid=:id AND uname=:uname and lead=0 and owner=0;';
$statement = $pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_STR);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR);
$statement->execute();
print("leave");
}
else{//join
echo 'leave';
} else {// join
$query = "INSERT INTO projectmembers (projectid, name, uname, mail, role, lead, owner) VALUES (:id, :name, :uname, :mail, 'Medlem', 0, 0)";
$statement = $pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_STR);
@ -80,16 +78,16 @@ else {
$statement->bindParam(':mail', $mail, PDO::PARAM_STR);
$statement->execute();
print("join");
echo 'join';
}
header('Location: ./info.php?id=' . $id);
exit();
exit;
}
if ($uname != $owner['uname']) {
header('Content-Type: text/plain', true, 403);
echo "Illegal action, you're not the project owner for project with ID " . $id . "\r\n";
exit();
exit;
}
if ($do_delete) {

71
www/spaceapi.php Normal file

@ -0,0 +1,71 @@
<?php
require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
$pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$door = new pvv\side\Door($pdo);
$doorEntry = (object) $door->getCurrent();
?>
{
"api_compatibility": ["14"],
"space": "Programvareverkstedet",
"logo": "https://git.pvv.ntnu.no/assets/img/logo.png",
"url": "https://www.pvv.ntnu.no/",
"location": {
"ext_campus": "NTNU Gløshaugen",
"ext_room_name": "Oppredning/Gruvedrift, Floor 2, Room 247",
"ext_mazemap": "https://link.mazemap.com/2n2HWa7H",
"address": "Sem Sælands vei 1, 7034 Trondheim, Norway",
"timezone": "Europe/Oslo",
"lon": 10.4063852,
"lat": 63.4170226
},
"contact": {
"irc": "irc://irc.pvv.ntnu.no/pvv",
"email": "pvv@pvv.ntnu.no",
"ext_discord": "https://discord.gg/8VTBr6Q",
"gopher": "gopher://isvegg.pvv.ntnu.no",
"matrix": "#pvv:pvv.ntnu.no"
},
"issue_report_channels": ["email"],
"state": {
"open": <?php echo $doorEntry->open ? 'true' : 'false'; ?>,
"lastchange": <?php echo $doorEntry->time ? $doorEntry->time : 0; ?>,
"message": "<?php echo $doorEntry->open ? 'open for public, members are present' : 'closed'; ?>"
},
"feeds": {
"wiki": {
"type": "atom",
"url": "https://wiki.pvv.ntnu.no/w/api.php?hidebots=1&urlversion=1&action=feedrecentchanges&feedformat=atom"
},
"calendar": {
"type": "html",
"url": "https://www.pvv.ntnu.no/hendelser/"
}
},
"projects": [
"https://github.com/Programvareverkstedet/",
"https://git.pvv.ntnu.no/",
"https://www.pvv.ntnu.no/prosjekt/"
],
"links": [
{
"name": "YouTube",
"url": "https://www.youtube.com/@pvvntnu5640"
},
{
"name": "LinkedIn",
"url": "https://www.linkedin.com/company/pvvntnu/"
},
{
"name": "Facebook",
"url": "https://www.facebook.com/pvvntnu/"
}
]
}

@ -1,5 +1,8 @@
<?php namespace pvv\side;
require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
<?php
namespace pvv\side;
require_once \dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
?>
<!DOCTYPE html>
<html lang="no">
@ -16,8 +19,8 @@ require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc'
<body>
<nav>
<?= navbar(1, 'tjenester'); ?>
<?= loginbar($sp, $pdo); ?>
<?php echo navbar(1, 'tjenester'); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>
<main>
@ -110,7 +113,7 @@ require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc'
<div class="serviceContent">
<h2 class="serviceTitle">Brukernettsider</h2>
<p class="serviceDescription">Alle brukere får automatisk en egen side for html og php. Denne er offentlig på pvv.ntnu.no/~brukernavn.</p>
<div class="serviceLink"><a href="https://wiki.pvv.ntnu.no/wiki/Hjemmesider" target="_blank">Gå til dokumentasjon på wiki</a></div>
<div class="serviceLink"><a href="https://wiki.pvv.ntnu.no/wiki/Tjenester/Hjemmesider" target="_blank">Gå til dokumentasjon på wiki</a></div>
</div>
<img class="serviceImage" src="img/php.png" alt="En elephpant">
</div>
@ -119,7 +122,7 @@ require_once dirname(dirname(__DIR__)) . implode(DIRECTORY_SEPARATOR, ['', 'inc'
<div class="serviceContent">
<h2 class="serviceTitle">PVV-siden</h2>
<p class="serviceDescription">Du befinner deg nå på PVV sin offisielle hjemmeside. Den er skrevet i PHP og kjører på en egen server.</p>
<div class="serviceLink"><a href="https://github.com/Programvareverkstedet/nettsiden" target="_blank">Se koden på github</a></div>
<div class="serviceLink"><a href="https://git.pvv.ntnu.no/Projects/nettsiden" target="_blank">Se koden på gitea</a></div>
</div>
<img class="serviceImage" src="../pvv-logo.png" alt="PVV-logo">
</div>