mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2024-12-24 06:05:53 -05:00
Completed mobile web site full desktop mode.
This commit is contained in:
parent
d3e3db653b
commit
80f016f688
@ -5029,6 +5029,10 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
|
||||
try { ws.send(JSON.stringify(responseCmd)); } catch (ex) { }
|
||||
break;
|
||||
}
|
||||
case 'print': {
|
||||
console.log(command.value);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
// Unknown user action
|
||||
console.log('Unknown action from user ' + user.name + ': ' + command.action + '.');
|
||||
|
BIN
public/images/mobile-desk-mouse-left.pdn
Normal file
BIN
public/images/mobile-desk-mouse-left.pdn
Normal file
Binary file not shown.
BIN
public/images/mobile-desk-mouse-left.png
Normal file
BIN
public/images/mobile-desk-mouse-left.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 962 B |
BIN
public/images/mobile-desk-mouse-right.png
Normal file
BIN
public/images/mobile-desk-mouse-right.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 958 B |
BIN
public/images/mobile-desk-mouse.png
Normal file
BIN
public/images/mobile-desk-mouse.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 938 B |
2
public/scripts/amt-desktop-0.0.2-min.js
vendored
2
public/scripts/amt-desktop-0.0.2-min.js
vendored
File diff suppressed because one or more lines are too long
@ -46,6 +46,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
obj.holding = false;
|
||||
obj.lastKeepAlive = Date.now();
|
||||
// ###END###{DesktopInband}
|
||||
obj.SwapMouse = false;
|
||||
|
||||
obj.mNagleTimer = null; // Mouse motion slowdown timer
|
||||
obj.mx = 0; // Last mouse x position
|
||||
@ -823,8 +824,16 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) {
|
||||
|
||||
// RFB "PointerEvent" and mouse handlers
|
||||
obj.mousedblclick = function (e) { }
|
||||
obj.mousedown = function (e) { obj.buttonmask |= (1 << e.button); return obj.mousemove(e, 1); }
|
||||
obj.mouseup = function (e) { obj.buttonmask &= (0xFFFF - (1 << e.button)); return obj.mousemove(e, 1); }
|
||||
obj.mousedown = function (e) {
|
||||
var b = e.button;
|
||||
if (obj.SwapMouse) { if (b == 0) { b = 2; } else if (b == 2) { b = 0; } }
|
||||
obj.buttonmask |= (1 << b); return obj.mousemove(e, 1);
|
||||
}
|
||||
obj.mouseup = function (e) {
|
||||
var b = e.button;
|
||||
if (obj.SwapMouse) { if (b == 0) { b = 2; } else if (b == 2) { b = 0; } }
|
||||
obj.buttonmask &= (0xFFFF - (1 << b)); return obj.mousemove(e, 1);
|
||||
}
|
||||
obj.mousemove = function (e, force) {
|
||||
if (obj.state < 4) return true;
|
||||
var ScaleFactorHeight = (obj.canvas.canvas.height / Q(obj.canvasid).offsetHeight);
|
||||
|
@ -2348,6 +2348,18 @@
|
||||
"default.handlebars->29->568"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "ALT + F4",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->19"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "ALT + TAB",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->23"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cs": "AMT",
|
||||
"de": "AMT",
|
||||
@ -6482,6 +6494,12 @@
|
||||
"default.handlebars->29->482"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "CTRL + W",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->21"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cs": "Chyba volání",
|
||||
"de": "Aufruf-Fehler",
|
||||
@ -9948,7 +9966,7 @@
|
||||
{
|
||||
"en": "Ctrl-Alt-Del",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->buttonMenu->3"
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->3"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -13229,7 +13247,7 @@
|
||||
"zh-chs": "ESC",
|
||||
"zh-cht": "ESC",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->buttonMenu->5",
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->5",
|
||||
"default.handlebars->container->column_l->p11->deskarea0->deskarea4->3",
|
||||
"default.handlebars->container->column_l->p12->termTable->1->1->6->1->3"
|
||||
]
|
||||
@ -32826,6 +32844,18 @@
|
||||
"message2.handlebars->5->15"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "Shift + F10",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->27"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "Shift + WIN + M",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->15"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cs": "Shift+Win+M",
|
||||
"de": "Umschalten+Win+M",
|
||||
@ -35169,6 +35199,12 @@
|
||||
"default.handlebars->29->362"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "TAB",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->25"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cs": "Směrování TCP",
|
||||
"de": "TCP-Routing",
|
||||
@ -39213,6 +39249,36 @@
|
||||
"default.handlebars->29->64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "WIN + Down",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "WIN + L",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->11"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "WIN + M",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->13"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "WIN + R",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->17"
|
||||
]
|
||||
},
|
||||
{
|
||||
"en": "WIN + Up",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->9"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cs": "Čeká se na druhého uživatele…",
|
||||
"de": "Warte auf anderen Benutzer...",
|
||||
@ -39646,7 +39712,7 @@
|
||||
"zh-chs": "Win",
|
||||
"zh-cht": "Win",
|
||||
"xloc": [
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->buttonMenu->1",
|
||||
"default-mobile.handlebars->container->page_content->column_l->p10->deskButtonMenu->1",
|
||||
"default-mobile.handlebars->dialog->3->dialog3->deskkeys->5",
|
||||
"default.handlebars->container->column_l->p11->deskarea0->deskarea4->3->deskkeys->3",
|
||||
"desktop.handlebars->p11->deskarea0->deskarea4->3->deskkeys->3"
|
||||
|
@ -604,15 +604,30 @@
|
||||
</div>
|
||||
|
||||
<img id="deskkeybutton1" src="images/mobile-desk-exit.png" class="deskButton" style="top:10px;display:none" onclick="exitButton()" />
|
||||
<img id="deskkeybutton2a" src="images/mobile-desk-keyboard-open.png" class="deskButton" style="top:60px;display:none" onclick="toggleKeyboard()" />
|
||||
<img id="deskkeybutton2b" src="images/mobile-desk-keyboard-close.png" class="deskButton" style="top:60px;display:none" onclick="toggleKeyboard()" />
|
||||
<img id="deskkeybutton3a" src="images/mobile-desk-menu-open.png" class="deskButton" style="top:110px;display:none" onclick="toggleMenu(false)" />
|
||||
<img id="deskkeybutton3b" src="images/mobile-desk-menu-close.png" class="deskButton" style="top:110px;display:none" onclick="toggleMenu(true)" />
|
||||
<div style="position:absolute;top:0;left:0;z-index:200;opacity:0;width:1px;height:1px"><input id="softKeyboard" type="text" style="z-index:200;width:1px;height:1px" onfocus="keyboardFocusChange()" onblur="keyboardFocusChange()" onkeypress="return ondeskkeypress(event)" onkeydown="return ondeskkeydown(event)" onkeyup="return ondeskkeyup(event)" /></div>
|
||||
<div id="buttonMenu" style="display:none;position:absolute;top:10px;left:10px;right:55px;bottom:10px;z-index:1000">
|
||||
<div class="menuButton" onclick="deskMenuButton(1)">Win</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(2)">Ctrl-Alt-Del</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(3)">ESC</div>
|
||||
<img id="deskkeybutton3a" src="images/mobile-desk-menu-open.png" class="deskButton" style="top:60px;display:none" onclick="toggleMenu(false)" />
|
||||
<img id="deskkeybutton3b" src="images/mobile-desk-menu-close.png" class="deskButton" style="top:60px;display:none" onclick="toggleMenu(true)" />
|
||||
<img id="deskkeybutton4a" src="images/mobile-desk-mouse-left.png" class="deskButton" style="top:110px;display:none" onclick="deskChangeMouseButton(0)" />
|
||||
<img id="deskkeybutton4b" src="images/mobile-desk-mouse-right.png" class="deskButton" style="top:110px;display:none" onclick="deskChangeMouseButton(1)" />
|
||||
<img id="deskkeybutton2a" src="images/mobile-desk-keyboard-open.png" class="deskButton" style="top:160px;display:none" onclick="toggleKeyboard()" />
|
||||
<img id="deskkeybutton2b" src="images/mobile-desk-keyboard-close.png" class="deskButton" style="top:160px;display:none" onclick="toggleKeyboard()" />
|
||||
<div style="position:absolute;top:0;left:0;z-index:200;opacity:0;width:1px;height:1px">
|
||||
<input id="softKeyboard" autocomplete="off" type="password" style="z-index:200;opacity:0;width:1px;height:1px" onfocus="keyboardFocusChange()" onblur="keyboardFocusChange()" onkeypress="return ondeskkeypress(event)" onkeydown="return ondeskkeydown(event)" onkeyup="return ondeskkeyup(event)" />
|
||||
</div>
|
||||
<div id="deskButtonMenu" style="display:none;position:absolute;top:10px;left:10px;right:55px;bottom:10px;z-index:1000">
|
||||
<div class="menuButton" onclick="deskMenuButton(5)">Win</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(10)">Ctrl-Alt-Del</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(13)">ESC</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(0)">WIN + Down</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(1)">WIN + Up</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(2)">WIN + L</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(3)">WIN + M</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(4)">Shift + WIN + M</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(6)">WIN + R</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(7)">ALT + F4</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(8)">CTRL + W</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(9)">ALT + TAB</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(11)">TAB</div>
|
||||
<div class="menuButton" onclick="deskMenuButton(12)">Shift + F10</div>
|
||||
</div>
|
||||
|
||||
<div id=p10desktop style="overflow:hidden;position:absolute;top:55px;bottom:0px;width:100%;display:none">
|
||||
@ -922,6 +937,11 @@
|
||||
QH('p1message', "Connecting...");
|
||||
go(1);
|
||||
|
||||
// Document keys
|
||||
document.onkeypress = ondeskkeypress;
|
||||
document.onkeydown = ondeskkeydown;
|
||||
document.onkeyup = ondeskkeyup;
|
||||
|
||||
// Connect to the mesh server
|
||||
meshserver = MeshServerCreateControl(domainUrl, authCookie);
|
||||
meshserver.onStateChanged = onStateChanged;
|
||||
@ -1711,7 +1731,6 @@
|
||||
Q('apassword1').focus();
|
||||
}
|
||||
|
||||
|
||||
function account_showChangePassword() {
|
||||
if (xxdialogMode) return false;
|
||||
var x = '<table style=margin-left:10px>';
|
||||
@ -2149,10 +2168,12 @@
|
||||
updateDevices();
|
||||
}
|
||||
|
||||
var gotKeyPressEvent = false;
|
||||
function ondeskkeypress(e) {
|
||||
Q('softKeyboard').value = '';
|
||||
setSessionActivity();
|
||||
if (desktop && !xxdialogMode && xxcurrentView == 10) {
|
||||
if (desktop && !xxdialogMode && (xxcurrentView == 10) && (currentDevicePanel == 1)) {
|
||||
gotKeyPressEvent = true;
|
||||
Q('softKeyboard').value = '';
|
||||
// Check what keys we are allows to send
|
||||
if (currentNode != null) {
|
||||
var meshrights = GetMeshRights(currentNode.meshid);
|
||||
@ -2166,9 +2187,10 @@
|
||||
}
|
||||
|
||||
function ondeskkeydown(e) {
|
||||
Q('softKeyboard').value = '';
|
||||
setSessionActivity();
|
||||
if (desktop && !xxdialogMode && xxcurrentView == 10) {
|
||||
if (desktop && !xxdialogMode && (xxcurrentView == 10) && (currentDevicePanel == 1)) {
|
||||
gotKeyPressEvent = false;
|
||||
Q('softKeyboard').value = '';
|
||||
// Check what keys we are allows to send
|
||||
if (currentNode != null) {
|
||||
var meshrights = GetMeshRights(currentNode.meshid);
|
||||
@ -2182,9 +2204,10 @@
|
||||
}
|
||||
|
||||
function ondeskkeyup(e) {
|
||||
Q('softKeyboard').value = '';
|
||||
setSessionActivity();
|
||||
if (desktop && !xxdialogMode && xxcurrentView == 10) {
|
||||
if (desktop && !xxdialogMode && (xxcurrentView == 10) && (currentDevicePanel == 1)) {
|
||||
var inputStr = Q('softKeyboard').value;
|
||||
Q('softKeyboard').value = '';
|
||||
// Check what keys we are allows to send
|
||||
if (currentNode != null) {
|
||||
var meshrights = GetMeshRights(currentNode.meshid);
|
||||
@ -2193,7 +2216,14 @@
|
||||
var limitedInputAllowed = ((meshrights != 0xFFFFFFFF) && (((meshrights & 8) != 0) && ((meshrights & 256) == 0) && ((meshrights & 4096) != 0)));
|
||||
if (limitedInputAllowed == true) { if ((e.altKey == true) || (e.ctrlKey == true) || ((e.keyCode < 32) && (e.keyCode != 8) && (e.keyCode != 13)) || (e.keyCode > 90)) return false; }
|
||||
}
|
||||
return desktop.m.handleKeyUp(e);
|
||||
if ((gotKeyPressEvent == false) && (inputStr.length > 0) && desktop.m.SendKeyUnicode) {
|
||||
// This is a mobile keyboard, we need to send that is in the input control.
|
||||
var inputchar = inputStr[inputStr.length - 1].charCodeAt(0);
|
||||
desktop.m.SendKeyUnicode(desktop.m.KeyAction.DOWN, inputchar);
|
||||
desktop.m.SendKeyUnicode(desktop.m.KeyAction.UP, inputchar);
|
||||
} else {
|
||||
return desktop.m.handleKeyUp(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3215,29 +3245,33 @@
|
||||
}
|
||||
|
||||
function exitButton() {
|
||||
QV('deskButtonMenu', false);
|
||||
deskToggleFull();
|
||||
}
|
||||
|
||||
function closeFullscreen() {
|
||||
if (fullScreenMode = false) return;
|
||||
if (document.exitFullscreen) { document.exitFullscreen(); }
|
||||
else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } // Safari
|
||||
else if (document.msExitFullscreen) { document.msExitFullscreen(); } // IE11
|
||||
fullScreenMode = false;
|
||||
}
|
||||
|
||||
function deskMenuButton(x) {
|
||||
toggleMenu(true);
|
||||
if (x == 1) { deskSendKeys(5); } // Win
|
||||
if (x == 2) { deskSendKeys(10); } // CTRL-ALT-DEL
|
||||
if (x == 3) { deskSendKeys(13); } // ESC
|
||||
}
|
||||
function deskMenuButton(x) { toggleMenu(true); deskSendKeys(x); }
|
||||
|
||||
function toggleMenu(x) {
|
||||
QV('buttonMenu', fullscreen && !x);
|
||||
QV('deskButtonMenu', fullscreen && !x);
|
||||
QV('deskkeybutton3a', fullscreen && x);
|
||||
QV('deskkeybutton3b', fullscreen && !x);
|
||||
}
|
||||
|
||||
function deskChangeMouseButton(x) {
|
||||
if (desktop == null) return;
|
||||
desktop.m.SwapMouse = !desktop.m.SwapMouse;
|
||||
QV('deskkeybutton4a', fullscreen && (!desktop.m.SwapMouse));
|
||||
QV('deskkeybutton4b', fullscreen && (desktop.m.SwapMouse));
|
||||
}
|
||||
|
||||
var fullscreen = false;
|
||||
function deskToggleFull() {
|
||||
fullscreen = !fullscreen;
|
||||
@ -3257,6 +3291,8 @@
|
||||
QV('deskkeybutton2b', false);
|
||||
QV('deskkeybutton3a', fullscreen);
|
||||
QV('deskkeybutton3b', false);
|
||||
QV('deskkeybutton4a', fullscreen && (!desktop.m.SwapMouse));
|
||||
QV('deskkeybutton4b', fullscreen && (desktop.m.SwapMouse));
|
||||
if (fullscreen) {
|
||||
QS('page_content').top = '0px';
|
||||
QS('page_content').bottom = '0px';
|
||||
@ -3315,19 +3351,19 @@
|
||||
function deskSendKeys(key) {
|
||||
if (xxdialogMode || desktop == null || desktop.State != 3) return;
|
||||
var ks = key ? key : Q('deskkeys').value;
|
||||
if (ks == 0) { // WIN+Down arrow
|
||||
if (ks == 0) { // WIN + Down arrow
|
||||
if (desktop.contype == 2) {
|
||||
desktop.m.sendkey([[0xffe7, 1], [0xff54, 1], [0xff54, 0], [0xffe7, 0]]); // Intel AMT: Meta-left down, Down arrow press, Down arrow release, Meta-left release
|
||||
} else {
|
||||
desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN, 0x5B], [desktop.m.KeyAction.DOWN, 40], [desktop.m.KeyAction.UP, 40], [desktop.m.KeyAction.EXUP, 0x5B]]); // Agent: L-Winkey press, Down arrow press, Down arrow release, L-Winkey release
|
||||
}
|
||||
} else if (ks == 1) { // WIN+Up arrow
|
||||
} else if (ks == 1) { // WIN + Up arrow
|
||||
if (desktop.contype == 2) {
|
||||
desktop.m.sendkey([[0xffe7, 1], [0xff52, 1], [0xff52, 0], [0xffe7, 0]]); // Intel AMT: Meta-left down, Up arrow press, Up arrow release, Meta-left release
|
||||
} else {
|
||||
desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN, 0x5B], [desktop.m.KeyAction.DOWN, 38], [desktop.m.KeyAction.UP, 38], [desktop.m.KeyAction.EXUP, 0x5B]]); // MeshAgent: L-Winkey press, Up arrow press, Up arrow release, L-Winkey release
|
||||
}
|
||||
} else if (ks == 2) { // WIN+L arrow
|
||||
} else if (ks == 2) { // WIN + L
|
||||
if (desktop.contype == 2) {
|
||||
desktop.m.sendkey([[0xffe7, 1], [0x6c, 1], [0x6c, 0], [0xffe7, 0]]); // Intel AMT: Meta-left down, 'l' press, 'l' release, Meta-left release
|
||||
} else {
|
||||
@ -3338,13 +3374,13 @@
|
||||
//desktop.m.SendKeyMsgKC(desktop.m.KeyAction.UP, 76);
|
||||
//desktop.m.SendKeyMsgKC(desktop.m.KeyAction.EXUP, 0x5B);
|
||||
}
|
||||
} else if (ks == 3) { // WIN+M arrow
|
||||
} else if (ks == 3) { // WIN + M
|
||||
if (desktop.contype == 2) {
|
||||
desktop.m.sendkey([[0xffe7, 1], [0x6d, 1], [0x6d, 0], [0xffe7, 0]]); // Intel AMT: Meta-left down, 'm' press, 'm' release, Meta-left release
|
||||
} else {
|
||||
desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN, 0x5B], [desktop.m.KeyAction.DOWN, 77], [desktop.m.KeyAction.UP, 77], [desktop.m.KeyAction.EXUP, 0x5B]]); // MeshAgent: L-Winkey press, 'M' press, 'M' release, L-Winkey release
|
||||
}
|
||||
} else if (ks == 4) { // Shift+WIN+M arrow
|
||||
} else if (ks == 4) { // Shift + WIN + M
|
||||
if (desktop.contype == 2) {
|
||||
desktop.m.sendkey([[0xffe1, 1], [0xffe7, 1], [0x6d, 1], [0x6d, 0], [0xffe7, 0], [0xffe1, 0]]); // Intel AMT: Shift-left down, Meta-left down, 'm' press, 'm' release, Meta-left release, Shift-left release
|
||||
} else {
|
||||
@ -3356,7 +3392,7 @@
|
||||
} else {
|
||||
desktop.m.SendKeyMsgKC([[desktop.m.KeyAction.EXDOWN, 0x5B], [desktop.m.KeyAction.EXUP, 0x5B]]); // MeshAgent: L-Winkey press, L-Winkey release
|
||||
}
|
||||
} else if (ks == 6) { // WIN+R
|
||||
} else if (ks == 6) { // WIN + R
|
||||
if (desktop.contype == 2) {
|
||||
desktop.m.sendkey([[0xffe7, 1], [0x72, 1], [0x72, 0], [0xffe7, 0]]); // Intel AMT: Meta-left down, 'r' press, 'r' release, Meta-left release
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user