diff --git a/Procfile b/Procfile
new file mode 100644
index 0000000000..80269037c6
--- /dev/null
+++ b/Procfile
@@ -0,0 +1 @@
+web: php heroku/startup.php && heroku-php-apache2 public/
\ No newline at end of file
diff --git a/README.md b/README.md
index 04388b8312..d27efb4f81 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,8 @@ For instructions on installing and configuring Snipe-IT on your server, check ou
If you're having trouble with the installation, please check the [Common Issues](https://snipe-it.readme.io/docs/common-issues) and [Getting Help](https://snipe-it.readme.io/docs/getting-help) documentation, and search this repository's open *and* closed issues for help.
+[](https://heroku.com/deploy)
+
-----
### User's Manual
For help using Snipe-IT, check out the [user's manual](https://snipe-it.readme.io/docs/overview).
diff --git a/app.json b/app.json
new file mode 100644
index 0000000000..c2cdd7b9e0
--- /dev/null
+++ b/app.json
@@ -0,0 +1,154 @@
+{
+ "name": "Snipe-IT",
+ "description": "Open source asset management.",
+ "keywords": [
+ "asset management",
+ "it asset"
+ ],
+ "website": "https://snipeitapp.com/",
+ "repository": "https://github.com/snipe/snipe-it",
+ "logo": "https://pbs.twimg.com/profile_images/976748875733020672/K-HnZCCK_400x400.jpg",
+ "success_url": "/setup",
+ "env": {
+ "APP_ENV": {
+ "description": "Laravel environment mode. Unless developing the application, this should be production.",
+ "value": "production"
+ },
+ "APP_DEBUG": {
+ "description": "Laravel debug mode. Unless developing the application or actively debugging a problem, this should be set to false.",
+ "value": "false"
+ },
+ "APP_KEY": {
+ "description": "A secret key for verifying the integrity of signed cookies. (See either https://snipe-it.readme.io/docs/generate-your-app-key or generate at https://coderstoolbox.online/toolbox/generate-symfony-secret)",
+ "value": ""
+ },
+ "APP_URL": {
+ "description": "URL where your Snipe-IT install will be available at.",
+ "value": "https://your-app-name.herokuapp.com"
+ },
+ "APP_TIMEZONE": {
+ "description": "Which timezone do you want to use for your install? (http://php.net/manual/en/timezones.php)",
+ "value": "UTC"
+ },
+ "APP_LOCALE": {
+ "description": "Which language do you want to use for your install? (https://snipe-it.readme.io/docs/configuration#setting-a-language)",
+ "value": "en"
+ },
+ "MAX_RESULTS": {
+ "description": "The maximum number of search results that can be returned at one time.",
+ "value": "500"
+ },
+ "MAIL_DRIVER": {
+ "description": "Mail driver - Generally SMTP on Heroku - https://snipe-it.readme.io/docs/configuration#required-outgoing-mail-settings",
+ "value": "smtp"
+ },
+ "MAIL_HOST": {
+ "description": "SMTP Server Hostname",
+ "value": "smtp.your.domain.name"
+ },
+ "MAIL_PORT": {
+ "description": "SMTP Server Port",
+ "value": "25"
+ },
+ "MAIL_USERNAME": {
+ "description": "SMTP Server Username",
+ "value": "YOURUSERNAME"
+ },
+ "MAIL_PASSWORD": {
+ "description": "SMTP Server Password",
+ "value": "YOURPASSWORD"
+ },
+ "MAIL_ENCRYPTION": {
+ "description": "Encryption protocol for email sending.",
+ "value": "null"
+ },
+ "MAIL_FROM_ADDR": {
+ "description": "Email from address",
+ "value": "no-reply@domain.name"
+ },
+ "MAIL_FROM_NAME": {
+ "description": "Email from Name",
+ "value": "Snipe-IT"
+ },
+ "MAIL_REPLYTO_ADDR": {
+ "description": "Email Reply-To address",
+ "value": "your@domain.name"
+ },
+ "MAIL_REPLYTO_NAME": {
+ "description": "Email Reply-To Name",
+ "value": "Snipe-IT"
+ },
+ "MAIL_AUTO_EMBED": {
+ "description": "Whether or not to embed images in emails (via CID or base64) versus linking to them.",
+ "value": "true"
+ },
+ "MAIL_AUTO_EMBED_METHOD": {
+ "description": "Method that should be used for attaching inline images.",
+ "value": "base64"
+ },
+ "SESSION_LIFETIME": {
+ "description": "Specify the time in minutes that the session should remain valid.",
+ "value": "12000"
+ },
+ "EXPIRE_ON_CLOSE": {
+ "description": "Specify whether or not the logged in session should be expired when the user closes their browser window.",
+ "value": "false"
+ },
+ "ENCRYPT": {
+ "description": "Specify whether you wish to use encrypted cookies for your Snipe-IT sessions.",
+ "value": "true"
+ },
+ "COOKIE_NAME": {
+ "description": "The name of the cookie set by Snipe-IT for session management.",
+ "value": "snipeit_session"
+ },
+ "COOKIE_DOMAIN": {
+ "description": "The domain name that the session cookie should be sent for.",
+ "value": "your-app-name.herokuapp.com"
+ },
+ "SECURE_COOKIES": {
+ "description": "Should cookies only be sent for HTTPS connections? Generally true on Heroku.",
+ "value": "true"
+ },
+ "LOGIN_MAX_ATTEMPTS": {
+ "description": "The maximum number of failed attempts allowed before the user is throttled.",
+ "value": "5"
+ },
+ "LOGIN_LOCKOUT_DURATION": {
+ "description": "The duration (in seconds) that the user should be blocked from attempting to authenticate again.",
+ "value": "60"
+ },
+ "APP_LOG": {
+ "description": "Driver to send logs to. (errorlog for stderr)",
+ "value": "errorlog"
+ },
+ "ALLOW_IFRAMING": {
+ "description": "Allow Snipe-IT to be loaded using an iFrame?",
+ "value": "false"
+ },
+ "GOOGLE_MAPS_API": {
+ "description": "Include your Google Maps API key here if you'd like Snipe-IT to load maps from Google on your locations and suppliers pages.",
+ "required": false
+ },
+ "BACKUP_ENV": {
+ "description": "Set this to true if you wish to backup your .env file in your Admin > Backups process.",
+ "value": "true"
+ },
+ "ENABLE_HSTS": {
+ "description": "Whether or not to send the HSTS security policy header.",
+ "value": "false"
+ }
+ },
+ "formation": {
+ "web": {
+ "quantity": 1,
+ "size": "free"
+ }
+ },
+ "image": "heroku/php",
+ "addons": [
+ "cleardb:ignite",
+ "heroku-redis:hobby-dev",
+ "papertrail:choklad"
+ ]
+ }
\ No newline at end of file
diff --git a/app/Http/Transformers/CategoriesTransformer.php b/app/Http/Transformers/CategoriesTransformer.php
index a07d8b345c..0ecdb923d6 100644
--- a/app/Http/Transformers/CategoriesTransformer.php
+++ b/app/Http/Transformers/CategoriesTransformer.php
@@ -29,6 +29,7 @@ class CategoriesTransformer
'image' => ($category->image) ? Storage::disk('public')->url('categories/'.e($category->image)) : null,
'category_type' => ucwords(e($category->category_type)),
'has_eula' => ($category->getEula() ? true : false),
+ 'use_default_eula' => ($category->use_default_eula=='1' ? true : false),
'eula' => ($category->getEula()),
'checkin_email' => ($category->checkin_email =='1'),
'require_acceptance' => ($category->require_acceptance == '1'),
diff --git a/app/Presenters/CategoryPresenter.php b/app/Presenters/CategoryPresenter.php
index 19507e2771..0b87b13e02 100644
--- a/app/Presenters/CategoryPresenter.php
+++ b/app/Presenters/CategoryPresenter.php
@@ -56,6 +56,13 @@ class CategoryPresenter extends Presenter
"title" => trans('admin/categories/table.eula_text'),
"visible" => false,
"formatter" => 'trueFalseFormatter',
+ ],[
+ "field" => "use_default_eula",
+ "searchable" => false,
+ "sortable" => true,
+ "title" => trans('admin/categories/general.use_default_eula_column'),
+ "visible" => false,
+ "formatter" => 'trueFalseFormatter',
],[
"field" => "checkin_email",
"searchable" => false,
diff --git a/heroku/startup.php b/heroku/startup.php
new file mode 100644
index 0000000000..15a2c0b4d6
--- /dev/null
+++ b/heroku/startup.php
@@ -0,0 +1,51 @@
+ values are set, ignore parser.
+if (getenv("DB_DATABASE") || getenv("DB_HOST") || getenv("DB_USERNAME")) {
+ echo "Database Environment variables are manually set. Ignoring add-ins.";
+} else if (getenv("CLEARDB_DATABASE_URL")) { // ClearDB Add-in
+ echo "Using ClearDB Heroku add-in." . PHP_EOL;
+ set_db(getenv('CLEARDB_DATABASE_URL'));
+} else if (getenv("JAWSDB_MARIA_URL")) { // JawsDB Maria Add-in
+ echo "Using JawsDB Maria Heroku add-in." . PHP_EOL;
+ set_db(getenv("JAWSDB_MARIA_URL"));
+} else if (getenv("JAWSDB_MYSQL_URL")) { // JawsDB MySQL Add-in
+ echo "Using JawsDB MySQL Heroku add-in." . PHP_EOL;
+ set_db(getenv("JAWSDB_MYSQL_URL"));
+}
+
+function set_db($uri) {
+ file_put_contents('./.env', 'DB_HOST=' . parse_url($uri, PHP_URL_HOST). PHP_EOL, FILE_APPEND);
+ file_put_contents('./.env', 'DB_USERNAME=' . parse_url($uri, PHP_URL_USER). PHP_EOL, FILE_APPEND);
+ file_put_contents('./.env', 'DB_PASSWORD=' . parse_url($uri, PHP_URL_PASS). PHP_EOL, FILE_APPEND);
+ file_put_contents('./.env', 'DB_DATABASE=' . ltrim(parse_url($uri, PHP_URL_PATH), '/'). PHP_EOL, FILE_APPEND);
+ file_put_contents('./.env', 'DB_PREFIX=' . 'null' . PHP_EOL, FILE_APPEND);
+ file_put_contents('./.env', 'DB_DUMP_PATH=' . 'null' . PHP_EOL, FILE_APPEND);
+
+}
+
+// If Heroku Redis is setup, let's get it working.
+if (getenv("REDIS_URL")) { // Heroku Redis
+ echo "Setting up Heroku Redis." . PHP_EOL;
+ $url = getenv("REDIS_URL");
+ file_put_contents('./.env', 'REDIS_HOST=' . parse_url($url, PHP_URL_HOST). PHP_EOL, FILE_APPEND);
+ file_put_contents('./.env', 'REDIS_PASSWORD=' . parse_url($url, PHP_URL_PASS). PHP_EOL, FILE_APPEND);
+ file_put_contents('./.env', 'REDIS_PORT=' . parse_url($url, PHP_URL_PORT). PHP_EOL, FILE_APPEND);
+}
+
+// Set up APP_TRUSTED_PROXIES to allow for the Heroku Router
+// https://devcenter.heroku.com/articles/deploying-symfony4#trusting-the-heroku-router
+file_put_contents('./.env', 'APP_TRUSTED_PROXIES=10.0.0.0/8' . PHP_EOL, FILE_APPEND);
+
+// Set up GD
+file_put_contents('./.env', 'IMAGE_LIB=gd' . PHP_EOL, FILE_APPEND);
+
+// Set local FILESYSTEM_DISK and PUBLIC_FILESYSTEM_DISK
+file_put_contents('./.env', 'FILESYSTEM_DISK=local' . PHP_EOL, FILE_APPEND);
+file_put_contents('./.env', 'PUBLIC_FILESYSTEM_DISK=local_public' . PHP_EOL, FILE_APPEND);
+
+// Set APP_CIPHER
+file_put_contents('./.env', 'APP_CIPHER=AES-256-CBC' . PHP_EOL, FILE_APPEND);
+
+?>
diff --git a/resources/lang/en/admin/categories/general.php b/resources/lang/en/admin/categories/general.php
index 7741b7da62..c8385018d8 100644
--- a/resources/lang/en/admin/categories/general.php
+++ b/resources/lang/en/admin/categories/general.php
@@ -17,6 +17,7 @@ return array(
'no_default_eula' => 'No primary default EULA found. Add one in Settings.',
'update' => 'Update Category',
'use_default_eula' => 'Use the primary default EULA instead.',
+ 'use_default_eula_column' => 'Use default EULA',
'use_default_eula_disabled' => 'Use the primary default EULA instead. No primary default EULA is set. Please add one in Settings.',
);