My-Mailserver-Manager/lib/My/Mailserver/Schema/Result/VirtualUser.pm

208 lines
3.7 KiB
Perl

use utf8;
package My::Mailserver::Schema::Result::VirtualUser;
# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THE FIRST PART OF THIS FILE
=head1 NAME
My::Mailserver::Schema::Result::VirtualUser
=cut
use strict;
use warnings;
use base 'DBIx::Class::Core';
=head1 TABLE: C<virtual_users>
=cut
__PACKAGE__->table("virtual_users");
=head1 ACCESSORS
=head2 id
data_type: 'integer'
is_auto_increment: 1
is_nullable: 0
=head2 domain_id
data_type: 'integer'
is_foreign_key: 1
is_nullable: 0
=head2 password
data_type: 'varchar'
is_nullable: 0
size: 255
=head2 email
data_type: 'varchar'
is_nullable: 0
size: 255
=head2 recovery_email
data_type: 'varchar'
is_nullable: 1
size: 255
=head2 is_manager
data_type: 'tinyint'
default_value: 0
is_nullable: 1
=cut
__PACKAGE__->add_columns(
"id",
{ data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
"domain_id",
{ data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
"password",
{ data_type => "varchar", is_nullable => 0, size => 255 },
"email",
{ data_type => "varchar", is_nullable => 0, size => 255 },
"recovery_email",
{ data_type => "varchar", is_nullable => 1, size => 255 },
"is_manager",
{ data_type => "tinyint", default_value => 0, is_nullable => 1 },
);
=head1 PRIMARY KEY
=over 4
=item * L</id>
=back
=cut
__PACKAGE__->set_primary_key("id");
=head1 UNIQUE CONSTRAINTS
=head2 C<email>
=over 4
=item * L</email>
=back
=cut
__PACKAGE__->add_unique_constraint("email", ["email"]);
=head1 RELATIONS
=head2 domain
Type: belongs_to
Related object: L<My::Mailserver::Schema::Result::VirtualDomain>
=cut
__PACKAGE__->belongs_to(
"domain",
"My::Mailserver::Schema::Result::VirtualDomain",
{ id => "domain_id" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "RESTRICT" },
);
=head2 managers_domains
Type: has_many
Related object: L<My::Mailserver::Schema::Result::ManagersDomain>
=cut
__PACKAGE__->has_many(
"managers_domains",
"My::Mailserver::Schema::Result::ManagersDomain",
{ "foreign.manager_id" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
=head2 recovery_codes
Type: has_many
Related object: L<My::Mailserver::Schema::Result::RecoveryCode>
=cut
__PACKAGE__->has_many(
"recovery_codes",
"My::Mailserver::Schema::Result::RecoveryCode",
{ "foreign.user_id" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
=head2 domains
Type: many_to_many
Composing rels: L</managers_domains> -> domain
=cut
__PACKAGE__->many_to_many("domains", "managers_domains", "domain");
# Created by DBIx::Class::Schema::Loader v0.07049 @ 2019-06-17 02:39:38
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:U24kyZS/j+9Gvs2gGlVBIw
__PACKAGE__->load_components('PassphraseColumn');
__PACKAGE__->add_columns(
'+password' => {
passphrase => 'crypt',
passphrase_class => 'BlowfishCrypt',
passphrase_args => {
salt_random => 1,
cost => 8,
},
passphrase_check_method => 'check_password',
},
);
sub new_recovery_code {
my $self = shift;
my $code;
my $max_tries = 10;
while (1) {
$code = eval {
$self->create_related('recovery_codes', {
code => _gen_code(),
});
};
warn $max_tries;
last if $code;
last unless $max_tries;
$max_tries--;
}
die "Error generating code" unless $code;
return $code;
}
use String::Random;
sub _gen_code {
my $gen = String::Random->new;
$gen->{'A'} = [@{$gen->{'C'}}, @{$gen->{'c'}}, @{$gen->{'n'}}];
return $gen->randpattern('A' x 64);
}
# You can replace this text with custom code or comments, and it will be preserved on regeneration
1;