main.c: using the user module

Previous: Listing objects and permissions ] [ Top: The user module ] [ Next: The user module ]

So let's take a look at a fairly simple program which uses the user module. This will be a convenient little user maintenance utility and simultaneously serve as a good test case.

Usage will be as follows:
user[.exe] <command> <arguments>:
 
#include "user.h"

XML * user;
XML * group;

ATTR * attr;

XML * holder;

XML * elem;

int main (int argc, char * argv[])
{
   if (argc < 2) {
      printf ("user: No command specified.\n");
      exit (1);
   }
 
   if (!strcmp (argv[1], "newuser")) {
      if (argc < 4) {
         printf ("user newuser: User and password not specified.\n");
         exit (1);
      }
      user = xml_create ("user");
      xml_set (user, "name", argv[2]);
      xml_set (user, "password", argv[3]);
      group = group_get ("everybody");
      user_join (user, group);
      user_save (user);
      group_save (group);
      xml_free (user);
      xml_free (group);
   } else if (!strcmp (argv[1], "newgroup")) {
      if (argc < 3) {
         printf ("user newgroup: Group name not specified.\n");
         exit (1);
      }
      group = xml_create ("group");
      xml_set (group, "name", argv[2]);
      group_save (group);
      xml_free (group);
   } else if (!strcmp (argv[1], "password")) {
      if (argc < 4) {
         printf ("user password: Username or new password missing.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user password: Unable to load user %s.\n", argv[2]);
         exit (1);
      }
      xml_set (user, "password", argv[3]);
      user_save (user);
      xml_free (user);
   } else if (!strcmp (argv[1], "auth")) {
      if (argc < 4) {
         printf ("user auth: Username or password missing.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) exit(1);
      if (!strcmp (argv[3], xml_attrval (user, "password"))) {
         attr = user->attrs;
         while (attr) {
            if (strcmp (attr->name, "password")) {
               printf ("%s:%s\n", attr->name, attr->value);
            }
            attr = attr->next;
         }
      }
      xml_free (user);
   } else if (!strcmp (argv[1], "listuser")) {
      if (argc < 3) {
         printf ("user listuser: Username missing.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) exit(1);
      attr = user->attrs;
      while (attr) {
         if (strcmp (attr->name, "password")) {
            printf ("%s:%s\n", attr->name, attr->value);
         }
         attr = attr->next;
      }
      xml_free (user);
   } else if (!strcmp (argv[1], "user")) {
      if (argc < 3) {
         printf ("user user: Username missing.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user user: Unable to load user %s.\n", argv[2]);
         exit (1);
      }
      xml_write (stdout, user);
      xml_free (user);
   } else if (!strcmp (argv[1], "group")) {
      if (argc < 3) {
         printf ("user group: Group name missing.\n");
         exit (1);
      }
      group = group_get (argv[2]);
      if (!group) {
         printf ("user group: Unable to load group %s.\n", argv[2]);
         exit (1);
      }
      xml_write (stdout, group);
      xml_free (group);
   } else if (!strcmp (argv[1], "join")) {
      if (argc < 4) {
         printf ("user join: Username or group missing.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user join: Unable to load user %s.\n", argv[2]);
         exit (1);
      }
      group = group_get (argv[3]);
      if (!group) {
         printf ("user join: Unable to load group %s.\n", argv[3]);
         xml_free (user);
         exit (1);
      }
      user_join (user, group);
      user_save (user);
      group_save (group);
      xml_free (user);
      xml_free (group);
   } else if (!strcmp (argv[1], "leave")) {
      if (argc < 4) {
         printf ("user leave: Username or group missing.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user leave: Unable to load user %s.\n", argv[2]);
         exit (1);
      }
      group = group_get (argv[3]);
      if (!group) {
         printf ("user leave: Unable to load group %s.\n", argv[3]);
         xml_free (user);
         exit (1);
      }
      user_leave (user, group);
      user_save (user);
      group_save (group);
      xml_free (user);
      xml_free (group);
   } else if (!strcmp (argv[1], "grantuser")) {
      if (argc < 5) {
         printf ("user grantuser: missing arguments.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user grantuser: Unable to load user %s.\n", argv[2]);
         exit (1);
      }
      object_grant (user, argv[3], argv[4], argv[5]);
      user_save (user);
      xml_free (user);
   } else if (!strcmp (argv[1], "grantgroup")) {
      if (argc < 5) {
         printf ("user grantgroup: missing arguments.\n");
         exit (1);
      }
      group = group_get (argv[2]);
      if (!group) {
         printf ("user grantgroup: Unable to load group %s.\n", argv[2]);
         exit (1);
      }
      object_grant (group, argv[3], argv[4], argv[5]);
      group_save (group);
      xml_free (group);
   } else if (!strcmp (argv[1], "revokeuser")) {
      if (argc < 3) {
         printf ("user revokeuser: missing arguments.\n");
         exit(1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user revokeuser: Unable to load user %s.\n", argv[2]);
         exit (1);
      }
      object_revoke (user, argv[3], argv[4], argv[5]);
      user_save (user);
      xml_free (user);
   } else if (!strcmp (argv[1], "revokegroup")) {
      if (argc < 3) {
         printf ("user revokegroup: missing arguments.\n");
         exit(1);
      }
      group = group_get (argv[2]);
      if (!group) {
         printf ("user revokegroup: Unable to load group %s.\n", argv[2]);
         exit (1);
      }
      object_revoke (group, argv[3], argv[4], argv[5]);
      group_save (group);
      xml_free (group);
   } else if (!strcmp (argv[1], "include")) {
      if (argc < 5) {
         printf ("user include: missing arguments.\n");
         exit (1);
      }
      group = group_get (argv[2]);
      if (!group) {
         printf ("user include: Unable to load group %s.\n", argv[2]);
         exit (1);
      }
      user = group_get (argv[3]);
      if (!user) {
         printf ("user include: Unable to load group %s.\n", argv[2]);
         xml_free (group);
         exit (1);
      }
      group_include (group, user, argv[4]);
      group_save (group);
      group_save (user);
      xml_free (group);
      xml_free (group);
   } else if (!strcmp (argv[1], "unlink")) {
      if (argc < 4) {
         printf ("user unlink: missing arguments.\n");
         exit (1);
      }
      group = group_get (argv[2]);
      if (!group) {
         printf ("user include: Unable to load group %s.\n", argv[2]);
         exit (1);
      }
      user = group_get (argv[3]);
      if (!user) {
         printf ("user include: Unable to load group %s.\n", argv[2]);
         xml_free (group);
         exit (1);
      }
      group_unlink (group, user, argv[4]);
      group_save (group);
      group_save (user);
      xml_free (group);
      xml_free (group);
   } else if (!strcmp (argv[1], "perm")) {
      if (argc < 6) {
         printf ("user perm: missing arguments.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user perm: unable to load user %s.\n", argv[2]);
         exit (1);
      }
      if (user_perm (user, argv[3], argv[4], argv[5])) {
         printf ("Permission OK.\n");
      } else {
         printf ("No permission.\n");
      }
      xml_free (user);
   } else if (!strcmp (argv[1], "permgroup")) {
      if (argc < 5) {
         printf ("user perm: missing arguments.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user perm: unable to load user %s.\n", argv[2]);
         exit (1);
      }
      if (user_perm_group (user, argv[3], argv[4])) {
         printf ("OK\n");
      } else {
         printf ("No\n");
      }
      xml_free (user);
   } else if (!strcmp (argv[1], "list")) {
      if (argc < 5) {
         printf ("user list: missing arguments.\n");
         exit (1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user perm: unable to load user %s.\n", argv[2]);
         exit (1);
      }
      group = user_list (user, argv[3], argv[4], argv[5]);
      xml_write (stdout, group);
      printf ("\n\n");
      xml_free (group);
      xml_free (user);
   } else if (!strcmp (argv[1], "groups")) {
      if (argc < 3) {
         printf ("user groups: missing username.\n");
         exit(1);
      }
      user = user_get (argv[2]);
      if (!user) {
         printf ("user groups: unable to load user %s.\n", argv[2]);
         exit (1);
      }

      /* OK, this is really ugly but it'll have to do for now. */
      holder = xml_create ("list");
      user_groups_list (user, holder, argc > 3 ? argv[3] : "view");

      elem = xml_firstelem (holder);
      while (elem) {
         printf ("%s:%s\n", xml_attrval (elem, "name"), xml_attrval (elem, "label"));
         elem = xml_nextelem (elem);
      }

      xml_free (holder);
      xml_free (user);
   } else if (!strcmp (argv[1], "users")) {
      if (argc < 3) {
         printf ("user users: missing group name.\n");
         exit(1);
      }
      group = group_get (argv[2]);
      if (!group) {
         printf ("user users: unable to load group %s.\n", argv[2]);
         exit (1);
      }

      holder = xml_create ("list");
      group_users_list (group, holder, argc > 3 ? argv[3] : "view");

      elem = xml_firstelem (holder);
      while (elem) {
         printf ("%s\n", xml_attrval (elem, "name"));
         elem = xml_nextelem (elem);
      }

      xml_free (holder);
      xml_free (user);
   } else if (!strcmp (argv[1], "userlist")) {
      if (argc < 3) {
         printf ("user userlist: missing group name.\n");
         exit(1);
      }
      group = group_get (argv[2]);
      if (!group) {
         printf ("user userlist: unable to load group %s.\n", argv[2]);
         exit (1);
      }

      holder = xml_create ("list");
      group_users_list_detailed (group, holder, argc > 3 ? argv[3] : "view");

      elem = xml_firstelem (holder);
      while (elem) {
         printf ("%s:%s:%s\n", xml_attrval (elem, "name"), xml_attrval (elem, "email"), xml_attrval (elem, "fullname"));
         elem = xml_nextelem (elem);
      }

      xml_free (holder);
      xml_free (user);
   } else {
      printf ("user: command %s not supported.\n", argv[1]);
      exit (1);
   }
   return (0);
}
Previous: Listing objects and permissions ] [ Top: The user module ] [ Next: The user module ]


This code and documentation are released under the terms of the GNU license. They are additionally copyright (c) 2000, Vivtek. All rights reserved except those explicitly granted under the terms of the GNU license.