Esempio n. 1
0
static int read_token_from_file(char *filename, struct securid_token *t)
{
	char buf[BUFLEN];
	int rc = ERR_BAD_LEN;
	FILE *f;

	f = fopen(filename, "r");
	if (f == NULL)
		return ERR_GENERAL;

	while (fgets(buf, BUFLEN, f) != NULL) {
		rc = __stoken_parse_and_decode_token(buf, t);

		/*
		 * keep reading more lines until we find something that
		 * looks like a token
		 */
		if (rc == ERR_GENERAL)
			continue;
		else
			break;
	}

	fclose(f);
	return rc;
}
Esempio n. 2
0
static int read_token_from_file(char *filename, struct securid_token *t)
{
	char buf[65536], *p;
	int rc = ERR_BAD_LEN;
	FILE *f;
	size_t len;

	f = fopen(filename, "r");
	if (f == NULL)
		return ERR_FILE_READ;

	len = fread(buf, 1, sizeof(buf) - 1, f);
	if (ferror(f))
		len = 0;
	fclose(f);

	if (len == 0)
		return ERR_FILE_READ;
	buf[len] = 0;

	for (p = buf; *p; ) {
		rc = __stoken_parse_and_decode_token(p, t, 1);

		/*
		 * keep checking more lines until we find something that
		 * looks like a token
		 */
		if (rc != ERR_GENERAL)
			break;

		p = strchr(p, '\n');
		if (!p)
			break;
		p++;
	}

	return rc;
}
Esempio n. 3
0
int common_init(char *cmd)
{
	int rc;
	struct securid_token *t;
	int is_import = !strcmp(cmd, "import");

	/*
	 * we don't actually scrub memory, but at least try to keep the seeds
	 * from being swapped out to disk
	 */
	mlockall(MCL_CURRENT | MCL_FUTURE);

	cfg = xzalloc(sizeof(*cfg));
	if (__stoken_read_rcfile(opt_rcfile, cfg, &warn) != ERR_NONE)
		__stoken_zap_rcfile_data(cfg);

	if (cfg->rc_ver && atoi(cfg->rc_ver) != RC_VER) {
		warn("rcfile: version mismatch, ignoring contents\n");
		__stoken_zap_rcfile_data(cfg);
	}

	/* accept a token from the command line, or fall back to the rcfile */
	do {
		t = xmalloc(sizeof(struct securid_token));

		if (opt_token) {
			rc = __stoken_parse_and_decode_token(opt_token, t);
			if (rc != ERR_NONE)
				die("error: --token string is garbled: %s\n",
				    stoken_errstr[rc]);
			current_token = t;
			break;
		}
		if (opt_file) {
			rc = read_token_from_file(opt_file, t);
			if (rc != ERR_NONE)
				die("error: no valid token in file '%s': %s\n",
				    opt_file, stoken_errstr[rc]);
			current_token = t;
			break;
		}
		if (opt_random) {
			rc = securid_random_token(t);
			if (rc != ERR_NONE)
				die("error: can't generate random token\n");
			current_token = t;
			break;
		}
		if (cfg->rc_token) {
			if (is_import)
				die("error: please specify --file, --token, or --random\n");
			if (decode_rc_token(cfg, t) == ERR_NONE) {
				current_token = t;
				break;
			}
		}
		free(t);
	} while (0);

	if (is_import && cfg->rc_token && !opt_force)
		die("error: token already exists; use --force to overwrite it\n");

	return ERR_NONE;
}