129 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2016 MariaDB Corporation Ab
 | |
|  *
 | |
|  * Use of this software is governed by the Business Source License included
 | |
|  * in the LICENSE.TXT file and at www.mariadb.com/bsl11.
 | |
|  *
 | |
|  * Change Date: 2024-11-16
 | |
|  *
 | |
|  * On the date above, in accordance with the Business Source License, use
 | |
|  * of this software will be governed by version 2 or later of the General
 | |
|  * Public License.
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * @file maxkeys.c  - Create the random encryption keys for maxscale
 | |
|  */
 | |
| #include <maxscale/ccdefs.hh>
 | |
| #include <getopt.h>
 | |
| #include <sys/types.h>
 | |
| #include <pwd.h>
 | |
| #include <stdio.h>
 | |
| #include <unistd.h>
 | |
| #include <maxscale/paths.h>
 | |
| #include <maxscale/random.h>
 | |
| #include "internal/secrets.hh"
 | |
| 
 | |
| #ifdef HAVE_GLIBC
 | |
| struct option options[] =
 | |
| {
 | |
|     {"help", no_argument,       NULL, 'h'},
 | |
|     {"user", required_argument, NULL, 'u'},
 | |
|     {NULL,   0,                 NULL, 0  }
 | |
| };
 | |
| #endif
 | |
| 
 | |
| void print_usage(const char* executable, const char* directory)
 | |
| {
 | |
|     printf("usage: %s [-h|--help] [directory]\n"
 | |
|            "\n"
 | |
|            "This utility writes into the file .secrets, in the specified directory, the\n"
 | |
|            "AES encryption key and init vector that are used by the utility maxpasswd,\n"
 | |
|            "when encrypting passwords used in the MariaDB MaxScale configuration file.\n"
 | |
|            "\n"
 | |
|            "Note that re-creating the .secrets file will invalidate all existing\n"
 | |
|            "passwords used in the configuration file.\n"
 | |
|            "\n"
 | |
|            " -h, --help    Display this help\n"
 | |
|            " -u, --user    Sets the owner of the .secrets file (default: maxscale)\n"
 | |
|            "\n"
 | |
|            "directory  : The directory where the .secrets file should be created.\n"
 | |
|            "\n"
 | |
|            "If a specific directory is not provided, the file is created in\n"
 | |
|            "%s.\n",
 | |
|            executable,
 | |
|            directory);
 | |
| }
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|     std::string directory = get_datadir();
 | |
|     std::string username = "maxscale";
 | |
| 
 | |
|     int c;
 | |
| #ifdef HAVE_GLIBC
 | |
|     while ((c = getopt_long(argc, argv, "hu:", options, NULL)) != -1)
 | |
| #else
 | |
|     while ((c = getopt(argc, argv, "hu:")) != -1)
 | |
| #endif
 | |
|     {
 | |
|         switch (c)
 | |
|         {
 | |
|         case 'h':
 | |
|             print_usage(argv[0], directory.c_str());
 | |
|             exit(EXIT_SUCCESS);
 | |
|             break;
 | |
| 
 | |
|         case 'u':
 | |
|             username = optarg;
 | |
|             break;
 | |
| 
 | |
|         default:
 | |
|             print_usage(argv[0], directory.c_str());
 | |
|             exit(EXIT_FAILURE);
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     int rval = EXIT_SUCCESS;
 | |
| 
 | |
|     if (optind == argc)
 | |
|     {
 | |
|         fprintf(stderr, "Generating .secrets file in %s.\n", directory.c_str());
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         directory = argv[optind];
 | |
|     }
 | |
| 
 | |
|     mxs_log_init(NULL, NULL, MXS_LOG_TARGET_DEFAULT);
 | |
| 
 | |
|     if (secrets_write_keys(directory.c_str()) == 0)
 | |
|     {
 | |
|         std::string filename = directory + "/.secrets";
 | |
| 
 | |
|         if (auto user = getpwnam(username.c_str()))
 | |
|         {
 | |
|             if (chown(filename.c_str(), user->pw_uid, user->pw_gid) == -1)
 | |
|             {
 | |
|                 fprintf(stderr, "Failed to give '%s' ownership of '%s': %d, %s",
 | |
|                         username.c_str(), filename.c_str(), errno, strerror(errno));
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             fprintf(stderr, "Could not find user '%s' when attempting to change ownership of '%s': %d, %s",
 | |
|                     username.c_str(), filename.c_str(), errno, strerror(errno));
 | |
|         }
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         fprintf(stderr, "Failed to create the .secrets file.\n");
 | |
|         rval = EXIT_FAILURE;
 | |
|     }
 | |
| 
 | |
|     mxs_log_finish();
 | |
| 
 | |
|     return rval;
 | |
| }
 | 
