summaryrefslogtreecommitdiffstats
path: root/modules-available/dozmod/inc/pagedozmodlog.inc.php
blob: 80441cd19841ec6a1a17e9bd490a57ba0616710e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<?php

class Page_dozmod_log extends Page
{

	private $action;
	private $uuid;

	protected function doPreprocess()
	{
		$this->action = Request::get('action', '', 'string');
		if ($this->action !== '' && $this->action !== 'showtarget' && $this->action !== 'showuser') {
			Util::traceError('Invalid action for actionlog: "' . $this->action . '"');
		}
		$this->uuid = Request::get('uuid', '', 'string');
	}

	protected function doRender()
	{
		Render::addTemplate('actionlog-header');
		if ($this->action === '') {
			$this->generateLog("SELECT al.dateline, al.targetid, al.description,"
				. " img.displayname AS imgname, tu.firstname AS tfirstname, tu.lastname AS tlastname, l.displayname AS lecturename,"
				. " al.userid AS uuserid, usr.firstname AS ufirstname, usr.lastname AS ulastname"
				. " FROM sat.actionlog al"
				. " LEFT JOIN sat.imagebase img ON (img.imagebaseid = targetid)"
				. " LEFT JOIN sat.user usr ON (usr.userid = al.userid)"
				. " LEFT JOIN sat.user tu ON (tu.userid = al.targetid)"
				. " LEFT JOIN sat.lecture l ON (l.lectureid = targetid)"
				. " ORDER BY al.dateline DESC LIMIT 500", array(), true, true);
		} elseif ($this->action === 'showuser') {
			if (User::hasPermission("log.showuser")) {
				$this->listUser();
			}
		} else {
			if (User::hasPermission("log.showtarget")) {
				$this->listTarget();
			}
		}
	}

	private function listUser()
	{
		// Query user
		$user = Database::queryFirst('SELECT userid, firstname, lastname, email, lastlogin,'
			. ' organization.displayname AS orgname FROM sat.user'
			. ' LEFT JOIN sat.organization USING (organizationid)'
			. ' WHERE userid = :uuid'
			. ' LIMIT 1', array('uuid' => $this->uuid));
		if ($user === false) {
			Message::addError('unknown-userid', $this->uuid);
			Util::redirect('?do=dozmod&section=actionlog');
		}
		// Mangle date and render
		$user['lastlogin_s'] = date('d.m.Y H:i', $user['lastlogin']);
		Render::addTemplate('actionlog-user', $user);
		// Finally add the actionlog
		$this->generateLog("SELECT al.dateline, al.targetid, al.description,"
			. " img.displayname AS imgname, usr.firstname AS tfirstname, usr.lastname AS tlastname, l.displayname AS lecturename"
			. " FROM sat.actionlog al"
			. " LEFT JOIN sat.imagebase img ON (img.imagebaseid = targetid)"
			. " LEFT JOIN sat.user usr ON (usr.userid = targetid)"
			. " LEFT JOIN sat.lecture l ON (l.lectureid = targetid)"
			. " WHERE al.userid = :uuid"
			. " ORDER BY al.dateline DESC LIMIT 500", array('uuid' => $this->uuid), false, true);
	}

	private function listTarget()
	{
		// We have to guess what kind of target it is
		if (!$this->addImageHeader()
				&& !$this->addLectureHeader()) {
			Message::addError('unknown-targetid', $this->uuid);
			// Keep going, there might still be log entries for a deleted uuid
		}

		// Finally add the actionlog
		$this->generateLog("SELECT al.dateline, al.userid AS uuserid, al.description,"
			. " usr.firstname AS ufirstname, usr.lastname AS ulastname"
			. " FROM sat.actionlog al"
			. " LEFT JOIN sat.user usr ON (usr.userid = al.userid)"
			. " WHERE al.targetid = :uuid"
			. " ORDER BY al.dateline DESC LIMIT 500", array('uuid' => $this->uuid), true, false);
	}

	private function addImageHeader()
	{
		$image = Database::queryFirst('SELECT o.userid AS ouserid, o.firstname AS ofirstname, o.lastname AS olastname,'
			. ' u.userid AS uuserid, u.firstname AS ufirstname, u.lastname AS ulastname,'
			. ' img.displayname, img.description, img.createtime, img.updatetime,'
			. ' os.displayname AS osname'
			. ' FROM sat.imagebase img'
			. ' LEFT JOIN sat.user o ON (img.ownerid = o.userid)'
			. ' LEFT JOIN sat.user u ON (img.updaterid = u.userid)'
			. ' LEFT JOIN sat.operatingsystem os ON (img.osid = os.osid)'
			. ' WHERE img.imagebaseid = :uuid'
			. ' LIMIT 1', array('uuid' => $this->uuid));
		if ($image !== false) {
			// Mangle date and render
			$image['createtime_s'] = date('d.m.Y H:i', $image['createtime']);
			$image['updatetime_s'] = date('d.m.Y H:i', $image['updatetime']);
			$image['descriptionHtml'] = nl2br(htmlspecialchars($image['description']));
			Render::addTemplate('actionlog-image', $image);
		}
		return $image !== false;
	}

	private function addLectureHeader()
	{
		$lecture = Database::queryFirst('SELECT o.userid AS ouserid, o.firstname AS ofirstname, o.lastname AS olastname,'
			. ' u.userid AS uuserid, u.firstname AS ufirstname, u.lastname AS ulastname,'
			. ' l.displayname, l.description, l.createtime, l.updatetime,'
			. ' img.displayname AS imgname, img.imagebaseid'
			. ' FROM sat.lecture l'
			. ' LEFT JOIN sat.user o ON (l.ownerid = o.userid)'
			. ' LEFT JOIN sat.user u ON (l.updaterid = u.userid)'
			. ' LEFT JOIN sat.imageversion ver ON (ver.imageversionid = l.imageversionid)'
			. ' LEFT JOIN sat.imagebase img ON (img.imagebaseid = ver.imagebaseid)'
			. ' WHERE l.lectureid = :uuid'
			. ' LIMIT 1', array('uuid' => $this->uuid));
		if ($lecture !== false) {
			// Mangle date and render
			$lecture['createtime_s'] = date('d.m.Y H:i', $lecture['createtime']);
			$lecture['updatetime_s'] = date('d.m.Y H:i', $lecture['updatetime']);
			$lecture['descriptionHtml'] = nl2br(htmlspecialchars($lecture['description']));
			Render::addTemplate('actionlog-lecture', $lecture);
		}
		return $lecture !== false;
	}

	private function generateLog($query, $params, $showActor, $showTarget)
	{
		// query action log
		$res = Database::simpleQuery($query, $params);
		$events = array();
		while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
			$row['dateline_s'] = date('d.m.Y H:i', $row['dateline']);
			if (isset($row['imgname'])) {
				$row['targeturl'] = '?do=dozmod&section=actionlog&action=showtarget&uuid=' . $row['targetid'];
				$row['targetname'] = $row['imgname'];
			} elseif (isset($row['tlastname'])) {
				$row['targeturl'] = '?do=dozmod&section=actionlog&action=showuser&uuid=' . $row['targetid'];
				$row['targetname'] = $row['tlastname'] . ', ' . $row['tfirstname'];
			} elseif (isset($row['lecturename'])) {
				$row['targeturl'] = '?do=dozmod&section=actionlog&action=showtarget&uuid=' . $row['targetid'];
				$row['targetname'] = $row['lecturename'];
			}
			$events[] = $row;
		}
		$data = array('events' => $events);
		if ($showActor) {
			$data['showActor'] = true;
		}
		if ($showTarget) {
			$data['showTarget'] = true;
		}

		$data['allowedShowUser'] = User::hasPermission("log.showuser");
		$data['allowedShowTarget'] = User::hasPermission("log.showtarget");
		Render::addTemplate('actionlog-log', $data);
	}

}