1: # The LearningOnline Network with CAPA
2: # LTI Provider Module to respond to a user session logout request.
3: #
4: # $Id: ltilogout.pm,v 1.1 2019/07/18 18:28:46 raeburn Exp $
5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: #
26: # http://www.lon-capa.org/
27: #
28:
29: package Apache::ltilogout;
30:
31: use strict;
32: use Apache::Constants qw(:common :http);
33: use Apache::lonnet;
34: use Apache::loncommon;
35:
36: sub handler {
37: my $r = shift;
38: my ($id) = ($r->uri =~ m{^/adm/service/logout/(\w+)$});
39: if ($id) {
40: my $dir = $r->dir_config('ltiIDsDir');
41: my $lonhost = $r->dir_config('lonHostID');
42: if (($dir ne '') && (-d $dir)) {
43: if (-e "$dir/$id") {
44: if (open(my $fh,'<',"$dir/$id")) {
45: my $contents = <$fh>;
46: chomp($contents);
47: close($fh);
48: my ($uname,$udom,$hostid) = split(/,/,$contents);
49: if (($uname ne '') && ($udom ne '')) {
50: my $uhome = &Apache::lonnet::homeserver($uname,$udom);
51: if ($uhome ne 'no_host') {
52: my $lonhost = $r->dir_config('lonHostID');
53: if ($hostid eq $lonhost) {
54: &delete_session($udom,$uname);
55: } else {
56: my ($is_balancer,$posshost,$setcookie) =
57: &Apache::lonnet::check_loadbalancing($uname,$udom,'login');
58: if ($is_balancer) {
59: if ($setcookie) {
60: my $balancedir=$r->dir_config('lonBalanceDir');
61: if (opendir(my $dirh,$balancedir)) {
62: while (my $filename=readdir($dirh)) {
63: if ($filename =~/^\Q$udom\E_\Q$uname\E_/) {
64: if (open(my $fh,'<',"$balancedir/$filename")) {
65: my $lonid = <$fh>;
66: close($fh);
67: if ($lonid eq $lonhost) {
68: &delete_session($r,$udom,$uname);
69: } elsif (&Apache::lonnet::hostname($lonid) ne '') {
70: &Apache::lonnet::delusersession($lonid,$udom,$uname);
71: }
72: }
73: last;
74: }
75: }
76: closedir($dirh);
77: }
78: } else {
79: my $lonid = &Apache::lonnet::find_existing_session($udom,$uname);
80: if ($lonid eq $lonhost) {
81: &delete_session($r,$udom,$uname);
82: } elsif (&Apache::lonnet::hostname($lonid) ne '') {
83: &Apache::lonnet::delusersession($lonid,$udom,$uname);
84: }
85: }
86: } else {
87: &delete_session($r,$udom,$uname);
88: }
89: }
90: }
91: }
92: }
93: }
94: }
95: }
96: return OK;
97: }
98:
99: sub delete_session {
100: my ($r,$udom,$uname) = @_;
101: my $lonidsdir = $r->dir_config('lonIDsDir');
102: if (-d $lonidsdir) {
103: if (opendir(my $dir,$lonidsdir)) {
104: while (my $filename=readdir($dir)) {
105: if ($filename=~/^\Q$uname\E_\d+_\Q$udom\E_/) {
106: unlink("$dir/$filename");
107: last;
108: }
109: }
110: }
111: }
112: }
113:
114: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>