/// <summary>
        /// 4. Display results with link to view the course
        /// </summary>
        /// <returns></returns>
        public async Task <IActionResult> View(CancellationToken cancellationToken, CourseWorkModel model)
        {
            var appFlow = new AppFlowMetadata(ClientId, ClientSecret, _context);
            var token   = await appFlow.Flow.LoadTokenAsync(model.UserId, cancellationToken);

            var credential = new UserCredential(appFlow.Flow, model.UserId, token);

            try
            {
                // Get information using Google Classroom API
                using (var classroomService = new ClassroomService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "gc2lti"
                }))
                {
                    var request  = classroomService.Courses.Get(model.CourseId);
                    var response = await request.ExecuteAsync(cancellationToken).ConfigureAwait(false);

                    model.CourseAlternativeLink = response.AlternateLink;

                    return(View(model));
                }
            }
            catch (Exception e)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, e));
            }
        }
Exemple #2
0
        public async Task <Boolean> checkCredential()
        {
            var app = new AppFlowMetadata();

            var result = await new AuthorizationCodeMvcApp(this, app).
                         AuthorizeAsync(cancellationToken);

            //var accessToken =  result.Credential.Token.AccessToken;
            //string a = accessToken.Value;


            if (result.Credential != null)
            {
                //result.Credential.Token.AccessToken = null;
                service = new GmailService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = result.Credential,
                    ApplicationName       = "ASP.NET MVC Sample"
                });


                return(true);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// 3. Create the assignment
        /// </summary>
        public async Task <IActionResult> Assign(CancellationToken cancellationToken, CourseWorkModel model)
        {
            var appFlow = new AppFlowMetadata(ClientId, ClientSecret, _context);
            var token   = await appFlow.Flow.LoadTokenAsync(model.UserId, cancellationToken);

            var credential = new UserCredential(appFlow.Flow, model.UserId, token);

            try
            {
                // Create the assignment
                using (var classroomService = new ClassroomService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "gc2lti"
                }))
                {
                    var nonce   = CalculateNonce(8);
                    var linkUrl = IsRequestLocal()
                            ? $"{_configuration["Localhost"]}/gc2lti/{nonce}?u={model.Url}&c={model.CourseId}&t={model.Title}"
                            : $"{_configuration["Remotehost"]}/gc2lti/{nonce}?u={model.Url}&c={model.CourseId}&t={model.Title}";
                    var courseWork = new CourseWork
                    {
                        Title       = model.Title,
                        Description = model.Description,
                        MaxPoints   = model.MaxPoints,
                        WorkType    = "ASSIGNMENT",
                        Materials   = new List <Material>
                        {
                            new Material
                            {
                                Link = new Link
                                {
                                    Title = model.Title, // The title will be overwritten by Google's thumbnail generator
                                    Url   = linkUrl
                                }
                            }
                        },
                        State = "PUBLISHED"
                    };

                    var createRequest = classroomService.Courses.CourseWork.Create(courseWork, model.CourseId);
                    courseWork = await createRequest.ExecuteAsync(cancellationToken).ConfigureAwait(false);

                    model.CourseWorkId = courseWork.Id;

                    return(RedirectToAction("View", model));
                }
            }
            catch (Exception e)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, e));
            }
        }
Exemple #4
0
        /// <summary>
        /// function generates the google oauth credentials
        /// </summary>
        /// <returns></returns>
        public Google.Apis.Auth.OAuth2.UserCredential getGoogleOauthCredentials()
        {
            Google.Apis.Auth.OAuth2.Responses.TokenResponse responseData = new Google.Apis.Auth.OAuth2.Responses.TokenResponse();
            responseData.AccessToken  = this.Token;
            responseData.RefreshToken = this.RefreshToken;
            GoogleAuthorizationCodeFlow.Initializer myInit         = new GoogleAuthorizationCodeFlow.Initializer();
            AuthorizationCodeFlow.Initializer       codeFlowIntial = myInit;
            codeFlowIntial.ClientSecrets = new ClientSecrets();
            string googleClientId     = ConfigurationManager.AppSettings["googleClientId"];
            string googleClientSecret = ConfigurationManager.AppSettings["googleClientSecret"];

            codeFlowIntial.ClientSecrets.ClientId     = googleClientId;
            codeFlowIntial.ClientSecrets.ClientSecret = googleClientSecret;
            IAuthorizationCodeFlow myFlow = AppFlowMetadata.getFlow();

            Google.Apis.Auth.OAuth2.UserCredential RetValue = new Google.Apis.Auth.OAuth2.UserCredential(myFlow, this.ID, responseData);
            return(RetValue);
        }
Exemple #5
0
        private async Task <ReadResultResponse> ReadResultAsync(ReadResultRequest arg)
        {
            var response = new ReadResultResponse();

            var ltiRequest = await Request.ParseLtiRequestAsync();

            var signature = ltiRequest.GenerateSignature("secret");

            if (!ltiRequest.Signature.Equals(signature))
            {
                response.StatusCode = StatusCodes.Status401Unauthorized;
                return(response);
            }

            // Read the grade from Google Classroom
            try
            {
                var lisResultSourcedId = JsonConvert.DeserializeObject <LisResultSourcedId>(arg.LisResultSourcedId);
                var googleUser         = await Db.GoogleUsers.FindAsync(lisResultSourcedId.TeacherId);

                var appFlow = new AppFlowMetadata(ClientId, ClientSecret, Db);
                var token   = await appFlow.Flow.LoadTokenAsync(googleUser.UserId, CancellationToken.None);

                var credential = new UserCredential(appFlow.Flow, googleUser.UserId, token);

                using (var classroomService = new ClassroomService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "gc2lti"
                }))
                {
                    var courseWorkRequest = classroomService.Courses.CourseWork.Get
                                            (
                        lisResultSourcedId.CourseId,
                        lisResultSourcedId.CourseWorkId
                                            );
                    var courseWork = await courseWorkRequest.ExecuteAsync();

                    var submissionsRequest = classroomService.Courses.CourseWork.StudentSubmissions.List
                                             (
                        lisResultSourcedId.CourseId,
                        lisResultSourcedId.CourseWorkId
                                             );
                    submissionsRequest.UserId = lisResultSourcedId.StudentId;
                    var submissionsResponse = await submissionsRequest.ExecuteAsync();

                    var submission = submissionsResponse.StudentSubmissions.FirstOrDefault();

                    if (submission == null)
                    {
                        response.StatusCode        = StatusCodes.Status404NotFound;
                        response.StatusDescription = "Submission was found.";
                    }
                    else
                    {
                        response.Result = new Result
                        {
                            SourcedId = arg.LisResultSourcedId,
                            Score     = submission.AssignedGrade / courseWork.MaxPoints
                        };
                        response.StatusDescription = $"Score={response.Result.Score}, AssignedGrade={submission.AssignedGrade}.";
                    }
                }
            }
            catch (Exception)
            {
                response.StatusCode = StatusCodes.Status500InternalServerError;
            }

            return(response);
        }
Exemple #6
0
        private async Task <ReplaceResultResponse> ReplaceResultAsync(ReplaceResultRequest arg)
        {
            // Authenticate the LTI Request
            var response = new ReplaceResultResponse();

            var ltiRequest = await Request.ParseLtiRequestAsync();

            var signature = ltiRequest.GenerateSignature("secret");

            if (!ltiRequest.Signature.Equals(signature))
            {
                response.StatusCode = StatusCodes.Status401Unauthorized;
                return(response);
            }

            // Lookup the "offline" TokenResponse for the TeacherId
            var lisResultSourcedId = JsonConvert.DeserializeObject <LisResultSourcedId>(arg.Result.SourcedId);
            var googleUser         = await Db.GoogleUsers.FindAsync(lisResultSourcedId.TeacherId);

            var appFlow = new AppFlowMetadata(ClientId, ClientSecret, Db);
            var token   = await appFlow.Flow.LoadTokenAsync(googleUser.UserId, CancellationToken.None);

            // Using the TokenResponse, create a UserCredential for the teacher
            var credential = new UserCredential(appFlow.Flow, googleUser.UserId, token);

            // Using the teacher's UserCredential, create an instance of the ClassroomService
            using (var classroomService = new ClassroomService(new BaseClientService.Initializer
            {
                HttpClientInitializer = credential,
                ApplicationName = "gc2lti"
            }))
            {
                // Using the ClassroomService, get the CourseWork for the assignment
                var courseWorkRequest = classroomService.Courses.CourseWork.Get
                                        (
                    lisResultSourcedId.CourseId,
                    lisResultSourcedId.CourseWorkId
                                        );
                var courseWork = await courseWorkRequest.ExecuteAsync();

                // Then get the student's StudentSubmission
                var submissionsRequest = classroomService.Courses.CourseWork.StudentSubmissions.List
                                         (
                    lisResultSourcedId.CourseId,
                    lisResultSourcedId.CourseWorkId
                                         );
                submissionsRequest.UserId = lisResultSourcedId.StudentId;
                var submissionsResponse = await submissionsRequest.ExecuteAsync();

                if (submissionsResponse.StudentSubmissions == null)
                {
                    response.StatusCode        = StatusCodes.Status404NotFound;
                    response.StatusDescription = "Submission was not found.";
                    return(response);
                }
                var submission = submissionsResponse.StudentSubmissions.FirstOrDefault();

                // Set the AssignedGrade and DraftGrade
                if (submission == null)
                {
                    response.StatusCode        = StatusCodes.Status404NotFound;
                    response.StatusDescription = "Submission was not found.";
                }
                else
                {
                    submission.AssignedGrade = arg.Result.Score * courseWork.MaxPoints;
                    submission.DraftGrade    = submission.AssignedGrade;

                    var patchRequest = classroomService.Courses.CourseWork.StudentSubmissions.Patch
                                       (
                        submission,
                        submission.CourseId,
                        submission.CourseWorkId,
                        submission.Id
                                       );
                    patchRequest.UpdateMask = "AssignedGrade,DraftGrade";
                    await patchRequest.ExecuteAsync();

                    response.StatusDescription = $"Score={arg.Result.Score}, AssignedGrade={submission.AssignedGrade}.";
                }
            }

            return(response);
        }