private static void CreateInitialUsers() { JMMUserRepository repUsers = new JMMUserRepository(); if (repUsers.GetAll().Count() > 0) { return; } JMMUser defaultUser = new JMMUser(); defaultUser.CanEditServerSettings = 1; defaultUser.HideCategories = ""; defaultUser.IsAdmin = 1; defaultUser.IsAniDBUser = 1; defaultUser.IsTraktUser = 1; defaultUser.Password = ""; defaultUser.Username = "******"; repUsers.Save(defaultUser); JMMUser familyUser = new JMMUser(); familyUser.CanEditServerSettings = 1; familyUser.HideCategories = "Ecchi,Nudity,Sex,Sexual Abuse,Horror,Erotic Game,Incest,18 Restricted"; familyUser.IsAdmin = 1; familyUser.IsAniDBUser = 1; familyUser.IsTraktUser = 1; familyUser.Password = ""; familyUser.Username = "******"; repUsers.Save(familyUser); }
public ActionResult SyncForUser(int uid) { JMMUser user = HttpContext.GetUser(); ShokoServer.Instance.SyncPlex(); return(APIStatus.OK()); }
public static void Init() { JMMUser.Populate(a => a.JMMUserID); CloudAccount.Populate(a => a.CloudID); ImportFolder.Populate(a => a.ImportFolderID); AniDB_Anime.Populate(a => a.AniDB_AnimeID); AniDB_Episode.Populate(a => a.AniDB_EpisodeID); AniDB_File.Populate(a => a.AniDB_FileID); AniDB_Anime_Title.Populate(a => a.AniDB_Anime_TitleID); AniDB_Anime_Tag.Populate(a => a.AniDB_Anime_TagID); AniDB_Tag.Populate(a => a.AniDB_TagID); CustomTag.Populate(a => a.CustomTagID); CrossRef_CustomTag.Populate(a => a.CrossRef_CustomTagID); CrossRef_File_Episode.Populate(a => a.CrossRef_File_EpisodeID); VideoLocalPlace.Populate(a => a.VideoLocal_Place_ID); VideoLocal.Populate(a => a.VideoLocalID); VideoLocalUser.Populate(a => a.VideoLocal_UserID); GroupFilter.Populate(a => a.GroupFilterID); AnimeEpisode.Populate(a => a.AnimeEpisodeID); AnimeEpisode_User.Populate(a => a.AnimeEpisode_UserID); AnimeSeries.Populate(a => a.AnimeSeriesID); AnimeSeries_User.Populate(a => a.AnimeSeries_UserID); AnimeGroup.Populate(a => a.AnimeGroupID); AnimeGroup_User.Populate(a => a.AnimeGroup_UserID); GroupFilter.PostProcess(); CleanUpMemory(); }
public System.IO.Stream GetMetadata(string UserId, string TypeId, string Id) { try { int type; int.TryParse(TypeId, out type); JMMUser user = KodiHelper.GetUser(UserId); switch ((JMMType)type) { case JMMType.Group: return(GetItemsFromGroup(user.JMMUserID, Id)); case JMMType.GroupFilter: return(GetGroupsFromFilter(user.JMMUserID, Id)); case JMMType.GroupUnsort: return(GetUnsort(user.JMMUserID)); case JMMType.Serie: return(GetItemsFromSerie(user.JMMUserID, Id)); case JMMType.File: return(InternalGetFile(user.JMMUserID, Id)); } return(new MemoryStream()); } catch (Exception ex) { logger.ErrorException(ex.ToString(), ex); return(new MemoryStream()); } }
/// <summary> /// Create user from Contract_JMMUser /// </summary> /// <returns></returns> private object CreateUser() { Request request = this.Request; SVR_JMMUser _user = (SVR_JMMUser)this.Context.CurrentUser; if (_user.IsAdmin == 1) { JMMUser user = this.Bind(); user.Password = Digest.Hash(user.Password); user.HideCategories = ""; user.PlexUsers = ""; if (new ShokoServiceImplementation().SaveUser(user) == "") { return(APIStatus.statusOK()); } else { return(APIStatus.internalError()); } } else { return(APIStatus.adminNeeded()); } }
private static void CreateInitialUsers() { JMMUserRepository repUsers = new JMMUserRepository(); if (repUsers.GetAll().Count() > 0) { return; } Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(ServerSettings.Culture); JMMUser defaultUser = new JMMUser(); defaultUser.CanEditServerSettings = 1; defaultUser.HideCategories = ""; defaultUser.IsAdmin = 1; defaultUser.IsAniDBUser = 1; defaultUser.IsTraktUser = 1; defaultUser.Password = ""; defaultUser.Username = JMMServer.Properties.Resources.Users_Default; repUsers.Save(defaultUser, true); JMMUser familyUser = new JMMUser(); familyUser.CanEditServerSettings = 1; familyUser.HideCategories = "ecchi,nudity,sex,sexual abuse,horror,erotic game,incest,18 restricted"; familyUser.IsAdmin = 1; familyUser.IsAniDBUser = 1; familyUser.IsTraktUser = 1; familyUser.Password = ""; familyUser.Username = JMMServer.Properties.Resources.Users_FamilyFriendly; repUsers.Save(familyUser, true); }
public ActionResult SyncForUser(int uid) { JMMUser user = Repo.Instance.JMMUser.GetByID(uid); ShokoServer.Instance.SyncPlex(); return(APIStatus.OK()); }
public static void Init() { JMMUser.Populate(); CloudAccount.Populate(); ImportFolder.Populate(); AniDB_Anime.Populate(); AniDB_Episode.Populate(); AniDB_File.Populate(); AniDB_Anime_Title.Populate(); AniDB_Anime_Tag.Populate(); AniDB_Tag.Populate(); CustomTag.Populate(); CrossRef_CustomTag.Populate(); CrossRef_File_Episode.Populate(); VideoLocalPlace.Populate(); VideoLocal.Populate(); VideoLocalUser.Populate(); GroupFilter.Populate(); AnimeEpisode.Populate(); AnimeEpisode_User.Populate(); AnimeSeries.Populate(); AnimeSeries_User.Populate(); AnimeGroup.Populate(); AnimeGroup_User.Populate(); // Update Contracts if necessary try { JMMUser.RegenerateDb(); CloudAccount.RegenerateDb(); ImportFolder.RegenerateDb(); AniDB_Anime.RegenerateDb(); AniDB_Episode.RegenerateDb(); AniDB_File.RegenerateDb(); AniDB_Anime_Title.RegenerateDb(); AniDB_Anime_Tag.RegenerateDb(); AniDB_Tag.RegenerateDb(); CustomTag.RegenerateDb(); CrossRef_CustomTag.RegenerateDb(); CrossRef_File_Episode.RegenerateDb(); VideoLocalPlace.RegenerateDb(); VideoLocal.RegenerateDb(); VideoLocalUser.RegenerateDb(); AnimeEpisode.RegenerateDb(); AnimeEpisode_User.RegenerateDb(); AnimeSeries.RegenerateDb(); AnimeSeries_User.RegenerateDb(); AnimeGroup.RegenerateDb(); AnimeGroup_User.RegenerateDb(); GroupFilter.RegenerateDb(); GroupFilter.PostProcess(); } catch (Exception e) { LogManager.GetCurrentClassLogger().Error(e, "There was an error starting the Database Factory"); } CleanUpMemory(); }
public static bool CompareUser(JMMUser olduser, JMMUser newuser) { if (olduser == null || olduser.HideCategories == newuser.HideCategories) { return(true); } return(false); }
public static PlexHelper GetForUser(JMMUser user) { if (Cache.TryGetValue(user.JMMUserID, out PlexHelper helper)) { return(helper); } Cache.Add(user.JMMUserID, helper = new PlexHelper(user)); return(helper); }
public override bool LoadFromDBCommand(CommandRequest cq) { CommandID = cq.CommandID; CommandRequestID = cq.CommandRequestID; Priority = cq.Priority; CommandDetails = cq.CommandDetails; DateTimeUpdated = cq.DateTimeUpdated; _jmmuser = RepoFactory.JMMUser.GetByID(Convert.ToInt32(cq.CommandDetails)); return(true); }
public static void Init() { JMMUser.Populate(); CloudAccount.Populate(); ImportFolder.Populate(); AniDB_Anime.Populate(); AniDB_Episode.Populate(); AniDB_File.Populate(); AniDB_Anime_Title.Populate(); AniDB_Anime_Tag.Populate(); AniDB_Tag.Populate(); CustomTag.Populate(); CrossRef_CustomTag.Populate(); CrossRef_File_Episode.Populate(); VideoLocalPlace.Populate(); VideoLocal.Populate(); VideoLocalUser.Populate(); GroupFilter.Populate(); AnimeEpisode.Populate(); AnimeEpisode_User.Populate(); AnimeSeries.Populate(); AnimeSeries_User.Populate(); AnimeGroup.Populate(); AnimeGroup_User.Populate(); // Update Contracts if necessary JMMUser.RegenerateDb(); CloudAccount.RegenerateDb(); ImportFolder.RegenerateDb(); AniDB_Anime.RegenerateDb(); AniDB_Episode.RegenerateDb(); AniDB_File.RegenerateDb(); AniDB_Anime_Title.RegenerateDb(); AniDB_Anime_Tag.RegenerateDb(); AniDB_Tag.RegenerateDb(); CustomTag.RegenerateDb(); CrossRef_CustomTag.RegenerateDb(); CrossRef_File_Episode.RegenerateDb(); VideoLocalPlace.RegenerateDb(); VideoLocal.RegenerateDb(); VideoLocalUser.RegenerateDb(); AnimeEpisode.RegenerateDb(); AnimeEpisode_User.RegenerateDb(); AnimeSeries.RegenerateDb(); AnimeSeries_User.RegenerateDb(); AnimeGroup.RegenerateDb(); AnimeGroup_User.RegenerateDb(); GroupFilter.RegenerateDb(); GroupFilter.PostProcess(); CleanUpMemory(); }
public JMMUser AuthenticateUser(string userName, string password) { using (var session = JMMService.SessionFactory.OpenSession()) { string hashedPassword = Digest.Hash(password); JMMUser cr = session .CreateCriteria(typeof(JMMUser)) .Add(Restrictions.Eq("Username", userName)) .Add(Restrictions.Eq("Password", hashedPassword)) .UniqueResult <JMMUser>(); return(cr); } }
public void Save(JMMUser obj) { using (var session = JMMService.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(obj); transaction.Commit(); } } logger.Trace("Updating group filter stats by user from JMMUserRepository.Save: {0}", obj.JMMUserID); StatsCache.Instance.UpdateGroupFilterUsingUser(obj.JMMUserID); }
public LinkPlexForm(JMMUser user) { _user = user; InitializeComponent(); btnClose.Click += BtnClose_Click; btnLink.Click += BtnLinkOnClick; btnInvalidate.Click += BtnInvalidateOnClick; _timer = new Timer { Interval = 10 * 1000 }; //10 seconds _timer.Elapsed += TimerOnElapsed; _timer.Start(); }
public void Delete(int id) { using (var session = JMMService.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { JMMUser cr = GetByID(id); if (cr != null) { session.Delete(cr); transaction.Commit(); } } } }
/// <summary> /// Create user from Contract_JMMUser /// </summary> /// <returns></returns> private object CreateUser() { SVR_JMMUser _user = (SVR_JMMUser)Context.CurrentUser; if (_user.IsAdmin == 1) { JMMUser user = this.Bind(); user.Password = Digest.Hash(user.Password); user.HideCategories = string.Empty; user.PlexUsers = string.Empty; return(new ShokoServiceImplementation().SaveUser(user) == string.Empty ? APIStatus.OK() : APIStatus.InternalError()); } return(APIStatus.AdminNeeded()); }
public string ValidateUser(string username, string password, string device) { JMMUser userrecord = RepoFactory.JMMUser.AuthenticateUser(username, password); if (userrecord == null) { return(string.Empty); } lock (Cache) { int uid = userrecord.JMMUserID; var tokens = UserIDs .GetMultiple(uid).Where(a => string.IsNullOrEmpty(a.Token) || a.DeviceName.Trim().Equals(device.Trim(), StringComparison.InvariantCultureIgnoreCase)) .ToList(); var auth = tokens.FirstOrDefault(a => !string.IsNullOrEmpty(a.Token) && a.DeviceName.Trim().Equals(device.Trim(), StringComparison.InvariantCultureIgnoreCase)); if (tokens.Count > 1) { if (auth != null) { tokens.Remove(auth); } tokens.ForEach(Delete); } string apiKey = auth?.Token.ToLowerInvariant().Trim() ?? string.Empty; if (!string.IsNullOrEmpty(apiKey)) { return(apiKey); } apiKey = Guid.NewGuid().ToString().ToLowerInvariant().Trim(); AuthTokens newToken = new AuthTokens { UserID = uid, DeviceName = device.Trim().ToLowerInvariant(), Token = apiKey }; Save(newToken); return(apiKey); } }
public string ValidateUser(string username, string password, string device) { JMMUser userrecord = Repo.Instance.JMMUser.AuthenticateUser(username, password); if (userrecord == null) { return(string.Empty); } int uid = userrecord.JMMUserID; List <AuthTokens> tokens; using (RepoLock.ReaderLock()) { tokens = IsCached ? UserIDs.GetMultiple(uid).Where(a => string.IsNullOrEmpty(a.Token) || a.DeviceName.Trim().Equals(device.Trim(), StringComparison.InvariantCultureIgnoreCase)).ToList() : Table.Where(a => a.UserID == uid && (string.IsNullOrEmpty(a.Token) || a.DeviceName.Trim().Equals(device.Trim(), StringComparison.InvariantCultureIgnoreCase))).ToList(); } AuthTokens auth = tokens.FirstOrDefault(a => !string.IsNullOrEmpty(a.Token) && a.DeviceName.Trim().Equals(device.Trim(), StringComparison.InvariantCultureIgnoreCase)); if (tokens.Count > 1) { if (auth != null) { tokens.Remove(auth); } Delete(tokens); } string apiKey = auth?.Token.ToLowerInvariant().Trim() ?? string.Empty; if (!string.IsNullOrEmpty(apiKey)) { return(apiKey); } apiKey = Guid.NewGuid().ToString().ToLowerInvariant().Trim(); using (var obj = BeginAdd()) { obj.Entity.UserID = uid; obj.Entity.DeviceName = device.Trim().ToLowerInvariant(); obj.Entity.Token = apiKey; obj.Commit(); } return(apiKey); }
public PlexWebhookAuthenticated() : base("/plex") { this.RequiresAuthentication(); //Get["/pin"] = o => CallPlexHelper(h => h.Authenticate()); Get["/loginurl"] = o => CallPlexHelper(h => h.LoginUrl); Get["/pin/authenticated"] = o => $"{CallPlexHelper(h => h.IsAuthenticated)}"; Get["/token/invalidate"] = o => CallPlexHelper(h => { h.InvalidateToken(); return(true); }); Get["/sync", true] = async(x, ct) => await Task.Factory.StartNew(() => { new CommandRequest_PlexSyncWatched((JMMUser)this.Context.CurrentUser).Save(); return(APIStatus.OK()); }); Get["/sync/all", true] = async(x, ct) => await Task.Factory.StartNew(() => { if (((JMMUser)this.Context.CurrentUser).IsAdmin != 1) { return(APIStatus.AdminNeeded()); } ShokoServer.Instance.SyncPlex(); return(APIStatus.OK()); }); Get["/sync/{id}", true] = async(x, ct) => await Task.Factory.StartNew(() => { if (((JMMUser)this.Context.CurrentUser).IsAdmin != 1) { return(APIStatus.AdminNeeded()); } JMMUser user = RepoFactory.JMMUser.GetByID(x.id); ShokoServer.Instance.SyncPlex(); return(APIStatus.OK()); }); #if DEBUG Get["/test/dir"] = o => Response.AsJson(CallPlexHelper(h => h.GetDirectories())); Get["/test/lib/{id}"] = o => Response.AsJson(CallPlexHelper(h => ((SVR_Directory)h.GetDirectories().FirstOrDefault(d => d.Key == (int)o.id))?.GetShows())); #endif }
public void Save(JMMUser obj, bool updateGroupFilters) { lock (obj) { bool isNew = false; if (obj.JMMUserID == 0) { isNew = true; using (var session = JMMService.SessionFactory.OpenSession()) { obj.Contract = null; using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(obj); transaction.Commit(); } } } GenerateContract(obj); if (updateGroupFilters) { using (var session = JMMService.SessionFactory.OpenSession()) { JMMUser old = isNew ? null : session.Get <JMMUser>(obj.JMMUserID); updateGroupFilters = JMMUser.CompareUser(old?.Contract, obj.Contract); } } using (var session = JMMService.SessionFactory.OpenSession()) { // populate the database using (var transaction = session.BeginTransaction()) { session.SaveOrUpdate(obj); transaction.Commit(); } } Cache.Update(obj); if (updateGroupFilters) { logger.Trace("Updating group filter stats by user from JMMUserRepository.Save: {0}", obj.JMMUserID); obj.UpdateGroupFilters(); } } }
public System.IO.Stream GetMetadata(string UserId, string TypeId, string Id, string historyinfo) { try { HistoryInfo his = HistoryInfo.FromKey(historyinfo); if (WebOperationContext.Current != null) { his.Key = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.ToString(); } int type; int.TryParse(TypeId, out type); JMMUser user = PlexHelper.GetJMMUser(UserId); switch ((JMMType)type) { case JMMType.Group: return(GetItemsFromGroup(user.JMMUserID, Id, his)); case JMMType.GroupFilter: return(GetGroupsFromFilter(user.JMMUserID, Id, his)); case JMMType.GroupUnsort: return(GetUnsort(user.JMMUserID, his)); case JMMType.Serie: return(GetItemsFromSerie(user.JMMUserID, Id, his)); case JMMType.File: return(InternalGetFile(user.JMMUserID, Id, his)); case JMMType.Playlist: return(GetItemsFromPlaylist(user.JMMUserID, Id, his)); } return(new MemoryStream()); } catch (Exception ex) { logger.ErrorException(ex.ToString(), ex); return(new MemoryStream()); } }
public static void GenerateContract(JMMUser user) { Contract_JMMUser contract = new Contract_JMMUser(); contract.JMMUserID = user.JMMUserID; contract.Username = user.Username; contract.Password = user.Password; contract.IsAdmin = user.IsAdmin; contract.IsAniDBUser = user.IsAniDBUser; contract.IsTraktUser = user.IsTraktUser; if (!string.IsNullOrEmpty(user.HideCategories)) { contract.HideCategories = new HashSet <string>( user.HideCategories.Trim().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(a => a.Trim()) .Where(a => !string.IsNullOrEmpty(a)).Distinct(StringComparer.InvariantCultureIgnoreCase), StringComparer.InvariantCultureIgnoreCase); } else { contract.HideCategories = new HashSet <string>(); } contract.CanEditServerSettings = user.CanEditServerSettings; if (!string.IsNullOrEmpty(user.PlexUsers)) { contract.PlexUsers = new HashSet <string>( user.PlexUsers.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(a => a.Trim()) .Where(a => !string.IsNullOrEmpty(a)).Distinct(StringComparer.InvariantCultureIgnoreCase), StringComparer.InvariantCultureIgnoreCase); } else { contract.PlexUsers = new HashSet <string>(); } user.Contract = contract; }
/// <summary> /// Delete user from his ID /// </summary> /// <returns></returns> private object DeleteUser() { Request request = this.Request; JMMUser _user = (JMMUser)this.Context.CurrentUser; if (_user.IsAdmin == 1) { JMMUser user = this.Bind(); if (new JMMServiceImplementation().DeleteUser(user.JMMUserID) == "") { return(APIStatus.statusOK()); } else { return(APIStatus.internalError()); } } else { return(APIStatus.adminNeeded()); } }
/// <summary> /// change given user (by uid) password /// </summary> /// <returns></returns> private object ChangePassword(int uid) { Request request = this.Request; Entities.JMMUser _user = (Entities.JMMUser) this.Context.CurrentUser; if (_user.IsAdmin == 1) { JMMUser user = this.Bind(); if (new JMMServiceImplementation().ChangePassword(uid, user.Password) == "") { return(APIStatus.statusOK()); } else { return(APIStatus.internalError()); } } else { return(APIStatus.adminNeeded()); } }
void btnLogin_Click(object sender, RoutedEventArgs e) { ThisUser = null; VM_JMMUser user = cboUsers.SelectedItem as VM_JMMUser; if (user != null) { JMMUser retUser = VM_ShokoServer.Instance.ShokoServices.AuthenticateUser(user.Username, txtPassword.Password.Trim()); if (retUser != null) { ThisUser = user; DialogResult = true; VM_ShokoServer.Instance.RefreshImportFolders(); Close(); } else { txtPassword.Focus(); txtStatus.Text = Shoko.Commons.Properties.Resources.Login_IncorrectPassword; } } }
private T CallPlexHelper <T>(Func <PlexHelper, T> act) { JMMUser user = HttpContext.GetUser(); return(act(PlexHelper.GetForUser(user))); }
private object CallPlexHelper(Func <PlexHelper, object> act) { JMMUser user = (JMMUser)this.Context.CurrentUser; return(act(PlexHelper.GetForUser(user))); }
public override void ProcessCommand() { logger.Info("Processing CommandRequest_MALDownloadStatusFromMAL"); try { if (string.IsNullOrEmpty(ServerSettings.MAL_Username) || string.IsNullOrEmpty(ServerSettings.MAL_Password)) { return; } // find the latest eps to update AniDB_AnimeRepository repAnime = new AniDB_AnimeRepository(); myanimelist mal = MALHelper.GetMALAnimeList(); if (mal == null) { return; } if (mal.anime == null) { return; } CrossRef_AniDB_MALRepository repCrossRef = new CrossRef_AniDB_MALRepository(); AniDB_EpisodeRepository repAniEps = new AniDB_EpisodeRepository(); AnimeEpisodeRepository repEp = new AnimeEpisodeRepository(); // find the anidb user JMMUserRepository repUsers = new JMMUserRepository(); List <JMMUser> aniDBUsers = repUsers.GetAniDBUsers(); if (aniDBUsers.Count == 0) { return; } JMMUser user = aniDBUsers[0]; foreach (myanimelistAnime malAnime in mal.anime) { // look up the anime CrossRef_AniDB_MAL xref = repCrossRef.GetByMALID(malAnime.series_animedb_id); if (xref == null) { continue; } if (malAnime.series_animedb_id == 8107 || malAnime.series_animedb_id == 10737) { Console.Write(""); } // check if this anime has any other links List <CrossRef_AniDB_MAL> allXrefs = repCrossRef.GetByAnimeID(xref.AnimeID); if (allXrefs.Count == 0) { continue; } // find the range of watched episodes that this applies to int startEpNumber = xref.StartEpisodeNumber; int endEpNumber = GetUpperEpisodeLimit(allXrefs, xref); List <AniDB_Episode> aniEps = repAniEps.GetByAnimeID(xref.AnimeID); foreach (AniDB_Episode aniep in aniEps) { if (aniep.EpisodeType != xref.StartEpisodeType) { continue; } AnimeEpisode ep = repEp.GetByAniDBEpisodeID(aniep.EpisodeID); if (ep == null) { continue; } int adjustedWatchedEps = malAnime.my_watched_episodes + xref.StartEpisodeNumber - 1; int epNum = aniep.EpisodeNumber; if (epNum < startEpNumber || epNum > endEpNumber) { continue; } AnimeEpisode_User usrRec = ep.GetUserRecord(user.JMMUserID); if (epNum <= adjustedWatchedEps) { // update if the user doesn't have a record (means not watched) // or it is currently un-watched bool update = false; if (usrRec == null) { update = true; } else { if (!usrRec.WatchedDate.HasValue) { update = true; } } if (update) { ep.ToggleWatchedStatus(true, true, DateTime.Now, user.JMMUserID, false); } } else { bool update = false; if (usrRec != null) { if (usrRec.WatchedDate.HasValue) { update = true; } } if (update) { ep.ToggleWatchedStatus(false, true, DateTime.Now, user.JMMUserID, false); } } } } } catch (Exception ex) { logger.Error("Error processing CommandRequest_MALDownloadStatusFromMAL: {0}", ex.ToString()); return; } }
public CommandRequest_PlexSyncWatched(JMMUser jmmUser) { _jmmuser = jmmUser; }