/** * Creates a container for the specified node values. * * @param doc document */ protected static void create(final String doc) { try { new CreateDB(Util.className(SandboxTest.class), doc).execute(context); } catch (final BaseXException ex) { Util.notExpected(ex); } }
/** * Assumes that this command is successful. * * @param cmd command reference * @param s session */ private static void ok(final Command cmd, final Session s) { try { s.execute(cmd); } catch (final IOException ex) { fail(Util.message(ex)); } }
/** Stops a session. */ @After public final void stopSession() { try { if (cleanup) session.execute(new DropDB(NAME)); session.close(); } catch (final IOException ex) { fail(Util.message(ex)); } }
/** Tests the specified instance. */ @Test public void test() { final StringBuilder sb = new StringBuilder(); int fail = 0; for (final Object[] qu : queries) { final boolean correct = qu.length == 3; final String query = qu[correct ? 2 : 1].toString(); final Value cmp = correct ? (Value) qu[1] : null; final QueryProcessor qp = new QueryProcessor(query, context); try { final Value val = qp.value(); if (!correct || !new DeepCompare().equal(val, cmp)) { sb.append("[" + qu[0] + "] " + query); String s = correct && cmp.size() != 1 ? "#" + cmp.size() : ""; sb.append("\n[E" + s + "] "); if (correct) { final String cp = cmp.toString(); sb.append('\''); sb.append(cp.length() > 1000 ? cp.substring(0, 1000) + "..." : cp); sb.append('\''); } else { sb.append("error"); } final TokenBuilder types = new TokenBuilder(); for (final Item it : val) types.add(it.type.toString()).add(" "); s = val.size() == 1 ? "" : "#" + val.size(); sb.append("\n[F" + s + "] '" + val + "', " + types + details() + '\n'); ++fail; } } catch (final Exception ex) { final String msg = ex.getMessage(); if (correct || msg == null || msg.contains("mailman")) { final String cp = correct && cmp.data() != null ? cmp.toString() : "()"; sb.append( "[" + qu[0] + "] " + query + "\n[E] " + cp + "\n[F] " + (msg == null ? Util.className(ex) : msg.replaceAll("\r\n?|\n", " ")) + ' ' + details() + '\n'); ex.printStackTrace(); ++fail; } } finally { qp.close(); } } if (fail != 0) fail(fail + " Errors. [E] = expected, [F] = found:\n" + sb.toString().trim()); }
/** Clean up method. */ @After public void cleanUp() { try { testSession.close(); adminSession.execute(new DropDB(RENAMED)); adminSession.execute(new DropDB(NAME)); adminSession.close(); // give the server some time to clean up the sessions before next test Performance.sleep(100); } catch (final Exception ex) { fail(Util.message(ex)); } }
/** * Sets a status and sends an info message. * * @param code status code * @param message info message * @param error treat as error (use web server standard output) * @throws IOException I/O exception */ public void status(final int code, final String message, final boolean error) throws IOException { try { log(message, code); res.resetBuffer(); if (code == SC_UNAUTHORIZED) res.setHeader(WWW_AUTHENTICATE, BASIC); if (error && code >= SC_BAD_REQUEST) { res.sendError(code, message); } else { res.setStatus(code); if (message != null) res.getOutputStream().write(token(message)); } } catch (final IllegalStateException ex) { log(Util.message(ex), SC_INTERNAL_SERVER_ERROR); } }
@Override public void run() { try { // Perform some queries for (int i = 0; i < runs; ++i) { Performance.sleep((long) (50 * RND.nextDouble())); // Return nth text of the database final int n = RND.nextInt() % MAX + 1; final String qu = Util.info(QUERY, n); session.execute("xquery " + qu); } session.close(); } catch (final Exception ex) { ex.printStackTrace(); } }
/** Set up method. */ @Before public void setUp() { try { adminSession = createClient(); if (server.context.users.get(NAME) != null) { ok(new DropUser(NAME), adminSession); } ok(new CreateUser(NAME, NAME), adminSession); ok(new CreateDB(RENAMED), adminSession); server.context.soptions.set(StaticOptions.REPOPATH, REPO); testSession = createClient(NAME, NAME); ok(new CreateDB(NAME, "<xml/>"), adminSession); ok(new Close(), adminSession); } catch (final Exception ex) { fail(Util.message(ex)); } }
/** * Initializes the database context, based on the initial servlet context. Parses all context * parameters and passes them on to the database context. * * @param sc servlet context * @throws IOException I/O exception */ public static synchronized void init(final ServletContext sc) throws IOException { // check if HTTP context has already been initialized if (init) return; init = true; // set web application path as home directory and HTTPPATH final String webapp = sc.getRealPath("/"); Options.setSystem(Prop.PATH, webapp); Options.setSystem(GlobalOptions.WEBPATH, webapp); // bind all parameters that start with "org.basex." to system properties final Enumeration<String> en = sc.getInitParameterNames(); while (en.hasMoreElements()) { final String key = en.nextElement(); if (!key.startsWith(Prop.DBPREFIX)) continue; String val = sc.getInitParameter(key); if (key.endsWith("path") && !new File(val).isAbsolute()) { // prefix relative path with absolute servlet path Util.debug(key.toUpperCase(Locale.ENGLISH) + ": " + val); val = new IOFile(webapp, val).path(); } Options.setSystem(key, val); } // create context, update options if (context == null) { context = new Context(false); } else { context.globalopts.setSystem(); context.options.setSystem(); } // start server instance if (!context.globalopts.get(GlobalOptions.HTTPLOCAL)) new BaseXServer(context); }
/** Stop BaseX HTTP. */ private void stopBaseXHTTP() { Util.start(BaseXHTTP.class, "stop"); Performance.sleep(TIMEOUT); // give the server some time to stop }
/** Start BaseX HTTP. */ private void startBaseXHTTP() { Util.start(BaseXHTTP.class, "-U" + UserText.ADMIN, "-P" + UserText.ADMIN); Performance.sleep(TIMEOUT); // give the server some time to stop }
/** * This class tests user permissions. * * @author BaseX Team 2005-15, BSD License * @author Andreas Weiler */ public final class PermissionTest extends SandboxTest { /** Name of the database to be renamed. */ private static final String RENAMED = Util.className(PermissionTest.class) + 'r'; /** Test folder. */ private static final String FOLDER = "src/test/resources/"; /** Test repository. * */ private static final String REPO = FOLDER + "repo/"; /** Server reference. */ private static BaseXServer server; /** Admin session. */ private Session adminSession; /** Test session. */ private Session testSession; /** * Starts the server. * * @throws IOException I/O exception */ @BeforeClass public static void start() throws IOException { server = createServer(); } /** * Stops the server. * * @throws IOException I/O exception */ @AfterClass public static void stop() throws IOException { stopServer(server); } /** Set up method. */ @Before public void setUp() { try { adminSession = createClient(); if (server.context.users.get(NAME) != null) { ok(new DropUser(NAME), adminSession); } ok(new CreateUser(NAME, NAME), adminSession); ok(new CreateDB(RENAMED), adminSession); server.context.soptions.set(StaticOptions.REPOPATH, REPO); testSession = createClient(NAME, NAME); ok(new CreateDB(NAME, "<xml/>"), adminSession); ok(new Close(), adminSession); } catch (final Exception ex) { fail(Util.message(ex)); } } /** Clean up method. */ @After public void cleanUp() { try { testSession.close(); adminSession.execute(new DropDB(RENAMED)); adminSession.execute(new DropDB(NAME)); adminSession.close(); // give the server some time to clean up the sessions before next test Performance.sleep(100); } catch (final Exception ex) { fail(Util.message(ex)); } } /** Tests all commands where no permission is needed. */ @Test public void noPermsNeeded() { ok(new Grant("none", NAME), adminSession); ok(new Password(NAME), testSession); ok(new Help("list"), testSession); ok(new Close(), testSession); no(new List(NAME), testSession); ok(new List(), testSession); no(new Open(NAME), testSession); no(new InfoDB(), testSession); no(new InfoIndex(), testSession); no(new InfoStorage(), testSession); no(new Get("DBPATH"), testSession); ok(new Get(MainOptions.QUERYINFO), testSession); ok(new Set(MainOptions.QUERYINFO, false), testSession); // repo stuff no(new RepoInstall(REPO + "/pkg3.xar", null), testSession); ok(new RepoList(), testSession); no(new RepoDelete("http://www.pkg3.com", null), testSession); // XQuery read no(new XQuery("//xml"), testSession); no(new Find(NAME), testSession); no(new Optimize(), testSession); // XQuery update no( new XQuery("for $item in doc('" + NAME + "')//xml " + "return rename node $item as 'null'"), testSession); no(new CreateDB(NAME, "<xml/>"), testSession); no(new Rename(RENAMED, RENAMED + '2'), testSession); no(new CreateIndex("SUMMARY"), testSession); no(new DropDB(NAME), testSession); no(new DropIndex("SUMMARY"), testSession); no(new CreateUser(NAME, NAME), testSession); no(new DropUser(NAME), testSession); no(new Kill("dada"), testSession); no(new ShowUsers("Users"), testSession); no(new Grant("read", NAME), testSession); no(new Grant("none", NAME), testSession); no(new AlterPassword(NAME, NAME), testSession); no(new AlterUser(NAME, "test2"), testSession); no(new Flush(), testSession); } /** Tests all commands where read permission is needed. */ @Test public void readPermsNeeded() { ok(new Grant("read", NAME), adminSession); ok(new Open(NAME), testSession); ok(new List(NAME), testSession); ok(new InfoDB(), testSession); ok(new InfoStorage("1", "2"), testSession); no(new Get("DBPATH"), testSession); ok(new Get(MainOptions.QUERYINFO), testSession); ok(new Set(MainOptions.QUERYINFO, false), testSession); // XQuery read ok(new XQuery("//xml"), testSession); ok(new Find(NAME), testSession); // repo stuff no(new RepoInstall(REPO + "/pkg3.xar", null), testSession); ok(new RepoList(), testSession); no(new RepoDelete("http://www.pkg3.com", null), testSession); // XQuery update no(new XQuery("for $n in " + DOC.args(NAME) + "//xml return delete node $n"), testSession); no(new XQuery(_DB_CREATE.args(NAME)), testSession); no(new Optimize(), testSession); no(new CreateDB(NAME, "<xml/>"), testSession); no(new Replace(RENAMED, "<xml />"), testSession); no(new Rename(RENAMED, RENAMED + '2'), testSession); no(new CreateIndex("SUMMARY"), testSession); no(new DropDB(NAME), testSession); no(new DropIndex("SUMMARY"), testSession); no(new CreateUser(NAME, NAME), testSession); no(new DropUser(NAME), testSession); no(new Export(Prop.TMP + NAME), testSession); no(new Kill("dada"), testSession); no(new ShowUsers("Users"), testSession); no(new Grant("read", NAME), testSession); no(new Grant("none", NAME), testSession); no(new AlterPassword(NAME, NAME), testSession); no(new AlterUser(NAME, "test2"), testSession); no(new Flush(), testSession); ok(new Close(), testSession); } /** Tests all commands where write permission is needed. */ @Test public void writePermsNeeded() { ok(new Grant("write", NAME), adminSession); ok(new Open(RENAMED), testSession); ok(new Rename(RENAMED, RENAMED + '2'), testSession); ok(new Rename(RENAMED + '2', RENAMED), testSession); // replace Test ok(new Close(), testSession); ok(new Open(RENAMED), testSession); ok(new Add(NAME + ".xml", "<xml>1</xml>"), testSession); ok(new Optimize(), testSession); ok(new Replace(NAME + ".xml", "<xmlr>2</xmlr>"), testSession); // repo stuff no(new RepoInstall(REPO + "/pkg3.xar", null), testSession); ok(new RepoList(), testSession); no(new RepoDelete("http://www.pkg3.com", null), testSession); // XQuery Update ok( new XQuery("for $item in doc('" + NAME + "')//xml " + "return rename node $item as 'null'"), testSession); no(new XQuery(_DB_CREATE.args(NAME)), testSession); ok(new Optimize(), testSession); for (final CmdIndex cmd : CmdIndex.values()) { ok(new CreateIndex(cmd), testSession); } ok(new InfoIndex(), testSession); for (final CmdIndex cmd : CmdIndex.values()) { ok(new DropIndex(cmd), testSession); } ok(new Flush(), testSession); ok(new Close(), testSession); no(new CreateDB(NAME, "<xml/>"), testSession); no(new DropDB(NAME), testSession); no(new CreateUser(NAME, NAME), testSession); no(new DropUser(NAME), testSession); no(new Export(Prop.TMP + NAME), testSession); no(new Kill("dada"), testSession); no(new ShowUsers("Users"), testSession); no(new Grant("read", NAME), testSession); no(new Grant("none", NAME), testSession); no(new AlterPassword(NAME, NAME), testSession); no(new AlterUser(NAME, "test2"), testSession); } /** Tests all commands where create permission is needed. */ @Test public void createPermsNeeded() { ok(new Grant("create", NAME), adminSession); ok(new XQuery(_DB_CREATE.args(NAME)), testSession); ok(new Close(), testSession); ok(new CreateDB(NAME, "<xml/>"), testSession); for (final CmdIndex cmd : CmdIndex.values()) { ok(new CreateIndex(cmd), testSession); } ok(new Export(Prop.TMP + NAME), testSession); // repo stuff ok(new RepoInstall(REPO + "/pkg3.xar", null), testSession); ok(new RepoList(), testSession); ok(new RepoDelete("http://www.pkg3.com", null), testSession); no(new CreateUser(NAME, NAME), testSession); no(new DropUser(NAME), testSession); no(new Kill("dada"), testSession); no(new ShowUsers("Users"), testSession); no(new Grant("read", NAME), testSession); no(new Grant("none", NAME), testSession); no(new AlterPassword(NAME, NAME), testSession); no(new org.basex.core.cmd.Test(FOLDER + "tests-ok.xqm"), testSession); } /** Tests all commands where admin permission is needed. */ @Test public void adminPermsNeeded() { ok(new Grant(ADMIN, NAME), adminSession); if (server.context.users.get("test2") != null) { ok(new DropUser("test2"), testSession); } ok(new CreateUser("test2", NAME), testSession); ok(new CreateDB(NAME, "<xml/>"), testSession); ok(new ShowUsers(), testSession); ok(new Grant(ADMIN, "test2"), testSession); ok(new Grant("create", "test2"), testSession); ok(new AlterPassword(NAME, NAME), testSession); ok(new AlterUser("test2", "test4"), testSession); ok(new DropUser("test3"), testSession); ok(new Close(), testSession); ok(new Close(), adminSession); ok(new DropDB(NAME), adminSession); // repo stuff ok(new RepoInstall(REPO + "/pkg3.xar", null), testSession); ok(new RepoList(), testSession); ok(new RepoDelete("http://www.pkg3.com", null), testSession); ok(new org.basex.core.cmd.Test(FOLDER + "tests-ok.xqm"), testSession); } /** Drops users. */ @Test public void dropUsers() { no(new DropUser(NAME), testSession); no(new DropUser(NAME), adminSession); ok(new Exit(), testSession); // give the server some time to close the client session Performance.sleep(50); ok(new DropUser(NAME), adminSession); } /** * Assumes that this command is successful. * * @param cmd command reference * @param s session */ private static void ok(final Command cmd, final Session s) { try { s.execute(cmd); } catch (final IOException ex) { fail(Util.message(ex)); } } /** * Assumes that this command fails. * * @param cmd command reference * @param s session */ private static void no(final Command cmd, final Session s) { try { s.execute(cmd); fail("\"" + cmd + "\" was supposed to fail."); } catch (final IOException ignored) { } } }