Readd quota support
[public/pyceo-broken.git] / src / op-adduser.c
index 0d54508..9c4d5a5 100644 (file)
@@ -19,6 +19,7 @@
 #include "gss.h"
 #include "krb5.h"
 #include "ldap.h"
+#include "homedir.h"
 #include "kadm.h"
 #include "daemon.h"
 #include "strbuf.h"
@@ -41,6 +42,7 @@ Ceo__AddUserResponse *response_create(void) {
     return r;
 }
 
+PRINTF_LIKE(2)
 int32_t response_message(Ceo__AddUserResponse *r, int32_t status, char *fmt, ...) {
     va_list args;
     Ceo__StatusMessage *statusmsg = xmalloc(sizeof(Ceo__StatusMessage));
@@ -136,9 +138,14 @@ static void adduser_spam(Ceo__AddUser *in, Ceo__AddUserResponse *out, char *clie
 
 static int32_t addmember(Ceo__AddUser *in, Ceo__AddUserResponse *out) {
     char homedir[1024];
-    int user_stat, group_stat, krb_stat;
+    char principal[1024];
+    int user_stat, group_stat, krb_stat, home_stat, quota_stat;
     int id;
 
+    if (snprintf(principal, sizeof(principal), "%s@%s",
+                in->username, krb5_realm) >= sizeof(principal))
+        fatal("principal overflow");
+
     if (snprintf(homedir, sizeof(homedir), "%s/%s",
                  member_home, in->username) >= sizeof(homedir))
         fatal("homedir overflow");
@@ -149,58 +156,81 @@ static int32_t addmember(Ceo__AddUser *in, Ceo__AddUserResponse *out) {
     if ((krb_stat = ceo_del_princ(in->username)))
         return response_message(out, EEXIST, "unable to overwrite orphaned kerberos principal %s", in->username);
 
-    if ((krb_stat = ceo_add_princ(in->username, in->password)))
-        return response_message(out, EKERB, "unable to create kerberos principal %s", in->username);
-    response_message(out, 0, "successfully created principal");
-
-    if ((user_stat = ceo_add_user(in->username, users_base, "member", in->realname, homedir,
+    if ((user_stat = ceo_add_user(in->username, ldap_users_base, "member", in->realname, homedir, principal,
             member_shell, id, "program", in->program, NULL)))
         return response_message(out, ELDAP, "unable to create ldap account %s", in->username);
     response_message(out, 0, "successfully created ldap account");
 
     /* errors that occur after this point are not fatal  */
 
-    if ((group_stat = ceo_add_group(in->username, groups_base, id)))
+    if ((krb_stat = ceo_add_princ(in->username, in->password)))
+        return response_message(out, EKERB, "unable to create kerberos principal %s", in->username);
+    response_message(out, 0, "successfully created principal");
+
+    if ((group_stat = ceo_add_group(in->username, ldap_groups_base, id)))
         response_message(out, ELDAP, "unable to create ldap group %s", in->username);
     else
         response_message(out, 0, "successfully created ldap group");
 
-    return krb_stat || user_stat || group_stat;
+    if ((home_stat = ceo_create_home(homedir, member_home_skel, id, id, NULL, NULL, in->email)))
+        response_message(out, EHOME, "unable to create home directory for %s", in->username);
+    else
+        response_message(out, 0, "successfully created home directory");
+
+    if ((quota_stat = ceo_set_quota("ctdalek", id)))
+        response_message(out, EQUOTA, "unable to set quota for %s", in->username);
+    else
+        response_message(out, 0, "successfully set quota");
+
+    return krb_stat || user_stat || group_stat || home_stat || quota_stat;
 }
 
 static int32_t addclub(Ceo__AddUser *in, Ceo__AddUserResponse *out) {
     char homedir[1024];
-    int krb_stat, user_stat, group_stat, sudo_stat;
+    char acl[64];
+    int krb_stat, user_stat, group_stat, sudo_stat, home_stat, quota_stat;
     int id;
 
-    if (snprintf(homedir, sizeof(homedir), "%s/%s",
-                 club_home, in->username) >= sizeof(homedir))
+    if (snprintf(homedir, sizeof(homedir), "%s/%s", club_home, in->username) >= sizeof(homedir))
         fatal("homedir overflow");
 
     if ((id = ceo_new_uid(club_min_id, club_max_id)) <= 0)
         fatal("no available uids in range [%ld, %ld]", club_min_id, club_max_id);
 
+    if (snprintf(acl, sizeof(acl), CLUB_ACL, id) >= sizeof(acl))
+        fatal("acl overflow");
+
     if ((krb_stat = ceo_del_princ(in->username)))
         return response_message(out, EKERB, "unable to clear principal %s", in->username);
 
-    if ((user_stat = ceo_add_user(in->username, users_base, "club", in->realname, homedir,
-            club_shell, id, NULL)))
+    if ((user_stat = ceo_add_user(in->username, ldap_users_base, "club", in->realname, homedir,
+            NULL, club_shell, id, NULL)))
         return response_message(out, ELDAP, "unable to create ldap account %s", in->username);
     response_message(out, 0, "successfully created ldap account");
 
     /* errors that occur after this point are not fatal  */
 
-    if ((group_stat = ceo_add_group(in->username, groups_base, id)))
+    if ((group_stat = ceo_add_group(in->username, ldap_groups_base, id)))
         response_message(out, ELDAP, "unable to create ldap group %s", in->username);
     else
         response_message(out, 0, "successfully created ldap group");
 
-    if ((sudo_stat = ceo_add_group_sudo(in->username, sudo_base)))
+    if ((sudo_stat = ceo_add_group_sudo(in->username, ldap_sudo_base)))
         response_message(out, ELDAP, "unable to create ldap sudoers %s", in->username);
     else
         response_message(out, 0, "successfully created ldap sudoers");
 
-    return user_stat || group_stat || sudo_stat;
+    if ((home_stat = ceo_create_home(homedir, club_home_skel, id, id, acl, acl, NULL)))
+        response_message(out, EHOME, "unable to create home directory for %s", in->username);
+    else
+        response_message(out, 0, "successfully created home directory");
+
+    if ((quota_stat = ceo_set_quota("csc", id)))
+        response_message(out, EQUOTA, "unable to set quota for %s", in->username);
+    else
+        response_message(out, 0, "successfully set quota");
+
+    return user_stat || group_stat || sudo_stat || home_stat || quota_stat;
 }
 
 static int32_t adduser(Ceo__AddUser *in, Ceo__AddUserResponse *out, char *client) {
@@ -251,7 +281,9 @@ void cmd_adduser(void) {
 
     strbuf_grow(&out, ceo__add_user_response__get_packed_size(out_proto));
     strbuf_setlen(&out, ceo__add_user_response__pack(out_proto, (uint8_t *)out.buf));
-    full_write(STDOUT_FILENO, out.buf, out.len);
+
+    if (full_write(STDOUT_FILENO, out.buf, out.len))
+        fatalpe("write: stdout");
 
     ceo__add_user__free_unpacked(in_proto, &protobuf_c_default_allocator);
     response_delete(out_proto);
@@ -262,7 +294,7 @@ void cmd_adduser(void) {
 
 int main(int argc, char *argv[]) {
     prog = xstrdup(basename(argv[0]));
-    init_log(prog, LOG_PID, LOG_AUTHPRIV);
+    init_log(prog, LOG_PID, LOG_AUTHPRIV, 0);
 
     configure();
 
@@ -270,6 +302,7 @@ int main(int argc, char *argv[]) {
         fatalpe("setenv");
 
     ceo_krb5_init();
+    ceo_krb5_auth(ldap_admin_principal);
     ceo_ldap_init();
     ceo_kadm_init();
 
@@ -277,6 +310,7 @@ int main(int argc, char *argv[]) {
 
     ceo_kadm_cleanup();
     ceo_ldap_cleanup();
+    ceo_krb5_deauth();
     ceo_krb5_cleanup();
 
     free_config();