Index: src/json_user.c ================================================================== --- src/json_user.c +++ src/json_user.c @@ -272,11 +272,11 @@ /* Potential todo: do not allow a setup user to remove 's' from himself, to avoid locking himself out? */ - blob_append(&sql, "UPDATE USER SET",-1 ); + blob_append(&sql, "UPDATE user SET",-1 ); blob_append(&sql, " mtime=cast(strftime('%s') AS INTEGER)", -1); if((uid>0) && zNameNew){ /* Check for name change... */ if( (!g.perm.Admin && !g.perm.Setup) @@ -298,17 +298,25 @@ if( zCap ){ blob_appendf(&sql, ", cap=%Q", zCap); ++gotFields; } - +#define TRY_LOGIN_GROUP 0 /* login group support is not yet implemented. */ if( zPW ){ +#if !TRY_LOGIN_GROUP char * zPWHash = NULL; ++gotFields; zPWHash = sha1_shared_secret(zPW, zNameNew ? zNameNew : zName, NULL); blob_appendf(&sql, ", pw=%Q", zPWHash); free(zPWHash); +#else + ++gotFields; + blob_appendf(&sql, ", pw=coalesce(shared_secret(%Q,%Q," + "(SELECT value FROM config WHERE name='project-code')))", + zPW, zNameNew ? zNameNew : zName); + /* shared_secret() func is undefined? */ +#endif } if( zInfo ){ blob_appendf(&sql, ", info=%Q", zInfo); ++gotFields; @@ -324,20 +332,48 @@ json_set_err( FSL_JSON_E_MISSING_ARGS, "Required user data are missing."); goto error; } assert(uid>0); +#if !TRY_LOGIN_GROUP blob_appendf(&sql, " WHERE uid=%d", uid); - free( zNameFree ); +#else /* need name for login group support :/ */ + blob_appendf(&sql, " WHERE login=%Q", zName); +#endif #if 0 puts(blob_str(&sql)); cson_output_FILE( cson_object_value(pUser), stdout, NULL ); #endif db_prepare(&q, "%s", blob_str(&sql)); - blob_reset(&sql); db_exec(&q); db_finalize(&q); +#if TRY_LOGIN_GROUP + if( zPW || forceLogout ){ + Blob groupSql = empty_blob; + char * zErr = NULL; + blob_appendf(&groupSql, + "INSERT INTO user(login)" + " SELECT %Q WHERE NOT EXISTS(SELECT 1 FROM user WHERE login=%Q);", + zName, zName + ); + blob_append(&groupSql, blob_str(&sql), blob_size(&sql)); + login_group_sql(blob_str(&groupSql), NULL, NULL, &zErr); + blob_reset(&groupSql); + if( zErr ){ + json_set_err( FSL_JSON_E_UNKNOWN, + "Repo-group update at least partially failed: %s", + zErr); + free(zErr); + goto error; + } + } +#endif /* TRY_LOGIN_GROUP */ + +#undef TRY_LOGIN_GROUP + + free( zNameFree ); + blob_reset(&sql); return 0; error: assert(0 != g.json.resultCode); free(zNameFree);