Tanoda
UserManager.cs
Go to the documentation of this file.
1using System;
2using System.Collections;
3using System.Collections.Generic;
4using System.IO;
5using System.Linq;
6using System.Runtime.Serialization.Formatters.Binary;
7using System.Security;
8using System.Security.Cryptography;
9using System.Text;
10using System.Threading;
11using GILES;
12using GILES.Interface;
13using NaughtyAttributes;
14using Newtonsoft.Json.Utilities;
15using UnityEngine;
17using UnityEngine.SceneManagement;
18using UnityEngine.UI;
20
21public class UserManager : pb_MonoBehaviourSingleton<UserManager>
22{
23 private readonly string szupertitkoskulcs = "nagyontitkosszuperkulcsalicenszellenorze";
24 private string hwid = "";
25
26 public bool useLicensing = true;
27 public bool useNetworkManager = true;
28
29 [Header("Dev")]
30 public bool useAutoLogin = true;
31 public bool useAutoCourseLoad = true;
32
33 [Header("License")]
34 public InputField inputHwid;
35 public GameObject licenseWindow;
36
37 [Header("Add new User")]
38 public GameObject addUserWindow;
39 public InputField inputUsername;
40 public InputField inputPW;
41 public InputField inputPW2;
42 public Dropdown dropdownUserType;
43 public GameObject cancelButton;
44
45 [Header("Login")]
46 public InputField loginUsername;
47 public InputField loginPW;
48 public GameObject loginWindow;
49 public InputField qrField;
50 public Dropdown dropdownCourseType;
51
52 [Header("Network Training")]
54
55 [Header("Main Menu")]
56 public GameObject mainMenuWindow;
57 public GameObject accessDenied;
58 public GameObject newCourseWindow;
59 public GameObject flags;
60
61
62 [Header("Manage Users")]
63 public RectTransform scrollViewContent;
64 public GameObject userListPrefab;
65
66 [Header("Manage Curses")]
67 public RectTransform scrollViewContentCurse;
68 public GameObject curseListPrefab;
69
70 [Header("Events")]
71 public UnityEvent OnLicenseNotFound;
73
74 private int userHelper = 2;
75 internal List<User> users = new List<User>();
76 private bool loggingIn = false;
77 private bool ok = false;
78 private string dbPath;
79 private object threadLock = new object();
80
81
82 private void Start()
83 {
84 if (!ok)
85 {
86 DontDestroyOnLoad(this);
87 SceneManager.sceneLoaded += SceneManager_sceneLoaded;
88 ok = true;
89 }
90 var player = GameObject.Find("Player");
91 if (player)
92 {
93 Destroy(player);
94 }
95 dbPath = Path.Combine(Application.persistentDataPath, "Database.bin");
96#if DANA
97 useNetworkManager = false;
98#endif
99 hwid = SystemInfo.deviceUniqueIdentifier;
100 inputHwid.text = hwid;
101 var noLicense = false;
103 {
104 if (!SavedUser.instance.wsUser.HasValue)
105 {
106 var token = HttpCookie.GetCookie("token");
107 var userId = HttpCookie.GetCookie("userId");
108 var courseId = HttpCookie.GetCookie("courseId");
109 var typeId = HttpCookie.GetCookie("courseModulTypeId");
110#if UNITY_EDITOR
111 if (useAutoLogin)
112 {
113 token = "Bearer%20eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEsImlhdCI6MTYyNTAzMTQzMywiZXhwIjoxNjU2NTY3NDMzfQ.Vvf7zxXjhhjDd-ZuCwBnvJavMOC6-9pI2kGnOWTMsVo";
114 userId = "1";
115 }
117 {
118 courseId = "86";
119 typeId = "1";
120 }
121 else
122 courseId = "null";
123#endif
124
125 if (courseId.Contains("null"))
126 courseId = null;
127
128 if (typeId.Contains("null"))
129 typeId = null;
130
131 Debug.Log($"token: {token}");
132 Debug.Log($"userId: {userId}");
133 Debug.Log($"courseId: {courseId}");
134 Debug.Log($"typeId: {typeId}");
135
136 if (!string.IsNullOrEmpty(token) && !string.IsNullOrEmpty(userId))
137 {
138 var canvas = GameObject.Find("Canvas");
139 canvas.SetActive(false);
140 var id = Convert.ToInt32(userId);
141 NetworkManager.instance.SaveToken(token);
142 StartCoroutine(NetworkManager.instance.GetUserById(id, user =>
143 {
144
145 SavedUser.instance.wsUser = user;
146 if (!string.IsNullOrEmpty(courseId))
147 {
148 SavedUser.instance.wsActions.setsCourseID(Convert.ToInt32(courseId));
149 switch (typeId)
150 {
151 default:
152 case "1":
153 SavedUser.instance.courseType = CourseType.Normal;
154 StartCoroutine(NetworkManager.instance.GetMyCurses(courses =>
155 {
156 var go = new GameObject("loader_network");
157 var ssol = go.AddComponent<StartStageOnLoad>();
158 ssol.stageJson = NetworkManager.instance.GetDataFromIdInCache(courseId);
159
160 pb_ModalWindow.Hide();
161
162 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
163 }));
164 break;
165 case "2":
166 SavedUser.instance.courseType = CourseType.Quality;
167 StartCoroutine(NetworkManager.instance.GetQualityMyCurses(courses =>
168 {
169 var go = new GameObject("loader_network");
170 var ssol = go.AddComponent<StartStageOnLoad>();
171 ssol.stageJson = NetworkManager.instance.GetDataFromIdInCache(courseId);
172
173 pb_ModalWindow.Hide();
174
175 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
176 }));
177 break;
178 case "3":
179 SavedUser.instance.courseType = CourseType.Dobot;
180 StartCoroutine(NetworkManager.instance.GetDobotMyCurses(courses =>
181 {
182 var go = new GameObject("loader_network");
183 var ssol = go.AddComponent<StartStageOnLoad>();
184 ssol.stageJson = NetworkManager.instance.GetDataFromIdInCache(courseId);
185
186
187 pb_ModalWindow.Hide();
188
189 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
190 }));
191 break;
192 }
193 }
194 else
195 {
196 canvas.SetActive(true);
197 newCourseWindow.SetActive(true);
198#if UNITY_EDITOR
199 if (!useAutoCourseLoad)
200 {
201 OnNetworkLogin.Invoke();
202 fileDialog.SetDirectory(Path.Combine(Application.streamingAssetsPath, "trainings"));
203 fileDialog.isFileBrowser = true;
204 }
205#endif
206 }
207 }, s =>
208 {
209 Debug.LogError("GetUserById failed!");
210 canvas.SetActive(true);
211 loginWindow.SetActive(true);
212 }));
213 return;
214 }
215 else
216 {
217 Debug.LogError("Couldn't get user from cookie! Falling back to Login window.");
218 }
219 }
220
221 loginWindow.SetActive(true);
222 }
223 else
224 {
225 if (useLicensing) //easiest bypass in the west
226 {
227 if (!File.Exists(Path.Combine(Application.persistentDataPath, "License.bin")))
228 {
229 OnLicenseNotFound.Invoke();
230 noLicense = true;
231 }
232 else
233 {
234 var lic = File.ReadAllBytes(Path.Combine(Application.persistentDataPath, "License.bin"));
235 var xor = Encoding.ASCII.GetBytes(szupertitkoskulcs);
236 var bytehwid = Encoding.ASCII.GetBytes(hwid);
237 try
238 {
239 var lic2 = XorArrays(xor, bytehwid);
240 if (!ByteArrayCompare(lic, lic2))
241 {
242 OnInvalidLicense.Invoke();
243 noLicense = true;
244 }
245 }
246 catch (Exception)
247 {
248 OnInvalidLicense.Invoke();
249 noLicense = true;
250 }
251 }
252 }
253
254 if (!noLicense)
255 if (!File.Exists(Path.Combine(Application.persistentDataPath, "Database.bin")))
256 {
257 AddFirstAdmin();
258 addUserWindow.SetActive(true);
259 OnUserDatabaseNotFound.Invoke();
260 }
261 else
262 {
263 var bf = new BinaryFormatter();
264 var file = File.Open(Path.Combine(Application.persistentDataPath, "Database.bin"), FileMode.Open);
265 users = (List<User>) bf.Deserialize(file);
266 file.Flush();
267 file.Close();
268 file.Dispose();
269 loginWindow.SetActive(true);
270 }
271 }
272 if (flags)
273 flags?.SetActive(true);
274 PopulateUserList();
275
276 if (useNetworkManager)
277 {
278 if (SavedUser.instance.wsUser.HasValue)
279 {
280 loginWindow.SetActive(false);
281 loginPW.text = "AktĂ­v";
282 OnNetworkLogin.Invoke();
283 fileDialog.SetDirectory(Path.Combine(Application.streamingAssetsPath, "trainings"));
284 fileDialog.isFileBrowser = true;
285 return;
286 }
287 }
288
289 if (SavedUser.instance.currentUser.HasValue)
290 {
291 OnLoginSuccessful.Invoke();
292 if (SavedUser.instance.currentUser.Value.Access == UserType.User)
293 {
294 OnLimitedUserLogin.Invoke();
295 }
296 else
297 {
298 OnMainteinerLogin.Invoke();
299 }
300 }
301 }
302
303 private void OnDestroy()
304 {
305 SceneManager.sceneLoaded -= SceneManager_sceneLoaded;
306 }
307
308 private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
309 {
310 if (arg0.buildIndex != 0)
311 {
312 SceneManager.MoveGameObjectToScene(gameObject, SceneManager.GetActiveScene());
313 }
314 }
315
316 private IEnumerator DelayedAction(float delay, Action action)
317 {
318 yield return new WaitForSeconds(delay);
319 action();
320 }
321
322 private void PopulateUserList()
323 {
324 for (int i = 1; i < userListPrefab.transform.parent.childCount; i++)
325 {
326 Destroy(userListPrefab.transform.parent.GetChild(i).gameObject);
327 }
328 foreach (var user in users)
329 {
330 var newgo = Instantiate(userListPrefab, userListPrefab.transform.parent);
331 newgo.transform.GetChild(1).GetComponent<Text>().text = user.Username;
332 var usertype = ""; // igen, lehetne switch is...
333 usertype = user.Access == UserType.Admin ? "USERTYPE_ADMIN" : "";
334 if (usertype == "")
335 usertype = user.Access == UserType.Maintainer ? "USERTYPE_MAINTAINER" : "";
336 if (usertype == "")
337 usertype = user.Access == UserType.User ? "USERTYPE_USER" : "";
338 usertype = Localization_SOURCE.Instance.TranslateText(usertype);
339 newgo.transform.GetChild(2).GetComponent<Text>().text = usertype;
340 newgo.SetActive(true);
341 }
342 scrollViewContent.sizeDelta = new Vector2(scrollViewContent.sizeDelta.x, users.Count * 31);
343 }
344
345 internal void PopulateCurseList(UserManager.User user)
346 {
347 if (scrollViewContentCurse == null)
348 {
349#if !UNITY_WEBGL
350 Debug.LogWarning("scrollViewContentCurse is null");
351#endif
352 return;
353 }
354 for (int i = 1; i < scrollViewContentCurse.childCount; i++)
355 {
356 Destroy(scrollViewContentCurse.GetChild(i).gameObject);
357 }
358 foreach (var training in user.addedTrainings)
359 {
360 var newgo = Instantiate(curseListPrefab, scrollViewContentCurse);
361 newgo.GetComponent<CurseDataField>().curseName.text = training.TrainingName;
362 newgo.GetComponent<CurseDataField>().status.text = training.Status;
363 newgo.GetComponent<CurseDataField>().creationDate.text = training.CreationDate.ToString("yyyy/MM/dd");
364 newgo.GetComponent<CurseDataField>().modificationDate.text = training.ModificationDate.ToString("yyyy/MM/dd");
365
366 newgo.SetActive(true);
367 }
368 scrollViewContentCurse.sizeDelta = new Vector2(scrollViewContentCurse.sizeDelta.x, users.Count * 61);
369 }
370
372 {
373 for (int i = 1; i < userListPrefab.transform.parent.childCount; i++)
374 {
375 if (userListPrefab.transform.parent.GetChild(i).GetChild(0).GetComponent<Toggle>().isOn)
376 {
377 var username = userListPrefab.transform.parent.GetChild(i).GetChild(1).GetComponent<Text>().text;
378
379 if (TryRemoveUser(username))
380 {
381 Destroy(userListPrefab.transform.parent.GetChild(i).gameObject);
382 }
383 }
384 }
385 SaveDB();
386 }
387
389 {
390 var GO = GameObject.FindObjectsOfType<SaveSelectedUser>(true);
391 var selectedUser = GO[0].selectedUser;
392 for (int i = 1; i < scrollViewContentCurse.childCount; i++)
393 {
394 if (scrollViewContentCurse.GetChild(i).GetChild(1).GetComponent<Toggle>().isOn)
395 {
396 var training = scrollViewContentCurse.GetChild(i).GetChild(0).GetComponentInChildren<Text>().text;
397
398 if (TryRemoveCurse(training, selectedUser))
399 {
400 Destroy(scrollViewContentCurse.GetChild(i).gameObject);
401 }
402 }
403 }
404 SaveDB();
405 }
406
408 {
409 if (!File.Exists(Path.Combine(Application.persistentDataPath, "Database.bin")))
410 {
411 AddFirstAdmin();
412 addUserWindow.SetActive(true);
413 OnUserDatabaseNotFound.Invoke();
414 }
415 else
416 {
417 var bf = new BinaryFormatter();
418 var file = File.Open(Path.Combine(Application.persistentDataPath, "Database.bin"), FileMode.Open);
419 users = (List<User>) bf.Deserialize(file);
420 file.Flush();
421 file.Close();
422 file.Dispose();
423 loginWindow.SetActive(true);
424 }
425 }
426
427 public bool CheckLicense(byte[] lic)
428 {
429 var xor = Encoding.ASCII.GetBytes(szupertitkoskulcs);
430 var bytehwid = Encoding.ASCII.GetBytes(hwid);
431 try
432 {
433 var lic2 = XorArrays(xor, bytehwid);
434 if (!ByteArrayCompare(lic, lic2)) return false;
435 }
436 catch (Exception)
437 {
438 PopupManager.instance.ShowPopup("UNKNOWN_ERROR", "UNKNOWN_LICENSE_ERROR_TEXT");
439 return false;
440 }
441
442 return true;
443 }
444
445 public void OnPwEndEdit()
446 {
447 if (!loggingIn && Input.GetKey(KeyCode.Return))
448 {
449 Login();
450 }
451 }
452
453 public void Login()
454 {
455 if (loginPW.text == "" && (qrField && qrField.text == ""))
456 return;
457
458 loggingIn = true;
459 if (useNetworkManager)
460 {
461 if (qrField && qrField.text != "")
462 {
463 StartCoroutine(NetworkManager.instance.LoginWithQR(qrField.text, login =>
464 {
465 OnNetworkLogin.Invoke();
466 //fileDialog.SetDirectory(Path.Combine(Application.streamingAssetsPath, "trainings"));
467 //fileDialog.isFileBrowser = true;
468
469 SavedUser.instance.wsUser = login.user;
470 loggingIn = false;
471
473 //NetworkManager.instance.SetAdminToken();
475
476 if (login.isQuality || login.courseModuleType.id == 2)
477 {
478 StartCoroutine(NetworkManager.instance.GetQualityMyCurses(courses =>
479 {
480 var go = new GameObject("loader_network");
481 var ssol = go.AddComponent<StartStageOnLoad>();
482 ssol.stageJson = NetworkManager.instance.GetDataFromIdInCache(login.courseId);
483 SavedUser.instance.wsActions.setsCourseID(Convert.ToInt32(login.courseId));
484 pb_ModalWindow.Hide();
485 if (NetworkManager.instance.GetCourseFromIdInCache(login.courseId).isQuality)
486 {
487 SavedUser.instance.courseType = CourseType.Quality;
488 Debug.Log("isQuality is true b4 loading");
489 }
490
491 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
492 }));
493 }
494 else
495 {
496 if (login.courseModuleType.id == 1)
497 {
498 SavedUser.instance.courseType = CourseType.Normal;
499 StartCoroutine(NetworkManager.instance.GetMyCurses(courses =>
500 {
501 var go = new GameObject("loader_network");
502 var ssol = go.AddComponent<StartStageOnLoad>();
503 ssol.stageJson = NetworkManager.instance.GetDataFromIdInCache(login.courseId);
504 SavedUser.instance.wsActions.setsCourseID(Convert.ToInt32(login.courseId));
505 pb_ModalWindow.Hide();
506 if (NetworkManager.instance.GetCourseFromIdInCache(login.courseId).isQuality)
507 {
508 SavedUser.instance.courseType = CourseType.Quality;
509 Debug.Log("isQuality is true b4 loading");
510 }
511
512 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
513 }));
514 }
515 else if (login.courseModuleType.id == 3)
516 {
517 SavedUser.instance.courseType = CourseType.Dobot;
518 StartCoroutine(NetworkManager.instance.GetDobotMyCurses(courses =>
519 {
520 var go = new GameObject("loader_network");
521 var ssol = go.AddComponent<StartStageOnLoad>();
522 ssol.stageJson = NetworkManager.instance.GetDataFromIdInCache(login.courseId);
523 SavedUser.instance.wsActions.setsCourseID(Convert.ToInt32(login.courseId));
524 pb_ModalWindow.Hide();
525 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
526 }));
527 }
528 }
529
530
531
532 }, s =>
533 {
534 PopupManager.instance.ShowPopup("LOGON_FAILED", s);
535 loggingIn = false;
536 }));
537 return;
538 }
539 StartCoroutine(NetworkManager.instance.Login(loginUsername.text, loginPW.text, login =>
540 {
541 loginPW.text = "";
542#if UNITY_WEBGL
543 if (login.user.groupId == UserType.User)
544 {
545 accessDenied.SetActive(true);
546 return;
547 }
548#endif
549 OnNetworkLogin.Invoke();
550 fileDialog.manualLogonCourseType = (CourseType)dropdownCourseType.value;
551 fileDialog.SetDirectory(Path.Combine(Application.streamingAssetsPath, "trainings"));
552 fileDialog.isFileBrowser = true;
553
554 SavedUser.instance.wsUser = login.user;
555 SavedUser.instance.courseType = (CourseType)dropdownCourseType.value;
556 loggingIn = false;
557 }, s =>
558 {
559 PopupManager.instance.ShowPopup("LOGON_FAILED", s);
560 loggingIn = false;
561 }));
562 return;
563 }
564 else
565 {
566 var username = loginUsername.text;
567 foreach (var user in users)
568 if (user.Username == username)
569 {
570 if (user.PasswordHash == SHA256(loginPW.text))
571 {
572 SavedUser.instance.currentUser = user;
573 loginPW.text = "";
574 OnLoginSuccessful.Invoke();
575 if (user.Access == UserType.User)
576 OnLimitedUserLogin.Invoke();
577 else
578 OnMainteinerLogin.Invoke();
579 loggingIn = false;
580 return;
581 }
582
583 break;
584 }
585 }
586
587 loginPW.text = "";
588 PopupManager.instance.ShowPopup("LOGON_FAILED", "LOGON_FAILED_TEXT");
589 loggingIn = false;
590 }
591
592 public void Logout()
593 {
594 SavedUser.instance.currentUser = null;
595 OnLogout.Invoke();
596 }
597
598 private void AddFirstAdmin()
599 {
600 dropdownUserType.ClearOptions();
601 dropdownUserType.AddOptions(new List<Dropdown.OptionData> {new Dropdown.OptionData("Admin")});
602 dropdownUserType.value = 0;
603 dropdownUserType.enabled = false;
604 userHelper = (int)UserType.Admin;
605 cancelButton.SetActive(false);
606 }
607
608 private void RevertToNormalUsers()
609 {
610 dropdownUserType.ClearOptions();
611 dropdownUserType.AddOptions(new List<Dropdown.OptionData>
612 {
613 new Dropdown.OptionData(Localization_SOURCE.Instance.TranslateText("USERTYPE_MAINTAINER")),
614 new Dropdown.OptionData(Localization_SOURCE.Instance.TranslateText("USERTYPE_USER"))
615 });
616 dropdownUserType.value = 1;
617 dropdownUserType.enabled = true;
618 userHelper = (int)UserType.Maintainer;
619 cancelButton.SetActive(true);
620 }
621
622 private bool TryRemoveUser(string username)
623 {
624 for (int i = 0; i < users.Count; i++)
625 {
626 if (users[i].Username == username && users[i].Access != UserType.Admin)
627 {
628 users.RemoveAt(i);
629 PopulateUserList();
630 return true;
631 }
632 }
633
634 return false;
635 }
636
637 private bool TryRemoveCurse(string cursename, User selectedUser)
638 {
639 for (int i = 0; i < selectedUser.addedTrainings.Count; i++)
640 {
641 if (selectedUser.addedTrainings[i].TrainingName == cursename)
642 {
643 selectedUser.addedTrainings.RemoveAt(i);
644 PopulateCurseList(selectedUser);
645 return true;
646 }
647 }
648
649 return false;
650 }
651
652 public void TryAddUser()
653 {
654 var username = inputUsername.text;
655 if (useNetworkManager)
656 {
657 StartCoroutine(NetworkManager.instance.AddUser(username, "TODO", 3, user => { Debug.Log("user add success"); }));
658 return;
659 }
660 if (!UsernameAvailable(username))
661 {
662 PopupManager.instance.ShowPopup("USERNAME_NOT_AVAILABLE", "USERNAME_NOT_AVAILABLE_TEXT");
663 return;
664 }
665
666 if (inputPW.text != inputPW2.text)
667 {
668 PopupManager.instance.ShowPopup("PASSWORS_DONT_MATCH", "PASSWORS_DONT_MATCH_TEXT");
669 return;
670 }
671
672 if (inputPW.text.Length == 0)
673 {
674 PopupManager.instance.ShowPopup("PASSWORD_EMPTY", "PASSWORD_EMPTY_TEXT");
675 return;
676 }
677
678 var adduser = new User
679 {
680 Username = username,
681 PasswordHash = SHA256(inputPW.text),
682 Access = (UserType) dropdownUserType.value + userHelper
683 };
684
685 users.Add(adduser);
686
687 inputUsername.text = "";
688 inputPW.text = "";
689 inputPW2.text = "";
690
691 RevertToNormalUsers();
692 addUserWindow.SetActive(false);
693 SaveDB();
694 if (SavedUser.instance.currentUser == null)
695 {
696 loginWindow.SetActive(true);
697 }
698
699 PopulateUserList();
700 }
701
702 public void UpdateUser(User value)
703 {
704 if (SavedUser.instance.currentUser.HasValue && SavedUser.instance.currentUser.Value.Username == value.Username)
705 {
706 SavedUser.instance.currentUser = value;
707 var wrm = FindObjectOfType<WaitingRoomManager>();
708 if (wrm)
709 {
710 wrm.Start();
711 }
712 }
713 users[users.IndexOf(x => x.Username == value.Username)] = value;
714 SaveDB();
715 }
716
717 public void CancelUserInput()
718 {
719 inputUsername.text = "";
720 inputPW.text = "";
721 inputPW2.text = "";
722 dropdownUserType.value = 1;
723 }
724
725 private void SaveDB()
726 {
727
728 new Thread(SaveThread).Start();
729 }
730
731 private void SaveThread()
732 {
733 var bf = new BinaryFormatter();
734 lock (threadLock)
735 {
736 var file = File.Open(dbPath, FileMode.Create);
737 bf.Serialize(file, users);
738 file.Flush();
739 file.Close();
740 file.Dispose();
741 }
742
743 }
744
745 private bool UsernameAvailable(string username)
746 {
747 foreach (var user in users)
748 if (user.Username == username)
749 return false;
750 return true;
751 }
752
753 private bool ByteArrayCompare(byte[] a1, byte[] a2)
754 {
755 if (a1.Length != a2.Length)
756 return false;
757
758 for (var i = 0; i < a1.Length; i++)
759 if (a1[i] != a2[i])
760 return false;
761
762 return true;
763 }
764
765 private byte[] XorArrays(byte[] key, byte[] PAN)
766 {
767 if (key.Length == PAN.Length)
768 {
769 var result = new byte[key.Length];
770 for (var i = 0; i < key.Length; i++) result[i] = (byte) (key[i] ^ PAN[i]);
771 return result;
772 }
773
774 throw new ArgumentException();
775 }
776
777 public User GetUserByName(string username)
778 {
779 return users.FirstOrDefault(x => x.Username == username);
780 }
781
782 private string SHA256(string str)
783 {
784 var crypt = new SHA256Managed();
785 var hash = new StringBuilder();
786 var crypto = crypt.ComputeHash(Encoding.UTF8.GetBytes(str), 0, Encoding.UTF8.GetByteCount(str));
787 foreach (var bit in crypto) hash.Append(bit.ToString("x2"));
788 return hash.ToString().ToLower();
789 }
790
791 public void SetTutorial(bool value)
792 {
793 SavedUser.instance.isTutorial = value;
794 }
795
796
797 public void SetEditor(bool value)
798 {
799 SavedUser.instance.isEditor = value;
800 }
801
802 public void SetMode(int value)
803 {
804 SavedUser.instance.TrainingType = (int)value;
805 }
806
807 [Serializable]
808 public enum UserType : int
809 {
810 Admin = 1,
811 Maintainer,
812 User
813 }
814
815 [Serializable]
816 public struct User
817 {
818 public string Username;
819 public string PasswordHash;
821 public List<Training> trainings;
822 public List<AddedTrainings> addedTrainings;
823 }
824
825 [Serializable]
826 public struct Quiz
827 {
828 public string Name;
829 public float Time;
830 public bool Success;
831 }
832
833 [Serializable]
834 public struct VRAction
835 {
836 public float timeSpent;
837 public float timeRecognition;
838 public string actionType;
839 public float penaltyTime;
840 public string actionName;
841 public float taktTime;
842 }
843
844 [Serializable]
845 public struct Training
846 {
847 public int Type; // 0: training, 1: exam
848 public string Username;
849 public string Name; // name of JSON
850 public DateTime Date;
851 public float Time; // time of the run
852 public bool Success; // finished in time
853 //public float HandTrackingPercent;
854 public List<VRAction> Actions;
855 public List<Quiz> Quizzes;
856
857 // { "Type":0, "Name":"tolltarto.json", "Time":123, "Success":true }
858 }
859
860 [Serializable]
861 public struct AddedTrainings
862 {
863 public string TrainingName;
864 public string Status;
865 public DateTime CreationDate;
866 public DateTime ModificationDate;
867
868 }
869
870 [Serializable]
871 public struct WSGroup
872 {
873 public UserType id;
874 public string name;
875 }
876
877 [Serializable]
878 public struct WSUsers
879 {
880 public WSUser[] users;
881 }
882
883 [Serializable]
884 public struct WSUser
885 {
886 public int id;
887 public string email;
888 public string name;
889 public string birthName;
890 public string genderIdentity;
893 public ulong workStartDate;
894 public int jobGroup;
895 public bool isActive;
896 public string qrCode;
897 public ulong created;
898 public ulong modified;
899 }
900
901 [Serializable]
902 public struct WSLogin
903 {
904 public WSUser user;
905 public string courseId;
906 public string userCourseId;
907 public string accessToken;
908 public bool isQuality;
910 }
911
912 [Serializable]
913 public struct WSActions
914 {
915 public void setsCourseID(int x)
916 {
917 Debug.Log("Setting courseID: " + x);
918 courseId = x;
919 }
920
921 public string ActionsToArray()
922 {
923 var retval = "[[";
924
925 foreach (var item in savedActions)
926 {
927 retval += "{\"actionComment\":\"" + item.actionComment + "\",\"tactTimeTarget\":" + Macro.NormalizeFraction(item.tactTimeTarget.ToString(), '.') + ",\"tactTimeCurrent\":" + Macro.NormalizeFraction(item.tactTimeCurrent.ToString(), '.') + "},";
928 }
929
930 return retval.Remove(retval.Length - 1) + "]]";
931 }
932
933 public int courseId;
934 public int userId;
935 public List<WSAction> savedActions;
936 }
937
938 [Serializable]
939 public struct WSAction
940 {
941 public string actionComment;
942 public float tactTimeTarget;
943 public float tactTimeCurrent;
944 }
945
946 [Serializable]
947 public struct CourseModuleType
948 {
949 public int id;
950 public string name;
951 }
952
953
954
955#if UNITY_EDITOR
956 [Button]
957 public void GenerateLicense()
958 {
959 var xor = Encoding.ASCII.GetBytes(szupertitkoskulcs);
960 var bytehwid = Encoding.ASCII.GetBytes(hwid);
961 File.WriteAllBytes(Path.Combine(Application.persistentDataPath, "License.bin"), XorArrays(xor, bytehwid));
962 Debug.Log(Path.Combine(Application.persistentDataPath, "License.bin"));
963 }
964
965 public void GenerateLicense(string id)
966 {
967 var xor = Encoding.ASCII.GetBytes(szupertitkoskulcs);
968 var bytehwid = Encoding.ASCII.GetBytes(id);
969 File.WriteAllBytes(Path.Combine(Application.streamingAssetsPath, $"License_{id}.bin"), XorArrays(xor, bytehwid));
970 }
971#endif
972}
System.IO.FileMode FileMode
Definition: AssetLoader.cs:14
UnityEngine.UI.Button Button
Definition: Pointer.cs:7
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
void SetDirectory(string directory)
string TranslateText(string key)
static Localization_SOURCE Instance
Definition: Macro.cs:12
static string NormalizeFraction(string value)
Definition: Macro.cs:164
UserManager.User selectedUser
bool useAutoCourseLoad
Definition: UserManager.cs:31
InputField loginPW
Definition: UserManager.cs:47
InputField qrField
Definition: UserManager.cs:49
void UpdateUser(User value)
Definition: UserManager.cs:702
void DeleteSelectedTraining()
Definition: UserManager.cs:388
UnityEvent OnLimitedUserLogin
Definition: UserManager.cs:72
GameObject curseListPrefab
Definition: UserManager.cs:68
pb_FileDialog fileDialog
Definition: UserManager.cs:53
GameObject mainMenuWindow
Definition: UserManager.cs:56
User GetUserByName(string username)
Definition: UserManager.cs:777
void SetTutorial(bool value)
Definition: UserManager.cs:791
bool useAutoLogin
Definition: UserManager.cs:30
bool useLicensing
Definition: UserManager.cs:26
UnityEvent OnLicenseNotFound
Definition: UserManager.cs:71
GameObject newCourseWindow
Definition: UserManager.cs:58
void SetMode(int value)
Definition: UserManager.cs:802
GameObject accessDenied
Definition: UserManager.cs:57
UnityEvent OnMainteinerLogin
Definition: UserManager.cs:72
InputField inputHwid
Definition: UserManager.cs:34
UnityEvent OnUserDatabaseNotFound
Definition: UserManager.cs:72
GameObject licenseWindow
Definition: UserManager.cs:35
void Login()
Definition: UserManager.cs:453
GameObject userListPrefab
Definition: UserManager.cs:64
InputField inputPW2
Definition: UserManager.cs:41
RectTransform scrollViewContent
Definition: UserManager.cs:63
GameObject cancelButton
Definition: UserManager.cs:43
void DeleteSelectedUsers()
Definition: UserManager.cs:371
bool useNetworkManager
Definition: UserManager.cs:27
void CancelUserInput()
Definition: UserManager.cs:717
UnityEvent OnLoginSuccessful
Definition: UserManager.cs:72
GameObject loginWindow
Definition: UserManager.cs:48
Dropdown dropdownUserType
Definition: UserManager.cs:42
GameObject addUserWindow
Definition: UserManager.cs:38
UnityEvent OnNetworkLogin
Definition: UserManager.cs:72
void TryAddUser()
Definition: UserManager.cs:652
InputField inputPW
Definition: UserManager.cs:40
InputField inputUsername
Definition: UserManager.cs:39
void Logout()
Definition: UserManager.cs:592
GameObject flags
Definition: UserManager.cs:59
UnityEvent OnLogout
Definition: UserManager.cs:72
void SetEditor(bool value)
Definition: UserManager.cs:797
RectTransform scrollViewContentCurse
Definition: UserManager.cs:67
void AfterSuccessfulLicenseCheck()
Definition: UserManager.cs:407
UnityEvent OnInvalidLicense
Definition: UserManager.cs:72
Dropdown dropdownCourseType
Definition: UserManager.cs:50
bool CheckLicense(byte[] lic)
Definition: UserManager.cs:427
InputField loginUsername
Definition: UserManager.cs:46
void OnPwEndEdit()
Definition: UserManager.cs:445
SavedUser.CourseType CourseType
Definition: pb_FileDialog.cs:8
List< Quiz > Quizzes
Definition: UserManager.cs:855
List< VRAction > Actions
Definition: UserManager.cs:854
List< AddedTrainings > addedTrainings
Definition: UserManager.cs:822
List< Training > trainings
Definition: UserManager.cs:821
void setsCourseID(int x)
Definition: UserManager.cs:915
List< WSAction > savedActions
Definition: UserManager.cs:935
CourseModuleType courseModuleType
Definition: UserManager.cs:909