public bool EqualsIgnoreModificationdate(StandardFileNote other) { if (_id != other._id) { return(false); } if (_creationDate != other._creationDate) { return(false); } if (!new HashSet <StandardFileTagRef>(_internalTags).SetEquals(other._internalTags)) { return(false); } if (_text != other._text) { return(false); } if (_internaltitle != other._internaltitle) { return(false); } if (_isPinned != other._isPinned) { return(false); } if (_isLocked != other._isLocked) { return(false); } return(true); }
private static void PrepareForUpload(ISimpleJsonRest web, APIBodySync body, StandardFileNote note, List <StandardFileTag> tags, APIResultAuthorize token, StandardNoteConfig cfg, bool delete) { var appdata = new Dictionary <string, Dictionary <string, object> >(); SetAppDataBool(appdata, APPDATA_PINNED, note.IsPinned); SetAppDataBool(appdata, APPDATA_LOCKED, note.IsLocked); var jsnContent = new ContentNote { title = note.InternalTitle, text = note.Text, references = new List <APIResultContentRef>(), appData = appdata, }; foreach (var itertag in note.InternalTags.ToList()) { var itag = itertag; if (itag.UUID == null) { var newTag = tags.FirstOrDefault(e => e.Title == itag.Title); if (newTag == null) { newTag = new StandardFileTag(Guid.NewGuid(), itag.Title); tags.Add(newTag); } note.UpgradeTag(itag, newTag); itag = newTag; } Debug.Assert(itag.UUID != null, "itag.UUID != null"); jsnContent.references.Add(new APIResultContentRef { content_type = "Tag", uuid = itag.UUID.Value }); } var cdNote = StandardNoteCrypt.EncryptContent(token.version, web.SerializeJson(jsnContent), note.ID, token.masterkey, token.masterauthkey); body.items.Add(new APIBodyItem { content_type = "Note", uuid = note.ID, created_at = note.CreationDate, enc_item_key = cdNote.enc_item_key, auth_hash = cdNote.auth_hash, content = cdNote.enc_content, deleted = delete, }); }
protected override BasicFlatNote CreateClone() { var n = new StandardFileNote(_id, _config, _hConfig); using (n.SuppressDirtyChanges()) { n._internalTags = _internalTags.ToList(); n.ResyncTags(); n._text = _text; n._internaltitle = _internaltitle; n._creationDate = _creationDate; n._modificationDate = _modificationDate; n._contentVersion = _contentVersion; n._authHash = _authHash; n._internalRef.Synchronize(_internalRef); n._isPinned = _isPinned; return(n); } }
public bool ContainsReference(StandardFileNote note) => References.Any(r => r == note.ID);
private static StandardFileNote CreateNote(ISimpleJsonRest web, StandardNoteConnection conn, APIResultItem encNote, APIResultAuthorize authToken, StandardNoteConfig cfg, StandardNoteData dat) { if (encNote.deleted) { var nd = new StandardFileNote(encNote.uuid, cfg, conn.HConfig) { CreationDate = encNote.created_at, Text = "", InternalTitle = "", AuthHash = encNote.auth_hash, ContentVersion = StandardNoteCrypt.GetSchemaVersion(encNote.content), }; nd.ModificationDate = encNote.updated_at; return(nd); } ContentNote content; try { var contentJson = StandardNoteCrypt.DecryptContent(encNote.content, encNote.enc_item_key, encNote.auth_hash, authToken.masterkey, authToken.masterauthkey); Logger.Debug( StandardNotePlugin.Name, $"DecryptContent of note {encNote.uuid:B}", $"[content]:\r\n{encNote.content}\r\n" + $"[enc_item_key]:\r\n{encNote.enc_item_key}\r\n" + $"[auth_hash]:\r\n{encNote.auth_hash}\r\n" + $"\r\n\r\n" + $"[contentJson]:\r\n{contentJson}\r\n"); content = web.ParseJsonWithoutConverter <ContentNote>(contentJson); } catch (RestException) { throw; } catch (Exception e) { throw new StandardNoteAPIException("Cannot decrypt note with local masterkey", e); } var n = new StandardFileNote(encNote.uuid, cfg, conn.HConfig) { Text = StandardNoteConfig.REX_LINEBREAK.Replace(content.text, Environment.NewLine), InternalTitle = content.title, AuthHash = encNote.auth_hash, ContentVersion = StandardNoteCrypt.GetSchemaVersion(encNote.content), IsPinned = GetAppDataBool(content.appData, APPDATA_PINNED, false), IsLocked = GetAppDataBool(content.appData, APPDATA_LOCKED, false), }; var refTags = new List <StandardFileTagRef>(); foreach (var cref in content.references) { if (cref.content_type == "Note") { // ignore } else if (dat.Tags.Any(t => t.UUID == cref.uuid)) { refTags.Add(new StandardFileTagRef(cref.uuid, dat.Tags.First(t => t.UUID == cref.uuid).Title)); } else if (cref.content_type == "Tag") { Logger.Warn(StandardNotePlugin.Name, $"Reference to missing tag {cref.uuid} in note {encNote.uuid}"); } else { Logger.Error(StandardNotePlugin.Name, $"Downloaded note contains an unknown reference :{cref.uuid} ({cref.content_type}) in note {encNote.uuid}"); } } foreach (var tref in dat.Tags.Where(tag => tag.References.Any(tref => tref == encNote.uuid))) { refTags.Add(new StandardFileTagRef(tref.UUID, tref.Title)); } refTags = refTags.DistinctBy(t => t.UUID).ToList(); n.SetTags(refTags); n.SetReferences(content.references); n.CreationDate = encNote.created_at; n.ModificationDate = encNote.updated_at; return(n); }
private static void PrepareNoteForUpload(ISimpleJsonRest web, APIBodySync body, ref List <APIRawBodyItem> bodyraw, StandardFileNote note, List <StandardFileTag> allTags, APIResultAuthorize token, StandardNoteConfig cfg, bool delete) { var appdata = new Dictionary <string, Dictionary <string, object> >(); SetAppDataBool(appdata, APPDATA_PINNED, note.IsPinned); SetAppDataBool(appdata, APPDATA_LOCKED, note.IsLocked); var objContent = new ContentNote { title = note.InternalTitle, text = note.Text.Replace("\r\n", "\n"), references = new List <APIResultContentRef>(), appData = appdata, }; // Set correct tag UUID if tag already exists foreach (var itertag in note.InternalTags.ToList()) { var itag = itertag; if (itag.UUID == null) { var newTag = allTags.FirstOrDefault(e => e.Title == itag.Title)?.ToRef(); if (newTag == null) { newTag = new StandardFileTagRef(Guid.NewGuid(), itag.Title); allTags.Add(new StandardFileTag(newTag.UUID, newTag.Title, Enumerable.Repeat(note.ID, 1))); } note.UpgradeTag(itag, newTag); } } // Notes no longer have references to their tags (see issue #88) //foreach (var itertag in note.InternalTags.ToList()) //{ // Debug.Assert(itertag.UUID != null, "itertag.UUID != null"); // jsnContent.references.Add(new APIResultContentRef { content_type = "Tag", uuid = itertag.UUID.Value }); //} var jsonContent = web.SerializeJson(objContent); var cryptData = StandardNoteCrypt.EncryptContent(token.version, jsonContent, note.ID, token.masterkey, token.masterauthkey); body.items.Add(new APIBodyItem { content_type = "Note", uuid = note.ID, created_at = note.CreationDate, enc_item_key = cryptData.enc_item_key, auth_hash = cryptData.auth_hash, content = cryptData.enc_content, deleted = delete, }); bodyraw.Add(new APIRawBodyItem { content_type = "Note", uuid = note.ID, created_at = note.CreationDate, content = jsonContent, deleted = delete, }); }
private static StandardFileNote CreateNote(ISimpleJsonRest web, StandardNoteConnection conn, APIResultItem encNote, APIResultAuthorize authToken, StandardNoteConfig cfg, StandardNoteData dat) { if (encNote.deleted) { var nd = new StandardFileNote(encNote.uuid, cfg, conn.HConfig) { CreationDate = encNote.created_at, AuthHash = encNote.auth_hash, ContentVersion = StandardNoteCrypt.GetSchemaVersion(encNote.content), }; nd.RawModificationDate = encNote.updated_at; return(nd); } ContentNote content; string appDataContentString; try { var contentJson = StandardNoteCrypt.DecryptContent(encNote.content, encNote.enc_item_key, encNote.auth_hash, authToken.masterkey, authToken.masterauthkey); Logger.Debug( StandardNotePlugin.Name, $"DecryptContent of note {encNote.uuid:B}", $"[content]:\r\n{encNote.content}\r\n" + $"[enc_item_key]:\r\n{encNote.enc_item_key}\r\n" + $"[auth_hash]:\r\n{encNote.auth_hash}\r\n" + $"\r\n\r\n" + $"[contentJson]:\r\n{contentJson}\r\n"); content = web.ParseJsonWithoutConverter <ContentNote>(contentJson); appDataContentString = web.ParseJsonAndGetSubJson(contentJson, "appData", string.Empty); } catch (RestException) { throw; } catch (Exception e) { throw new StandardNoteAPIException("Cannot decrypt note with local masterkey", e); } var n = new StandardFileNote(encNote.uuid, cfg, conn.HConfig); using (n.SuppressDirtyChanges()) { n.Text = StandardNoteConfig.REX_LINEBREAK.Replace(content.text, Environment.NewLine); n.InternalTitle = content.title; n.AuthHash = encNote.auth_hash; n.ContentVersion = StandardNoteCrypt.GetSchemaVersion(encNote.content); n.IsPinned = GetAppDataBool(content.appData, APPDATA_PINNED, false); n.IsLocked = GetAppDataBool(content.appData, APPDATA_LOCKED, false); n.IsArchived = GetAppDataBool(content.appData, APPDATA_ARCHIVED, false); n.IsProtected = content.@protected; n.IsHidePreview = content.hidePreview; var refTags = new List <StandardFileTagRef>(); foreach (var cref in content.references) { if (cref.content_type == "Note") { // ignore } else if (dat.Tags.Any(t => t.UUID == cref.uuid)) { refTags.Add(new StandardFileTagRef(cref.uuid, dat.Tags.First(t => t.UUID == cref.uuid).Title)); } else if (cref.content_type == "Tag") { Logger.Warn(StandardNotePlugin.Name, $"Reference to missing tag {cref.uuid} in note {encNote.uuid}"); } else { Logger.Error(StandardNotePlugin.Name, $"Downloaded note contains an unknown reference :{cref.uuid} ({cref.content_type}) in note {encNote.uuid}"); } } foreach (var tref in dat.Tags.Where(tag => tag.References.Any(tref => tref == encNote.uuid))) { refTags.Add(new StandardFileTagRef(tref.UUID, tref.Title)); } refTags = refTags.DistinctBy(t => t.UUID).ToList(); n.SetTags(refTags); n.SetReferences(content.references); n.CreationDate = encNote.created_at; n.RawModificationDate = encNote.updated_at; n.ClientUpdatedAt = GetAppDataDTO(content.appData, APPDATA_CLIENTUPDATEDAT, null); n.NoteCreationDate = GetAppDataDTO(content.appData, APPDATA_NOTECDATE, null); n.NoteModificationDate = GetAppDataDTO(content.appData, APPDATA_NOTEMDATE, null); n.TextModificationDate = GetAppDataDTO(content.appData, APPDATA_TEXTMDATE, null); n.TitleModificationDate = GetAppDataDTO(content.appData, APPDATA_TITLEMDATE, null); n.TagsModificationDate = GetAppDataDTO(content.appData, APPDATA_TAGSMDATE, null); n.PathModificationDate = GetAppDataDTO(content.appData, APPDATA_PATHMDATE, null); n.RawAppData = appDataContentString; } return(n); }