Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions door_control.conf
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
{
pg => 'postgresql://doorcontrol:doorcontrol@/doorcontrol',
unlock_url => 'theofficialjosh.com/test',
lock_url => 'theofficialjosh.com/test',
};
44 changes: 31 additions & 13 deletions lib/DoorControl.pm
Original file line number Diff line number Diff line change
@@ -1,24 +1,40 @@
package DoorControl;
use Mojo::Base 'Mojolicious';

use Mojo::IOLoop;

use Mojo::UserAgent;
use Mojo::Pg;
use HTTP::Request;
use LWP::UserAgent;
use Date::Manip;

use DoorControl::Model::DoorControl;
use DoorControl::Model::Authenticate;
use DoorControl::Model::Log;
use DoorControl::Model::Register;

use constant INTERNAL => qr/^127\.|^(172\.16\.254\.\d{1,3})$/;
use constant FULL_AUTHORIZATION => 1;
use constant LIMITED_AUTHORIZATION => 2;

# This method will run once at server start
sub startup {
my $self = shift;

push @{$self->commands->namespaces}, 'DoorControl::Command';

$self->plugin('browser_detect');

my $config = $self->plugin('Config');
#exit unless necessary ulrs are defined in config
#die "no access";

$self->helper('unlock_url' =>{config => $self->config->{unlock_url}});
$self->helper('lock_url' =>{config => $self->config->{lock_url}});

Date_Init('WorkDayBeg = 07:00', 'WorkDayEnd = 18:00');

$self->helper(internal => sub { shift->tx->remote_address=~INTERNAL?1:0 });
$self->helper(pg => sub {state $pg = Mojo::Pg->new(shift->config('pg')) });
$self->helper(doorcontrol => sub { state $doorcontrol = DoorControl::Model::DoorControl->new(FULL_AUTHORIZATION => FULL_AUTHORIZATION, unlock_url => @_[0]->config('unlock_url'), lock_url => @_[0]->config('lock_url')) });
$self->helper(authenticate => sub { state $authenticate = DoorControl::Model::Authenticate->new(pg => shift->pg) });
$self->helper(logger => sub { state $log = DoorControl::Model::Log->new(pg => shift->pg) });
$self->helper(register => sub { state $register = DoorControl::Model::Register->new(pg => shift->pg) });

$self->sessions->default_expiration(86400*365*10);

Expand All @@ -30,14 +46,16 @@ sub startup {

# Normal route to controller
$r->get('/')->to('DoorControl#init');
$r->get('/forget')->to('DoorControl#forget');
$r->get('/log/:count')->to('DoorControl#log');
$r->get('/register')->to('Register#index');
$r->get('/forget')->to('DoorControl#forget')->name('forget');
$r->get('/log/:count')->to('DoorControl#log')->name('log');
$r->get('/register')->to('Register#index')->name('register');
$r->get('/register/badges')->to('Register#badges')->name('badges');

$r->post('/unlock')->to('DoorControl#unlock');
$r->post('/lock')->to("DoorControl#lock");
$r->post('/register/signin')->to('Register#signin');
$r->post('/register/adduser')->to('Register#adduser');
$r->post('/unlock')->to('DoorControl#unlock')->name('unlock');
$r->post('/lock')->to("DoorControl#lock")->name('lock');
$r->post('/register/signin')->to('Register#signin')->name('signin');
$r->post('/register/adduser')->to('Register#adduser')->name('adduser');
$r->post('/register/addbadge')->to('Register#addbadge')->name('addbadge');
}

1;
29 changes: 29 additions & 0 deletions lib/DoorControl/Command/getty.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package DoorControl::Command::getty;
use Mojo::Base 'Mojolicious::Command';
use Date::Manip;
use Mojo::UserAgent;

has description => 'Show versions of available modules';
has usage => sub { shift->extract_usage };

sub run {
my $self = shift;

while(1) {
my $userinput = <STDIN>;
my $results = "FAILED";
chomp ($userinput);

my $user = $self->app->authenticate->authenticateBadge($userinput);

$results = $self->app->doorcontrol->unlock($user->{authorized}, 0) ? "SUCCESS" : "FAILED";

if(defined $user->{name}) {
$userinput = $user->{name};
}

$self->app->logger->log($userinput, "unlock", $results, "badge");
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use the Model.

}

1;
33 changes: 11 additions & 22 deletions lib/DoorControl/Controller/DoorControl.pm
Original file line number Diff line number Diff line change
Expand Up @@ -16,53 +16,42 @@ sub unlock {
my $pin = $self->param('pin');
my $remember = $self->param('remember');

my $unlockResults = "FAILED";
my $results = "FAILED";
my $response->{response} = 0;

my $results = eval {
$self->pg->db->query("select * from users where name = ? and pin = ?", $name, $pin)->hash;
};
my $authorized = $self->authenticate->authenticateUser($name, $pin);

my $response->{result} = 0;
$response->{response} = $self->doorcontrol->unlock($authorized, $self->internal);

if($results->{authorized} == 1) {
$response->{result} = 1;
my $req = HTTP::Request->new(GET => "http://theofficialjosh.com/test");
my $ua = LWP::UserAgent->new;
$response->{response} = $ua->request($req)->as_string;
if($response->{response} == 1) {
$results = "SUCCESS";

if($remember) {
$self->session->{pin} = $pin;
$self->session->{name} = $name;
}
$unlockResults = "SUCCESS";
}

$self->pg->db->query("insert into log (name, action, result) values (?, 'unlock', ?);", $name, $unlockResults);
$self->logger->log($name, 'unlock', $results, 'website');

$self->render(json => $response);
}

sub lock {
my $self = shift;
#locks the door, maybe happens automatically after unlocking it?
my $req = HTTP::Request->new(GET => "http://theofficialjosh.com/test");
my $ua = LWP::UserAgent->new;
$ua->request($req)->as_string;
my $response->{response} = $self->doorcontrol->lock();

my $response->{response} = 1;

$self->pg->db->query("insert into log (name, action, result) values ('door', 'lock', 'SUCCESS');");
$self->logger->log("Door", "Lock", $response->{response} ? 'SUCCESS' : 'FAILED', "website");

$self->render(json => $response);
}

sub log {
my $self = shift;
my $limit = $self->param('count');
my $results = eval {
$self->pg->db->query("select id, action, result, name, created from log order by created desc limit ?;", $limit)->hashes->to_array;
};

my $results = $self->logger->getLog($limit);

$self->stash(logs => $results);

$self->render(template => 'DoorControl/log', format => 'html', handler => 'ep');
Expand Down
56 changes: 48 additions & 8 deletions lib/DoorControl/Controller/Register.pm
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,9 @@ sub signin {

my $response->{results} = 0;

my $results = eval {
$self->pg->db->query("select * from users where name = ? and pin = ?;", $name, $pin)->hash;
};
my $authorized = $self->authenticate->authenticateUser($name, $pin);

if($results->{authorized} == 1) {
if($authorized == DoorControl::FULL_AUTHORIZATION) {
$response->{results} = 1;
};

Expand All @@ -33,16 +31,58 @@ sub adduser {
my $pin = $self->param('pin');
my $newName = $self->param('newName');
my $newPin = $self->param('newPin');
my $auth = $self->param('auth');

my $response->{results} = 0;

my $results = eval {
$self->pg->db->query("select * from users where name = ? and pin = ?;", $name, $pin)->hash;
my $authorized = $self->authenticate->authenticateUser($name, $pin);

if($authorized == DoorControl::FULL_AUTHORIZATION) {
$response->{results} = 1;
$self->register->insertUser($newName, $newPin, $auth);
};

$self->render(json => $response);
}

sub badges {
my $self = shift;

my $name = $self->param('name');
my $pin = $self->param('pin');
my $start = $self->param('start');
my $end = $self->param('end');

my $authorized = $self->authenticate->authenticateUser($name, $pin);

my $results;

if($authorized == DoorControl::FULL_AUTHORIZATION) {
$results = eval {
$self->register->getBadges($start, $end);
};
};

if($results->{authorized} == 1) {
$self->render(json => $results);
}

sub addbadge {
my $self = shift;

my $name = $self->param('name');
my $pin = $self->param('pin');
my $badge = $self->param('badge');
my $newName = $self->param('newName');
my $auth = $self->param('auth');

my $response->{results} = 0;

my $authorized = $self->authenticate->authenticateUser($name, $pin);

if($authorized == DoorControl::FULL_AUTHORIZATION) {
$response->{results} = 1;
$self->pg->db->query("insert into users (name, pin, authorized) values (?, ?, 1);", $newName, $newPin);
$self->register->deleteBadge($badge);
$self->register->insertBadge($badge, $newName, $auth);
};

$self->render(json => $response);
Expand Down
22 changes: 22 additions & 0 deletions lib/DoorControl/Model/Authenticate.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package DoorControl::Model::Authenticate;
use Mojo::Base -base;

has 'pg';

sub authenticateUser {
my ($self, $name, $pin) = @_;

my $user = $self->pg->db->query("select * from users where name = ? and pin = ?", $name, $pin)->hash;

return $user->{authorized};
}

sub authenticateBadge {
my ($self, $badge) = @_;

my $user = $self->pg->db->query("select * from badges where badge_id = ?;", $badge)->hash;

return $user;
}

1;
35 changes: 35 additions & 0 deletions lib/DoorControl/Model/DoorControl.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package DoorControl::Model::DoorControl;
use Mojo::Base -base;

use Date::Manip;

has 'FULL_AUTHORIZATION';
has 'LIMITED_AUTHORIZATION';
has 'unlock_url';
has 'lock_url';

sub unlock {
my ($self, $authorized, $internal) = @_;

my $results = 0;

if($authorized == $self->FULL_AUTHORIZATION || $internal || ($authorized == $self->LIMITED_AUTHORIZATION && Date_IsWorkDay(ParseDate('now'), 1))) {
my $ua = Mojo::UserAgent->new;
$results = $ua->get($self->unlock_url)->res->code == 200 ? 1 : 0;
}

return $results;
}

sub lock {
my ($self) = @_;

my $results = 0;

my $ua = Mojo::UserAgent->new;
$results = $ua->get($self->lock_url)->res->code == 200 ? 1 : 0;

return $results;
}

1;
20 changes: 20 additions & 0 deletions lib/DoorControl/Model/Log.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package DoorControl::Model::Log;
use Mojo::Base -base;

has 'pg';

sub log {
my ($self, $name, $action, $results, $method) = @_;

$self->pg->db->query("insert into log (name, action, result, method) values (?, ?, ?, ?);", $name, $action, $results, $method);

return 1;
}

sub getLog {
my ($self, $limit) = @_;

return $self->pg->db->query("select id, action, method, result, name, created from log order by created desc limit ?;", $limit)->hashes->to_array;
}

1;
39 changes: 39 additions & 0 deletions lib/DoorControl/Model/Register.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package DoorControl::Model::Register;
use Mojo::Base -base;

has 'pg';

sub insertUser {
my ($self, $newName, $newPin, $auth) = @_;

$self->pg->db->query("insert into users (name, pin, authorized) values (?, ?, ?);", $newName, $newPin, $auth);

return 1;
}

sub getBadges {
my ($self, $start, $end) = @_;

$self->pg->db->query("select * from badges where badge_id >= ? and badge_id <= ?", $start, $end)->hashes->to_array;

}

sub deleteBadge {
my ($self, $badge) = @_;

$self->pg->db->query("delete from badges where badge_id = ?", $badge);

return 1;
}



sub insertBadge {
my ($self, $badge, $newName, $auth) = @_;

$self->pg->db->query("insert into badges (badge_id, name, authorized) values (?, ?, ?);", $badge, $newName, $auth);

return 1;
}

1;
Loading