]> git.sur5r.net Git - bacula/bacula/commitdiff
Implement first cut of multiple consoles
authorKern Sibbald <kern@sibbald.com>
Thu, 15 Jan 2004 14:03:43 +0000 (14:03 +0000)
committerKern Sibbald <kern@sibbald.com>
Thu, 15 Jan 2004 14:03:43 +0000 (14:03 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1012 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/console/authenticate.c
bacula/src/console/console.c
bacula/src/console/console_conf.c
bacula/src/console/console_conf.h
bacula/src/dird/authenticate.c

index ef679da18266d8966abe49b2e57879e6c8e73fe7..b6f0726a4cc4aa836ff14a104434250f4cbdc399 100644 (file)
@@ -47,15 +47,18 @@ static char OKhello[]   = "1000 OK:";
 /*
  * Authenticate Director
  */
-int authenticate_director(JCR *jcr, DIRRES *director)
+int authenticate_director(JCR *jcr, DIRRES *director, char *name)
 {
    BSOCK *dir = jcr->dir_bsock;
    int ssl_need = BNET_SSL_NONE;
+   char bashed_name[MAX_NAME_LENGTH];
 
    /* 
     * Send my name to the Director then do authentication
     */
-   bnet_fsend(dir, hello, "UserAgent");
+   bstrncpy(bashed_name, name, sizeof(bashed_name));
+   bash_spaces(bashed_name);
+   bnet_fsend(dir, hello, bashed_name);
 
    if (!cram_md5_get_auth(dir, director->password, ssl_need) || 
        !cram_md5_auth(dir, director->password, ssl_need)) {
index 51f49961d02c90f223b7f2641b887023253fb0d2..b59e601eba6ffe61a1bbb4f653e8b0a8d9852678 100644 (file)
@@ -51,7 +51,7 @@ extern int rl_catch_signals;
 #endif
 
 /* Imported functions */
-int authenticate_director(JCR *jcr, DIRRES *director);
+int authenticate_director(JCR *jcr, DIRRES *director, char *name);
 
 
 
@@ -398,7 +398,17 @@ try_again:
       return 1;
    }
    jcr.dir_bsock = UA_sock;
-   if (!authenticate_director(&jcr, dir)) {
+
+   LockRes();
+   CONRES *cons = (CONRES *)GetNextRes(R_CONSOLE, (RES *)NULL);
+   UnlockRes();
+   char *con_name;
+   if (cons) {
+      con_name = cons->hdr.name;
+   } else {
+      con_name = "*UserAgent*";
+   }
+   if (!authenticate_director(&jcr, dir, con_name)) {
       fprintf(stderr, "ERR=%s", UA_sock->msg);
       terminate_console(0);
       return 1;
index f69975c2d2917845019c36040c7b0dcbdafa60f6..ef7eb4939982052896a7adc1bca07e7f33cac770 100644 (file)
@@ -235,7 +235,7 @@ void save_resource(int type, struct res_items *items, int pass)
    /* The following code is only executed during pass 1 */
    switch (type) {
       case R_CONSOLE:
-        size = sizeof(CONSRES);
+        size = sizeof(CONRES);
         break;
       case R_DIRECTOR:
         size = sizeof(DIRRES);
index 7326b55bfed83b8b29a61b1c967829cc4ff954c2..e01c21bf78916fd4281f20ecf729954e5ac62760 100644 (file)
@@ -9,41 +9,41 @@
 /*
  * Resource codes -- they must be sequential for indexing   
  */
-#define R_FIRST                      1001
+#define R_FIRST                       1001
 
-#define R_CONSOLE                    1001
-#define R_DIRECTOR                   1002
+#define R_CONSOLE                     1001
+#define R_DIRECTOR                    1002
 
-#define R_LAST                       R_DIRECTOR
+#define R_LAST                        R_DIRECTOR
 
 /*
  * Some resource attributes
  */
-#define R_NAME                       1020
-#define R_ADDRESS                    1021
-#define R_PASSWORD                   1022
-#define R_TYPE                       1023
-#define R_BACKUP                     1024
+#define R_NAME                        1020
+#define R_ADDRESS                     1021
+#define R_PASSWORD                    1022
+#define R_TYPE                        1023
+#define R_BACKUP                      1024
 
 
 /* Definition of the contents of each Resource */
 
 /* Console "globals" */
-struct s_res_cons {
-   RES  hdr;
-   char *rc_file;                    /* startup file */
-   char *hist_file;                  /* command history file */
-   int require_ssl;                  /* Require SSL on all connections */
+struct s_res_con {
+   RES   hdr;
+   char *rc_file;                     /* startup file */
+   char *hist_file;                   /* command history file */
+   int require_ssl;                   /* Require SSL on all connections */
 };
-typedef struct s_res_cons CONSRES;
+typedef struct s_res_con CONRES;
 
 /* Director */
 struct s_res_dir {
-   RES  hdr;
-   int  DIRport;                     /* UA server port */
-   char *address;                    /* UA server address */
-   char *password;                   /* UA server password */
-   int enable_ssl;                   /* Use SSL */
+   RES   hdr;
+   int   DIRport;                     /* UA server port */
+   char *address;                     /* UA server address */
+   char *password;                    /* UA server password */
+   int  enable_ssl;                   /* Use SSL */
 };
 typedef struct s_res_dir DIRRES;
 
@@ -52,8 +52,8 @@ typedef struct s_res_dir DIRRES;
  * resource structure definitions.
  */
 union u_res {
-   struct s_res_dir    res_dir;
-   struct s_res_cons   res_cons;
+   struct s_res_dir     res_dir;
+   struct s_res_con     res_cons;
    RES hdr;
 };
 
index 9ec6d81bf1b3e12a2ac4b6af2cd6f91335bddcb9..9dacdb6d8712f616d8ab3f76a426b07ed94bf573 100644 (file)
@@ -128,11 +128,11 @@ int authenticate_file_daemon(JCR *jcr)
  */
 int authenticate_user_agent(BSOCK *ua)
 {
-   char name[MAXSTRING];
+   char name[MAX_NAME_LENGTH];
    int ssl_need = BNET_SSL_NONE;
-   int ok;    
+   bool ok;    
 
-   if (ua->msglen < 16 || ua->msglen >= MAXSTRING-1) {
+   if (ua->msglen < 16 || ua->msglen >= MAX_NAME_LENGTH + 15) {
       Emsg2(M_ERROR, 0, _("UA Hello from %s is invalid. Len=%d\n"), ua->who, 
            ua->msglen);
       return 0;
@@ -144,14 +144,24 @@ int authenticate_user_agent(BSOCK *ua)
            ua->msg);
       return 0;
    }
-
-   ok = cram_md5_auth(ua, director->password, ssl_need) &&
-       cram_md5_get_auth(ua, director->password, ssl_need);
-
+   name[MAXSTRING-1] = 0;            /* terminate name */
+   if (strcmp(name, "*UserAgent*") == 0) {  /* default console */
+      ok = cram_md5_auth(ua, director->password, ssl_need) &&
+          cram_md5_get_auth(ua, director->password, ssl_need);
+   } else {
+      unbash_spaces(name); 
+      CONRES *cons = (CONRES *)GetResWithName(R_CONSOLE, name);
+      if (cons) {
+        ok = cram_md5_auth(ua, cons->password, ssl_need) &&
+             cram_md5_get_auth(ua, cons->password, ssl_need);
+      } else {
+        ok = false;
+      }
+   }
    if (!ok) {
       bnet_fsend(ua, "%s", _(Dir_sorry));
-      Emsg1(M_WARNING, 0, _("Unable to authenticate User Agent at %s.\n"),
-           ua->who);
+      Emsg2(M_ERROR, 0, _("Unable to authenticate User Agent \"%s\" at %s.\n"),
+           name, ua->who);
       sleep(5);
       return 0;
    }