private EMFStringFormat(byte[] RecordData)        
        {
            ObjectType = EmfObjectType.stringformat;
            myStringFormat = new System.Drawing.StringFormat();
            //put the Data into a stream and use a binary reader to read the data
            MemoryStream _ms = new MemoryStream(RecordData);
            BinaryReader _br = new BinaryReader(_ms);           
            _br.ReadUInt32(); //Who cares about version..not me!            
            myStringFormat.FormatFlags = (StringFormatFlags)_br.ReadUInt32();
            _br.ReadBytes(4);//Language...Ignore for now!
            myStringFormat.LineAlignment = (StringAlignment)_br.ReadUInt32();
            myStringFormat.Alignment = (StringAlignment)_br.ReadUInt32();
            UInt32 DigitSubstitutionMethod = _br.ReadUInt32();
            UInt32 DigitSubstitutionLanguage = _br.ReadUInt32();
            myStringFormat.SetDigitSubstitution((int)DigitSubstitutionLanguage, (StringDigitSubstitute)DigitSubstitutionMethod);
            
            Single FirstTabOffSet = _br.ReadSingle();

            myStringFormat.HotkeyPrefix = (System.Drawing.Text.HotkeyPrefix) _br.ReadInt32();

             _br.ReadSingle();//leading Margin
             _br.ReadSingle();//trailingMargin           
             _br.ReadSingle();//tracking
            myStringFormat.Trimming = (StringTrimming)_br.ReadUInt32();           
            Int32 TabStopCount = _br.ReadInt32();
            Int32 RangeCount = _br.ReadInt32();
            //Next is stringformatdata...
            Single[] TabStopArray;           
            System.Drawing.CharacterRange[] RangeArray;

            if (TabStopCount > 0)
            {
                TabStopArray = new Single[TabStopCount];
                for (int i = 0; i < TabStopCount; i++)
                {
                    TabStopArray[i] = _br.ReadSingle();
                }
                myStringFormat.SetTabStops(FirstTabOffSet, TabStopArray);
            }

            if (RangeCount > 0)
            {
                RangeArray = new System.Drawing.CharacterRange[RangeCount];
                for (int i = 0; i < RangeCount; i++)
                {
                    RangeArray[i].First = _br.ReadInt32();
                    RangeArray[i].Length = _br.ReadInt32();
                }
                myStringFormat.SetMeasurableCharacterRanges(RangeArray);
            }
        }
        public override void ExecuteResult(ControllerContext context)
        {

            if (context.RequestContext.HttpContext.Request.UrlReferrer.AbsolutePath ==
                context.RequestContext.HttpContext.Request.Url.AbsolutePath)
                throw new InvalidOperationException();

            //-- ایجاد یک تصویر نقشه بیتی 32 بیتی
            Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);

            //-- ایجاد یک شیء گرافیکی برای عملیات ترسیم روی تصویر امنیتی
            Graphics gfxCaptchaImage = Graphics.FromImage(bitmap);
            gfxCaptchaImage.PageUnit = GraphicsUnit.Pixel;
            gfxCaptchaImage.SmoothingMode = SmoothingMode.HighQuality;

            //-- پاک کردن پس زمینه تصویر امنیتی با یک رنگ سفید
            gfxCaptchaImage.Clear(_backGroundColor);

            //-- ایجاد یک عدد اتفاقی بین 1000 و 9999
            int salt = CaptchaHelpers.CreateSalt();


            //-- تاریخ فعلی (فقط روز فعلی) باید به کلید رمزنگاری اطلاعات اضافه شود
            //-- این کار به این هدف متفاوت بودن کلید رمزنگاری اطلاعات در هر روز صورت گرفته است
            string encryptionSaltKey = EncryptionKey + DateTime.Now.Date.ToString(CultureInfo.InvariantCulture);

            //-- چسباندن عدد اتفاقی تولید شده به تاریخ و زمان فعلی با یک جدا کننده
            //-- توضیح: تاریخ و زمان فعلی باید در کورکی ذخیره شود تا هنگام رمزگشایی 
            //-- اطلاعات، اختلاف زمانی فی ما بین زمان ارسال فرم به مرورگر کاربر و زمان
            //-- ارسال فرم به سرور توسط کاربر محاسبه شود
            string plainText = salt.ToString(CultureInfo.InvariantCulture) + "," + DateTime.Now.ToString(CultureInfo.InvariantCulture);

            //-- رمزنگاری مقدار متغیر بالا جهت ذخیره در کوکی
            string encryptedValue = (plainText).Encrypt(encryptionSaltKey);

            //-- ذخیره کردن رشته رمزنگاری شده در کوکی
            HttpCookie cookie = new HttpCookie("captchastring");
            cookie.Value = encryptedValue;
            HttpContext.Current.Response.Cookies.Add(cookie);

            //-- تبدیل عدد اتفاقی تولید شده به حروف معادل
            string randomString = (salt).NumberToText(Language.Persian);

            //-- تنظیمات فرمت متن تصویر امنیتی
            var format = new StringFormat();
            int faLCID = new System.Globalization.CultureInfo("fa-IR").LCID;
            format.SetDigitSubstitution(faLCID, StringDigitSubstitute.National);
            format.Alignment = StringAlignment.Center;
            format.LineAlignment = StringAlignment.Center;
            format.FormatFlags = StringFormatFlags.DirectionRightToLeft;

            //-- نوع و اندازه قلم تصویر امنیتی
            Font font = new Font(CaptchaFontFamily, CaptchaFontSize);

            //-- ایجاد یک مسیر گرافیکی در تصویر امنیتی
            GraphicsPath path = new GraphicsPath();

            path.AddString(randomString,
                font.FontFamily,
                (int)font.Style,
                (gfxCaptchaImage.DpiY * font.SizeInPoints / 72),
                new Rectangle(0, 0, Width, Height),
                format);

            Random random = new Random();

            //-- ایجاد رنگ متن تصویر امنیتی به صورت اتفاقی
            Pen pen = new Pen(Color.FromArgb(random.Next(0, 100), random.Next(0, 100), random.Next(0, 100)));
            gfxCaptchaImage.DrawPath(pen, path);

            //-- ایجاد یک موج سینوسی و کسینوسی اتفاقی برای نوشتن حروف کد امنیتی در آن
            int distortion = random.Next(-10, 10);
            using (Bitmap copy = (Bitmap)bitmap.Clone())
            {
                for (int y = 0; y < Height; y++)
                {
                    for (int x = 0; x < Width; x++)
                    {
                        int newX = (int)(x + (distortion * Math.Sin(Math.PI * y / 64.0)));
                        int newY = (int)(y + (distortion * Math.Cos(Math.PI * x / 64.0)));
                        if (newX < 0 || newX >= Width) newX = 0;
                        if (newY < 0 || newY >= Height) newY = 0;
                        bitmap.SetPixel(x, y, copy.GetPixel(newX, newY));
                    }
                }
            }

            //-- اضافه کردن نویز به تصویر امنیتی
            //int i, r, xx, yy, u, v;
            //for (i = 1; i < 10; i++)
            //{
            //    pen.Color = Color.FromArgb((random.Next(0, 255)), (random.Next(0, 255)), (random.Next(0, 255)));
            //    r = random.Next(0, (Width / 3));
            //    xx = random.Next(0, Width);
            //    yy = random.Next(0, Height);
            //    u = xx - r;
            //    v = yy - r;
            //    gfxCaptchaImage.DrawEllipse(pen, u, v, r, r);
            //}

            //-- رسم تصویر امنیتی
            gfxCaptchaImage.DrawImage(bitmap, new Point(0, 0));
            gfxCaptchaImage.Flush();

            //-- خروجی به عنوان یک تصویر jpeg و به صورت جریان به مرورگر کاربر فرستاده می شود
            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = "image/jpeg";
            context.HttpContext.DisableBrowserCache();
            bitmap.Save(response.OutputStream, ImageFormat.Jpeg);

            //-- آزاد سازی حافظه های اشغال شده
            font.Dispose();
            gfxCaptchaImage.Dispose();
            bitmap.Dispose();
        }
Beispiel #3
0
		public void SetDigitSubstitution ()
		{
			using (StringFormat sf = new StringFormat ()) {
				sf.SetDigitSubstitution (Int32.MinValue, (StringDigitSubstitute) Int32.MinValue);
				Assert.AreEqual (0, sf.DigitSubstitutionLanguage, "DigitSubstitutionLanguage");
				Assert.AreEqual ((StringDigitSubstitute) Int32.MinValue, sf.DigitSubstitutionMethod, "DigitSubstitutionMethod");
			}
		}
Beispiel #4
0
		internal StringFormat loadStringFormat()
		{
			int nullMrk = reader.ReadInt32();
			if (nullMrk == 0)
				return null;

			StringAlignment al;
			int dsl;
			StringDigitSubstitute dsm;
			StringFormatFlags sff;
			System.Drawing.Text.HotkeyPrefix hp;
			StringAlignment lal;
			StringTrimming tr;
			float fto;
			float[] ts;

			al = (StringAlignment)reader.ReadInt32();
			dsl = reader.ReadInt32();
			dsm = (StringDigitSubstitute)reader.ReadInt32();
			sff = (StringFormatFlags)reader.ReadInt32();
			hp = (System.Drawing.Text.HotkeyPrefix)reader.ReadInt32();
			lal = (StringAlignment)reader.ReadInt32();
			tr = (StringTrimming)reader.ReadInt32();
			fto = (float)reader.ReadDouble();
			int len = reader.ReadInt32();
			ts = new float[len];
			for (int i = 0; i < len; ++i)
				ts[i] = (float)reader.ReadDouble();

			StringFormat res = new StringFormat(sff);
			res.Alignment = al;
			res.LineAlignment = lal;
			res.SetDigitSubstitution(dsl, dsm);
			res.HotkeyPrefix = hp;
			res.Trimming = tr;
			res.SetTabStops(fto, ts);
			return res;
		}