FillIfExists() private static method

private static FillIfExists ( string strData, string strPlaceholder, ProtectedString psParsable, SprContext ctx, uint uRecursionLevel ) : string
strData string
strPlaceholder string
psParsable KeePassLib.Security.ProtectedString
ctx SprContext
uRecursionLevel uint
return string
Example #1
0
        private static string FillEntryStrings(string str, SprContext ctx,
                                               uint uRecursionLevel)
        {
            List <string> vKeys = ctx.Entry.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 ctx.Entry.Strings,
            // because strings might change during the Spr compilation
            foreach (string strField in vKeys)
            {
                string strKey = (PwDefs.IsStandardField(strField) ?
                                 (@"{" + strField + @"}") :
                                 (@"{" + PwDefs.AutoTypeStringPrefix + strField + @"}"));

                if (!ctx.ForcePlainTextPasswords && strKey.Equals(@"{" +
                                                                  PwDefs.PasswordField + @"}", StrUtil.CaseIgnoreCmp) &&
                    Program.Config.MainWindow.IsColumnHidden(AceColumnType.Password))
                {
                    str = SprEngine.FillIfExists(str, strKey, new ProtectedString(
                                                     false, PwDefs.HiddenPassword), ctx, uRecursionLevel);
                    continue;
                }

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

            return(str);
        }
Example #2
0
        private static string FillEntryStringsSpecial(string str, SprContext ctx,
                                                      uint uRecursionLevel)
        {
            if ((str.IndexOf(UrlSpecialRmvScm, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialScm, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialHost, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialPort, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialPath, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialQuery, SprEngine.ScMethod) >= 0))
            {
                SprContext ctxRaw = ctx.WithoutContentTransformations();
                string     strUrl = SprEngine.FillIfExists(@"{URL}", @"{URL}",
                                                           ctx.Entry.Strings.GetSafe(PwDefs.UrlField), ctxRaw, uRecursionLevel);

                str = SprEngine.FillPlaceholder(str, UrlSpecialRmvScm,
                                                UrlUtil.RemoveScheme(strUrl), ctx);

                try
                {
                    Uri uri = new Uri(strUrl);

                    str = SprEngine.FillPlaceholder(str, UrlSpecialScm,
                                                    uri.Scheme, ctx);
                    str = SprEngine.FillPlaceholder(str, UrlSpecialHost,
                                                    uri.Host, ctx);
                    str = SprEngine.FillPlaceholder(str, UrlSpecialPort,
                                                    uri.Port.ToString(NumberFormatInfo.InvariantInfo), ctx);
                    str = SprEngine.FillPlaceholder(str, UrlSpecialPath,
                                                    uri.AbsolutePath, ctx);
                    str = SprEngine.FillPlaceholder(str, UrlSpecialQuery,
                                                    uri.Query, ctx);
                }
                catch (Exception) { }                // Invalid URI
            }

            return(str);
        }
Example #3
0
        private static string FillGroupPlh(string strData, string strPlhPrefix,
                                           PwGroup pg, SprContext ctx, uint uRecursionLevel)
        {
            Debug.Assert(strPlhPrefix.StartsWith("{"));
            Debug.Assert(!strPlhPrefix.EndsWith("_"));
            Debug.Assert(!strPlhPrefix.EndsWith("}"));

            string str = strData;

            str = SprEngine.FillIfExists(str, strPlhPrefix + @"}",
                                         new ProtectedString(false, pg.Name), ctx, uRecursionLevel);

            ProtectedString psGroupPath = new ProtectedString(false, pg.GetFullPath());

            str = SprEngine.FillIfExists(str, strPlhPrefix + @"_PATH}", psGroupPath,
                                         ctx, uRecursionLevel);
            str = SprEngine.FillIfExists(str, strPlhPrefix + @"PATH}", psGroupPath,
                                         ctx, uRecursionLevel); // Obsolete; for backward compatibility

            str = SprEngine.FillIfExists(str, strPlhPrefix + @"_NOTES}",
                                         new ProtectedString(false, pg.Notes), ctx, uRecursionLevel);

            return(str);
        }
Example #4
0
        private static string FillEntryStringsSpecial(string str, SprContext ctx,
                                                      uint uRecursionLevel)
        {
            if ((str.IndexOf(UrlSpecialRmvScm, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialScm, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialHost, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialPort, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialPath, SprEngine.ScMethod) >= 0) ||
                (str.IndexOf(UrlSpecialQuery, SprEngine.ScMethod) >= 0))
            {
                string strUrl = SprEngine.FillIfExists(@"{URL}", @"{URL}",
                                                       ctx.Entry.Strings.GetSafe(PwDefs.UrlField), ctx, uRecursionLevel);

                str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialRmvScm,
                                                     UrlUtil.RemoveScheme(strUrl));

                try
                {
                    Uri uri = new Uri(strUrl);

                    str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialScm,
                                                         uri.Scheme);
                    str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialHost,
                                                         uri.Host);
                    str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialPort,
                                                         uri.Port.ToString());
                    str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialPath,
                                                         uri.AbsolutePath);
                    str = StrUtil.ReplaceCaseInsensitive(str, UrlSpecialQuery,
                                                         uri.Query);
                }
                catch (Exception) { }                // Invalid URI
            }

            return(str);
        }
Example #5
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.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);
                }

                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 = 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.UtcNow;
                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);

                dtNow = dtNow.ToLocalTime();
                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);
            }

            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);
        }
Example #6
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);
        }
Example #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;

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

            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.UrlRmvScm) != SprCompileFlags.None)
                {
                    ctx.UrlRemoveSchemeOnce = true;
                    str = SprEngine.FillIfExists(str, @"{URL:RMVSCM}",
                                                 ctx.Entry.Strings.GetSafe(PwDefs.UrlField), ctx, uRecursionLevel);
                    Debug.Assert(!ctx.UrlRemoveSchemeOnce);
                }

                if (((ctx.Flags & SprCompileFlags.PasswordEnc) != SprCompileFlags.None) &&
                    (str.IndexOf(@"{PASSWORD_ENC}", SprEngine.ScMethod) >= 0))
                {
                    str = SprEngine.FillIfExists(str, @"{PASSWORD_ENC}", new ProtectedString(false,
                                                                                             StrUtil.EncryptString(ctx.Entry.Strings.ReadSafe(PwDefs.PasswordField))),
                                                 ctx, uRecursionLevel);
                }

                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)
            {
                str = StrUtil.ReplaceCaseInsensitive(str, @"{CLEARFIELD}",
                                                     @"{HOME}+({END}){DEL}{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);
                    }
                }
            }

            str = EntryUtil.FillPlaceholders(str, ctx);

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

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

            return(str);
        }
Example #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, 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);
        }