From 91a5a9072f82cef110535917a4601f14ddd9fa31 Mon Sep 17 00:00:00 2001
From: Christian Pointner <equinox@spreadspace.org>
Date: Fri, 9 Oct 2015 02:16:02 +0200
Subject: improved sanity checks for dropbox params


diff --git a/lib/RHRD/rddb.pm b/lib/RHRD/rddb.pm
index 5bbc645..07e0f86 100755
--- a/lib/RHRD/rddb.pm
+++ b/lib/RHRD/rddb.pm
@@ -25,6 +25,7 @@ package RHRD::rddb;
 use strict;
 use Config::IniFiles;
 use DBI;
+use RHRD::utils;
 
 ###########################  constants  ###########################
 
@@ -854,7 +855,7 @@ sub get_dropboxes
     $entry->{'NORMLEVEL'} = int $normlevel;
     $entry->{'TRIMLEVEL'} = int $trimlevel;
     $entry->{'PARAM'} = $params;
-    if($p[0] eq "S") {
+    if(defined($p[0]) && $p[0] eq "S") {
       $entry->{'TYPE'} = 'show';
       $entry->{'SHOWID'} = $to_cart;
 
@@ -866,17 +867,21 @@ sub get_dropboxes
       $entry->{'SHOWLOG'} = $log;
 
       $entry->{'SHOWRHYTHM'} = $p[1];
-      $entry->{'SHOWDOW'} = int $p[2];
-      $entry->{'SHOWDOW'} = 0 unless $entry->{'SHOWDOW'} < 7;
-      substr($p[3], 2, 0) = ':';
+      $entry->{'SHOWRHYTHM'} = '????' unless((RHRD::utils::dropbox_param_rhythm_ok($entry->{'SHOWRHYTHM'}))[0]);
+      $entry->{'SHOWDOW'} = $p[2];
+      $entry->{'SHOWDOW'} = 0 unless((RHRD::utils::dropbox_param_dow_ok($entry->{'SHOWDOW'}))[0]);
       $entry->{'SHOWSTARTTIME'} = $p[3];
-      $entry->{'SHOWLEN'} = int $p[4];
-    } elsif($p[0] eq "J") {
+      $entry->{'SHOWSTARTTIME'} = '????' unless((RHRD::utils::dropbox_param_starttime_ok($entry->{'SHOWSTARTTIME'}))[0]);
+      $entry->{'SHOWLEN'} = $p[4];
+      $entry->{'SHOWLEN'} = 0 unless((RHRD::utils::dropbox_param_len_ok($entry->{'SHOWLEN'}))[0]);
+    } elsif(defined($p[0]) && $p[0] eq "J") {
       $entry->{'TYPE'} = 'jingle';
       $entry->{'JINGLETITLE'} = $groupdesc;
-    } elsif($p[0] eq "M") {
+    } elsif(defined($p[0]) && $p[0] eq "M") {
       $entry->{'TYPE'} = 'musicpool';
       $entry->{'MUSICPOOLTITLE'} = $groupdesc;
+    } else {
+      $entry->{'TYPE'} = 'unknown';
     }
 
     push @allowed_dbs, $entry;
diff --git a/lib/RHRD/utils.pm b/lib/RHRD/utils.pm
index 083f657..81e5f86 100755
--- a/lib/RHRD/utils.pm
+++ b/lib/RHRD/utils.pm
@@ -54,4 +54,62 @@ sub get_rd_week
   return $week;
 }
 
+use constant {
+  DB_PARAM_TYPE_HINT => "only S, M and J are allowed with S -> Show, M -> Musicpool, J -> Jingles",
+  DB_PARAM_RHYTHM_HINT => "only 0 or 1 are allowed, length must be exactly 4 and it must not be '0000'",
+  DB_PARAM_DOW_HINT => "must be between 1 and 7 (1=Monday, ..., 7=Sunday)",
+  DB_PARAM_STARTTIME_HINT => "must be in format HHMM (without seperator) in 24 hour format",
+  DB_PARAM_LEN_HINT => "must be a positive number below 1440",
+};
+
+sub dropbox_param_type_ok
+{
+  my ($type) = @_;
+
+  unless(defined($type) && ($type == 'S' || $type == 'M' || $type == 'J')) {
+    return (0, "unkown type '" . (defined($type) ? $type : 'undef') . "'", DB_PARAM_TYPE_HINT);
+  }
+  return (1, 'OK', DB_PARAM_TYPE_HINT);
+}
+
+sub dropbox_param_rhythm_ok
+{
+  my ($rhythm) = @_;
+
+  if(!defined($rhythm) || $rhythm !~ m/^[01]{4}$/ || $rhythm eq '0000') {
+    return (0, "rhythm '" . (defined($rhythm) ? $rhythm : 'undef') . "' contains illegal characters or is too long/short", DB_PARAM_RHYTHM_HINT);
+  }
+  return (1, 'OK', DB_PARAM_RHYTHM_HINT);
+}
+
+sub dropbox_param_dow_ok
+{
+  my ($dow) = @_;
+
+  if(!defined($dow) || $dow < 1 || $dow > 7) {
+    return (0, "dow '" . (defined($dow) ? $dow : 'undef') . "' is out of bounds", DB_PARAM_DOW_HINT);
+  }
+  return (1, 'OK', DB_PARAM_DOW_HINT);
+}
+
+sub dropbox_param_starttime_ok
+{
+  my ($starttime) = @_;
+
+  if(!defined($starttime) || $starttime !~ m/^[0-2][0-9][0-5][0-9]$/ || $starttime > 2359) {
+    return (0, "starttime '" . (defined($starttime) ? $starttime : 'undef') . "' is not a valid clock time", DB_PARAM_STARTTIME_HINT);
+  }
+  return (1, 'OK', DB_PARAM_STARTTIME_HINT);
+}
+
+sub dropbox_param_len_ok
+{
+  my ($len) = @_;
+
+  if(!defined($len) || $len <= 0 || $len > 1440) {
+    return (0, "len '" . (defined($len) ? $len : 'undef') . "' is out of bounds", DB_PARAM_LEN_HINT);
+  }
+  return (1, 'OK', DB_PARAM_LEN_HINT);
+}
+
 return 1;
diff --git a/utils/rhrd-sanity-check b/utils/rhrd-sanity-check
index 9dc5c43..93d933e 100755
--- a/utils/rhrd-sanity-check
+++ b/utils/rhrd-sanity-check
@@ -262,7 +262,20 @@ sub check_groups
 }
 
 
-sub check_logs
+sub check_dropboxes
+{
+  my ($ctx) = @_;
+
+  my $errors = 0;
+  print "dropboxes:\n";
+
+  print "\n " . $errors . " errors found\n";
+
+  return $errors;
+}
+
+
+sub check_showids
 {
   my ($ctx) = @_;
 
@@ -276,12 +289,12 @@ sub check_logs
 }
 
 
-sub check_dropboxes
+sub check_logs
 {
   my ($ctx) = @_;
 
-  my $errors = 0;
-  print "dropboxes:\n";
+  my $errors = 0,
+  print "logs:\n";
   print "  ... checks not yet implemtned!!\n";
 
   print "\n " . $errors . " errors found\n";
@@ -294,9 +307,11 @@ my ($ctx, $status, $errorstring) = RHRD::rddb::init();
 if(defined $ctx) {
   check_groups($ctx);
   print "\n";
-  check_logs($ctx);
-  print "\n";
   check_dropboxes($ctx);
+  print "\n";
+  check_showids($ctx);
+  print "\n";
+  check_logs($ctx);
 
   RHRD::rddb::destroy($ctx);
 } else {
diff --git a/utils/rhrd-show b/utils/rhrd-show
index 3431450..7cb8422 100755
--- a/utils/rhrd-show
+++ b/utils/rhrd-show
@@ -23,6 +23,7 @@
 use strict;
 use lib "../lib/";
 use RHRD::rddb;
+use RHRD::utils;
 
 # this is ridiculous but makes it a little harder to create/remove users...
 # if ($> != 0 ) {
@@ -90,24 +91,27 @@ sub add__check_arguments
     return 1;
   }
 
-  if($rhythm !~ m/^[01]{4}$/ || $rhythm eq '0000') {
-    print STDERR "rhythm '" . $rhythm . "' contains illegal characters or is too long/short\n";
-    print STDERR "  only 0 or 1 are allowed and, length must be exactly 4 and it must not be '0000'\n";
+  my ($result, $err, $hint) = RHRD::utils::dropbox_param_rhythm_ok($rhythm);
+  unless($result) {
+    print STDERR $err . "\n " . $hint . "\n";
     return 1;
   }
 
-  if($dow < 1 || $dow > 7) {
-    print STDERR "dow '" . $dow . "' is out of range, must be between 1 and 7 (1=Monday, ..., 7=Sunday)\n";
+  ($result, $err, $hint) = RHRD::utils::dropbox_param_dow_ok($dow);
+  unless($result) {
+    print STDERR $err . "\n " . $hint . "\n";
     return 1;
   }
 
-  if($starttime !~ m/^[0-2][0-9][0-5][0-9]$/ || $starttime > 2359) {
-    print STDERR "starttime '" . $starttime . "' is not a valid time must be HHMM\n";
+  ($result, $err, $hint) = RHRD::utils::dropbox_param_starttime_ok($starttime);
+  unless($result) {
+    print STDERR $err . "\n " . $hint . "\n";
     return 1;
   }
 
-  if($len <= 0) {
-    print STDERR "len '" . $len . "' must be > 0\n";
+  ($result, $err, $hint) = RHRD::utils::dropbox_param_len_ok($len);
+  unless($result) {
+    print STDERR $err . "\n " . $hint . "\n";
     return 1;
   }
 
-- 
cgit v0.10.2