3
0
mirror of https://github.com/cytodev/LightDMMock.git synced 2024-11-24 23:19:49 +01:00
LightDMMock/mock/LightDMMock.js

532 lines
78 KiB
JavaScript
Raw Normal View History

/**
* LightDMMock "class"
*
* @author Roel Walraven <mail@cytodev.io>
*
* A LightDM Mock that is tightly based on the source C code of
* Antergos' lightdm-webkit2-greeter. Please note that the deprecation errors
* are intrusive for a reason.
*
* Usage:
* Include the file in your theme that needs mocking
* <script type="text/javascript" src="mock/LightDMMock.js"></script>
* Create a new instance of LightDMMock
2016-07-12 23:05:10 +02:00
* if(!("lightdm" in window)) {
* var LightDMMock = LightDMMock || {};
* window.lightdm = new LightDMMock(autofill, timeout, autoGuest);
* }
*
* @param {boolean} autofill [wether or not the arrays for users, languages,
* layouts, and sessions need to be filled with mock
* data. I advise to test both to make your theme
* less prone to crashing.]
* @param {number} timeout [Value to use for simulated autologin (this value
* is in seconds).]
* @param {boolean} autoGuest [Wether or not to simulate automatic guest login.
* This will also enable a guest account
* in lightdm.has_guest_account]
*/
"use strict";
function LightDMMock(autofill, timeout, autoGuest) {
this.hostname = null;
this.users = null;
2016-07-12 23:51:10 +02:00
this.default_language = null;
this.language = null;
this.languages = null;
2016-07-12 23:51:10 +02:00
this.default_layout = null;
this.layouts = null;
this.layout = null;
this.sessions = null;
this.num_users = 0;
this.default_session = null;
2016-07-12 23:51:10 +02:00
this.timed_login_user = null;
this.timed_login_delay = null;
this.authentication_user = null;
this.in_authentication = false;
this.is_authenticated = false;
this.can_suspend = false;
this.can_hibernate = false;
this.can_restart = false;
this.can_shutdown = false;
this.lock_hint = false;
this.has_guest_account = false;
this.hide_users = false;
this.select_user = null;
this.select_guest = false;
this.autologin_user = null;
this.autologin_guest = false;
this.autologin_timeout = 0;
2016-07-12 23:51:10 +02:00
if(typeof autofill === "boolean" && autofill) {
2016-07-13 00:03:41 +02:00
this.users = JSON.parse(atob("W3siZGlzcGxheV9uYW1lIjoiQWxleGFuZGVyIHRoZSBHcmVhdCIsImxhbmd1YWdlIjoiZ3JfR1IiLCJyZWFsX25hbWUiOiJCYXNpbGV1cyIsImxheW91dCI6bnVsbCwiaW1hZ2UiOiJtb2NrL2Jhc2lsZXVzYWxleC8uZmFjZSIsImhvbWVfZGlyZWN0b3J5IjoibW9jay9iYXNpbGV1c2FsZXgiLCJuYW1lIjoiYmFzaWxldXNhbGV4IiwibG9nZ2VkX2luIjpmYWxzZSwic2Vzc2lvbiI6bnVsbH0seyJkaXNwbGF5X25hbWUiOiJOYXBvbGVvbiBCb25hcGFydGUiLCJsYW5ndWFnZSI6ImZyX0ZSIiwicmVhbF9uYW1lIjoiTmFwb2xlb24gQm9uYXBhcnRlIiwibGF5b3V0IjpudWxsLCJpbWFnZSI6Im1vY2svbmFwb2xlb25pYi8uZmFjZSIsImhvbWVfZGlyZWN0b3J5IjoibW9jay9uYXBvbGVvbmliIiwibmFtZSI6Im5hcG9sZW9uaWIiLCJsb2dnZWRfaW4iOmZhbHNlLCJzZXNzaW9uIjpudWxsfSx7ImRpc3BsYXlfbmFtZSI6IkdhaXVzIE9jdGF2aXVzIiwibGFuZ3VhZ2UiOiJpdF9JVCIsInJlYWxfbmFtZSI6IkdhaXVzIE9jdGF2aXVzIiwibGF5b3V0IjpudWxsLCJpbWFnZSI6Im1vY2svaW1wZXJhdG9yYXVndXN0dXMvLmZhY2UiLCJob21lX2RpcmVjdG9yeSI6Im1vY2svaW1wZXJhdG9yYXVndXN0dXMiLCJuYW1lIjoiaW1wZXJhdG9yYXVndXN0dXMiLCJsb2dnZWRfaW4iOmZhbHNlLCJzZXNzaW9uIjpudWxsfSx7ImRpc3BsYXlfbmFtZSI6IlNpciBXaW5zdG9uIExlb25hcmQgU3BlbmNlci1DaHVyY2hpbGwiLCJsYW5ndWFnZSI6ImVuX0dCIiwicmVhbF9uYW1lIjoiU2lyIFdpbnN0b24gTGVvbmFyZCBTcGVuY2VyLUNodXJjaGlsbCIsImxheW91dCI6bnVsbCwiaW1hZ2UiOiJtb2NrL2hvbm91cmFibGV3aW5zdG9uLy5mYWNlIiwiaG9tZV9kaXJlY3RvcnkiOiJtb2NrL2hvbm91cmFibGV3aW5zdG9uIiwibmFtZSI6Imhvbm91cmFibGV3aW5zdG9uIiwibG9nZ2VkX2luIjpmYWxzZSwic2Vzc2lvbiI6bnVsbH0seyJkaXNwbGF5X25hbWUiOiJQZXRlciBBbGVrc2V5ZXZpY2ggUm9tYW5vdiIsImxhbmd1YWdlIjoicnVfUlUiLCJyZWFsX25hbWUiOiJQZXRlciBBbGVrc2V5ZXZpY2ggUm9tYW5vdiIsImxheW91dCI6bnVsbCwiaW1hZ2UiOiJtb2NrL3BldGVyYWxleGV5ZXZpY2gvLmZhY2UiLCJob21lX2RpcmVjdG9yeSI6Im1vY2svcGV0ZXJhbGV4ZXlldmljaCIsIm5hbWUiOiJwZXRlcmFsZXhleWV2aWNoIiwibG9nZ2VkX2luIjpmYWxzZSwic2Vzc2lvbiI6bnVsbH0seyJkaXNwbGF5X25hbWUiOiJKb2huIEZpdHpnZXJhbGQgS2VubmVkeSIsImxhbmd1YWdlIjoiZW5fVVMiLCJyZWFsX25hbWUiOiJKb2huIEZpdHpnZXJhbGQgS2VubmVkeSIsImxheW91dCI6bnVsbCwiaW1hZ2UiOiJtb2NrL2phY2trZW5uZWR5Ly5mYWNlIiwiaG9tZV9kaXJlY3RvcnkiOiJtb2NrL2phY2trZW5uZWR5IiwibmFtZSI6ImphY2trZW5uZWR5IiwibG9nZ2VkX2luIjpmYWxzZSwic2Vzc2lvbiI6bnVsbH0seyJkaXNwbGF5X25hbWUiOiJNdWhhbW1lZCBiaW4gTXVyYWQiLCJsYW5ndWFnZSI6InRyX1RSIiwicmVhbF9uYW1lIjoiTXVoYW1tZWQgYmluIE11cmFkIiwibGF5b3V0IjpudWxsLCJpbWFnZSI6Im1vY2svbWVobWVkaXNhbmkvLmZhY2UiLCJob21lX2RpcmVjdG9yeSI6Im1vY2svbWVobWVkaXNhbmkiLCJuYW1lIjoibWVobWVkaXNhbmkiLCJsb2dnZWRfaW4iOmZhbHNlLCJzZXNzaW9uIjpudWxsfSx7ImRpc3BsYXlfbmFtZSI6Ikd1c3RhdnVzIEFkb2xwaHVzIiwibGFuZ3VhZ2UiOiJzdl9TRSIsInJlYWxfbmFtZSI6Ikd1c3RhdnVzIEFkb2xwaHVzIiwibGF5b3V0IjpudWxsLCJpbWFnZSI6Im1vY2svZ3VzdGF2Mi8uZmFjZSIsImhvbWVfZGlyZWN0b3J5IjoibW9jay9ndXN0YXYyIiwibmFtZSI6Imd1c3RhdjIiLCJsb2dnZWRfaW4iOmZhbHNlLCJzZXNzaW9uIjpudWxsfSx7ImRpc3BsYXlfbmFtZSI6Ik1hbyBaZWRvbmciLCJsYW5ndWFnZSI6InRyX1RSIiwicmVhbF9uYW1lIjoiTWFvIFplZG9uZyIsImxheW91dCI6bnVsbCwiaW1hZ2UiOiJtb2NrL2NoYWlybWFuemVkb25nLy5mYWNlIiwiaG9tZV9kaXJlY3RvcnkiOiJtb2NrL2NoYWlybWFuemVkb25nIiwibmFtZSI6ImNoYWlybWFuemVkb25nIiwibG9nZ2VkX2luIjpmYWxzZSwic2Vzc2lvbiI6bnVsbH0seyJkaXNwbGF5X25hbWUiOiJFcmlrIFRob3J2YWxkc3NvbiIsImxhbmd1YWdlIjoibm9fTk8iLCJyZWFsX25hbWUiOiJFcmlrIFRob3J2YWxkc3NvbiIsImxheW91dCI6bnVsbCwiaW1hZ2UiOiJtb2NrL3JlZHRob3J2YWxkLy5mYWNlIiwiaG9tZV9kaXJlY3RvcnkiOiJtb2NrL3JlZHRob3J2YWxkIiwibmFtZSI6InJlZHRob3J2YWxkIiwibG9nZ2VkX2luIjpmYWxzZSwic2Vzc2lvbiI6bnVsbH0seyJkaXNwbGF5X25hbWUiOiJDcmlzdG9mb3JvIENvbG9tYm8iLCJsYW5ndWFnZSI6Iml0X0lUIiwicmVhbF9uYW1lIjoiQ3Jpc3RvZm9ybyBDb2xvbWJvIiwibGF5b3V0IjpudWxsLCJpbWFnZSI6Im1vY2svY3Jpc3RvY29sb21iby8uZmFjZSIsImhvbWVfZGlyZWN0b3J5IjoibW9jay9jcmlzdG9jb2xvbWJvIiwibmFtZSI6ImNyaXN0b2NvbG9tYm8iLCJsb2dnZWRfaW4iOmZhbHNlLCJzZXNzaW9uIjpudWxsfSx7ImRpc3BsYXlfbmFtZSI6IldpbGxlbSB2YW4gT3JhbmplIiwibGFuZ3VhZ2UiOiJubF9OTCIsInJlYWxfbmFtZSI6IldpbGxlbSB2YW4gT3JhbmplIiwibGF5b3V0IjpudWxsLCJpbWFnZSI6Im1vY2svc2lsZW50d2lsbC8uZmFjZSIsImhvbWVfZGlyZWN0b3J5IjoibW9jay9zaWxlbnR3aWxsIiwibmFtZSI6InNpbGVudHdpbGwiLCJsb2dnZWRfaW4iOmZhbHNlLCJzZXNzaW9uIjpudWxsfSx7ImRpc3BsYXlfbmFtZSI6IkdlbmdoaXMgS2hhbiIsImxhbmd1YWdlIjoibW5fTU4iLCJyZWFsX25hbWUiOiJHZW5naGlzIEtoYW4iLCJsYXlvdXQiOm51bGwsImltYWdlIjoibW9jay9raGFnYW50ZW11amluLy5mYWNlIiwiaG9tZV9kaXJlY3RvcnkiOiJtb2NrL2toYWdhbnRlbXVqaW4iLCJuYW1lIjoia2hhZ2FudGVtdWppbiIsImxvZ2dlZF9pbiI6ZmFsc2UsInNlc3Npb24iOm51bGx9LHsiZGlzcGxheV9uYW1
this.languages = JSON.parse(atob("W3sibmFtZSI6IkVuZ2xpc2giLCJjb2RlIjoiZW4iLCJ0ZXJyaXRvcnkiOm51bGx9XQ=="));
this.layouts = JSON.parse(atob("W3sibmFtZSI6InVzIiwic2hvcnRfZGVzY3JpcHRpb24iOiJlbiIsImRlc2NyaXB0aW9uIjoiRW5nbGlzaCAoVVMpIn0seyJuYW1lIjoidXNcdGNociIsInNob3J0X2Rlc2NyaXB0aW9uIjoiY2hyIiwiZGVzY3JpcHRpb24iOiJDaGVyb2tlZSJ9LHsibmFtZSI6InVzXHRldXJvIiwic2hvcnRfZGVzY3JpcHRpb24iOiIiLCJkZXNjcmlwdGlvbiI6IkVuZ2xpc2ggKFVTLCB3aXRoIGV1cm8gb24gNSkifSx7Im5hbWUiOiJ1c1x0aW50bCIsInNob3J0X2Rlc2NyaXB0aW9uIjoiIiwiZGVzY3JpcHRpb24iOiJFbmdsaXNoIChVUywgaW50ZXJuYXRpb25hbCB3aXRoIGRlYWQga2V5cykifSx7Im5hbWUiOiJ1c1x0YWx0LWludGwiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiRW5nbGlzaCAoVVMsIGFsdGVybmF0aXZlIGludGVybmF0aW9uYWwpIn0seyJuYW1lIjoidXNcdGNvbGVtYWsiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiRW5nbGlzaCAoQ29sZW1haykifSx7Im5hbWUiOiJ1c1x0ZHZvcmFrIiwic2hvcnRfZGVzY3JpcHRpb24iOiIiLCJkZXNjcmlwdGlvbiI6IkVuZ2xpc2ggKER2b3JhaykifSx7Im5hbWUiOiJ1c1x0ZHZvcmFrLWludGwiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiRW5nbGlzaCAoRHZvcmFrLCBpbnRlcm5hdGlvbmFsIHdpdGggZGVhZCBrZXlzKSJ9LHsibmFtZSI6InVzXHRkdm9yYWstYWx0LWludGwiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiRW5nbGlzaCAoRHZvcmFrIGFsdGVybmF0aXZlIGludGVybmF0aW9uYWwgbm8gZGVhZCBrZXlzKSJ9LHsibmFtZSI6InVzXHRkdm9yYWstbCIsInNob3J0X2Rlc2NyaXB0aW9uIjoiIiwiZGVzY3JpcHRpb24iOiJFbmdsaXNoIChsZWZ0IGhhbmRlZCBEdm9yYWspIn0seyJuYW1lIjoidXNcdGR2b3Jhay1yIiwic2hvcnRfZGVzY3JpcHRpb24iOiIiLCJkZXNjcmlwdGlvbiI6IkVuZ2xpc2ggKHJpZ2h0IGhhbmRlZCBEdm9yYWspIn0seyJuYW1lIjoidXNcdGR2b3Jhay1jbGFzc2ljIiwic2hvcnRfZGVzY3JpcHRpb24iOiIiLCJkZXNjcmlwdGlvbiI6IkVuZ2xpc2ggKGNsYXNzaWMgRHZvcmFrKSJ9LHsibmFtZSI6InVzXHRkdnAiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiRW5nbGlzaCAocHJvZ3JhbW1lciBEdm9yYWspIn0seyJuYW1lIjoidXNcdHJ1cyIsInNob3J0X2Rlc2NyaXB0aW9uIjoicnUiLCJkZXNjcmlwdGlvbiI6IlJ1c3NpYW4gKFVTLCBwaG9uZXRpYykifSx7Im5hbWUiOiJ1c1x0bWFjIiwic2hvcnRfZGVzY3JpcHRpb24iOiIiLCJkZXNjcmlwdGlvbiI6IkVuZ2xpc2ggKE1hY2ludG9zaCkifSx7Im5hbWUiOiJ1c1x0YWx0Z3ItaW50bCIsInNob3J0X2Rlc2NyaXB0aW9uIjoiIiwiZGVzY3JpcHRpb24iOiJFbmdsaXNoIChpbnRlcm5hdGlvbmFsIEFsdEdyIGRlYWQga2V5cykifSx7Im5hbWUiOiJ1c1x0b2xwYzIiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiRW5nbGlzaCAodGhlIGRpdmlkZS9tdWx0aXBseSBrZXlzIHRvZ2dsZSB0aGUgbGF5b3V0KSJ9LHsibmFtZSI6InVzXHRoYnMiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiU2VyYm8tQ3JvYXRpYW4gKFVTKSJ9LHsibmFtZSI6InVzXHR3b3JrbWFuIiwic2hvcnRfZGVzY3JpcHRpb24iOiIiLCJkZXNjcmlwdGlvbiI6IkVuZ2xpc2ggKFdvcmttYW4pIn0seyJuYW1lIjoidXNcdHdvcmttYW4taW50bCIsInNob3J0X2Rlc2NyaXB0aW9uIjoiIiwiZGVzY3JpcHRpb24iOiJFbmdsaXNoIChXb3JrbWFuLCBpbnRlcm5hdGlvbmFsIHdpdGggZGVhZCBrZXlzKSJ9LHsibmFtZSI6ImFmIiwic2hvcnRfZGVzY3JpcHRpb24iOiJmYSIsImRlc2NyaXB0aW9uIjoiQWZnaGFuaSJ9LHsibmFtZSI6ImFmXHRwcyIsInNob3J0X2Rlc2NyaXB0aW9uIjoicHMiLCJkZXNjcmlwdGlvbiI6IlBhc2h0byJ9LHsibmFtZSI6ImFmXHR1eiIsInNob3J0X2Rlc2NyaXB0aW9uIjoidXoiLCJkZXNjcmlwdGlvbiI6IlV6YmVrIChBZmdoYW5pc3RhbikifSx7Im5hbWUiOiJhZlx0b2xwYy1wcyIsInNob3J0X2Rlc2NyaXB0aW9uIjoicHMiLCJkZXNjcmlwdGlvbiI6IlBhc2h0byAoQWZnaGFuaXN0YW4sIE9MUEMpIn0seyJuYW1lIjoiYWZcdGZhLW9scGMiLCJzaG9ydF9kZXNjcmlwdGlvbiI6ImZhIiwiZGVzY3JpcHRpb24iOiJQZXJzaWFuIChBZmdoYW5pc3RhbiwgRGFyaSBPTFBDKSJ9LHsibmFtZSI6ImFmXHR1ei1vbHBjIiwic2hvcnRfZGVzY3JpcHRpb24iOiJ1eiIsImRlc2NyaXB0aW9uIjoiVXpiZWsgKEFmZ2hhbmlzdGFuLCBPTFBDKSJ9LHsibmFtZSI6ImFyYSIsInNob3J0X2Rlc2NyaXB0aW9uIjoiYXIiLCJkZXNjcmlwdGlvbiI6IkFyYWJpYyJ9LHsibmFtZSI6ImFyYVx0YXplcnR5Iiwic2hvcnRfZGVzY3JpcHRpb24iOiIiLCJkZXNjcmlwdGlvbiI6IkFyYWJpYyAoYXplcnR5KSJ9LHsibmFtZSI6ImFyYVx0YXplcnR5X2RpZ2l0cyIsInNob3J0X2Rlc2NyaXB0aW9uIjoiIiwiZGVzY3JpcHRpb24iOiJBcmFiaWMgKGF6ZXJ0eS9kaWdpdHMpIn0seyJuYW1lIjoiYXJhXHRkaWdpdHMiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiQXJhYmljIChkaWdpdHMpIn0seyJuYW1lIjoiYXJhXHRxd2VydHkiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiQXJhYmljIChxd2VydHkpIn0seyJuYW1lIjoiYXJhXHRxd2VydHlfZGlnaXRzIiwic2hvcnRfZGVzY3JpcHRpb24iOiIiLCJkZXNjcmlwdGlvbiI6IkFyYWJpYyAocXdlcnR5L2RpZ2l0cykifSx7Im5hbWUiOiJhcmFcdGJ1Y2t3YWx0ZXIiLCJzaG9ydF9kZXNjcmlwdGlvbiI6IiIsImRlc2NyaXB0aW9uIjoiQXJhYmljIChCdWNrd2FsdGVyKSJ9LHsibmFtZSI6ImFsIiwic2hvcnRfZGVzY3JpcHRpb24iOiJzcSIsImRlc2NyaXB0aW9uIjoiQWxiYW5pYW4ifSx7Im5hbWUiOiJhbSIsInNob3J0X2Rlc2NyaXB0aW9uIjoiaHkiLCJkZXNjcmlwdGlvbiI6IkFybWVuaWFuIn0seyJuYW1lIjo
this.sessions = JSON.parse(atob("W3sibmFtZSI6IkxYREUiLCJrZXkiOiJMWERFIiwiY29tbWVudCI6IkxYREUgLSBMaWdodHdlaWdodCBYMTEgZGVza3RvcCBlbnZpcm9ubWVudCJ9LHsibmFtZSI6Ik9wZW5ib3giLCJrZXkiOiJvcGVuYm94IiwiY29tbWVudCI6IkxvZyBpbiB1c2luZyB0aGUgT3BlbmJveCB3aW5kb3cgbWFuYWdlciAod2l0aG91dCBhIHNlc3Npb24gbWFuYWdlcikifSx7Im5hbWUiOiJUV00iLCJrZXkiOiJ0d20iLCJjb21tZW50IjoiVGhlIFRhYiBXaW5kb3cgTWFuYWdlciJ9LHsibmFtZSI6IlRpbnl3bSIsImtleSI6InRpbnl3bSIsImNvbW1lbnQiOiJSaWRpY3Vsb3VzbHkgdGlueSB3aW5kb3cgbWFuYWdlciJ9XQ"));
this.language = this.languages[0].name;
this.layout = this.layouts[0].name;
this.default_session = this.sessions[0].name;
this.layout = this.layouts[0].name;
this.num_users = this.users.length;
if(typeof timeout === "number" && timeout > 0) {
2016-07-12 23:51:10 +02:00
if(typeof autoGuest === "boolean" && autoGuest) {
this.autologin_user = null;
this.autologin_guest = autoGuest;
}
this.autologin_user = this.users[0].name;
this.autologin_timeout = timeout * 1000;
setTimeout(function() {
2016-07-12 23:51:10 +02:00
if((typeof autoGuest === "boolean" && autoGuest) || this.autologin_user !== null)
window.autologin_timer_expired();
}.bind(this), this.timed_login_delay);
}
for(var i = 0; i <= this.users; i++) {
this.users[i].logged_in = Boolean(Math.floor(Math.random() * 2));
this.users[i].session = this.sessions[Math.floor((Math.random() * this.sessions.length))].name;
}
}
}
/**
* Deprecated method.
*/
2016-07-12 23:51:10 +02:00
LightDMMock.prototype.cancel_timed_login = function() {
window.logCall("cancel_timed_login", arguments);
2016-07-12 23:51:10 +02:00
window.deprecationNotifier("method", "lightdm.cancel_timed_login()", "lightdm.cancel_autologin()");
};
/**
* Cancels the authentication of the autologin user. The older function
* lightdm.cancel_timed_login() has been deprecated.
*/
LightDMMock.prototype.cancel_autologin = function() {
window.logCall("cancel_autologin", arguments);
window.checkArguments(arguments, 0, []);
this.autologin_user = null;
this.autologin_guest = false;
this.autologin_timeout = 0;
};
/**
* Deprecated method.
*/
2016-07-12 23:51:10 +02:00
LightDMMock.prototype.start_authentication = function() {
window.logCall("start_authentication", arguments);
2016-07-12 23:51:10 +02:00
window.deprecationNotifier("method", "lightdm.start_authentication()", "lightdm.authenticate(username)");
};
/**
* Specifies the username of the user we'd like to start authenticating as.
* Note that if you call lightdm.authenticate with no argument, LightDM
* (via PAM) will issue a show_prompt() call to ask for the username. The
* older function lightdm.start_authentication() has been deprecated.
*
* @param {String} username [username to authenticate]
*/
LightDMMock.prototype.authenticate = function(username) {
window.logCall("authenticate", arguments);
window.checkArguments(arguments, 1, ["string"]);
if(this.in_authentication) {
window.show_message("Already authenticating " + this.authentication_user, "error");
return;
}
var exists = false;
for(var i = 0; i <= this.users.length; i++) {
if(this.users.name === username)
exists = true;
}
if(!exists) {
window.show_message("Invalid username", "error");
return;
}
this.authentication_user = username;
this.in_authentication = true;
window.show_prompt("Password:", "password");
};
/**
* Authenticates as the guest user.
*/
LightDMMock.prototype.authenticate_as_guest = function() {
window.logCall("authenticate_as_guest", arguments);
window.checkArguments(arguments, 0, []);
if(!this.has_guest_account)
throw new IlligalUsageException("Guest accounts are turned off. Make sure you check the value of 'lightdm.has_guest_account' before calling this function.");
if(this.in_authentication) {
window.show_message("Already authenticating" + this.authentication_user, "error");
return;
}
this.authentication_user = "guest";
this.in_authentication = true;
};
/**
* When LightDM has prompted for input, provide the response to LightDM. The
* deprecated function was "provide_secret". This is still available for
* backwards compatibility, but authors of greeters should move
* to using lightdm.respond().
*
* @param {String} text [the response to the challange, usually a password]
*/
LightDMMock.prototype.respond = function(text) {
window.logCall("respond", arguments);
window.checkArguments(arguments, 1, ["string"]);
if(!this.in_authentication)
throw new IlligalUsageException("LightDM is currently not in the authentication phase. Make sure to call 'lightdm.authenticate(username)' before calling this function.");
if(text === "password") {
this.is_authenticated = true;
window.authentication_complete();
} else {
window.show_message("Invalid password", "error");
}
};
/**
* Deprecated method.
*/
2016-07-12 23:51:10 +02:00
LightDMMock.prototype.provide_secret = function() {
window.logCall("provide_secret", arguments);
2016-07-12 23:51:10 +02:00
window.deprecationNotifier("method", "lightdm.provide_secret(text)", "lightdm.respond(text)");
};
/**
* Cancels the authentication of any user currently in the
* process of authenticating.
*/
LightDMMock.prototype.cancel_authentication = function() {
window.logCall("cancel_authentication", arguments);
window.checkArguments(arguments, 0, []);
this.authentication_user = null;
this.in_authentication = false;
};
/**
* Suspends the system, if the greeter has the authority to do so.
*/
LightDMMock.prototype.suspend = function() {
window.logCall("suspend", arguments);
window.checkArguments(arguments, 0, []);
if(!this.can_suspend)
throw new IlligalUsageException("LightDM cannot suspend the system. Make sure you check the value of 'lightdm.can_suspend' before calling this function.");
window.alert("System suspended.");
document.location.reload(true);
};
/**
* Hibernates the system, if the greeter has the authority to do so.
*/
LightDMMock.prototype.hibernate = function() {
window.logCall("hibernate", arguments);
window.checkArguments(arguments, 0, []);
if(!this.can_hibernate)
throw new IlligalUsageException("LightDM cannot hibernate the system. Make sure you check the value of 'lightdm.can_hibernate' before calling this function.");
window.alert("System hibernated.");
document.location.reload(true);
};
/**
* Shuts down the system, if the greeter has the authority to do so.
*/
LightDMMock.prototype.shutdown = function() {
window.logCall("shutdown", arguments);
window.checkArguments(arguments, 0, []);
if(!this.can_shutdown)
throw new IlligalUsageException("LightDM cannot shut down the system. Make sure you check the value of 'lightdm.can_shutdown' before calling this function.");
window.alert("System shut down.");
document.location.reload(true);
};
/**
* Restarts the system, if the greeter has the authority to do so.
*/
LightDMMock.prototype.restart = function() {
window.logCall("restart", arguments);
window.checkArguments(arguments, 0, []);
if(!this.can_restart)
throw new IlligalUsageException("LightDM cannot restart the system. Make sure you check the value of 'lightdm.can_restart' before calling this function.");
window.alert("System restarted.");
document.location.reload(true);
};
/**
* Will set the language for the current LightDM session.
*
* @param {String} lang [the language to change to]
*/
LightDMMock.prototype.set_language = function(lang) {
window.logCall("set_language", arguments);
window.checkArguments(arguments, 1, ["string"]);
this.language = lang;
};
/**
* Deprecated method.
*/
2016-07-12 23:51:10 +02:00
LightDMMock.prototype.login = function() {
window.logCall("login", arguments);
2016-07-12 23:51:10 +02:00
window.deprecationNotifier("method", "lightdm.login()", "lightdm.start_session_sync(session)");
};
/**
* Once LightDM has successfully authenticated the user, start the user's
* session by calling this function. "session" is the authenticated user's
* session. If no session is passed, start the authenticated user with the
* system default session. The older function lightdm.login(user, session)
* has been deprecated.
*
* @param {String} session [the session name to start]
*/
LightDMMock.prototype.start_session_sync = function(session) {
window.logCall("start_session_sync", arguments);
window.checkArguments(arguments, 1, ["string"]);
if(!this.in_authentication)
throw new IlligalUsageException("LightDM is currently not in the authentication phase. Make sure to call 'lightdm.authenticate(username)' before calling this function.");
if(!this.is_authenticated)
throw new IlligalUsageException("LightDM has no authenticated users to log in. Make sure to call 'lightdm.respond()' before calling this function.");
window.alert("LightDM has started a " + session + " session for " + this.authentication_user);
};
/**
* Returns the value of a named hint provided by LightDM.
*
* @param {String} hint_name [name of the hint to show]
*/
LightDMMock.prototype.get_hint = function(hint_name) {
window.logCall("get_hint", arguments);
window.checkArguments(arguments, 1, ["string"]);
// @fixme: I have no clue how to simulate this...
};
/******************************************************************************
* Throwables *
*******************************************************************************/
/**
* Throwable IlligalUsageException
*
* @param {string} message [description of illigal usage]
*/
function IlligalUsageException(message) {
this.name = "IlligalUsageException";
this.message = message;
this.toString = function() {
return "[" + this.name + "] " + this.message;
};
}
/**
* Throwable DeprecationException
*
* @param {String} type [method||property]
2016-07-12 23:51:10 +02:00
* @param {String} depricated [deprecated method or property name]
* @param {String} alternative [alternative method or property to use]
*/
2016-07-12 23:51:10 +02:00
function DeprecationException(type, deprecated, alternative) {
this.name = "DeprecationException";
2016-07-12 23:51:10 +02:00
this.message = "The " + type + " '" + deprecated + "' is deprecated. Consider using '" + alternative + "' instead.";
this.toString = function() {
return "[" + this.name + "] " + this.message;
};
}
/**
* Throwable IncompatibleArgumentCountException
*
* @param {Number} expected [expected length of arguments]
* @param {Number} received [found length of arguments]
*/
function IncompatibleArgumentCountException(expected, received) {
this.name = "IncompatibleArgumentCountException";
this.message = "Incorrect number of arguments in function call. Expected " + expected + ", found " + received;
this.toString = function() {
return "[" + this.name + "] " + this.message;
};
}
/**
* Throwable IncompatibleArgumentTypesException
*
* @param {Number} type [argument number (non-zero)]
* @param {String} expected [expected type]
* @param {String} received [found type]
*/
function IncompatibleArgumentTypesException(number, expected, received) {
this.name = "IncompatibleArgumentTypesException";
this.message = "Argument " + number + " is of a wrong type. Expected '" + expected + "', found '" + received + "'";
this.toString = function() {
return "[" + this.name + "] " + this.message;
};
}
/******************************************************************************
* Helpers *
*******************************************************************************/
/**
* global helper deprecationNotifier
* throws ~balls~ errors at users who use deprecated methods and properties.
*
* @param {String} type [method||property]
2016-07-12 23:51:10 +02:00
* @param {String} depricated [deprecated method or property name]
* @param {String} alternative [alternative method or property to use]
*
* @throws {DeprecationException}
*/
2016-07-12 23:51:10 +02:00
window.deprecationNotifier = function(type, deprecated, alternative) {
throw new DeprecationException(type, deprecated, alternative);
};
/**
* global helper checkArguments
* throws ~tables~ errors at users who call methods
* with erroneous arguments.
*
* @param {Array} args [the arguments passed to the original method]
* @param {Number} length [the expected amount of arguments]
* @param {Arrray} types [the expected types of the arguments]
*
* @throws {IncompatibleArgumentTypesException}
*/
window.checkArguments = function(args, length, types) {
2016-07-13 00:09:51 +02:00
if(args.length !== length)
throw new IncompatibleArgumentCountException(length, args.length);
for(var i = 1; i <= types.length; i++) {
if(typeof args[i-1] !== types[i-1])
throw new IncompatibleArgumentTypesException(i, types[i-1], typeof args[i-1]);
}
};
2016-07-12 23:51:10 +02:00
/**
* global helper logCall
* logs a function call with the arguments provided to help with debugging a
* lightdm js script.
*
* @param {String} name [called function name]
* @param {Array} args [called function arguments]
*
* @return {window.console.info}
*/
window.logCall = function(name, args) {
var argv = [];
if(args !== undefined && args.length !== 0) {
for(var i = 0; i <= args.length; i++) {
if(args[i] !== undefined)
argv.push({type: typeof args[i], value: args[i]});
}
}
if(argv.length > 0)
return window.console.info("[lightdm." + name + "] called with " + argv.length + " argument(s)", argv);
return window.console.info("[lightdm." + name + "] called with 0 arguments");
};
2016-07-12 23:51:10 +02:00
/******************************************************************************
* Object.watch shim *
*******************************************************************************/
/*
* object.watch polyfill
*
* 2012-04-03
*
* By Eli Grey, http://eligrey.com
* Public Domain.
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
*/
// object.watch
if (!Object.prototype.watch) {
Object.defineProperty(Object.prototype, "watch", {
enumerable: false,
configurable: true,
writable: false,
value: function(prop, handler) {
var oldval = this[prop],
newval = oldval,
getter = function () {
return newval;
},
setter = function (val) {
oldval = newval;
newval = handler.call(this, prop, oldval, val);
return newval;
};
if(delete this[prop]) { // can't watch constants
Object.defineProperty(this, prop, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
2016-07-12 23:51:10 +02:00
}
});
2016-07-12 23:51:10 +02:00
}
// object.unwatch
2016-07-12 23:51:10 +02:00
if(!Object.prototype.unwatch) {
Object.defineProperty(Object.prototype, "unwatch", {
enumerable: false,
configurable: true,
writable: false,
value: function (prop) {
var val = this[prop];
delete this[prop]; // remove accessors
this[prop] = val;
}
});
2016-07-12 23:51:10 +02:00
}
LightDMMock.watch('default_language', function() {
window.deprecationNotifier("property", "default_language", "lightdm.language");
});
LightDMMock.watch('default_layout', function() {
window.deprecationNotifier("property", "default_layout", "lightdm.layout");
});
LightDMMock.watch('timed_login_user', function() {
window.deprecationNotifier("property", "timed_login_user", "lightdm.autologin_user");
});
LightDMMock.watch('timed_login_delay', function() {
window.deprecationNotifier("property", "timed_login_delay", "lightdm.autologin_timeout");
});