ClrPlus.Powershell.Core.Service.RestService.Configure C# (CSharp) Method

Configure() public method

public Configure ( Funq.Container container ) : void
container Funq.Container
return void
        public override void Configure(Container container)
        {
            _configured = true;
            // Feature disableFeatures = Feature.Jsv | Feature.Soap;
            SetConfig(new EndpointHostConfig {
                // EnableFeatures = Feature.All.Remove(disableFeatures), //all formats except of JSV and SOAP
                DebugMode = true, //Show StackTraces in service responses during development
                WriteErrorsToResponse = false, //Disable exception handling
                DefaultContentType = ContentType.Json, //Change default content type
                AllowJsonpRequests = true, //Enable JSONP requests
                ServiceName = "RestService",
            });

            #if DEBUG
            LogManager.LogFactory = new DebugLogFactory();
            #endif
            using (var ps = RunspacePool.Dynamic()) {
                foreach (var restCommand in _activeCommands) {
                    PSObject command = ps.LookupCommand(restCommand.Name);

                    if (command != null) {
                        var cmdletInfo = (command.ImmediateBaseObject as CmdletInfo);
                        if (cmdletInfo != null) {
                            dynamic d = new AccessPrivateWrapper((ServiceController as ServiceController));

                            // for each type we're adding, see if it's already been added already.
                            if(!d.requestExecMap.ContainsKey(cmdletInfo.ImplementingType)) {
                                (ServiceController as ServiceController).RegisterGService(GetTypeFactory(cmdletInfo.ImplementingType), cmdletInfo.ImplementingType);
                                (ServiceController as ServiceController).RegisterNService(GetTypeFactory(cmdletInfo.ImplementingType), cmdletInfo.ImplementingType);
                            }

                            ReverseLookup.AddOrSet(cmdletInfo.ImplementingType, restCommand);
                            Routes.Add(cmdletInfo.ImplementingType, "/" + restCommand.PublishAs + "/", "GET");
                        }
                        else {
                            throw new ClrPlusException("command isn't cmdletinfo: {0}".format(command.GetType()));
                        }
                    }
                }
            }

            Plugins.Add(new AuthFeature(() => new AuthUserSession(),
             new IAuthProvider[] {
                    new CustomBasicAuthProvider(),
                   // new CustomCredentialsAuthProvider(),
                }
             ));

            // stick a request filter in to validate that the user has the right to actually
            // call this method.

            RequestFilters.Add((request, response, requestDto) => {
                var restCommand = ReverseLookup[requestDto.GetType()];

                // is this one of the restCommands?
                // and does it has roles defined?
                if (restCommand != null && !restCommand.Roles.IsNullOrEmpty()) {

                    // ensure we're authenticated if the user passed the right stuff in the request
                    try {
                        AuthenticateAttribute.AuthenticateIfBasicAuth(request, response);
                    } catch (Exception e) {
                        Console.WriteLine(e.Message);
                        response.StatusCode = 401;
                        response.AddHeader("WWW-Authenticate", "Basic realm=\"rest-service\"");
                        response.StatusDescription = "Unauthorized";
                        response.EndServiceStackRequest(false);
                        return;
                    }

                    // get the session object.
                    var session = request.GetSession(false);

                    // check if we got our authentication.
                    if (!session.IsAuthenticated) {
                        response.StatusCode = 401;
                        response.AddHeader("WWW-Authenticate", "Basic realm=\"rest-service\"");
                        response.StatusDescription = "Unauthorized";
                        response.EndServiceStackRequest(false);
                        return;
                    }

                    // validate the user has the role.
                    if (!restCommand.Roles.Any(session.HasRole)) {
                        response.StatusCode = 403;

                        response.StatusDescription = "Forbidden";
                        response.EndServiceStackRequest(false);
                    }

                    var req = (requestDto as IHasSession);
                    if (req != null) {
                        req.Session = session;
                    }
                }
            });
        }