├── database ├── migrations │ ├── .gitkeep │ └── 2021_06_09_220116_create_secrets_table.php ├── seeders │ └── DatabaseSeeder.php └── factories │ └── UserFactory.php ├── resources ├── views │ ├── .gitkeep │ ├── includes │ │ └── head.blade.php │ ├── errors │ │ └── 404.blade.php │ ├── layouts │ │ └── default.blade.php │ ├── home.blade.php │ ├── secret-show.blade.php │ └── secret-new.blade.php ├── js │ └── app.js └── css │ └── app.css ├── app ├── Console │ ├── Commands │ │ └── .gitkeep │ └── Kernel.php ├── Events │ ├── Event.php │ └── ExampleEvent.php ├── Http │ ├── Controllers │ │ ├── Controller.php │ │ ├── ExampleController.php │ │ └── SecretController.php │ └── Middleware │ │ ├── ExampleMiddleware.php │ │ └── Authenticate.php ├── Providers │ ├── AppServiceProvider.php │ ├── EventServiceProvider.php │ └── AuthServiceProvider.php ├── Jobs │ ├── ExampleJob.php │ └── Job.php ├── Models │ ├── Secret.php │ └── User.php ├── Listeners │ └── ExampleListener.php ├── Traits │ └── Uuids.php └── Exceptions │ └── Handler.php ├── storage ├── app │ └── .gitignore ├── logs │ └── .gitignore └── framework │ ├── views │ └── .gitignore │ └── cache │ ├── data │ └── .gitignore │ └── .gitignore ├── screenshot.png ├── .styleci.yml ├── public ├── images │ └── cliparts │ │ ├── 1.jpg │ │ ├── 2.jpg │ │ ├── 3.jpg │ │ ├── 4.jpg │ │ ├── 5.jpg │ │ ├── 6.jpg │ │ ├── 7.jpg │ │ ├── 8.jpg │ │ ├── 9.jpg │ │ ├── 10.jpg │ │ ├── 11.jpg │ │ ├── 12.jpg │ │ ├── 13.jpg │ │ ├── 14.jpg │ │ ├── 15.jpg │ │ └── 16.jpg ├── mix-manifest.json ├── dist │ └── app.css ├── main.js ├── js │ └── app.js.LICENSE.txt ├── .htaccess ├── index.php └── css │ └── app.css ├── .htaccess ├── .gitignore ├── .editorconfig ├── .env.example ├── tailwind.config.js ├── tests ├── TestCase.php └── ExampleTest.php ├── webpack.mix.js ├── phpunit.xml ├── routes └── web.php ├── composer.json ├── package.json ├── artisan ├── README.md ├── bootstrap └── app.php └── LICENSE.md /database/migrations/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/Console/Commands/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/screenshot.png -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | php: 2 | preset: laravel 3 | disabled: 4 | - unused_use 5 | js: true 6 | css: true 7 | -------------------------------------------------------------------------------- /public/images/cliparts/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/1.jpg -------------------------------------------------------------------------------- /public/images/cliparts/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/2.jpg -------------------------------------------------------------------------------- /public/images/cliparts/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/3.jpg -------------------------------------------------------------------------------- /public/images/cliparts/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/4.jpg -------------------------------------------------------------------------------- /public/images/cliparts/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/5.jpg -------------------------------------------------------------------------------- /public/images/cliparts/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/6.jpg -------------------------------------------------------------------------------- /public/images/cliparts/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/7.jpg -------------------------------------------------------------------------------- /public/images/cliparts/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/8.jpg -------------------------------------------------------------------------------- /public/images/cliparts/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/9.jpg -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | 2 | RewriteEngine On 3 | RewriteRule ^(.*)$ public/$1 [L] 4 | 5 | -------------------------------------------------------------------------------- /public/images/cliparts/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/10.jpg -------------------------------------------------------------------------------- /public/images/cliparts/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/11.jpg -------------------------------------------------------------------------------- /public/images/cliparts/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/12.jpg -------------------------------------------------------------------------------- /public/images/cliparts/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/13.jpg -------------------------------------------------------------------------------- /public/images/cliparts/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/14.jpg -------------------------------------------------------------------------------- /public/images/cliparts/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/15.jpg -------------------------------------------------------------------------------- /public/images/cliparts/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alancwoo/secret/HEAD/public/images/cliparts/16.jpg -------------------------------------------------------------------------------- /public/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/js/app.js": "/js/app.js", 3 | "/css/app.css": "/css/app.css" 4 | } 5 | -------------------------------------------------------------------------------- /public/dist/app.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: red; 3 | } 4 | 5 | .message { 6 | opacity: 0.5 !important; 7 | } 8 | 9 | -------------------------------------------------------------------------------- /public/main.js: -------------------------------------------------------------------------------- 1 | /******/ (() => { // webpackBootstrap 2 | /******/ "use strict"; 3 | /******/ 4 | /******/ 5 | /******/ })() 6 | ; -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | window.b64 = require('base64-arraybuffer') 2 | window.sanitizeHtml = require('sanitize-html') 3 | import 'alpinejs' 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | /.idea 3 | Homestead.json 4 | Homestead.yaml 5 | .env 6 | .phpunit.result.cache 7 | /database/database.sqlite 8 | node_modules 9 | .DS_Store 10 | *.sh 11 | -------------------------------------------------------------------------------- /app/Events/Event.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 🔒 {{ $title ? $title : '' }} 7 | -------------------------------------------------------------------------------- /app/Http/Controllers/ExampleController.php: -------------------------------------------------------------------------------- 1 | 'Not Found']) 2 | 3 | @section('content') 4 |
5 |
The message does not exist, expired, or the key is incorrect. Please try again.
6 | 7 |
8 | @stop 9 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | call('UsersTableSeeder'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: [], 3 | darkMode: false, // or 'media' or 'class' 4 | theme: { 5 | extend: {}, 6 | }, 7 | variants: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | purge: [ 12 | './storage/framework/views/*.php', 13 | './resources/**/*.blade.php', 14 | './resources/**/*.js', 15 | './resources/**/*.vue', 16 | ], 17 | } 18 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | 5 | * @license MIT 6 | */ 7 | 8 | /*! 9 | * is-plain-object 10 | * 11 | * Copyright (c) 2014-2017, Jon Schlinkert. 12 | * Released under the MIT License. 13 | */ 14 | 15 | /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ 16 | -------------------------------------------------------------------------------- /resources/views/layouts/default.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @include('includes.head', ['title' => $title]) 5 | @stack('head') 6 | 7 | 8 |
9 |
10 | @yield('content') 11 |
12 |
13 | 14 | π 15 | 16 | @yield('footer') 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /tests/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 16 | 17 | $this->assertEquals( 18 | $this->app->version(), $this->response->getContent() 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Providers/EventServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 16 | \App\Listeners\ExampleListener::class, 17 | ], 18 | ]; 19 | } 20 | -------------------------------------------------------------------------------- /app/Models/Secret.php: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | ./tests 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->name, 26 | 'email' => $this->faker->unique()->safeEmail, 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /resources/views/home.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.default', ['title' => '']) 2 | 3 | @section('content') 4 |
 5 |           __ __
 6 |         ,;::\::\
 7 |       ,'/' `/'`/
 8 |   _\,: '.,-'.-':.
 9 |  -./"'  :    :  :\/,     - SHHHH
10 |   ::.  ,:____;__; :-
11 |   :"  ( .`-*'o*',);
12 |    \.. ` `---'`' /
13 |     `:._..-   _.'
14 |     ,;  .     `.
15 |    /"'| |       \
16 |   ::. ) :        :
17 |   |" (   \       |
18 |   :.(_,  :       ;
19 |    \'`-'_/      /
20 |     `...   , _,'
21 |      |,|  : |
22 |      |`|  | |
23 |      |,|  | |
24 |  ,--.;`|  | '..--.
25 | /;' "' ;  '..--. ))
26 | \:.___(___   ) ))'
27 |           `-'-''
28 | 
29 | 30 | @stop 31 | -------------------------------------------------------------------------------- /app/Jobs/Job.php: -------------------------------------------------------------------------------- 1 | get('/', function () { 18 | return view('secret-new'); 19 | }); 20 | 21 | $router->post('secret', [ 22 | 'uses' => 'SecretController@create' 23 | ]); 24 | 25 | $router->get('{id}', [ 26 | 'uses' => 'SecretController@show' 27 | ]); 28 | 29 | $router->delete('{id}', [ 30 | 'uses' => 'SecretController@delete' 31 | ]); 32 | -------------------------------------------------------------------------------- /app/Traits/Uuids.php: -------------------------------------------------------------------------------- 1 | {$model->getKeyName()})) { 14 | $model->{$model->getKeyName()} = Str::uuid()->toString(); 15 | } 16 | }); 17 | } /** 18 | * Get the value indicating whether the IDs are incrementing. 19 | * 20 | * @return bool 21 | */ 22 | public function getIncrementing() 23 | { 24 | return false; 25 | } /** 26 | * Get the auto-incrementing key type. 27 | * 28 | * @return string 29 | */ 30 | public function getKeyType() 31 | { 32 | return 'string'; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2021_06_09_220116_create_secrets_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 18 | $table->timestamps(); 19 | $table->string('content'); 20 | $table->string('iv'); 21 | $table->date('expires'); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | * 28 | * @return void 29 | */ 30 | public function down() 31 | { 32 | Schema::dropIfExists('secrets'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/Models/User.php: -------------------------------------------------------------------------------- 1 | run(); 29 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | auth = $auth; 26 | } 27 | 28 | /** 29 | * Handle an incoming request. 30 | * 31 | * @param \Illuminate\Http\Request $request 32 | * @param \Closure $next 33 | * @param string|null $guard 34 | * @return mixed 35 | */ 36 | public function handle($request, Closure $next, $guard = null) 37 | { 38 | if ($this->auth->guard($guard)->guest()) { 39 | return response('Unauthorized.', 401); 40 | } 41 | 42 | return $next($request); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/lumen", 3 | "description": "The Laravel Lumen Framework.", 4 | "keywords": ["framework", "laravel", "lumen"], 5 | "license": "MIT", 6 | "type": "project", 7 | "require": { 8 | "php": "^7.3|^8.0", 9 | "laravel/lumen-framework": "^8.0" 10 | }, 11 | "require-dev": { 12 | "fakerphp/faker": "^1.9.1", 13 | "mockery/mockery": "^1.3.1", 14 | "phpunit/phpunit": "^9.3" 15 | }, 16 | "autoload": { 17 | "psr-4": { 18 | "App\\": "app/", 19 | "Database\\Factories\\": "database/factories/", 20 | "Database\\Seeders\\": "database/seeders/" 21 | } 22 | }, 23 | "autoload-dev": { 24 | "classmap": [ 25 | "tests/" 26 | ] 27 | }, 28 | "config": { 29 | "preferred-install": "dist", 30 | "sort-packages": true, 31 | "optimize-autoloader": true 32 | }, 33 | "minimum-stability": "dev", 34 | "prefer-stable": true, 35 | "scripts": { 36 | "post-root-package-install": [ 37 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Providers/AuthServiceProvider.php: -------------------------------------------------------------------------------- 1 | app['auth']->viaRequest('api', function ($request) { 34 | if ($request->input('api_token')) { 35 | return User::where('api_token', $request->input('api_token'))->first(); 36 | } 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "secret", 3 | "version": "1.0.0", 4 | "description": "[![Build Status](https://travis-ci.org/laravel/lumen-framework.svg)](https://travis-ci.org/laravel/lumen-framework) [![Total Downloads](https://img.shields.io/packagist/dt/laravel/framework)](https://packagist.org/packages/laravel/lumen-framework) [![Latest Stable Version](https://img.shields.io/packagist/v/laravel/framework)](https://packagist.org/packages/laravel/lumen-framework) [![License](https://img.shields.io/packagist/l/laravel/framework)](https://packagist.org/packages/laravel/lumen-framework)", 5 | "main": "index.js", 6 | "directories": { 7 | "test": "tests" 8 | }, 9 | "scripts": { 10 | "test": "echo \"Error: no test specified\" && exit 1" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "devDependencies": { 16 | "alpinejs": "^2.8.2", 17 | "base64-arraybuffer": "^0.2.0", 18 | "browser-sync": "^2.26.14", 19 | "browser-sync-webpack-plugin": "^2.3.0", 20 | "laravel-mix": "^6.0.19", 21 | "laravel-mix-purgecss": "^6.0.0", 22 | "postcss": "^8.3.0", 23 | "tailwindcss": "^2.1.4" 24 | }, 25 | "dependencies": { 26 | "sanitize-html": "^2.4.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make( 32 | 'Illuminate\Contracts\Console\Kernel' 33 | ); 34 | 35 | exit($kernel->handle(new ArgvInput, new ConsoleOutput)); 36 | -------------------------------------------------------------------------------- /app/Http/Controllers/SecretController.php: -------------------------------------------------------------------------------- 1 | expires); 18 | 19 | if (time() > $expires) { 20 | // Delete expired message 21 | $secret->delete(); 22 | return response(view("errors.404"), 404); 23 | } else { 24 | // Return message contents 25 | return view('secret-show', [ 26 | 'id' => $secret->id, 27 | 'content' => $secret->content, 28 | 'iv' => $secret->iv 29 | ]); 30 | } 31 | 32 | } 33 | 34 | public function create(Request $request) 35 | { 36 | $data = $request->json()->all(); 37 | $pass = $data['password']; 38 | 39 | // Check password 40 | if (env('NEW_ITEM_PASSWORD') === '' || $pass === env('NEW_ITEM_PASSWORD')) { 41 | 42 | // Set expiry 43 | $now = new \DateTime(); 44 | $expiry = $now->add(new \DateInterval("P{$data['expires']}")); 45 | 46 | // Create and store secret 47 | $secret = new Secret; 48 | $secret->content = $data['content']; 49 | $secret->iv = $data['iv']; 50 | $secret->expires = $expiry; 51 | $secret->save(); 52 | 53 | return response()->json([ 54 | 'id' => $secret->id 55 | ], 201); 56 | 57 | 58 | } else { 59 | return response()->json([ 60 | 'error' => "Password Incorrect" 61 | ], 401); 62 | } 63 | } 64 | 65 | public function delete($id) 66 | { 67 | Secret::findOrFail($id)->delete(); 68 | return response('Deleted Successfully', 200); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | 'Secret']) 2 | 3 | @section('content') 4 |
5 | 11 | 17 |
18 | @stop 19 | 20 | @section('footer') 21 | 84 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🔒 Secret 2 | A simple php ([lumen](https://lumen.laravel.com)) app for sharing sensitive text (basically like [onetimesecret](https://onetimesecret.com)), but with full end-to-end AES-256-GCM encryption so even the server has no access to the data, and developed with very simple deployment in mind. 3 | 4 | ![Screenshot](screenshot.png) 5 | 6 | ## What is it for 7 | I often need to send credentials or sensitive information to clients and colleagues and really prefer not to send these things over email/chat where they remain forever prone to breaches and also attached to a context in email threads (eg, it is clear such data is connected to a site/identity/account). 8 | 9 | It is even better to send the URL and the KEY separately through different channels and instruct the user to recombine them in the address bar. 10 | 11 | **Coming soon:** support for binaries/file uploads. 12 | 13 | ## Requirements 14 | - Requires PHP7.x (Lumen does not seem to support PHP8 yet) 15 | - [Must be hosted/served over https with a proper certificate](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto) 16 | 17 | ## Install 18 | - Clone the repo 19 | - Copy `.env.example` to `.env` 20 | - Configure `APP_URL` with the url, `APP_KEY` with a random string, `NEW_ITEM_PASSWORD` with a password for the creation of new items. (Highly recommended, see [Why set a password](#why-set-a-password)). 21 | - If desired, adjust `ALLOWED_TAGS` as a comma separated list `br,a,img` 22 | - `touch database/database.sqlite` 23 | - `composer install` 24 | - `php artisan migrate` 25 | 26 | ## Dev 27 | - `composer install` 28 | - `npm i` 29 | - Set URL in `webpack.mix.js` 30 | - `npx mix watch` 31 | - Build for production with `npx mix --production` 32 | 33 | ## Why Set a Password? 34 | - A password is highly recommended. If no password is set, anyone can create secrets 35 | - There's no rate limiter, so without a password a troll could hammer the endpoint to create secrets 36 | - There's no CSRF protection, though an irrelevant vector since without a password, anyone can create secrets anyways 37 | - Sanitization can't be performed server-side since the data is e2e encrypted, a sanitization occurs (as per the `ALLOWED_TAGS` environment variable) before displaying the secret. An unlikely vector, since it is sanitized before display, but worth mentioning. 38 | 39 | ## Notes 40 | - Not tested on IE/Edge, but from a look at the [Compatibility table](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto#browser_compatibility) the requirements should be supported 41 | - Thank you [Pichiste](https://github.com/pichiste) for helping debug the nightmare of SubtleCrypto ArrayBuffer <> String conversions. 42 | 43 | ## License 44 | [GNU General Public License version 2](https://opensource.org/licenses/GPL-2.0) 45 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | bootstrap(); 8 | 9 | date_default_timezone_set(env('APP_TIMEZONE', 'UTC')); 10 | 11 | /* 12 | |-------------------------------------------------------------------------- 13 | | Create The Application 14 | |-------------------------------------------------------------------------- 15 | | 16 | | Here we will load the environment and create the application instance 17 | | that serves as the central piece of this framework. We'll use this 18 | | application as an "IoC" container and router for this framework. 19 | | 20 | */ 21 | 22 | $app = new Laravel\Lumen\Application( 23 | dirname(__DIR__) 24 | ); 25 | 26 | $app->withFacades(); 27 | 28 | $app->withEloquent(); 29 | 30 | /* 31 | |-------------------------------------------------------------------------- 32 | | Register Container Bindings 33 | |-------------------------------------------------------------------------- 34 | | 35 | | Now we will register a few bindings in the service container. We will 36 | | register the exception handler and the console kernel. You may add 37 | | your own bindings here if you like or you can make another file. 38 | | 39 | */ 40 | 41 | $app->singleton( 42 | Illuminate\Contracts\Debug\ExceptionHandler::class, 43 | App\Exceptions\Handler::class 44 | ); 45 | 46 | $app->singleton( 47 | Illuminate\Contracts\Console\Kernel::class, 48 | App\Console\Kernel::class 49 | ); 50 | 51 | /* 52 | |-------------------------------------------------------------------------- 53 | | Register Config Files 54 | |-------------------------------------------------------------------------- 55 | | 56 | | Now we will register the "app" configuration file. If the file exists in 57 | | your configuration directory it will be loaded; otherwise, we'll load 58 | | the default version. You may register other files below as needed. 59 | | 60 | */ 61 | 62 | $app->configure('app'); 63 | 64 | /* 65 | |-------------------------------------------------------------------------- 66 | | Register Middleware 67 | |-------------------------------------------------------------------------- 68 | | 69 | | Next, we will register the middleware with the application. These can 70 | | be global middleware that run before and after each request into a 71 | | route or middleware that'll be assigned to some specific routes. 72 | | 73 | */ 74 | 75 | // $app->middleware([ 76 | // App\Http\Middleware\ExampleMiddleware::class 77 | // ]); 78 | 79 | // $app->routeMiddleware([ 80 | // 'auth' => App\Http\Middleware\Authenticate::class, 81 | // ]); 82 | 83 | /* 84 | |-------------------------------------------------------------------------- 85 | | Register Service Providers 86 | |-------------------------------------------------------------------------- 87 | | 88 | | Here we will register all of the application's service providers which 89 | | are used to bind services into the container. Service providers are 90 | | totally optional, so you are not required to uncomment this line. 91 | | 92 | */ 93 | 94 | // $app->register(App\Providers\AppServiceProvider::class); 95 | // $app->register(App\Providers\AuthServiceProvider::class); 96 | // $app->register(App\Providers\EventServiceProvider::class); 97 | 98 | /* 99 | |-------------------------------------------------------------------------- 100 | | Load The Application Routes 101 | |-------------------------------------------------------------------------- 102 | | 103 | | Next we will include the routes file so that they can all be added to 104 | | the application. This will provide all of the URLs the application 105 | | can respond to, as well as the controllers that may handle them. 106 | | 107 | */ 108 | 109 | $app->router->group([ 110 | 'namespace' => 'App\Http\Controllers', 111 | ], function ($router) { 112 | require __DIR__.'/../routes/web.php'; 113 | }); 114 | 115 | return $app; 116 | -------------------------------------------------------------------------------- /public/css/app.css: -------------------------------------------------------------------------------- 1 | /*! tailwindcss v2.1.4 | MIT License | https://tailwindcss.com*/ 2 | 3 | /*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}pre{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}button,input,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=submit],button{-webkit-appearance:button}h1,h3,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder, textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder, textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}h1,h3{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,select,textarea{padding:0;line-height:inherit;color:inherit}pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}img,svg{display:block;vertical-align:middle}img{max-width:100%;height:auto}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.75rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.rounded{border-radius:.25rem}.border-4{border-width:4px}.border{border-width:1px}.cursor-pointer{cursor:pointer}.block{display:block}.flex{display:flex}.contents{display:contents}.flex-col{flex-direction:column}.items-center{align-items:center}.font-bold{font-weight:700}.h-4{height:1rem}.h-48{height:12rem}.text-xs{font-size:.75rem;line-height:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.leading-tight{line-height:1.25}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mt-3{margin-top:.75rem}.mb-3{margin-bottom:.75rem}.mt-6{margin-top:1.5rem}.mb-6{margin-bottom:1.5rem}.max-w-md{max-width:28rem}.max-w-2xl{max-width:42rem}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.p-4{padding:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.pr-8{padding-right:2rem}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.inset-y-0{top:0;bottom:0}.right-0{right:0}*{--tw-shadow:0 0 transparent;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent}.fill-current{fill:currentColor}.text-center{text-align:center}.text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.italic{font-style:italic}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.tracking-wide{letter-spacing:.025em}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.break-all{word-break:break-all}.w-4{width:1rem}.w-full{width:100%}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}body,html{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity));font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.pulse{-webkit-animation:pulse 3s infinite;animation:pulse 3s infinite}@-webkit-keyframes pulse{0%{opacity:1}50%{opacity:.3}to{opacity:1}}@keyframes pulse{0%{opacity:1}50%{opacity:.3}to{opacity:1}}.select-color::-moz-selection{background:#ff0}.select-color::selection{background:#ff0}@media (min-width:768px){.md\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.md\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.md\:flex-row{flex-direction:row}.md\:mt-8{margin-top:2rem}} 4 | -------------------------------------------------------------------------------- /resources/views/secret-new.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.default', ['title' => 'New Secret']) 2 | 3 | @section('content') 4 |
5 |

Secret

6 |
7 | 8 |
9 |
10 |
11 | 12 |
13 | 18 |
19 | 20 |
21 |
22 |

Secret will always be deleted after viewing

23 |
24 | 25 | @if (env('NEW_ITEM_PASSWORD') !== '') 26 |
27 | 28 | 29 |
30 | @endif 31 |
32 | 35 |
36 |
37 | 38 |
39 |
Submitting...
40 |
41 | 42 |
43 | 44 | 71 |
72 | 73 | @stop 74 | 75 | 76 | @section('footer') 77 | 222 | 223 | @stop 224 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | GNU General Public License 2 | ========================== 3 | 4 | _Version 2, June 1991_ 5 | _Copyright © 1989, 1991 Free Software Foundation, Inc.,_ 6 | _51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA_ 7 | 8 | Everyone is permitted to copy and distribute verbatim copies 9 | of this license document, but changing it is not allowed. 10 | 11 | ### Preamble 12 | 13 | The licenses for most software are designed to take away your 14 | freedom to share and change it. By contrast, the GNU General Public 15 | License is intended to guarantee your freedom to share and change free 16 | software--to make sure the software is free for all its users. This 17 | General Public License applies to most of the Free Software 18 | Foundation's software and to any other program whose authors commit to 19 | using it. (Some other Free Software Foundation software is covered by 20 | the GNU Lesser General Public License instead.) You can apply it to 21 | your programs, too. 22 | 23 | When we speak of free software, we are referring to freedom, not 24 | price. Our General Public Licenses are designed to make sure that you 25 | have the freedom to distribute copies of free software (and charge for 26 | this service if you wish), that you receive source code or can get it 27 | if you want it, that you can change the software or use pieces of it 28 | in new free programs; and that you know you can do these things. 29 | 30 | To protect your rights, we need to make restrictions that forbid 31 | anyone to deny you these rights or to ask you to surrender the rights. 32 | These restrictions translate to certain responsibilities for you if you 33 | distribute copies of the software, or if you modify it. 34 | 35 | For example, if you distribute copies of such a program, whether 36 | gratis or for a fee, you must give the recipients all the rights that 37 | you have. You must make sure that they, too, receive or can get the 38 | source code. And you must show them these terms so they know their 39 | rights. 40 | 41 | We protect your rights with two steps: **(1)** copyright the software, and 42 | **(2)** offer you this license which gives you legal permission to copy, 43 | distribute and/or modify the software. 44 | 45 | Also, for each author's protection and ours, we want to make certain 46 | that everyone understands that there is no warranty for this free 47 | software. If the software is modified by someone else and passed on, we 48 | want its recipients to know that what they have is not the original, so 49 | that any problems introduced by others will not reflect on the original 50 | authors' reputations. 51 | 52 | Finally, any free program is threatened constantly by software 53 | patents. We wish to avoid the danger that redistributors of a free 54 | program will individually obtain patent licenses, in effect making the 55 | program proprietary. To prevent this, we have made it clear that any 56 | patent must be licensed for everyone's free use or not licensed at all. 57 | 58 | The precise terms and conditions for copying, distribution and 59 | modification follow. 60 | 61 | ### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 62 | 63 | **0.** This License applies to any program or other work which contains 64 | a notice placed by the copyright holder saying it may be distributed 65 | under the terms of this General Public License. The “Program”, below, 66 | refers to any such program or work, and a “work based on the Program” 67 | means either the Program or any derivative work under copyright law: 68 | that is to say, a work containing the Program or a portion of it, 69 | either verbatim or with modifications and/or translated into another 70 | language. (Hereinafter, translation is included without limitation in 71 | the term “modification”.) Each licensee is addressed as “you”. 72 | 73 | Activities other than copying, distribution and modification are not 74 | covered by this License; they are outside its scope. The act of 75 | running the Program is not restricted, and the output from the Program 76 | is covered only if its contents constitute a work based on the 77 | Program (independent of having been made by running the Program). 78 | Whether that is true depends on what the Program does. 79 | 80 | **1.** You may copy and distribute verbatim copies of the Program's 81 | source code as you receive it, in any medium, provided that you 82 | conspicuously and appropriately publish on each copy an appropriate 83 | copyright notice and disclaimer of warranty; keep intact all the 84 | notices that refer to this License and to the absence of any warranty; 85 | and give any other recipients of the Program a copy of this License 86 | along with the Program. 87 | 88 | You may charge a fee for the physical act of transferring a copy, and 89 | you may at your option offer warranty protection in exchange for a fee. 90 | 91 | **2.** You may modify your copy or copies of the Program or any portion 92 | of it, thus forming a work based on the Program, and copy and 93 | distribute such modifications or work under the terms of Section 1 94 | above, provided that you also meet all of these conditions: 95 | 96 | * **a)** You must cause the modified files to carry prominent notices 97 | stating that you changed the files and the date of any change. 98 | * **b)** You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | * **c)** If the modified program normally reads commands interactively 103 | when run, you must cause it, when started running for such 104 | interactive use in the most ordinary way, to print or display an 105 | announcement including an appropriate copyright notice and a 106 | notice that there is no warranty (or else, saying that you provide 107 | a warranty) and that users may redistribute the program under 108 | these conditions, and telling the user how to view a copy of this 109 | License. (Exception: if the Program itself is interactive but 110 | does not normally print such an announcement, your work based on 111 | the Program is not required to print an announcement.) 112 | 113 | These requirements apply to the modified work as a whole. If 114 | identifiable sections of that work are not derived from the Program, 115 | and can be reasonably considered independent and separate works in 116 | themselves, then this License, and its terms, do not apply to those 117 | sections when you distribute them as separate works. But when you 118 | distribute the same sections as part of a whole which is a work based 119 | on the Program, the distribution of the whole must be on the terms of 120 | this License, whose permissions for other licensees extend to the 121 | entire whole, and thus to each and every part regardless of who wrote it. 122 | 123 | Thus, it is not the intent of this section to claim rights or contest 124 | your rights to work written entirely by you; rather, the intent is to 125 | exercise the right to control the distribution of derivative or 126 | collective works based on the Program. 127 | 128 | In addition, mere aggregation of another work not based on the Program 129 | with the Program (or with a work based on the Program) on a volume of 130 | a storage or distribution medium does not bring the other work under 131 | the scope of this License. 132 | 133 | **3.** You may copy and distribute the Program (or a work based on it, 134 | under Section 2) in object code or executable form under the terms of 135 | Sections 1 and 2 above provided that you also do one of the following: 136 | 137 | * **a)** Accompany it with the complete corresponding machine-readable 138 | source code, which must be distributed under the terms of Sections 139 | 1 and 2 above on a medium customarily used for software interchange; or, 140 | * **b)** Accompany it with a written offer, valid for at least three 141 | years, to give any third party, for a charge no more than your 142 | cost of physically performing source distribution, a complete 143 | machine-readable copy of the corresponding source code, to be 144 | distributed under the terms of Sections 1 and 2 above on a medium 145 | customarily used for software interchange; or, 146 | * **c)** Accompany it with the information you received as to the offer 147 | to distribute corresponding source code. (This alternative is 148 | allowed only for noncommercial distribution and only if you 149 | received the program in object code or executable form with such 150 | an offer, in accord with Subsection b above.) 151 | 152 | The source code for a work means the preferred form of the work for 153 | making modifications to it. For an executable work, complete source 154 | code means all the source code for all modules it contains, plus any 155 | associated interface definition files, plus the scripts used to 156 | control compilation and installation of the executable. However, as a 157 | special exception, the source code distributed need not include 158 | anything that is normally distributed (in either source or binary 159 | form) with the major components (compiler, kernel, and so on) of the 160 | operating system on which the executable runs, unless that component 161 | itself accompanies the executable. 162 | 163 | If distribution of executable or object code is made by offering 164 | access to copy from a designated place, then offering equivalent 165 | access to copy the source code from the same place counts as 166 | distribution of the source code, even though third parties are not 167 | compelled to copy the source along with the object code. 168 | 169 | **4.** You may not copy, modify, sublicense, or distribute the Program 170 | except as expressly provided under this License. Any attempt 171 | otherwise to copy, modify, sublicense or distribute the Program is 172 | void, and will automatically terminate your rights under this License. 173 | However, parties who have received copies, or rights, from you under 174 | this License will not have their licenses terminated so long as such 175 | parties remain in full compliance. 176 | 177 | **5.** You are not required to accept this License, since you have not 178 | signed it. However, nothing else grants you permission to modify or 179 | distribute the Program or its derivative works. These actions are 180 | prohibited by law if you do not accept this License. Therefore, by 181 | modifying or distributing the Program (or any work based on the 182 | Program), you indicate your acceptance of this License to do so, and 183 | all its terms and conditions for copying, distributing or modifying 184 | the Program or works based on it. 185 | 186 | **6.** Each time you redistribute the Program (or any work based on the 187 | Program), the recipient automatically receives a license from the 188 | original licensor to copy, distribute or modify the Program subject to 189 | these terms and conditions. You may not impose any further 190 | restrictions on the recipients' exercise of the rights granted herein. 191 | You are not responsible for enforcing compliance by third parties to 192 | this License. 193 | 194 | **7.** If, as a consequence of a court judgment or allegation of patent 195 | infringement or for any other reason (not limited to patent issues), 196 | conditions are imposed on you (whether by court order, agreement or 197 | otherwise) that contradict the conditions of this License, they do not 198 | excuse you from the conditions of this License. If you cannot 199 | distribute so as to satisfy simultaneously your obligations under this 200 | License and any other pertinent obligations, then as a consequence you 201 | may not distribute the Program at all. For example, if a patent 202 | license would not permit royalty-free redistribution of the Program by 203 | all those who receive copies directly or indirectly through you, then 204 | the only way you could satisfy both it and this License would be to 205 | refrain entirely from distribution of the Program. 206 | 207 | If any portion of this section is held invalid or unenforceable under 208 | any particular circumstance, the balance of the section is intended to 209 | apply and the section as a whole is intended to apply in other 210 | circumstances. 211 | 212 | It is not the purpose of this section to induce you to infringe any 213 | patents or other property right claims or to contest validity of any 214 | such claims; this section has the sole purpose of protecting the 215 | integrity of the free software distribution system, which is 216 | implemented by public license practices. Many people have made 217 | generous contributions to the wide range of software distributed 218 | through that system in reliance on consistent application of that 219 | system; it is up to the author/donor to decide if he or she is willing 220 | to distribute software through any other system and a licensee cannot 221 | impose that choice. 222 | 223 | This section is intended to make thoroughly clear what is believed to 224 | be a consequence of the rest of this License. 225 | 226 | **8.** If the distribution and/or use of the Program is restricted in 227 | certain countries either by patents or by copyrighted interfaces, the 228 | original copyright holder who places the Program under this License 229 | may add an explicit geographical distribution limitation excluding 230 | those countries, so that distribution is permitted only in or among 231 | countries not thus excluded. In such case, this License incorporates 232 | the limitation as if written in the body of this License. 233 | 234 | **9.** The Free Software Foundation may publish revised and/or new versions 235 | of the General Public License from time to time. Such new versions will 236 | be similar in spirit to the present version, but may differ in detail to 237 | address new problems or concerns. 238 | 239 | Each version is given a distinguishing version number. If the Program 240 | specifies a version number of this License which applies to it and “any 241 | later version”, you have the option of following the terms and conditions 242 | either of that version or of any later version published by the Free 243 | Software Foundation. If the Program does not specify a version number of 244 | this License, you may choose any version ever published by the Free Software 245 | Foundation. 246 | 247 | **10.** If you wish to incorporate parts of the Program into other free 248 | programs whose distribution conditions are different, write to the author 249 | to ask for permission. For software which is copyrighted by the Free 250 | Software Foundation, write to the Free Software Foundation; we sometimes 251 | make exceptions for this. Our decision will be guided by the two goals 252 | of preserving the free status of all derivatives of our free software and 253 | of promoting the sharing and reuse of software generally. 254 | 255 | ### NO WARRANTY 256 | 257 | **11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 258 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 259 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 260 | PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 261 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 262 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 263 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 264 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 265 | REPAIR OR CORRECTION. 266 | 267 | **12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 268 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 269 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 270 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 271 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 272 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 273 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 274 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 275 | POSSIBILITY OF SUCH DAMAGES. 276 | 277 | END OF TERMS AND CONDITIONS 278 | 279 | ### How to Apply These Terms to Your New Programs 280 | 281 | If you develop a new program, and you want it to be of the greatest 282 | possible use to the public, the best way to achieve this is to make it 283 | free software which everyone can redistribute and change under these terms. 284 | 285 | To do so, attach the following notices to the program. It is safest 286 | to attach them to the start of each source file to most effectively 287 | convey the exclusion of warranty; and each file should have at least 288 | the “copyright” line and a pointer to where the full notice is found. 289 | 290 | 291 | Copyright (C) 292 | 293 | This program is free software; you can redistribute it and/or modify 294 | it under the terms of the GNU General Public License as published by 295 | the Free Software Foundation; either version 2 of the License, or 296 | (at your option) any later version. 297 | 298 | This program is distributed in the hope that it will be useful, 299 | but WITHOUT ANY WARRANTY; without even the implied warranty of 300 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 301 | GNU General Public License for more details. 302 | 303 | You should have received a copy of the GNU General Public License along 304 | with this program; if not, write to the Free Software Foundation, Inc., 305 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 306 | 307 | Also add information on how to contact you by electronic and paper mail. 308 | 309 | If the program is interactive, make it output a short notice like this 310 | when it starts in an interactive mode: 311 | 312 | Gnomovision version 69, Copyright (C) year name of author 313 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 314 | This is free software, and you are welcome to redistribute it 315 | under certain conditions; type `show c' for details. 316 | 317 | The hypothetical commands `show w` and `show c` should show the appropriate 318 | parts of the General Public License. Of course, the commands you use may 319 | be called something other than `show w` and `show c`; they could even be 320 | mouse-clicks or menu items--whatever suits your program. 321 | 322 | You should also get your employer (if you work as a programmer) or your 323 | school, if any, to sign a “copyright disclaimer” for the program, if 324 | necessary. Here is a sample; alter the names: 325 | 326 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 327 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 328 | 329 | , 1 April 1989 330 | Ty Coon, President of Vice 331 | 332 | This General Public License does not permit incorporating your program into 333 | proprietary programs. If your program is a subroutine library, you may 334 | consider it more useful to permit linking proprietary applications with the 335 | library. If this is what you want to do, use the GNU Lesser General 336 | Public License instead of this License. 337 | --------------------------------------------------------------------------------