The Poor Man's (or Woman's) Intrusion Detection System
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

miniini.cpp 3.4 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //////////////////////////////////////////////////////////////////////
  2. // Mini INI File Crackers
  3. // Written by Jonathan A. Foster <jon@jfpossibilities.com>
  4. // Started June 1st, 2021
  5. // Copyright JF Possibilities, Inc. All rights reserved.
  6. // Used with permission in the "Poor Man's IDS" project
  7. //////////////////////////////////////////////////////////////////////
  8. #include <stdlib.h>
  9. #include <fstream>
  10. #include <stdexcept>
  11. #include "miniini.h"
  12. //////////////////////////////////////////////////////////////////////
  13. // MiniINIvars
  14. //////////////////////////////////////////////////////////////////////
  15. std::string MiniINIvars::get(const std::string &name, const std::string &def) {
  16. NameVal::iterator v = vals.find(name);
  17. if(v!=vals.end()) return v->second;
  18. vals[name]=def;
  19. return def;
  20. }
  21. std::string MiniINIvars::get(const std::string &name) const {
  22. NameVal::const_iterator v = vals.find(name);
  23. return v!=vals.end() ? v->second : "";
  24. }
  25. // TODO: come up with better range checking to allow full range of 32bit ints.
  26. int MiniINIvars::geti(const std::string &name, int def, int min, int max) const {
  27. int r;
  28. NameVal::const_iterator v = vals.find(name);
  29. if(v!=vals.end()) {
  30. const std::string &s = v->second;
  31. if(s!="" && s.size()<=9+(s[0]=='+' || s[0]=='-')) {
  32. r = atoi(s.c_str());
  33. if(r>=min && r<=max) return r;
  34. }
  35. }
  36. return def;
  37. }
  38. void MiniINIvars::add(const std::string &in) {
  39. std::string s = trim(in);
  40. std::string::size_type i;
  41. if(s=="" or s[0]=='#' or s[0]==';') return; // NOP
  42. i = s.find('=');
  43. if(i==s.npos || i==0) throw std::runtime_error(
  44. "MiniINIvars.add: incorrectly formatted name / value pair");
  45. // TODO: catch dupe vars?
  46. vals[trim(s.substr(0, i-1))] = trim(s.substr(i+1));
  47. }
  48. std::ostream &MiniINIvars::save(std::ostream &out) const {
  49. NameVal::const_iterator var;
  50. for(var = vals.begin(); var!=vals.end(); var++)
  51. out << var->first << " = " << var->second << '\n';
  52. return out;
  53. }
  54. //////////////////////////////////////////////////////////////////////
  55. // MiniINIlines
  56. //////////////////////////////////////////////////////////////////////
  57. void MiniINIlines::add(const std::string &in) {
  58. vals.push_back(in);
  59. }
  60. std::ostream &MiniINIlines::save(std::ostream &out) const {
  61. StringList::const_iterator val;
  62. for(val = vals.begin(); val!=vals.end(); val++) out << *val << '\n';
  63. return out;
  64. }
  65. //////////////////////////////////////////////////////////////////////
  66. // MiniINI
  67. //////////////////////////////////////////////////////////////////////
  68. void MiniINI::load(const std::string &fname) {
  69. std::string l;
  70. std::string gname;
  71. MiniINIgroup *group = 0;
  72. std::ifstream f(fname.c_str());
  73. INIgroupList::iterator gmap;
  74. int ln=0;
  75. while(std::getline(f, l)) {
  76. ln++;
  77. gname = trim(l);
  78. if(gname.size()>2 && gname[0]=='[' && gname.end()[-1]==']') {
  79. gname = gname.substr(1, gname.size()-2);
  80. group = (gmap = groups.find(gname))==groups.end() ? 0 : gmap->second;
  81. continue;
  82. }
  83. try {
  84. if(group) group->add(l);
  85. } catch(const std::exception &e) {
  86. throw std::runtime_error("Error parsing "+fname+" line "+str(ln)+
  87. " "+e.what());
  88. }
  89. }
  90. }
  91. void MiniINI::save(const std::string &fname) {
  92. std::ofstream f(fname.c_str());
  93. INIgroupList::iterator group;
  94. for(group = groups.begin(); group!=groups.end(); group++) {
  95. f << '[' << group->first << "]\n";
  96. f << *group->second << '\n';
  97. }
  98. }