LibreAuth SDK Docs
Nut.exe
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;