/*
* 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)) {
#endif
/* Imported functions */
-int authenticate_director(JCR *jcr, DIRRES *director);
+int authenticate_director(JCR *jcr, DIRRES *director, char *name);
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;
/* 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);
/*
* 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;
* 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;
};
*/
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;
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;
}