AdminResourceNamespace.java

/*
** Module   : AdminResourceNamespace.java
** Abstract : Admin resource namespace
**
** Copyright (c) 2017-2023, Golden Code Development Corporation.
**
** -#- -I- --Date-- ------------------------------Description----------------------------------
** 001 HC  20170612 Initial version.
** 002 TJD 20220504 Java 11 compatibility minor changes
** 003 GBB 20230825 New menu item for OS users added.
*/
/*
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU Affero General Public License as
** published by the Free Software Foundation, either version 3 of the
** License, or (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU Affero General Public License for more details.
**
** You may find a copy of the GNU Affero GPL version 3 at the following
** location: https://www.gnu.org/licenses/agpl-3.0.en.html
**
** Additional terms under GNU Affero GPL version 3 section 7:
**
**   Under Section 7 of the GNU Affero GPL version 3, the following additional
**   terms apply to the works covered under the License.  These additional terms
**   are non-permissive additional terms allowed under Section 7 of the GNU
**   Affero GPL version 3 and may not be removed by you.
**
**   0. Attribution Requirement.
**
**     You must preserve all legal notices or author attributions in the covered
**     work or Appropriate Legal Notices displayed by works containing the covered
**     work.  You may not remove from the covered work any author or developer
**     credit already included within the covered work.
**
**   1. No License To Use Trademarks.
**
**     This license does not grant any license or rights to use the trademarks
**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
**     of Golden Code Development Corporation. You are not authorized to use the
**     name Golden Code, FWD, or the names of any author or contributor, for
**     publicity purposes without written authorization.
**
**   2. No Misrepresentation of Affiliation.
**
**     You may not represent yourself as Golden Code Development Corporation or FWD.
**
**     You may not represent yourself for publicity purposes as associated with
**     Golden Code Development Corporation, FWD, or any author or contributor to
**     the covered work, without written authorization.
**
**   3. No Misrepresentation of Source or Origin.
**
**     You may not represent the covered work as solely your work.  All modified
**     versions of the covered work must be marked in a reasonable way to make it
**     clear that the modified work is not originating from Golden Code Development
**     Corporation or FWD.  All modified versions must contain the notices of
**     attribution required in this license.
*/
package com.goldencode.p2j.security;

/**
 * Admin resource namespace.
 */
public class AdminResourceNamespace
{
   /**
    * The following tree represents the namespace of the admin resource.
    * Every node in the tree is made of three objects:
    * - a string, name of the node
    * - an integer node type, one of the ADMT_* constants
    * - reference to an array of the child nodes, if any
    */
   private static final Node root =
   new Node
   (
      "",   // root node
      AdminRights.ADMT_PATH,
      // non-leaf type
      new Node[]
      // children
      {
         new Node
         (
         "console",                 // node name
         Integer.valueOf(AdminRights.ADMT_PATH),
         // node bitfield type
         null
         ),

         new Node
         (
            "accounts",                // node name
            Integer.valueOf(AdminRights.ADMT_PATH),
            // node bitfield type
            new Node[]
            {
               new Node
               (
                  "groups",            // node name
                  Integer.valueOf(AdminRights.ADMT_PATH), // path is temporary
                  // node bitfield type
                  null
               ),
               new LeafNode("users", AdminRights.ADMT_LEAF_USER),
               new LeafNode("osusers", AdminRights.ADMT_LEAF_USER),
               new Node
               (
                  "processes",         // node name
                  Integer.valueOf(AdminRights.ADMT_PATH), // path is temporary
                  // node bitfield type
                  null
               ),
               new Node
               (
                  "certificates",      // node name
                  Integer.valueOf(AdminRights.ADMT_PATH), // path is temporary
                  // node bitfield type
                  null
               ),
            }
         ),

         new Node
         (
            "access_control",          // node name
            Integer.valueOf(AdminRights.ADMT_PATH),
            // node bitfield type
            null
         ),

         new Node
         (
            "extension",               // node name
            Integer.valueOf(AdminRights.ADMT_PATH),
            // node bitfield type
            null
         ),

         new Node
         (
            "runtime",                 // node name
            Integer.valueOf(AdminRights.ADMT_PATH),
            // node bitfield type
            null
         ),

         new Node
         (
            "configuration",           // node name
            Integer.valueOf(AdminRights.ADMT_PATH),
            // node bitfield type
            null
         ),

         new Node
         (
            "target",                  // node name
            Integer.valueOf(AdminRights.ADMT_PATH),
            // node bitfield type
            new Node[]
            {
               new Node
               (
                  "refresh",                 // node name
                  Integer.valueOf(AdminRights.ADMT_LEAF_REFRESH),
                  // node bitfield type
                  null
               ),
            }
         ),
      }
   );

   /**
    * Finds a matching namespace tree node path for the given name.
    *
    * @param   name
    *          resource instance name, should always start with "/"
    *
    * @return  matching nodes in the namespace tree or <code>null</code>
    */
   public static Node[] findPath(String name)
   {
      String[] parts = splitName(name);

      if (parts == null)
      {
         return null;
      }

      Node[] path = new Node[parts.length];
      path[0] = root;

      for (int i = 1; i < parts.length; i++)
      {
         Node p = path[i - 1];
         if (p.getChildren() == null)
         {
            return null;
         }
         Node[] q = p.getChildren();

         int j = 0;
         for (j = 0; j < q.length; j++)
         {
            if (parts[i].equals(q[j].getName()))
            {
               break;
            }
         }

         if (j == q.length)
         {
            return null;
         }

         path[i] = q[j];
      }

      return path;
   }

   /**
    * Splits a resource instance name into components.
    *
    * @param   name
    *          resource instance name, should always start with "/"
    *
    * @return  array of components;
    *          <code>null</code> for a bad name;
    *          "" is returned for the root name "/";
    *          "", "accounts", "users" is returned for "/accounts/users"
    *          "", "accounts", "users", "" is returned for "/accounts/users/"
    *
    */
   private static String[] splitName(String name)
   {
      if (name == null || name.length() == 0 || name.charAt(0) != '/')
      {
         return null;
      }

      if (name.equals("/"))
      {
         return new String[] {""};
      }

      return name.split("/", -1);
   }

   /**
    * Represents nodes in the namespace tree.
    */
   public static class Node
   {
      /**
       * node name
       */
      private String name = null;

      /**
       * node type
       */
      private int type = -1;

      /**
       * array of child nodes
       */
      private Node[] children = null;

      /**
       * Constructor
       */
      private Node(String name, int type, Node[] children)
      {
         this.name = name;
         this.type = type;
         this.children = children;
      }

      /**
       * Gets the node name.
       *
       * @return  the node name
       */
      public String getName()
      {
         return name;
      }

      /**
       * Gets the node type.
       *
       * @return  the node type
       */
      public int getType()
      {
         return type;
      }

      /**
       * Gets the array of children
       *
       * @return  the array of the child nodes or <code>null</code>
       */
      public Node[] getChildren()
      {
         return children;
      }
   }

   /**
    * Represents the leaf nodes in the namespace tree.
    */
   public static class LeafNode
   extends Node
   {
      /**
       * Constructor
       */
      private LeafNode(String name, int type)
      {
         super(name, type, null);
      }
   }

}