modify_s.c revision 72445
11556Srgrimes/*
21556Srgrimes * Copyright (c) 1997-2001 Kungliga Tekniska H�gskolan
31556Srgrimes * (Royal Institute of Technology, Stockholm, Sweden).
41556Srgrimes * All rights reserved.
51556Srgrimes *
61556Srgrimes * Redistribution and use in source and binary forms, with or without
71556Srgrimes * modification, are permitted provided that the following conditions
81556Srgrimes * are met:
91556Srgrimes *
101556Srgrimes * 1. Redistributions of source code must retain the above copyright
111556Srgrimes *    notice, this list of conditions and the following disclaimer.
121556Srgrimes *
131556Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
141556Srgrimes *    notice, this list of conditions and the following disclaimer in the
151556Srgrimes *    documentation and/or other materials provided with the distribution.
161556Srgrimes *
171556Srgrimes * 3. Neither the name of the Institute nor the names of its contributors
181556Srgrimes *    may be used to endorse or promote products derived from this software
191556Srgrimes *    without specific prior written permission.
201556Srgrimes *
211556Srgrimes * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
221556Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
231556Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
241556Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
251556Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
261556Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
271556Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
281556Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
291556Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
301556Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
311556Srgrimes * SUCH DAMAGE.
32127499Sgad */
33127499Sgad
34127499Sgad#include "kadm5_locl.h"
35127499Sgad
36127499SgadRCSID("$Id: modify_s.c,v 1.12 2001/01/30 01:24:28 assar Exp $");
37127499Sgad
38127499Sgadstatic kadm5_ret_t
391556Srgrimesmodify_principal(void *server_handle,
401556Srgrimes		 kadm5_principal_ent_t princ,
411556Srgrimes		 u_int32_t mask,
4290143Smarkm		 u_int32_t forbidden_mask)
431556Srgrimes{
441556Srgrimes    kadm5_server_context *context = server_handle;
451556Srgrimes    hdb_entry ent;
461556Srgrimes    kadm5_ret_t ret;
4790143Smarkm    if((mask & forbidden_mask))
481556Srgrimes	return KADM5_BAD_MASK;
4936049Scharnier    if((mask & KADM5_POLICY) && strcmp(princ->policy, "default"))
5090143Smarkm	return KADM5_UNK_POLICY;
5136049Scharnier
52110391Scharnier    ent.principal = princ->principal;
5399110Sobrien    ret = context->db->open(context->context, context->db, O_RDWR, 0);
5499110Sobrien    if(ret)
551556Srgrimes	return ret;
561556Srgrimes    ret = context->db->fetch(context->context, context->db, 0, &ent);
573296Sdg    if(ret)
581556Srgrimes	goto out;
591556Srgrimes    ret = _kadm5_setup_entry(context, &ent, mask, princ, mask, NULL, 0);
601556Srgrimes    if(ret)
611556Srgrimes	goto out2;
621556Srgrimes    ret = _kadm5_set_modifier(context, &ent);
631556Srgrimes    if(ret)
64127149Sgad	goto out2;
651556Srgrimes
66127499Sgad    ret = hdb_seal_keys(context->context, context->db, &ent);
671556Srgrimes    if (ret)
6813514Smpp	goto out2;
6973367Sache
701556Srgrimes    kadm5_log_modify (context,
7190143Smarkm		      &ent,
72127499Sgad		      mask | KADM5_MOD_NAME | KADM5_MOD_TIME);
731556Srgrimes
741556Srgrimes    ret = context->db->store(context->context, context->db,
751556Srgrimes			     HDB_F_REPLACE, &ent);
761556Srgrimesout2:
771556Srgrimes    hdb_free_entry(context->context, &ent);
781556Srgrimesout:
791556Srgrimes    context->db->close(context->context, context->db);
80127499Sgad    return _kadm5_error_code(ret);
81127499Sgad}
8266377Sbrian
83127537Sgad
84127537Sgadkadm5_ret_t
85127537Sgadkadm5_s_modify_principal(void *server_handle,
86127537Sgad			 kadm5_principal_ent_t princ,
87127537Sgad			 u_int32_t mask)
88127537Sgad{
89127537Sgad    return modify_principal(server_handle, princ, mask,
90127537Sgad			    KADM5_LAST_PWD_CHANGE | KADM5_MOD_TIME
91127537Sgad			    | KADM5_MOD_NAME | KADM5_MKVNO
92127537Sgad			    | KADM5_AUX_ATTRIBUTES | KADM5_LAST_SUCCESS
93127537Sgad			    | KADM5_LAST_FAILED);
94127537Sgad}
95127537Sgad