From: Stefan Metzmacher Date: Fri, 21 Dec 2007 04:23:22 +0000 (+0100) Subject: Merge commit 'release-4-0-0alpha1' into v4-0-test X-Git-Tag: samba-4.0.0alpha2~662 X-Git-Url: http://git.samba.org/samba.git/?p=ira%2Fwip.git;a=commitdiff_plain;h=8fc632baaacf19602e9fc1b5b5dac47082c7ba8b;hp=42c07d0d74a54f469ff6c8229454fc933f3bad66 Merge commit 'release-4-0-0alpha1' into v4-0-test --- diff --git a/.bzrignore b/.bzrignore index c0eb35d4e32..39f306eabdf 100644 --- a/.bzrignore +++ b/.bzrignore @@ -196,3 +196,9 @@ source/lib/tdb/bin/tdbbackup source/lib/tdb/bin/tdbdump source/lib/registry/tools/common.h source/librpc/ndr/ndr_table.h +test-results +source/lib/ldb-samba/ldif_handlers.h +rpc_server/lsa/proto.h +torture/winbind/proto.h +source/rpc_server/lsa/proto.h +source/torture/winbind/proto.h diff --git a/NEWS b/NEWS index 829f946b3ed..dd010919210 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,13 @@ Introduction of LDB Samba now stores most of its persistent data in a LDAP-like database called LDB (see ldb(7) for more info). +Much improved SWAT +================== +SWAT has had some rather large improvements and is now more than just a +direct editor for smb.conf. Its layout has been improved. SWAT can now also +be used for editing run-time data - maintaining user information, provisioning, +etc. TLS is supported out of the box. + Built-in KDC ============ Samba4 ships with an integrated KDC (Kerberos Key Distribution diff --git a/README b/README new file mode 100644 index 00000000000..596dbd570c5 --- /dev/null +++ b/README @@ -0,0 +1,136 @@ +Samba 4 is the ambitious next version of the Samba suite that is being +developed in parallel to the stable 3.0 series. The main emphasis in +this branch is support for the Active Directory logon protocols used +by Windows 2000 and above. + +While we welcome your interest in Samba 4, we don't want you to run your network with it quite yet. Please note the WARNINGS below, and the STATUS file, +which aims to document what should and should not work. + +With 4 years of development under our belt since Tridge first proposed +a new Virtual File System (VFS) layer for Samba3 (a project which +eventually lead to our Active Directory efforts), we felt that we +should create something we could 'show off' to our users. This is a +Technology Preview (TP), aimed at allowing you, our users, managers and +developers to see how we have progressed, and to invite your feedback and +support. + +WARNINGS +======== + +Samba4 TP is currently a pre-alpha technology. That is more a +reference to Samba4's lack of the features we expect you will need +than a statement of code quality, but clearly it hasn't seen a broad +deployment yet. If you were to upgrade Samba3 (or indeed Windows) to +Samba4, you would find many things work, but that other key features +you may have relied on simply are not there yet. + +For example, while Samba 3.0 is an excellent member of a Active +Directory domain, Samba4 is happier as a domain controller: (This is +where we have done most of the research and development). + +While Samba4 is subjected to an awesome battery of tests on an +automated basis, and we have found Samba4 to be very stable in it's +behaviour, we have to recommend against upgrading production servers +from Samba 3 to Samba 4 at this stage. If you are upgrading an +experimental server, or looking to develop and test Samba, you should +backup all configuration and data. + +As we research the needs of Active Directory integration more closely, +we may need to change the format of the user database, in particular +as we begin to understand how the attributes are generated and stored. +At a worst case, we expect users will be able to extract the stored +data as LDIF and hand munge it, but until we make an alpha release, we +won't do this automatically. Indeed, many module changes are simply +easier to cope with if you just re-provision after the upgrade. + +We value the security of your computers, and so we must warn you that +Samba 4 Technology Preview includes basic Access Control List (ACL) +protection on the main user database, but due to time constraints, +none on the registry at this stage. We also do not currently have +ACLs on the SWAT web-based management tool. This means that Samba 4 +Technology Preview is not secure, and should not be exposed to +untrusted networks. + +Within the above proviso, file system access should occur as the +logged in user, much as Samba3 does. + +As such, we must strongly recommend against using Samba4 in a +production environment at this stage. + +NEW FEATURES +============ + +Samba4 supports the server-side of the Active Directory logon environment +used by Windows 2000 and later, so we can do full domain join +and domain logon operations with these clients. + +Our Domain Controller (DC) implementation includes our own built-in +LDAP server and Kerberos Key Distribution Centre (KDC) as well as the +Samba3-like logon services provided over CIFS. We correctly generate +the infamous Kerberos PAC, and include it with the Kerberos tickets we +issue. + +SWAT is now integrated into Samba 4 as the user-friendly interface to +Samba server management. SWAT provides easy access to our +setup and migration tools. Using SWAT, you can migrate windows +domains in Samba 4, allowing easy setup of initial user databases, and +upgrades from Samba 3. + +The new VFS features in Samba 4 adapts the file-system on the server to +match the Windows client semantics, allowing Samba 4 to better match +windows behaviour and application expectations. This includes file +annotation information (in streams) and NT ACLs in particular. The +VFS is backed with an extensive automated test suite. + +A new scripting interface has been added to Samba 4, allowing +JavaScript programs to interface to Samba's internals. + +The Samba 4 architecture is based around an LDAP-like database that +can use a range of modular backends. One of the backends supports +standards compliant LDAP servers (including OpenLDAP), and we are +working on modules to map between AD-like behaviours and this back-end. +We are aiming for Samba 4 to be powerful front-end to large +directories. + +CHANGES +======= + +Those familiar with Samba 3 can find a list of user-visible changes +since that release series in the NEWS file. + + - An optional password is no longer supported as the second argument to + smbclient. + + - The default location of smb.conf in non-FHS builds has changed from the + PREFIX/lib directory to the PREFIX/etc directory. + +KNOWN ISSUES +============ + +- Standalone server and domain member roles are not currently + supported. While we have much of the infrastructure required, we + have not collected these pieces together. + +- There is no printing support in the current release. + +- SWAT can be painful with and forms. Just use the mouse, as + the JavaScript layer doing this will change. + +RUNNING Samba4 +============== + +A short guide to setting up Samba 4 can be found in the howto.txt file +in root of the tarball. + +DEVELOPMENT and FEEDBACK +======================== +Bugs can be filed at https://bugzilla.samba.org/. Please +look at the STATUS file before filing a bug to see if a particular +is supposed to work yet. + +Development and general discussion about Samba 4 happens mainly on +the #samba-technical IRC channel (on irc.freenode.net) and +the samba-technical mailing list (see http://lists.samba.org/ for +details). + + diff --git a/howto.txt b/howto.txt index 4e148495d68..7b10b5960a4 100644 --- a/howto.txt +++ b/howto.txt @@ -74,7 +74,8 @@ It is presumed it's available just like any other commands from your shell. Must be run as a user with permission to write to the install directory. # cd source - # ./setup/provision --realm=YOUR.REALM --domain=YOURDOM --adminpass=SOMEPASSWORD + # ./setup/provision --realm=YOUR.REALM --domain=YOURDOM \ + # --adminpass=SOMEPASSWORD --server-role='domain controller' REMINDER: Add the "bin" directory of the path you installed to (e.g. /usr/local/samba/bin) to your path, or the provision command diff --git a/services/json.esp b/services/json.esp deleted file mode 100644 index 6c59db0fca8..00000000000 --- a/services/json.esp +++ /dev/null @@ -1,269 +0,0 @@ -<% - -/* - * Copyright: - * (C) 2006 by Derrell Lipman - * All rights reserved - * - * License: - * LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/ - */ - -/* - * This module provides a JSON encoder. - */ - - -/* escape a string as required by json */ -function _escape(s) -{ - var i; - var arr = new Array(); - - for (i = 0; i < strlen(s); i++) - { - var c = substr(s, i, 1); - if (c == '\x00') - { - arr[i] = '\\u0000'; - } - if (Json._internal.convert[c] != undefined) - { - arr[i] = Json._internal.convert[c]; - } - else - { - arr[i] = c; - } - } - - if (arr.length == 0) - { - return ""; - } - - return join("", arr); -} - -/* encode an arbitrary object. called recursively, for object and array */ -function _encode(o) -{ - var type = nativeTypeOf(o); - - if (type == "undefined") - { - return "null"; /* you really shouldn't count on this! */ - } - else if (type == "null") - { - return "null"; - } - else if (type == "boolean") - { - if (o) - { - return "true"; - } - else - { - return "false"; - } - } - else if (type == "c_function" || - type == "js_function" || - type == "string_c_function") - { - /* no output */ - } - else if (type == "float" || - type == "integer" || - type == "integer64") - { - return o + 0; - } - else if (type == "pointer") - { - var x = "" + o; - return '"' + substr(x, 16, strlen(x) - 16 - 1) + '"'; - } - else if (type == "object") - { - var buf; - - /* Is this an array or an ordinary object? */ - if (o["length"] != undefined) - { - var i; - - /* Assume it's an array if there's a length field */ - buf = "["; - for (i = 0; i < o.length; i++) - { - /* - * NOTE: We don't support sparse arrays nor associative - * arrays. Should we later want to do either, we're supposed - * to send it as an object rather than as an array. - */ - if (i > 0) - { - buf = buf + ","; - } - buf = buf + this.encode(o[i]); - } - buf = buf + "]"; - } - else if (o["__type"] == "_JSON_Date") - { - buf = "" + o.encoding(); - } - else - { - /* No length field, so it must be an ordinary object */ - var key; - var first = true; - - buf = "{"; - for (key in o) - { - if (! first) - { - buf = buf + ","; - } - buf = buf + '"' + key + '":' + this.encode(o[key]); - first = false; - } - buf = buf + "}"; - } - - return buf; - } - else if (type == "string") - { - return '"' + this._internal.escape(o) + '"'; - } - else - { - return '{ "unknown_object":"' + type + '"}'; - } -} - -/* Allocate the public Json access object */ -Json = new Object(); - -/* Json.encode(): encode an arbitrary object */ -Json.encode = _encode; -_encode = null; - -/* Json.decode(): decode a string into its object form */ -Json.decode = literal_to_var; - -/* Internal stuff, not for external access */ -Json._internal = new Object(); - -Json._internal.escape = _escape; -_escape = null; - -Json._internal.convert = new Object(); -Json._internal.convert['\b'] = '\\b'; -Json._internal.convert['\t'] = '\\t'; -Json._internal.convert['\n'] = '\\n'; -Json._internal.convert['\f'] = '\\f'; -Json._internal.convert['\r'] = '\\r'; -Json._internal.convert['"'] = '\\"'; -Json._internal.convert['\\'] = '\\\\'; -Json._internal.convert['\x01'] = '\\u0001'; -Json._internal.convert['\x02'] = '\\u0002'; -Json._internal.convert['\x03'] = '\\u0003'; -Json._internal.convert['\x04'] = '\\u0004'; -Json._internal.convert['\x05'] = '\\u0005'; -Json._internal.convert['\x06'] = '\\u0006'; -Json._internal.convert['\x07'] = '\\u0007'; -Json._internal.convert['\x08'] = '\\u0008'; -Json._internal.convert['\x09'] = '\\u0009'; -Json._internal.convert['\x0a'] = '\\u000a'; -Json._internal.convert['\x0b'] = '\\u000b'; -Json._internal.convert['\x0c'] = '\\u000c'; -Json._internal.convert['\x0d'] = '\\u000d'; -Json._internal.convert['\x0e'] = '\\u000e'; -Json._internal.convert['\x0f'] = '\\u000f'; -Json._internal.convert['\x10'] = '\\u0010'; -Json._internal.convert['\x11'] = '\\u0011'; -Json._internal.convert['\x12'] = '\\u0012'; -Json._internal.convert['\x13'] = '\\u0013'; -Json._internal.convert['\x14'] = '\\u0014'; -Json._internal.convert['\x15'] = '\\u0015'; -Json._internal.convert['\x16'] = '\\u0016'; -Json._internal.convert['\x17'] = '\\u0017'; -Json._internal.convert['\x18'] = '\\u0018'; -Json._internal.convert['\x19'] = '\\u0019'; -Json._internal.convert['\x1a'] = '\\u001a'; -Json._internal.convert['\x1b'] = '\\u001b'; -Json._internal.convert['\x1c'] = '\\u001c'; -Json._internal.convert['\x1d'] = '\\u001d'; -Json._internal.convert['\x1e'] = '\\u001e'; -Json._internal.convert['\x1f'] = '\\u001f'; -/* - * At some point, we probably want to add \x80-\xff as well, and it's then - * probably more efficient to generate these strings dynamically. (Even now - * it may be, but this was the the way I started, and so it remains.) - */ - - -/* Test it */ -/* -libinclude("base.js"); -function testFormat() -{ - var test = new Object(); - test.int = 23; - test.str = "hello world"; - test.float = 223.1; - test.bool = true; - test.array = new Array(); - test.array[0] = "hello"; - test.array[1] = "world"; - test.obj = new Object(); - test.obj.int = 1000; - test.obj.array = new Array(); - test.obj.array[0] = 42; - test.obj.array[1] = 223; - printf("%s\n", Json.encode(test)); -} -testFormat(); -*/ - -/* -libinclude("base.js"); -function testParse() -{ - var s; - - s = '{ "x" : 23 }'; - obj = Json.decode(s); - printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj)); - - s = '{ "x" : [ 23, 42] }'; - obj = Json.decode(s); - printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj)); - - s = '[ 13, 19, { "x" : [ 23, 42] }, 223 ]'; - obj = Json.decode(s); - printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj)); - - s = '{ "x" : [ "hi" ] }'; - obj = Json.decode(s); - printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj)); - - s = '[ 13, 19, { "x" : [ 23, 42, { "y":{"a":"hello", "b":"world", "c":[1,2,3]}}] }, 223 ]'; - obj = Json.decode(s); - printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj)); -} -testParse(); -*/ - -/* - * Local Variables: - * mode: c - * End: - */ -%> diff --git a/services/json_auth.esp b/services/json_auth.esp deleted file mode 100644 index 57fbd7aaacd..00000000000 --- a/services/json_auth.esp +++ /dev/null @@ -1,73 +0,0 @@ -<% -libinclude("auth.js"); - -/* Return true to allow access; false otherwise */ -function json_authenticate(serviceComponents, method, scriptTransportId, error) -{ - // Don't allow any access via ScriptTransport, for now. There are serious - // potential security exploits that will need to be protected against when - // we do want to allow use of ScriptTransport. -- djl - if (scriptTransportId != jsonrpc.Constant.ScriptTransport.NotInUse) - { - error.setError(jsonrpc.Constant.ServerError.PermissionDenied, - "Permission denied"); - return false; - } - - // Does the requested method require authentication? - if (! _authentication_required(serviceComponents, method)) - { - // Nope. Let 'em in. - return true; - } - - // Did our session expire? - if (request['SESSION_EXPIRED'] == "True") - { - // Yup. - error.setError(jsonrpc.Constant.ServerError.SessionExpired, - "Session expired"); - error.setInfo(getDomainList()); - return false; - } - - // Are we authenticated? - if (! session.AUTHENTICATED) - { - // Nope. - error.setError(jsonrpc.Constant.ServerError.NotLoggedIn, - "Not logged in"); - error.setInfo(getDomainList()); - return false; - } - - return true; -} - - -/* - * Return true if authentication is required for the specified method; - * false otherwise. - */ -function _authentication_required(serviceComponents, method) -{ - var m = join(".", serviceComponents) + "." + method; - - // See if this method requires authentication - if (m == "samba.system.login" || - m == "samba.system.logout") - { - // Nope. - return false; - } - - // Anything not listed above requires authentication - return true; -} - -/* - * Local Variables: - * mode: c - * End: - */ -%> diff --git a/services/jsondate.esp b/services/jsondate.esp deleted file mode 100644 index 3467228df6d..00000000000 --- a/services/jsondate.esp +++ /dev/null @@ -1,200 +0,0 @@ -<% -/* - * Copyright: - * (C) 2006 by Derrell Lipman - * All rights reserved - * - * License: - * LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/ - */ - -/* - * Date class for JSON-RPC - */ - - -function _JSON_Date_create(secondsSinceEpoch) -{ - var o = new Object(); - o.__type = "_JSON_Date"; - - function _setUtcDateTimeFields(year, month, day, hour, minute, second, millisecond) - { - this.year = year + 0; - this.month = month + 0; - this.day = day + 0; - this.hour = hour + 0; - this.minute = minute + 0; - this.second = second + 0; - this.millisecond = millisecond + 0; - } - - o.setUtcYear = _setUtcDateTimeFields; - - function _setUtcYear(year) - { - this.year = year + 0; - } - o.setUtcYear = _setUtcYear; - - function _setUtcMonth(month) - { - this.month = month + 0; - } - o.setUtcMonth = _setUtcMonth; - - function _setUtcDay(day) - { - this.day = day + 0; - } - o.setUtcDay = _setUtcDay; - - function _setUtcHour(hour) - { - this.hour = hour + 0; - } - o.setUtcHour = _setUtcHour; - - function _setUtcMinute(minute) - { - this.minute = minute + 0; - } - o.setUtcMinute = _setUtcMinute; - - function _setUtcSecond(second) - { - this.second = second + 0; - } - o.setUtcSecond = _setUtcSecond; - - function _setUtcMillisecond(millisecond) - { - this.millisecond = millisecond + 0; - } - o.setUtcMillisecond = _setUtcMillisecond; - - function _setEpochTime(secondsSinceEpoch) - { - var microseconds = 0; - - if (typeof(secondsSinceEpoch) != "number") - { - var currentTime = gettimeofday(); - secondsSinceEpoch = currentTime.sec; - microseconds = currentTime.usec; - } - - var tm = gmtime(secondsSinceEpoch); - - this.year = 1900 + tm.tm_year; - this.month = tm.tm_mon; - this.day = tm.tm_mday; - this.hour = tm.tm_hour; - this.minute = tm.tm_min; - this.second = tm.tm_sec; - this.millisecond = 0; - } - o.setEpochTime = _setEpochTime; - - function _getUtcYear() - { - return this.year; - } - o.getUtcYear = _getUtcYear; - - function _getUtcMonth() - { - return this.month; - } - o.getUtcMonth = _getUtcMonth; - - function _getUtcDay() - { - return this.day; - } - o.getUtcDay = _getUtcDay; - - function _getUtcHour() - { - return this.hour; - } - o.getUtcHour = _getUtcHour; - - function _getUtcMinute() - { - return this.minute; - } - o.getUtcMinute = _getUtcMinute; - - function _getUtcSecond() - { - return this.second; - } - o.getUtcSecond = _getUtcSecond; - - function _getUtcMillisecond() - { - return this.millisecond; - } - o.getUtcMillisecond = _getUtcMillisecond; - - function _getEpochTime() - { - var tm = new Object(); - tm.tm_sec = this.second; - tm.tm_min = this.minute; - tm.tm_hour = this.hour; - tm.tm_mday = -1; - tm.tm_mon = this.month; - tm.tm_year = this.year; - tm.tm_wday = -1; - tm.tm_yday = -1; - tm.isdst = 0; - return gmmktime(tm); - } - o.getEpochTime = _getEpochTime; - - function _encoding() - { - /* Encode the date in a well-documented fashion */ - return sprintf("new Date(Date.UTC(%d,%d,%d,%d,%d,%d,%d))", - this.year, - this.month, - this.day, - this.hour, - this.minute, - this.second, - this.millisecond); - } - o.encoding = _encoding; - - if (! secondsSinceEpoch) - { - var now = gettimeofday(); - o.setEpochTime(now.sec); - } - else - { - o.setEpochTime(secondsSinceEpoch); - } - o.year = 0; - o.month = 0; - o.day = 0; - o.hour = 0; - o.minute = 0; - o.second = 0; - o.millisecond = 0; - return o; -} - -JSON_Date = new Object(); -JSON_Date.create = _JSON_Date_create; -_JSON_Date_create = null; - - -/* - * Local Variables: - * mode: c - * End: - */ -%> diff --git a/services/qooxdoo/test.esp b/services/qooxdoo/test.esp deleted file mode 100644 index e8686dcc255..00000000000 --- a/services/qooxdoo/test.esp +++ /dev/null @@ -1,236 +0,0 @@ -<% -/* - * Copyright: - * (C) 2006 by Derrell Lipman - * All rights reserved - * - * License: - * LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/ - */ - -/* - * This is the standard qooxdoo test class. There are tests for each of the - * primitive types here, along with standard named tests "echo", "sink" and - * "sleep". - */ - -/** - * Echo the (one and only) parameter. - * - * @param params - * An array containing the parameters to this method - * - * @param error - * An object of class JsonRpcError. - * - * @return - * Success: The object containing the result of the method; - * Failure: null - */ -function _echo(params, error) -{ - if (params.length != 1) - { - error.setError(JsonRpcError_ParameterMismatch, - "Expected 1 parameter; got " + params.length); - return error; - } - return "Client said: [" + params[0] + "]"; -} -jsonrpc.method.echo = _echo; - -/** - * Sink all data and never return. - * - * @param params - * An array containing the parameters to this method (none expected) - * - * @param error - * An object of class JsonRpcError. - * - * @return - * "Never" - */ -function _sink(params, error) -{ - /* We're never supposed to return. Just sleep for a very long time. */ - sleep(240); -} -jsonrpc.method.sink = _sink; - -/** - * Sleep for the number of seconds specified by the parameter. - * - * @param params - * An array containing the parameters to this method (one expected) - * - * @param error - * An object of class JsonRpcError. - * - * @return - * Success: The object containing the result of the method; - * Failure: null - */ -function _sleep(params, error) -{ - if (params.length != 1) - { - error.setError(JsonRpcError_ParameterMismatch, - "Expected 1 parameter; got " + params.length); - return error; - } - - sleep(params[0]); - return params[0]; -} -jsonrpc.method.sleep = _sleep; - -/*************************************************************************/ - -/* - * The remainder of the functions test each individual primitive type, and - * test echoing arbitrary types. Hopefully the name is self-explanatory. - */ - -function _getInteger(params, error) -{ - return 1; -} -jsonrpc.method.getInteger = _getInteger; - -function _getFloat(params, error) -{ - return 1/3; -} -jsonrpc.method.getFloat = _getFloat; - -function _getString(params, error) -{ - return "Hello world"; -} -jsonrpc.method.getString = _getString; - -function _getBadString(params, error) -{ - return ""; -} -jsonrpc.method.getBadString = _getBadString; - -function _getArrayInteger(params, error) -{ - return new Array(1, 2, 3, 4); -} -jsonrpc.method.getArrayInteger = _getArrayInteger; - -function _getArrayString(params, error) -{ - return new Array("one", "two", "three", "four"); -} -jsonrpc.method.getArrayString = _getArrayString; - -function _getObject(params, error) -{ - o = new Object(); // some arbitrary object - o.something = 23; - o.garbage = 'lkasjdff;lajsdfkl;sadf'; - return o; -} -jsonrpc.method.getObject = _getObject; - -function _getTrue(params, error) -{ - return true; -} -jsonrpc.method.getTrue = _getTrue; - -function _getFalse(params, error) -{ - return false; -} -jsonrpc.method.getFalse = _getFalse; - -function _getNull(params, error) -{ - return null; -} -jsonrpc.method.getNull = _getNull; - -function _isInteger(params, error) -{ - var type = nativeTypeOf(params[0]); - return type == "integer" || type == "integer64"; -} -jsonrpc.method.isInteger = _isInteger; - -function _isFloat(params, error) -{ - return nativeTypeOf(params[0]) == "float"; -} -jsonrpc.method.isFloat = _isFloat; - -function _isString(params, error) -{ - return nativeTypeOf(params[0]) == "string"; -} -jsonrpc.method.isString = _isString; - -function _isBoolean(params, error) -{ - return nativeTypeOf(params[0]) == "boolean"; -} -jsonrpc.method.isBoolean = _isBoolean; - -function _isArray(params, error) -{ - return nativeTypeOf(params[0]) == "object" && params.length != undefined; -} -jsonrpc.method.isArray = _isArray; - -function _isObject(params, error) -{ - return nativeTypeOf(params[0]) == "object"; -} -jsonrpc.method.isObject = _isObject; - -function _isNull(params, error) -{ - return nativeTypeOf(params[0]) == "null"; -} -jsonrpc.method.isNull = _isNull; - -function _getParams(params, error) -{ - return params; -} -jsonrpc.method.getParams = _getParams; - -function _getParam(params, error) -{ - return params[0]; -} -jsonrpc.method.getParam = _getParam; - -function _getCurrentTimestamp() -{ - now = gettimeofday(); - obj = new Object(); - obj.now = now.sec; - obj.json = JSON_Date.create(now); - return obj; -} -jsonrpc.method.getCurrentTimestamp = _getCurrentTimestamp; - -function _getError(params, error) -{ - error.setError(23, "This is an application-provided error"); - return error; -} -jsonrpc.method.getError = _getError; - - -/* - * Local Variables: - * mode: c - * End: - */ -%> diff --git a/services/request.esp b/services/request.esp deleted file mode 100644 index 03226f975d0..00000000000 --- a/services/request.esp +++ /dev/null @@ -1,540 +0,0 @@ -<% - -/* - * Copyright: - * (C) 2006 by Derrell Lipman - * All rights reserved - * - * License: - * LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/ - */ - -/* - * This is a simple JSON-RPC server. - */ - -/* Bring in the json format/parse functions */ -jsonrpc_include("json.esp"); - -/* Bring in the date class */ -jsonrpc_include("jsondate.esp"); - -/* Load the authentication script */ -jsonrpc_include("json_auth.esp"); - - -/* bring the string functions into the global frame */ -string_init(global); - -/* Bring the system functions into the global frame */ -sys_init(global); - -/* Bring the session functions into the global frame */ -system_session(global); - - -function printf() -{ - print(vsprintf(arguments)); -} - - -/* - * All of our manipulation of JSON RPC methods will be through this object. - * Each class of methods will assign to here, and all of the constants will - * also be in this object. - */ -jsonrpc = new Object(); -jsonrpc.Constant = new Object(); -jsonrpc.Constant.ErrorOrigin = new Object(); /* error origins */ -jsonrpc.Constant.ServerError = new Object(); /* server-generated error codes */ -jsonrpc.method = new Object(); /* methods available in requested class */ - -/* - * ScriptTransport constants - */ -jsonrpc.Constant.ScriptTransport = new Object(); -jsonrpc.Constant.ScriptTransport.NotInUse = -1; - - -/* - * JSON-RPC error origin constants - */ -jsonrpc.Constant.ErrorOrigin.Server = 1; -jsonrpc.Constant.ErrorOrigin.Application = 2; -jsonrpc.Constant.ErrorOrigin.Transport = 3; -jsonrpc.Constant.ErrorOrigin.Client = 4; - - - -/* - * JSON-RPC server-generated error code constants - */ - -/** - * Error code, value 0: Unknown Error - * - * The default error code, used only when no specific error code is passed to - * the JsonRpcError constructor. This code should generally not be used. - */ -jsonrpc.Constant.ServerError.Unknown = 0; - -/** - * Error code, value 1: Illegal Service - * - * The service name contains illegal characters or is otherwise deemed - * unacceptable to the JSON-RPC server. - */ -jsonrpc.Constant.ServerError.IllegalService = 1; - -/** - * Error code, value 2: Service Not Found - * - * The requested service does not exist at the JSON-RPC server. - */ -jsonrpc.Constant.ServerError.ServiceNotFound = 2; - -/** - * Error code, value 3: Class Not Found - * - * If the JSON-RPC server divides service methods into subsets (classes), this - * indicates that the specified class was not found. This is slightly more - * detailed than "Method Not Found", but that error would always also be legal - * (and true) whenever this one is returned. (Not used in this implementation) - */ -jsonrpc.Constant.ServerError.ClassNotFound = 3; - -/** - * Error code, value 4: Method Not Found - * - * The method specified in the request is not found in the requested service. - */ -jsonrpc.Constant.ServerError.MethodNotFound = 4; - -/* - * Error code, value 5: Parameter Mismatch - * - * If a method discovers that the parameters (arguments) provided to it do not - * match the requisite types for the method's parameters, it should return - * this error code to indicate so to the caller. - * - * This error is also used to indicate an illegal parameter value, in server - * scripts. - */ -jsonrpc.Constant.ServerError.ParameterMismatch = 5; - -/** - * Error code, value 6: Permission Denied - * - * A JSON-RPC service provider can require authentication, and that - * authentication can be implemented such the method takes authentication - * parameters, or such that a method or class of methods requires prior - * authentication. If the caller has not properly authenticated to use the - * requested method, this error code is returned. - */ -jsonrpc.Constant.ServerError.PermissionDenied = 6; - -/*** Errors generated by this server which are not qooxdoo-standard ***/ - -/* - * Error code, value 1000: Unexpected Output - * - * The called method illegally generated output to the browser, which would - * have preceeded the JSON-RPC data. - */ -jsonrpc.Constant.ServerError.UnexpectedOutput = 1000; - -/* - * Error code, value 1001: Resource Error - * - * Too many resources were requested, a system limitation on the total number - * of resources has been reached, or a resource or resource id was misused. - */ -jsonrpc.Constant.ServerError.ResourceError = 1001; - -/* - * Error code, value 1002: Not Logged In - * - * The user has logged out and must re-authenticate, or this is a brand new - * session and the user must log in. - * - */ -jsonrpc.Constant.ServerError.NotLoggedIn = 1002; - -/* - * Error code, value 1003: Session Expired - * - * The session has expired and the user must re-authenticate. - * - */ -jsonrpc.Constant.ServerError.SessionExpired = 1003; - -/* - * Error code, value 1004: Login Failed - * - * An attempt to log in failed. - * - */ -jsonrpc.Constant.ServerError.LoginFailed = 1004; - - - - - -function sendReply(reply, scriptTransportId) -{ - /* If not using ScriptTransport... */ - if (scriptTransportId == jsonrpc.Constant.ScriptTransport.NotInUse) - { - /* ... then just output the reply. */ - write(reply); - } - else - { - /* Otherwise, we need to add a call to a qooxdoo-specific function */ - reply = - "qx.io.remote.ScriptTransport._requestFinished(" + - scriptTransportId + ", " + reply + - ");"; - write(reply); - } -} - - -function _jsonValidRequest(req) -{ - if (req == undefined) - { - return false; - } - - if (typeof(req) != "object") - { - return false; - } - - if (req["id"] == undefined) - { - return false; - } - - if (req["service"] == undefined) - { - return false; - } - - if (req["method"] == undefined) - { - return false; - } - - if (req["params"] == undefined) - { - return false; - } - - return true; -} -jsonrpc.validRequest = _jsonValidRequest; -_jsonValidRequest = null; - -/* - * class JsonRpcError - * - * This class allows service methods to easily provide error information for - * return via JSON-RPC. - */ -function _JsonRpcError_create(origin, code, message) -{ - var o = new Object(); - - o.data = new Object(); - o.data.origin = origin; - o.data.code = code; - o.data.message = message; - o.scriptTransportId = jsonrpc.Constant.ScriptTransport.NotInUse; - o.__type = "_JsonRpcError"; - - function _origin(origin) - { - this.data.origin = origin; - } - o.setOrigin = _origin; - - function _setError(code, message) - { - this.data.code = code; - this.data.message = message; - } - o.setError = _setError; - - function _setId(id) - { - this.id = id; - } - o.setId = _setId; - - function _setScriptTransportId(id) - { - this.scriptTransportId = id; - } - o.setScriptTransportId = _setScriptTransportId; - - function _setInfo(info) - { - // Add the info field only if info is actually provided. - // This is an extension to qooxdoo's normal Error return value. - this.data.info = info; - } - o.setInfo = _setInfo; - - function _Send() - { - var error = this; - var id = this.id; - var ret = new Object(); - ret.error = this.data; - ret.id = this.id; - sendReply(Json.encode(ret), this.scriptTransportId); - } - o.Send = _Send; - - return o; -} - -jsonrpc.createError = _JsonRpcError_create; -_JsonRpcError_create = null; - -/* - * 'input' is the user-provided json-encoded request - * 'jsonInput' is that request, decoded into its object form - */ -var input; -var jsonInput = null; - -/* Allocate a generic error object */ -error = jsonrpc.createError(jsonrpc.Constant.ErrorOrigin.Server, - jsonrpc.Constant.ServerError.Unknown, - "Unknown error"); - -/* Assume (default) we're not using ScriptTransport */ -scriptTransportId = jsonrpc.Constant.ScriptTransport.NotInUse; - -/* What type of request did we receive? */ -if (request["REQUEST_METHOD"] == "POST" && - request["CONTENT_TYPE"] == "application/json") -{ - /* We found literal POSTed json-rpc data (we hope) */ - input = request["POST_DATA"]; - jsonInput = Json.decode(input); -} -else if (request["REQUEST_METHOD"] == "GET" && - form["_ScriptTransport_id"] != undefined && - form["_ScriptTransport_id"] != - jsonrpc.Constant.ScriptTransport.NotInUse && - form["_ScriptTransport_data"] != undefined) -{ - /* We have what looks like a valid ScriptTransport request */ - scriptTransportId = form["_ScriptTransport_id"]; - error.setScriptTransportId(scriptTransportId); - input = form["_ScriptTransport_data"]; - jsonInput = Json.decode(input); -} - -/* Ensure that this was a JSON-RPC service request */ -if (! jsonrpc.validRequest(jsonInput)) -{ - /* - * This request was not issued with JSON-RPC so echo the error rather than - * issuing a JsonRpcError response. - */ - write("JSON-RPC request expected; service, method or params missing
"); - return; -} - -/* - * Ok, it looks like JSON-RPC, so we'll return an Error object if we encounter - * errors from here on out. - */ -error.setId(jsonInput.id); - -/* Service and method names may contain these characters */ -var nameChars = - "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; - -/* The first letter of service and method names must be a letter */ -var nameFirstLetter = - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - -/* - * Ensure the method name is kosher. A method name should be: - * - * - first character is in [a-zA-Z] - * - other characters are in [_a-zA-Z0-9] - */ - -/* First check for legal characters */ -if (strspn(jsonInput.method, nameChars) != strlen(jsonInput.method)) -{ - /* There's some illegal character in the service name */ - error.setError(jsonrpc.Constant.ServerError.MethodNotFound, - "Illegal character found in method name."); - error.Send(); - return; -} - -/* Now ensure that it begins with a letter */ -if (strspn(substr(jsonInput.method, 0, 1), nameFirstLetter) != 1) -{ - error.setError(jsonrpc.Constant.ServerError.MethodNotFound, - "The method name does not begin with a letter"); - error.Send(); - return; -} - -/* - * Ensure the requested service name is kosher. A service name should be: - * - * - a dot-separated sequences of strings; no adjacent dots - * - first character of each string is in [a-zA-Z] - * - other characters are in [_a-zA-Z0-9] - */ - -/* First check for legal characters */ -if (strspn(jsonInput.service, "." + nameChars) != strlen(jsonInput.service)) -{ - /* There's some illegal character in the service name */ - error.setError(jsonrpc.Constant.ServerError.IllegalService, - "Illegal character found in service name."); - error.Send(); - return; -} - -/* - * Now ensure there are no double dots. - * - * Frustration with ejs. Result must be NULL, but we can't use the === - * operator: strstr() === null so we have to use typeof. If the result isn't - * null, then it'll be a number and therefore not type "pointer". - */ -if (typeof(strstr(jsonInput.service, "..")) != "pointer") -{ - error.setError(jsonrpc.Constant.ServerError.IllegalService, - "Illegal use of two consecutive dots in service name"); - error.Send(); - return; -} - -/* Explode the service name into its dot-separated parts */ -var serviceComponents = split(".", jsonInput.service); - -/* Ensure that each component begins with a letter */ -for (var i = 0; i < serviceComponents.length; i++) -{ - if (strspn(substr(serviceComponents[i], 0, 1), nameFirstLetter) != 1) - { - error.setError(jsonrpc.Constant.ServerError.IllegalService, - "A service name component does not begin with a letter"); - error.Send(); - return; - } -} - -/* - * Now replace all dots with slashes so we can locate the service script. We - * also retain the split components of the path, as the class name of the - * service is the last component of the path. - */ -var servicePath = join("/", serviceComponents) + ".esp"; - -/* Load the requested class */ -if (jsonrpc_include(servicePath)) -{ - /* Couldn't find the requested service */ - error.setError(jsonrpc.Constant.ServerError.ServiceNotFound, - "Service class `" + servicePath + "` does not exist."); - error.Send(); - return; -} - -/* - * Find the requested method. - * - * What we really want to do here, and could do in any reasonable language, - * is: - * - * method = jsonrpc.method[jsonInput.method]; - * if (method && typeof(method) == "function") ... - * - * The following completely unreasonable sequence of commands is because: - * - * (a) ejs evaluates all OR'ed expressions even if an early one is false, and - * barfs on the typeof(method) call if method is undefined - * - * (b) ejs does not allow comparing against the string "function"!!! What - * the hell is special about that particular string??? - * - * E-gad. What a mess. - */ -var method = jsonrpc.method[jsonInput.method]; -var valid = (method != undefined); -if (valid) -{ - var type = typeof(method); - if (substr(type, 0, 1) != 'f' || substr(type, 1) != "unction") - { - valid = false; - } -} - -if (! valid) -{ - error.setError(jsonrpc.Constant.ServerError.MethodNotFound, - "Method `" + jsonInput.method + "` not found."); - error.Send(); - return; -} - -/* - * Ensure the logged-in user is allowed to issue the requested method. We - * provide the scriptTransportId as one of the determining factors because - * accepting requests via ScriptTransport is dangerous. Only methods which - * one might allow when unauthenticated should be allowed via ScriptTransport - * as it is easy for a rogue site to trick a user into bypassing - * authentication. - */ -if (! json_authenticate(serviceComponents, - jsonInput.method, - scriptTransportId, - error)) -{ - error.Send(); - return; -} - -/* Most errors from here on out will be Application-generated */ -error.setOrigin(jsonrpc.Constant.ErrorOrigin.Application); - -/* Call the requested method passing it the provided params */ -var retval = method(jsonInput.params, error); - -/* See if the result of the function was actually an error object */ -if (retval["__type"] == "_JsonRpcError") -{ - /* Yup, it was. Return the error */ - retval.Send(); - return; -} - -/* Give 'em what they came for! */ -var ret = new Object(); -ret.result = retval; -ret.id = jsonInput.id; -sendReply(Json.encode(ret), scriptTransportId); - -/* - * Local Variables: - * mode: c - * End: - */ -%> diff --git a/services/resources.esp b/services/resources.esp deleted file mode 100644 index b5c4bd3b3d3..00000000000 --- a/services/resources.esp +++ /dev/null @@ -1,171 +0,0 @@ -<% - -/* - * Various JSON-RPC calls will want to maintain open resources within a - * session, across multiple calls. We'll provide a standardized way to - * maintain those open resources here, with some protection against rogue - * scripts. - */ - -function _resourcesCreate() -{ - /* The being-created resources object */ - var o = new Object(); - - /* - * The maximum number of resources available to a single session. This - * should be more than is ever needed (even by reasonable recursive - * functions) but limits rogue scripts ability to generate DOS attacks. - */ - o.RESOURCE_LIMIT = 100; - - /* List of current resources */ - o.resourceList = new Object(); - - /* Resource id values will be constantly incrementing; never reset. */ - o.resourceList.id = 0; - - /* We'll maintain our own count of the number of open resources */ - o.resourceList.count = 0; - - - /* - * Set a new saved resource. - */ - function _set(resource, type, error) - { - /* Do they already have the maximum number of resources allocated? */ - if (this.resourceList.count >= this.RESOURCE_LIMIT) - { - /* Yup. */ - error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server); - error.setError(jsonrpc.Constant.ServerError.ResourceError, - "Session limit on resources (" + - RESOURCE_LIMIT + - ") exceeded."); - return error; - } - - /* Allocate an object to hold the new resource and its type */ - var r = new Object(); - - /* Save the resource and its type */ - r.resource = resource; - r.type = type; - r.id = this.resourceList.id; - - /* Add this resource to the list */ - this.resourceList[this.resourceList.id] = r; - - /* There's a new resource in the list! */ - this.resourceList.count++; - - /* - * Return the index of the resource, its resource id, and advance to - * the next resource id for next time. - */ - var id = this.resourceList.id; - this.resourceList.id++; - return id; - } - o.set = _set; - - /* - * Get a previously-saved resource - */ - function _get(resourceId, error) - { - /* Does the specified resource id exist? */ - if (! this.resourceList[resourceId]) - { - /* Nope. */ - error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server); - error.setError(jsonrpc.Constant.ServerError.ResourceError, - "Resource not found."); - return error; - } - - /* Retrieve the resource */ - var r = this.resourceList[resourceId]; - - /* Give 'em what they came for! */ - return r.resource; - } - o.get = _get; - - /* - * Find a previously-saved resource - */ - function _find(type, error) - { - /* Does the specified resource id exist? */ - for (var resourceId in this.resourceList) - { - /* Retrieve the resource */ - var r = this.resourceList[resourceId]; - - /* Ignore "id" and "count" integer fields */ - if (typeof(r) == "object") - { - /* Is the specified resource the correct type? */ - if (r.type == type) - { - /* Yup, this is the one they want. */ - return r.id; - } - } - } - - /* It wasn't found. */ - return undefined; - } - o.find = _find; - - /* - * Release a previously-saved resource, allowing it to be freed - */ - function _release(resourceId, error) - { - /* Does the specified resource id exist? */ - if (! this.resourceList[resourceId]) - { - /* Nope. */ - error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server); - error.setError(jsonrpc.Constant.ServerError.ResourceError, - "Resource not found."); - return error; - } - - /* It exists. Delete it. */ - delete this.resourceList[resourceId]; - - /* There's now one fewer resources in the list */ - this.resourceList.count--; - } - o.release = _release; - - /* - * Retrieve the list of resources (for debugging) */ - */ - function _getList(error) - { - return this.resourceList; - } - o.getList = _getList; - - return o; -} - -/* singleton: create session resources list */ -if (! session.resources) -{ - session.resources = _resourcesCreate(); -} - - -/* - * Local Variables: - * mode: c - * End: - */ -%> diff --git a/services/samba/adm.esp b/services/samba/adm.esp deleted file mode 100644 index 8843a068eb7..00000000000 --- a/services/samba/adm.esp +++ /dev/null @@ -1,28 +0,0 @@ -<% - -jsonrpc_include("resources.esp"); - -libinclude("base.js"); -libinclude("management.js"); - -function _echo(params, error) { - var echo_string = params[0]; - return echo_string; -} -jsonrpc.method.echo = _echo; - -function _nbt_packet_stats(params, error) { - var stats = nbtd_statistics(); - stats.server_status = new Object(); - stats.server_status = server_status("nbt"); - return stats; -} -jsonrpc.method.NBTPacketStats = _nbt_packet_stats; - - -/* - * Local Variables: - * mode: c - * End: - */ -%> diff --git a/services/samba/config.esp b/services/samba/config.esp deleted file mode 100644 index bf4b789c13b..00000000000 --- a/services/samba/config.esp +++ /dev/null @@ -1,26 +0,0 @@ -<% - -/* - * Copyright (C) Rafal Szczesniak 2007 - */ - -/* Simple JSON-RPC access to the configuration parameters */ - -function _lp_get(params, error) -{ - if (params.length < 1) - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "no parameter specified"); - return error; - } - - var lp = loadparm_init(); - var name = params[0]; - var value = lp.get(name); - - return value; -} -jsonrpc.method.lp_get = _lp_get; - -%> diff --git a/services/samba/ejsnet.esp b/services/samba/ejsnet.esp deleted file mode 100644 index 00424f2cae4..00000000000 --- a/services/samba/ejsnet.esp +++ /dev/null @@ -1,178 +0,0 @@ -<% - -/* - * Copyright (C) Rafal Szczesniak 2007 - */ - -/* JSON-RPC mappings to the libnet functions */ - -jsonrpc_include("resources.esp"); - - -function _NetContext(params, error) -{ - var hostName, credParams, credentials; - var resName = "netCtx"; - - credentials = session.authinfo.credentials; - - if (params.length > 0) - { - /* first expected argument is host name that this context is going - to be attached to */ - hostName = params[0]; - if (typeof(hostName) != "string" || hostName == "") - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "hostName parameter is expected to be a valid non zero-length string"); - return error; - } - - resName = "netCtx[" + hostName + "]"; - - /* check whether credentials are supplied as well */ - if (params.length > 1) - { - /* create user specified credentials object */ - credParams = params[1]; - if (typeof(credParams) != "object") - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "credentials parameter is expected to be an object"); - return error; - } - - if (typeof(credParams.domain) != "string") - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "a valid string is expected in credentials.domain"); - return error; - } - - if (typeof(credParams.username) != "string") - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "a valid string is expected in credentials.username"); - return error; - } - - if (typeof(credParams.username) != "string") - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "a valid string is expected in credentials.password"); - return error; - } - - credentials = credentials_init(); - credentials.set_domain(credParams.domain); - credentials.set_username(credParams.username); - credentials.set_password(credParams.password); - } - } - - /* was this NetContext created yet ? */ - var resId = session.resources.find(resName, error); - if (resId != undefined) - { - /* yes, return its resource id */ - return resId; - } - - /* no, create the new context and assign it a resource id */ - var netCtx = NetContext(credentials); - resId = session.resources.set(netCtx, resName, error); - return resId; -} -jsonrpc.method.NetContext = _NetContext; - - -function _NetContextCreds(params, error) -{ - if (params.length != 1) - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "missing resource id parameter"); - return error; - } - - var resId = params[0]; - if (typeof(resId) != "number") - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "an integer parameter is required"); - return error; - } - - var netCtx = session.resources.get(resId, error); - if (typeof(netCtx) != "object") - { - return null; - } - - var creds = netCtx.credentials; - var result = new Object(); - result.username = creds.get_username(); - result.domain = creds.get_domain(); - - return result; -} -jsonrpc.method.NetContextCreds = _NetContextCreds; - - -function _UserMgr(params, error) -{ - var domainName = null, netCtxId; - var resId = -1; - var resName = "usrCtx"; - var netCtx = undefined; - var usrCtx = undefined; - - if (params.length == 0) - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "NetContext parameter missing"); - return error; - } - - /* checking NetContext parameter */ - netCtxId = params[0]; - if (netCtxId == undefined || typeof(netCtxId) != "number") - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "NetContext parameter is expected to be a number"); - } - - netCtx = session.resources.get(netCtxId, error); - if (netCtx == undefined || typeof(netCtx) != "object") - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "Incorrect NetContext passed"); - return error; - } - - if (params.length > 1) - { - domainName = params[1]; - if (domainName == undefined || typeof(domainName) != "string") - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "domainName parameter is expected to be a valid non zero-length string"); - return error; - } - } - - if (domainName == "") - { - usrCtx = netCtx.UserMgr(); - } - else - { - usrCtx = netCtx.UserMgr(domainName); - } - - resId = session.resources.set(usrCtx, resName, error); - return resId; -} -jsonrpc.method.UserMgr = _UserMgr; - -%> diff --git a/services/samba/ldb.esp b/services/samba/ldb.esp deleted file mode 100644 index f69abde3886..00000000000 --- a/services/samba/ldb.esp +++ /dev/null @@ -1,675 +0,0 @@ -<% -/* - * Copyright: - * (C) 2006 by Derrell Lipman - * All rights reserved - * - * License: - * LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/ - */ - -/* - * JSON-RPC mappings to the ldb ejs functions - */ - -/* We'll be saving resources in the session */ -jsonrpc_include("resources.esp"); - - -/** - * Local function to determine if the requested database is one which we allow - * access to. - * - * @param dbRequested - * Name of the database which is being requested to be opened - * - * @return - * true if access is allowed; false otherwise. - */ -function accessAllowed(dbRequested) -{ - /* Databases allowed to connect to */ - dbAllowed = new Array(); - dbAllowed[dbAllowed.length] = "sam.ldb"; - - for (var i = 0; i < dbAllowed.length; i++) - { - if (dbRequested == dbAllowed[i]) - { - return true; - } - } - - return false; -} - - -/** - * Connect to a database - * - * @param params[0] - * Database name - * - * @param params[1..n] - * Option (e.g. "modules:modlist") - * - * @param error - * An object of class JsonRpcError. - * - * @return - * Success: The resource id to be used for future access to the database - * Failure: error event - * - * @note - * Credentials or session_info may be set up first. - */ -function _connect(params, error) -{ - if (params.length < 1) - { - error.setError(jsonrpc.Constant.ServerError.ParameterMismatch, - "usage: [