From 72d5df14dfc14a5bac0ffbacfddfbb221f5dc91c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andrej=20Rama=C5=A1euski?= <andrej@x2.cz>
Date: Wed, 31 Jan 2024 16:54:51 +0100
Subject: [PATCH] Opravy API, podpora Chobotnice

---
 .drone.yml                    | 16 -------------
 VERSION                       |  2 +-
 lib/PZ.pm                     |  4 ++++
 lib/PZ/Controller/Shortcut.pm |  8 +++++--
 lib/PZ/Helpers/Octopus.pm     | 43 +++++++++++++++++++++++++++++++++++
 p_z.conf                      |  3 +++
 6 files changed, 57 insertions(+), 19 deletions(-)
 delete mode 100644 .drone.yml
 create mode 100644 lib/PZ/Helpers/Octopus.pm

diff --git a/.drone.yml b/.drone.yml
deleted file mode 100644
index e425335..0000000
--- a/.drone.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-kind: pipeline
-name: default
-
-steps:
-- name: docker
-  image: plugins/docker
-  settings:
-    username: test
-    password: test
-    repo: andrej/test
-    password:
-        from_secret: password
-     username:
-        from_secret: username
-    tags:
-    - latest
diff --git a/VERSION b/VERSION
index 24ba9a3..834f262 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.7.0
+2.8.0
diff --git a/lib/PZ.pm b/lib/PZ.pm
index 4951ab1..7483ab1 100644
--- a/lib/PZ.pm
+++ b/lib/PZ.pm
@@ -30,6 +30,7 @@ sub startup {
     $self->plugin("ForwardedFor");
     $self->plugin('PZ::Helpers::Core');
     $self->plugin('PZ::Helpers::OIDC');
+    $self->plugin('PZ::Helpers::Octopus');
 
     my $redis = Mojo::Redis->new( 'redis://' . $cfg->{redis}{server} );
     $self->helper( redis => sub { return $redis; } );
@@ -80,6 +81,9 @@ sub startup {
 
                 return $c->$cb('Authorization header not present') if ! $token;
 
+                $token = $c->octopus_auth($token) if length($token) > 32;
+                return $c->$cb('Invalid token') if ! $token;
+
                 my $user = $c->schema->resultset('User')->find(
                     { token => $token }
                 );
diff --git a/lib/PZ/Controller/Shortcut.pm b/lib/PZ/Controller/Shortcut.pm
index a293765..d992049 100644
--- a/lib/PZ/Controller/Shortcut.pm
+++ b/lib/PZ/Controller/Shortcut.pm
@@ -61,7 +61,9 @@ sub create ($c) {
         $title = $ua->get($url)->result->dom->at('title')->text;
     };
 
-    my $shortcut = $c->current_user->add_to_shortcuts({
+    my $user = $c->stash->{user} // $c->current_user;
+
+    my $shortcut = $user->add_to_shortcuts({
         url      => $url,
         title    => $title,
         shortcut => ($custom || $c->schema->resultset('Shortcut')->generate())
@@ -98,8 +100,10 @@ sub delete ($c) {
 sub list ($c) {
     my @shortcuts = ();
 
+    my $user = $c->stash->{user} // $c->current_user;
+
     SHORTCUT:
-    foreach my $shortcut ( $c->current_user->shortcuts(
+    foreach my $shortcut ( $user->shortcuts(
         { deleted  => undef },
         { order_by => {-desc => 'created'} },
     ) ) {
diff --git a/lib/PZ/Helpers/Octopus.pm b/lib/PZ/Helpers/Octopus.pm
new file mode 100644
index 0000000..e058a74
--- /dev/null
+++ b/lib/PZ/Helpers/Octopus.pm
@@ -0,0 +1,43 @@
+package PZ::Helpers::Octopus;
+
+use strict;
+use warnings;
+
+use base 'Mojolicious::Plugin';
+use Mojo::JWT;
+
+sub register {
+    my ($class, $self) = @_;
+
+    $self->helper( octopus_auth => sub {
+        my $c     = shift;
+        my $token = shift // return undef;
+
+        my $claims;
+
+        eval {
+            $claims = Mojo::JWT->new(
+                secret => $self->cfg->{octopus}{secret}
+            )->decode($token);
+        };
+
+        if ( $@ ) {
+            $c->app->log->warn( $@ );
+            return undef;
+        }
+
+        my $user = $c->schema->resultset('User')->update_or_create(
+            uuid => $claims->{uuid},
+            { key => 'uuid', }
+        );
+
+        $user->set_token;
+
+        return $user->token;
+    });
+
+}
+
+1;
+
+__END__
diff --git a/p_z.conf b/p_z.conf
index 75679d0..52c5b69 100644
--- a/p_z.conf
+++ b/p_z.conf
@@ -34,4 +34,7 @@
   piratar           => 'https://a.pirati.cz/piratar/100/',
   domain            => $ENV{DOMAIN},
   dev_mode          => ( $ENV{MOJO_MODE} eq 'development'),
+  octopus           => {
+    secret => $ENV{OCTOPUS_SECRET},
+  },
 };
-- 
GitLab