/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to plugins.d/mandosclient.c

mandosclient
        Droping privileges
        split gnutls function into global and session

* server.py (if_nametoindex): Redefine itself instead of using a
                              default keyword argument.

Show diffs side-by-side

added added

removed removed

Lines of Context:
89
89
  AvahiServer *server;
90
90
  gnutls_certificate_credentials_t cred;
91
91
  unsigned int dh_bits;
 
92
  gnutls_dh_params_t dh_params;
92
93
  const char *priority;
93
94
} mandos_context;
94
95
 
286
287
  fprintf(stderr, "GnuTLS: %s", string);
287
288
}
288
289
 
289
 
static int initgnutls(mandos_context *mc, gnutls_session_t *session,
290
 
                      gnutls_dh_params_t *dh_params){
 
290
static int init_gnutls_global(mandos_context *mc){
291
291
  int ret;
292
292
  
293
293
  if(debug){
335
335
  }
336
336
  
337
337
  /* GnuTLS server initialization */
338
 
  ret = gnutls_dh_params_init(dh_params);
 
338
  ret = gnutls_dh_params_init(&mc->dh_params);
339
339
  if (ret != GNUTLS_E_SUCCESS) {
340
340
    fprintf (stderr, "Error in GnuTLS DH parameter initialization:"
341
341
             " %s\n", safer_gnutls_strerror(ret));
342
342
    return -1;
343
343
  }
344
 
  ret = gnutls_dh_params_generate2(*dh_params, mc->dh_bits);
 
344
  ret = gnutls_dh_params_generate2(mc->dh_params, mc->dh_bits);
345
345
  if (ret != GNUTLS_E_SUCCESS) {
346
346
    fprintf (stderr, "Error in GnuTLS prime generation: %s\n",
347
347
             safer_gnutls_strerror(ret));
348
348
    return -1;
349
349
  }
350
350
  
351
 
  gnutls_certificate_set_dh_params(mc->cred, *dh_params);
352
 
  
 
351
  gnutls_certificate_set_dh_params(mc->cred, mc->dh_params);
 
352
 
 
353
  return 0;
 
354
}
 
355
 
 
356
static int init_gnutls_session(mandos_context *mc, gnutls_session_t *session){
 
357
  int ret;
353
358
  /* GnuTLS session creation */
354
359
  ret = gnutls_init(session, GNUTLS_SERVER);
355
360
  if (ret != GNUTLS_E_SUCCESS){
406
411
  gnutls_session_t session;
407
412
  gnutls_dh_params_t dh_params;
408
413
  
409
 
  ret = initgnutls (mc, &session, &dh_params);
 
414
  ret = init_gnutls_session (mc, &session);
410
415
  if (ret != 0){
411
416
    return -1;
412
417
  }
722
727
    const char *interface = "eth0";
723
728
    struct ifreq network;
724
729
    int sd;
 
730
    uid_t uid;
 
731
    gid_t gid;
725
732
    char *connect_to = NULL;
726
733
    AvahiIfIndex if_index = AVAHI_IF_UNSPEC;
727
734
    mandos_context mc = { .simple_poll = NULL, .server = NULL,
802
809
      perror("combinepath");
803
810
      goto end;
804
811
    }
 
812
 
 
813
    ret = init_gnutls_global(&mc);
 
814
    if (ret == -1){
 
815
      fprintf(stderr, "init_gnutls_global\n");
 
816
      goto end;
 
817
    }
 
818
 
 
819
    uid = getuid();
 
820
    gid = getgid();
 
821
 
 
822
    ret = setuid(uid);
 
823
    if (ret == -1){
 
824
      perror("setuid");
 
825
    }
 
826
    
 
827
    setgid(gid);
 
828
    if (ret == -1){
 
829
      perror("setgid");
 
830
    }
805
831
    
806
832
    if_index = (AvahiIfIndex) if_nametoindex(interface);
807
833
    if(if_index == 0){
815
841
      char *address = strrchr(connect_to, ':');
816
842
      if(address == NULL){
817
843
        fprintf(stderr, "No colon in address\n");
818
 
        exit(EXIT_FAILURE);
 
844
        exitcode = EXIT_FAILURE;
 
845
        goto end;
819
846
      }
820
847
      errno = 0;
821
848
      uint16_t port = (uint16_t) strtol(address+1, NULL, 10);
822
849
      if(errno){
823
850
        perror("Bad port number");
824
 
        exit(EXIT_FAILURE);
 
851
        exitcode = EXIT_FAILURE;
 
852
        goto end;
825
853
      }
826
854
      *address = '\0';
827
855
      address = connect_to;
828
856
      ret = start_mandos_communication(address, port, if_index, &mc);
829
857
      if(ret < 0){
830
 
        exit(EXIT_FAILURE);
 
858
        exitcode = EXIT_FAILURE;
831
859
      } else {
832
 
        exit(EXIT_SUCCESS);
 
860
        exitcode = EXIT_SUCCESS;
833
861
      }
 
862
      goto end;
834
863
    }
835
864
    
836
865
    /* If the interface is down, bring it up */