File Coverage

blib/lib/SMS/Send/CZ/Neogate.pm
Criterion Covered Total %
statement 68 76 89.4
branch 3 8 37.5
condition 2 4 50.0
subroutine 15 15 100.0
pod 3 4 75.0
total 91 107 85.0


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package SMS::Send::CZ::Neogate;
4              
5             # ABSTRACT: SMS::Send driver for Neogate - Czech Republic
6              
7 2     2   14487 use warnings;
  2         3  
  2         73  
8 2     2   9 use strict;
  2         3  
  2         56  
9 2     2   7 use Carp;
  2         5  
  2         176  
10              
11             our $VERSION = "1.000";
12             $VERSION = eval $VERSION;
13              
14 2     2   1245 use LWP::UserAgent;
  2         72966  
  2         61  
15 2     2   14 use URI::Escape;
  2         3  
  2         119  
16 2     2   1723 use DateTime qw();
  2         180482  
  2         64  
17 2     2   13 use base 'SMS::Send::Driver';
  2         2  
  2         488  
18 2     2   252 use Digest::MD5 qw(md5 md5_hex);
  2         2  
  2         101  
19 2     2   775 use Log::LogLite;
  2         19229  
  2         52  
20 2     2   1024 use Data::Dumper;
  2         8771  
  2         114  
21 2     2   1336 use XML::Simple;
  2         11949  
  2         12  
22              
23             sub new {
24 1     1 1 58 my $class = shift;
25 1         2 my %params = @_;
26              
27 1         2 my $LOG_FILE = "/var/log/neogate.log";
28 1         1 my $ERROR_LOG_LEVEL = 6;
29              
30 1         242 open HANDLE, ">>$LOG_FILE";
31 1         7 close HANDLE;
32              
33             # Create our LWP::UserAgent object
34 1         9 my $ua = LWP::UserAgent->new;
35              
36             # Create the object, saving any private params for later
37 1         1974 my $dt = DateTime->now(time_zone => 'Europe/Prague');
38             my $self = bless {
39             ua => $ua,
40             login => $params{_login},
41             password => $params{_password},
42 1 50       8399 private => \%params,
43             stamp => $dt->strftime('%Y%m%dT%H%M%S'),
44             log => (-w $LOG_FILE) ? new Log::LogLite($LOG_FILE, $ERROR_LOG_LEVEL) : 0
45             }, $class;
46              
47 1         334 $self->log("Driver Neogate created", 4);
48            
49 1         233 $self;
50             }
51              
52             sub log {
53 2     2 0 15 my ($self, $msg, $level) = @_;
54              
55 2 50       16 if ($self->{'log'}) {
56 2         9 $self->{'log'}->write($msg, $level);
57             }
58             }
59              
60             sub get_salt {
61 1     1 1 2 my $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789:-';
62 1         1 my $len = length($chars);
63 1         1 my $salt = '';
64 1         30 for (my $i = 1; $i < (30 + int(rand(20))); $i++) { # 30-49 characters
65 30         46 $salt .= substr($chars, int(rand($len)), 1);
66             }
67            
68 1         22 return $salt;
69             }
70              
71             sub send_sms {
72 1     1 1 630 my ($self, %args) = @_;
73 1         382 my $url = 'https://api.smsbrana.cz/smsconnect/http.php';
74 1         6 my $salt = get_salt();
75              
76 1         4 my $rawtext = $self->{'password'} . $self->{'stamp'} . $salt;
77             #for debugging only
78             #$self->log("TEXT: " . $rawtext . ", MD5: " . md5_hex($rawtext));
79              
80             my %params = (
81             'number' => $args{'to'} || '',
82             'message' => $args{'text'} || '',
83             'login' => $self->{'login'},
84             'sul' => $salt,
85 1   50     16 'time' => $self->{'stamp'},
      50        
86             'hash' => md5_hex($rawtext),
87             'action' => 'send_sms'
88             );
89              
90             # cleanup
91 1         3 $params{'number'} =~ s{\D}{}g; # remove non-digits
92            
93             # send away
94 1         3 my $uri = join( '&', map { $_ . '=' . uri_escape_utf8( $params{ $_ } ) } keys %params );
  7         86  
95            
96 1         15 my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
97 1         154 $ua->protocols_allowed( ['https'] );
98              
99 1         14 my $x = $url . "?" . $uri;
100 1         4 my $res = $ua->get($url . "?" . $uri);
101              
102 1 50       8817 if( $res->is_success ) {
103 0         0 $self->log("HTTP SUCCESS: " . $x, 4);
104 0         0 my $parser = new XML::Simple;
105 0         0 my $data = $parser->XMLin($res->decoded_content);
106 0 0       0 if ($data->{'err'} == 0) {
107 0         0 $self->log("SMS #" . $data->{'sms_id'} . " sent, remaining credit: " . $data->{'credit'}, 4);
108              
109 0         0 return 1;
110             }
111             else {
112 0         0 $self->log("SMS processing error: " . $data->{'err'}, 4);
113 0         0 return 0;
114             }
115             }
116             else {
117 1         9 $self->log("HTTP error #" . $res->code() . ": " . $res->message(), 4);
118 1         205 return 0;
119             }
120             }
121              
122             __END__