## bin/dbupdate/dbupdate.cc

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. error_init
2. process_object
3. process_file
4. generate_upd_file
5. main

       1 /***************************************
       2   $Revision: 1.18 $
       3
       4   DBupdate
       5
       6   Status: NOT REVIEWED, NOT TESTED
       7
       8   Author(s):       Engin Gunduz
       9
      10   ******************/ /******************
      11   Modification History:
      12         engin (01/03/2000) Created.
      13   ******************/ /******************
      14   Copyright (c) 2000                              RIPE NCC
      15
      16   All Rights Reserved
      17
      18   Permission to use, copy, modify, and distribute this software and its
      19   documentation for any purpose and without fee is hereby granted,
      20   provided that the above copyright notice appear in all copies and that
      21   both that copyright notice and this permission notice appear in
      22   supporting documentation, and that the name of the author not be
      23   used in advertising or publicity pertaining to distribution of the
      24   software without specific, written prior permission.
      25
      26   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
      27   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
      28   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
      29   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
      30   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      31   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      32  ***************************************/
      33
      34
      35
      36
      37
      38 #include "dbupdate.h"
      39 #include "erroutines.h"
      40 #include "ca_configFns.h"
      41 #include "ca_dictSyms.h"
      42 #include "ca_macros.h"
      43 #include "ca_srcAttribs.h"
      44 #include "notification.h"
      45
      46 int tracing = 0;
      47 int test_mode = 0;
      48 int reading_from_mail = 0;
      49
      50 /* required configuration variables */
      51 char *tmpdir = NULL;
      52 char *mailcmd = NULL;
      53 char *notitxt = NULL;
      54 char *notimailtxt = NULL;
      55 char *fwtxt   = NULL;
      56 char *fwmailtxt = NULL;
      57 char *mailtxt = NULL;
      58 char *notiflog = NULL;
      59 char *crosslog = NULL;
      60 char *acklog = NULL;
      61 char *forwlog = NULL;
      62 char *humailbox = NULL;
      63 char *overridecryptedpw = NULL;
      64 int * testmode = NULL;
      65 /* end of config variables */
      66
      67 void error_init(int argc, char ** argv) {
         /* [<][>][^][v][top][bottom][index][help] */
      68   er_path_t erlogstr;
      69
      70   ER_init(argc, argv);
      71
      72   erlogstr.fdes = stderr;
      73   erlogstr.asp  = 0;
      74   erlogstr.sev  = ER_SEV_W;
      75   erlogstr.mode = ER_M_SEVCHAR | ER_M_TEXTLONG;
      76
      77   ER_setpath(& erlogstr);
      78
      79 } /* error_init() */
      80
      81
      82
      83 /* Checks the object's syntax, retrives the old version of it from the db,
      84    and checks auth2. If everything is OK, then sends it to RIPdb, where referential
      85    integrity is checked, and the object is really committed to the db.
      86
      87      Arguments:
      88         char * arg: The object,
      89         credentials_struct credentials: The struct containing the credentials, such as
      90           'From:' field of the e-mail update,
      91         GHashTable * NIC_hdl_hash: A hash containing
      92         char * ack_file_name:  The file name, to be used to store ACK message
      93 */
      94
      95
      96
      97 int process_object(char * arg, credentials_struct credentials, GHashTable * NIC_hdl_hash, char * ack_file_name,
         /* [<][>][^][v][top][bottom][index][help] */
      98                    GHashTable * ntfy_hash, GHashTable * forw_hash, GHashTable * cross_hash){
      99     bool code = true;
     100     Object *o;
     101     char * old_version = NULL;
     102     o = new Object;
     103     int result = 0;
     104     int result_from_RIPupd = 0;
     105     char * auto_nic = NULL;
     106     char * changed_obj = NULL;
     107     char * obj_with_AUTO_NIC_hdl;
     108     char * assigned_NIC;
     109
     110     char * value = NULL;/* these two are for */
     111     Attr * attr;        /* ack messages only */
     112
     113     if(has_ref_to_AUTO_nic_hdl(arg)){/* if this object has refs to AUTO NIC hdls*/
     114        /* then first replace AUTO NIC hdls with assigned NIC hdls (in NIC_hdl_hash) */
     115        if((arg = replace_refs_to_AUTO_NIC_hdl(changed_obj, arg, NIC_hdl_hash)) == NULL){
     116          return UP_ANE; /* AUTO NIC hdl error */
     117        };
     118     }
     119
     120     code = o->scan(arg,strlen(arg));
     121     if(code){
     122       /* is the object to be deleted? */
     123       if(o->isDeleted){
     124         //printf("DEBUG: This object is to be deleted\n");
     125         old_version = get_old_version(arg);
     126         if(old_version == NULL){ /* the object doesn't exist in the db! */
     127           AK_add_to_ack(ack_file_name, "\nDelete FAILED: [%s] %s\nEntry not found\n\n%s\n",
     128                         o->type->getName(), get_search_key(o, o->type->getName(), arg), arg);
     129           return UP_NSO; /* no such object */
     130         }else {/* the object is in the db */
     131           if(identical(old_version, arg)){/* if the old & new versions are identical */
     132             result = check_auth(NULL, old_version, o->type->getName(), credentials);
     133             if(result == UP_AUTH_OK){
     134               if(tracing) {
     135                 printf("TRACING: Will send the obj to be deleted\n");
     136               }
     137               result_from_RIPupd = send_object_db(arg, NULL, "DEL");
     138               if(result_from_RIPupd == 0){
     139                 AK_add_to_ack(ack_file_name, "\nDelete OK: [%s] %s\n",
     140                               o->type->getName(), get_search_key(o, o->type->getName(), arg));
     141                 NT_write_all_ntfs(arg, NULL, tmpdir, ntfy_hash, forw_hash, cross_hash, credentials.from);
     142               }else{
     143                 AK_add_to_ack(ack_file_name, "\nDelete FAILED: [%s] %s\nReferential intergrity failure\n",
     144                               o->type->getName(), get_search_key(o, o->type->getName(), arg));
     145               }
     146               result_from_RIPupd = 0;
     147             }else{ /* auth failed */
     148               if(tracing) {
     149                 printf("TRACING: Auth failed\n");
     150               }
     151
     152               AK_add_to_ack(ack_file_name, "\nDelete FAILED: [%s] %s\nAuth failed\n",
     153                             o->type->getName(), get_search_key(o, o->type->getName(), arg));
     154               NT_write_all_frwds(arg, NULL, tmpdir, ntfy_hash, forw_hash, cross_hash, credentials.from);
     155               return UP_AUF; /* Auth failed */
     156             }
     157           }else{/* the new & old versions do not match */
     158             AK_add_to_ack(ack_file_name, "\nDelete FAILED: new & old versions do not match\n");
     159             return UP_NOM; /* new & old versions do not match */
     160           }
     161         }
     162       }else {/* the object is _not_ to be deleted */
     163         if(has_AUTO_NIC_hdl(arg)){/* it the object has an AUTO NIC hdl */
     164           /* then its nic-hdl attribute must be modified so that RIPupdate
     165              would understand that it must assign a NIC handle to it */
     166           /* but first check the auth */
     167           result = check_auth(arg, NULL, o->type->getName(), credentials);
     168           if(result == UP_AUTH_OK){
     169             if(tracing) {
     170                 printf("TRACING: Will send the obj to be created with AUTO NIC hdl\n");
     171             }
     172             auto_nic = (char *)malloc(1024); /* should be enough for a NIC hdl */
     173             obj_with_AUTO_NIC_hdl = replace_AUTO_NIC_hdl(arg, auto_nic);
     174             if(tracing) {
     175               printf("TRACING:  Called replace_AUTO_NIC_hdl, get [%s]\n", obj_with_AUTO_NIC_hdl);
     176               printf("TRACING: Will send the obj to be added\n");
     177             }
     178             assigned_NIC = (char *)malloc(128); /* this should be enough for a NIC hdl */
     179             result_from_RIPupd = send_object_db(obj_with_AUTO_NIC_hdl, assigned_NIC, "ADD");
     180             if(result_from_RIPupd == 0){
     181               AK_add_to_ack(ack_file_name, "\nNew OK: [%s] %s\n",
     182                             o->type->getName(), assigned_NIC);
     183               NT_write_all_ntfs(NULL, arg, tmpdir, ntfy_hash, forw_hash, cross_hash, credentials.from);
     184             }else{
     185               AK_add_to_ack(ack_file_name, "\nNew FAILED: [%s] %s\nReferential integrity failure\n",
     186                             o->type->getName(), arg);
     187             }
     188             result_from_RIPupd = 0;
     189             if(tracing && assigned_NIC != NULL) {
     190               printf("TRACING: send_object_db returned [%s] as assigned NIC hdl\n", assigned_NIC);
     191             }
     192             if(assigned_NIC != NULL){
     193               printf("DEBUG: auto_nic=[%s], assigned_NIC=[%s]\n", auto_nic, assigned_NIC);
     194               g_hash_table_insert(NIC_hdl_hash, auto_nic, assigned_NIC);
     195               printf("DEBUG: NIC_hdl_hash has %i pairs\n",g_hash_table_size(NIC_hdl_hash));
     196             }
     197
     198           }else{
     199             /* auth failed ! */
     200             if(tracing) {
     201               printf("TRACING: Auth failed\n");
     202             }
     203
     204             ER_perror(0, result, "");
     205             AK_add_to_ack(ack_file_name, "\nNew FAILED: [%s] %s\nAuth failed\n",
     206                           o->type->getName(), get_search_key(o, o->type->getName(), arg));
     207             NT_write_all_frwds(NULL, arg, tmpdir, ntfy_hash, forw_hash, cross_hash, credentials.from);
     208             return UP_AUF; /* Auth failed */
     209           }
     210         }
     211         else{
     212           old_version = get_old_version(arg);
     213           if(old_version != NULL){/* so, this is an update operation */
     214             result = check_auth(arg, old_version, o->type->getName(), credentials);
     215             if(result == UP_AUTH_OK){
     216               if(tracing) {
     217                 printf("TRACING: Will send the obj to be updated\n");
     218               }
     219               result_from_RIPupd = send_object_db(arg, NULL, "UPD");
     220               if(result_from_RIPupd == 0){
     221                 AK_add_to_ack(ack_file_name, "\nUpdate OK: [%s] %s\n",
     222                               o->type->getName(), get_search_key(o, o->type->getName(), arg));
     223                 NT_write_all_ntfs(old_version, arg, tmpdir, ntfy_hash, forw_hash, cross_hash, credentials.from);
     224               }else{
     225                 AK_add_to_ack(ack_file_name, "\nUpdate FAILED: [%s]\n%s\nReferential integrity failure\n",
     226                               o->type->getName(), get_search_key(o, o->type->getName(), arg));
     227               }
     228               result_from_RIPupd = 0;
     229             }else{
     230               /* auth failed ! */
     231               if(tracing) {
     232                 printf("TRACING: Auth failed\n");
     233               }
     234
     235               AK_add_to_ack(ack_file_name, "\nUpdate FAILED: [%s] %s\nAuth failed\n",
     236                             o->type->getName(), get_search_key(o, o->type->getName(), arg));
     237               NT_write_all_frwds(old_version, arg, tmpdir, ntfy_hash, forw_hash, cross_hash, credentials.from);
     238               return UP_AUF; /* Auth failed */
     239             }
     240           }else { /* old_version  == NULL, so, creation */
     241             result = check_auth(arg, NULL, o->type->getName(), credentials);
     242             if(result == UP_AUTH_OK){
     243               if(tracing) {
     244                 printf("TRACING: Will send the obj to be added\n");
     245               }
     246               result_from_RIPupd = send_object_db(arg, NULL, "ADD");
     247               if(result_from_RIPupd == 0){
     248                 AK_add_to_ack(ack_file_name, "\nNew OK [%s] %s\n",
     249                               o->type->getName(), get_search_key(o, o->type->getName(), arg));
     250                 NT_write_all_ntfs(NULL, arg, tmpdir, ntfy_hash, forw_hash, cross_hash, credentials.from);
     251
     252               }else{
     253                 AK_add_to_ack(ack_file_name, "\nNew FAILED: [%s] %s\nReferential integrity failure\n",
     254                               o->type->getName(), get_search_key(o, o->type->getName(), arg));
     255               }
     256               result_from_RIPupd = 0;
     257             }else{
     258               /* auth failed ! */
     259               if(tracing) {
     260                 printf("TRACING: Auth failed\n");
     261               }
     262
     263               ER_perror(0, result, "");
     264               AK_add_to_ack(ack_file_name, "\nNew FAILED: [%s] %s\nAuth failed\n",
     265                             o->type->getName(), get_search_key(o, o->type->getName(), arg));
     266               NT_write_all_frwds(NULL, arg, tmpdir, ntfy_hash, forw_hash, cross_hash, credentials.from);
     267               return UP_AUF; /* Auth failed */
     268             }
     269           }
     270         }
     271       }
     272     }else{/* even if obj doesn't parse properly, it may be a legacy object
     273             which the user wants to delete... */
     274        if(tracing){
     275          printf("TRACING: Object didn't parse\n");
     276        }
     277        AK_add_to_ack(ack_file_name, "\nUpdate FAILED: Syntax error in object\n");
     278        //////////////////////////////////
     279        if(o->attrs.head() != NULL){
     280          for(attr = o->attrs.head(); attr; attr = o->attrs.next(attr)){
     281            if(attr->len > 0){
     282              value = (char*)malloc(attr->len);
     283              strncpy(value, (char *)(arg+attr->offset) ,
     284                attr->len - 1);
     285              value[attr->len - 1] = '\0';
     286              AK_add_to_ack(ack_file_name, "%s\n", value);
     287              if(!attr->errors.empty()){
     288                AK_add_to_ack_string(ack_file_name, attr->errors);
     289              }
     290              free(value);
     291            }else{
     292              if(!attr->errors.empty()){
     293                AK_add_to_ack_string(ack_file_name, attr->errors);
     294              }
     295            }
     296          }
     297        }
     298        if(o->has_error){
     299          AK_add_to_ack_string(ack_file_name, o->errors);
     300        }
     301        //////////////////////////////////
     302        return UP_NIY; /* Not implemented yet */
     303     }
     304 }
     305
     306
     307
     308
     309
     310
     311
     312
     313 /* processes the objects in the given file */
     314 void process_file(char * filename, credentials_struct credentials,
         /* [<][>][^][v][top][bottom][index][help] */
     315                   GHashTable * AUTO_NIC_hdl_hash, char * ack_file_name,
     316                   GHashTable * ntfy_hash, GHashTable * forw_hash, GHashTable * cross_hash){
     317
     318 FILE * input_file;
     319 GSList *list_of_objects = NULL, *list_of_objects2 = NULL;
     320 GSList *next = NULL;
     321 int object_count = 0;
     322 char *object = NULL;
     323 char *line;
     324 int result = 0;
     325
     326
     327
     328   if((input_file = fopen(filename, "r")) == NULL){
     329      printf("Couldn't open the file %s: %s\n", filename, strerror(errno));
     330      exit(1);
     331   }
     332
     333   line = (char *)malloc(1024);
     334   while(fgets(line, 1024, input_file) != NULL){
     335     /* first, if it is a pasword, save it, but do not regard it as an attrib */
     336     if(strstr(line, "password:") == line){
     337       cout << "This is a password" << endl;
     338       credentials.password_list = g_slist_append(credentials.password_list,
     339                                     g_strstrip(strdup(line + strlen("password:"))));
     340       continue;
     341     }
     342     /* if the length of the line read is 2, then this is an empty line ("\n\r")*/
     343     if(strlen(line) == 2){
     344        if(object != NULL){
     345          list_of_objects = g_slist_append(list_of_objects, object);
     346          object = NULL;
     347        }
     348     }else{
     349       /* if the line contains only the EOL sequence "\n\r" */
     350       if(object == NULL && strlen(line) != 2){
     351         object = (char *)malloc(strlen(line));
     352         object = strdup(line);
     353       }
     354       else{
     355         object = (char *)realloc(object, strlen(object) + strlen(line));
     356         object = strcat(object, line);
     357       }
     358     }
     359
     360   }
     361
     362   /* now, if at the very and of the input file there wasn't an
     363      empty line, we have to add the remaining object in the 'object'
     364      variable */
     365   if(object != NULL){
     366      //cout << "The object was" << endl << object << endl;
     367      list_of_objects = g_slist_append(list_of_objects, object);
     368      object = NULL;
     369   }
     370
     371
     372
     373   if(tracing) {
     374      printf("TRACING: Will process the objects in the list\n");
     375   }
     376   next = list_of_objects;
     377   object_count = 0;
     378   for( next = list_of_objects; next != NULL ; next = g_slist_next(next) ){
     379     object_count++;
     380
     381     if(tracing) {
     382       cout << "TRACING: Got an object from the list" << endl;
     383       cout << (char *)next->data << endl;
     384     }
     385
     386     if(has_ref_to_AUTO_nic_hdl((char *)next->data)){/* defer the processing */
     387       if(tracing) {
     388         printf("TRACING: this object has a ref to an AUTO NIC hdl\n");
     389       }
     390       list_of_objects2 = g_slist_append(list_of_objects2, strdup((char *)next->data));
     391     }else{
     392       result = 0;
     393       result = process_object((char *)next->data, credentials, AUTO_NIC_hdl_hash, ack_file_name,
     394                                ntfy_hash, forw_hash, cross_hash);
     395     }
     396   }
     397
     398   if(tracing) {
     399     printf("TRACING: list_of_objects2 has %d entries\n", g_slist_length(list_of_objects2));
     400   }
     401
     402   if(tracing) {
     403     printf("TRACING: will start to process the second list\n");
     404   }
     405
     406   for( next = list_of_objects2; next != NULL ; next = g_slist_next(next) ){
     407     if(tracing) {
     408       printf("TRACING: Will process object: %s\n", (char *)next->data);
     409     }
     410     result = process_object((char *)next->data, credentials, AUTO_NIC_hdl_hash, ack_file_name,
     411                              ntfy_hash, forw_hash, cross_hash);
     412   }
     413
     414
     415
     416 }/* process_file */
     417
     418
     419
     420
     421
     422
     423 /*  Generates a unique file name and returns the full path of the filename
     424     for storing notification message.  */
     425
     426 char * generate_upd_file(){
         /* [<][>][^][v][top][bottom][index][help] */
     427
     428    char * name;
     429
     430    /* allocate space for name.  32 should be enough for PID */
     431    name = (char*)malloc(strlen("/tmp/dbupdate-tmp.") + strlen("notify") +32 );
     432
     433    sprintf(name, "/tmp/dbupdate-tmp.%i", getpid());
     434
     435
     436    return name;
     437
     438 }
     439
     440
     441
     442
     443
     444 /* main */
     445 void main(int argc, char **argv, char **envp){
         /* [<][>][^][v][top][bottom][index][help] */
     446   //init_and_set_options(argc, argv, envp);
     447
     448   int count = 0;
     449
     450   char * temp;
     451   char * temp_upd_file = NULL;
     452   char *input_file_name = NULL;
     453   GHashTable *AUTO_NIC_hdl_hash;
     454   credentials_struct credentials;
     455
     456
     457   GHashTable *ntfy_hash, *forw_hash, *cross_hash;
     458
     459
     460   char *mail_command_line, * ack_file_name;
     461   char *config_file_name = NULL;
     462
     463
     464   /* for using MM module */
     465   int retcode;
     466   MM_header *mail_header = NULL;
     467   MM_xmp_list *part_list;
     468   MM_xmp *partptr;
     469   long debug = 0;
     470
     471   /* optarg & optind are necessary to use getopt(3C) */
     472   extern char *optarg;
     473   extern int optind;
     474
     475
     476   /* create notification hashes */
     477   ntfy_hash = g_hash_table_new(g_str_hash, g_str_equal);
     478   forw_hash = g_hash_table_new(g_str_hash, g_str_equal);
     479
     480
     481   credentials.password_list = NULL;
     482   credentials.from = NULL;
     483   int ch;
     484   char * to_address = NULL;
     485
     486   AUTO_NIC_hdl_hash = g_hash_table_new(g_str_hash, g_str_equal);
     487   error_init(argc, argv);
     488
     489
     490   while ((ch = getopt(argc, argv, "MtTf:c:")) != -1){
     491           switch(ch) {
     492           case 'M':
     493                   reading_from_mail = 1;
     494                   break;
     495           case 'f':
     496                   input_file_name = strdup(optarg);
     497                   break;
     498           case 'c':
     499                   config_file_name = strdup(optarg);
     500                   break;
     501           case 't':
     502                   tracing = 1;
     503                   break;
     504           case 'T':
     505                   test_mode = 1;
     506                   break;
     507           case '?':
     508           default:
     509                   printf("Unknown option\n");exit(1);
     510           }
     511   }
     512
     513
     514
     515   /* config stuff */
     516   ca_populateDictionary(dictionary, VARS);
     517   /* if -c flag is given, use the named file as config file, otherwise use
     518      default filename */
     519   if( config_file_name != NULL){
     520     ca_readConfig(config_file_name, confVars, VARS);
     521   }else{
     522     ca_readConfig("dbupdate.conf", confVars, VARS);
     523   }
     524   tmpdir = ca_get_tmpdir;
     525   tmpdir = g_strstrip(tmpdir);
     526   mailcmd = ca_get_mailcmd;
     527   mailcmd = g_strstrip(mailcmd);
     528   notitxt = ca_get_notitxt;
     529   mailtxt = ca_get_mailtxt;
     530   crosslog = ca_get_crosslog;
     531   fwtxt = ca_get_fwtxt;
     532   humailbox = ca_get_humailbox;
     533   humailbox = g_strstrip(humailbox);
     534   overridecryptedpw = ca_get_overridecryptedpw;
     535   overridecryptedpw = g_strstrip(overridecryptedpw);
     536   acklog = ca_get_acklog;
     537   acklog = g_strstrip(acklog);
     538   notiflog = ca_get_notiflog;
     539   notiflog = g_strstrip(notiflog);
     540   notimailtxt = ca_get_notimailtxt;
     541   forwlog = ca_get_forwlog;
     542   forwlog = g_strstrip(forwlog);
     543   fwmailtxt = ca_get_fwmailtxt;
     544   //test_mode = ca_get_testmode;
     545
     546   printf("TMPDIR is: [%s]\n", tmpdir);
     547   printf("MAILCMD is: [%s]\n", mailcmd);
     548   printf("NOTITXT is: [%s]\n", notitxt);
     549   printf("CROSSLOG is: [%s]\n", crosslog);
     550   printf("FWTXT is: [%s]\n", fwtxt);
     551   printf("HUMAILBOX is: [%s]\n", humailbox);
     552   printf("OVERRIDECRYPTEDPW is: [%s]\n", overridecryptedpw);
     553   printf("ACKLOG is: [%s]\n", acklog);
     554   printf("NOTIFLOG is: [%s]\n", notiflog);
     555   printf("FORWLOG is: [%s]\n", forwlog);
     556   printf("NOTIMAILTXT is: [%s]\n", notimailtxt);
     557   printf("FWMAILTXT is: [%s]\n", fwmailtxt);
     558   //printf("TESTMODE is: [%i]\n", test_mode);
     559   /* end of config stuff */
     560
     561
     562
     563   /* initialize the parser */
     564   schema.initialize();
     565
     566
     567   /* Generate a name for temporary file for storing acks (AK_ack_file_name_generate
     568       also creates it) */
     569   ack_file_name = AK_ack_file_name_generate(tmpdir, ACK_FILE_PREFIX);
     570
     571
     572   /* Allocate memory for the header */
     573   mail_header = (MM_header *)malloc(sizeof(MM_header));
     574
     575   /* Initialize the list of extracted MIME parts */
     576   part_list = (MM_xmp_list *)malloc(sizeof(MM_xmp_list));
     577   MM_xmp_list_init (part_list);
     578
     579
     580   if(reading_from_mail){
     581     if(input_file_name != NULL){
     582       if((retcode = MM_decode(input_file_name, mail_header, part_list, 1, 0)) != 0){
     583         printf("DEBUG: MM_decode returned %i\n", retcode);
     584         exit(retcode);
     585       }
     586
     587     }else{/* input_file_name == NULL */
     588       temp_upd_file = generate_upd_file();
     589       MM_store(temp_upd_file, 0);
     590       if((retcode = MM_decode(temp_upd_file, mail_header, part_list, 1, 0)) != 0){
     591         printf("DEBUG: MM_decode returned %i\n", retcode);
     592         exit(retcode);
     593       }
     594
     595     }
     596         unlink(temp_upd_file);
     597         printf ("Mail headers:\n\n");
     598         printf ("From - [%s]",mail_header->from);
     599         /* some MAIL-FROM's in mntner auths contain "From: " string too,
     600            so we have to have it in credential.from */
     601         temp = (char *)malloc(strlen(mail_header->from) + strlen("From: ") + 1);
     602         sprintf(temp, "From: %s", mail_header->from);
     603         temp[strlen(temp) - 4] = '\0'; /* cut two '\r\n's at the end */
     604         credentials.from = temp;
     605         printf ("credentials.from = [%s]\n", credentials.from );
     606         mail_header->subject[strlen(mail_header->subject) - 4] = '\0';
     607         printf ("Subject - [%s]",mail_header->subject);
     608         printf ("Date - [%s]",mail_header->date);
     609         printf ("Message-ID - [%s]",mail_header->message_id);
     610         printf ("Reply-To - [%s]",mail_header->reply_to);
     611         printf ("Cc - [%s]",mail_header->cc);
     612         to_address = find_to_address(credentials.from);
     613         AK_add_to_ack(ack_file_name, "To: %s\nFrom: %s\nSubject: Re: %s \nReply-To: %s\n\nAcknowledgement message from database software, beta version\n", to_address, humailbox, mail_header->subject, humailbox);
     614         if(credentials.from != NULL){
     615           AK_add_to_ack(ack_file_name, "\n[%s]\n", credentials.from);
     616         }
     617
     618         partptr = part_list->head;
     619         while (partptr != NULL){
     620
     621           printf("-----------------------------------------\n");
     622           printf ("Section: %s\n",partptr->number);
     623           printf ("Content-type: %s\n",partptr->type);
     624           if (partptr->supported){
     625             printf ("Supported\n");
     626             printf ("Filename is [%s]\n", partptr->file);
     627             process_file(partptr->file, credentials,
     628                   AUTO_NIC_hdl_hash, ack_file_name,
     629                   ntfy_hash, forw_hash, cross_hash);
     630           }
     631           else
     632             printf ("Unsupported\n");
     633           printf ("\n\n");
     634           partptr = partptr->next;
     635         }
     636
     637
     638       /* Clean up the temporary files */
     639       MM_cleanup(part_list, 0);
     640
     641
     642   }else{/* not reading from the mail message */
     643     if(input_file_name != NULL){
     644       process_file(input_file_name, credentials,
     645                   AUTO_NIC_hdl_hash, ack_file_name,
     646                   ntfy_hash, forw_hash, cross_hash);
     647     }
     648
     649   }
     650
     651
     652   if(reading_from_mail && to_address != NULL){
     653     AK_send_ack(ack_file_name, to_address, mailcmd);
     654   }
     655   AK_log_ack(ack_file_name, acklog);
     656   AK_delete_ack(ack_file_name);
     657
     658   NT_send_ntfy_list(ntfy_hash, mailcmd);
     659   NT_log_ntfy_list(ntfy_hash, notiflog);
     660   NT_delete_ntfy_list(ntfy_hash);
     661
     662   NT_send_ntfy_list(forw_hash, mailcmd);
     663   NT_log_ntfy_list(forw_hash, forwlog);
     664   //NT_delete_ntfy_list(forw_hash);
     665
     666
     667
     668   if(tracing) {
     669     printf("TRACING: END\n");
     670   }
     671
     672
     673 }

/* [<][>][^][v][top][bottom][index][help] */