From 96c80b9a57e2099a4c1a7cf30295500b85f6659e Mon Sep 17 00:00:00 2001
From: Kirill Solomko <ksolomko@sipwise.com>
Date: Fri, 26 Jul 2024 17:10:19 +0200
Subject: [PATCH] MT#59449 add password_journal tables

* new table provisioning.voip_subscriber_password_journal
  containing encrypted last used sip passwords from voip_subscribers
* new table provisioning.voip_subscriber_webpassword_journal
  containing encrypted last used web passwords from voip_subscribers
* new table billing.admin_password_journal
  containing encrypted last used password from admins
* provisoning.voip_subscribers new fields
   - password_last_modify_timestmp
   - webpassword_last_modify_timestmp
* billing.admins new fields
   - saltedpass_last_modify_timestmp

Change-Id: I39ea5db4a007f16c9e5c4113971d619e70cbef37
---
 .../Schema/Result/admin_password_journal.pm   | 146 ++++++++++++++++++
 lib/NGCP/Schema/Result/admins.pm              |  21 +++
 .../Result/provisioning_voip_subscribers.pm   |  54 +++++++
 .../voip_subscriber_password_journal.pm       | 146 ++++++++++++++++++
 .../voip_subscriber_webpassword_journal.pm    | 146 ++++++++++++++++++
 5 files changed, 513 insertions(+)
 create mode 100644 lib/NGCP/Schema/Result/admin_password_journal.pm
 create mode 100644 lib/NGCP/Schema/Result/voip_subscriber_password_journal.pm
 create mode 100644 lib/NGCP/Schema/Result/voip_subscriber_webpassword_journal.pm

diff --git a/lib/NGCP/Schema/Result/admin_password_journal.pm b/lib/NGCP/Schema/Result/admin_password_journal.pm
new file mode 100644
index 00000000..dc93457c
--- /dev/null
+++ b/lib/NGCP/Schema/Result/admin_password_journal.pm
@@ -0,0 +1,146 @@
+package NGCP::Schema::Result::admin_password_journal;
+
+use strict;
+use warnings;
+
+use Scalar::Util qw(blessed);
+use parent 'DBIx::Class::Core';
+
+our $VERSION = '2.007';
+
+__PACKAGE__->load_components("InflateColumn::DateTime", "Helper::Row::ToJSON");
+
+__PACKAGE__->table("billing.admin_password_journal");
+
+__PACKAGE__->add_columns(
+  "id",
+  {
+    data_type => "integer",
+    extra => { unsigned => 1 },
+    is_auto_increment => 1,
+    is_nullable => 0,
+  },
+  "admin_id",
+  {
+    data_type => "integer",
+    extra => { unsigned => 1 },
+    is_foreign_key => 1,
+    is_nullable => 0,
+  },
+  "value",
+  { data_type => "char", is_nullable => 1, size => 54 },
+  "created_at",
+  {
+    data_type => "timestamp",
+    datetime_undef_if_invalid => 1,
+    default_value => \"current_timestamp",
+    is_nullable => 0,
+  },
+);
+
+__PACKAGE__->set_primary_key("id");
+
+__PACKAGE__->belongs_to(
+  "admin",
+  "NGCP::Schema::Result::admins",
+  { id => "admin_id" },
+  { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
+);
+
+sub TO_JSON {
+    my ($self) = @_;
+    return {
+        map { blessed($_) && $_->isa('DateTime') ? $_->datetime : $_ } %{ $self->next::method }
+    };
+}
+
+1;
+__END__
+
+=encoding UTF-8
+
+=head1 NAME
+
+NGCP::Schema::Result::admin_password_journal
+
+=head1 DESCRIPTION
+
+This module is a schema class for the NGCP database table "billing.admin_password_journal".
+
+=head1 COMPONENTS LOADED
+
+=over 4
+
+=item * L<DBIx::Class::InflateColumn::DateTime>
+
+=item * L<DBIx::Class::Helper::Row::ToJSON>
+
+=back
+
+=head1 TABLE: C<billing.admin_password_journal>
+
+=head1 ACCESSORS
+
+=head2 id
+
+  data_type: 'integer'
+  extra: {unsigned => 1}
+  is_auto_increment: 1
+  is_nullable: 0
+
+=head2 admin_id
+
+  data_type: 'integer'
+  extra: {unsigned => 1}
+  is_foreign_key: 1
+  is_nullable: 0
+
+=head2 value
+
+  data_type: 'char'
+  is_nullable: 1
+  size: 54
+
+=head2 created_at
+
+  data_type: 'timestamp'
+  datetime_undef_if_invalid: 1
+  default_value: 'current_timestamp'
+  is_nullable: 0
+
+=head1 PRIMARY KEY
+
+=over 4
+
+=item * L</id>
+
+=back
+
+=head1 RELATIONS
+
+=head2 admin
+
+Type: belongs_to
+
+Related object: L<NGCP::Schema::Result::admins>
+
+=head1 AUTHOR
+
+Sipwise Development Team C<< <support@sipwise.com> >>
+
+=head1 LICENSE
+
+This software is Copyright © 224 by Sipwise GmbH, Austria.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this package.  If not, see <https://www.gnu.org/licenses/>.
diff --git a/lib/NGCP/Schema/Result/admins.pm b/lib/NGCP/Schema/Result/admins.pm
index ec93c755..4d90a412 100644
--- a/lib/NGCP/Schema/Result/admins.pm
+++ b/lib/NGCP/Schema/Result/admins.pm
@@ -76,6 +76,13 @@ __PACKAGE__->add_columns(
   { data_type => "tinyint", default_value => 1, is_nullable => 0 },
   "is_system",
   { data_type => "tinyint", default_value => 0, is_nullable => 0 },
+  "saltedpass_modify_timestamp",
+  {
+    data_type => "timestamp",
+    datetime_undef_if_invalid => 1,
+    default_value => \"current_timestamp",
+    is_nullable => 0,
+  },
 );
 
 __PACKAGE__->set_primary_key("id");
@@ -105,6 +112,13 @@ __PACKAGE__->belongs_to(
   { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
 );
 
+__PACKAGE__->has_many(
+  "last_passwords",
+  "NGCP::Schema::Result::admin_password_journal",
+  { "foreign.admin_id" => "self.id" },
+  { cascade_copy => 0, cascade_delete => 0 },
+);
+
 sub TO_JSON {
     my ($self) = @_;
     return {
@@ -220,6 +234,13 @@ This module is a schema class for the NGCP database table "billing.admins".
   extra: {unsigned => 1}
   is_nullable: 1
 
+=head2 saltedpass_modify_timestamp
+
+  data_type: 'timestamp'
+  datetime_undef_if_invalid: 1
+  default_value: current_timestamp
+  is_nullable: 0
+
 =head1 PRIMARY KEY
 
 =over 4
diff --git a/lib/NGCP/Schema/Result/provisioning_voip_subscribers.pm b/lib/NGCP/Schema/Result/provisioning_voip_subscribers.pm
index dedab58b..9f4f7645 100644
--- a/lib/NGCP/Schema/Result/provisioning_voip_subscribers.pm
+++ b/lib/NGCP/Schema/Result/provisioning_voip_subscribers.pm
@@ -85,6 +85,20 @@ __PACKAGE__->add_columns(
     default_value => "0000-00-00 00:00:00",
     is_nullable => 0,
   },
+  "password_modify_timestamp",
+  {
+    data_type => "timestamp",
+    datetime_undef_if_invalid => 1,
+    default_value => \"current_timestamp",
+    is_nullable => 0,
+  },
+  "webpassword_modify_timestamp",
+  {
+    data_type => "timestamp",
+    datetime_undef_if_invalid => 1,
+    default_value => \"current_timestamp",
+    is_nullable => 0,
+  },
 );
 
 __PACKAGE__->set_primary_key("id");
@@ -277,6 +291,20 @@ __PACKAGE__->has_one(
   { cascade_copy => 0, cascade_delete => 0 },
 );
 
+__PACKAGE__->has_many(
+  "last_passwords",
+  "NGCP::Schema::Result::voip_subscriber_password_journal",
+  { "foreign.subscriber_id" => "self.id" },
+  { cascade_copy => 0, cascade_delete => 0 },
+);
+
+__PACKAGE__->has_many(
+  "last_webpasswords",
+  "NGCP::Schema::Result::voip_subscriber_webpassword_journal",
+  { "foreign.subscriber_id" => "self.id" },
+  { cascade_copy => 0, cascade_delete => 0 },
+);
+
 __PACKAGE__->belongs_to(
   "contract",
   "NGCP::Schema::Result::contracts",
@@ -482,6 +510,20 @@ This module is a schema class for the NGCP database table "provisioning.voip_sub
   default_value: '0000-00-00 00:00:00'
   is_nullable: 0
 
+=head2 password_modify_timestamp
+
+  data_type: 'timestamp'
+  datetime_undef_if_invalid: 1
+  default_value: current_timestamp
+  is_nullable: 0
+
+=head2 webpassword_modify_timestamp
+
+  data_type: 'timestamp'
+  datetime_undef_if_invalid: 1
+  default_value: current_timestamp
+  is_nullable: 0
+
 =head1 PRIMARY KEY
 
 =over 4
@@ -648,6 +690,18 @@ Type: might_have
 
 Related object: L<NGCP::Schema::Result::rtc_session>
 
+=head2 last_passwords
+
+Type: has_many
+
+Related object: L<NGCP::Schema::Result::voip_subscriber_password_journal>
+
+=head2 last_webpasswords
+
+Type: has_many
+
+Related object: L<NGCP::Schema::Result::voip_subscriber_webpassword_journal>
+
 =head1 AUTHOR
 
 Sipwise Development Team C<< <support@sipwise.com> >>
diff --git a/lib/NGCP/Schema/Result/voip_subscriber_password_journal.pm b/lib/NGCP/Schema/Result/voip_subscriber_password_journal.pm
new file mode 100644
index 00000000..1ae84042
--- /dev/null
+++ b/lib/NGCP/Schema/Result/voip_subscriber_password_journal.pm
@@ -0,0 +1,146 @@
+package NGCP::Schema::Result::voip_subscriber_password_journal;
+
+use strict;
+use warnings;
+
+use Scalar::Util qw(blessed);
+use parent 'DBIx::Class::Core';
+
+our $VERSION = '2.007';
+
+__PACKAGE__->load_components("InflateColumn::DateTime", "Helper::Row::ToJSON");
+
+__PACKAGE__->table("provisioning.voip_subscriber_password_journal");
+
+__PACKAGE__->add_columns(
+  "id",
+  {
+    data_type => "integer",
+    extra => { unsigned => 1 },
+    is_auto_increment => 1,
+    is_nullable => 0,
+  },
+  "subscriber_id",
+  {
+    data_type => "integer",
+    extra => { unsigned => 1 },
+    is_foreign_key => 1,
+    is_nullable => 0,
+  },
+  "value",
+  { data_type => "char", is_nullable => 1, size => 56 },
+  "created_at",
+  {
+    data_type => "timestamp",
+    datetime_undef_if_invalid => 1,
+    default_value => \"current_timestamp",
+    is_nullable => 0,
+  },
+);
+
+__PACKAGE__->set_primary_key("id");
+
+__PACKAGE__->belongs_to(
+  "subscriber",
+  "NGCP::Schema::Result::provisioning_voip_subscribers",
+  { id => "subscriber_id" },
+  { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
+);
+
+sub TO_JSON {
+    my ($self) = @_;
+    return {
+        map { blessed($_) && $_->isa('DateTime') ? $_->datetime : $_ } %{ $self->next::method }
+    };
+}
+
+1;
+__END__
+
+=encoding UTF-8
+
+=head1 NAME
+
+NGCP::Schema::Result::voip_subscriber_password_journal
+
+=head1 DESCRIPTION
+
+This module is a schema class for the NGCP database table "provisioning.voip_subscriber_password_journal".
+
+=head1 COMPONENTS LOADED
+
+=over 4
+
+=item * L<DBIx::Class::InflateColumn::DateTime>
+
+=item * L<DBIx::Class::Helper::Row::ToJSON>
+
+=back
+
+=head1 TABLE: C<provisioning.voip_subscriber_password_journal>
+
+=head1 ACCESSORS
+
+=head2 id
+
+  data_type: 'integer'
+  extra: {unsigned => 1}
+  is_auto_increment: 1
+  is_nullable: 0
+
+=head2 subscriber_id
+
+  data_type: 'integer'
+  extra: {unsigned => 1}
+  is_foreign_key: 1
+  is_nullable: 0
+
+=head2 value
+
+  data_type: 'char'
+  is_nullable: 1
+  size: 56
+
+=head2 created_at
+
+  data_type: 'timestamp'
+  datetime_undef_if_invalid: 1
+  default_value: 'current_timestamp'
+  is_nullable: 0
+
+=head1 PRIMARY KEY
+
+=over 4
+
+=item * L</id>
+
+=back
+
+=head1 RELATIONS
+
+=head2 subcsriber
+
+Type: belongs_to
+
+Related object: L<NGCP::Schema::Result::provisioning_voip_subscribers>
+
+=head1 AUTHOR
+
+Sipwise Development Team C<< <support@sipwise.com> >>
+
+=head1 LICENSE
+
+This software is Copyright © 224 by Sipwise GmbH, Austria.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this package.  If not, see <https://www.gnu.org/licenses/>.
diff --git a/lib/NGCP/Schema/Result/voip_subscriber_webpassword_journal.pm b/lib/NGCP/Schema/Result/voip_subscriber_webpassword_journal.pm
new file mode 100644
index 00000000..4431e51a
--- /dev/null
+++ b/lib/NGCP/Schema/Result/voip_subscriber_webpassword_journal.pm
@@ -0,0 +1,146 @@
+package NGCP::Schema::Result::voip_subscriber_webpassword_journal;
+
+use strict;
+use warnings;
+
+use Scalar::Util qw(blessed);
+use parent 'DBIx::Class::Core';
+
+our $VERSION = '2.007';
+
+__PACKAGE__->load_components("InflateColumn::DateTime", "Helper::Row::ToJSON");
+
+__PACKAGE__->table("provisioning.voip_subscriber_webpassword_journal");
+
+__PACKAGE__->add_columns(
+  "id",
+  {
+    data_type => "integer",
+    extra => { unsigned => 1 },
+    is_auto_increment => 1,
+    is_nullable => 0,
+  },
+  "subscriber_id",
+  {
+    data_type => "integer",
+    extra => { unsigned => 1 },
+    is_foreign_key => 1,
+    is_nullable => 0,
+  },
+  "value",
+  { data_type => "char", is_nullable => 1, size => 56 },
+  "created_at",
+  {
+    data_type => "timestamp",
+    datetime_undef_if_invalid => 1,
+    default_value => \"current_timestamp",
+    is_nullable => 0,
+  },
+);
+
+__PACKAGE__->set_primary_key("id");
+
+__PACKAGE__->belongs_to(
+  "subscriber",
+  "NGCP::Schema::Result::provisioning_voip_subscribers",
+  { id => "subscriber_id" },
+  { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
+);
+
+sub TO_JSON {
+    my ($self) = @_;
+    return {
+        map { blessed($_) && $_->isa('DateTime') ? $_->datetime : $_ } %{ $self->next::method }
+    };
+}
+
+1;
+__END__
+
+=encoding UTF-8
+
+=head1 NAME
+
+NGCP::Schema::Result::voip_subscriber_webpassword_journal
+
+=head1 DESCRIPTION
+
+This module is a schema class for the NGCP database table "provisioning.voip_subscriber_webpassword_journal".
+
+=head1 COMPONENTS LOADED
+
+=over 4
+
+=item * L<DBIx::Class::InflateColumn::DateTime>
+
+=item * L<DBIx::Class::Helper::Row::ToJSON>
+
+=back
+
+=head1 TABLE: C<provisioning.voip_subscriber_webpassword_journal>
+
+=head1 ACCESSORS
+
+=head2 id
+
+  data_type: 'integer'
+  extra: {unsigned => 1}
+  is_auto_increment: 1
+  is_nullable: 0
+
+=head2 subscriber_id
+
+  data_type: 'integer'
+  extra: {unsigned => 1}
+  is_foreign_key: 1
+  is_nullable: 0
+
+=head2 value
+
+  data_type: 'char'
+  is_nullable: 1
+  size: 56
+
+=head2 created_at
+
+  data_type: 'timestamp'
+  datetime_undef_if_invalid: 1
+  default_value: 'current_timestamp'
+  is_nullable: 0
+
+=head1 PRIMARY KEY
+
+=over 4
+
+=item * L</id>
+
+=back
+
+=head1 RELATIONS
+
+=head2 subcsriber
+
+Type: belongs_to
+
+Related object: L<NGCP::Schema::Result::provisioning_voip_subscribers>
+
+=head1 AUTHOR
+
+Sipwise Development Team C<< <support@sipwise.com> >>
+
+=head1 LICENSE
+
+This software is Copyright © 224 by Sipwise GmbH, Austria.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this package.  If not, see <https://www.gnu.org/licenses/>.