/** * Add the service user to the service->users * via mysql_users_alloc and add_mysql_users_with_host_ipv4 * User is added for '%' and 'localhost' hosts * * @param service The service for this router * @return 0 on success, 1 on failure */ static int maxinfo_add_mysql_user(SERVICE *service) { char *dpwd = NULL; char *newpasswd = NULL; char *service_user = NULL; char *service_passwd = NULL; if (serviceGetUser(service, &service_user, &service_passwd) == 0) { MXS_ERROR("maxinfo: failed to get service user details"); return 1; } dpwd = decryptPassword(service->credentials.authdata); if (!dpwd) { MXS_ERROR("maxinfo: decrypt password failed for service user %s", service_user); return 1; } service->users = (void *)mysql_users_alloc(); newpasswd = create_hex_sha1_sha1_passwd(dpwd); if (!newpasswd) { MXS_ERROR("maxinfo: create hex_sha1_sha1_password failed for service user %s", service_user); users_free(service->users); service->users = NULL; return 1; } /* add service user for % and localhost */ (void)add_mysql_users_with_host_ipv4(service->users, service->credentials.name, "%", newpasswd, "Y", ""); (void)add_mysql_users_with_host_ipv4(service->users, service->credentials.name, "localhost", newpasswd, "Y", ""); free(newpasswd); free(dpwd); return 0; }
int set_and_get_mysql_users_wildcards(char *username, char *hostname, char *password, char *from, char *anydb, char *db, char *db_from) { USERS *mysql_users; int ret = -1; struct sockaddr_in client_addr; DCB *dcb; SERVICE *service; MYSQL_session *data; dcb = dcb_alloc(DCB_ROLE_INTERNAL); if (dcb == NULL) { fprintf(stderr, "dcb_alloc() failed\n"); return ret; } if ((service = (SERVICE *)calloc(1, sizeof(SERVICE))) == NULL) { fprintf(stderr, "service_alloc() failed\n"); dcb_free(dcb); return ret; } memset(&client_addr, 0, sizeof(client_addr)); if (hostname) { if(!setipaddress(&client_addr.sin_addr, from)) { fprintf(stderr, "setipaddress failed for host [%s]\n", from); free(service); dcb_free(dcb); return ret; } } if ((data = (MYSQL_session *) calloc(1, sizeof(MYSQL_session))) == NULL) { fprintf(stderr, "MYSQL_session alloc failed\n"); free(service); dcb_free(dcb); return ret; } /* client IPv4 in raw data*/ memcpy(&dcb->ipv4, (struct sockaddr_in *)&client_addr, sizeof(struct sockaddr_in)); dcb->service = service; mysql_users = mysql_users_alloc(); service->users = mysql_users; if (db_from != NULL) strncpy(data->db, db_from,MYSQL_DATABASE_MAXLEN); else strncpy(data->db, "",MYSQL_DATABASE_MAXLEN); /* freed by dcb_free(dcb) */ dcb->data = data; // the routine returns 1 on success if (anydb != NULL) { if (strcmp(anydb, "N") == 0) { ret = add_mysql_users_with_host_ipv4(mysql_users, username, hostname, password, anydb, db); } else if (strcmp(anydb, "Y") == 0) { ret = add_mysql_users_with_host_ipv4(mysql_users, username, hostname, password, "Y", ""); } else { ret = add_mysql_users_with_host_ipv4(mysql_users, username, hostname, password, "N", NULL); } } else { ret = add_mysql_users_with_host_ipv4(mysql_users, username, hostname, password, "N", NULL); } if (ret == 0) { fprintf(stderr, "add_mysql_users_with_host_ipv4 (%s@%s, %s) FAILED\n", username, hostname, password); } else { unsigned char db_passwd[100]=""; dcb->remote=strdup(from); // returns 0 on success ret = gw_find_mysql_user_password_sha1(username, db_passwd, dcb); } users_free(mysql_users); free(service); dcb_free(dcb); return ret; }