Perl
77 lines · 1,825 bytes
package LibreAuth;
use strict;
use warnings;
use LWP::UserAgent;
use JSON qw(decode_json encode_json);
use Digest::MD5 qw(md5_hex);
sub new {
my ($class, $name, $ownerid, $version, $url) = @_;
$url =~ s{/$}{};
return bless {
name => $name,
ownerid => $ownerid,
version => $version,
url => $url . '/',
sessionid => '',
enckey => '',
hash => '',
ua => LWP::UserAgent->new(timeout => 30),
}, $class;
}
sub init {
my ($self, $enckey) = @_;
$enckey //= substr(md5_hex(rand()), 0, 35);
$self->{enckey} = substr($enckey, 0, 35);
my $res = $self->_req({
type => 'init',
ver => $self->{version},
enckey => $self->{enckey},
hash => $self->{hash},
});
die $res->{message} unless $res->{success};
$self->{sessionid} = $res->{sessionid};
return $res;
}
sub login {
my ($self, $user, $pass, $hwid) = @_;
$hwid //= '';
return $self->_auth({
type => 'login',
username => $user,
pass => $pass,
hwid => $hwid,
});
}
sub license {
my ($self, $key, $hwid) = @_;
$hwid //= '';
return $self->_auth({
type => 'license',
key => $key,
hwid => $hwid,
});
}
sub _auth {
my ($self, $extra) = @_;
my $res = $self->_req($extra);
die $res->{message} unless $res->{success};
return $res->{info} // $res;
}
sub _req {
my ($self, $extra) = @_;
my %data = (%{$extra}, name => $self->{name}, ownerid => $self->{ownerid});
$data{sessionid} = $self->{sessionid} if $self->{sessionid};
my $res = $self->{ua}->post($self->{url}, \%data);
die 'Rate limited' if $res->code == 429;
return decode_json($res->decoded_content);
}
1;