/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/usplash.c

  • Committer: Teddy Hogeborn
  • Date: 2008-12-10 01:26:02 UTC
  • mfrom: (237.1.2 mandos)
  • Revision ID: teddy@fukt.bsnet.se-20081210012602-vhz3h75xkj24t340
First version of a somewhat complete D-Bus server interface.  Also
change user/group name to "_mandos".

* debian/mandos.postinst: Rename old "mandos" user and group to
                          "_mandos"; create "_mandos" user and group
                          if none exist.
* debian/mandos-client.postinst: - '' -

* initramfs-tools-hook: Try "_mandos" before "mandos" as user and
                        group name.

* mandos (_datetime_to_dbus_struct): New; was previously local.
  (Client.started): Renamed to "last_started".  All users changed.
  (Client.started): New; boolean.
  (Client.dbus_object_path): New.
  (Client.check_command): Renamed to "checker_command".  All users
                          changed.
  (Client.__init__): Set and use "self.dbus_object_path".  Set
                     "self.started".
  (Client.start): Update "self.started".  Emit "self.PropertyChanged"
                  signals for both "started" and "last_started".
  (Client.stop): Update "self.started".  Emit "self.PropertyChanged"
                 signal for "started".
  (Client.checker_callback): Take additional "command" argument.  All
                             callers changed. Emit
                             "self.PropertyChanged" signal.
  (Client.bump_timeout): Emit "self.PropertyChanged" signal for
                         "last_checked_ok".
  (Client.start_checker): Emit "self.PropertyChanged" signal for
                          "checker_running".
  (Client.stop_checker): Emit "self.PropertyChanged" signal for
                         "checker_running".
  (Client.still_valid): Bug fix: use "getattr(self, started, False)"
                        instead of "self.started" in case this client
                        object is so new that the "started" attribute
                        has not been created yet.
  (Client.IntervalChanged, Client.CheckerIsRunning, Client.GetChecker,
  Client.GetCreated, Client.GetFingerprint, Client.GetHost,
  Client.GetInterval, Client.GetName, Client.GetStarted,
  Client.GetTimeout, Client.StateChanged, Client.TimeoutChanged):
  Removed; all callers changed.
  (Client.CheckerCompleted): Add "condition" and "command" arguments.
                             All callers changed.
  (Client.GetAllProperties, Client.PropertyChanged): New.
  (Client.StillValid): Renamed to "IsStillValid".
  (Client.StartChecker): Changed to its own function to avoid the
                         return value from "Client.start_checker()".
  (Client.Stop): Changed to its own function to avoid the return value
                 from "Client.stop()".
  (main): Try "_mandos" before "mandos" as user and group name.
          Removed inner function "remove_from_clients".  New inner
          class "MandosServer".

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*  -*- coding: utf-8 -*- */
2
2
/*
3
 
 * Usplash - Read a password from usplash and output it
 
3
 * Passprompt - Read a password from usplash and output it
4
4
 * 
5
 
 * Copyright © 2008,2009 Teddy Hogeborn
6
 
 * Copyright © 2008,2009 Björn Påhlsson
 
5
 * Copyright © 2008 Teddy Hogeborn
 
6
 * Copyright © 2008 Björn Påhlsson
7
7
 * 
8
8
 * This program is free software: you can redistribute it and/or
9
9
 * modify it under the terms of the GNU General Public License as
36
36
                                   dirent */
37
37
#include <stddef.h>             /* NULL */
38
38
#include <string.h>             /* strlen(), memcmp() */
39
 
#include <stdio.h>              /* asprintf(), perror(), sscanf() */
 
39
#include <stdio.h>              /* asprintf(), perror() */
40
40
#include <unistd.h>             /* close(), write(), readlink(),
41
41
                                   read(), STDOUT_FILENO, sleep(),
42
42
                                   fork(), setuid(), geteuid(),
43
43
                                   setsid(), chdir(), dup2(),
44
44
                                   STDERR_FILENO, execv() */
45
 
#include <stdlib.h>             /* free(), EXIT_FAILURE, realloc(),
46
 
                                   EXIT_SUCCESS, malloc(), _exit() */
 
45
#include <stdlib.h>             /* free(), EXIT_FAILURE, strtoul(),
 
46
                                   realloc(), EXIT_SUCCESS, malloc(),
 
47
                                   _exit() */
47
48
#include <stdlib.h>             /* getenv() */
48
49
#include <dirent.h>             /* opendir(), readdir(), closedir() */
49
 
#include <inttypes.h>           /* intmax_t, SCNdMAX */
50
50
#include <sys/stat.h>           /* struct stat, lstat(), S_ISLNK */
51
51
 
52
52
sig_atomic_t interrupted_by_signal = 0;
92
92
  }
93
93
  
94
94
  size_t written = 0;
95
 
  ssize_t sret = 0;
96
95
  while(not interrupted_by_signal and written < cmd_line_len){
97
 
    sret = write(fifo_fd, cmd_line + written,
98
 
                 cmd_line_len - written);
99
 
    if(sret == -1){
 
96
    ret = write(fifo_fd, cmd_line + written,
 
97
                cmd_line_len - written);
 
98
    if(ret == -1){
100
99
      if(errno != EINTR or interrupted_by_signal){
101
100
        int e = errno;
102
101
        close(fifo_fd);
107
106
        continue;
108
107
      }
109
108
    }
110
 
    written += (size_t)sret;
 
109
    written += (size_t)ret;
111
110
  }
112
111
  free(cmd_line_alloc);
113
112
  do{
170
169
    for(struct dirent *proc_ent = readdir(proc_dir);
171
170
        proc_ent != NULL;
172
171
        proc_ent = readdir(proc_dir)){
173
 
      pid_t pid;
174
 
      {
175
 
        intmax_t tmpmax;
176
 
        int numchars;
177
 
        ret = sscanf(proc_ent->d_name, "%" SCNdMAX "%n", &tmpmax,
178
 
                     &numchars);
179
 
        if(ret < 1 or tmpmax != (pid_t)tmpmax
180
 
           or proc_ent->d_name[numchars] != '\0'){
181
 
          /* Not a process */
182
 
          continue;
183
 
        }
184
 
        pid = (pid_t)tmpmax;
 
172
      pid_t pid = (pid_t) strtoul(proc_ent->d_name, NULL, 10);
 
173
      if(pid == 0){
 
174
        /* Not a process */
 
175
        continue;
185
176
      }
186
177
      /* Find the executable name by doing readlink() on the
187
178
         /proc/<pid>/exe link */
201
192
        struct stat exe_stat;
202
193
        ret = lstat(exe_link, &exe_stat);
203
194
        if(ret == -1){
204
 
          if(errno == ENOENT){
205
 
            free(exe_link);
206
 
            continue;
207
 
          }
208
195
          perror("lstat");
209
196
          free(exe_link);
210
197
          free(prompt);
220
207
        
221
208
        sret = readlink(exe_link, exe_target, sizeof(exe_target));
222
209
        free(exe_link);
 
210
        if(sret == -1){
 
211
          continue;
 
212
        }
223
213
      }
224
214
      if((sret == ((ssize_t)sizeof(exe_target)-1))
225
215
         and (memcmp(usplash_name, exe_target,
494
484
    /* Child; will become new usplash process */
495
485
    
496
486
    /* Make the effective user ID (root) the only user ID instead of
497
 
       the real user ID (_mandos) */
 
487
       the real user ID (mandos) */
498
488
    ret = setuid(geteuid());
499
489
    if(ret == -1){
500
490
      perror("setuid");