package Gitprep::API; use Mojo::Base -base; use Digest::MD5 'md5_hex'; has 'cntl'; sub get_user_row_id { my ($self, $user_id) = @_; my $user_row_id = $self->app->dbi->model('user')->select('row_id', where => {id => $user_id})->value; return $user_row_id; } sub get_project_row_id { my ($self, $user_id, $project_id) = @_; my $user_row_id = $self->app->dbi->model('user')->select('row_id', where => {id => $user_id})->value; my $project_row_id = $self->app->dbi->model('project')->model('project')->select( 'row_id', where => {user => $user_row_id, id => $project_id} )->value; return $project_row_id; } sub app { shift->cntl->app } sub encrypt_password { my ($self, $password) = @_; my $salt; $salt .= int(rand 10) for (1 .. 40); my $password_encryped = md5_hex md5_hex "$salt$password"; return ($password_encryped, $salt); } sub check_password { my ($self, $password, $salt, $password_encrypted) = @_; return unless defined $password && $salt && $password_encrypted; return md5_hex(md5_hex "$salt$password") eq $password_encrypted; } sub check_user_and_password { my ($self, $user, $password) = @_; my $row = $self->app->dbi->model('user')->select(['password', 'salt'], id => $user)->one; return unless $row; my $is_valid = $self->check_password( $password, $row->{salt}, $row->{password} ); return $is_valid; } sub is_collaborator { my ($self, $user_id, $project_id, $collaborator_id) = @_; my $user_row_id = $self->get_user_row_id($user_id); my $project_row_id = $self->app->dbi->model('project')->select( where => {user => $user_row_id, id => $project_id} )->value; my $collaborator_row_id = $self->get_user_row_id($collaborator_id); my $row = $self->app->dbi->model('collaboration')->select( where => {project => $project_row_id, collaborator => $collaborator_row_id} )->one; return $row ? 1 : 0; } sub can_access_private_project { my ($self, $user_id, $project_id) = @_; my $session_user_row_id = $self->cntl->session('user_row_id'); my $session_user_id = $self->app->dbi->model('user')->select( 'id', where => {row_id => $session_user_row_id} )->value; my $is_valid = ($user_id eq $session_user_id || $self->is_collaborator($user_id, $project_id, $session_user_id)) && $self->logined; return $is_valid; } sub new { my ($class, $cntl) = @_; my $self = $class->SUPER::new(cntl => $cntl); return $self; } sub logined_admin { my $self = shift; # Controler my $c = $self->cntl; # Check logined as admin my $session_user_id = $self->session_user_id; return $self->app->manager->is_admin($session_user_id) && $self->logined($session_user_id); } sub session_user_id { my $self = shift; my $session_user_row_id = $self->cntl->session('user_row_id'); my $session_user_id = $self->app->dbi->model('user')->select( 'id', where => {row_id => $session_user_row_id} )->value; return $session_user_id; } sub logined { my ($self, $user_id) = @_; my $c = $self->cntl; my $dbi = $c->app->dbi; my $session_user_row_id = $c->session('user_row_id'); my $session_user_id = $self->session_user_id; my $password = $c->session('password'); return unless defined $password; my $correct_password = $dbi->model('user')->select( 'password', where => {row_id => $session_user_row_id} )->value; return unless defined $correct_password; my $logined; if (defined $user_id) { $logined = $user_id eq $session_user_id && $password eq $correct_password; } else { $logined = $password eq $correct_password } return $logined; } sub params { my $self = shift; my $c = $self->cntl; my %params; for my $name ($c->param) { my @values = $c->param($name); if (@values > 1) { $params{$name} = \@values; } elsif (@values) { $params{$name} = $values[0]; } } return \%params; } 1;