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); }
/*********************************************************************** * 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 ); }
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); } }