home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 May / Pcwk0597.iso / borland / ib / setups / intrabld / data.z / SECURITY.JS < prev    next >
Text File  |  1996-12-11  |  70KB  |  1,690 lines

  1. #define SM_PASSWORD "masterkey"
  2. #include <security.h>
  3.  
  4. /****************************************************************************\
  5. *                                                                            *
  6. * Classname   SecurityManager                                                *
  7. *                                                                            *
  8. * Purpose     Security class for non-administrative purposes. Keeps track    *
  9. *             of one user. Allows login and querying of access privileges.   *
  10. *                                                                            *
  11. * Dependencies:                                                              *
  12. *                                                                            *
  13. *    The SecurityManager class needs access to two tables, SMENTITY and      *
  14. *    SMASSIGN. These files are found by using a BDE alias named              *
  15. *    SecurityManager. You must use the BDE Configuration Utility to create   *
  16. *    a Standard alias by this name that points to the directory containing   *
  17. *    these two tables.                                                       *
  18. *                                                                            *
  19. *    Additionally, SECURITY.H is located in the IntraBuilder\Include         *
  20. *    directory.                                                              *
  21. *                                                                            *
  22. * Properties:                                                                *
  23. *                                                                            *
  24. *    classname - "SecurityManager"                                           *
  25. *                                                                            *
  26. * Methods:                                                                   *
  27. *                                                                            *
  28. *   changeDescription( <new description> )                                   *
  29. *   changePassword( <old>, <new> )                                           *
  30. *   getCreated()                          // return date created             *
  31. *   getDescription()                      // return description              *
  32. *   getGroups()                           // return AssocArray of groups     *
  33. *   getLogin()                  // return date of last (current) login       *
  34. *   getPolicyValue( <policy name> )       // return policy value             *
  35. *   getResources()                        // return AssocArray of resources  *
  36. *   getUserName()                         // return user name                *
  37. *   hasAccessTo( <resource name> )        // return true/false               *
  38. *   isMemberOf( <group name> )             // return true/false              *
  39. *   login( <user name>, <password> )                                         *
  40. *                                                                            *
  41. * Exceptions thrown:                                                         *
  42. *                                                                            *
  43. *   Constructor and methods may throw exceptions of class SmException.       *
  44. *   Calls to this class should be made within a try block. Security          *
  45. *   specific exceptions can be caught as SmException objects. See example.   *
  46. *                                                                            *
  47. * Example:                                                                   *
  48. *                                                                            *
  49. *   #include "security.h"  // defines SmException code values                *
  50. *   try {                                                                    *
  51. *      var x = new SecurityManager();                                        *
  52. *      x.login("sysdba","masterkey");                                        *
  53. *   }                                                                        *
  54. *   catch (SmException e) {                                                  *
  55. *      alert( "A security error has occured (" + e.code + ")" );             *
  56. *   }                                                                        *
  57. *                                                                            *
  58. * Updated 8/27/96 by IntraBuilder Samples Group                              *
  59. * $Revision:   1.4  $                                                        *
  60. *                                                                            *
  61. * Copyright (c) 1996, Borland International, Inc. All rights reserved.       *
  62. *                                                                            *
  63. \****************************************************************************/
  64. class SecurityManager {
  65.    this.classname    = "SecurityManager";
  66.    // 
  67.    // The _policy property is the same for all users
  68.    //
  69.    this._policy      = new AssocArray();
  70.  
  71.    //
  72.    // User specific properties. Set in login() method.
  73.    //
  74.    this._created     = null;
  75.    this._description = null;
  76.    this._group       = new Array();
  77.    this._login       = null;
  78.    this._resource    = new Array();
  79.    this._username    = null;
  80.  
  81.    // 
  82.    // Check to see if the SecurityManager alias exists
  83.    // 
  84.    this._session = new Session();
  85.    this._database = new Database();
  86.    this._database.session = this._session;
  87.    this._database.databaseName = SM_DATABASE_ALIAS;
  88.    this._database.session.addPassword( SM_PASSWORD );
  89.    try {
  90.       this._database.active = true;
  91.    }
  92.    catch (Exception e) {
  93.       throw new SmException(SM_ERROR_BDE_ALIAS_MISSING);
  94.    }
  95.  
  96.    // store the policies to the _policy array
  97.    var tPolicy = new Query();
  98.    tPolicy.database = this._database;
  99.    tPolicy.sql = 'select * from smentity sm where sm."Entity Type" = ' 
  100.                  + SM_ENTITY_POLICY ;
  101.    tPolicy.active = true;
  102.    var rs = tPolicy.rowset;
  103.    while (!rs.endOfSet) {
  104.       this._policy[rs.fields["Entity Name"].value] = 
  105.          ( rs.fields["Policy Boolean"].value ? 
  106.            (rs.fields["Policy Value"].value != 0) :
  107.            (rs.fields["Policy Value"].value) );
  108.       rs.next();
  109.    }
  110.  
  111.  
  112.    function changePassword(oldPass, newPass) {
  113.       // make sure there is a current user
  114.       if (this._username == null) 
  115.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  116.  
  117.       // check that the parameters are valid
  118.       if (oldPass == null)
  119.          throw new SmException(SM_ERROR_INVALID_PASSWORD);
  120.       if (newPass == null)
  121.          throw new SmException(SM_ERROR_INVALID_PASSWORD);
  122.  
  123.       // new password must meet min/max policy requirements
  124.       if (newPass.length < this.getPolicyValue("PASSMIN"))
  125.          throw new SmException(SM_ERROR_PASSWORD_TOO_SHORT);
  126.       if (newPass.length > this.getPolicyValue("PASSMAX"))
  127.          throw new SmException(SM_ERROR_PASSWORD_TOO_LONG);
  128.  
  129.       // find this user in the smentity table
  130.       var tUser = new Query();
  131.       tUser.database = this._database;
  132.       tUser.sql = 'select * from smentity sm where sm."Entity Name" = "' +
  133.                   this._username + '" and sm."Entity Type" = ' + SM_ENTITY_USER ;
  134.       tUser.active = true;
  135.       var fld = tUser.rowset.fields;
  136.  
  137.       //
  138.       // Look for various error conditions
  139.       //
  140.  
  141.       // username not found
  142.       if (tUser.rowset.endOfSet)
  143.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  144.  
  145.       // user account is currently disabled
  146.       if (fld["User Disabled"].value)
  147.          throw new SmException(SM_ERROR_LOGIN_DISABLED);
  148.  
  149.       // invalid password
  150.       if ((this.getPolicyValue('CASE') 
  151.            && fld["User Password"].value != oldPass) ||
  152.           (!this.getPolicyValue('CASE') 
  153.            && fld["User Password"].value.toUpperCase() != oldPass.toUpperCase()))
  154.          throw new SmException(SM_ERROR_INVALID_PASSWORD);
  155.  
  156.       // OK, write the new password
  157.       fld["User Password"].value = newPass;
  158.       tUser.rowset.save();
  159.  
  160.       return (true);
  161.    }
  162.  
  163.    function changeDescription( newDescription ) {
  164.       // make sure there is a current user
  165.       if (this._username == null) 
  166.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  167.  
  168.       // find this user in the smentity table
  169.       var tUser = new Query();
  170.       tUser.database = this._database;
  171.       tUser.sql = 'select * from smentity sm where sm."Entity Name" = "' +
  172.                   this._username + '" and sm."Entity Type" = ' + SM_ENTITY_USER ;
  173.       tUser.active = true;
  174.       var fld = tUser.rowset.fields;
  175.  
  176.       //
  177.       // Look for various error conditions
  178.       //
  179.  
  180.       // username not found
  181.       if (tUser.rowset.endOfSet)
  182.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  183.  
  184.       // user account is currently disabled
  185.       if (fld["User Disabled"].value)
  186.          throw new SmException(SM_ERROR_LOGIN_DISABLED);
  187.  
  188.       // OK, write the new description
  189.       fld["Description"].value = ("" + newDescription);
  190.       tUser.rowset.save();
  191.       this._description = ("" + newDescription);
  192.  
  193.       return (true);
  194.    }
  195.  
  196.    function getCreated() {
  197.       // make sure there is a current user
  198.       if (this._username == null) 
  199.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  200.  
  201.       return this._created;
  202.    }
  203.  
  204.    function getDescription() {
  205.       // make sure there is a current user
  206.       if (this._username == null) 
  207.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  208.  
  209.       return this._description;
  210.    }
  211.  
  212.    function getGroups() {
  213.       // make sure there is a current user
  214.       if (this._username == null) 
  215.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  216.  
  217.       return this._group;
  218.    }
  219.  
  220.    function getLogin() {
  221.       // make sure there is a current user
  222.       if (this._username == null) 
  223.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  224.  
  225.       return this._login;
  226.    }
  227.  
  228.    function getPolicyValue( policyName ) {
  229.       return (this._policy.isKey(policyName) ? this._policy[policyName] : null);
  230.    }
  231.  
  232.    function getResources() {
  233.       // make sure there is a current user
  234.       if (this._username == null) 
  235.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  236.  
  237.       return this._resource;
  238.    }
  239.  
  240.    function getUserName() {
  241.       // make sure there is a current user
  242.       if (this._username == null) 
  243.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  244.  
  245.       return this._username;
  246.    }
  247.  
  248.    function hasAccessTo( resourceName ) {
  249.       // make sure there is a current user
  250.       if (this._username == null) 
  251.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  252.  
  253.       return (this._resource.isKey(resourceName.toUpperCase()));
  254.    }
  255.  
  256.    function isMemberOf( groupName ) {
  257.       // make sure there is a current user
  258.       if (this._username == null) 
  259.          throw new SmException(SM_ERROR_NOT_LOGGED_IN);
  260.  
  261.       return (this._group.isKey(groupName.toUpperCase()));
  262.    }
  263.  
  264.    function login(name, password) {
  265.       // reset the user information
  266.       this._admin       = false;
  267.       this._created     = null;
  268.       this._description = null;
  269.       this._group       = new AssocArray();
  270.       this._login       = null;
  271.       this._resource    = new AssocArray();
  272.       this._username    = null;
  273.  
  274.       // check that the parameters are valid
  275.       if (name == null)
  276.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  277.       if (password == null)
  278.          throw new SmException(SM_ERROR_INVALID_PASSWORD);
  279.  
  280.       // convert username to uppercase
  281.       var username = name.toUpperCase();
  282.  
  283.       // find this user in the smentity table
  284.       var tEntity = new Query();
  285.       tEntity.database = this._database;
  286.       tEntity.sql = 'select * from smentity sm where sm."Entity Name" = "' +
  287.                   username + '" and sm."Entity Type" = ' + SM_ENTITY_USER ;
  288.       tEntity.active = true;
  289.       var fld = tEntity.rowset.fields;
  290.  
  291.       //
  292.       // Look for various error conditions
  293.       //
  294.  
  295.       // username not found
  296.       if (tEntity.rowset.endOfSet)
  297.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  298.  
  299.       // user account is currently disabled
  300.       if (fld["User Disabled"].value)
  301.          throw new SmException(SM_ERROR_LOGIN_DISABLED);
  302.  
  303.       // user account is locked out
  304.       if (fld["User Lockout"].value) {
  305.          // see if autoreset is allowed
  306.          if (this.getPolicyValue('AUTORESET')) {
  307.             // if autoreset is allowed, then see if necessary time has elapsed
  308.             var loDate = new Date("" + fld["User Lockout Time"].value);
  309.             var resetDate = new Date(loDate.getTime()+(60000*this.getPolicyValue("LOMINUTES")));
  310.             var nowDate = new Date();
  311.             if (nowDate.getTime() > resetDate.getTime()) {
  312.                // reset time has expired, clear all the lockout flags
  313.                fld["User Lockout"].value = false;
  314.                fld["User Lockout Count"].value = 0;
  315.                fld["User Lockout Time"].value = null;
  316.                tEntity.rowset.save();
  317.             }
  318.          }
  319.       }
  320.  
  321.       // check lockout again (it may have been reset above)
  322.       if (fld["User Lockout"].value)
  323.          throw new SmException(SM_ERROR_LOGIN_LOCKOUT);
  324.  
  325.       // All that's left now is the password. Either say, we need to update
  326.       // the lockout information if the lockout policy is in use.
  327.       var locount = this.getPolicyValue("LOCOUNT");
  328.       // invalid password
  329.       var realPass = (fld["User Password"].value == null) ? "" : fld["User Password"].value
  330.       if ((this.getPolicyValue('CASE') && realPass != password) ||
  331.           (!this.getPolicyValue('CASE') && realPass.toUpperCase() != password.toUpperCase())) {
  332.          // If the lockout policy is in use, set the lockout flags for this user.
  333.          if (locount > 0) {
  334.             // see if old data is still relevant
  335.             var loDate = new Date("" + fld["User Lockout Time"].value);
  336.             var resetDate = new Date(loDate.getTime()+(60000*this.getPolicyValue("LOMINUTES")));
  337.             var nowDate = new Date();
  338.             if (nowDate.getTime() > resetDate.getTime())
  339.                fld["User Lockout Count"].value = 1;
  340.             else
  341.                fld["User Lockout Count"].value += 1;
  342.             fld["User Lockout Time"].value = new Date();
  343.             if (fld["User Lockout Count"].value >= locount)
  344.                fld["User Lockout"].value = true;
  345.             tEntity.rowset.save();
  346.          }
  347.          throw new SmException(SM_ERROR_INVALID_PASSWORD);
  348.       }
  349.  
  350.       // Successful login. Set login info. 
  351.       // Reset lockout info if lockout policy is in use.
  352.       if (locount > 0 && fld["User Lockout Count"].value > 0) {
  353.          // clear old error information
  354.          fld["User Lockout"].value = false;
  355.          fld["User Lockout Count"].value = 0;
  356.          fld["User Lockout Time"].value = null;
  357.       }
  358.       fld["User Login"].value = new Date();
  359.       tEntity.rowset.save();
  360.  
  361.       //
  362.       // If no error of any kind have occured, then set the user values.
  363.       //
  364.       this._created     = fld["Created"].value;
  365.       this._description = fld["Description"].value;
  366.       this._login       = fld["User Login"].value;
  367.       this._username    = fld["Entity Name"].value;
  368.  
  369.       // get the group list
  370.       var tAssign = new Query();
  371.       tAssign.database = this._database;
  372.  
  373.       // Use tEntity for group descriptions
  374.       tEntity.sql = 'select * from smentity sm where sm."Entity Type" = ' + SM_ENTITY_GROUP ;
  375.       tEntity.active = true;
  376.  
  377.       // Get the group list first
  378.       tAssign.sql='select * from smassign sm where sm."Child" = "' +
  379.                   username+'" and sm."Assign Type"='+ SM_ASSIGN_GROUP_USER;
  380.       var fldAssign = tAssign.rowset.fields;
  381.  
  382.       tAssign.active = true;
  383.       while (! tAssign.rowset.endOfSet) {
  384.          if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + fldAssign["Parent"].value + "'"))
  385.             this._group[fldAssign["Parent"].value] = fld["Description"].value;
  386.          tAssign.rowset.next();
  387.       }
  388.  
  389.       // now use tEntity for resource descriptions
  390.       tEntity.sql = 'select * from smentity sm where sm."Entity Type" = ' + SM_ENTITY_RESOURCE ;
  391.       tEntity.active = true;
  392.  
  393.       // Get the resource list for this user
  394.       tAssign.sql='select * from smassign sm where sm."Child" = "' +
  395.                   username+'" and sm."Assign Type"='+ SM_ASSIGN_RESOURCE_USER;
  396.       tAssign.active = true;
  397.       while (! tAssign.rowset.endOfSet) {
  398.          if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + fldAssign["Parent"].value + "'"))
  399.             this._resource[fldAssign["Parent"].value] = fld["Description"].value;
  400.          tAssign.rowset.next();
  401.       }
  402.  
  403.       // get the resource list for group assignments
  404.       tAssign.sql='select * from smassign sm where sm."Assign Type"='
  405.                  + SM_ASSIGN_RESOURCE_GROUP;
  406.       tAssign.active = true;
  407.       var i=0;
  408.       var group="";
  409.       for (i=0; i<this._group.count(); i++) {
  410.          group = ( i==0 ) ? this._group.firstKey : this._group.nextKey(group);
  411.          tAssign.rowset.filter = "Child='" + group + "'";
  412.          tAssign.rowset.first();
  413.  
  414.          while (!tAssign.rowset.endOfSet) {
  415.             if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + fldAssign["Parent"].value + "'"))
  416.                this._resource[fldAssign["Parent"].value] = fld["Description"].value;
  417.             tAssign.rowset.next();
  418.          }
  419.       }
  420.  
  421.       // set the administrator flag if this user is
  422.       // a member of the administrators group
  423.       this._admin = this.isMemberOf('ADMINISTRATORS');
  424.  
  425.       return (true);
  426.    }
  427.  
  428. }
  429.  
  430. /***************************************************************************\
  431. *                                                                           *
  432. * Classname   SecurityManagerAdmin                                          *
  433. *                                                                           *
  434. * Purpose     Subclass of SecurityManager with additional methods for       *
  435. *             security system administration.                               *
  436. *                                                                           *
  437. * Properties:                                                               *
  438. *                                                                           *
  439. *    classname - "SecurityManagerAdmin"                                     *
  440. *                                                                           *
  441. * Additional Methods                                                        *
  442. *                                                                           *
  443. *   assignResourceGroup( <resource name>, <group name> )                    *
  444. *   assignResourceUser( <resource name>, <user name> )                      *
  445. *   assignGroupUser( <group name>, <user name> )                            *
  446. *   createGroup( <SmGroup object> )       // see getGroupObject()           *
  447. *   createPolicy( <SmPolicy object> )     // see getPolicyObject()          *
  448. *   createResource( <SmResource object> ) // see getResourceObject()        *
  449. *   createUser( <SmUser object> )         // see getUserObject()            *
  450. *   deleteGroup( <group name> )                                             *
  451. *   deletePolicy( <policy name> )                                           *
  452. *   deleteResource( <resource name> )                                       *
  453. *   deleteUser( <user name> )                                               *
  454. *   getAllGroups( [<related name>, <related type>] )   //returns AssocArray *
  455. *   getAllPolicies()                                   //returns AssocArray *
  456. *   getAllResources( [<related name>, related type>] ) //returns AssocArray *
  457. *   getAllUsers( [<related name>, related type>] )     //returns AssocArray *
  458. *   getGroupObject( [<group name>] )          //returns SmGroup object      *
  459. *   getPolicyObject( [<policy name>] )        //returns SmPolicy object     *
  460. *   getResourceObject( [<resource name>] )    //returns SmResource object   *
  461. *   getUserObject( [<user name>] )            //returns SmUser object       *
  462. *   unassignResourceGroup( <resource name>, <group name> )                  *
  463. *   unassignResourceUser( <resource name>, <user name> )                    *
  464. *   unassignGroupUser( <group name>, <user name> )                          *
  465. *   updateGroup( <SmGroup object> )         // see getGroupObject()         *
  466. *   updatePolicy( <SmPolicy object> )       // see getPolicyObject()        *
  467. *   updateResource( <SmResource object> )   // see getResourceObject()      *
  468. *   updateUser( <SmUser object> )           // see getUserObject()          *
  469. *                                                                           *
  470. *   Unless otherwise indicated above, methods that complete successfully    *
  471. *   return a true value. Methods that do not complete successfully, throw   *
  472. *   an exception of class SmException. See example.                         *
  473. *                                                                           *
  474. *   The getAllXxxxx methods take two optional parameters. Without these     *
  475. *   parameters an array is returned that contains all of the requested      *
  476. *   entities. If the two parameters are passed, then the array contains     *
  477. *   only those entities that are related to the parameters. For instance    *
  478. *   you can retrieve a list of users who are members of a group named       *
  479. *   "administrators" with this call:                                        *
  480. *                                                                           *
  481. *   var x = getAllUsers( "Administrators", SM_ENTITY_GROUP )                *
  482. *                                                                           *
  483. *   The second parameter defines the type of the first. In this case it     *
  484. *   is a group. The entity types are defined in SECURITY.H. The are:        *
  485. *                                                                           *
  486. *           SM_ENTITY_GROUP                                                 *
  487. *           SM_ENTITY_POLICY                                                *
  488. *           SM_ENTITY_RESOURCE                                              *
  489. *           SM_ENTITY_USER                                                  *
  490. *                                                                           *
  491. *   The getXxxxxObject methods return an object of the specified type.      *
  492. *   This object's properties can then be queried or set. The objects        *
  493. *   can then be passed to the createXxxxx and updateXxxxx methods. The      *
  494. *   members of the different objects are:                                   *
  495. *                                                                           *
  496. *   SmGroup.created           // date create (read only)                    *
  497. *   SmGroup.description       // up to 80 characters                        *
  498. *   SmGroup.name              // up to 20 characters                        *
  499. *                                                                           *
  500. *   SmPolicy.boolean          // true if value is boolean, false if numeric *
  501. *   SmPolicy.created                                                        *
  502. *   SmPolicy.description                                                    *
  503. *   SmPolicy.name                                                           *
  504. *   SmPolicy.value            // boolean or numeric value                   *
  505. *                                                                           *
  506. *   SmResource.created                                                      *
  507. *   SmResource.description                                                  *
  508. *   SmResource.name                                                         *
  509. *                                                                           *
  510. *   SmUser.created                                                          *
  511. *   SmUser.description                                                      *
  512. *   SmUser.disabled          // boolean                                     *
  513. *   SmUser.login             // date of last successful login (read only)   *
  514. *   SmUser.lockout           // boolean                                     *
  515. *   SmUser.name                                                             *
  516. *   SmUser.password          // getUserObject() sets this to null           *
  517. *                                                                           *
  518. \***************************************************************************/
  519. class SecurityManagerAdmin extends SecurityManager {
  520.    this.classname    = "SecurityManagerAdmin";
  521.    this._admin       = false;
  522.  
  523.    function assignGroupUser(groupName, userName) {
  524.       // check for error conditions
  525.       if (!this._admin)
  526.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  527.       if (groupName == null)
  528.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  529.       if (userName == null)
  530.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  531.  
  532.       // convert names to uppercase
  533.       var gName = groupName.toUpperCase();
  534.       var uName = userName.toUpperCase();
  535.  
  536.       // confirm these are real names
  537.       var tEntity = new Query();
  538.       tEntity.database = this._database;
  539.       tEntity.sql = 'select * from smentity';
  540.       tEntity.active = true;
  541.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + gName + "'" + ' and "Entity Type" = ' + SM_ENTITY_GROUP))
  542.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  543.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + uName + "'" + ' and "Entity Type" = ' + SM_ENTITY_USER))
  544.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  545.  
  546.       // check for duplicate assignment
  547.       var tAssign = new Query();
  548.       tAssign.database = this._database;
  549.       tAssign.sql = 'select * from smassign';
  550.       tAssign.active = true;
  551.       if (!tAssign.rowset.applyLocate("Parent = '" + gName + "' and Child = '" + uName + "' and " + '"Assign Type" = ' + SM_ASSIGN_GROUP_USER)) {
  552.          tAssign.rowset.beginAppend();
  553.          tAssign.rowset.fields["Parent"].value      = gName;
  554.          tAssign.rowset.fields["Child"].value       = uName;
  555.          tAssign.rowset.fields["Assign Type"].value = SM_ASSIGN_GROUP_USER;
  556.          tAssign.rowset.save();
  557.       }
  558.       return (true);
  559.    }
  560.  
  561.    function assignResourceGroup(resourceName, groupName) {
  562.       // check for error conditions
  563.       if (!this._admin)
  564.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  565.       if (resourceName == null)
  566.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  567.       if (groupName == null)
  568.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  569.  
  570.       // convert names to uppercase
  571.       var rName = resourceName.toUpperCase();
  572.       var gName = groupName.toUpperCase();
  573.  
  574.       // confirm these are real names
  575.       var tEntity = new Query();
  576.       tEntity.database = this._database;
  577.       tEntity.sql = 'select * from smentity';
  578.       tEntity.active = true;
  579.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + rName + "'" + ' and "Entity Type" = ' + SM_ENTITY_RESOURCE))
  580.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);    
  581.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + gName + "'" + ' and "Entity Type" = ' + SM_ENTITY_GROUP))
  582.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  583.  
  584.       // check for duplicate assignment
  585.       var tAssign = new Query();
  586.       tAssign.database = this._database;
  587.       tAssign.sql = 'select * from smassign';
  588.       tAssign.active = true;
  589.       if (!tAssign.rowset.applyLocate("Parent = '" + rName + "' and Child = '" + gName + "' and " + '"Assign Type" = ' + SM_ASSIGN_RESOURCE_GROUP)) {
  590.          tAssign.rowset.beginAppend();
  591.          tAssign.rowset.fields["Parent"].value      = rName;
  592.          tAssign.rowset.fields["Child"].value       = gName;
  593.          tAssign.rowset.fields["Assign Type"].value = SM_ASSIGN_RESOURCE_GROUP;
  594.          tAssign.rowset.save();
  595.       }
  596.       return (true);
  597.    }
  598.  
  599.    function assignResourceUser(resourceName, userName) {
  600.       // check for error conditions
  601.       if (!this._admin)
  602.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  603.       if (resourceName == null)
  604.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  605.       if (userName == null)
  606.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  607.  
  608.       // convert names to uppercase
  609.       var rName = resourceName.toUpperCase();
  610.       var uName = userName.toUpperCase();
  611.  
  612.       // confirm these are real names
  613.       var tEntity = new Query();
  614.       tEntity.database = this._database;
  615.       tEntity.sql = 'select * from smentity';
  616.       tEntity.active = true;
  617.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + rName + "'" + ' and "Entity Type" = ' + SM_ENTITY_RESOURCE))
  618.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  619.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + uName + "'" + ' and "Entity Type" = ' + SM_ENTITY_USER))
  620.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  621.  
  622.       // check for duplicate assignment
  623.       var tAssign = new Query();
  624.       tAssign.database = this._database;
  625.       tAssign.sql = 'select * from smassign';
  626.       tAssign.active = true;
  627.       if (!tAssign.rowset.applyLocate("Parent = '" + rName + "' and Child = '" + uName + "' and " + '"Assign Type" = ' + SM_ASSIGN_RESOURCE_USER)) {
  628.          tAssign.rowset.beginAppend();
  629.          tAssign.rowset.fields["Parent"].value      = rName;
  630.          tAssign.rowset.fields["Child"].value       = uName;
  631.          tAssign.rowset.fields["Assign Type"].value = SM_ASSIGN_RESOURCE_USER;
  632.          tAssign.rowset.save();
  633.       }
  634.       return (true);
  635.    }
  636.  
  637.    function createGroup(newGroup) {
  638.       // check for error conditions
  639.       if (!this._admin)
  640.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  641.       if (newGroup.name == null)
  642.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  643.  
  644.       // convert group name to uppercase
  645.       gName = newGroup.name.toUpperCase();
  646.  
  647.       var tEntity = new Query();
  648.       tEntity.database = this._database;
  649.       tEntity.sql = 'select * from smentity';
  650.       tEntity.active = true;
  651.  
  652.       // throw exception on duplicate record
  653.       if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + gName + "'" + ' and "Entity Type" = ' + SM_ENTITY_GROUP))
  654.          throw new SmException(SM_ERROR_DUPLICATE_GROUPNAME);
  655.  
  656.       // add this new group
  657.       tEntity.rowset.beginAppend();
  658.       tEntity.rowset.fields["Created"].value     = new Date();
  659.       tEntity.rowset.fields["Description"].value = newGroup.description;
  660.       tEntity.rowset.fields["Entity Name"].value = gName;
  661.       tEntity.rowset.fields["Entity Type"].value = SM_ENTITY_GROUP;
  662.       tEntity.rowset.save();
  663.  
  664.       return (true);
  665.    }
  666.  
  667.    function createPolicy(newPolicy) {
  668.       // check for error conditions
  669.       if (!this._admin)
  670.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  671.       if (newPolicy.name == null)
  672.          throw new SmException(SM_ERROR_INVALID_POLICYNAME);
  673.  
  674.       // convert policy name to uppercase
  675.       pName = newPolicy.name.toUpperCase();
  676.  
  677.       var tEntity = new Query();
  678.       tEntity.database = this._database;
  679.       tEntity.sql = 'select * from smentity';
  680.       tEntity.active = true;
  681.  
  682.       // throw exception on duplicate record
  683.       if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + pName + "'" + ' and "Entity Type" = ' + SM_ENTITY_POLICY))
  684.          throw new SmException(SM_ERROR_DUPLICATE_POLICYNAME);
  685.  
  686.       // add this new policy
  687.       tEntity.rowset.beginAppend();
  688.       tEntity.rowset.fields["Created"].value         = new Date();
  689.       tEntity.rowset.fields["Description"].value     = newPolicy.description;
  690.       tEntity.rowset.fields["Entity Name"].value     = pName;
  691.       tEntity.rowset.fields["Entity Type"].value     = SM_ENTITY_POLICY;
  692.       tEntity.rowset.fields["Policy Boolean"].value  = newPolicy.boolean;
  693.       tEntity.rowset.fields["Policy Value"].value    = 
  694.          (newPolicy.boolean ? (newPolicy.value ? 1 : 0) : newPolicy.value);
  695.       tEntity.rowset.save();
  696.  
  697.       return (true);
  698.    }
  699.  
  700.    function createResource(newResource) {
  701.       // check for error conditions
  702.       if (!this._admin)
  703.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  704.       if (newResource.name == null)
  705.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  706.  
  707.       // convert resource name to uppercase
  708.       rName = newResource.name.toUpperCase();
  709.  
  710.       var tEntity = new Query();
  711.       tEntity.database = this._database;
  712.       tEntity.sql = 'select * from smentity'
  713.       tEntity.active = true;
  714.  
  715.       // throw exception on duplicate record
  716.       if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + rName + "'" + ' and "Entity Type" = ' + SM_ENTITY_RESOURCE))
  717.          throw new SmException(SM_ERROR_DUPLICATE_RESOURCENAME);
  718.  
  719.       // add this new resource
  720.       tEntity.rowset.beginAppend();
  721.       tEntity.rowset.fields["Created"].value         = new Date();
  722.       tEntity.rowset.fields["Entity Name"].value = rName;
  723.       tEntity.rowset.fields["Entity Type"].value = SM_ENTITY_RESOURCE;
  724.       tEntity.rowset.fields["Description"].value = newResource.description;
  725.       tEntity.rowset.save();
  726.  
  727.       return (true);
  728.    }
  729.  
  730.    function createUser(newUser) {
  731.       // check for error conditions
  732.       if (!this._admin)
  733.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  734.       if (newUser.name == null)
  735.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  736.  
  737.       // convert user name to uppercase
  738.       var uName = newUser.name.toUpperCase();
  739.       var pass = newUser.password == null ? "" : newUser.password;
  740.  
  741.       var tEntity = new Query();
  742.       tEntity.database = this._database;
  743.       tEntity.sql = 'select * from smentity';
  744.       tEntity.active = true;
  745.  
  746.       // throw exception on duplicate record
  747.       if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + uName + "'" + ' and "Entity Type" = ' + SM_ENTITY_USER))
  748.          throw new SmException(SM_ERROR_DUPLICATE_USERNAME);
  749.  
  750.       // password must meet min/max policy requirements
  751.       if (pass.length < this.getPolicyValue("PASSMIN"))
  752.          throw new SmException(SM_ERROR_PASSWORD_TOO_SHORT);
  753.       if (pass.length > this.getPolicyValue("PASSMAX"))
  754.          throw new SmException(SM_ERROR_PASSWORD_TOO_LONG);
  755.  
  756.       // add this new user
  757.       tEntity.rowset.beginAppend();
  758.       tEntity.rowset.fields["Created"].value       = new Date();
  759.       tEntity.rowset.fields["Entity Name"].value   = uName;
  760.       tEntity.rowset.fields["Description"].value   = newUser.description;
  761.       tEntity.rowset.fields["User Password"].value = pass;
  762.       tEntity.rowset.fields["User Disabled"].value = newUser.disabled;
  763.       tEntity.rowset.fields["User Lockout"].value  = newUser.lockout;
  764.       tEntity.rowset.fields["Entity Type"].value   = SM_ENTITY_USER;
  765.       tEntity.rowset.save();
  766.  
  767.       return (true);
  768.    }
  769.  
  770.    function deleteGroup(groupName) {
  771.       // check for error conditions
  772.       if (!this._admin)
  773.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  774.       if (groupName == null)
  775.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  776.  
  777.       // convert name to uppercase
  778.       var gName = groupName.toUpperCase();
  779.  
  780.       // see if the group exists
  781.       var tEntity = new Query();
  782.       tEntity.database = this._database;
  783.       tEntity.sql = 'select * from smentity';
  784.       tEntity.active = true;
  785.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + gName + "'" + ' and "Entity Type" = ' + SM_ENTITY_GROUP))
  786.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  787.  
  788.       // See if this entity is locked
  789.       if (tEntity.rowset.fields["Entity Lock"].value)
  790.          throw new SmException(SM_ERROR_CAN_NOT_DELETE_SYSTEM_ENTITY);
  791.  
  792.       // OK, delete this group and all user/resource assignments
  793.       tEntity.database.beginTrans();
  794.       try {
  795.          tEntity.rowset.delete();
  796.  
  797.          var tAssign = new Query();
  798.          tAssign.database = this._database;
  799.          tAssign.sql = 'select * from smassign';
  800.          tAssign.active = true;
  801.  
  802.          // delete user assignments
  803.          while (tAssign.rowset.applyLocate("Parent = '" + gName + "' and " + '"Assign Type" = ' + SM_ASSIGN_GROUP_USER))
  804.             tAssign.rowset.delete();
  805.  
  806.          // delete resource assignments
  807.          while (tAssign.rowset.applyLocate("Child = '" + gName + "' and " + '"Assign Type" = ' + SM_ASSIGN_RESOURCE_GROUP))
  808.             tAssign.rowset.delete();
  809.  
  810.          // commit the deletes
  811.          tEntity.database.commit();
  812.       }
  813.       catch (Exception e) {
  814.          tEntity.database.rollback();
  815.          throw e;
  816.       }
  817.       return (true);
  818.    }
  819.  
  820.    function deletePolicy(policyName) {
  821.       // check for error conditions
  822.       if (!this._admin)
  823.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  824.       if (policyName == null)
  825.          throw new SmException(SM_ERROR_INVALID_POLICYNAME);
  826.  
  827.       // convert name to uppercase
  828.       var pName = policyName.toUpperCase();
  829.  
  830.       // see if the resource exists
  831.       var tEntity = new Query();
  832.       tEntity.database = this._database;
  833.       tEntity.sql = 'select * from smentity';
  834.       tEntity.active = true;
  835.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + pName + "'" + ' and "Entity Type" = ' + SM_ENTITY_POLICY))
  836.          throw new SmException(SM_ERROR_INVALID_POLICYNAME);
  837.  
  838.       // See if this entity is locked
  839.       if (tEntity.rowset.fields["Entity Lock"].value)
  840.          throw new SmException(SM_ERROR_CAN_NOT_DELETE_SYSTEM_ENTITY);
  841.  
  842.       // OK, delete this policy and all user/resource assignments
  843.       tEntity.database.beginTrans();
  844.       try {
  845.          tEntity.rowset.delete();
  846.          // commit the delete
  847.          tEntity.database.commit();
  848.       }
  849.       catch (Exception e) {
  850.          tEntity.database.rollback();
  851.          throw e;
  852.       }
  853.       return (true);
  854.    }
  855.  
  856.    function deleteResource(resourceName) {
  857.       // check for error conditions
  858.       if (!this._admin)
  859.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  860.       if (resourceName == null)
  861.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  862.  
  863.       // convert name to uppercase
  864.       var rName = resourceName.toUpperCase();
  865.  
  866.       // see if the resource exists
  867.       var tEntity = new Query();
  868.       tEntity.database = this._database;
  869.       tEntity.sql = 'select * from smentity';
  870.       tEntity.active = true;
  871.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + rName + "'" + ' and "Entity Type" = ' + SM_ENTITY_RESOURCE))
  872.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  873.  
  874.       // See if this entity is locked
  875.       if (tEntity.rowset.fields["Entity Lock"].value)
  876.          throw new SmException(SM_ERROR_CAN_NOT_DELETE_SYSTEM_ENTITY);
  877.  
  878.       // OK, delete this resource and all group/user assignments
  879.       tEntity.database.beginTrans();
  880.       try {
  881.          tEntity.rowset.delete();
  882.  
  883.          var tAssign = new Query();
  884.          tAssign.database = this._database;
  885.          tAssign.sql = 'select * from smassign';
  886.          tAssign.active = true;
  887.  
  888.          // delete group assignments
  889.          while (tAssign.rowset.applyLocate("Parent = '" + rName + "' and " + '"Assign Type" = ' + SM_ASSIGN_RESOURCE_GROUP))
  890.             tAssign.rowset.delete();
  891.  
  892.          // delete user assignments
  893.          while (tAssign.rowset.applyLocate("Parent = '" + rName + "' and " + '"Assign Type" = ' + SM_ASSIGN_RESOURCE_USER))
  894.             tAssign.rowset.delete();
  895.  
  896.          // commit the deletes
  897.          tEntity.database.commit();
  898.       }
  899.       catch (Exception e) {
  900.          tEntity.database.rollback();
  901.          throw e;
  902.       }
  903.       return (true);
  904.    }
  905.  
  906.    function deleteUser(userName) {
  907.       // check for error conditions
  908.       if (!this._admin)
  909.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  910.       if (userName == null)
  911.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  912.  
  913.       // convert names to uppercase
  914.       var uName = userName.toUpperCase();
  915.  
  916.       // can't delete current user
  917.       if (uName == this._username)
  918.          throw new SmException(SM_ERROR_CAN_NOT_DELETE_CURRENT_USER);
  919.  
  920.       // see if the user exists
  921.       var tEntity = new Query();
  922.       tEntity.database = this._database;
  923.       tEntity.sql = 'select * from smentity';
  924.       tEntity.active = true;
  925.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + uName + "'" + ' and "Entity Type" = ' + SM_ENTITY_USER))
  926.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  927.  
  928.       // See if this entity is locked
  929.       if (tEntity.rowset.fields["Entity Lock"].value)
  930.          throw new SmException(SM_ERROR_CAN_NOT_DELETE_SYSTEM_ENTITY);
  931.  
  932.       // OK, delete this user and all group/resource assignments
  933.       tEntity.database.beginTrans();
  934.       try {
  935.          tEntity.rowset.delete();
  936.  
  937.          var tAssign = new Query();
  938.          tAssign.database = this._database;
  939.          tAssign.sql = 'select * from smassign';
  940.          tAssign.active = true;
  941.  
  942.          // delete group assignments
  943.          while (tAssign.rowset.applyLocate("Child = '" + uName + "' and " + '"Assign Type" = ' + SM_ASSIGN_GROUP_USER))
  944.             tAssign.rowset.delete();
  945.  
  946.          // delete resource assignments
  947.          while (tAssign.rowset.applyLocate("Child = '" + uName + "' and " + '"Assign Type" = ' + SM_ASSIGN_RESOURCE_USER))
  948.             tAssign.rowset.delete();
  949.  
  950.          // commit the deletes
  951.          tEntity.database.commit();
  952.       }
  953.       catch (Exception e) {
  954.          tEntity.database.rollback();
  955.          throw e;
  956.       }
  957.       return (true);
  958.    }
  959.  
  960.    function getAllGroups(entityName, entityType) {
  961.       var eArray = new AssocArray();
  962.  
  963.       // check for error conditions
  964.       if (!this._admin)
  965.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  966.  
  967.       // see if the group list is filtered
  968.       if (("" + entityType) == "false") {
  969.          // no second param, throw exception if only one parameter passed
  970.          if ("" + entityName != "false")
  971.             throw new SmException(SM_ERROR_INVALID_ENTITY_TYPE);
  972.  
  973.          // No filter, return all groups
  974.          var tEntity = new Query();
  975.          tEntity.database = this._database;
  976.          tEntity.sql = 'select * from smentity sm where sm."Entity Type" = ' 
  977.                     + SM_ENTITY_GROUP ;
  978.          tEntity.active = true;
  979.  
  980.          while (!tEntity.rowset.endOfSet) {
  981.             eArray[tEntity.rowset.fields["Entity Name"].value] = 
  982.                    tEntity.rowset.fields["Description"].value;
  983.             tEntity.rowset.next();
  984.          }
  985.       }
  986.       else {
  987.          // convert to upper case
  988.          var eName = entityName.toUpperCase();
  989.  
  990.          // store error code in case needed
  991.          switch (entityType) {
  992.          case SM_ENTITY_USER:
  993.             var errorInvalid = SM_ERROR_INVALID_USERNAME;
  994.             var sql = "sm.Child = '" + eName + "'" + ' and sm."Assign Type" = ' + SM_ASSIGN_GROUP_USER;
  995.             break;
  996.          case SM_ENTITY_RESOURCE:
  997.             var errorInvalid = SM_ERROR_INVALID_RESOURCENAME;
  998.             var sql = "sm.Parent = '" + eName + "'" + ' and sm."Assign Type" = ' + SM_ASSIGN_RESOURCE_GROUP;
  999.             break;
  1000.          default:
  1001.             throw new SmException(SM_ERROR_INVALID_ENTITY_TYPE);
  1002.          }
  1003.          
  1004.          // passed an entity name/type pair, restrict list to this entity
  1005.          if (entityName == null)
  1006.             throw new SmException(errorInvalid);
  1007.  
  1008.          // see if entity exists
  1009.          var tEntity = new Query();
  1010.          tEntity.database = this._database;
  1011.          tEntity.sql = 'select * from smentity';
  1012.          tEntity.active = true;
  1013.          if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + eName + "'" + ' and "Entity Type" = ' + entityType))
  1014.             throw new SmException(errorInvalid);
  1015.  
  1016.          // now use tEntity to lookup description
  1017.          tEntity.sql = 'select * from smentity sm where sm."Entity Type" = ' 
  1018.                     + SM_ENTITY_GROUP ;
  1019.          tEntity.active = true;
  1020.  
  1021.          // find the group assignments
  1022.          var tAssign = new Query();
  1023.          tAssign.database = this._database;
  1024.          tAssign.sql = 'select * from smassign sm where ' + sql;
  1025.          tAssign.active = true;
  1026.  
  1027.          while (!tAssign.rowset.endOfSet) {
  1028.             if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + 
  1029.                     ((entityType == SM_ENTITY_USER) ? 
  1030.                     tAssign.rowset.fields['Parent'].value :
  1031.                     tAssign.rowset.fields['Child'].value) + "'")) {
  1032.  
  1033.                eArray[tEntity.rowset.fields["Entity Name"].value] = 
  1034.                       tEntity.rowset.fields["Description"].value;
  1035.  
  1036.             }
  1037.             tAssign.rowset.next();
  1038.          }
  1039.  
  1040.  
  1041.       }
  1042.       return (eArray);
  1043.    }
  1044.  
  1045.    function getAllPolicies() {
  1046.       var eArray = new AssocArray();
  1047.  
  1048.       // check for error conditions
  1049.       if (!this._admin)
  1050.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1051.  
  1052.       // view just the current policy entries
  1053.       var tEntity = new Query();
  1054.       tEntity.database = this._database;
  1055.       tEntity.sql = 'select * from smentity sm where sm."Entity Type" = ' 
  1056.                     + SM_ENTITY_POLICY ;
  1057.       tEntity.active = true;
  1058.  
  1059.       // store policies to pArray
  1060.       while (!tEntity.rowset.endOfSet) {
  1061.          eArray[tEntity.rowset.fields["Entity Name"].value] = 
  1062.                 tEntity.rowset.fields["Description"].value;
  1063.          tEntity.rowset.next();
  1064.       }
  1065.       return (eArray);
  1066.    }
  1067.  
  1068.    function getAllResources(entityName, entityType) {
  1069.       var eArray = new AssocArray();
  1070.  
  1071.       // check for error conditions
  1072.       if (!this._admin)
  1073.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1074.  
  1075.       // see if the resource list is filtered
  1076.       if (("" + entityType) == "false") {
  1077.          // no second param, throw exception if only one parameter passed
  1078.          if ("" + entityName != "false")
  1079.             throw new SmException(SM_ERROR_INVALID_ENTITY_TYPE);
  1080.  
  1081.          // No filter, return all resources
  1082.          var tEntity = new Query();
  1083.          tEntity.database = this._database;
  1084.          tEntity.sql = 'select * from smentity sm where sm."Entity Type" = ' 
  1085.                     + SM_ENTITY_RESOURCE ;
  1086.          tEntity.active = true;
  1087.  
  1088.          while (!tEntity.rowset.endOfSet) {
  1089.             eArray[tEntity.rowset.fields["Entity Name"].value] =
  1090.                    tEntity.rowset.fields["Description"].value;
  1091.             tEntity.rowset.next();
  1092.          }
  1093.       }
  1094.       else {
  1095.          // convert to upper case
  1096.          var eName = entityName.toUpperCase();
  1097.  
  1098.          // store error code in case needed
  1099.          switch (entityType) {
  1100.          case SM_ENTITY_USER:
  1101.             var errorInvalid = SM_ERROR_INVALID_USERNAME;
  1102.             var sql = "sm.Child = '" + eName + "'" + ' and sm."Assign Type" = ' + SM_ASSIGN_RESOURCE_USER;
  1103.             break;
  1104.          case SM_ENTITY_GROUP:
  1105.             var errorInvalid = SM_ERROR_INVALID_GROUPNAME;
  1106.             var sql = "sm.Child = '" + eName + "'" + ' and sm."Assign Type" = ' + SM_ASSIGN_RESOURCE_GROUP;
  1107.             break;
  1108.          default:
  1109.             throw new SmException(SM_ERROR_INVALID_ENTITY_TYPE);
  1110.          }
  1111.          
  1112.          // passed an entity name/type pair, restrict list to this entity
  1113.          if (entityName == null)
  1114.             throw new SmException(errorInvalid);
  1115.  
  1116.          // see if entity exists
  1117.          var tEntity = new Query();
  1118.          tEntity.database = this._database;
  1119.          tEntity.sql = 'select * from smentity';
  1120.          tEntity.active = true;
  1121.          if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + eName + "'" + ' and "Entity Type" = ' + entityType))
  1122.             throw new SmException(errorInvalid);
  1123.  
  1124.          // now use tEntity to lookup description
  1125.          tEntity.sql = 'select * from smentity sm where sm."Entity Type" = ' 
  1126.                     + SM_ENTITY_RESOURCE ;
  1127.          tEntity.active = true;
  1128.  
  1129.          // find the resource assignments
  1130.          var tAssign = new Query();
  1131.          tAssign.database = this._database;
  1132.          tAssign.sql = 'select * from smassign sm where ' + sql;
  1133.          tAssign.active = true;
  1134.  
  1135.          while (!tAssign.rowset.endOfSet) {
  1136.             // When looking for resource pairs, the resource
  1137.             // name is always the parent
  1138.             if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + 
  1139.                     tAssign.rowset.fields['Parent'].value + "'")) {
  1140.                eArray[tEntity.rowset.fields["Entity Name"].value] = 
  1141.                       tEntity.rowset.fields["Description"].value;
  1142.             }
  1143.             tAssign.rowset.next();
  1144.          }
  1145.       }
  1146.       return (eArray);
  1147.    }
  1148.  
  1149.    function getAllUsers(entityName, entityType) {
  1150.       var eArray = new AssocArray();
  1151.  
  1152.       // check for error conditions
  1153.       if (!this._admin)
  1154.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1155.  
  1156.       // see if the user list is filtered
  1157.       if (("" + entityType) == "false") {
  1158.          // no second param, throw exception if only one parameter passed
  1159.          if ("" + entityName != "false")
  1160.             throw new SmException(SM_ERROR_INVALID_ENTITY_TYPE);
  1161.  
  1162.          // No filter, return all users
  1163.          var tEntity = new Query();
  1164.          tEntity.database = this._database;
  1165.          tEntity.sql = 'select * from smentity sm where sm."Entity Type" = ' 
  1166.                     + SM_ENTITY_USER ;
  1167.          tEntity.active = true;
  1168.  
  1169.          while (!tEntity.rowset.endOfSet) {
  1170.             eArray[tEntity.rowset.fields["Entity Name"].value] = 
  1171.                    tEntity.rowset.fields["Description"].value;
  1172.             tEntity.rowset.next();
  1173.          }
  1174.       }
  1175.       else {
  1176.          // convert to upper case
  1177.          var eName = entityName.toUpperCase();
  1178.  
  1179.          // store error code in case needed
  1180.          switch (entityType) {
  1181.          case SM_ENTITY_RESOURCE:
  1182.             var errorInvalid = SM_ERROR_INVALID_RESOURCENAME;
  1183.             var sql = "sm.Parent = '" + eName + "'" + ' and sm."Assign Type" = ' + SM_ASSIGN_RESOURCE_USER;
  1184.             break;
  1185.          case SM_ENTITY_GROUP:
  1186.             var errorInvalid = SM_ERROR_INVALID_GROUPNAME;
  1187.             var sql = "sm.Parent = '" + eName + "'" + ' and sm."Assign Type" = ' + SM_ASSIGN_GROUP_USER;
  1188.             break;
  1189.          default:
  1190.             throw new SmException(SM_ERROR_INVALID_ENTITY_TYPE);
  1191.          }
  1192.          
  1193.          // passed an entity name/type pair, restrict list to this entity
  1194.          if (entityName == null)
  1195.             throw new SmException(errorInvalid);
  1196.  
  1197.          // see if entity exists
  1198.          var tEntity = new Query();
  1199.          tEntity.database = this._database;
  1200.          tEntity.sql = 'select * from smentity';
  1201.          tEntity.active = true;
  1202.          if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + eName + "'" + ' and "Entity Type" = ' + entityType))
  1203.             throw new SmException(errorInvalid);
  1204.  
  1205.          // now use tEntity to lookup description
  1206.          tEntity.sql = 'select * from smentity sm where sm."Entity Type" = ' 
  1207.                     + SM_ENTITY_USER ;
  1208.          tEntity.active = true;
  1209.  
  1210.          // find the user assignments
  1211.          var tAssign = new Query();
  1212.          tAssign.database = this._database;
  1213.          tAssign.sql = 'select * from smassign sm where ' + sql;
  1214.          tAssign.active = true;
  1215.  
  1216.          while (!tAssign.rowset.endOfSet) {
  1217.             // When looking for user pairs, the user
  1218.             // name is always the child
  1219.             if (tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + 
  1220.                     tAssign.rowset.fields['Child'].value + "'")) {
  1221.                eArray[tEntity.rowset.fields["Entity Name"].value] = 
  1222.                       tEntity.rowset.fields["Description"].value;
  1223.             }
  1224.             tAssign.rowset.next();
  1225.          }
  1226.       }
  1227.       return (eArray);
  1228.    }
  1229.  
  1230.    function getGroupObject( entityName ) {
  1231.       // check for error conditions
  1232.       if (!this._admin)
  1233.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1234.  
  1235.       var entityObj = new SmGroup();
  1236.  
  1237.       // see if parameter passed
  1238.       if (("" + entityName) != "false") {
  1239.          // convert name to uppercase
  1240.          eName = entityName.toUpperCase();
  1241.  
  1242.          var tEntity = new Query();
  1243.          tEntity.database = this._database;
  1244.          tEntity.sql = 'select * from smentity';
  1245.          tEntity.active = true;
  1246.  
  1247.          // throw exception on missing record
  1248.          if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + eName + 
  1249.                           "'" + ' and "Entity Type" = ' + SM_ENTITY_GROUP))
  1250.             throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  1251.  
  1252.          // set properties of object for this entity
  1253.          entityObj.created     = tEntity.rowset.fields["Created"].value;
  1254.          entityObj.description = tEntity.rowset.fields["Description"].value;
  1255.          entityObj.name        = tEntity.rowset.fields["Entity Name"].value;
  1256.       }
  1257.       
  1258.       return (entityObj);
  1259.    }
  1260.  
  1261.    function getPolicyObject( entityName ) {
  1262.       // check for error conditions
  1263.       if (!this._admin)
  1264.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1265.  
  1266.       var entityObj = new SmPolicy();
  1267.  
  1268.       // see if parameter passed
  1269.       if (("" + entityName) != "false") {
  1270.          // convert name to uppercase
  1271.          eName = entityName.toUpperCase();
  1272.  
  1273.          var tEntity = new Query();
  1274.          tEntity.database = this._database;
  1275.          tEntity.sql = 'select * from smentity';
  1276.          tEntity.active = true;
  1277.  
  1278.          // throw exception on missing record
  1279.          if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + eName + 
  1280.                           "'" + ' and "Entity Type" = ' + SM_ENTITY_POLICY))
  1281.             throw new SmException(SM_ERROR_INVALID_POLICYNAME);
  1282.  
  1283.          // set properties of object for this entity
  1284.          entityObj.boolean     = tEntity.rowset.fields["Policy Boolean"].value;
  1285.          entityObj.created     = tEntity.rowset.fields["Created"].value;
  1286.          entityObj.description = tEntity.rowset.fields["Description"].value;
  1287.          entityObj.name        = tEntity.rowset.fields["Entity Name"].value;
  1288.          entityObj.value = (entityObj.boolean ?
  1289.                            (tEntity.rowset.fields["Policy Value"].value != 0) :
  1290.                            tEntity.rowset.fields["Policy Value"].value);
  1291.       }
  1292.       
  1293.       return (entityObj);
  1294.    }
  1295.  
  1296.    function getResourceObject( entityName ) {
  1297.       // check for error conditions
  1298.       if (!this._admin)
  1299.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1300.  
  1301.       var entityObj = new SmResource();
  1302.  
  1303.       // see if parameter passed
  1304.       if (("" + entityName) != "false") {
  1305.          // convert name to uppercase
  1306.          eName = entityName.toUpperCase();
  1307.  
  1308.          var tEntity = new Query();
  1309.          tEntity.database = this._database;
  1310.          tEntity.sql = 'select * from smentity';
  1311.          tEntity.active = true;
  1312.  
  1313.          // throw exception on missing record
  1314.          if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + eName + 
  1315.                           "'" + ' and "Entity Type" = ' + SM_ENTITY_RESOURCE))
  1316.             throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  1317.  
  1318.          // set properties of object for this entity
  1319.          entityObj.created     = tEntity.rowset.fields["Created"].value;
  1320.          entityObj.description = tEntity.rowset.fields["Description"].value;
  1321.          entityObj.name        = tEntity.rowset.fields["Entity Name"].value;
  1322.       }
  1323.       
  1324.       return (entityObj);
  1325.    }
  1326.  
  1327.    function getUserObject( entityName ) {
  1328.       // check for error conditions
  1329.       if (!this._admin)
  1330.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1331.  
  1332.       var entityObj = new SmUser();
  1333.  
  1334.       // see if parameter passed
  1335.       if (("" + entityName) != "false") {
  1336.          // convert name to uppercase
  1337.          eName = entityName.toUpperCase();
  1338.  
  1339.          var tEntity = new Query();
  1340.          tEntity.database = this._database;
  1341.          tEntity.sql = 'select * from smentity';
  1342.          tEntity.active = true;
  1343.  
  1344.          // throw exception on missing record
  1345.          if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + eName + 
  1346.                           "'" + ' and "Entity Type" = ' + SM_ENTITY_USER))
  1347.             throw new SmException(SM_ERROR_INVALID_USERNAME);
  1348.  
  1349.          // set properties of object for this entity
  1350.          entityObj.created     = tEntity.rowset.fields["Created"].value;
  1351.          entityObj.description = tEntity.rowset.fields["Description"].value;
  1352.          entityObj.disabled    = tEntity.rowset.fields["User Disabled"].value;
  1353.          entityObj.login       = tEntity.rowset.fields["User Login"].value;
  1354.          entityObj.lockout     = tEntity.rowset.fields["User Lockout"].value;
  1355.          entityObj.name        = tEntity.rowset.fields["Entity Name"].value;
  1356.          entityObj.password    = null;
  1357.       }
  1358.       
  1359.       return (entityObj);
  1360.    }
  1361.  
  1362.    function unassignGroupUser(groupName, userName) {
  1363.       // check for error conditions
  1364.       if (!this._admin)
  1365.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1366.       if (groupName == null)
  1367.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  1368.       if (userName == null)
  1369.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  1370.  
  1371.       // convert names to uppercase
  1372.       var gName = groupName.toUpperCase();
  1373.       var uName = userName.toUpperCase();
  1374.  
  1375.       // confirm these are real names
  1376.       var tEntity = new Query();
  1377.       tEntity.database = this._database;
  1378.       tEntity.sql = 'select * from smentity';
  1379.       tEntity.active = true;
  1380.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + gName + "'" + ' and "Entity Type" = ' + SM_ENTITY_GROUP))
  1381.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  1382.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + uName + "'" + ' and "Entity Type" = ' + SM_ENTITY_USER))
  1383.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  1384.  
  1385.       // check for current assignment
  1386.       var tAssign = new Query();
  1387.       tAssign.database = this._database;
  1388.       tAssign.sql = 'select * from smassign';
  1389.       tAssign.active = true;
  1390.       if (tAssign.rowset.applyLocate("Parent = '" + gName + "' and Child = '" + uName + "' and " + '"Assign Type" = ' + SM_ASSIGN_GROUP_USER)) {
  1391.          tAssign.rowset.delete();
  1392.       }
  1393.       return (true);
  1394.    }
  1395.  
  1396.    function unassignResourceGroup(resourceName, groupName) {
  1397.       // check for error conditions
  1398.       if (!this._admin)
  1399.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1400.       if (resourceName == null)
  1401.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  1402.       if (groupName == null)
  1403.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  1404.  
  1405.       // convert names to uppercase
  1406.       var rName = resourceName.toUpperCase();
  1407.       var gName = groupName.toUpperCase();
  1408.  
  1409.       // confirm these are real names
  1410.       var tEntity = new Query();
  1411.       tEntity.database = this._database;
  1412.       tEntity.sql = 'select * from smentity';
  1413.       tEntity.active = true;
  1414.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + rName + "'" + ' and "Entity Type" = ' + SM_ENTITY_RESOURCE))
  1415.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);    
  1416.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + gName + "'" + ' and "Entity Type" = ' + SM_ENTITY_GROUP))
  1417.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  1418.  
  1419.       // check for current assignment
  1420.       var tAssign = new Query();
  1421.       tAssign.database = this._database;
  1422.       tAssign.sql = 'select * from smassign';
  1423.       tAssign.active = true;
  1424.       if (tAssign.rowset.applyLocate("Parent = '" + rName + "' and Child = '" + gName + "' and " + '"Assign Type" = ' + SM_ASSIGN_RESOURCE_GROUP)) {
  1425.          tAssign.rowset.delete();
  1426.       }
  1427.       return (true);
  1428.    }
  1429.  
  1430.    function unassignResourceUser(resourceName, userName) {
  1431.       // check for error conditions
  1432.       if (!this._admin)
  1433.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1434.       if (resourceName == null)
  1435.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  1436.       if (userName == null)
  1437.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  1438.  
  1439.       // convert names to uppercase
  1440.       var rName = resourceName.toUpperCase();
  1441.       var uName = userName.toUpperCase();
  1442.  
  1443.       // confirm these are real names
  1444.       var tEntity = new Query();
  1445.       tEntity.database = this._database;
  1446.       tEntity.sql = 'select * from smentity';
  1447.       tEntity.active = true;
  1448.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + rName + "'" + ' and "Entity Type" = ' + SM_ENTITY_RESOURCE))
  1449.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  1450.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + uName + "'" + ' and "Entity Type" = ' + SM_ENTITY_USER))
  1451.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  1452.  
  1453.       // check for current assignment
  1454.       var tAssign = new Query();
  1455.       tAssign.database = this._database;
  1456.       tAssign.sql = 'select * from smassign';
  1457.       tAssign.active = true;
  1458.       if (tAssign.rowset.applyLocate("Parent = '" + rName + "' and Child = '" + uName + "' and " + '"Assign Type" = ' + SM_ASSIGN_RESOURCE_USER)) {
  1459.          tAssign.rowset.delete();
  1460.       }
  1461.       return (true);
  1462.    }
  1463.  
  1464.    function updateGroup(group) {
  1465.       // check for error conditions
  1466.       if (!this._admin)
  1467.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1468.       if (group.name == null)
  1469.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  1470.  
  1471.       // convert group name to uppercase
  1472.       gName = group.name.toUpperCase();
  1473.  
  1474.       var tEntity = new Query();
  1475.       tEntity.database = this._database;
  1476.       tEntity.sql = 'select * from smentity';
  1477.       tEntity.active = true;
  1478.  
  1479.       // throw exception on missing record
  1480.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + gName + "'" + ' and "Entity Type" = ' + SM_ENTITY_GROUP))
  1481.          throw new SmException(SM_ERROR_INVALID_GROUPNAME);
  1482.  
  1483.       // update this group
  1484.       tEntity.rowset.fields["Description"].value = group.description;
  1485.       tEntity.rowset.save();
  1486.  
  1487.       return (true);
  1488.    }
  1489.  
  1490.    function updatePolicy(policy) {
  1491.       // check for error conditions
  1492.       if (!this._admin)
  1493.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1494.       if (policy.name == null)
  1495.          throw new SmException(SM_ERROR_INVALID_POLICYNAME);
  1496.  
  1497.       // convert policy name to uppercase
  1498.       pName = policy.name.toUpperCase();
  1499.  
  1500.       var tEntity = new Query();
  1501.       tEntity.database = this._database;
  1502.       tEntity.sql = 'select * from smentity';
  1503.       tEntity.active = true;
  1504.  
  1505.       // throw exception on missing record
  1506.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + pName + "'" + ' and "Entity Type" = ' + SM_ENTITY_POLICY))
  1507.          throw new SmException(SM_ERROR_INVALID_POLICYNAME);
  1508.  
  1509.       // See if changing type of locked policy
  1510.       if (tEntity.rowset.fields["Entity Lock"].value && (policy.boolean != tEntity.rowset.fields["Policy Boolean"].value))
  1511.          throw new SmException(SM_ERROR_CAN_NOT_CHANGE_SYSTEM_ENTITY_TYPE);
  1512.  
  1513.       // update this policy
  1514.       tEntity.rowset.fields["Description"].value = policy.description;
  1515.       if (policy.boolean != null)
  1516.          tEntity.rowset.fields["Policy Boolean"].value     = policy.boolean;
  1517.       if (policy.value != null)
  1518.          tEntity.rowset.fields["Policy Value"].value       = 
  1519.             (policy.boolean ? (policy.value ? 1 : 0 ) : policy.value);
  1520.       tEntity.rowset.save();
  1521.  
  1522.       return (true);
  1523.    }
  1524.  
  1525.    function updateResource(resource) {
  1526.       // check for error conditions
  1527.       if (!this._admin)
  1528.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1529.       if (resource.name == null)
  1530.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  1531.  
  1532.       // convert resource name to uppercase
  1533.       rName = resource.name.toUpperCase();
  1534.  
  1535.       var tEntity = new Query();
  1536.       tEntity.database = this._database;
  1537.       tEntity.sql = 'select * from smentity'
  1538.       tEntity.active = true;
  1539.  
  1540.       // throw exception on missing record
  1541.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + rName + "'" + ' and "Entity Type" = ' + SM_ENTITY_RESOURCE))
  1542.          throw new SmException(SM_ERROR_INVALID_RESOURCENAME);
  1543.  
  1544.       // update this resource
  1545.       tEntity.rowset.fields["Description"].value = resource.description;
  1546.       tEntity.rowset.save();
  1547.  
  1548.       return (true);
  1549.    }
  1550.  
  1551.    function updateUser(user) {
  1552.       // check for error conditions
  1553.       if (!this._admin)
  1554.          throw new SmException(SM_ERROR_INSUFFICIENT_RIGHTS);
  1555.       if (user.name == null)
  1556.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  1557.  
  1558.       // convert user name to uppercase
  1559.       uName = user.name.toUpperCase();
  1560.  
  1561.       var tEntity = new Query();
  1562.       tEntity.database = this._database;
  1563.       tEntity.sql = 'select * from smentity';
  1564.       tEntity.active = true;
  1565.  
  1566.       // throw exception on missing record
  1567.       if (!tEntity.rowset.applyLocate('"Entity Name" = ' + "'" + uName + "'" + ' and "Entity Type" = ' + SM_ENTITY_USER))
  1568.          throw new SmException(SM_ERROR_INVALID_USERNAME);
  1569.  
  1570.       // password must meet min/max policy requirements
  1571.       if (user.password != null) {
  1572.          if (user.password.length < this.getPolicyValue("PASSMIN"))
  1573.             throw new SmException(SM_ERROR_PASSWORD_TOO_SHORT);
  1574.          if (user.password.length > this.getPolicyValue("PASSMAX"))
  1575.             throw new SmException(SM_ERROR_PASSWORD_TOO_LONG);
  1576.       }
  1577.  
  1578.       // update this user
  1579.       tEntity.rowset.fields["Description"].value   = user.description;
  1580.       tEntity.rowset.fields["User Disabled"].value = user.disabled;
  1581.       tEntity.rowset.fields["User Lockout"].value  = user.lockout;
  1582.       if (user.password != null)
  1583.          tEntity.rowset.fields["User Password"].value  = user.password;
  1584.       tEntity.rowset.save();
  1585.  
  1586.       return (true);
  1587.    }
  1588.  
  1589. }
  1590.  
  1591. class SmGroup {
  1592.    this.created     = null;
  1593.    this.description = null;
  1594.    this.name        = null;
  1595. }
  1596.  
  1597. class SmPolicy {
  1598.    this.boolean     = null;
  1599.    this.created     = null;
  1600.    this.description = null;
  1601.    this.name        = null;
  1602.    this.value       = null;
  1603. }
  1604.  
  1605. class SmResource {
  1606.    this.created     = null;
  1607.    this.description = null;
  1608.    this.name        = null;
  1609. }
  1610.  
  1611. class SmUser {
  1612.    this.created     = null;
  1613.    this.description = null;
  1614.    this.disabled    = null;
  1615.    this.login       = null;
  1616.    this.lockout     = null;
  1617.    this.name        = null;
  1618.    this.password    = null;
  1619. }
  1620.  
  1621. class SmException(code) extends Exception {
  1622.    this.code = SmException.arguments.length == 1 ? code : 0;
  1623.    switch (this.code) {
  1624.    case SM_ERROR_BDE_ALIAS_MISSING:
  1625.       this.message = SM_MESSAGE_BDE_ALIAS_MISSING;
  1626.       break;
  1627.    case SM_ERROR_INVALID_ENTITY_TYPE:
  1628.       this.message = SM_MESSAGE_INVALID_ENTITY_TYPE;
  1629.       break;
  1630.    case SM_ERROR_INVALID_USERNAME:
  1631.       this.message = SM_MESSAGE_INVALID_USERNAME
  1632.       break;
  1633.    case SM_ERROR_INVALID_PASSWORD:
  1634.       this.message = SM_MESSAGE_INVALID_PASSWORD
  1635.       break;
  1636.    case SM_ERROR_LOGIN_DISABLED: 
  1637.       this.message = SM_MESSAGE_LOGIN_DISABLED  
  1638.       break;
  1639.    case SM_ERROR_LOGIN_LOCKOUT:   
  1640.       this.message = SM_MESSAGE_LOGIN_LOCKOUT   
  1641.       break;
  1642.    case SM_ERROR_DUPLICATE_USERNAME:
  1643.       this.message = SM_MESSAGE_DUPLICATE_USERNAME 
  1644.       break;
  1645.    case SM_ERROR_PASSWORD_TOO_SHORT:
  1646.       this.message = SM_MESSAGE_PASSWORD_TOO_SHORT 
  1647.       break;
  1648.    case SM_ERROR_PASSWORD_TOO_LONG:
  1649.       this.message = SM_MESSAGE_PASSWORD_TOO_LONG  
  1650.       break;
  1651.    case SM_ERROR_INVALID_GROUPNAME:
  1652.       this.message = SM_MESSAGE_INVALID_GROUPNAME  
  1653.       break;
  1654.    case SM_ERROR_DUPLICATE_GROUPNAME:
  1655.       this.message = SM_MESSAGE_DUPLICATE_GROUPNAME
  1656.       break;
  1657.    case SM_ERROR_INVALID_POLICYNAME:
  1658.       this.message = SM_MESSAGE_INVALID_POLICYNAME  
  1659.       break;
  1660.    case SM_ERROR_DUPLICATE_POLICYNAME:
  1661.       this.message = SM_MESSAGE_DUPLICATE_POLICYNAME
  1662.       break;
  1663.    case SM_ERROR_INVALID_RESOURCENAME:
  1664.       this.message = SM_MESSAGE_INVALID_RESOURCENAME
  1665.       break;
  1666.    case SM_ERROR_DUPLICATE_RESOURCENAME:
  1667.       this.message = SM_MESSAGE_DUPLICATE_RESOURCENAME 
  1668.       break;
  1669.    case SM_ERROR_NOT_LOGGED_IN:
  1670.       this.message = SM_MESSAGE_NOT_LOGGED_IN          
  1671.       break;
  1672.    case SM_ERROR_INSUFFICIENT_RIGHTS:
  1673.       this.message = SM_MESSAGE_INSUFFICENT_RIGHTS     
  1674.       break;
  1675.    case SM_ERROR_CAN_NOT_DELETE_CURRENT_USER:
  1676.       this.message = SM_MESSAGE_CAN_NOT_DELETE_CURRENT_USER      
  1677.       break;
  1678.    case SM_ERROR_CAN_NOT_DELETE_SYSTEM_ENTITY:
  1679.       this.message = SM_MESSAGE_CAN_NOT_DELETE_SYSTEM_ENTITY     
  1680.       break;
  1681.    case SM_ERROR_CAN_NOT_CHANGE_SYSTEM_ENTITY_TYPE:
  1682.       this.message = SM_MESSAGE_CAN_NOT_CHANGE_SYSTEM_ENTITY_TYPE
  1683.       break;
  1684.    default:
  1685.       this.message = "Security Manager Error";
  1686.    }
  1687. }
  1688.  
  1689.  
  1690.