Ejemplo n.º 1
0
        public ADUser(string userId, DirectoryEntry searchRoot)
        {
            this.userId = userId;
            ADUtil ad = new ADUtil();

            this.userEntry          = ad.GetUserDirectoryEntry(userId, new string[] { "givenName", "sn", "maxPwdAge", "pwdLastSet" }, searchRoot);
            this.firstName          = EntryUtil.GetProperty(userEntry, "givenName");
            this.lastName           = EntryUtil.GetProperty(userEntry, "sn");
            this.mailBoxLocation    = EntryUtil.GetProperty(userEntry, "HomeMDB");
            this.hasExchangeMailBox = !string.IsNullOrEmpty(this.mailBoxLocation);
            this.emailAddress       = EntryUtil.GetProperty(userEntry, "mail");
        }
Ejemplo n.º 2
0
        private void SetGrouping(AceListGrouping lgPrimary)
        {
            Debug.Assert(((int)lgPrimary & ~(int)AceListGrouping.Primary) == 0);
            if ((int)lgPrimary == (Program.Config.MainWindow.ListGrouping &
                                   (int)AceListGrouping.Primary))
            {
                return;
            }

            Program.Config.MainWindow.ListGrouping &= ~(int)AceListGrouping.Primary;
            Program.Config.MainWindow.ListGrouping |= (int)lgPrimary;
            Debug.Assert((Program.Config.MainWindow.ListGrouping &
                          (int)AceListGrouping.Primary) == (int)lgPrimary);
            UpdateUI();

            if (m_mf == null)
            {
                Debug.Assert(false); return;
            }

            PwDatabase pd = m_mf.ActiveDatabase;
            PwGroup    pg = m_mf.GetCurrentEntries();

            if ((pd == null) || !pd.IsOpen || (pg == null))
            {
                return;                                                        // No assert
            }
            PwObjectList <PwEntry> pwl = pg.GetEntries(true);

            if ((pwl.UCount > 0) && EntryUtil.EntriesHaveSameParent(pwl))
            {
                m_mf.UpdateUI(false, null, true, pwl.GetAt(0).ParentGroup,
                              true, null, false);
            }
            else
            {
                EntryUtil.ReorderEntriesAsInDatabase(pwl, pd);                 // Requires open DB

                pg           = new PwGroup(true, true);
                pg.IsVirtual = true;
                foreach (PwEntry pe in pwl)
                {
                    pg.AddEntry(pe, false);
                }

                m_mf.UpdateUI(false, null, false, null, true, pg, false);
            }
        }
Ejemplo n.º 3
0
        private bool ConfirmOperationOnAllEntries(string question, string command, PwEntry[] entries)
        {
            VistaTaskDialog dlg = new VistaTaskDialog();

            dlg.CommandLinks    = false;
            dlg.Content         = EntryUtil.CreateSummaryList(null, entries);
            dlg.MainInstruction = question;
            dlg.SetIcon(VtdCustomIcon.Question);
            dlg.WindowTitle = PwDefs.ShortProductName;
            dlg.AddButton((int)DialogResult.OK, command, null);
            dlg.AddButton((int)DialogResult.Cancel, KPRes.CancelCmd, null);

            if (dlg.ShowDialog())
            {
                return(dlg.Result == (int)DialogResult.OK);
            }
            else
            {
                return(MessageService.AskYesNo(question));
            }
        }
Ejemplo n.º 4
0
        private static string CompileInternal(string strText, SprContext ctx,
                                              uint uRecursionLevel)
        {
            if (strText == null)
            {
                Debug.Assert(false); return(string.Empty);
            }
            if (ctx == null)
            {
                Debug.Assert(false); ctx = new SprContext();
            }

            if (uRecursionLevel >= SprEngine.MaxRecursionDepth)
            {
                Debug.Assert(false);                 // Most likely a recursive reference
                return(string.Empty);                // Do not return strText (endless loop)
            }

            string   str = strText;
            MainForm mf  = Program.MainForm;

            bool bExt = ((ctx.Flags & (SprCompileFlags.ExtActive |
                                       SprCompileFlags.ExtNonActive)) != SprCompileFlags.None);

            if (bExt && (SprEngine.FilterCompilePre != null))
            {
                SprEventArgs args = new SprEventArgs(str, ctx.Clone());
                SprEngine.FilterCompilePre(null, args);
                str = args.Text;
            }

            if ((ctx.Flags & SprCompileFlags.Comments) != SprCompileFlags.None)
            {
                str = RemoveComments(str);
            }

            // The following realizes {T-CONV:/Text/Raw/}, which should be
            // one of the first transformations (except comments)
            if ((ctx.Flags & SprCompileFlags.TextTransforms) != SprCompileFlags.None)
            {
                str = PerformTextTransforms(str, ctx, uRecursionLevel);
            }

            if ((ctx.Flags & SprCompileFlags.Run) != SprCompileFlags.None)
            {
                str = RunCommands(str, ctx, uRecursionLevel);
            }

            if ((ctx.Flags & SprCompileFlags.DataActive) != SprCompileFlags.None)
            {
                str = PerformClipboardCopy(str, ctx, uRecursionLevel);
            }

            if (((ctx.Flags & SprCompileFlags.DataNonActive) != SprCompileFlags.None) &&
                (str.IndexOf(@"{CLIPBOARD}", SprEngine.ScMethod) >= 0))
            {
                string strCb = null;
                try { strCb = ClipboardUtil.GetText(); }
                catch (Exception) { Debug.Assert(false); }
                str = Fill(str, @"{CLIPBOARD}", strCb ?? string.Empty, ctx, null);
            }

            if ((ctx.Flags & SprCompileFlags.AppPaths) != SprCompileFlags.None)
            {
                str = AppLocator.FillPlaceholders(str, ctx);
            }

            if (ctx.Entry != null)
            {
                if ((ctx.Flags & SprCompileFlags.PickChars) != SprCompileFlags.None)
                {
                    str = ReplacePickPw(str, ctx, uRecursionLevel);
                }

                if ((ctx.Flags & SprCompileFlags.EntryStrings) != SprCompileFlags.None)
                {
                    str = FillEntryStrings(str, ctx, uRecursionLevel);
                }

                if ((ctx.Flags & SprCompileFlags.EntryStringsSpecial) != SprCompileFlags.None)
                {
                    str = FillEntryStringsSpecial(str, ctx, uRecursionLevel);
                }

                if (((ctx.Flags & SprCompileFlags.EntryProperties) != SprCompileFlags.None) &&
                    (str.IndexOf(@"{UUID}", SprEngine.ScMethod) >= 0))
                {
                    str = Fill(str, @"{UUID}", ctx.Entry.Uuid.ToHexString(), ctx, null);
                }

                if (((ctx.Flags & SprCompileFlags.PasswordEnc) != SprCompileFlags.None) &&
                    (str.IndexOf(@"{PASSWORD_ENC}", SprEngine.ScMethod) >= 0))
                {
                    string strPwCmp = SprEngine.CompileInternal(@"{PASSWORD}",
                                                                ctx.WithoutContentTransformations(), uRecursionLevel + 1);
                    str = Fill(str, @"{PASSWORD_ENC}", StrUtil.EncryptString(
                                   strPwCmp), ctx, null);
                }

                PwGroup pg = ctx.Entry.ParentGroup;
                if (((ctx.Flags & SprCompileFlags.Group) != SprCompileFlags.None) &&
                    (pg != null))
                {
                    str = FillGroupPlh(str, @"{GROUP", pg, ctx, uRecursionLevel);
                }
            }

            if ((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None)
            {
                if (mf != null)
                {
                    PwGroup pgSel = mf.GetSelectedGroup();
                    if (pgSel != null)
                    {
                        str = FillGroupPlh(str, @"{GROUP_SEL", pgSel, ctx, uRecursionLevel);
                    }
                }

                str = Fill(str, @"{APPDIR}", UrlUtil.GetFileDirectory(
                               WinUtil.GetExecutable(), false, false), ctx, uRecursionLevel);

                str = Fill(str, @"{ENV_DIRSEP}", Path.DirectorySeparatorChar.ToString(),
                           ctx, null);

                string strPF86 = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
                if (string.IsNullOrEmpty(strPF86))
                {
                    strPF86 = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
                }
                if (strPF86 != null)
                {
                    str = Fill(str, @"{ENV_PROGRAMFILES_X86}", strPF86, ctx, uRecursionLevel);
                }
                else
                {
                    Debug.Assert(false);
                }

                if (ctx.Database != null)
                {
                    string strPath = ctx.Database.IOConnectionInfo.Path;
                    string strDir  = UrlUtil.GetFileDirectory(strPath, false, false);
                    string strName = UrlUtil.GetFileName(strPath);

                    // For backward compatibility only
                    str = Fill(str, @"{DOCDIR}", strDir, ctx, uRecursionLevel);

                    str = Fill(str, @"{DB_PATH}", strPath, ctx, uRecursionLevel);
                    str = Fill(str, @"{DB_DIR}", strDir, ctx, uRecursionLevel);
                    str = Fill(str, @"{DB_NAME}", strName, ctx, uRecursionLevel);
                    str = Fill(str, @"{DB_BASENAME}", UrlUtil.StripExtension(
                                   strName), ctx, uRecursionLevel);
                    str = Fill(str, @"{DB_EXT}", UrlUtil.GetExtension(
                                   strPath), ctx, uRecursionLevel);
                }
            }

            if ((ctx.Flags & SprCompileFlags.AutoType) != SprCompileFlags.None)
            {
                // Use Bksp instead of Del (in order to avoid Ctrl+Alt+Del);
                // https://sourceforge.net/p/keepass/discussion/329220/thread/4f1aa6b8/
                str = StrUtil.ReplaceCaseInsensitive(str, @"{CLEARFIELD}",
                                                     @"{HOME}+({END}){BKSP}{DELAY 50}");
            }

            if (((ctx.Flags & SprCompileFlags.DateTime) != SprCompileFlags.None) &&
                (str.IndexOf(@"{DT_", SprEngine.ScMethod) >= 0))
            {
                DateTime dtNow = DateTime.UtcNow;
                str = Fill(str, @"{DT_UTC_YEAR}", dtNow.Year.ToString("D4"),
                           ctx, null);
                str = Fill(str, @"{DT_UTC_MONTH}", dtNow.Month.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_UTC_DAY}", dtNow.Day.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_UTC_HOUR}", dtNow.Hour.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_UTC_MINUTE}", dtNow.Minute.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_UTC_SECOND}", dtNow.Second.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_UTC_SIMPLE}", dtNow.ToString("yyyyMMddHHmmss"),
                           ctx, null);

                dtNow = dtNow.ToLocalTime();
                str   = Fill(str, @"{DT_YEAR}", dtNow.Year.ToString("D4"),
                             ctx, null);
                str = Fill(str, @"{DT_MONTH}", dtNow.Month.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_DAY}", dtNow.Day.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_HOUR}", dtNow.Hour.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_MINUTE}", dtNow.Minute.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_SECOND}", dtNow.Second.ToString("D2"),
                           ctx, null);
                str = Fill(str, @"{DT_SIMPLE}", dtNow.ToString("yyyyMMddHHmmss"),
                           ctx, null);
            }

            if ((ctx.Flags & SprCompileFlags.References) != SprCompileFlags.None)
            {
                str = SprEngine.FillRefPlaceholders(str, ctx, uRecursionLevel);
            }

            if (((ctx.Flags & SprCompileFlags.EnvVars) != SprCompileFlags.None) &&
                (str.IndexOf('%') >= 0))
            {
                foreach (DictionaryEntry de in Environment.GetEnvironmentVariables())
                {
                    string strKey = (de.Key as string);
                    if (string.IsNullOrEmpty(strKey))
                    {
                        Debug.Assert(false); continue;
                    }

                    string strValue = (de.Value as string);
                    if (strValue == null)
                    {
                        Debug.Assert(false); strValue = string.Empty;
                    }

                    str = Fill(str, @"%" + strKey + @"%", strValue, ctx, uRecursionLevel);
                }
            }

            if ((ctx.Flags & SprCompileFlags.Env) != SprCompileFlags.None)
            {
                str = FillUriSpecial(str, ctx, @"{BASE", (ctx.Base ?? string.Empty),
                                     ctx.BaseIsEncoded, uRecursionLevel);
            }

            str = EntryUtil.FillPlaceholders(str, ctx, uRecursionLevel);

            if ((ctx.Flags & SprCompileFlags.PickChars) != SprCompileFlags.None)
            {
                str = ReplacePickChars(str, ctx, uRecursionLevel);
            }

            if (bExt && (SprEngine.FilterCompile != null))
            {
                SprEventArgs args = new SprEventArgs(str, ctx.Clone());
                SprEngine.FilterCompile(null, args);
                str = args.Text;
            }

            if (ctx.EncodeAsAutoTypeSequence)
            {
                str = StrUtil.NormalizeNewLines(str, false);
                str = str.Replace("\n", @"{ENTER}");
            }

            return(str);
        }
Ejemplo n.º 5
0
        public DirectoryEntry GetComputerDirectoryEntry(string computerName, string[] propertiesToLoad)
        {
            EntryUtil eu = new EntryUtil();

            return(eu.GetADDirectoryEntry(propertiesToLoad, EntryUtil.GetADComputerFilter(computerName)));
        }
Ejemplo n.º 6
0
        public DirectoryEntry GetUserDirectoryEntry(string userName, string[] propertiesToLoad, DirectoryEntry searchRoot)
        {
            EntryUtil eu = new EntryUtil();

            return(eu.GetADDirectoryEntry(propertiesToLoad, EntryUtil.GetADUserFilter(userName), searchRoot));
        }
Ejemplo n.º 7
0
        private static string CompileInternal(string strText, SprContext ctx,
                                              uint uRecursionLevel)
        {
            if (strText == null)
            {
                Debug.Assert(false); return(string.Empty);
            }
            if (ctx == null)
            {
                Debug.Assert(false); ctx = new SprContext();
            }

            if (uRecursionLevel >= SprEngine.MaxRecursionDepth)
            {
                Debug.Assert(false);                 // Most likely a recursive reference
                return(string.Empty);                // Do not return strText (endless loop)
            }

            string str = strText;

            bool bExt = ((ctx.Flags & (SprCompileFlags.ExtActive |
                                       SprCompileFlags.ExtNonActive)) != SprCompileFlags.None);

            if (bExt && (SprEngine.FilterCompilePre != null))
            {
                SprEventArgs args = new SprEventArgs(str, ctx.Clone());
                SprEngine.FilterCompilePre(null, args);
                str = args.Text;
            }

            if ((ctx.Flags & SprCompileFlags.Comments) != SprCompileFlags.None)
            {
                str = RemoveComments(str);
            }

            if ((ctx.Flags & SprCompileFlags.TextTransforms) != SprCompileFlags.None)
            {
                str = PerformTextTransforms(str, ctx, uRecursionLevel);
            }

            if ((ctx.Flags & SprCompileFlags.AppPaths) != SprCompileFlags.None)
            {
                str = AppLocator.FillPlaceholders(str, ctx);
            }

            if (ctx.Entry != null)
            {
                if ((ctx.Flags & SprCompileFlags.PickChars) != SprCompileFlags.None)
                {
                    str = ReplacePickPw(str, ctx, uRecursionLevel);
                }

                if ((ctx.Flags & SprCompileFlags.EntryStrings) != SprCompileFlags.None)
                {
                    str = FillEntryStrings(str, ctx, uRecursionLevel);
                }

                if ((ctx.Flags & SprCompileFlags.EntryStringsSpecial) != SprCompileFlags.None)
                {
                    // ctx.UrlRemoveSchemeOnce = true;
                    // str = SprEngine.FillIfExists(str, @"{URL:RMVSCM}",
                    //	ctx.Entry.Strings.GetSafe(PwDefs.UrlField), ctx, uRecursionLevel);
                    // Debug.Assert(!ctx.UrlRemoveSchemeOnce);

                    str = FillEntryStringsSpecial(str, ctx, uRecursionLevel);
                }

                if (((ctx.Flags & SprCompileFlags.PasswordEnc) != SprCompileFlags.None) &&
                    (str.IndexOf(@"{PASSWORD_ENC}", SprEngine.ScMethod) >= 0))
                {
                    string strPwCmp = SprEngine.FillIfExists(@"{PASSWORD}",
                                                             @"{PASSWORD}", ctx.Entry.Strings.GetSafe(PwDefs.PasswordField),
                                                             ctx.WithoutContentTransformations(), uRecursionLevel);

                    str = SprEngine.FillPlaceholder(str, @"{PASSWORD_ENC}",
                                                    StrUtil.EncryptString(strPwCmp), ctx);
                }

                if (((ctx.Flags & SprCompileFlags.Group) != SprCompileFlags.None) &&
                    (ctx.Entry.ParentGroup != null))
                {
                    str = SprEngine.FillIfExists(str, @"{GROUP}", new ProtectedString(
                                                     false, ctx.Entry.ParentGroup.Name), ctx, uRecursionLevel);

                    str = SprEngine.FillIfExists(str, @"{GROUPPATH}", new ProtectedString(
                                                     false, ctx.Entry.ParentGroup.GetFullPath()), ctx, uRecursionLevel);
                }
            }

            if ((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None)
            {
                str = SprEngine.FillIfExists(str, @"{APPDIR}", new ProtectedString(
                                                 false, UrlUtil.GetFileDirectory(m_strAppExePath, false, false)),
                                             ctx, uRecursionLevel);
            }

            if (ctx.Database != null)
            {
                if ((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None)
                {
                    // For backward compatibility only
                    str = SprEngine.FillIfExists(str, @"{DOCDIR}", new ProtectedString(
                                                     false, UrlUtil.GetFileDirectory(ctx.Database.IOConnectionInfo.Path,
                                                                                     false, false)), ctx, uRecursionLevel);

                    str = SprEngine.FillIfExists(str, @"{DB_PATH}", new ProtectedString(
                                                     false, ctx.Database.IOConnectionInfo.Path), ctx, uRecursionLevel);
                    str = SprEngine.FillIfExists(str, @"{DB_DIR}", new ProtectedString(
                                                     false, UrlUtil.GetFileDirectory(ctx.Database.IOConnectionInfo.Path,
                                                                                     false, false)), ctx, uRecursionLevel);
                    str = SprEngine.FillIfExists(str, @"{DB_NAME}", new ProtectedString(
                                                     false, UrlUtil.GetFileName(ctx.Database.IOConnectionInfo.Path)),
                                                 ctx, uRecursionLevel);
                    str = SprEngine.FillIfExists(str, @"{DB_BASENAME}", new ProtectedString(
                                                     false, UrlUtil.StripExtension(UrlUtil.GetFileName(
                                                                                       ctx.Database.IOConnectionInfo.Path))), ctx, uRecursionLevel);
                    str = SprEngine.FillIfExists(str, @"{DB_EXT}", new ProtectedString(
                                                     false, UrlUtil.GetExtension(ctx.Database.IOConnectionInfo.Path)),
                                                 ctx, uRecursionLevel);
                }
            }

            if ((ctx.Flags & SprCompileFlags.Paths) != SprCompileFlags.None)
            {
                str = SprEngine.FillIfExists(str, @"{ENV_DIRSEP}", new ProtectedString(
                                                 false, Path.DirectorySeparatorChar.ToString()), ctx, uRecursionLevel);

                string strPF86 = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
                if (string.IsNullOrEmpty(strPF86))
                {
                    strPF86 = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
                }
                if (strPF86 != null)
                {
                    str = SprEngine.FillIfExists(str, @"{ENV_PROGRAMFILES_X86}",
                                                 new ProtectedString(false, strPF86), ctx, uRecursionLevel);
                }
                else
                {
                    Debug.Assert(false);
                }
            }

            if ((ctx.Flags & SprCompileFlags.AutoType) != SprCompileFlags.None)
            {
                // Use Bksp instead of Del (in order to avoid Ctrl+Alt+Del);
                // https://sourceforge.net/p/keepass/discussion/329220/thread/4f1aa6b8/
                str = StrUtil.ReplaceCaseInsensitive(str, @"{CLEARFIELD}",
                                                     @"{HOME}+({END}){BKSP}{DELAY 50}");
            }

            if ((ctx.Flags & SprCompileFlags.DateTime) != SprCompileFlags.None)
            {
                DateTime dtNow = DateTime.Now;                 // Local time
                str = SprEngine.FillIfExists(str, @"{DT_YEAR}", new ProtectedString(
                                                 false, dtNow.Year.ToString("D4")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_MONTH}", new ProtectedString(
                                                 false, dtNow.Month.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_DAY}", new ProtectedString(
                                                 false, dtNow.Day.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_HOUR}", new ProtectedString(
                                                 false, dtNow.Hour.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_MINUTE}", new ProtectedString(
                                                 false, dtNow.Minute.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_SECOND}", new ProtectedString(
                                                 false, dtNow.Second.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_SIMPLE}", new ProtectedString(
                                                 false, dtNow.ToString("yyyyMMddHHmmss")), ctx, uRecursionLevel);

                dtNow = dtNow.ToUniversalTime();
                str   = SprEngine.FillIfExists(str, @"{DT_UTC_YEAR}", new ProtectedString(
                                                   false, dtNow.Year.ToString("D4")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_UTC_MONTH}", new ProtectedString(
                                                 false, dtNow.Month.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_UTC_DAY}", new ProtectedString(
                                                 false, dtNow.Day.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_UTC_HOUR}", new ProtectedString(
                                                 false, dtNow.Hour.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_UTC_MINUTE}", new ProtectedString(
                                                 false, dtNow.Minute.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_UTC_SECOND}", new ProtectedString(
                                                 false, dtNow.Second.ToString("D2")), ctx, uRecursionLevel);
                str = SprEngine.FillIfExists(str, @"{DT_UTC_SIMPLE}", new ProtectedString(
                                                 false, dtNow.ToString("yyyyMMddHHmmss")), ctx, uRecursionLevel);
            }

            if ((ctx.Flags & SprCompileFlags.References) != SprCompileFlags.None)
            {
                str = SprEngine.FillRefPlaceholders(str, ctx, uRecursionLevel);
            }

            if (((ctx.Flags & SprCompileFlags.EnvVars) != SprCompileFlags.None) &&
                (str.IndexOf('%') >= 0))
            {
                // Replace environment variables
                foreach (DictionaryEntry de in Environment.GetEnvironmentVariables())
                {
                    string strKey   = (de.Key as string);
                    string strValue = (de.Value as string);

                    if ((strKey != null) && (strValue != null))
                    {
                        str = SprEngine.FillIfExists(str, @"%" + strKey + @"%",
                                                     new ProtectedString(false, strValue), ctx, uRecursionLevel);
                    }
                    else
                    {
                        Debug.Assert(false);
                    }
                }
            }

            if ((ctx.Flags & SprCompileFlags.Env) != SprCompileFlags.None)
            {
                str = FillUriSpecial(str, ctx, @"{BASE", (ctx.Base ?? string.Empty),
                                     ctx.BaseIsEncoded, uRecursionLevel);
            }

            str = EntryUtil.FillPlaceholders(str, ctx, uRecursionLevel);

            if ((ctx.Flags & SprCompileFlags.PickChars) != SprCompileFlags.None)
            {
                str = ReplacePickChars(str, ctx, uRecursionLevel);
            }

            if (bExt && (SprEngine.FilterCompile != null))
            {
                SprEventArgs args = new SprEventArgs(str, ctx.Clone());
                SprEngine.FilterCompile(null, args);
                str = args.Text;
            }

            if (ctx.EncodeAsAutoTypeSequence)
            {
                str = StrUtil.NormalizeNewLines(str, false);
                str = str.Replace("\n", @"{ENTER}");
            }

            return(str);
        }
Ejemplo n.º 8
0
        private static string CompileInternal(string strText, PwEntry pwEntry,
                                              PwDatabase pwDatabase, SprContentFlags cf, uint uRecursionLevel,
                                              SprRefsCache vRefsCache)
        {
            if (strText == null)
            {
                Debug.Assert(false); return(string.Empty);
            }

            if (uRecursionLevel >= SprEngine.MaxRecursionDepth)
            {
                Debug.Assert(false);                 // Most likely a recursive reference
                return(string.Empty);                // Do not return strText
            }

            string str = strText;

            str = AppLocator.FillPlaceholders(str, cf);
            str = EntryUtil.FillPlaceholders(str, pwEntry, pwDatabase, cf);

            if (pwEntry != null)
            {
                List <string> vKeys = pwEntry.Strings.GetKeys();

                // Ensure that all standard field names are in the list
                // (this is required in order to replace the standard placeholders
                // even if the corresponding standard field isn't present in
                // the entry)
                List <string> vStdNames = PwDefs.GetStandardFields();
                foreach (string strStdField in vStdNames)
                {
                    if (!vKeys.Contains(strStdField))
                    {
                        vKeys.Add(strStdField);
                    }
                }

                // Do not directly enumerate the strings in pwEntry.Strings,
                // because strings might change during the Spr compilation
                foreach (string strField in vKeys)
                {
                    string strKey = (PwDefs.IsStandardField(strField) ?
                                     (@"{" + strField + @"}") :
                                     (@"{" + PwDefs.AutoTypeStringPrefix + strField + @"}"));

                    // Use GetSafe because the field doesn't necessarily exist
                    // (might be a standard field that has been added above)
                    str = SprEngine.FillIfExists(str, strKey, pwEntry.Strings.GetSafe(
                                                     strField), pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
                }

                if (cf != null)
                {
                    cf.UrlRemoveSchemeOnce = true;
                }
                str = SprEngine.FillIfExists(str, @"{URL:RMVSCM}",
                                             pwEntry.Strings.GetSafe(PwDefs.UrlField), pwEntry,
                                             pwDatabase, cf, uRecursionLevel, vRefsCache);
                if (cf != null)
                {
                    Debug.Assert(!cf.UrlRemoveSchemeOnce);
                }

                if (str.IndexOf(@"{PASSWORD_ENC}", SprEngine.ScMethod) >= 0)
                {
                    str = SprEngine.FillIfExists(str, @"{PASSWORD_ENC}", new ProtectedString(false,
                                                                                             StrUtil.EncryptString(pwEntry.Strings.ReadSafe(PwDefs.PasswordField))),
                                                 pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
                }

                if (pwEntry.ParentGroup != null)
                {
                    str = SprEngine.FillIfExists(str, @"{GROUP}", new ProtectedString(
                                                     false, pwEntry.ParentGroup.Name), pwEntry, pwDatabase,
                                                 cf, uRecursionLevel, vRefsCache);

                    str = SprEngine.FillIfExists(str, @"{GROUPPATH}", new ProtectedString(
                                                     false, pwEntry.ParentGroup.GetFullPath()), pwEntry, pwDatabase,
                                                 cf, uRecursionLevel, vRefsCache);
                }
            }

            if (m_strAppExePath != null)
            {
                str = SprEngine.FillIfExists(str, @"{APPDIR}", new ProtectedString(
                                                 false, UrlUtil.GetFileDirectory(m_strAppExePath, false, false)),
                                             pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
            }

            if (pwDatabase != null)
            {
                // For backward compatibility only
                str = SprEngine.FillIfExists(str, @"{DOCDIR}", new ProtectedString(
                                                 false, UrlUtil.GetFileDirectory(pwDatabase.IOConnectionInfo.Path,
                                                                                 false, false)), pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);

                str = SprEngine.FillIfExists(str, @"{DB_PATH}", new ProtectedString(
                                                 false, pwDatabase.IOConnectionInfo.Path), pwEntry, pwDatabase,
                                             cf, uRecursionLevel, vRefsCache);
                str = SprEngine.FillIfExists(str, @"{DB_DIR}", new ProtectedString(
                                                 false, UrlUtil.GetFileDirectory(pwDatabase.IOConnectionInfo.Path,
                                                                                 false, false)), pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
                str = SprEngine.FillIfExists(str, @"{DB_NAME}", new ProtectedString(
                                                 false, UrlUtil.GetFileName(pwDatabase.IOConnectionInfo.Path)),
                                             pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
                str = SprEngine.FillIfExists(str, @"{DB_BASENAME}", new ProtectedString(
                                                 false, UrlUtil.StripExtension(UrlUtil.GetFileName(
                                                                                   pwDatabase.IOConnectionInfo.Path))), pwEntry, pwDatabase, cf,
                                             uRecursionLevel, vRefsCache);
                str = SprEngine.FillIfExists(str, @"{DB_EXT}", new ProtectedString(
                                                 false, UrlUtil.GetExtension(pwDatabase.IOConnectionInfo.Path)),
                                             pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
            }

            str = SprEngine.FillIfExists(str, @"{ENV_DIRSEP}", new ProtectedString(
                                             false, Path.DirectorySeparatorChar.ToString()), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);

            DateTime dtNow = DateTime.Now;             // Local time

            str = SprEngine.FillIfExists(str, @"{DT_YEAR}", new ProtectedString(
                                             false, dtNow.Year.ToString("D4")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_MONTH}", new ProtectedString(
                                             false, dtNow.Month.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_DAY}", new ProtectedString(
                                             false, dtNow.Day.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_HOUR}", new ProtectedString(
                                             false, dtNow.Hour.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_MINUTE}", new ProtectedString(
                                             false, dtNow.Minute.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_SECOND}", new ProtectedString(
                                             false, dtNow.Second.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_SIMPLE}", new ProtectedString(
                                             false, dtNow.ToString("yyyyMMddHHmmss")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);

            dtNow = dtNow.ToUniversalTime();
            str   = SprEngine.FillIfExists(str, @"{DT_UTC_YEAR}", new ProtectedString(
                                               false, dtNow.Year.ToString("D4")), pwEntry, pwDatabase, cf,
                                           uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_UTC_MONTH}", new ProtectedString(
                                             false, dtNow.Month.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_UTC_DAY}", new ProtectedString(
                                             false, dtNow.Day.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_UTC_HOUR}", new ProtectedString(
                                             false, dtNow.Hour.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_UTC_MINUTE}", new ProtectedString(
                                             false, dtNow.Minute.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_UTC_SECOND}", new ProtectedString(
                                             false, dtNow.Second.ToString("D2")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);
            str = SprEngine.FillIfExists(str, @"{DT_UTC_SIMPLE}", new ProtectedString(
                                             false, dtNow.ToString("yyyyMMddHHmmss")), pwEntry, pwDatabase, cf,
                                         uRecursionLevel, vRefsCache);

            str = SprEngine.FillRefPlaceholders(str, pwDatabase, cf, uRecursionLevel,
                                                vRefsCache);

            // Replace environment variables
            foreach (DictionaryEntry de in Environment.GetEnvironmentVariables())
            {
                string strKey   = (de.Key as string);
                string strValue = (de.Value as string);

                if ((strKey != null) && (strValue != null))
                {
                    str = SprEngine.FillIfExists(str, @"%" + strKey + @"%",
                                                 new ProtectedString(false, strValue), pwEntry, pwDatabase,
                                                 cf, uRecursionLevel, vRefsCache);
                }
                else
                {
                    Debug.Assert(false);
                }
            }

            str = EntryUtil.FillPlaceholdersFinal(str, pwEntry, pwDatabase, cf);
            return(str);
        }
Ejemplo n.º 9
0
        private static void ImportRecords(JsonObject[] v, PwDatabase pd)
        {
            if (v == null)
            {
                Debug.Assert(false); return;
            }

            Dictionary <string, PwGroup> dGroups = new Dictionary <string, PwGroup>();
            string strGroupSep   = MemUtil.ByteArrayToHexString(Guid.NewGuid().ToByteArray());
            string strBackspCode = MemUtil.ByteArrayToHexString(Guid.NewGuid().ToByteArray());

            foreach (JsonObject jo in v)
            {
                if (jo == null)
                {
                    Debug.Assert(false); continue;
                }

                PwEntry pe = new PwEntry(true, true);

                ImportUtil.AppendToField(pe, PwDefs.TitleField,
                                         jo.GetValue <string>("title"), pd);
                ImportUtil.AppendToField(pe, PwDefs.UserNameField,
                                         jo.GetValue <string>("login"), pd);
                ImportUtil.AppendToField(pe, PwDefs.PasswordField,
                                         jo.GetValue <string>("password"), pd);
                ImportUtil.AppendToField(pe, PwDefs.UrlField,
                                         jo.GetValue <string>("login_url"), pd);
                ImportUtil.AppendToField(pe, PwDefs.NotesField,
                                         jo.GetValue <string>("notes"), pd);

                JsonObject joCustom = jo.GetValue <JsonObject>("custom_fields");
                if (joCustom != null)
                {
                    foreach (KeyValuePair <string, object> kvp in joCustom.Items)
                    {
                        string strValue = (kvp.Value as string);
                        if (strValue == null)
                        {
                            Debug.Assert(false); continue;
                        }

                        if (kvp.Key == "TFC:Keeper")
                        {
                            EntryUtil.ImportOtpAuth(pe, strValue, pd);
                        }
                        else
                        {
                            ImportUtil.AppendToField(pe, kvp.Key, strValue, pd);
                        }
                    }
                }

                PwGroup      pg       = null;
                JsonObject[] vFolders = jo.GetValueArray <JsonObject>("folders");
                if ((vFolders != null) && (vFolders.Length >= 1))
                {
                    JsonObject joFolder = vFolders[0];
                    if (joFolder != null)
                    {
                        string strGroup = joFolder.GetValue <string>("folder");
                        if (!string.IsNullOrEmpty(strGroup))
                        {
                            strGroup = strGroup.Replace("\\\\", strBackspCode);
                            strGroup = strGroup.Replace("\\", strGroupSep);
                            strGroup = strGroup.Replace(strBackspCode, "\\");

                            if (!dGroups.TryGetValue(strGroup, out pg))
                            {
                                pg = pd.RootGroup.FindCreateSubTree(strGroup,
                                                                    new string[] { strGroupSep }, true);
                                dGroups[strGroup] = pg;
                            }
                        }
                        else
                        {
                            Debug.Assert(false);
                        }
                    }
                    else
                    {
                        Debug.Assert(false);
                    }
                }
                if (pg == null)
                {
                    pg = pd.RootGroup;
                }

                pg.AddEntry(pe, true);
            }
        }
Ejemplo n.º 10
0
        private static string CompileInternal(string strText, PwEntry pwEntry,
                                              PwDatabase pwDatabase, SprContentFlags cf, uint uRecursionLevel,
                                              SprRefsCache vRefsCache)
        {
            if (strText == null)
            {
                Debug.Assert(false); return(string.Empty);
            }

            if (uRecursionLevel >= SprEngine.MaxRecursionDepth)
            {
                Debug.Assert(false);                 // Most likely a recursive reference
                return(string.Empty);                // Do not return strText
            }

            string str = strText;

            str = AppLocator.FillPlaceholders(str, cf);
            str = EntryUtil.FillPlaceholders(str, pwEntry, cf);

            if (pwEntry != null)
            {
                foreach (KeyValuePair <string, ProtectedString> kvp in pwEntry.Strings)
                {
                    string strKey = PwDefs.IsStandardField(kvp.Key) ?
                                    (@"{" + kvp.Key + @"}") :
                                    (@"{" + PwDefs.AutoTypeStringPrefix + kvp.Key + @"}");

                    str = SprEngine.FillIfExists(str, strKey, kvp.Value, pwEntry,
                                                 pwDatabase, cf, uRecursionLevel, vRefsCache);
                }

                if (pwEntry.ParentGroup != null)
                {
                    str = SprEngine.FillIfExists(str, @"{GROUP}", new ProtectedString(
                                                     false, pwEntry.ParentGroup.Name), pwEntry, pwDatabase,
                                                 cf, uRecursionLevel, vRefsCache);

                    str = SprEngine.FillIfExists(str, @"{GROUPPATH}", new ProtectedString(
                                                     false, pwEntry.ParentGroup.GetFullPath()), pwEntry, pwDatabase,
                                                 cf, uRecursionLevel, vRefsCache);
                }
            }

            if (m_strAppExePath != null)
            {
                str = SprEngine.FillIfExists(str, @"{APPDIR}", new ProtectedString(
                                                 false, UrlUtil.GetFileDirectory(m_strAppExePath, false)),
                                             pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
            }

            if (pwDatabase != null)
            {
                str = SprEngine.FillIfExists(str, @"{DOCDIR}", new ProtectedString(
                                                 false, UrlUtil.GetFileDirectory(pwDatabase.IOConnectionInfo.Path, false)),
                                             pwEntry, pwDatabase, cf, uRecursionLevel, vRefsCache);
            }

            str = SprEngine.FillRefPlaceholders(str, pwDatabase, cf, uRecursionLevel,
                                                vRefsCache);

            // Replace environment variables
            foreach (DictionaryEntry de in Environment.GetEnvironmentVariables())
            {
                string strKey   = de.Key as string;
                string strValue = de.Value as string;

                if ((strKey != null) && (strValue != null))
                {
                    str = SprEngine.FillIfExists(str, @"%" + strKey + @"%",
                                                 new ProtectedString(false, strValue), pwEntry, pwDatabase,
                                                 cf, uRecursionLevel, vRefsCache);
                }
                else
                {
                    Debug.Assert(false);
                }
            }

            return(str);
        }
Ejemplo n.º 11
0
 public DirectoryEntry GetUserDirectoryEntry(string userName, string[] propertiesToLoad, DirectoryEntry searchRoot)
 {
     EntryUtil eu = new EntryUtil();
     return eu.GetADDirectoryEntry(propertiesToLoad, EntryUtil.GetADUserFilter(userName), searchRoot);
 }
Ejemplo n.º 12
0
 public DirectoryEntry GetComputerDirectoryEntry(string computerName, string[] propertiesToLoad)
 {
     EntryUtil eu = new EntryUtil();
     return eu.GetADDirectoryEntry(propertiesToLoad, EntryUtil.GetADComputerFilter(computerName));
 }