2using System.Collections;
3using System.Collections.Generic;
6using System.Runtime.Serialization.Formatters.Binary;
8using System.Security.Cryptography;
10using System.Threading;
13using NaughtyAttributes;
14using Newtonsoft.Json.Utilities;
23 private readonly
string szupertitkoskulcs =
"nagyontitkosszuperkulcsalicenszellenorze";
24 private string hwid =
"";
37 [Header(
"Add new User")]
52 [Header(
"Network Training")]
62 [Header(
"Manage Users")]
66 [Header(
"Manage Curses")]
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();
86 DontDestroyOnLoad(
this);
87 SceneManager.sceneLoaded += SceneManager_sceneLoaded;
90 var player = GameObject.Find(
"Player");
95 dbPath = Path.Combine(Application.persistentDataPath,
"Database.bin");
99 hwid = SystemInfo.deviceUniqueIdentifier;
101 var noLicense =
false;
106 var token = HttpCookie.GetCookie(
"token");
107 var userId = HttpCookie.GetCookie(
"userId");
108 var courseId = HttpCookie.GetCookie(
"courseId");
109 var typeId = HttpCookie.GetCookie(
"courseModulTypeId");
113 token =
"Bearer%20eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEsImlhdCI6MTYyNTAzMTQzMywiZXhwIjoxNjU2NTY3NDMzfQ.Vvf7zxXjhhjDd-ZuCwBnvJavMOC6-9pI2kGnOWTMsVo";
125 if (courseId.Contains(
"null"))
128 if (typeId.Contains(
"null"))
131 Debug.Log($
"token: {token}");
132 Debug.Log($
"userId: {userId}");
133 Debug.Log($
"courseId: {courseId}");
134 Debug.Log($
"typeId: {typeId}");
136 if (!
string.IsNullOrEmpty(token) && !
string.IsNullOrEmpty(userId))
138 var canvas = GameObject.Find(
"Canvas");
139 canvas.SetActive(
false);
140 var
id = Convert.ToInt32(userId);
145 SavedUser.instance.wsUser = user;
146 if (!string.IsNullOrEmpty(courseId))
148 SavedUser.instance.wsActions.setsCourseID(Convert.ToInt32(courseId));
153 SavedUser.instance.courseType = CourseType.Normal;
154 StartCoroutine(NetworkManager.instance.GetMyCurses(courses =>
156 var go = new GameObject(
"loader_network");
157 var ssol = go.AddComponent<StartStageOnLoad>();
158 ssol.stageJson = NetworkManager.instance.GetDataFromIdInCache(courseId);
160 pb_ModalWindow.Hide();
162 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
166 SavedUser.instance.courseType = CourseType.Quality;
167 StartCoroutine(NetworkManager.instance.GetQualityMyCurses(courses =>
169 var go = new GameObject(
"loader_network");
170 var ssol = go.AddComponent<StartStageOnLoad>();
171 ssol.stageJson = NetworkManager.instance.GetDataFromIdInCache(courseId);
173 pb_ModalWindow.Hide();
175 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
179 SavedUser.instance.courseType = CourseType.Dobot;
180 StartCoroutine(NetworkManager.instance.GetDobotMyCurses(courses =>
182 var go = new GameObject(
"loader_network");
183 var ssol = go.AddComponent<StartStageOnLoad>();
184 ssol.stageJson = NetworkManager.instance.GetDataFromIdInCache(courseId);
187 pb_ModalWindow.Hide();
189 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
196 canvas.SetActive(true);
197 newCourseWindow.SetActive(true);
199 if (!useAutoCourseLoad)
201 OnNetworkLogin.Invoke();
202 fileDialog.SetDirectory(Path.Combine(Application.streamingAssetsPath,
"trainings"));
203 fileDialog.isFileBrowser = true;
209 Debug.LogError(
"GetUserById failed!");
210 canvas.SetActive(
true);
217 Debug.LogError(
"Couldn't get user from cookie! Falling back to Login window.");
227 if (!
File.Exists(Path.Combine(Application.persistentDataPath,
"License.bin")))
229 OnLicenseNotFound.Invoke();
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);
239 var lic2 = XorArrays(xor, bytehwid);
240 if (!ByteArrayCompare(lic, lic2))
242 OnInvalidLicense.Invoke();
248 OnInvalidLicense.Invoke();
255 if (!
File.Exists(Path.Combine(Application.persistentDataPath,
"Database.bin")))
258 addUserWindow.SetActive(
true);
259 OnUserDatabaseNotFound.Invoke();
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);
269 loginWindow.SetActive(
true);
273 flags?.SetActive(
true);
276 if (useNetworkManager)
280 loginWindow.SetActive(
false);
281 loginPW.text =
"AktĂv";
282 OnNetworkLogin.Invoke();
283 fileDialog.
SetDirectory(Path.Combine(Application.streamingAssetsPath,
"trainings"));
291 OnLoginSuccessful.Invoke();
294 OnLimitedUserLogin.Invoke();
298 OnMainteinerLogin.Invoke();
303 private void OnDestroy()
305 SceneManager.sceneLoaded -= SceneManager_sceneLoaded;
308 private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
310 if (arg0.buildIndex != 0)
312 SceneManager.MoveGameObjectToScene(gameObject, SceneManager.GetActiveScene());
316 private IEnumerator DelayedAction(
float delay, Action action)
318 yield
return new WaitForSeconds(delay);
322 private void PopulateUserList()
324 for (
int i = 1; i < userListPrefab.transform.parent.childCount; i++)
326 Destroy(userListPrefab.transform.parent.GetChild(i).gameObject);
328 foreach (var user
in users)
330 var newgo = Instantiate(userListPrefab, userListPrefab.transform.parent);
331 newgo.transform.GetChild(1).GetComponent<Text>().text = user.Username;
333 usertype = user.Access == UserType.Admin ?
"USERTYPE_ADMIN" :
"";
335 usertype = user.Access == UserType.Maintainer ?
"USERTYPE_MAINTAINER" :
"";
337 usertype = user.Access == UserType.User ?
"USERTYPE_USER" :
"";
339 newgo.transform.GetChild(2).GetComponent<Text>().text = usertype;
340 newgo.SetActive(
true);
342 scrollViewContent.sizeDelta =
new Vector2(scrollViewContent.sizeDelta.x, users.Count * 31);
347 if (scrollViewContentCurse ==
null)
350 Debug.LogWarning(
"scrollViewContentCurse is null");
354 for (
int i = 1; i < scrollViewContentCurse.childCount; i++)
356 Destroy(scrollViewContentCurse.GetChild(i).gameObject);
358 foreach (var training
in user.addedTrainings)
360 var newgo = Instantiate(curseListPrefab, scrollViewContentCurse);
361 newgo.GetComponent<
CurseDataField>().curseName.text = training.TrainingName;
363 newgo.GetComponent<
CurseDataField>().creationDate.text = training.CreationDate.ToString(
"yyyy/MM/dd");
364 newgo.GetComponent<
CurseDataField>().modificationDate.text = training.ModificationDate.ToString(
"yyyy/MM/dd");
366 newgo.SetActive(
true);
368 scrollViewContentCurse.sizeDelta =
new Vector2(scrollViewContentCurse.sizeDelta.x, users.Count * 61);
373 for (
int i = 1; i < userListPrefab.transform.parent.childCount; i++)
375 if (userListPrefab.transform.parent.GetChild(i).GetChild(0).GetComponent<Toggle>().isOn)
377 var username = userListPrefab.transform.parent.GetChild(i).GetChild(1).GetComponent<Text>().text;
379 if (TryRemoveUser(username))
381 Destroy(userListPrefab.transform.parent.GetChild(i).gameObject);
392 for (
int i = 1; i < scrollViewContentCurse.childCount; i++)
394 if (scrollViewContentCurse.GetChild(i).GetChild(1).GetComponent<Toggle>().isOn)
396 var training = scrollViewContentCurse.GetChild(i).GetChild(0).GetComponentInChildren<Text>().text;
398 if (TryRemoveCurse(training, selectedUser))
400 Destroy(scrollViewContentCurse.GetChild(i).gameObject);
409 if (!
File.Exists(Path.Combine(Application.persistentDataPath,
"Database.bin")))
412 addUserWindow.SetActive(
true);
413 OnUserDatabaseNotFound.Invoke();
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);
423 loginWindow.SetActive(
true);
429 var xor = Encoding.ASCII.GetBytes(szupertitkoskulcs);
430 var bytehwid = Encoding.ASCII.GetBytes(hwid);
433 var lic2 = XorArrays(xor, bytehwid);
434 if (!ByteArrayCompare(lic, lic2))
return false;
447 if (!loggingIn && Input.GetKey(KeyCode.Return))
455 if (loginPW.text ==
"" && (qrField && qrField.text ==
""))
459 if (useNetworkManager)
461 if (qrField && qrField.text !=
"")
465 OnNetworkLogin.Invoke();
469 SavedUser.instance.wsUser = login.user;
476 if (login.isQuality || login.courseModuleType.id == 2)
478 StartCoroutine(NetworkManager.instance.GetQualityMyCurses(courses =>
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)
487 SavedUser.instance.courseType = CourseType.Quality;
488 Debug.Log(
"isQuality is true b4 loading");
491 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
496 if (login.courseModuleType.id == 1)
498 SavedUser.instance.courseType = CourseType.Normal;
499 StartCoroutine(NetworkManager.instance.GetMyCurses(courses =>
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)
508 SavedUser.instance.courseType = CourseType.Quality;
509 Debug.Log(
"isQuality is true b4 loading");
512 StartCoroutine(DelayedAction(0.1f, () => SceneManager.LoadScene(1)));
515 else if (login.courseModuleType.id == 3)
517 SavedUser.instance.courseType = CourseType.Dobot;
518 StartCoroutine(NetworkManager.instance.GetDobotMyCurses(courses =>
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)));
543 if (login.user.groupId == UserType.User)
545 accessDenied.SetActive(true);
549 OnNetworkLogin.Invoke();
551 fileDialog.
SetDirectory(Path.Combine(Application.streamingAssetsPath,
"trainings"));
566 var username = loginUsername.text;
567 foreach (var user
in users)
568 if (user.Username == username)
570 if (user.PasswordHash == SHA256(loginPW.text))
574 OnLoginSuccessful.Invoke();
575 if (user.Access == UserType.User)
576 OnLimitedUserLogin.Invoke();
578 OnMainteinerLogin.Invoke();
598 private void AddFirstAdmin()
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);
608 private void RevertToNormalUsers()
610 dropdownUserType.ClearOptions();
611 dropdownUserType.AddOptions(
new List<Dropdown.OptionData>
616 dropdownUserType.value = 1;
617 dropdownUserType.enabled =
true;
618 userHelper = (int)UserType.Maintainer;
619 cancelButton.SetActive(
true);
622 private bool TryRemoveUser(
string username)
624 for (
int i = 0; i < users.Count; i++)
626 if (users[i].Username == username && users[i].Access != UserType.Admin)
637 private bool TryRemoveCurse(
string cursename, User selectedUser)
639 for (
int i = 0; i < selectedUser.addedTrainings.Count; i++)
641 if (selectedUser.addedTrainings[i].TrainingName == cursename)
643 selectedUser.addedTrainings.RemoveAt(i);
644 PopulateCurseList(selectedUser);
654 var username = inputUsername.text;
655 if (useNetworkManager)
657 StartCoroutine(
NetworkManager.
instance.AddUser(username,
"TODO", 3, user => { Debug.Log(
"user add success"); }));
660 if (!UsernameAvailable(username))
666 if (inputPW.text != inputPW2.text)
672 if (inputPW.text.Length == 0)
678 var adduser =
new User
681 PasswordHash = SHA256(inputPW.text),
682 Access = (
UserType) dropdownUserType.value + userHelper
687 inputUsername.text =
"";
691 RevertToNormalUsers();
692 addUserWindow.SetActive(
false);
696 loginWindow.SetActive(
true);
707 var wrm = FindObjectOfType<WaitingRoomManager>();
713 users[users.IndexOf(x => x.Username == value.
Username)] = value;
719 inputUsername.text =
"";
722 dropdownUserType.value = 1;
725 private void SaveDB()
728 new Thread(SaveThread).Start();
731 private void SaveThread()
733 var bf =
new BinaryFormatter();
737 bf.Serialize(file, users);
745 private bool UsernameAvailable(
string username)
747 foreach (var user
in users)
748 if (user.Username == username)
753 private bool ByteArrayCompare(
byte[] a1,
byte[] a2)
755 if (a1.Length != a2.Length)
758 for (var i = 0; i < a1.Length; i++)
765 private byte[] XorArrays(
byte[] key,
byte[] PAN)
767 if (key.Length == PAN.Length)
769 var result =
new byte[key.Length];
770 for (var i = 0; i < key.Length; i++) result[i] = (
byte) (key[i] ^ PAN[i]);
774 throw new ArgumentException();
779 return users.FirstOrDefault(x => x.Username == username);
782 private string SHA256(
string str)
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();
917 Debug.Log(
"Setting courseID: " + x);
925 foreach (var item
in savedActions)
927 retval +=
"{\"actionComment\":\"" + item.actionComment +
"\",\"tactTimeTarget\":" +
Macro.
NormalizeFraction(item.tactTimeTarget.ToString(),
'.') +
",\"tactTimeCurrent\":" +
Macro.
NormalizeFraction(item.tactTimeCurrent.ToString(),
'.') +
"},";
930 return retval.Remove(retval.Length - 1) +
"]]";
957 public void GenerateLicense()
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"));
965 public void GenerateLicense(
string id)
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));
System.IO.FileMode FileMode
UnityEngine.UI.Button Button
CourseType manualLogonCourseType
void SetDirectory(string directory)
string TranslateText(string key)
static Localization_SOURCE Instance
static string NormalizeFraction(string value)
UserManager.User selectedUser
void UpdateUser(User value)
void DeleteSelectedTraining()
UnityEvent OnLimitedUserLogin
GameObject curseListPrefab
GameObject mainMenuWindow
User GetUserByName(string username)
void SetTutorial(bool value)
UnityEvent OnLicenseNotFound
GameObject newCourseWindow
UnityEvent OnMainteinerLogin
UnityEvent OnUserDatabaseNotFound
GameObject userListPrefab
RectTransform scrollViewContent
void DeleteSelectedUsers()
UnityEvent OnLoginSuccessful
Dropdown dropdownUserType
UnityEvent OnNetworkLogin
void SetEditor(bool value)
RectTransform scrollViewContentCurse
void AfterSuccessfulLicenseCheck()
UnityEvent OnInvalidLicense
Dropdown dropdownCourseType
bool CheckLicense(byte[] lic)
SavedUser.CourseType CourseType
DateTime ModificationDate
List< AddedTrainings > addedTrainings
List< Training > trainings
List< WSAction > savedActions
CourseModuleType courseModuleType