diff options
author | David Sommerseth <dazo@users.sourceforge.net> | 2009-09-26 00:36:58 +0200 |
---|---|---|
committer | David Sommerseth <dazo@users.sourceforge.net> | 2009-09-26 00:36:58 +0200 |
commit | 6ba5a6334ddace1aeec9093f365c28d02d227751 (patch) | |
tree | 8b377d7255d9692f9c6432daf1ae1525572f18f2 | |
parent | 0da0abbfe79c7dd81e48beb8a45f4dbc2718b98b (diff) | |
download | eurephia-6ba5a6334ddace1aeec9093f365c28d02d227751.tar.gz eurephia-6ba5a6334ddace1aeec9093f365c28d02d227751.tar.xz eurephia-6ba5a6334ddace1aeec9093f365c28d02d227751.zip |
Made eurephiadm users --show, --activate, --deactivate and --password modes working again
Rewritten to use the new eDBadminUserAccount() API.
-rw-r--r-- | eurephiadm/commands/users.c | 126 | ||||
-rw-r--r-- | xslt/eurephiadm/certificates.xsl | 4 | ||||
-rw-r--r-- | xslt/eurephiadm/lastlog.xsl | 4 | ||||
-rw-r--r-- | xslt/eurephiadm/users.xsl | 8 |
4 files changed, 95 insertions, 47 deletions
diff --git a/eurephiadm/commands/users.c b/eurephiadm/commands/users.c index e2e1df7..a8e9d93 100644 --- a/eurephiadm/commands/users.c +++ b/eurephiadm/commands/users.c @@ -58,12 +58,6 @@ // TO BE REMOVED WHEN ALL FUNCTIONS ARE PORTED TO NEW eDBadminUserAccount() API // These functions are here only to make eurephiadm compile. -static xmlDoc *eDBadminGetUserInfo(eurephiaCTX *ctx, int show_info, xmlDoc *srch_xml) { - return NULL; -} -static int eDBadminUpdateUser(eurephiaCTX *ctx, int uid, xmlDoc *update_xml) { - return 0; -} static int eDBadminDeleteUser(eurephiaCTX *ctx, int uid, xmlDoc *update_xml) { return 0; } @@ -292,7 +286,9 @@ int show_user(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int int i, crit_set = 0, lastlog_verb = 0; long int show_info = USERINFO_user | USERINFO_certs; xmlDoc *user_xml = NULL, *srch_xml = NULL; - xmlNode *srch_root = NULL; + xmlNode *srch_root = NULL, *fmap_n = NULL; + xmlChar flags[34]; + #ifdef FIREWALL const char *xsltparams[] = {"view", NULL, "firewall", "'1'", "view_digest", "'0'", NULL}; #else @@ -312,10 +308,14 @@ int show_user(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int assert((ctx != NULL) && (ctx->dbc != NULL) && (ctx->dbc->config != NULL)); - // Create a fieldMapping XML document, used for searching the user database - eurephiaXML_CreateDoc(ctx, 1, "fieldMapping", &srch_xml, &srch_root); - xmlNewProp(srch_root, (xmlChar *) "table", (xmlChar *)"users"); // Which table to search in + // Create a UserAccount query XML document + eurephiaXML_CreateDoc(ctx, 1, "UserAccount", &srch_xml, &srch_root); + xmlNewProp(srch_root, (xmlChar*) "mode", (xmlChar *) "view"); + + // Setup the fieldMapping - to narrow the search + fmap_n = xmlNewChild(srch_root, NULL, (xmlChar *) "fieldMapping", NULL); + xmlNewProp(fmap_n, (xmlChar *) "table", (xmlChar *)"users"); // Argument parsing crit_set = 0; @@ -326,7 +326,7 @@ int show_user(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int fprintf(stderr, "%s: Invalid user id\n", MODULE); return 1; } - xmlNewChild(srch_root, NULL, (xmlChar *)"uid", (xmlChar *) optargs[0]); + xmlNewChild(fmap_n, NULL, (xmlChar *)"uid", (xmlChar *) optargs[0]); crit_set++; break; @@ -335,7 +335,7 @@ int show_user(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int fprintf(stderr, "%s: User name too short\n", MODULE); return 1; } - xmlNewChild(srch_root, NULL, (xmlChar *)"username", (xmlChar *)optargs[0]); + xmlNewChild(fmap_n, NULL, (xmlChar *)"username", (xmlChar *)optargs[0]); crit_set++; break; @@ -375,13 +375,32 @@ int show_user(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int return 1; } - // Search and find the user which was requested - if( (user_xml = eDBadminGetUserInfo(ctx, show_info, srch_xml)) == NULL ) { + xmlStrPrintf(flags, 32, (xmlChar *) "%ld%c", show_info, 0); + xmlNewChild(srch_root, NULL, (xmlChar *) "extractFlags", flags); + + // Do the query against the database + if( (user_xml = eDBadminUserAccount(ctx, srch_xml)) == NULL ) { + xmlFreeDoc(srch_xml); fprintf(stderr, "%s: User not found\n", MODULE); return 1; } xmlFreeDoc(srch_xml); + if( eurephiaXML_IsResultMsg(ctx, user_xml) ) { + eurephiaRESULT *res = eurephiaXML_ParseResultMsg(ctx, user_xml); + if( res->resultType == exmlERROR ) { + fprintf(stderr, "%s: %s\n", MODULE, res->message); + free_nullsafe(ctx, res); + xmlFreeDoc(user_xml); + return 1; + } + free_nullsafe(ctx, res); + } else { + xmlFreeDoc(user_xml); + fprintf(stderr, "%s: Unknown error\n", MODULE); + return 2; + } + if( show_info & USERINFO_user ) { xsltparams[1] = "'userinfo'"; xslt_print_xmldoc(stdout, cfg, user_xml, "users.xsl", xsltparams); @@ -402,12 +421,14 @@ int show_user(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int xsltparams[1] = "'details'"; } - user_n = eurephiaXML_getRoot(ctx, user_xml, "user", 1); + user_n = eurephiaXML_getRoot(ctx, user_xml, "UserAccount", 1); + user_n = xmlFindNode(user_n, "Account"); if( user_n == NULL ) { fprintf(stderr, "Could not retrieve valid data\n"); xmlFreeDoc(user_xml); return 1; } + printf("** Lastlog entries for %s\n\n", xmlGetNodeContent(user_n, "username")); xslt_print_xmldoc(stdout, cfg, user_xml, "lastlog.xsl", xsltparams); @@ -426,8 +447,6 @@ int show_user(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int } - - /** * This function handles activation, deactivation and deletion of an account * @@ -440,11 +459,12 @@ int show_user(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int * @return returns 0 on success, otherwise 1. */ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES *cfg, int argc, char **argv) { - xmlDoc *user_xml = NULL, *update_xml = NULL, *srch_xml = NULL, *tmp_xml = NULL; - xmlNode *user_n = NULL, *update_n = NULL, *srch_root = NULL, *tmp_n = NULL; + xmlDoc *user_xml = NULL, *update_xml = NULL, *srch_xml = NULL, *tmp_xml = NULL, *res_xml = NULL; + xmlNode *user_n = NULL, *update_n = NULL, *srch_root = NULL, *tmp_n = NULL, *fmap_n = NULL; eurephiaRESULT *res = NULL; char *uid_str = NULL, *activated = NULL, *deactivated = NULL, *actmode_str = NULL, *newpwd = NULL; int i, actmode = 0, rc = 0, crit_set = 0; + xmlChar flags[34]; e_options activargs[] = { {"--uid", "-i", 1}, @@ -473,9 +493,16 @@ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES * return 1; } - // Create a fieldMapping XML document, used for searching the user database - eurephiaXML_CreateDoc(ctx, 1, "fieldMapping", &srch_xml, &srch_root); - xmlNewProp(srch_root, (xmlChar *) "table", (xmlChar *)"users"); // Which table to search in + // Create a UserAccount query XML document + eurephiaXML_CreateDoc(ctx, 1, "UserAccount", &srch_xml, &srch_root); + xmlNewProp(srch_root, (xmlChar*) "mode", (xmlChar *) "view"); + + // Setup the fieldMapping - to narrow the search + fmap_n = xmlNewChild(srch_root, NULL, (xmlChar *) "fieldMapping", NULL); + xmlNewProp(fmap_n, (xmlChar *) "table", (xmlChar *)"users"); + + xmlStrPrintf(flags, 32, (xmlChar *) "%ld%c", USERINFO_user, 0); + xmlNewChild(srch_root, NULL, (xmlChar *) "extractFlags", flags); // Argument parsing crit_set = 0; @@ -486,7 +513,7 @@ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES * fprintf(stderr, "%s: Invalid user id\n", MODULE); return 1; } - xmlNewChild(srch_root, NULL, (xmlChar *)"uid", (xmlChar *) optargs[0]); + xmlNewChild(fmap_n, NULL, (xmlChar *)"uid", (xmlChar *) optargs[0]); crit_set++; break; @@ -495,7 +522,7 @@ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES * fprintf(stderr, "%s: User name too short\n", MODULE); return 1; } - xmlNewChild(srch_root, NULL, (xmlChar *)"username", (xmlChar *)optargs[0]); + xmlNewChild(fmap_n, NULL, (xmlChar *)"username", (xmlChar *)optargs[0]); crit_set++; break; @@ -528,29 +555,40 @@ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES * return 1; } - // Search and find the user which was requested - if( (user_xml = eDBadminGetUserInfo(ctx, USERINFO_user, srch_xml)) == NULL ) { - fprintf(stderr, "%s: User not found\n", MODULE); + // Do the query against the database + if( (user_xml = eDBadminUserAccount(ctx, srch_xml)) == NULL ) { xmlFreeDoc(srch_xml); + fprintf(stderr, "%s: User not found\n", MODULE); return 1; } xmlFreeDoc(srch_xml); - // Parse the user information we received - user_n = eurephiaXML_getRoot(ctx, user_xml, "user", 1); + if( eurephiaXML_IsResultMsg(ctx, user_xml) ) { + eurephiaRESULT *res = eurephiaXML_ParseResultMsg(ctx, user_xml); + if( res->resultType == exmlERROR ) { + fprintf(stderr, "%s: %s\n", MODULE, res->message); + free_nullsafe(ctx, res); + xmlFreeDoc(user_xml); + return 1; + } + free_nullsafe(ctx, res); + } + + user_n = eurephiaXML_getRoot(ctx, user_xml, "UserAccount", 1); + user_n = xmlFindNode(user_n, "Account"); if( user_n == NULL ) { - eurephia_log(ctx, LOG_ERROR, 0, "%s: Could not find user node in the XML document", MODULE); xmlFreeDoc(user_xml); + fprintf(stderr, "%s: No user account information found\n", MODULE); return 1; } - uid_str = xmlGetAttrValue(user_n->properties, "uid"); activated = defaultValue(xmlGetNodeContent(user_n, "activated"), NULL); deactivated = defaultValue(xmlGetNodeContent(user_n, "deactivated"), NULL); // Create a new XML document which will be used to update the user account - eurephiaXML_CreateDoc(ctx, 1, "update_user", &update_xml, &update_n); + eurephiaXML_CreateDoc(ctx, 1, "UserAccount", &update_xml, &update_n); assert( (update_xml != NULL) && (update_n != NULL) ); + xmlNewProp(update_n, (xmlChar *) "mode", (xmlChar *) "update"); xmlNewProp(update_n, (xmlChar *) "uid", (xmlChar *) uid_str); // Add fieldMapping - to correctly map eurephia fields into the database fields @@ -560,7 +598,7 @@ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES * switch( actmode ) { case 'a': // Activate a user account if( (activated != NULL) && (deactivated == NULL) ) { - printf("User account is already active\n"); + printf("%s: User account is already active\n", MODULE); goto exit; } else { // Set activated field to now() @@ -573,7 +611,7 @@ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES * } // Do the update of the user account - rc = eDBadminUpdateUser(ctx, atoi_nullsafe(uid_str), update_xml); + res_xml = eDBadminUserAccount(ctx, update_xml); break; case 'd': // Deactivate a user account @@ -591,7 +629,7 @@ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES * } // Do the update of the user account - rc = eDBadminUpdateUser(ctx, atoi_nullsafe(uid_str), update_xml); + res_xml = eDBadminUserAccount(ctx, update_xml); break; case 'p': // Change password for a user @@ -626,7 +664,7 @@ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES * // Update with new password tmp_n = xmlNewChild(update_n, NULL, (xmlChar *) "password", (xmlChar *)newpwd); xmlNewProp(tmp_n, (xmlChar *) "pwhash", (xmlChar *) "none"); - rc = eDBadminUpdateUser(ctx, atoi_nullsafe(uid_str), update_xml); + res_xml = eDBadminUserAccount(ctx, update_xml); free_nullsafe(ctx, newpwd); break; @@ -671,11 +709,21 @@ int account_activation(eurephiaCTX *ctx, eurephiaSESSION *sess, eurephiaVALUES * break; } - if( rc == 1 ) { - printf("%s: User account is %s\n", MODULE, actmode_str); + + if( eurephiaXML_IsResultMsg(ctx, res_xml) ) { + eurephiaRESULT *res = eurephiaXML_ParseResultMsg(ctx, res_xml); + if( res->resultType == exmlERROR ) { + fprintf(stderr, "%s: %s\n", MODULE, res->message); + rc = 0; + } else { + fprintf(stdout, "%s: %s\n", MODULE, res->message); + rc = 1; + } + free_nullsafe(ctx, res); } else { - fprintf(stderr, "%s: Operation failed\n", MODULE); + fprintf(stderr, "%s: Unknown error\n", MODULE); } + xmlFreeDoc(res_xml); exit: xmlFreeDoc(user_xml); diff --git a/xslt/eurephiadm/certificates.xsl b/xslt/eurephiadm/certificates.xsl index c79dae2..945c939 100644 --- a/xslt/eurephiadm/certificates.xsl +++ b/xslt/eurephiadm/certificates.xsl @@ -24,10 +24,10 @@ <xsl:strip-space elements="*"/> <xsl:template match="/eurephia"> - <xsl:apply-templates select="certificates|user/certificates"/> + <xsl:apply-templates select="certificates|UserAccount/Account/certificates"/> </xsl:template> - <xsl:template match="/eurephia/certificates|/eurephia/user/certificates"> + <xsl:template match="/eurephia/certificates|/eurephia/UserAccount/Account/certificates"> <xsl:text> ID (D) Common name Organisation </xsl:text> <xsl:text> e-mail Registered </xsl:text> <xsl:if test="$view_digest = '1'"> diff --git a/xslt/eurephiadm/lastlog.xsl b/xslt/eurephiadm/lastlog.xsl index da5ac7c..5484ce3 100644 --- a/xslt/eurephiadm/lastlog.xsl +++ b/xslt/eurephiadm/lastlog.xsl @@ -26,10 +26,10 @@ <xsl:template match="/eurephia"> <xsl:choose> <xsl:when test="$view = 'list'"> - <xsl:apply-templates select="lastlog|user/lastlog" mode="list"/> + <xsl:apply-templates select="lastlog|UserAccount/Account/lastlog" mode="list"/> </xsl:when> <xsl:when test="$view = 'details' or $view = 'details2'"> - <xsl:apply-templates select="lastlog|user/lastlog" mode="details"/> + <xsl:apply-templates select="lastlog|UserAccount/Account/lastlog" mode="details"/> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes">Invalid view: <xsl:value-of select="$view"/></xsl:message> diff --git a/xslt/eurephiadm/users.xsl b/xslt/eurephiadm/users.xsl index e179693..6ded6f6 100644 --- a/xslt/eurephiadm/users.xsl +++ b/xslt/eurephiadm/users.xsl @@ -29,10 +29,10 @@ <xsl:apply-templates select="UserAccount" mode="userlist"/> </xsl:when> <xsl:when test="$view = 'userinfo'"> - <xsl:apply-templates select="user" mode="userinfo"/> + <xsl:apply-templates select="UserAccount/Account" mode="userinfo"/> </xsl:when> <xsl:when test="$view = 'attemptblacklist'"> - <xsl:apply-templates select="user" mode="attemptblacklist"/> + <xsl:apply-templates select="UserAccount/Account" mode="attemptblacklist"/> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes">Invalid view: <xsl:value-of select="$view"/></xsl:message> @@ -98,7 +98,7 @@ <xsl:text> </xsl:text> </xsl:template> - <xsl:template match="/eurephia/user" mode="userinfo"> + <xsl:template match="/eurephia/UserAccount/Account" mode="userinfo"> <xsl:text> User id: </xsl:text> <xsl:value-of select="@uid"/> <xsl:text> </xsl:text> @@ -142,7 +142,7 @@ <xsl:text> </xsl:text> </xsl:template> - <xsl:template match="/eurephia/user" mode="attemptblacklist"> + <xsl:template match="/eurephia/UserAccount/Account" mode="attemptblacklist"> <xsl:text>Login attempt information: </xsl:text> <xsl:choose> <xsl:when test="count(attempts/*) > 0"> |