private static string ReplaceNewPasswordPlaceholder(string strText, SprContext ctx, uint uRecursionLevel) { PwEntry pe = ctx.Entry; PwDatabase pd = ctx.Database; if ((pe == null) || (pd == null)) { return(strText); } string str = strText; const string strNewPwStart = @"{NEWPASSWORD"; if (str.IndexOf(strNewPwStart, StrUtil.CaseIgnoreCmp) < 0) { return(str); } string strGen = null; int iStart; List <string> lParams; while (SprEngine.ParseAndRemovePlhWithParams(ref str, ctx, uRecursionLevel, strNewPwStart + ":", out iStart, out lParams, true)) { if (strGen == null) { strGen = GeneratePassword((((lParams != null) && (lParams.Count > 0)) ? lParams[0] : string.Empty), ctx); } string strIns = SprEngine.TransformContent(strGen, ctx); str = str.Insert(iStart, strIns); } const string strNewPwPlh = strNewPwStart + @"}"; if (str.IndexOf(strNewPwPlh, StrUtil.CaseIgnoreCmp) >= 0) { if (strGen == null) { strGen = GeneratePassword(null, ctx); } string strIns = SprEngine.TransformContent(strGen, ctx); str = StrUtil.ReplaceCaseInsensitive(str, strNewPwPlh, strIns); } if (strGen != null) { pe.CreateBackup(pd); ProtectedString psGen = new ProtectedString( pd.MemoryProtection.ProtectPassword, strGen); pe.Strings.Set(PwDefs.PasswordField, psGen); pe.Touch(true, false); pd.Modified = true; } else { Debug.Assert(false); } return(str); }