From 39ccaa2f2d70fc06892512ad6374baef37989ffe Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Sat, 22 Sep 2018 22:08:54 -0600 Subject: [PATCH] Add RSS/ATOM notification feeds, close #12 --- action.php | 4 + composer.json | 4 +- composer.lock | 364 ++++++++++------------------------- database.mwb | Bin 21282 -> 22664 bytes database_upgrade/2.0_2.1.sql | 35 ++++ feed.php | 89 +++++++++ langs/en/notifications.json | 4 +- langs/en/sync.json | 5 +- langs/messages.php | 4 + lib/RandomString.lib.php | 31 +++ pages/sync.php | 47 ++++- 11 files changed, 318 insertions(+), 269 deletions(-) create mode 100644 database_upgrade/2.0_2.1.sql create mode 100644 feed.php create mode 100644 lib/RandomString.lib.php diff --git a/action.php b/action.php index 58658f5..9a0b18c 100644 --- a/action.php +++ b/action.php @@ -113,4 +113,8 @@ switch ($VARS['action']) { returnToSender("invalid_parameters#notifications"); } break; + case "resetfeedkey": + $database->delete('userkeys', ['AND' => ['uid' => $_SESSION['uid'], 'typeid' => 1]]); + returnToSender("feed_key_reset"); + break; } \ No newline at end of file diff --git a/composer.json b/composer.json index 8e5ce8b..4252b03 100644 --- a/composer.json +++ b/composer.json @@ -6,10 +6,10 @@ "catfan/medoo": "^1.5", "spomky-labs/otphp": "^8.3", "endroid/qr-code": "^3.2", - "ldaptools/ldaptools": "^0.24.0", "guzzlehttp/guzzle": "^6.2", "phpmailer/phpmailer": "^5.2", - "christian-riesen/base32": "^1.3" + "christian-riesen/base32": "^1.3", + "mibe/feedwriter": "^1.1" }, "license": "MPL-2.0", "authors": [ diff --git a/composer.lock b/composer.lock index e6d8b5a..40cef4a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "872ba5f8bcf571aca66346a439e5b40d", - "content-hash": "49c0c56036b215998ff212564e9c2fd3", + "content-hash": "eca0497dbaf6b15cbe0ced496dec0712", "packages": [ { "name": "bacon/bacon-qr-code", @@ -51,7 +50,7 @@ ], "description": "BaconQrCode is a QR code generator for PHP.", "homepage": "https://github.com/Bacon/BaconQrCode", - "time": "2017-10-17 09:59:25" + "time": "2017-10-17T09:59:25+00:00" }, { "name": "beberlei/assert", @@ -106,7 +105,7 @@ "assertion", "validation" ], - "time": "2018-04-09 14:40:28" + "time": "2018-04-09T14:40:28+00:00" }, { "name": "catfan/medoo", @@ -165,7 +164,7 @@ "sql", "sqlite" ], - "time": "2018-03-26 17:54:24" + "time": "2018-03-26T17:54:24+00:00" }, { "name": "christian-riesen/base32", @@ -219,7 +218,7 @@ "encode", "rfc4648" ], - "time": "2016-05-05 11:49:03" + "time": "2016-05-05T11:49:03+00:00" }, { "name": "endroid/qr-code", @@ -279,7 +278,7 @@ "qr", "qrcode" ], - "time": "2018-02-27 21:35:30" + "time": "2018-02-27T21:35:30+00:00" }, { "name": "guzzlehttp/guzzle", @@ -344,7 +343,7 @@ "rest", "web service" ], - "time": "2018-03-26 16:33:04" + "time": "2018-03-26T16:33:04+00:00" }, { "name": "guzzlehttp/promises", @@ -395,7 +394,7 @@ "keywords": [ "promise" ], - "time": "2016-12-20 10:07:11" + "time": "2016-12-20T10:07:11+00:00" }, { "name": "guzzlehttp/psr7", @@ -460,7 +459,7 @@ "uri", "url" ], - "time": "2017-03-20 17:10:46" + "time": "2017-03-20T17:10:46+00:00" }, { "name": "khanamiryan/qrcode-detector-decoder", @@ -510,67 +509,104 @@ "qr", "zxing" ], - "time": "2018-04-01 20:25:53" + "time": "2018-04-01T20:25:53+00:00" }, { - "name": "ldaptools/ldaptools", - "version": "v0.24.0", + "name": "mibe/feedwriter", + "version": "v1.1.1", "source": { "type": "git", - "url": "https://github.com/ldaptools/ldaptools.git", - "reference": "31e05ae6082fc7e61afc666e2c773ee8cb0e47b5" + "url": "https://github.com/mibe/FeedWriter.git", + "reference": "f4cc748ad8700e36663f08cfeebe7fd39b00eea2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ldaptools/ldaptools/zipball/31e05ae6082fc7e61afc666e2c773ee8cb0e47b5", - "reference": "31e05ae6082fc7e61afc666e2c773ee8cb0e47b5", + "url": "https://api.github.com/repos/mibe/FeedWriter/zipball/f4cc748ad8700e36663f08cfeebe7fd39b00eea2", + "reference": "f4cc748ad8700e36663f08cfeebe7fd39b00eea2", "shasum": "" }, "require": { - "ext-ldap": "*", - "php": ">=5.6", - "ramsey/uuid": ">=3.0", - "symfony/event-dispatcher": ">=2.0", - "symfony/yaml": ">=2.0" - }, - "require-dev": { - "doctrine/cache": "~1.0", - "friendsofphp/php-cs-fixer": "~1.0", - "phpspec/phpspec": "~3.0", - "tedivm/stash": ">=0.14.1" - }, - "suggest": { - "doctrine/cache": "Provides the cache_type 'doctrine' to help increase performance.", - "ext-intl": "Better UTF-8 handling.", - "ext-mbstring": "Better UTF-8 handling.", - "tedivm/stash": "Provides the cache_type 'stash' to help increase performance." + "php": ">=5.3.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, "autoload": { "psr-4": { - "LdapTools\\": "src/LdapTools" + "FeedWriter\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "GPL-3.0" ], "authors": [ { - "name": "Chad Sikorra", - "email": "Chad.Sikorra@gmail.com", - "homepage": "http://www.chadsikorra.com" + "name": "Michael Bemmerl", + "email": "mail@mx-server.de" + }, + { + "name": "Phil Freo" + }, + { + "name": "Paul Ferrett" + }, + { + "name": "Brennen Bearnes" + }, + { + "name": "Michael Robinson", + "email": "mike@pagesofinterest.net" + }, + { + "name": "Baptiste Fontaine" + }, + { + "name": "Kristián Valentín" + }, + { + "name": "Brandtley McMinn" + }, + { + "name": "Julian Bogdani" + }, + { + "name": "Anis Uddin Ahmad", + "email": "anis.programmer@gmail.com" + }, + { + "name": "Cedric Gampert" + }, + { + "name": "Yamek" + }, + { + "name": "thielj" + }, + { + "name": "Pavel Khakhlou" + }, + { + "name": "Daniel" + }, + { + "name": "Tino Goratsch" } ], - "description": "LdapTools is a feature-rich LDAP library for PHP 5.6+.", - "homepage": "http://www.phpldaptools.com", + "description": "Generate feeds in either RSS 1.0, RSS 2.0 or ATOM formats", + "homepage": "https://github.com/mibe/FeedWriter", "keywords": [ - "Microsoft Exchange", - "active directory", - "ldap", - "openldap" - ], - "time": "2017-04-09 23:39:51" + "RSS 1.0", + "atom", + "feed", + "rss", + "rss 2.0", + "rss2" + ], + "time": "2016-11-19T20:47:44+00:00" }, { "name": "myclabs/php-enum", @@ -614,7 +650,7 @@ "keywords": [ "enum" ], - "time": "2017-06-28 16:24:08" + "time": "2017-06-28T16:24:08+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -676,20 +712,20 @@ "hex2bin", "rfc4648" ], - "time": "2018-03-10 19:47:49" + "time": "2018-03-10T19:47:49+00:00" }, { "name": "paragonie/random_compat", - "version": "v2.0.12", + "version": "v2.0.17", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb" + "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb", - "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/29af24f25bab834fcbb38ad2a69fa93b867e070d", + "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d", "shasum": "" }, "require": { @@ -721,10 +757,11 @@ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", "keywords": [ "csprng", + "polyfill", "pseudorandom", "random" ], - "time": "2018-04-04 21:24:14" + "time": "2018-07-04T16:31:37+00:00" }, { "name": "phpmailer/phpmailer", @@ -801,7 +838,7 @@ } ], "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "time": "2017-11-04 09:26:05" + "time": "2017-11-04T09:26:05+00:00" }, { "name": "psr/http-message", @@ -851,87 +888,7 @@ "request", "response" ], - "time": "2016-08-06 14:39:51" - }, - { - "name": "ramsey/uuid", - "version": "3.7.3", - "source": { - "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/44abcdad877d9a46685a3a4d221e3b2c4b87cb76", - "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76", - "shasum": "" - }, - "require": { - "paragonie/random_compat": "^1.0|^2.0", - "php": "^5.4 || ^7.0" - }, - "replace": { - "rhumsaa/uuid": "self.version" - }, - "require-dev": { - "codeception/aspect-mock": "^1.0 | ~2.0.0", - "doctrine/annotations": "~1.2.0", - "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1", - "ircmaxell/random-lib": "^1.1", - "jakub-onderka/php-parallel-lint": "^0.9.0", - "mockery/mockery": "^0.9.9", - "moontoast/math": "^1.1", - "php-mock/php-mock-phpunit": "^0.3|^1.1", - "phpunit/phpunit": "^4.7|^5.0", - "squizlabs/php_codesniffer": "^2.3" - }, - "suggest": { - "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", - "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", - "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", - "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Ramsey\\Uuid\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marijn Huizendveld", - "email": "marijn.huizendveld@gmail.com" - }, - { - "name": "Thibaud Fabre", - "email": "thibaud@aztech.io" - }, - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" - } - ], - "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", - "homepage": "https://github.com/ramsey/uuid", - "keywords": [ - "guid", - "identifier", - "uuid" - ], - "time": "2018-01-20 00:28:24" + "time": "2016-08-06T14:39:51+00:00" }, { "name": "spomky-labs/otphp", @@ -995,70 +952,7 @@ "otp", "totp" ], - "time": "2017-07-24 10:27:40" - }, - { - "name": "symfony/event-dispatcher", - "version": "v4.0.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "63353a71073faf08f62caab4e6889b06a787f07b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/63353a71073faf08f62caab4e6889b06a787f07b", - "reference": "63353a71073faf08f62caab4e6889b06a787f07b", - "shasum": "" - }, - "require": { - "php": "^7.1.3" - }, - "conflict": { - "symfony/dependency-injection": "<3.4" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.4|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/expression-language": "~3.4|~4.0", - "symfony/stopwatch": "~3.4|~4.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2018-04-06 07:35:43" + "time": "2017-07-24T10:27:40+00:00" }, { "name": "symfony/inflector", @@ -1115,7 +1009,7 @@ "symfony", "words" ], - "time": "2018-01-03 17:15:19" + "time": "2018-01-03T17:15:19+00:00" }, { "name": "symfony/options-resolver", @@ -1169,7 +1063,7 @@ "configuration", "options" ], - "time": "2018-01-18 22:19:33" + "time": "2018-01-18T22:19:33+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -1228,7 +1122,7 @@ "portable", "shim" ], - "time": "2018-01-30 19:27:44" + "time": "2018-01-30T19:27:44+00:00" }, { "name": "symfony/polyfill-php56", @@ -1284,7 +1178,7 @@ "portable", "shim" ], - "time": "2018-01-30 19:27:44" + "time": "2018-01-30T19:27:44+00:00" }, { "name": "symfony/polyfill-util", @@ -1336,7 +1230,7 @@ "polyfill", "shim" ], - "time": "2018-01-31 18:08:44" + "time": "2018-01-31T18:08:44+00:00" }, { "name": "symfony/property-access", @@ -1403,65 +1297,7 @@ "property path", "reflection" ], - "time": "2018-01-03 07:38:00" - }, - { - "name": "symfony/yaml", - "version": "v4.0.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "8b34ebb5989df61cbd77eff29a02c4db9ac1069c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/8b34ebb5989df61cbd77eff29a02c4db9ac1069c", - "reference": "8b34ebb5989df61cbd77eff29a02c4db9ac1069c", - "shasum": "" - }, - "require": { - "php": "^7.1.3" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2018-04-03 05:24:00" + "time": "2018-01-03T07:38:00+00:00" } ], "packages-dev": [], diff --git a/database.mwb b/database.mwb index e514b55ff5760e1a867a4f0a550c32dc697753a0..9fbac8635488010c4dfcb7e9cd5c46a0aadfac27 100644 GIT binary patch literal 22664 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 F{vXXZ{gMCx literal 21282 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%0A^%TE>&W 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 L_waM_x1stMZy?0k diff --git a/database_upgrade/2.0_2.1.sql b/database_upgrade/2.0_2.1.sql new file mode 100644 index 0000000..cafa74b --- /dev/null +++ b/database_upgrade/2.0_2.1.sql @@ -0,0 +1,35 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +CREATE TABLE IF NOT EXISTS `userkeys` ( + `uid` INT(11) NOT NULL, + `key` VARCHAR(100) NOT NULL, + `created` DATETIME NULL DEFAULT NULL, + `typeid` INT(11) NOT NULL, + PRIMARY KEY (`uid`), + INDEX `fk_userkeys_userkeytypes1_idx` (`typeid` ASC), + CONSTRAINT `fk_userkeys_accounts1` + FOREIGN KEY (`uid`) + REFERENCES `accounthub`.`accounts` (`uid`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_userkeys_userkeytypes1` + FOREIGN KEY (`typeid`) + REFERENCES `accounthub`.`userkeytypes` (`typeid`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8; + +CREATE TABLE IF NOT EXISTS `userkeytypes` ( + `typeid` INT(11) NOT NULL, + `typename` VARCHAR(45) NOT NULL, + PRIMARY KEY (`typeid`, `typename`)) +ENGINE = InnoDB +DEFAULT CHARACTER SET = utf8; + +INSERT INTO `userkeytypes` (`typeid`, `typename`) VALUES (1, 'RSSAtomFeed'); +INSERT INTO `userkeytypes` (`typeid`, `typename`) VALUES (2, 'Other'); \ No newline at end of file diff --git a/feed.php b/feed.php new file mode 100644 index 0000000..65d5dd3 --- /dev/null +++ b/feed.php @@ -0,0 +1,89 @@ +has('userkeys', ['key' => $_GET['key']])) { + http_response_code(403); + die("403 Forbidden: provide valid key"); +} + +$uid = $database->get('userkeys', 'uid', ['key' => $_GET['key']]); +$user = new User($uid); +switch ($user->getStatus()->get()) { + case AccountStatus::NORMAL: + case AccountStatus::CHANGE_PASSWORD: + case AccountStatus::ALERT_ON_ACCESS: + break; + default: + http_response_code(403); + die("403 Forbidden: user account not active"); +} + +$notifications = Notifications::get($user); + +switch ($_GET['type']) { + case "rss1": + $feed = new RSS1(); + break; + case "rss": + case "rss2": + $feed = new RSS2(); + break; + case "atom": + $feed = new ATOM(); + break; + default: + http_response_code(400); + die("400 Bad Request: feed parameter must have a value of \"rss\", \"rss1\", \"rss2\" or \"atom\"."); +} + +$feed->setTitle($Strings->build("Notifications from server for user", ['server' => SITE_TITLE, 'user' => $user->getName()], false)); + +if (strpos(URL, "http") === 0) { + $url = URL; +} else { + $url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://" . $_SERVER['HTTP_HOST'] . (($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) ? ":" . $_SERVER['SERVER_PORT'] : "") . URL; +} + +$feed->setLink($url); + +foreach ($notifications as $n) { + $item = $feed->createNewItem(); + $item->setTitle($n['title']); + if (empty($n['url'])) { + $item->setLink($url); + } else { + $item->setLink($n['url']); + } + $item->setDate(strtotime($n['timestamp'])); + if ($n['sensitive']) { + $content = $Strings->get("Sensitive content hidden", false); + } else { + $content = $n['content']; + } + if ($_GET['type'] == "atom") { + $item->setContent($content); + } else { + $item->setDescription($content); + } + $feed->addItem($item); +} + +$feed->printFeed(); diff --git a/langs/en/notifications.json b/langs/en/notifications.json index 71831dc..259c08d 100644 --- a/langs/en/notifications.json +++ b/langs/en/notifications.json @@ -3,5 +3,7 @@ "Notification deleted.": "Notification deleted.", "Mark as read": "Mark as read", "Delete": "Delete", - "All caught up!": "All caught up!" + "All caught up!": "All caught up!", + "Notifications from server for user": "Notifications from {server} for {user}", + "Sensitive content hidden": "Sensitive content hidden" } diff --git a/langs/en/sync.json b/langs/en/sync.json index d175aa3..0f43b93 100644 --- a/langs/en/sync.json +++ b/langs/en/sync.json @@ -9,5 +9,8 @@ "manual setup": "Manual Setup:", "sync key": "Sync key:", "url": "URL:", - "sync code name": "Device nickname" + "sync code name": "Device nickname", + "notification feed explained": "You can receive notifications via a RSS or ATOM news reader by clicking one of the buttons or manually adding a URL. Click the Reset button if you think someone else might know your feed URL (you'll need to delete and re-add the feed on all your devices).", + "Reset": "Reset", + "Feed key reset.": "Feed key reset." } diff --git a/langs/messages.php b/langs/messages.php index fd007e1..0562904 100644 --- a/langs/messages.php +++ b/langs/messages.php @@ -72,5 +72,9 @@ define("MESSAGES", [ "notification_deleted" => [ "string" => "Notification deleted.", "type" => "success" + ], + "feed_key_reset" => [ + "string" => "Feed key reset.", + "type" => "success" ] ]); diff --git a/lib/RandomString.lib.php b/lib/RandomString.lib.php new file mode 100644 index 0000000..56887d3 --- /dev/null +++ b/lib/RandomString.lib.php @@ -0,0 +1,31 @@ +insert('mobile_codes', ['uid' => $_SESSION['uid'], 'code' => $code, 'description' => $desc]); } - if (strpos(URL, "http") !== FALSE) { + if (strpos(URL, "http") === 0) { $url = URL . "mobile/index.php"; } else { $url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://" . $_SERVER['HTTP_HOST'] . (($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) ? ":" . $_SERVER['SERVER_PORT'] : "") . URL . "mobile/index.php"; @@ -124,4 +124,49 @@ if (!empty($_GET['delsynccode'])) { + + \ No newline at end of file