From c798d786887a76228e6f5fce4492f9b2c8569aba Mon Sep 17 00:00:00 2001 From: Brian Canini <canini.16@osu.edu> Date: Tue, 16 Feb 2021 14:30:02 -0500 Subject: [PATCH] Installing simple_instagram_feed module --- composer.json | 1 + composer.lock | 46 ++- vendor/composer/autoload_classmap.php | 1 + vendor/composer/autoload_static.php | 1 + vendor/composer/installed.json | 46 +++ .../modules/sqlauth/.codecov.yml | 11 + .../modules/sqlauth/.php_cs.dist | 15 + .../simplesamlphp/modules/sqlauth/.travis.yml | 31 ++ .../simplesamlphp/modules/sqlauth/LICENSE | 165 +++++++++ .../modules/sqlauth/bin/check-syntax.sh | 15 + .../modules/sqlauth/composer.json | 42 +++ .../modules/sqlauth/default-disable | 3 + .../simplesamlphp/modules/sqlauth/docs/sql.md | 100 ++++++ .../modules/sqlauth/lib/Auth/Source/SQL.php | 199 ++++++++++ .../simplesamlphp/modules/sqlauth/phpunit.xml | 19 + .../simplesamlphp/modules/sqlauth/psalm.xml | 30 ++ .../modules/sqlauth/tests/bootstrap.php | 11 + web/modules/simple_instagram_feed/LICENSE.txt | 339 ++++++++++++++++++ web/modules/simple_instagram_feed/README.txt | 97 +++++ .../css/simple_instagram_feed.css | 8 + .../js/simple_instagram_feed.js | 74 ++++ .../simple_instagram_feed.info.yml | 13 + .../simple_instagram_feed.install | 45 +++ .../simple_instagram_feed.libraries.yml | 13 + .../simple_instagram_feed.module | 27 ++ .../simple_instagram_feed.services.yml | 4 + .../src/Plugin/Block/SimpleInstagramBlock.php | 265 ++++++++++++++ .../Services/SimpleInstagramFeedLibrary.php | 68 ++++ .../SimpleInstagramFeedLibraryInterface.php | 27 ++ .../simple-instagram-block.html.twig | 1 + .../Functional/SimpleInstagramFeedTest.php | 62 ++++ 31 files changed, 1778 insertions(+), 1 deletion(-) create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.codecov.yml create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.php_cs.dist create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.travis.yml create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/LICENSE create mode 100755 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/bin/check-syntax.sh create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/composer.json create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/default-disable create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/docs/sql.md create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/phpunit.xml create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/psalm.xml create mode 100644 vendor/simplesamlphp/simplesamlphp/modules/sqlauth/tests/bootstrap.php create mode 100644 web/modules/simple_instagram_feed/LICENSE.txt create mode 100644 web/modules/simple_instagram_feed/README.txt create mode 100644 web/modules/simple_instagram_feed/css/simple_instagram_feed.css create mode 100644 web/modules/simple_instagram_feed/js/simple_instagram_feed.js create mode 100644 web/modules/simple_instagram_feed/simple_instagram_feed.info.yml create mode 100644 web/modules/simple_instagram_feed/simple_instagram_feed.install create mode 100644 web/modules/simple_instagram_feed/simple_instagram_feed.libraries.yml create mode 100644 web/modules/simple_instagram_feed/simple_instagram_feed.module create mode 100644 web/modules/simple_instagram_feed/simple_instagram_feed.services.yml create mode 100644 web/modules/simple_instagram_feed/src/Plugin/Block/SimpleInstagramBlock.php create mode 100644 web/modules/simple_instagram_feed/src/Services/SimpleInstagramFeedLibrary.php create mode 100644 web/modules/simple_instagram_feed/src/Services/SimpleInstagramFeedLibraryInterface.php create mode 100644 web/modules/simple_instagram_feed/templates/simple-instagram-block.html.twig create mode 100644 web/modules/simple_instagram_feed/tests/src/Functional/SimpleInstagramFeedTest.php diff --git a/composer.json b/composer.json index 16e7d6d5ff..a0229a0d05 100644 --- a/composer.json +++ b/composer.json @@ -165,6 +165,7 @@ "drupal/search_api": "1.19", "drupal/search_api_db": "1.19", "drupal/simple_gmap": "3.0", + "drupal/simple_instagram_feed": "^3.9", "drupal/simple_megamenu": "1.0-beta3", "drupal/simple_sitemap": "3.8", "drupal/simplesamlphp_auth": "3.2", diff --git a/composer.lock b/composer.lock index 70ccf3292f..341e6555ec 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a924689e4249f921d2df4f53f1991677", + "content-hash": "716f36d1a00dd4f2961fe40aed1bdf36", "packages": [ { "name": "alchemy/zippy", @@ -7438,6 +7438,50 @@ "source": "https://git.drupalcode.org/project/simple_gmap" } }, + { + "name": "drupal/simple_instagram_feed", + "version": "3.9.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/simple_instagram_feed.git", + "reference": "8.x-3.9" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/simple_instagram_feed-8.x-3.9.zip", + "reference": "8.x-3.9", + "shasum": "38bb6b69316c29dc7554af79326b510efec7b458" + }, + "require": { + "drupal/core": "^8 || ^9" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-3.9", + "datestamp": "1599672217", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "awasson", + "homepage": "https://www.drupal.org/user/127091" + } + ], + "description": "Creates a block with a dynamic Instagram Feed using https://github.com/jsanahuja/jquery.instagramFeed.", + "homepage": "https://www.drupal.org/project/simple_instagram_feed", + "support": { + "source": "https://git.drupalcode.org/project/simple_instagram_feed" + } + }, { "name": "drupal/simple_megamenu", "version": "1.0.0-beta3", diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index b1fe89f10c..808123128d 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -4531,6 +4531,7 @@ 'SimpleSAML\\Module\\riak\\Store\\Riak' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/riak/lib/Store/Riak.php', 'SimpleSAML\\Module\\smartattributes\\Auth\\Process\\SmartID' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/smartattributes/lib/Auth/Process/SmartID.php', 'SimpleSAML\\Module\\smartattributes\\Auth\\Process\\SmartName' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/smartattributes/lib/Auth/Process/SmartName.php', + 'SimpleSAML\\Module\\sqlauth\\Auth\\Source\\SQL' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php', 'SimpleSAML\\Module\\statistics\\AccessCheck' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/AccessCheck.php', 'SimpleSAML\\Module\\statistics\\Aggregator' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Aggregator.php', 'SimpleSAML\\Module\\statistics\\DateHandler' => $vendorDir . '/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandler.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index c025311d0a..1ef22e53e5 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -5321,6 +5321,7 @@ class ComposerStaticInit5c689ffcd54b9e495ed983fdce09b530 'SimpleSAML\\Module\\riak\\Store\\Riak' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/riak/lib/Store/Riak.php', 'SimpleSAML\\Module\\smartattributes\\Auth\\Process\\SmartID' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/smartattributes/lib/Auth/Process/SmartID.php', 'SimpleSAML\\Module\\smartattributes\\Auth\\Process\\SmartName' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/smartattributes/lib/Auth/Process/SmartName.php', + 'SimpleSAML\\Module\\sqlauth\\Auth\\Source\\SQL' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php', 'SimpleSAML\\Module\\statistics\\AccessCheck' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/AccessCheck.php', 'SimpleSAML\\Module\\statistics\\Aggregator' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/Aggregator.php', 'SimpleSAML\\Module\\statistics\\DateHandler' => __DIR__ . '/..' . '/simplesamlphp/simplesamlphp/modules/statistics/lib/DateHandler.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 8ecf83f42f..aca15f032a 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -7667,6 +7667,52 @@ "source": "https://git.drupalcode.org/project/simple_gmap" } }, + { + "name": "drupal/simple_instagram_feed", + "version": "3.9.0", + "version_normalized": "3.9.0.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/simple_instagram_feed.git", + "reference": "8.x-3.9" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/simple_instagram_feed-8.x-3.9.zip", + "reference": "8.x-3.9", + "shasum": "38bb6b69316c29dc7554af79326b510efec7b458" + }, + "require": { + "drupal/core": "^8 || ^9" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "8.x-3.9", + "datestamp": "1599672217", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "installation-source": "dist", + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "awasson", + "homepage": "https://www.drupal.org/user/127091" + } + ], + "description": "Creates a block with a dynamic Instagram Feed using https://github.com/jsanahuja/jquery.instagramFeed.", + "homepage": "https://www.drupal.org/project/simple_instagram_feed", + "support": { + "source": "https://git.drupalcode.org/project/simple_instagram_feed" + } + }, { "name": "drupal/simple_megamenu", "version": "1.0.0-beta3", diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.codecov.yml b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.codecov.yml new file mode 100644 index 0000000000..f7f39e1e93 --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.codecov.yml @@ -0,0 +1,11 @@ +coverage: + status: + project: yes + +comment: + layout: "diff" + behavior: once + require_changes: true + require_base: no + require_head: yes + branches: null diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.php_cs.dist b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.php_cs.dist new file mode 100644 index 0000000000..e7d314696c --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.php_cs.dist @@ -0,0 +1,15 @@ +<?php +$finder = PhpCsFixer\Finder::create() + ->in([ + __DIR__ . '/lib', + __DIR__ . '/tests', + ]) +; +return PhpCsFixer\Config::create() + ->setRules([ + '@PSR2' => true, + '@PSR4' => true, + '@PSR5' => true, + ]) + ->setFinder($finder) +; diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.travis.yml b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.travis.yml new file mode 100644 index 0000000000..fec43ab41a --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/.travis.yml @@ -0,0 +1,31 @@ +sudo: required + +language: php + +php: + - 5.6 + - 7.0 + - 7.1 + - 7.2 + - 7.3 + +env: + - SIMPLESAMLPHP_VERSION=1.17.* + +before_script: + - composer require "simplesamlphp/simplesamlphp:${SIMPLESAMLPHP_VERSION}" --no-update + - composer update --no-interaction + - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then composer require --dev vimeo/psalm:1.1.9; fi + +script: + - bin/check-syntax.sh + - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then php vendor/phpunit/phpunit/phpunit; else php vendor/phpunit/phpunit/phpunit --no-coverage; fi + - if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]]; then vendor/bin/psalm; fi + +after_success: + # Codecov, need to edit bash uploader for incorrect TRAVIS_PYTHON_VERSION environment variable matching, at least until codecov/codecov-bash#133 is resolved + - curl -s https://codecov.io/bash > .codecov + - sed -i -e 's/TRAVIS_.*_VERSION/^TRAVIS_.*_VERSION=/' .codecov + - chmod +x .codecov + - if [[ $TRAVIS_PHP_VERSION == "5.6" ]]; then ./.codecov -X gcov; fi +# - if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]]; then bash <(curl -s https://codecov.io/bash); fi diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/LICENSE b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/LICENSE new file mode 100644 index 0000000000..0a041280bd --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/bin/check-syntax.sh b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/bin/check-syntax.sh new file mode 100755 index 0000000000..db6dc4b014 --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/bin/check-syntax.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +PHP='/usr/bin/env php' +RETURN=0 + +# check PHP files +for FILE in `find lib tests -name "*.php"`; do + $PHP -l $FILE > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "Syntax check failed for ${FILE}" + RETURN=`expr ${RETURN} + 1` + fi +done + +exit $RETURN diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/composer.json b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/composer.json new file mode 100644 index 0000000000..b4f1102429 --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/composer.json @@ -0,0 +1,42 @@ +{ + "name": "simplesamlphp/simplesamlphp-module-sqlauth", + "description": "This is a authentication module for authenticating a user against a SQL database", + "type": "simplesamlphp-module", + "keywords": ["simplesamlphp", "sqlauth"], + "license": "LGPL-3.0-or-later", + "authors": [ + { + "name": "Olav Morken", + "email": "olavmrk@gmail.com" + } + ], + "config": { + "preferred-install": { + "simplesamlphp/simplesamlphp": "source", + "*": "dist" + } + }, + "autoload": { + "psr-4": { + "SimpleSAML\\Module\\sqlauth\\": "lib/" + } + }, + "autoload-dev": { + "psr-4": { + "SimpleSAML\\Test\\Utils\\": "vendor/simplesamlphp/simplesamlphp/tests/Utils" + } + }, + "require": { + "php": ">=5.6", + "simplesamlphp/composer-module-installer": "~1.1" + }, + "require-dev": { + "phpunit/phpunit": "~5.7", + "simplesamlphp/simplesamlphp": "^1.17", + "webmozart/assert": "^1.4" + }, + "support": { + "issues": "https://github.com/tvdijen/simplesamlphp-module-sqlauth/issues", + "source": "https://github.com/tvdijen/simplesamlphp-module-sqlauth" + } +} diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/default-disable b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/default-disable new file mode 100644 index 0000000000..fa0bd82e2d --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/default-disable @@ -0,0 +1,3 @@ +This file indicates that the default state of this module +is disabled. To enable, create a file named enable in the +same directory as this file. diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/docs/sql.md b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/docs/sql.md new file mode 100644 index 0000000000..310b47eb17 --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/docs/sql.md @@ -0,0 +1,100 @@ +`sqlauth:SQL` +============= + +This is a authentication module for authenticating a user against a SQL database. + + +Options +------- + +`dsn` +: The DSN which should be used to connect to the database server. + Check the various database drivers in the [PHP documentation](http://php.net/manual/en/pdo.drivers.php) for a description of the various DSN formats. + +`username` +: The username which should be used when connecting to the database server. + + +`password` +: The password which should be used when connecting to the database server. + +`query` +: The SQL query which should be used to retrieve the user. + The parameters :username and :password are available. + If the username/password is incorrect, the query should return no rows. + The name of the columns in resultset will be used as attribute names. + If the query returns multiple rows, they will be merged into the attributes. + Duplicate values and NULL values will be removed. + + +Examples +-------- + +Database layout used in some of the examples: + + CREATE TABLE users ( + uid VARCHAR(30) NOT NULL PRIMARY KEY, + password TEXT NOT NULL, + salt TEXT NOT NULL, + givenName TEXT NOT NULL, + email TEXT NOT NULL, + eduPersonPrincipalName TEXT NOT NULL + ); + CREATE TABLE usergroups ( + uid VARCHAR(30) NOT NULL REFERENCES users (uid) ON DELETE CASCADE ON UPDATE CASCADE, + groupname VARCHAR(30) NOT NULL, + UNIQUE(uid, groupname) + ); + +Example query - SHA256 of salt + password, with the salt stored in an independent column, MySQL server: + + SELECT uid, givenName, email, eduPersonPrincipalName + FROM users + WHERE uid = :username + AND PASSWORD = SHA2( + CONCAT( + (SELECT salt FROM users WHERE uid = :username), + :password + ), + 256 + ) + +Example query - SHA256 of salt + password, with the salt stored in an independent column. Multiple groups, MySQL server: + + SELECT users.uid, givenName, email, eduPersonPrincipalName, groupname AS groups + FROM users LEFT JOIN usergroups ON users.uid = usergroups.username + WHERE users.uid = :username + AND PASSWORD = SHA2( + CONCAT( + (SELECT salt FROM users WHERE uid = :username), + :password + ), + 256 + ) + +Example query - SHA512 of salt + password, stored as salt (32 bytes) + sha256(salt + password) in password-field, PostgreSQL server: + + SELECT uid, givenName, email, eduPersonPrincipalName + FROM users + WHERE username = :username + AND SUBSTRING( + password FROM LENGTH(password) - 31 + ) = SHA2( + CONCAT( + SUBSTRING(password FROM 1 FOR LENGTH(password) - 32), + :password + ), + 512 + ) + +Security considerations +----------------------- + +Please never store passwords in plaintext in a database. You should always hash your passwords with a secure one-way +function like the ones in the SHA2 family. Use randomly generated salts with a length at least equal to the hash of the +password itself. Salts should be per-password, that meaning every time a password changes, the salt must change, and +therefore salts must be stored in the database alongside the passwords they were used for. Application-wide salts can +be used (by just concatenating them to the input of the hash function), but should never replace per-password salts, +used instead as an additional security measure. + +One way hashing algorithms like MD5 or SHA1 are considered insecure and should therefore be avoided. diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php new file mode 100644 index 0000000000..b820a6a3e4 --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/lib/Auth/Source/SQL.php @@ -0,0 +1,199 @@ +<?php + +namespace SimpleSAML\Module\sqlauth\Auth\Source; + +/** + * Simple SQL authentication source + * + * This class is an example authentication source which authenticates an user + * against a SQL database. + * + * @package SimpleSAMLphp + */ + +class SQL extends \SimpleSAML\Module\core\Auth\UserPassBase +{ + /** + * The DSN we should connect to. + */ + private $dsn; + + /** + * The username we should connect to the database with. + */ + private $username; + + /** + * The password we should connect to the database with. + */ + private $password; + + /** + * The options that we should connect to the database with. + */ + private $options; + + /** + * The query we should use to retrieve the attributes for the user. + * + * The username and password will be available as :username and :password. + */ + private $query; + + /** + * Constructor for this authentication source. + * + * @param array $info Information about this authentication source. + * @param array $config Configuration. + */ + public function __construct($info, $config) + { + assert(is_array($info)); + assert(is_array($config)); + + // Call the parent constructor first, as required by the interface + parent::__construct($info, $config); + + // Make sure that all required parameters are present. + foreach (['dsn', 'username', 'password', 'query'] as $param) { + if (!array_key_exists($param, $config)) { + throw new \Exception('Missing required attribute \''.$param. + '\' for authentication source '.$this->authId); + } + + if (!is_string($config[$param])) { + throw new \Exception('Expected parameter \''.$param. + '\' for authentication source '.$this->authId. + ' to be a string. Instead it was: '. + var_export($config[$param], true)); + } + } + + $this->dsn = $config['dsn']; + $this->username = $config['username']; + $this->password = $config['password']; + $this->query = $config['query']; + if (isset($config['options'])) { + $this->options = $config['options']; + } + } + + + /** + * Create a database connection. + * + * @return \PDO The database connection. + */ + private function connect() + { + try { + $db = new \PDO($this->dsn, $this->username, $this->password, $this->options); + } catch (\PDOException $e) { + throw new \Exception('sqlauth:'.$this->authId.': - Failed to connect to \''. + $this->dsn.'\': '.$e->getMessage()); + } + + $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + + $driver = explode(':', $this->dsn, 2); + $driver = strtolower($driver[0]); + + // Driver specific initialization + switch ($driver) { + case 'mysql': + // Use UTF-8 + $db->exec("SET NAMES 'utf8mb4'"); + break; + case 'pgsql': + // Use UTF-8 + $db->exec("SET NAMES 'UTF8'"); + break; + } + + return $db; + } + + + /** + * Attempt to log in using the given username and password. + * + * On a successful login, this function should return the users attributes. On failure, + * it should throw an exception. If the error was caused by the user entering the wrong + * username or password, a \SimpleSAML\Error\Error('WRONGUSERPASS') should be thrown. + * + * Note that both the username and the password are UTF-8 encoded. + * + * @param string $username The username the user wrote. + * @param string $password The password the user wrote. + * @return array Associative array with the users attributes. + */ + protected function login($username, $password) + { + assert(is_string($username)); + assert(is_string($password)); + + $db = $this->connect(); + + try { + $sth = $db->prepare($this->query); + } catch (\PDOException $e) { + throw new \Exception('sqlauth:'.$this->authId. + ': - Failed to prepare query: '.$e->getMessage()); + } + + try { + $sth->execute(['username' => $username, 'password' => $password]); + } catch (\PDOException $e) { + throw new \Exception('sqlauth:'.$this->authId. + ': - Failed to execute query: '.$e->getMessage()); + } + + try { + $data = $sth->fetchAll(\PDO::FETCH_ASSOC); + } catch (\PDOException $e) { + throw new \Exception('sqlauth:'.$this->authId. + ': - Failed to fetch result set: '.$e->getMessage()); + } + + \SimpleSAML\Logger::info('sqlauth:'.$this->authId.': Got '.count($data). + ' rows from database'); + + if (count($data) === 0) { + // No rows returned - invalid username/password + \SimpleSAML\Logger::error('sqlauth:'.$this->authId. + ': No rows in result set. Probably wrong username/password.'); + throw new \SimpleSAML\Error\Error('WRONGUSERPASS'); + } + + /* Extract attributes. We allow the resultset to consist of multiple rows. Attributes + * which are present in more than one row will become multivalued. null values and + * duplicate values will be skipped. All values will be converted to strings. + */ + $attributes = []; + foreach ($data as $row) { + foreach ($row as $name => $value) { + if ($value === null) { + continue; + } + + $value = (string) $value; + + if (!array_key_exists($name, $attributes)) { + $attributes[$name] = []; + } + + if (in_array($value, $attributes[$name], true)) { + // Value already exists in attribute + continue; + } + + $attributes[$name][] = $value; + } + } + + \SimpleSAML\Logger::info('sqlauth:'.$this->authId.': Attributes: '. + implode(',', array_keys($attributes))); + + return $attributes; + } +} diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/phpunit.xml b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/phpunit.xml new file mode 100644 index 0000000000..c0985fdd80 --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/phpunit.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" ?> +<phpunit bootstrap="tests/bootstrap.php"> + <testsuites> + <testsuite name="The project's test suite"> + <directory>tests/</directory> + </testsuite> + </testsuites> + <filter> + <whitelist processUncoveredFilesFromWhitelist="true"> + <directory suffix=".php">./lib</directory> + </whitelist> + </filter> + <logging> + <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" /> + <log type="coverage-html" target="build/coverage" title="PHP Coveralls" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70" /> + <log type="coverage-clover" target="build/logs/clover.xml" /> + </logging> +</phpunit> + diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/psalm.xml b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/psalm.xml new file mode 100644 index 0000000000..a9cae34101 --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/psalm.xml @@ -0,0 +1,30 @@ +<?xml version="1.0"?> +<psalm + name="The SimpleSAMLphp sqlauth module" + useDocblockTypes="true" + totallyTyped="false" +> + <projectFiles> + <directory name="lib" /> + </projectFiles> + + <issueHandlers> + <LessSpecificReturnType errorLevel="info" /> + + <!-- level 3 issues - slightly lazy code writing, but probably low false-negatives --> + <DeprecatedMethod errorLevel="info" /> + + <MissingClosureReturnType errorLevel="info" /> + <MissingReturnType errorLevel="info" /> + <MissingPropertyType errorLevel="info" /> + <InvalidDocblock errorLevel="info" /> + <MisplacedRequiredParam errorLevel="info" /> + + <PropertyNotSetInConstructor errorLevel="info" /> + <MissingConstructor errorLevel="info" /> + <MissingClosureParamType errorLevel="info" /> + <MissingParamType errorLevel="info" /> + <UnusedClass errorLevel="info" /> + <PossiblyUnusedMethod errorLevel="info" /> + </issueHandlers> +</psalm> diff --git a/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/tests/bootstrap.php b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/tests/bootstrap.php new file mode 100644 index 0000000000..28efee11df --- /dev/null +++ b/vendor/simplesamlphp/simplesamlphp/modules/sqlauth/tests/bootstrap.php @@ -0,0 +1,11 @@ +<?php + +$projectRoot = dirname(__DIR__); +require_once($projectRoot.'/vendor/autoload.php'); + +// Symlink module into ssp vendor lib so that templates and urls can resolve correctly +$linkPath = $projectRoot.'/vendor/simplesamlphp/simplesamlphp/modules/sqlauth'; +if (file_exists($linkPath) === false) { + echo "Linking '$linkPath' to '$projectRoot'\n"; + symlink($projectRoot, $linkPath); +} diff --git a/web/modules/simple_instagram_feed/LICENSE.txt b/web/modules/simple_instagram_feed/LICENSE.txt new file mode 100644 index 0000000000..d159169d10 --- /dev/null +++ b/web/modules/simple_instagram_feed/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/web/modules/simple_instagram_feed/README.txt b/web/modules/simple_instagram_feed/README.txt new file mode 100644 index 0000000000..b1c717fbb3 --- /dev/null +++ b/web/modules/simple_instagram_feed/README.txt @@ -0,0 +1,97 @@ +INTRODUCTION +------------ +Simple Instagram Feed is an integration module for the jquery.instagramFeed +library that can be found at https://github.com/jsanahuja/jquery.instagramFeed. + +BENEFITS +-------- +Unlike many Instagram integrations, this module does not require a complicated +token and authorization sequence to use. Simply add the jquery.instagramFeed +library, install this module and place the block, assign the Instagram account +that you would like to pull the feed from and save. If you want to change the +number of images or any other settings, use the block settings. + + +REQUIREMENTS +------------ +This module requires the jquery.instagramFeed library that can be found at +https://github.com/jsanahuja/jquery.instagramFeed. + +INSTALLATION +------------ + +* Without Composer * +Download the repository for the jquery.instagramFeed library that can be found +at https://github.com/jsanahuja/jquery.instagramFeed . + +Place the file jquery.instagramFeed.min.js in a directory called: +jqueryinstagramfeed + +Install the Simple Instagram Feed Block: + Using DRUSH: drush en simple_instagram_feed + -or- + Download it from https://www.drupal.org/project/simple_instagram_feed and i + nstall it to your website. + +* With Composer * + +To install this module and the jquery.instagramFeed library with composer, +You will need to perform the following four (4) steps: + +1) Edit composer.json to include the jquery.instagramFeed repository. +2) Install the jquery.instagramFeed Library. +3) Install the Simple Instagram Feed module. +4) Enable the Simple Instagram Feed module. + +1) Add the code below to into your project's composer.json, +under "repositories": + +"repositories": [ + { + "type": "package", + "package": { + "name": "jsanahuja/jqueryinstagramfeed", + "version": "dev-master", + "type": "drupal-library", + "dist": { + "url": "https://github.com/jsanahuja/jquery.instagramFeed/archive/master.zip", + "type": "zip" + } + } + } +] + +If the installer path is not set, use: + +"extra": { + "installer-paths": { + "web/libraries/{$name}": ["type:drupal-library"] + } +} + +2) Install the jquery.instagramFeed Library, run: + $ composer require jsanahuja/jqueryinstagramfeed:dev-master + +3) Install the Simple Instagram Feed module, run: + $ composer require 'drupal/simple_instagram_feed + +4) Within the Administration menu in your website, navigate to Extend and +enable the Simple Instagram Feed module. + + +CONFIGURATION +------------- +Once you have installed Simple Instagram Feed Block and placed the +jquery.inatagramFeed library in your libraries directory, navigate to +Structure -> Block Layout (/admin/structure/block) to create a new Simple +Instagram Feed block on your site. By default the block will use the Instagram +account and display 12 images, 6 images per row. You can change the Instagram +user account, number of images and number of images per row settings as well as +displaying the Profile and Bio for the Instagram account. + +KNOWN LIMITATIONS +----------------- +If you would like to have different feeds on different pages, you can create as +many feed blocks as you like. However you can not have more than one feed per +page. This is being worked on and will hopefully be resolved for a future +release. diff --git a/web/modules/simple_instagram_feed/css/simple_instagram_feed.css b/web/modules/simple_instagram_feed/css/simple_instagram_feed.css new file mode 100644 index 0000000000..4df7eea5c4 --- /dev/null +++ b/web/modules/simple_instagram_feed/css/simple_instagram_feed.css @@ -0,0 +1,8 @@ +.instagram-feed { + overflow: hidden; +} + +.instagram-feed .instagram_profile, +.instagram-feed .instagram_gallery { + overflow: hidden; +} diff --git a/web/modules/simple_instagram_feed/js/simple_instagram_feed.js b/web/modules/simple_instagram_feed/js/simple_instagram_feed.js new file mode 100644 index 0000000000..07774271df --- /dev/null +++ b/web/modules/simple_instagram_feed/js/simple_instagram_feed.js @@ -0,0 +1,74 @@ +(function (Drupal, drupalSettings, $) { + 'use strict'; + Drupal.behaviors.simple_instagram_feed = { + attach: function (context, settings) { + // Avoid sending multiple requests to the Instagram. + if (context !== document) { + return; + } + var simple_instagram_feed_array = Object.keys(drupalSettings.simple_instagram_feed).map(function (e) { + return drupalSettings.simple_instagram_feed[e] + }) + + for (var i = 0; i < simple_instagram_feed_array.length; i++) { + var instagram_username = simple_instagram_feed_array[i].instagram_username; + var display_profile = simple_instagram_feed_array[i].display_profile; + var display_biography = simple_instagram_feed_array[i].display_biography; + var items = simple_instagram_feed_array[i].items; + var styling = (simple_instagram_feed_array[i].styling === 'true' ? true : false); + var unique_id = simple_instagram_feed_array[i].unique_id; + + // Verify items per row. + var items_per_row; + if (simple_instagram_feed_array[i].items_per_row_type == 0) { + items_per_row = simple_instagram_feed_array[i].items_per_row_default; + } else { + var screenWidth = $(window).width(); + if (screenWidth < 720) { + items_per_row = simple_instagram_feed_array[i].items_per_row_l_720; + } else if (screenWidth >= 720 && screenWidth < 960) { + items_per_row = simple_instagram_feed_array[i].items_per_row_l_960; + } else { + items_per_row = simple_instagram_feed_array[i].items_per_row_h_960; + } + } + + var feed_settings = { + username: instagram_username, + container: `#${unique_id}`, + display_profile: display_profile, + display_biography: display_biography, + display_gallery: true, + callback: null, + styling: styling, + items: items, + margin: 0.25 + }; + + if (styling) { + feed_settings.items_per_row = items_per_row; + } + + $.instagramFeed(feed_settings, context); + + $(window, context).resize(function () { + screenWidth = $(window).width(); + var width; + for (i = 0; i < simple_instagram_feed_array.length; i++) { + if (simple_instagram_feed_array[i].items_per_row_type == 1) { + if (screenWidth < 720) { + width = (100 - 0.5 * 2 * simple_instagram_feed_array[i].items_per_row_l_720) / simple_instagram_feed_array[i].items_per_row_l_720; + } else if (screenWidth >= 720 && screenWidth < 960) { + width = (100 - 0.5 * 2 * simple_instagram_feed_array[i].items_per_row_l_960) / simple_instagram_feed_array[i].items_per_row_l_960; + } else { + width = (100 - 0.5 * 2 * simple_instagram_feed_array[i].items_per_row_h_960) / simple_instagram_feed_array[i].items_per_row_h_960; + } + var block_id = "block-" + simple_instagram_feed_array[i].block_instance; + $("#" + block_id + " img", context).width(width + "%"); + } + } + }); + } + } + }; +})(Drupal, drupalSettings, jQuery); diff --git a/web/modules/simple_instagram_feed/simple_instagram_feed.info.yml b/web/modules/simple_instagram_feed/simple_instagram_feed.info.yml new file mode 100644 index 0000000000..e4c100ecdd --- /dev/null +++ b/web/modules/simple_instagram_feed/simple_instagram_feed.info.yml @@ -0,0 +1,13 @@ +name: Simple Instagram Feed +description: Creates a block with a dynamic Instagram Feed using https://github.com/jsanahuja/jquery.instagramFeed. +package: Social +type: module +core: 8.x +core_version_requirement: ^8 || ^9 +dependencies: + - drupal:block + +# Information added by Drupal.org packaging script on 2020-09-09 +version: '8.x-3.9' +project: 'simple_instagram_feed' +datestamp: 1599672219 diff --git a/web/modules/simple_instagram_feed/simple_instagram_feed.install b/web/modules/simple_instagram_feed/simple_instagram_feed.install new file mode 100644 index 0000000000..ef6b97882d --- /dev/null +++ b/web/modules/simple_instagram_feed/simple_instagram_feed.install @@ -0,0 +1,45 @@ +<?php + +use Drupal\Core\Installer\InstallerKernel; + +/** + * @file + * Install, update and uninstall for simple instagram feed module. + */ + + /** + * Implements hook_install(). + */ + function simple_instagram_feed_install() { + if (function_exists('drupal_installation_attempted')) { + if (!drupal_installation_attempted()) { + \Drupal::service('simple_instagram_feed.library')->isAvailable(TRUE); + } + } + else { + if (!InstallerKernel::installationAttempted()) { + \Drupal::service('simple_instagram_feed.library')->isAvailable(TRUE); + } + } + } + +/** + * Implements hook_requirements(). + */ +function simple_instagram_feed_requirements($phase) { + if ($phase !== 'runtime') { + return []; + } + + $simpleInstagramFeedLibrary = \Drupal::service('simple_instagram_feed.library'); + $exists = $simpleInstagramFeedLibrary->isAvailable(); + + return [ + 'simple_instagram_feed_library' => [ + 'title' => t('Simple instagram feed library'), + 'description' => $exists ? '' : $simpleInstagramFeedLibrary->getWarningMessage(), + 'severity' => $exists ? REQUIREMENT_OK : REQUIREMENT_ERROR, + 'value' => $exists ? t('Installed') : t('Not installed'), + ], + ]; +} diff --git a/web/modules/simple_instagram_feed/simple_instagram_feed.libraries.yml b/web/modules/simple_instagram_feed/simple_instagram_feed.libraries.yml new file mode 100644 index 0000000000..30609b7d2a --- /dev/null +++ b/web/modules/simple_instagram_feed/simple_instagram_feed.libraries.yml @@ -0,0 +1,13 @@ +simple_instagram_block: + version: 1.x + css: + theme: + css/simple_instagram_feed.css: {} + js: + /libraries/jqueryinstagramfeed/jquery.instagramFeed.min.js: {} + js/simple_instagram_feed.js: {} + dependencies: + - core/drupal + - core/jquery + - core/jquery.once + - core/drupalSettings diff --git a/web/modules/simple_instagram_feed/simple_instagram_feed.module b/web/modules/simple_instagram_feed/simple_instagram_feed.module new file mode 100644 index 0000000000..ba360ff638 --- /dev/null +++ b/web/modules/simple_instagram_feed/simple_instagram_feed.module @@ -0,0 +1,27 @@ +<?php + +/** + * @file + * Drupal Module: Simple Instagram Feed. + * + * Simple Instagram Feed is a module that + * provides blocks to display instagram + * feeds. + * + * author: Andrew Wasson <https://drupal.org/user/127091> + */ + +/** + * Implements hook_theme(). + */ +function simple_instagram_feed_theme($existing, $type, $theme, $path) { + $variables = [ + 'simple_instagram_block' => [ + 'variables' => [ + 'markup' => [], + 'unique_id' => NULL, + ], + ], + ]; + return $variables; +} diff --git a/web/modules/simple_instagram_feed/simple_instagram_feed.services.yml b/web/modules/simple_instagram_feed/simple_instagram_feed.services.yml new file mode 100644 index 0000000000..31ea4511c3 --- /dev/null +++ b/web/modules/simple_instagram_feed/simple_instagram_feed.services.yml @@ -0,0 +1,4 @@ +services: + simple_instagram_feed.library: + class: Drupal\simple_instagram_feed\Services\SimpleInstagramFeedLibrary + arguments: ['@app.root'] diff --git a/web/modules/simple_instagram_feed/src/Plugin/Block/SimpleInstagramBlock.php b/web/modules/simple_instagram_feed/src/Plugin/Block/SimpleInstagramBlock.php new file mode 100644 index 0000000000..bbe3126d94 --- /dev/null +++ b/web/modules/simple_instagram_feed/src/Plugin/Block/SimpleInstagramBlock.php @@ -0,0 +1,265 @@ +<?php + +namespace Drupal\simple_instagram_feed\Plugin\Block; + +use Drupal\Core\Block\BlockBase; +use Drupal\Component\Utility\Html; +use Drupal\Core\Plugin\ContainerFactoryPluginInterface; +use Drupal\Core\Form\FormStateInterface; +use Drupal\simple_instagram_feed\Services\SimpleInstagramFeedLibraryInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** + * Provides a block with a dynamic Instagram Feed. + * + * @Block( + * id = "simple_instagram_block", + * admin_label = @Translation("Simple Instagram Feed"), + * ) + */ +class SimpleInstagramBlock extends BlockBase implements ContainerFactoryPluginInterface { + + /** + * The simple instagram feed library service. + * + * @var \Drupal\simple_instagram_feed\Services\SimpleInstagramFeedLibraryInterface + */ + private $simpleInstagramFeedLibrary; + + /** + * {@inheritDoc} + */ + public function defaultConfiguration() { + return [ + 'items' => 12, + 'styling' => 'true', + 'instagram_username' => 'instagram', + 'display_profile' => true, + 'display_biography' => true, + 'items_per_row_type' => false, + 'items_per_row_default' => 5, + 'items_per_row_l_720' => 5, + 'items_per_row_l_960' => 5, + 'items_per_row_h_960' => 5, + ] + parent::defaultConfiguration(); + } + + /** + * {@inheritdoc} + */ + public function blockForm($form, FormStateInterface $form_state) { + $form = parent::blockForm($form, $form_state); + $config = $this->getConfiguration(); + + $form['simple_instagram_username'] = [ + '#type' => 'textfield', + '#title' => $this->t('Instagram username'), + '#description' => $this->t('Insert the username of the instagram account in the field above.'), + '#default_value' => isset($config['simple_instagram_username']) ? $config['simple_instagram_username'] : 'instagram', + '#required' => TRUE, + ]; + + $form['simple_instagram_display_profile'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Display profile?'), + '#description' => $this->t('Do you wish to display the Instagram profile on this Instagram Feed?'), + '#default_value' => isset($config['simple_instagram_display_profile']) ? $config['simple_instagram_display_profile'] : 'true', + ]; + + $form['simple_instagram_display_biography'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Display bio?'), + '#description' => $this->t('Do you wish to display the Instagram Bio on this Instagram Feed?'), + '#default_value' => isset($config['simple_instagram_display_biography']) ? $config['simple_instagram_display_biography'] : 'true', + ]; + + $form['simple_instagram_items'] = [ + '#type' => 'textfield', + '#size' => 3, + '#maxlength' => 3, + '#title' => $this->t('Number of images'), + '#description' => $this->t('How many images do you wish to feature on this Instagram Feed?'), + '#default_value' => isset($config['simple_instagram_items']) ? $config['simple_instagram_items'] : '12', + '#required' => TRUE, + ]; + + $form['simple_instagram_items_per_row'] = [ + '#type' => 'fieldset', + '#title' => $this->t('Items per row'), + ]; + + $form['simple_instagram_items_per_row']['simple_instagram_items_per_row_type'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Check it if you want to choose how many images to display depends on the window size.'), + '#default_value' => isset($config['simple_instagram_items_per_row_type']) ? $config['simple_instagram_items_per_row_type'] : 0, + '#attributes' => [ + 'id' => 'simple_instagram_items_per_row_type', + ], + ]; + + $simple_items_range = range(1, 12); + $form['simple_instagram_items_per_row']['simple_instagram_items_per_row_default'] = [ + '#type' => 'select', + '#title' => $this->t('Number of images per row for all window size.'), + '#description' => $this->t('How many images do you wish to feature on each row of this Instagram Feed? You can produce a single row if you set the number of images to equal the number of images per row.'), + '#options' => [$simple_items_range], + '#default_value' => isset($config['simple_instagram_items_per_row_default']) ? $config['simple_instagram_items_per_row_default'] : '5', + '#states' => [ + 'visible' => [ + ':input[id="simple_instagram_items_per_row_type"]' => ['checked' => FALSE], + ], + ], + ]; + + $form['simple_instagram_items_per_row']['simple_instagram_items_per_row_l_720'] = [ + '#type' => 'select', + '#title' => $this->t('Number of images per row if window size is <720px.'), + '#description' => $this->t('How many images do you wish on each row if the user window size is lower than 720px.'), + '#options' => [$simple_items_range], + '#default_value' => isset($config['simple_instagram_items_per_row_l_720']) ? $config['simple_instagram_items_per_row_l_720'] : '5', + '#states' => [ + 'visible' => [ + ':input[id="simple_instagram_items_per_row_type"]' => ['checked' => TRUE], + ], + ], + ]; + + $form['simple_instagram_items_per_row']['simple_instagram_items_per_row_l_960'] = [ + '#type' => 'select', + '#title' => $this->t('Number of images per row if window size is >= 720px and < 960.'), + '#description' => $this->t('How many images do you wish on each row if the user window size is lower than 960px and higher than 720px.'), + '#options' => [$simple_items_range], + '#default_value' => isset($config['simple_instagram_items_per_row_l_960']) ? $config['simple_instagram_items_per_row_l_960'] : '5', + '#states' => [ + 'visible' => [ + ':input[id="simple_instagram_items_per_row_type"]' => ['checked' => TRUE], + ], + ], + ]; + + $form['simple_instagram_items_per_row']['simple_instagram_items_per_row_h_960'] = [ + '#type' => 'select', + '#title' => $this->t('Number of images per row if window size is >=960px.'), + '#description' => $this->t('How many images do you wish on each row if the user window size is higher than 960px.'), + '#options' => [$simple_items_range], + '#default_value' => isset($config['simple_instagram_items_per_row_h_960']) ? $config['simple_instagram_items_per_row_h_960'] : '5', + '#states' => [ + 'visible' => [ + ':input[id="simple_instagram_items_per_row_type"]' => ['checked' => TRUE], + ], + ], + ]; + + $form['simple_instagram_styling'] = [ + '#type' => 'select', + '#options' => ['true' => 'True', 'false' => 'False'], + '#title' => $this->t('Styling'), + '#description' => $this->t('Set to False to omit instagramFeed styles and provide your own in your CSS.'), + '#default_value' => isset($config['simple_instagram_styling']) ? $config['simple_instagram_styling'] : 'true', + ]; + + // Add a warning if the js library is not available. + $this->simpleInstagramFeedLibrary->isAvailable(TRUE); + + return $form; + } + + /** + * {@inheritdoc} + */ + public function blockSubmit($form, FormStateInterface $form_state) { + parent::blockSubmit($form, $form_state); + $values = $form_state->getValues(); + $this->configuration['simple_instagram_username'] = $values['simple_instagram_username']; + $this->configuration['simple_instagram_display_profile'] = $values['simple_instagram_display_profile']; + $this->configuration['simple_instagram_display_biography'] = $values['simple_instagram_display_biography']; + $this->configuration['simple_instagram_items'] = $values['simple_instagram_items']; + $this->configuration['simple_instagram_items_per_row_type'] = $values['simple_instagram_items_per_row']['simple_instagram_items_per_row_type']; + $this->configuration['simple_instagram_items_per_row_default'] = $values['simple_instagram_items_per_row']['simple_instagram_items_per_row_default']; + $this->configuration['simple_instagram_items_per_row_l_720'] = $values['simple_instagram_items_per_row']['simple_instagram_items_per_row_l_720']; + $this->configuration['simple_instagram_items_per_row_l_960'] = $values['simple_instagram_items_per_row']['simple_instagram_items_per_row_l_960']; + $this->configuration['simple_instagram_items_per_row_h_960'] = $values['simple_instagram_items_per_row']['simple_instagram_items_per_row_h_960']; + $this->configuration['simple_instagram_styling'] = $values['simple_instagram_styling']; + } + + /** + * {@inheritdoc} + */ + public function build() { + if (!$this->simpleInstagramFeedLibrary->isAvailable()) { + return []; + } + $unique_id = Html::getUniqueId($this->getPluginId()); + + $build = [ + '#unique_id' => $unique_id, + '#theme' => 'simple_instagram_block', + '#markup' => $this->t('Simple Instagram Feed'), + '#attached' => [ + 'library' => ['simple_instagram_feed/simple_instagram_block'], + 'drupalSettings' => [] + ], + '#cache' => [ + 'max-age' => 3600, + ], + ]; + $build['#attached']['drupalSettings']['simple_instagram_feed'][$unique_id] = $this->buildAttachedSettings(); + $build['#attached']['drupalSettings']['simple_instagram_feed'][$unique_id]['unique_id'] = $unique_id; + + return $build; + } + + /** + * Build instagram attached settings. + * + * @return array + * An array of the formatted settings. + */ + protected function buildAttachedSettings() { + $config = $this->getConfiguration(); + + return [ + 'items' => $config['simple_instagram_items'], + 'styling' => $config['simple_instagram_styling'], + 'instagram_username' => $config['simple_instagram_username'], + 'display_profile' => $config['simple_instagram_display_profile'], + 'display_biography' => $config['simple_instagram_display_biography'], + 'items_per_row_type' => $config['simple_instagram_items_per_row_type'], + 'items_per_row_default' => $config['simple_instagram_items_per_row_default'] + 1, + 'items_per_row_l_720' => $config['simple_instagram_items_per_row_l_720'] + 1, + 'items_per_row_l_960' => $config['simple_instagram_items_per_row_l_960'] + 1, + 'items_per_row_h_960' => $config['simple_instagram_items_per_row_h_960'] + 1, + ]; + } + + /** + * {@inheritdoc} + */ + public function __construct( + array $configuration, + $plugin_id, + $plugin_definition, + SimpleInstagramFeedLibraryInterface $simple_instagram_feed_library + ) { + parent::__construct($configuration, $plugin_id, $plugin_definition); + $this->simpleInstagramFeedLibrary = $simple_instagram_feed_library; + } + + /** + * {@inheritdoc} + */ + public static function create( + ContainerInterface $container, + array $configuration, + $plugin_id, + $plugin_definition + ) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('simple_instagram_feed.library') + ); + } + +} diff --git a/web/modules/simple_instagram_feed/src/Services/SimpleInstagramFeedLibrary.php b/web/modules/simple_instagram_feed/src/Services/SimpleInstagramFeedLibrary.php new file mode 100644 index 0000000000..87be416df9 --- /dev/null +++ b/web/modules/simple_instagram_feed/src/Services/SimpleInstagramFeedLibrary.php @@ -0,0 +1,68 @@ +<?php + +namespace Drupal\simple_instagram_feed\Services; + +use Drupal\Core\Messenger\MessengerTrait; +use Drupal\Core\StringTranslation\StringTranslationTrait; + +/** + * Implements Simple Instagram Feed Library service. + */ +class SimpleInstagramFeedLibrary implements SimpleInstagramFeedLibraryInterface { + use MessengerTrait; + use StringTranslationTrait; + + /** + * The drupal root path. + * + * @var string + */ + private $root; + + /** + * {@inheritdoc} + */ + public function isAvailable(bool $warning = FALSE) { + if (!file_exists($this->root . $this->getPath())) { + if ($warning) { + $this->messenger()->addWarning($this->getWarningMessage()); + } + + return FALSE; + } + + return TRUE; + } + + /** + * {@inheritdoc} + */ + public function getWarningMessage() { + return $this->t('Missing library: The <a href=":url">jquery.instagramFeed</a> library should be installed at <strong>:path</strong>.', [ + ':url' => 'https://github.com/jsanahuja/jquery.instagramFeed', + ':path' => $this->getPath(), + ]); + } + + /** + * Returns the expected js library path. + */ + private function getPath() { + return '/libraries/jqueryinstagramfeed/jquery.instagramFeed.min.js'; + } + + /** + * {@inheritdoc} + */ + public function __construct($root) { + $this->root = $root; + } + + /** + * {@inheritdoc} + */ + public function create(ContainerInterface $container) { + return new static($container->get('app.root')); + } + +} diff --git a/web/modules/simple_instagram_feed/src/Services/SimpleInstagramFeedLibraryInterface.php b/web/modules/simple_instagram_feed/src/Services/SimpleInstagramFeedLibraryInterface.php new file mode 100644 index 0000000000..bad5de6019 --- /dev/null +++ b/web/modules/simple_instagram_feed/src/Services/SimpleInstagramFeedLibraryInterface.php @@ -0,0 +1,27 @@ +<?php + +namespace Drupal\simple_instagram_feed\Services; + +/** + * Defines Simple Instagram Feed Library interface. + */ +interface SimpleInstagramFeedLibraryInterface { + + /** + * Check library avalilability. + * + * @param bool $warning + * Add a warning message if library is not available. + * + * @return bool + */ + public function isAvailable(bool $warning = FALSE); + + /** + * Get the warning message. + * + * @return \Drupal\Core\StringTranslation\TranslatableMarkup + */ + public function getWarningMessage(); + +} diff --git a/web/modules/simple_instagram_feed/templates/simple-instagram-block.html.twig b/web/modules/simple_instagram_feed/templates/simple-instagram-block.html.twig new file mode 100644 index 0000000000..26d40ba97f --- /dev/null +++ b/web/modules/simple_instagram_feed/templates/simple-instagram-block.html.twig @@ -0,0 +1 @@ +<div id="{{ unique_id }}" class="instagram-feed"></div> diff --git a/web/modules/simple_instagram_feed/tests/src/Functional/SimpleInstagramFeedTest.php b/web/modules/simple_instagram_feed/tests/src/Functional/SimpleInstagramFeedTest.php new file mode 100644 index 0000000000..1a947e9a10 --- /dev/null +++ b/web/modules/simple_instagram_feed/tests/src/Functional/SimpleInstagramFeedTest.php @@ -0,0 +1,62 @@ +<?php + +namespace Drupal\Tests\simple_instagram_feed\Functional; + +use Drupal\Tests\BrowserTestBase; + +/** + * Provides a class for Simple Instagram Feed functional tests. + * + * @group block + */ +class SimpleInstagramFeedTest extends BrowserTestBase { + + /** + * {@inheritdoc} + */ + public static $modules = ['simple_instagram_feed']; + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stable'; + + /** + * Admin users with all permissions. + * + * @var \Drupal\user\UserInterface + */ + protected $adminUser; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + // Create admin user. + $this->adminUser = $this->drupalCreateUser([ + 'view the administration theme', + 'access administration pages', + 'administer blocks', + ]); + } + + /** + * Tests Simple Instagram Feed block. + */ + public function testsSimpleInstagramFeedBlock() { + $this->drupalLogin($this->adminUser); + + // Block is listed in site block library. + $this->drupalGet('admin/structure/block/library/stable'); + $this->assertSession()->statusCodeEquals(200); + $this->assertSession()->responseContains('Simple Instagram Feed'); + + // Add block form is avialable. + $theme = \Drupal::service('theme_handler')->getDefault(); + $this->drupalGet("admin/structure/block/add/simple_instagram_block/$theme"); + $this->assertSession()->statusCodeEquals(200); + } + +} -- GitLab