Skip to content

Commit

Permalink
Improvise impersonate app with changes
Browse files Browse the repository at this point in the history
Below are the changes implemented:
1) Support of groups which can be impersonated.
2) Support of logout which switches back to orignal user.
3) Support to display the user logged as information as notification.
4) Removed the confirmation dialog to impersonate.

Signed-off-by: Sujith H <sharidasan@owncloud.com>
  • Loading branch information
sharidas committed Apr 12, 2017
1 parent 9af19c4 commit 67551bf
Show file tree
Hide file tree
Showing 11 changed files with 200 additions and 23 deletions.
9 changes: 8 additions & 1 deletion appinfo/app.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,18 @@
* @copyright Jörn Friedrich Dreyer 2015
*/

\OCP\App::registerAdmin('impersonate', 'settings-admin');
// --- register js for user management------------------------------------------
$eventDispatcher = \OC::$server->getEventDispatcher();
$eventDispatcher->addListener(
'OC\Settings\Users::loadAdditionalScripts',
function() {
\OCP\Util::addScript('impersonate', 'impersonate');
}
);
);
$eventDispatcher->addListener(
'OC\TemplateLayout::loadAdditionalScripts',
function() {
\OCP\Util::addScript('impersonate','impersonate_logout');
}
);
4 changes: 2 additions & 2 deletions appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
<author>Jörn Friedrich Dreyer</author>
<version>0.0.5</version>
<dependencies>
<owncloud min-version="9.0" max-version="9.1" />
<owncloud min-version="9.0" max-version="10.0" />
</dependencies>
</info>
</info>
19 changes: 18 additions & 1 deletion appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,28 @@
$this,
[
'routes' => [

// Land in users setting page ( for admin user only )
[
'name' => 'Settings#impersonate',
'url' => '/user',
'verb' => 'POST',
],

// Land in admin section to add settings
[
'name' => 'admin_settings#impersonateAdminTemplate',
'url' => '/settings/impersonatetemplate',
'verb' => 'POST',
],

//Land in index page
[
'name' => 'Logout#logoutcontroller',
'url' => '/logout',
'verb' => 'POST',
],

],
]
);
);
59 changes: 59 additions & 0 deletions controller/logoutcontroller.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

namespace OCA\Impersonate\Controller;

use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
use OCP\ILogger;
use OCP\IRequest;
use OCP\AppFramework\Controller;
use OCP\IUser;
use OCP\IUserManager;
use OCP\IUserSession;


class LogoutController extends Controller {
/** @var IUserManager */
private $userManager;
/** @var IUserSession */
private $userSession;
/** @var ILogger */
private $logger;

/**
* @NoAdminRequired
*
* @param string $appName
* @param IRequest $request
* @param IUserManager $userManager
* @param IUserSession $userSession
* @param ILogger $logger
*/

public function __construct($appName, IRequest $request, IUserManager $userManager, IUserSession $userSession, ILogger $logger) {
parent::__construct($appName, $request);
$this->userManager = $userManager;
$this->userSession = $userSession;
$this->logger = $logger;
}

/**
* @NoAdminRequired
*
* @param string userid
* @UseSession
* @return JSONResponse
*/
public function logoutcontroller($userid) {
$user = $this->userManager->get($_SESSION['oldUserId']);

if($user === null) {
return new JSONResponse("No user found for $user", Http::STATUS_NOT_FOUND);
} else {
$this->userSession->setUser($user);
$this->logger->warning("Going to switch to a different user $oldUserId", ['app' => 'impersonate']);
list($_SESSION['oldUserId'],$_SESSION['newUserId']) = array($_SESSION['newUserId'], $_SESSION['oldUserId']);
}
return new JSONResponse();
}
}
4 changes: 3 additions & 1 deletion controller/settingscontroller.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,19 @@ public function __construct($appName, IRequest $request, IUserManager $userManag
*/
public function impersonate($userid) {
$oldUserId = $this->userSession->getUser()->getUID();
$_SESSION['oldUserId'] = $oldUserId;
$this->logger->warning("User $oldUserId trying to impersonate user $userid", ['app' => 'impersonate']);

$user = $this->userManager->get($userid);
$_SESSION['newUserId'] = $userid;
if ($user === null) {
return new JSONResponse("No user found for $userid", Http::STATUS_NOT_FOUND);
} else {
$this->logger->warning("changing to user $userid", ['app' => 'impersonate']);
$this->userSession->setUser($user);
\OC::$server->getAppConfig()->setValue('impersonate', 'impersonating_user_id', $oldUserId);
}
return new JSONResponse();
}

}

Empty file added css/settings-admin.css
Empty file.
45 changes: 27 additions & 18 deletions js/impersonate.js
Original file line number Diff line number Diff line change
@@ -1,38 +1,47 @@
(function(){

$(document).ready(function() {
$(window).load(function () {

function impersonate(userid) {
var currentUser = OC.getCurrentUser().uid;
$.post(
OC.generateUrl('apps/impersonate/user'),
{ userid: userid }
).done(function( result ) {
OC.AppConfig.setValue('impersonate','impersonating_user_id',currentUser);
window.location = OC.generateUrl('apps/files');
}).fail(function( result ) {
OC.dialogs.alert(result.responseJSON.message, t('impersonate', 'Could not impersonate user'));
});
}

$('<th>&nbsp;</th>').insertAfter('#userlist #headerName');
$('<td><a class="action permanent impersonate" href="#" title="' +
t('impersonate', 'Impersonate') + '">' +
'<img class="svg permanent action" src="' + OC.imagePath('core','actions/user.svg') + '" />' +
'</a></td>')
.insertAfter('#userlist .name');
OC.AppConfig.getValue('impersonate','impersonate_include_groups_list',"[]", function (data) {
data = eval(data);
if (data.length !== 0) {
var newColumn = $("#userlist").find("tr:first-child");
$('<th id="impersonateId" scope="col">Impersonate</th>').insertAfter(newColumn.find("#headerName"));
for(var i = 0; i < data.length; i++) {
var collectTr = $("#userlist tr");
$.each($("#userlist tr"), function (){
var textDisplayed = $(this).find('td.groups').text();
if ($.trim(textDisplayed) === $.trim(data[i])) {
var addImpersonate ='<td><a class="action permanent impersonate" href="#" title="' +
'Impersonate' + '">' +
'<img class="svg permanent action" src="' + OC.imagePath('core','actions/user.svg') + '" />' +
'</a></td>';
$(addImpersonate).insertAfter($(this).find('.name'));
} else {
var addImpersonate = '<td class="impersonateDisabled"><span></span></td>';
$(addImpersonate).insertAfter($(this).find('.name'));
}
});
}
}
});

$('#userlist').on('click', '.impersonate', function() {
var userid = $(this).parents('tr').find('.name').text();
OCdialogs.confirm(
t('impersonate', 'With great power comes great responsibility!'),
t('impersonate', 'Are you sure you want to impersonate {userid}?',
{userid: userid} ),
function(result) {
if (result) {
impersonate(userid);
}
},
true
);
impersonate(userid);
});

});
Expand Down
35 changes: 35 additions & 0 deletions js/impersonate_logout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
$(document).ready(function () {

var text = t(
'core',
'<a href="{docUrl}">{displayText}</a>',
{
docUrl: OC.generateUrl('apps/files'),
displayText: "Logged in as " + OC.getCurrentUser().uid,
}
);

var timeout = 15;
OC.Notification.showHtml(
text,
{
isHTML: true, timeout
}
);

function logoutHandler(userid) {
var promisObj = $.post(
OC.generateUrl('apps/impersonate/logout'),
{userid: userid}
).promise();

promisObj.done(function () {
window.location = OC.generateUrl('apps/files');
});
}

$("#logout").on('click', function () {
var userid = $("#expandDisplayName").text();
logoutHandler(userid);
});
});
17 changes: 17 additions & 0 deletions js/settings-admin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
$(document).ready(function () {
$("#impersonateIncludeGroups").change(function () {
$("#selectIncludedGroups").toggleClass('hidden', !this.checked);
var val = $("#impersonateIncludeGroups").is(":checked");
OC.AppConfig.setValue('impersonate',$(this).attr('name'),val);
});

$('#includedGroups').each(function (index, element) {
OC.Settings.setupGroupsSelect($(element));
$(element).change(function(ev) {
var groups = ev.val || [];
groups = JSON.stringify(groups);
OC.AppConfig.setValue('impersonate', $(this).attr('name'), groups);
});
});
});

9 changes: 9 additions & 0 deletions settings-admin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

\OC_Util::checkAdminUser();

\OCP\Util::addStyle('impersonate', 'settings-admin');
\OCP\Util::addScript('impersonate', 'settings-admin');

$tmpl = new OCP\Template( 'impersonate', 'settings-admin' );
return $tmpl->fetchPage();
22 changes: 22 additions & 0 deletions templates/settings-admin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<div class="section" id="impersonateTemplateSettings" >

<h2><?php p($l->t('Impersonate Settings'));?></h2>

<p class="<?php if (\OC::$server->getAppConfig()->getValue('impersonate', 'enabled','no') === 'no') p('hidden');?>">
<input type="checkbox" name="impersonate_include_groups" id="impersonateIncludeGroups" class="checkbox"
value="1" <?php if (\OC::$server->getAppConfig()->getValue('impersonate', 'impersonate_include_groups','false') !== 'false') print_unescaped('checked="checked"'); ?> />
<label for="impersonateIncludeGroups"><?php p($l->t('Include groups for impersonate'));?></label><br/>
</p>
<p id="selectIncludedGroups" class="indent <?php if (\OC::$server->getAppConfig()->getValue('impersonate', 'impersonate_include_groups','false') === 'false') p('hidden'); ?>">
<input name="impersonate_include_groups_list" type="hidden" id="includedGroups" value="<?php
$includeGroupList = \OC::$server->getAppConfig()->getValue('impersonate', 'impersonate_include_groups_list',[]);
$includeGroupList = json_decode($includeGroupList);
$listToPrint = count($includeGroupList) > 0 ? implode('|',$includeGroupList) : '';
p($listToPrint);
?>" style="width: 400px"/>
<br />
<em><?php p($l->t('These groups will be able to impersonate.')); ?></em>
</p>

</div>

0 comments on commit 67551bf

Please sign in to comment.