--- loncom/interface/loncreateuser.pm 2001/02/21 20:38:35 1.3
+++ loncom/interface/loncreateuser.pm 2003/09/21 21:40:06 1.68
@@ -1,65 +1,197 @@
-# The LearningOnline Network
+# The LearningOnline Network with CAPA
# Create a user
#
-# (Create a course
-# (My Desk
+# $Id: loncreateuser.pm,v 1.68 2003/09/21 21:40:06 www Exp $
#
-# (Internal Server Error Handler
+# Copyright Michigan State University Board of Trustees
#
-# (Login Screen
-# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14,
-# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer)
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
-# 3/1/1 Gerd Kortemeyer)
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
#
-# 3/1 Gerd Kortemeyer)
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
#
-# 2/14 Gerd Kortemeyer)
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
-# 2/14,2/17,2/19,2/20,2/21 Gerd Kortemeyer
+# /home/httpd/html/adm/gpl.txt
#
+# http://www.lon-capa.org/
+#
+###
+
package Apache::loncreateuser;
+=pod
+
+=head1 NAME
+
+Apache::loncreateuser - handler to create users and custom roles
+
+=head1 SYNOPSIS
+
+Apache::loncreateuser provides an Apache handler for creating users,
+ editing their login parameters, roles, and removing roles, and
+ also creating and assigning custom roles.
+
+=head1 OVERVIEW
+
+=head2 Custom Roles
+
+In LON-CAPA, roles are actually collections of privileges. "Teaching
+Assistant", "Course Coordinator", and other such roles are really just
+collection of privileges that are useful in many circumstances.
+
+Creating custom roles can be done by the Domain Coordinator through
+the Create User functionality. That screen will show all privileges
+that can be assigned to users. For a complete list of privileges,
+please see C.
+
+Custom role definitions are stored in the C file of the role
+author.
+
+=cut
+
use strict;
use Apache::Constants qw(:common :http);
use Apache::lonnet;
+use Apache::loncommon;
+use Apache::lonlocal;
+
+my $loginscript; # piece of javascript used in two separate instances
+my $generalrule;
+my $authformnop;
+my $authformkrb;
+my $authformint;
+my $authformfsys;
+my $authformloc;
+
+BEGIN {
+ $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;
+ my $krbdefdom=$1;
+ $krbdefdom=~tr/a-z/A-Z/;
+ my %param = ( formname => 'document.cu',
+ kerb_def_dom => $krbdefdom
+ );
+# no longer static due to configurable kerberos defaults
+# $loginscript = &Apache::loncommon::authform_header(%param);
+ $generalrule = &Apache::loncommon::authform_authorwarning(%param);
+ $authformnop = &Apache::loncommon::authform_nochange(%param);
+# no longer static due to configurable kerberos defaults
+# $authformkrb = &Apache::loncommon::authform_kerberos(%param);
+ $authformint = &Apache::loncommon::authform_internal(%param);
+ $authformfsys = &Apache::loncommon::authform_filesystem(%param);
+ $authformloc = &Apache::loncommon::authform_local(%param);
+}
+
+
+# ======================================================= Existing Custom Roles
+
+sub my_custom_roles {
+ my %returnhash=();
+ my %rolehash=&Apache::lonnet::dump('roles');
+ foreach (keys %rolehash) {
+ if ($_=~/^rolesdef\_(\w+)$/) {
+ $returnhash{$1}=$1;
+ }
+ }
+ return %returnhash;
+}
+
+# ==================================================== Figure out author access
+
+sub authorpriv {
+ my ($auname,$audom)=@_;
+ if (($auname ne $ENV{'user.name'}) ||
+ (($audom ne $ENV{'user.domain'}) &&
+ ($audom ne $ENV{'request.role.domain'}))) { return ''; }
+ unless (&Apache::lonnet::allowed('cca',$audom)) { return ''; }
+ return 1;
+}
# =================================================================== Phase one
-sub phase_one {
+sub print_username_entry_form {
my $r=shift;
- my $defdom=$ENV{'user.domain'};
- $r->print(< 'Generate new role ...',%existingroles));
+ $r->print(<<"ENDDOCUMENT");
The LearningOnline Network with CAPA
+$selscript
-
-
Create User, Change User Privileges
-
+
+Home Server:
+
+
Login Data
+
$generalrule
+
$authformkrb
+
$authformint
+
$authformfsys
+
$authformloc
+ENDNEWUSER
+ } else { # user already exists
+ $r->print(<Change User Privileges
+$forminfo
+
User "$ccuname" in domain "$ccdomain"
+ENDCHANGEUSER
+ # Get the users information
+ my %userenv = &Apache::lonnet::get('environment',
+ ['firstname','middlename','lastname','generation'],
+ $ccdomain,$ccuname);
+ my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname);
+ $r->print(<
+
+END
+ # Build up table of user roles to allow revocation of a role.
+ my ($tmp) = keys(%rolesdump);
+ unless ($tmp =~ /^(con_lost|error)/i) {
my $now=time;
- $r->print('
Revoke Existing Roles
'.
- '
Revoke
Role
Extent
'.
- '
Start
End
');
- map {
- if ($_!~/^rolesdef\&/) {
-
- my ($area,$role)=split(/=/,$_);
- my $thisrole=$area;
- $area=~s/\_\w\w$//;
- my ($trole,$tend,$tstart)=split(/_/,$role);
- my $bgcol='ffffff';
- my $allows=0;
- if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {
- my %coursedata=&Apache::lonnet::coursedescription($1.'_'.$2);
- $area='Course: '.
- $coursedata{'description'}.' Section/Group: '.$3;
- $inccourses{$1.'_'.$2}=1;
- if (&Apache::lonnet::allowed('c'.$trole,$1.'_'.$2)) {
- $allows=1;
- }
- $bgcol=$1.'_'.$2;
- $bgcol=~s/[^8-9b-e]//g;
- $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',0,6);
- } else {
- if ($1) {
- $incdomains{$1}=1;
- if (&Apache::lonnet::allowed('c'.$trole,$1)) {
- $allows=1;
- }
- }
- }
-
- my $active=1;
- if (($tend) && ($now>$tend)) { $active=0; }
-
- $r->print('
\n";
+ $r->print($row);
+ } # end of foreach (table building loop)
$r->print('
');
- }
+ } # End of unless
+ my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
+ if ($currentauth=~/^krb(4|5):/) {
+ $currentauth=~/^krb(4|5):(.*)/;
+ my $krbdefdom=$1;
+ my %param = ( formname => 'document.cu',
+ kerb_def_dom => $krbdefdom
+ );
+ $loginscript = &Apache::loncommon::authform_header(%param);
+ }
+ # Check for a bad authentication type
+ unless ($currentauth=~/^krb(4|5):/ or
+ $currentauth=~/^unix:/ or
+ $currentauth=~/^internal:/ or
+ $currentauth=~/^localauth:/
+ ) { # bad authentication scheme
+ if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {
+ $r->print(<
+
+ERROR:
+This user has an unrecognized authentication scheme ($currentauth).
+Please specify login data below.
+
Login Data
+
$generalrule
+
$authformkrb
+
$authformint
+
$authformfsys
+
$authformloc
+ENDBADAUTH
+ } else {
+ # This user is not allowed to modify the users
+ # authentication scheme, so just notify them of the problem
+ $r->print(<
+
+ ERROR:
+This user has an unrecognized authentication scheme ($currentauth).
+Please alert a domain coordinator of this situation.
+
+ENDBADAUTH
+ }
+ } else { # Authentication type is valid
+ my $authformcurrent='';
+ my $authform_other='';
+ if ($currentauth=~/^krb(4|5):/) {
+ $authformcurrent=$authformkrb;
+ $authform_other="
";
+ }
+ $authformcurrent.=' (will override current values) ';
+ if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {
+ # Current user has login modification privileges
+ $r->print(<
+
+
Change Current Login Data
+
$generalrule
+
$authformnop
+
$authformcurrent
+
Enter New Login Data
+$authform_other
+ENDOTHERAUTHS
+ }
+ } ## End of "check for bad authentication type" logic
+ } ## End of new user/old user logic
+ $r->print('
Add Roles
');
+#
+# Co-Author
+#
+ if (&authorpriv($ENV{'user.name'},$ENV{'request.role.domain'}) &&
+ ($ENV{'user.name'} ne $ccuname || $ENV{'user.domain'} ne $ccdomain)) {
+ # No sense in assigning co-author role to yourself
+ my $cuname=$ENV{'user.name'};
+ my $cudom=$ENV{'request.role.domain'};
+ $r->print(<Construction Space
+
+"javascript:pjump('date_start','Start Date $plrole',document.cu.start_$thisdomain\_$_.value,'start_$thisdomain\_$_','cu.pres','dateset')">Set Start Date