protected void SetUpStudents()
        {
            if (Request.IsMobileDevice())
            {
                mfbIlOfflineEndorsements.Columns = 1;
            }
            mfuOfflineEndorsements.Class = MyFlightbook.Image.MFBImageInfo.ImageClass.OfflineEndorsement;
            mfbIlOfflineEndorsements.Key = Page.User.Identity.Name;
            mfbIlOfflineEndorsements.Refresh();
            byte[] rgbDefaultScribble = CFIStudentMap.DefaultScribbleForInstructor(m_pf);
            mvDefaultSig.SetActiveView(vwCurrentSig);
            if (rgbDefaultScribble == null || rgbDefaultScribble.Length == 0)
            {
                lnkEditDefaultSig.Text = Resources.LocalizedText.StudentSigningDefaultScribbleAdd;
                imgCurrSig.Src         = string.Empty;
            }
            else
            {
                imgCurrSig.Src = ScribbleImage.DataLinkForByteArray(rgbDefaultScribble);
            }

            Profile pf = Profile.GetUser(Page.User.Identity.Name);

            pnlCertificate.Visible          = String.IsNullOrEmpty(pf.Certificate);
            txtCertificate.Text             = pf.Certificate;
            mfbTypeInDateCFIExpiration.Date = pf.CertificateExpiration;

            mfbScribbleSignature.WatermarkRef = ResolveClientUrl("~/images/rubberstamp.png");
        }
 protected void btnSaveDefaultSig_Click(object sender, EventArgs e)
 {
     byte[] rgbSig = mfbScribbleSignature.Base64Data();
     CFIStudentMap.SetDefaultScribbleForInstructor(m_pf, rgbSig);
     imgCurrSig.Src         = ScribbleImage.DataLinkForByteArray(rgbSig);
     imgCurrSig.Visible     = (rgbSig.Length != 0);
     lnkEditDefaultSig.Text = (rgbSig.Length == 0) ? Resources.LocalizedText.StudentSigningDefaultScribbleAdd : Resources.LocalizedText.StudentSigningDefaultScribbleEdit;
     mvDefaultSig.SetActiveView(vwCurrentSig);
 }
        protected void Page_Load(object sender, EventArgs e)
        {
            Master.SelectedTab = tabID.tabTraining;

            if (!IsPostBack)
            {
                hdnStudent.Value = Page.User.Identity.Name; //default
                string            szStudent = util.GetStringParam(Request, "student");
                CFIStudentMap     sm        = new CFIStudentMap(Page.User.Identity.Name);
                InstructorStudent student   = CFIStudentMap.GetInstructorStudent(sm.Students, szStudent);
                if (student == null)
                {
                    lblErr.Text = Resources.SignOff.ViewStudentNoSuchStudent;
                }
                else
                {
                    if (!student.CanViewLogbook)
                    {
                        lblErr.Text = Master.Title = Resources.SignOff.ViewStudentLogbookUnauthorized;
                    }
                    else
                    {
                        // If we're here, we are authorized
                        lblHeader.Text   = String.Format(CultureInfo.CurrentCulture, Resources.SignOff.ViewStudentLogbookHeader, HttpUtility.HtmlEncode(student.UserFullName));
                        hdnStudent.Value = student.UserName;
                        Restriction      = new FlightQuery(student.UserName);

                        if (mfbLogbook1.CanResignValidFlights = student.CanAddLogbook)
                        {
                            mfbEditFlight.FlightUser = student.UserName;
                            mfbEditFlight.SetUpNewOrEdit(LogbookEntryBase.idFlightNew);
                        }
                        else
                        {
                            apcNewFlight.Container.Style["display"] = "none";
                        }

                        if (!String.IsNullOrEmpty(hdnStudent.Value))
                        {
                            UpdateForUser(hdnStudent.Value);
                        }

                        mfbSearchForm.Username = student.UserName;
                        ResolvePrintLink();
                    }
                }

                pnlLogbook.Visible = (lblErr.Text.Length == 0);
            }

            if (pnlLogbook.Visible && mfbChartTotals.Visible)
            {
                mfbChartTotals.HistogramManager = LogbookEntryDisplay.GetHistogramManager(mfbLogbook1.Data, hdnStudent.Value);   // do this every time, since charttotals doesn't persist its data.
            }
        }
Example #4
0
    /// <summary>
    /// Checks to see if the viewer is an instructor of the owner of the flight; throws an exception if not.
    /// </summary>
    /// <param name="szFlightOwner">The owner of the flight</param>
    protected static void CheckCanViewFlight(string szFlightOwner, string szViewer)
    {
        if (szFlightOwner == null)
        {
            throw new ArgumentNullException(nameof(szFlightOwner));
        }
        if (szViewer == null)
        {
            throw new ArgumentNullException(nameof(szViewer));
        }

        MyFlightbook.Instruction.CFIStudentMap sm = new MyFlightbook.Instruction.CFIStudentMap(szViewer);
        InstructorStudent student = MyFlightbook.Instruction.CFIStudentMap.GetInstructorStudent(sm.Students, szFlightOwner);

        if (student == null || !student.CanViewLogbook)
        {
            throw new MyFlightbookException(Resources.SignOff.ViewStudentLogbookUnauthorized);
        }
    }
        protected void SetUpInstructorList(string szBestGuessInstructor)
        {
            CFIStudentMap sm = new CFIStudentMap(User.Identity.Name);

            cmbInstructors.DataSource = sm.Instructors;
            cmbInstructors.DataBind();

            if (!String.IsNullOrEmpty(szBestGuessInstructor))
            {
                foreach (ListItem li in cmbInstructors.Items)
                {
                    if (li.Text.CompareCurrentCultureIgnoreCase(szBestGuessInstructor) == 0)
                    {
                        cmbInstructors.SelectedValue = li.Value;
                        rowEmail.Visible             = valBadEmail.Enabled = valEmailRequired.Enabled = false;
                        break;
                    }
                }
            }
        }
Example #6
0
        protected Endorsement(MySqlDataReader dr)
        {
            if (dr == null)
            {
                throw new ArgumentNullException(nameof(dr));
            }
            CFICertificate    = dr["CFINum"].ToString();
            StudentName       = dr["Student"].ToString();
            StudentType       = (StudentTypes)Convert.ToInt16(dr["StudentType"], CultureInfo.InvariantCulture);
            ID                = Convert.ToInt32(dr["id"], CultureInfo.InvariantCulture);
            InstructorName    = dr["CFI"].ToString();
            Date              = Convert.ToDateTime(dr["Date"], CultureInfo.InvariantCulture);
            CreationDate      = Convert.ToDateTime(util.ReadNullableField(dr, "DateCreated", DateTime.MinValue), CultureInfo.InvariantCulture);
            CFIExpirationDate = Convert.ToDateTime(dr["CFIExpiration"], CultureInfo.InvariantCulture);
            EndorsementText   = dr["Endorsement"].ToString();
            Title             = dr["Title"].ToString();
            FARReference      = dr["FARRef"].ToString();
            CFICachedName     = util.ReadNullableString(dr, "CFIFullName");

            byte[] rgb;

            if (!(dr["FileSize"] is DBNull))
            {
                int FileSize = Convert.ToInt32(dr["FileSize"], CultureInfo.InvariantCulture);
                rgb = new byte[FileSize];
                dr.GetBytes(dr.GetOrdinal("DigitizedSignature"), 0, rgb, 0, FileSize);
            }
            else
            {
                rgb = CFIStudentMap.DefaultScribbleForInstructor(InstructorName);
            }

            if (rgb != null && rgb.Length == 0)
            {
                rgb = null;
            }

            SetDigitizedSig(rgb);
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            m_pf = MyFlightbook.Profile.GetUser(User.Identity.Name);

            if (!Request.IsSecureConnection && !Request.IsLocal)
            {
                Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
            }

            lblName.Text = String.Format(CultureInfo.CurrentCulture, Resources.Profile.TrainingHeader, HttpUtility.HtmlEncode(m_pf.UserFullName));

            this.Master.Title = String.Format(CultureInfo.CurrentCulture, Resources.LocalizedText.TitleTraining, Branding.CurrentBrand.AppName);

            // sidebar doesn't store it's state, so just set the currenttab each time.
            tabID sidebarTab = tabID.tabUnknown;

            string szPrefPath = String.IsNullOrWhiteSpace(Request.PathInfo) ? string.Empty : Request.PathInfo.Substring(1);

            string[] rgPrefPath = szPrefPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

            if (rgPrefPath.Length > 0 && !String.IsNullOrEmpty(rgPrefPath[0]) && Enum.TryParse <tabID>(rgPrefPath[0], out tabID tabid))
            {
                sidebarTab = tabid;
            }

            if (sidebarTab == tabID.tabUnknown)
            {
                sidebarTab = tabID.instInstructors;
            }

            this.Master.SelectedTab = sidebarTab;

            switch (sidebarTab)
            {
            case tabID.instEndorsements:
                mvProfile.SetActiveView(vwEndorsements);
                break;

            case tabID.instSignFlights:
                mvProfile.SetActiveView(vwSignFlights);
                break;

            case tabID.instStudents:
                mvProfile.SetActiveView(vwStudents);
                break;

            case tabID.instInstructors:
                mvProfile.SetActiveView(vwInstructors);
                break;
            }

            if (!IsPostBack)
            {
                switch (sidebarTab)
                {
                case tabID.instEndorsements:
                    if (Request.IsMobileDevice())
                    {
                        mfbIlEndorsements.Columns = 1;
                    }
                    mfbIlEndorsements.Key = User.Identity.Name;
                    mfbIlEndorsements.Refresh();

                    mfbEndorsementList1.Student = Page.User.Identity.Name;
                    mfbEndorsementList1.RefreshEndorsements();

                    if (!Request.IsMobileDeviceOrTablet())
                    {
                        mfbMultiFileUpload1.Mode = mfbMultiFileUpload.UploadMode.Ajax;
                    }

                    lnkPrintFriendly.NavigateUrl = String.Format(CultureInfo.InvariantCulture, "{0}?naked=1&print=1", Request.Url.AbsolutePath);
                    if (util.GetIntParam(Request, "print", 0) != 0)
                    {
                        lnkPrintFriendly.Visible = mfbIlEndorsements.Visible = mfbMultiFileUpload1.Visible = false;
                        List <MyFlightbook.Image.MFBImageInfo> lstInlineImages = new List <MyFlightbook.Image.MFBImageInfo>(mfbIlEndorsements.Images.ImageArray);
                        lstInlineImages.RemoveAll(mfbii => mfbii.ImageType != MyFlightbook.Image.MFBImageInfo.ImageFileType.JPEG);
                        rptEndorsementImages.DataSource = lstInlineImages;
                        rptEndorsementImages.DataBind();
                    }
                    break;

                case tabID.instSignFlights:
                    RefreshFlightsToBeSigned();
                    break;

                case tabID.instStudents:
                    SetUpStudents();
                    break;
                }
            }

            // Need to do these on every page load to recreate links, etc.
            switch (sidebarTab)
            {
            case tabID.instSignFlights:
            case tabID.instStudents:
            case tabID.instInstructors:
            case tabID.instEndorsements:
                this.Master.ShowSponsoredAd = false;
                m_sm = new CFIStudentMap(User.Identity.Name);
                RefreshStudentsAndInstructors();
                break;
            }
        }
        protected void wzRequestSigs_FinishButtonClick(object sender, WizardNavigationEventArgs e)
        {
            IEnumerable <LogbookEntry> lstFlights = SelectedFlights;

            string szCFIUsername = String.Empty;
            string szCFIEmail    = String.Empty;

            MyFlightbook.Profile pfCFI = null;


            bool fIsNewCFI = String.IsNullOrEmpty(cmbInstructors.SelectedValue);

            // Check In case the named email is already an instructor.
            CFIStudentMap sm = new CFIStudentMap(User.Identity.Name);

            if (fIsNewCFI && sm.IsStudentOf(txtCFIEmail.Text))
            {
                fIsNewCFI = false;
                foreach (InstructorStudent inst in sm.Instructors)
                {
                    if (String.Compare(inst.Email, txtCFIEmail.Text, StringComparison.CurrentCultureIgnoreCase) == 0)
                    {
                        pfCFI = inst;
                        break;
                    }
                }
            }
            else
            {
                pfCFI = MyFlightbook.Profile.GetUser(cmbInstructors.SelectedValue);
            }

            if (fIsNewCFI)
            {
                szCFIEmail = txtCFIEmail.Text;
            }
            else
            {
                szCFIUsername = pfCFI.UserName;
            }

            // check if we already know the email

            foreach (LogbookEntry le in lstFlights)
            {
                le.RequestSignature(szCFIUsername, szCFIEmail);
            }

            // Now send the email
            if (fIsNewCFI)
            {
                CFIStudentMapRequest smr = sm.GetRequest(CFIStudentMapRequest.RoleType.RoleCFI, szCFIEmail);
                smr.Send();
            }
            else
            {
                Profile pf = MyFlightbook.Profile.GetUser(User.Identity.Name);
                using (MailMessage msg = new MailMessage())
                {
                    msg.From = new MailAddress(Branding.CurrentBrand.EmailAddress, String.Format(System.Globalization.CultureInfo.CurrentCulture, Resources.SignOff.EmailSenderAddress, Branding.CurrentBrand.AppName, pf.UserFullName));
                    msg.ReplyToList.Add(new MailAddress(pf.Email, pf.UserFullName));
                    msg.To.Add(new MailAddress(pfCFI.Email, pfCFI.UserFullName));
                    msg.Subject = String.Format(System.Globalization.CultureInfo.CurrentCulture, Resources.SignOff.SignRequestSubject, pf.UserFullName, Branding.CurrentBrand.AppName);

                    string szURL = String.Format(System.Globalization.CultureInfo.InvariantCulture, "https://{0}{1}/{2}", Request.Url.Host, ResolveUrl("~/Member/Training.aspx"), tabID.instStudents.ToString());

                    msg.Body = Branding.ReBrand(Resources.SignOff.SignInvitationExisting).Replace("<% SignPendingFlightsLink %>", szURL).Replace("<% Requestor %>", pf.UserFullName);
                    util.SendMessage(msg);
                }
            }

            Response.Redirect(String.Format(System.Globalization.CultureInfo.InvariantCulture, "~/Member/Training.aspx/{0}", tabID.instSignFlights));
        }
Example #9
0
        protected void Page_Load(object sender, EventArgs e)
        {
            Master.SelectedTab = tabID.tabTraining;
            Title = String.Format(CultureInfo.CurrentCulture, Resources.LocalizedText.TitleProfile, Branding.CurrentBrand.AppName);

            pnlError.Visible = false;

            if (!IsPostBack)
            {
                try
                {
                    if (Request.PathInfo.Length > 0)
                    {
                        m_szTargetUser = Request.PathInfo.Substring(1);
                    }

                    bool fMemberEndorsement = util.GetIntParam(Request, "extern", 0) == 0;

                    if (m_szTargetUser.Length == 0 && fMemberEndorsement)
                    {
                        pnlEndorsement.Visible = false; // hide the new endorsement panel - just show all endorsements given
                    }
                    else
                    {
                        mfbEditEndorsement1.StudentType = fMemberEndorsement ? Endorsement.StudentTypes.Member : Endorsement.StudentTypes.External;

                        if (fMemberEndorsement)
                        {
                            CFIStudentMap sm = new CFIStudentMap(Page.User.Identity.Name);
                            if (!sm.IsInstructorOf(m_szTargetUser))
                            {
                                throw new MyFlightbookValidationException(Resources.Profile.errNotAuthorizedToEndorse);
                            }
                            InstructorStudent student = CFIStudentMap.GetInstructorStudent(sm.Students, m_szTargetUser);
                            if (student.CanViewLogbook)
                            {
                                pnlNonOwnedEndorsements.Visible           = true;
                                mfbNonOwnedEndorsements.Student           = m_szTargetUser;
                                mfbNonOwnedEndorsements.ExcludeInstructor = Page.User.Identity.Name;
                                mfbNonOwnedEndorsements.RefreshEndorsements();

                                mfbIlNonOwnedEndorsementScans.ImageClass = Image.MFBImageInfoBase.ImageClass.Endorsement;
                                mfbIlNonOwnedEndorsementScans.Key        = m_szTargetUser;
                                mfbIlNonOwnedEndorsementScans.Refresh();

                                // show unowned and uploaded endorsements as well
                                if (student.CanAddLogbook)
                                {
                                    // allow for upload of additional scanned endorsements.
                                    mfbMultiFileUpload.Visible  = true;
                                    mfbMultiFileUpload.ImageKey = m_szTargetUser;
                                }
                            }

                            Profile pfTarget      = Profile.GetUser(m_szTargetUser);
                            string  szTargetUser  = pfTarget.UserFullName;
                            string  szEncodedUser = HttpUtility.HtmlEncode(szTargetUser);

                            lblPageHeader.Text                = String.Format(CultureInfo.CurrentCulture, Resources.Profile.EndorsementsHeader, szEncodedUser);
                            lblNewEndorsementHeader.Text      = String.Format(CultureInfo.CurrentCulture, Resources.Profile.EndorsementsNewEndorsementHeader, szEncodedUser);
                            lblExistingEndorsementHeader.Text = String.Format(CultureInfo.CurrentCulture, Resources.Profile.EndorsementsExistingEndorsementHeader, szEncodedUser);
                            lblNonOwnedHeader.Text            = String.Format(CultureInfo.CurrentCulture, Resources.Profile.EndorsementsNotOwnedEndorsementHeader, szEncodedUser);
                            mfbEditEndorsement1.TargetUser    = pfTarget;
                            mfbEditEndorsement1.Mode          = EndorsementMode.InstructorPushAuthenticated;
                        }
                        else
                        {
                            mfbEditEndorsement1.Mode = EndorsementMode.InstructorOfflineStudent;
                        }

                        Profile pf = Profile.GetUser(User.Identity.Name);

                        if (pf.Certificate.Length == 0)
                        {
                            throw new MyFlightbookValidationException(Resources.Profile.errNoCFICertificate);
                        }

                        mfbEditEndorsement1.SourceUser = pf;

                        RefreshTemplateList();

                        ViewState[keyTargetUser] = m_szTargetUser;
                    }
                }
                catch (MyFlightbookValidationException ex)
                {
                    lblError.Text                   = ex.Message;
                    pnlError.Visible                = true;
                    pnlEndorsement.Visible          = false;
                    pnlExistingEndorsements.Visible = false;
                }
            }
            else
            {
                m_szTargetUser = (string)ViewState[keyTargetUser];
            }

            // need to reconstitute the form from the template every time to ensure postback works.
            if (!pnlError.Visible && pnlEndorsement.Visible)
            {
                mfbEditEndorsement1.EndorsementID = Convert.ToInt32(hdnLastTemplate.Value, CultureInfo.InvariantCulture);
            }

            mfbEndorsementList1.Instructor = Page.User.Identity.Name;
            mfbEndorsementList1.Student    = m_szTargetUser;
            mfbEndorsementList1.RefreshEndorsements();

            if (mfbMultiFileUpload.Visible)
            {
                mfbMultiFileUpload.ProcessUploadedImages();
                if (mfbIlNonOwnedEndorsementScans.Visible)
                {
                    mfbIlNonOwnedEndorsementScans.Refresh();
                }
            }
        }
Example #10
0
        protected void Page_Load(object sender, EventArgs e)
        {
            Master.SelectedTab = tabID.tabUnknown;

            if (!IsPostBack)
            {
                lblErr.Text = String.Empty;
                string szAuthToken = util.GetStringParam(Request, "auth");
                if (!String.IsNullOrEmpty(szAuthToken))
                {
                    Username = MFBWebService.GetEncryptedUser(szAuthToken);
                }

                bool fIsLocalOrSecure = MFBWebService.CheckSecurity(Request);

                // If no valid auth token, fall back to the authenticated name.
                if (String.IsNullOrEmpty(Username) && Page.User.Identity.IsAuthenticated && fIsLocalOrSecure)
                {
                    Username = Page.User.Identity.Name;
                }

                // Require a secure connection for other than debugging.
                if (!fIsLocalOrSecure && !Request.IsSecureConnection)
                {
                    Username = string.Empty;
                }

                try
                {
                    if (String.IsNullOrEmpty(Username))
                    {
                        throw new MyFlightbookException(Resources.SignOff.errSignNotAuthorized);
                    }

                    int idFlight = util.GetIntParam(Request, "idFlight", LogbookEntry.idFlightNew);
                    if (idFlight == LogbookEntry.idFlightNew)
                    {
                        throw new MyFlightbookException(Resources.SignOff.errSignNotAuthorized);
                    }

                    LogbookEntry le = new LogbookEntry();
                    if (!le.FLoadFromDB(idFlight, Username))
                    {
                        throw new MyFlightbookException(Resources.SignOff.errSignNotAuthorized);
                    }

                    mfbSignFlight.Flight = le;
                    CFIStudentMap sm = new CFIStudentMap(Username);

                    if (Username == null)
                    {
                        throw new MyFlightbookValidationException("No username for previously signed flights");
                    }

                    Dictionary <string, LogbookEntry> d = PreviouslySignedAdhocFlights;

                    // If no instructors, and no previously signed flights, assume ad-hoc and go straight to accept terms.
                    if (!sm.Instructors.Any() && d.Keys.Count == 0)
                    {
                        mfbSignFlight.SigningMode = mfbSignFlight.SignMode.AdHoc;
                        mfbSignFlight.CFIProfile  = null;
                        mvSignFlight.SetActiveView(vwAcceptTerms);
                    }
                    else
                    {
                        rptInstructors.DataSource = sm.Instructors;
                        rptInstructors.DataBind();

                        List <string> lstKeys = new List <string>(d.Keys);
                        lstKeys.Sort();
                        List <LogbookEntry> lstPrevInstructors = new List <LogbookEntry>();

                        foreach (string sz in lstKeys)
                        {
                            lstPrevInstructors.Add(d[sz]);
                        }

                        rptPriorInstructors.DataSource = lstPrevInstructors;
                        rptPriorInstructors.DataBind();

                        mvSignFlight.SetActiveView(vwPickInstructor);
                    }


                    lblHeader.Text              = String.Format(CultureInfo.CurrentCulture, Resources.SignOff.SignFlightHeader, MyFlightbook.Profile.GetUser(le.User).UserFullName);
                    lblDisclaimerResponse.Text  = Branding.ReBrand(Resources.SignOff.SignDisclaimerAgreement1);
                    lblDisclaimerResponse2.Text = Branding.ReBrand(Resources.SignOff.SignDisclaimerAgreement2);
                }
                catch (MyFlightbookException ex)
                {
                    lblErr.Text          = ex.Message;
                    mvSignFlight.Visible = false;
                }
            }
        }