*/
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": "[](https://travis-ci.org/laravel/lumen-framework) [](https://packagist.org/packages/laravel/lumen-framework) [](https://packagist.org/packages/laravel/lumen-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 |
6 |
7 |
This message has already been deleted from the server and cannot be retrieved again. Please save the contents securely before closing the browser.
8 |
9 |
10 |
11 |
12 |
13 |
14 |
 }}.jpg)
15 |
16 |
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 | 
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 |
37 |
38 |
41 |
42 |
43 |
44 |
45 |
46 |
Your secret has been encrypted and saved securely. Please share the link below.
47 |
48 |
49 |
50 |
51 |
52 |
For increased security you may choose to send the URL and KEY separately (e.g. one by email and another by text)
53 |
54 |
URL
55 |
56 |
57 |
58 |
59 |
Key
60 |
61 | #
62 |
63 |
64 |
65 |
66 |
This link expires in , and can only be viewed once.
67 |
Click here to delete it immediately
68 |
69 |
70 |
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 |
--------------------------------------------------------------------------------