Example #1
0
static void test_init_filled(void)
{
	static const gchar *test_xml_fmt =
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage name=\"media\" path=\"/home/nemo\"\n"
		"         description=\"Phone Memory\">\n"
		"<blacklist>%s/blacklist-home.conf</blacklist>\n"
		"</storage>\n"
		;
	static const gchar *test_blacklist =
		".foo\n"
		".bar\n"
		".baz\n"
		;
	static const gchar *test_blackfile = "blacklist-home.conf";
	gchar *dirname = NULL;

	dirname = setup_config_dir(test_xml_fmt, test_blackfile, test_blacklist);
	config_dir = dirname;
	g_assert_cmpint(jolla_blacklist_init(), ==, 0);

	/* Check that plugin gets called */
	g_assert_cmpint(access_check(NULL, 0, ACCESS_OP_LIST, "/home/nemo/.foo"),
			!=, 0);
	g_assert_cmpint(access_check(NULL, 0, ACCESS_OP_LIST, "/home/nemo/.xyz"),
			==, 0);
	g_assert_cmpint(access_check_at(NULL, 0, ACCESS_OP_LIST, "/home/nemo", ".foo"),
			!=, 0);
	g_assert_cmpint(access_check_at(NULL, 0, ACCESS_OP_LIST, "/home/nemo", ".xyz"),
			==, 0);

	jolla_blacklist_exit();
	cleanup_config_dir(dirname);
}
Example #2
0
/***********************************************************************
 *           server_connect
 *
 * Attempt to connect to an existing server socket.
 * We need to be in the server directory already.
 */
static int server_connect(void)
{
    const char *serverdir;
    struct sockaddr_un addr;
    struct stat st;
    int s, slen, retry, fd_cwd;

    /* retrieve the current directory */
    fd_cwd = open( ".", O_RDONLY );
    if (fd_cwd != -1) fcntl( fd_cwd, F_SETFD, 1 ); /* set close on exec flag */

    setup_config_dir();
    serverdir = wine_get_server_dir();

    /* chdir to the server directory */
    if (chdir( serverdir ) == -1)
    {
        if (errno != ENOENT) fatal_perror( "chdir to %s", serverdir );
        start_server();
        if (chdir( serverdir ) == -1) fatal_perror( "chdir to %s", serverdir );
    }

    /* make sure we are at the right place */
    if (stat( ".", &st ) == -1) fatal_perror( "stat %s", serverdir );
    if (st.st_uid != getuid()) fatal_error( "'%s' is not owned by you\n", serverdir );
    if (st.st_mode & 077) fatal_error( "'%s' must not be accessible by other users\n", serverdir );

    for (retry = 0; retry < 6; retry++)
    {
        /* if not the first try, wait a bit to leave the previous server time to exit */
        if (retry)
        {
            usleep( 100000 * retry * retry );
            start_server();
            if (lstat( SOCKETNAME, &st ) == -1) continue;  /* still no socket, wait a bit more */
        }
        else if (lstat( SOCKETNAME, &st ) == -1) /* check for an already existing socket */
        {
            if (errno != ENOENT) fatal_perror( "lstat %s/%s", serverdir, SOCKETNAME );
            start_server();
            if (lstat( SOCKETNAME, &st ) == -1) continue;  /* still no socket, wait a bit more */
        }

        /* make sure the socket is sane (ISFIFO needed for Solaris) */
        if (!S_ISSOCK(st.st_mode) && !S_ISFIFO(st.st_mode))
            fatal_error( "'%s/%s' is not a socket\n", serverdir, SOCKETNAME );
        if (st.st_uid != getuid())
            fatal_error( "'%s/%s' is not owned by you\n", serverdir, SOCKETNAME );

        /* try to connect to it */
        addr.sun_family = AF_UNIX;
        strcpy( addr.sun_path, SOCKETNAME );
        slen = sizeof(addr) - sizeof(addr.sun_path) + strlen(addr.sun_path) + 1;
#ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
        addr.sun_len = slen;
#endif
        if ((s = socket( AF_UNIX, SOCK_STREAM, 0 )) == -1) fatal_perror( "socket" );
        if (connect( s, (struct sockaddr *)&addr, slen ) != -1)
        {
            /* switch back to the starting directory */
            if (fd_cwd != -1)
            {
                fchdir( fd_cwd );
                close( fd_cwd );
            }
            fcntl( s, F_SETFD, 1 ); /* set close on exec flag */
            return s;
        }
        close( s );
    }
    server_connect_error( serverdir );
}
Example #3
0
static void test_blacklist_reading_invalid_xml(void)
{
	static const gchar *bad_xml[] = {
		/* Relative storage path */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage path=\"not/absolute\" name=\"media\">\n"
		"  <blacklist>%s/test.conf</blacklist>\n"
		"</storage>\n",

		/* Missing storage path */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage name=\"media\">\n"
		"  <blacklist>%s/test.conf</blacklist>\n"
		"</storage>\n",

		/* Duplicate storage path */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage path=\"/home/nemo\" path=\"/home/nemo\">\n"
		"  <blacklist>%s/test.conf</blacklist>\n"
		"</storage>\n",

		/* Unknown storage attribute */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage name=\"Test\" path=\"/home/nemo\" foo=\"bar\">\n"
		"  <blacklist>%s/test.conf</blacklist>\n"
		"</storage>\n",

		/* Unknown blacklist attribute */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage name=\"Test\" path=\"/home/nemo\">\n"
		"  <blacklist foo=\"bar\">%s/test.conf</blacklist>\n"
		"</storage>\n",

		/* Missing blacklist data */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage name=\"Test\" path=\"/home/nemo\">\n"
		"  <blacklist></blacklist>\n"
		"</storage>\n",

		/* Missing blacklist data (all whitespace) */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage name=\"Test\" path=\"/home/nemo\">\n"
		"  <blacklist>        </blacklist>\n"
		"</storage>\n",

		/* Unknown element */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage name=\"Test\" path=\"/home/nemo\">\n"
		"  <blacklist>%s/test.conf</blacklist>\n"
		"  <whitelist>foo.conf</whitelist>\n"
		"</storage>\n",

		/* Bad nesting */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage name=\"Test\" path=\"/home/nemo\">\n"
		"  <storage name=\"Test\" path=\"/home/nemo\">\n"
		"    <blacklist>%s/test.conf</blacklist>\n"
		"  </storage>\n"
		"</storage>\n",

		/* Unexpected text */
		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
		"<storage name=\"Test\" path=\"/home/nemo\">\n"
		"  dummy\n"
		"  <blacklist>%s/test.conf</blacklist>\n"
		"</storage>\n",

		NULL
	};
	static const gchar *blacklist =
		".foo\n"
		".bar\n"
		".baz\n"
		;
	static const gchar *blackfile = "test.conf";
	int i;

	blacklist_clear();

	for (i = 0; bad_xml[i]; i++) {
		gchar *dirname = NULL;
		gchar *pathname = NULL;
		dirname = setup_config_dir(bad_xml[i], blackfile, blacklist);
		config_dir = dirname;
		pathname = g_build_filename(dirname, "test.xml", NULL);
		g_assert_cmpint(append_config(pathname), !=, 0);
		g_assert(blacklists == NULL);
		g_free(pathname);
		cleanup_config_dir(dirname);
	}
}