#! /usr/bin/perl

=head1 NAME

project_passwords - allow to show and change project member's passwords

=head1 SYNOPSIS

 https://server/schulkonsole/project_passwords

=head1 DESCRIPTION

C<project_passwords> allows to show and display the passwords of all or single
members of a selected project.
The HTML template is project_passwords.tt and showpassword.tt to display
single passwords.

=head2 Template variables

Additionally to the variables of Schulkonsole::Session C<project_passwords>
provides the following variables:

=over

=cut

use strict;
use utf8;
use lib '/usr/share/schulkonsole';
use Schulkonsole::Session;
use Schulkonsole::Info;
use Schulkonsole::Sophomorix;

my $this_file = 'project_passwords';


my $sk_session = new Schulkonsole::Session($this_file);
if (not $sk_session->get_password()) {
	my $q = new CGI;
	my $url = $q->url( -full => 1 );

	# we send cookies over secure connections only
	if ($url =~ s/^http:/https:/g) {
		$sk_session->redirect($url);
	} else {
		$sk_session->exit_with_login_page($this_file);
	}
}

my $q = $sk_session->query();


my $projects = Schulkonsole::Info::groups_projects($sk_session->groups());

my $project = $q->param('projects');
if (    $project
    and $$projects{$project}) {
        $sk_session->param('project', $project);
}
$project = $sk_session->param('project');

if (   not $project
    or not $$projects{$project}) {
        my $url = $q->url( -absolute => 1 );
        $url =~ s/$this_file$/project/g;
		$sk_session->param('requested_page',$this_file);
        $sk_session->redirect($url);
}


my @projects;
foreach my $project (sort {
    $$projects{$a}{displayname} cmp $$projects{$b}{displayname} } keys %$projects) {
	push @projects, { gid => $project,
	                name => $$projects{$project}{displayname} };
}

=item C<projects>

Projects of the current user as an array of hashes with the keys

=over

=item C<gid>

GID of the project

=item C<name>

Name of the project

=back

=cut

$sk_session->set_var('projects', \@projects);


if ($project) {
my $admins = Schulkonsole::DB::project_admins($$projects{$project}{id});

if ($$admins{$sk_session->userdata('uidnumber')}) {

=item C<isadmin>

Indicates that the current user is an administrator of the selected project

=cut

	$sk_session->set_var('isadmin', 1);

=item C<joinable>

Indicates that the selected project is open
(and adding new members is possible)

=cut

	$sk_session->set_var('isopen', $$projects{$project}{joinable});
}

=item C<project_gid>

GID of the selected project

=cut

        $sk_session->set_var('project_gid', $project);

=item C<project>

Name of the selected project

=cut

        $sk_session->set_var('project', $$projects{$project}{displayname});

}

my $path = $q->path_info();
$path =~ s:^/+:: if defined $path;
if ($path) {
	eval {
	TYPE: {
	$q->param('passwords_print_pdf') and do {

		my $pdf_data = Schulkonsole::Sophomorix::print_project(
			$sk_session->userdata('id'),
			$sk_session->get_password(),
			$project, 0);

		if ($pdf_data =~ /^\%PDF/) {
			binmode STDOUT;
			
			print $q->header( -type => 'application/pdf' ), $pdf_data;

			exit;
		} else {
			$sk_session->set_status_redirect($sk_session->d()->get(
				'Fehler bei der Erzeugung des Dokuments'), 1);
		}

		last TYPE;
	};
	$q->param('passwords_print_csv') and do {
		my $csv_data = Schulkonsole::Sophomorix::print_project(
			$sk_session->userdata('id'),
			$sk_session->get_password(),
			$project, 1);

		if ($csv_data =~ /^.*;.*;.*;/) {
			binmode STDOUT, ':utf8';

			print $q->header( -type => 'text/comma-separated-values' ),
			      $csv_data;

			exit;
		} else {
			$sk_session->set_status_redirect($sk_session->d()->get(
				'Fehler bei der Erzeugung des Dokuments'), 1);
		}

		last TYPE;
	};
	}
	};
	if ($@) {
		$sk_session->standard_error_handling($this_file, $@, 1);
	}

	# in case of error, re-direct to URL without PATH_INFO
	my $url = $q->url( -absolute => 1 );
	$sk_session->redirect($url);
}



my $project_userdatas = Schulkonsole::DB::get_project_userdatas($project);


=back

=head3 Template variables specific to showpassword.tt

=over

=cut

foreach my $user (keys %$project_userdatas) {
	if ($q->param("${user}_showpassword")) {

=item C<isproject>

This is a project

=cut

                $sk_session->set_var('isproject',1);

=item C<showfirstname>

The first name of the user of the displayed password

=cut

		$sk_session->set_var('showfirstname',
			$$project_userdatas{$user}{firstname});

=item C<showsurname>

The surname of the user of the displayed password

=cut

		$sk_session->set_var('showsurname',
			$$project_userdatas{$user}{surname});

=item C<showusername>

The username of the user of the displayed password

=cut

		$sk_session->set_var('showusername', $user);

=item C<showpassword>

The initial password of the user of the displayed password

=back

=cut

		$sk_session->set_var('showpassword',
			$$project_userdatas{$user}{firstpassword});
	
		$sk_session->print_page("showpassword.tt", $this_file);
		exit;
	}
}


=head3 Template variables specific to project_passwords.tt

=over

=cut

my @students;
my @user_selects;
my $lfdnr = 0;
foreach my $user (sort {
	$$project_userdatas{$a}{surname} cmp $$project_userdatas{$b}{surname} }
	keys %$project_userdatas) {

	$lfdnr++;
	my $is_selected = 0;
	if ($q->param("${user};select")) {
		push @user_selects, $user;
		$is_selected = 1;
	}

	my $student = {
                lfdnr => $lfdnr,
		login => $user,
		firstname => $$project_userdatas{$user}{firstname},
		surname => $$project_userdatas{$user}{surname},
		selected => $is_selected,
	};
	push @students, $student;
}

=item C<students>

An array of hashes with the keys

=over

=item C<lfdnr>

The line nr of the user

=over

=item C<login>

The login of a user

=item C<firstname>

The user's first name

=item C<surname>

The user's surname

=item C<selected>

True if the user was previously selected

=back

=cut

$sk_session->set_var('students', \@students);


eval {
COMMANDS: {
$q->param('passwords_reset') and do {
	if (@user_selects) {
		Schulkonsole::Sophomorix::passwords_reset(
			$sk_session->userdata('id'),
			$sk_session->get_password(),
			@user_selects);

		$sk_session->set_status(
			$sk_session->d()->get('Passwörter zurückgesetzt'), 0);
	} else {
		$sk_session->set_status(
			$sk_session->d()->get('Keine Benutzer ausgewählt'), 1);
	}
	last COMMANDS;
};
$q->param('passwords_random') and do {
	if (@user_selects) {
		Schulkonsole::Sophomorix::passwords_random(
			$sk_session->userdata('id'),
			$sk_session->get_password(),
			@user_selects);

		$sk_session->set_status(
			$sk_session->d()->get('Zufallspasswörter gesetzt'), 0);
	} else {
		$sk_session->set_status(
			$sk_session->d()->get('Keine Benutzer ausgewählt'), 1);
	}
	last COMMANDS;
};
$q->param('passwords_set') and do {
	if (@user_selects) {
		if (my $user_password = $q->param('userpassword')) {
			Schulkonsole::Sophomorix::passwords_set(
				$sk_session->userdata('id'),
				$sk_session->get_password(),
				$user_password,
				@user_selects);

			$sk_session->set_status(
				$sk_session->d()->get('Passwörter gesetzt'), 0);
		} else {
			$sk_session->set_status(
				$sk_session->d()->get('Kein Passwort eingegeben'), 1);
		}

	} else {
		$sk_session->set_status(
			$sk_session->d()->get('Keine Benutzer ausgewählt'), 1);
	}
	last COMMANDS;
};
}
};
if ($@) {
	$sk_session->standard_error_handling($this_file, $@);
}



my @projects;
foreach my $project (sort {
	$$projects{$a}{displayname} cmp $$projects{$b}{displayname} }
	                 keys %$projects) {
	push @projects, { gid => $project,
	                  name => $$projects{$project}{displayname},
	                };
}

=item C<projects>

Projects of the current user as an array of hashes with the keys

=over

=item C<gid>

GID of the project

=item C<name>

Name of the project

=item C<addquota>

Additional quota for members of this project

=item C<isadmin>

True if the current user is an administrator of the project

=item C<islastadmin>

True if there are no other administrators of the project but the current
user

=back

=cut

$sk_session->set_var('projects', \@projects);


if ($project) {

=item C<project_gid>

GID of the selected project

=cut

	$sk_session->set_var('project_gid', $project);

=item C<project>

Name of the selected project

=cut

	$sk_session->set_var('project', $$projects{$project}{displayname});

}

$sk_session->print_page("$this_file.tt", $this_file);

=back

=head2 Form fields

=over

=item C<passwords_print>

Write PDF-document with passwords to the file name in the PATHINFO

=item C<${students{login}}_showpassword>

Show password of user with login.
Created in loop over template variable C<students>.

=item C<${students{login}};select>

Checkboxes created in loop over template variable C<students>. The selected
action (passwords_reset/passwords_random/passwords_set) is performed with
the selected logins.

=item C<passwords_reset>

Reset passwords of selected users

=item C<passwords_random>

Set random password for selected users

=item C<passwords_set>

Set password in C<userpassword> for selected users

=item C<userpassword>

Password to be set by passwords_set

=back
