Esempio n. 1
0
        public IEnumerable <ChargePoint> Get()
        {
            // use custom query string parsing for compatibility
            var filter = new APIRequestParams();

            //set defaults
            var paramList = new NullSafeDictionary <string, string>();

            foreach (var k in Request.Query.Keys)
            {
                paramList.Add(k.ToLower(), Request.Query[k]);
            }

            filter.ParseParameters(filter, paramList);

            if (string.IsNullOrEmpty(filter.APIKey))
            {
                if (Request.Headers.ContainsKey("X-API-Key"))
                {
                    filter.APIKey = Request.Headers["X-API-Key"];
                }
            }

            var api = new POIManager();

            var list = api.GetPOIList(filter);

            return(list);
        }
Esempio n. 2
0
        public void NullSafeDictionaryDefaultValueTest()
        {
            // Arrange
            var dict = new NullSafeDictionary <string, int>();

            // Act
            var value = dict["a"];

            // Assert
            Assert.AreEqual(0, value);
        }
Esempio n. 3
0
        public void NullSafeDictionaryDefaultValueFromCustomMethodTest()
        {
            // Arrange
            var dict = new NullSafeDictionary <string, int>((key) => { return(-1); });

            // Act
            var value = dict["a"];

            // Assert
            Assert.AreEqual(-1, value);
        }
Esempio n. 4
0
 public ChunkProviderServer(net.minecraft.src.WorldServer worldserver, net.minecraft.src.IChunkLoader
                            ichunkloader, net.minecraft.src.IChunkProvider ichunkprovider)
 {
     // Referenced classes of package net.minecraft.src:
     //            IChunkProvider, EmptyChunk, ChunkCoordIntPair, WorldServer,
     //            ChunkCoordinates, Chunk, IChunkLoader, IProgressUpdate
     field_725_a          = new HashSet <int>();
     chunkLoadOverride    = false;
     id2ChunkMap          = new NullSafeDictionary <int, Chunk>();
     field_727_f          = new List <Chunk>();
     dummyChunk           = new net.minecraft.src.EmptyChunk(worldserver, new byte[32768], 0, 0);
     world                = worldserver;
     chunkLoader          = ichunkloader;
     serverChunkGenerator = ichunkprovider;
 }
Esempio n. 5
0
        public void NullSafeDictionaryDefaultValueAddKeysTest()
        {
            // Arrange
            var dict  = new NullSafeDictionary <string, int>((key) => { return(-1); });
            var array = new[] { "A", "B", "C" };

            // Act
            dict.AddKeys(array);

            // Assert
            for (int i = 0; i < dict.Keys.Count; i++)
            {
                Assert.AreEqual(-1, dict.Values.Skip(i).First());
            }
        }
Esempio n. 6
0
 /// <summary>
 /// Gets the list translation.
 /// </summary>
 /// <typeparam name="T">The type.</typeparam>
 /// <param name="values">The dictionary containing lang>list.</param>
 static public NullSafeList <T> GetLang <T>(this NullSafeDictionary <Language, NullSafeList <T> > values)
     where T : class
 {
     return(values?[Languages.Current] ?? values?[Languages.Default] ?? new NullSafeList <T>());
 }
Esempio n. 7
0
 /// <summary>
 /// Gets the string list translation.
 /// </summary>
 /// <param name="values">The dictionary containing lang>translations.</param>
 static public string[] GetLang(this NullSafeDictionary <Language, string[]> values)
 {
     return(values?[Languages.Current] ?? values?[Languages.Default] ?? new string[1] {
         ERR
     });
 }
Esempio n. 8
0
 /// <summary>
 /// Gets the list translation.
 /// </summary>
 /// <param name="values">The dictionary containing lang>list.</param>
 static public NullSafeStringList GetLang(this NullSafeDictionary <Language, NullSafeStringList> values)
 {
     return(values?[Languages.Current] ?? values?[Languages.Default] ?? new NullSafeStringList());
 }
Esempio n. 9
0
    /// <summary>
    /// Gets the string translation.
    /// </summary>
    /// <typeparam name="T">The type.</typeparam>
    /// <param name="values">The dictionary containing value>lang>translation.</param>
    /// <param name="value">The value to translate.</param>
    /// <param name="forceEnglish">True to force get in english.</param>
    static public string GetLang <T>(this NullSafeDictionary <T, TranslationsDictionary> values, T value, bool forceEnglish = false)
    {
        var lang = forceEnglish ? Language.EN : Languages.Current;

        return(values?[value]?[lang] ?? values?[value]?[Languages.Default] ?? ERR);
    }
Esempio n. 10
0
 /// <summary>
 /// Gets the string translation.
 /// </summary>
 /// <typeparam name="T">The type.</typeparam>
 /// <param name="values">The dictionary containing lang>value>translation.</param>
 /// <param name="value">The value to translate.</param>
 static public string GetLang <T>(this NullSafeDictionary <Language, NullSafeOfStringDictionary <T> > values, T value)
     where T : Enum
 {
     return(values?[Languages.Current]?[value] ?? values?[Languages.Default]?[value] ?? ERR);
 }
Esempio n. 11
0
        /// <summary>
        /// Handle output from API
        /// </summary>
        /// <param name="context"></param>
        private async Task <bool> PerformOutput(HttpContext context)
        {
            //decide correct reponse type
            IOutputProvider outputProvider = null;
            var             filter         = new APIRequestParams();

            //set defaults
            string outputType = "xml";

            filter.DistanceUnit  = DistanceUnit.Miles;
            filter.MaxResults    = 100;
            filter.EnableCaching = true;

            var paramList = new NullSafeDictionary <string, string>();

            foreach (var k in context.Request.Query.Keys)
            {
                paramList.Add(k.ToLower(), context.Request.Query[k]);
            }
            filter.ParseParameters(filter, paramList);

            if (string.IsNullOrEmpty(filter.APIKey))
            {
                if (context.Request.Headers.ContainsKey("X-API-Key"))
                {
                    filter.APIKey = context.Request.Headers["X-API-Key"];
                }
            }

            //override ?v=2 etc if called via /api/v2/ or /api/v1
            if (APIBehaviourVersion > 0)
            {
                filter.APIVersion = APIBehaviourVersion;
            }
            if (APIBehaviourVersion >= 2)
            {
                filter.Action = DefaultAction;
            }

            try
            {
                if ((_settings.IsCacheOnlyMode || context.Request.GetUri().Host.ToLower().StartsWith("api")) && (filter.APIVersion == null || filter.APIVersion == 1))
                {
                    //API version is mandatory for api V2 onwards via api.openchargemap.* hostname or for API mirrors operating in cached mode
                    await OutputBadRequestMessage(context, "mandatory API Version not specified in request");

                    return(true);
                }
            }
            catch (System.UriFormatException)
            {
                _logger?.LogWarning("Failed to parse URI " + context.Request.Host.Value);
            }

            if (!String.IsNullOrEmpty(context.Request.Query["output"]))
            {
                outputType = ParseString(context.Request.Query["output"]).ToLower();
            }
            else
            {
                //new default after API V2 is json instead of XML
                if (filter.APIVersion >= 2)
                {
                    outputType = "json";
                }
            }

            //change defaults and override settings for deprecated api features
            if (filter.APIVersion >= 2)
            {
                //the following output types are deprecated and will default as JSON
                if (outputType == "carwings" || outputType == "rss")
                {
                    await OutputBadRequestMessage(context, "specified output type not supported in this API version");

                    return(true);
                }
            }

            if (_settings.IsCacheOnlyMode)
            {
                filter.AllowMirrorDB    = true;
                filter.AllowDataStoreDB = false;
            }

            if (IsRequestByRobot(context))
            {
                await OutputBadRequestMessage(context, "API requests by robots are temporarily disabled.", statusCode : 503);

                return(true);
            }

            //determine output provider
            switch (outputType)
            {
            case "xml":
                outputProvider = new XMLOutputProvider();
                break;

            case "carwings":
            case "rss":
                outputProvider = new RSSOutputProvider();
                if (outputType == "carwings")
                {
                    ((RSSOutputProvider)outputProvider).EnableCarwingsMode = true;
                }
                break;

            case "json":
                outputProvider = new JSONOutputProvider();
                break;

            case "geojson":
                outputProvider = new GeoJSONOutputProvider();
                break;

            case "csv":
                outputProvider = new CSVOutputProvider();
                break;

            case "kml":
                outputProvider = new KMLOutputProvider(KMLOutputProvider.KMLVersion.V2);
                break;

            default:
                outputProvider = new XMLOutputProvider();
                break;
            }

            if (outputProvider != null)
            {
                context.Response.ContentType = outputProvider.ContentType;

                if (filter.Action == "getchargepoints" || filter.Action == "poi")
                {
                    await OutputPOIList(outputProvider, context, filter);

                    return(true);
                }

                if (filter.Action == "getcompactpoilist")
                {
                    //experimental::
                    await OutputCompactPOIList(context, filter);

                    return(true);
                }

                if (filter.Action == "getcorereferencedata")
                {
                    await OutputCoreReferenceData(outputProvider, context, filter);

                    return(true);
                }

                if (filter.Action == "geocode")
                {
                    OutputGeocodingResult(outputProvider, context, filter);
                    return(true);
                }

                if (filter.Action == "availability")
                {
                    OutputAvailabilityResult(outputProvider, context, filter);
                    return(true);
                }

                if (filter.Action == "profile.authenticate")
                {
                    await OutputProfileSignInResult(outputProvider, context, filter);

                    return(true);
                }

                if (filter.Action == "profile.register")
                {
                    await OutputProfileRegisterResult(outputProvider, context, filter);

                    return(true);
                }

                if (filter.Action == "refreshmirror")
                {
                    try
                    {
                        var itemsUpdated = await OCM.Core.Data.CacheManager.RefreshCachedData();

                        await new JSONOutputProvider().GetOutput(context, context.Response.Body, new { POICount = itemsUpdated, Status = "OK" }, filter);
                        return(true);
                    }
                    catch (Exception exp)
                    {
                        await new JSONOutputProvider().GetOutput(context, context.Response.Body, new { Status = "Error", Message = exp.ToString() }, filter);
                        return(true);
                    }
                }
            }

            // request did not match an existing handler
            return(false);
        }
Esempio n. 12
0
        /// <summary>
        /// Handle input to API
        /// </summary>
        /// <param name="context"></param>
        private async Task <bool> PerformInput(HttpContext context)
        {
            if (!_settings.EnableDataWrites)
            {
                await OutputBadRequestMessage(context, "API is read only. Submissions not currently being accepted.");

                return(true);
            }

            OCM.API.InputProviders.IInputProvider inputProvider = null;

            var filter = new APIRequestParams();

            //set defaults
            var paramList = new NullSafeDictionary <string, string>();

            foreach (var k in context.Request.Query.Keys)
            {
                paramList.Add(k.ToLower(), context.Request.Query[k]);
            }

            filter.ParseParameters(filter, paramList);

            if (string.IsNullOrEmpty(filter.APIKey))
            {
                if (context.Request.Headers.ContainsKey("X-API-Key"))
                {
                    filter.APIKey = context.Request.Headers["X-API-Key"];
                }
            }

            //override ?v=2 etc if called via /api/v2/ or /api/v1
            if (APIBehaviourVersion > 0)
            {
                filter.APIVersion = APIBehaviourVersion;
            }
            if (APIBehaviourVersion >= 2)
            {
                filter.Action = DefaultAction;
            }

            if (context.Request.GetUri().Host.ToLower().StartsWith("api") && filter.APIVersion == null)
            {
                //API version is mandatory for api V2 onwards via api.openchargemap.* hostname
                await OutputBadRequestMessage(context, "mandatory API Version not specified in request");

                return(true);
            }

            bool performSubmissionCompletedRedirects = false;

            //Use JSON format submission if explictly specified or by default if API v3
            if (context.Request.Query["format"] == "json" || (String.IsNullOrEmpty(context.Request.Query["format"]) && filter.APIVersion >= 3))
            {
                inputProvider = new InputProviders.JSONInputProvider();
            }
            else
            {
                inputProvider = new InputProviders.HTMLFormInputProvider();
                performSubmissionCompletedRedirects = true;
            }

            SubmissionManager submissionManager = new SubmissionManager();

            //attempt to determine user from api call
            User user = inputProvider.GetUserFromAPICall(context, filter.APIKey);

            if (user != null && user.IsCurrentSessionTokenValid == false)
            {
                //session token provided didn't match latest in user details, reject user details.
                context.Response.StatusCode = 401;
            }
            else
            {
                //allow contact us input whether use is authenticated or not
                if (context.Request.Query["action"] == "contactus_submission" || filter.Action == "contact")
                {
                    ContactSubmission contactSubmission = new ContactSubmission();
                    bool processedOK = inputProvider.ProcessContactUsSubmission(context, ref contactSubmission);

                    bool resultOK = submissionManager.SendContactUsMessage(contactSubmission.Name, contactSubmission.Email, contactSubmission.Comment);
                    if (resultOK == true)
                    {
                        await context.Response.WriteAsync("OK");
                    }
                    else
                    {
                        await context.Response.WriteAsync("Error");
                    }
                    return(true);
                }

                //if user not authenticated reject any other input
                if (user == null)
                {
                    context.Response.StatusCode = 401;
                    return(true);
                }

                //gather input variables
                if (context.Request.Query["action"] == "cp_submission" || filter.Action == "poi")
                {
                    //gather/process data for submission
                    var processingResult = await inputProvider.ProcessEquipmentSubmission(context);

                    ValidationResult submissionResult = new ValidationResult {
                        IsValid = false
                    };

                    if (processingResult.IsValid)
                    {
                        //perform submission
                        submissionResult = await submissionManager.PerformPOISubmission((ChargePoint)processingResult.Item, user);
                    }

                    if (processingResult.IsValid && submissionResult.IsValid)
                    {
                        if (performSubmissionCompletedRedirects)
                        {
                            context.Response.Redirect("http://openchargemap.org/submissions/complete.aspx", true);
                        }
                        else
                        {
                            context.Response.StatusCode = 202;
                        }
                        return(true);
                    }
                    else
                    {
                        // validation or submission failed
                        if (performSubmissionCompletedRedirects)
                        {
                            context.Response.Redirect("http://openchargemap.org/submissions/error.aspx", true);
                        }
                        else
                        {
                            context.Response.StatusCode = 400;
                            await context.Response.WriteAsync(processingResult.IsValid?submissionResult.Message : processingResult.Message);
                        }
                        return(true);
                    }
                }

                if (context.Request.Query["action"] == "cp_batch_submission")
                {
                    var    sr          = new System.IO.StreamReader(context.Request.Body);
                    string contentJson = sr.ReadToEnd().Trim();

                    var list = JsonConvert.DeserializeObject <List <ChargePoint> >(contentJson);
                    foreach (var cp in list)
                    {
                        var validationResult = POIManager.IsValid(cp);

                        ValidationResult submissionResult = new ValidationResult {
                            IsValid = false
                        };

                        if (validationResult.IsValid)
                        {
                            //perform submission
                            submissionResult = await submissionManager.PerformPOISubmission(cp, user, performCacheRefresh : false);
                        }
                        else
                        {
                            System.Diagnostics.Debug.WriteLine("Invalid POI: " + cp.ID);
                        }
                    }

                    // refresh cache
                    var cacheTask = System.Threading.Tasks.Task.Run(async() =>
                    {
                        return(await Core.Data.CacheManager.RefreshCachedData());
                    });
                    cacheTask.Wait();

                    context.Response.StatusCode = 202;
                    return(true);
                }

                if (context.Request.Query["action"] == "comment_submission" || filter.Action == "comment")
                {
                    UserComment comment     = new UserComment();
                    bool        processedOK = await inputProvider.ProcessUserCommentSubmission(context, comment);

                    if (processedOK == true)
                    {
                        //perform submission
                        int result = await submissionManager.PerformSubmission(comment, user);

                        if (filter.APIVersion >= 3)
                        {
                            if (result > 0)
                            {
                                await OutputSubmissionReceivedMessage(context, "OK", true);
                            }
                            else
                            {
                                await OutputBadRequestMessage(context, "Failed");
                            }
                        }
                        else
                        {
                            if (result >= 0)
                            {
                                await context.Response.WriteAsync("OK:" + result);
                            }
                            else
                            {
                                await context.Response.WriteAsync("Error:" + result);
                            }
                        }
                    }
                    else
                    {
                        await context.Response.WriteAsync("Error: Validation Failed");
                    }

                    return(true);
                }

                if (context.Request.Query["action"] == "mediaitem_submission" || filter.Action == "mediaitem")
                {
                    var       p        = inputProvider;
                    MediaItem m        = new MediaItem();
                    bool      accepted = false;
                    string    msg      = "";

                    try
                    {
                        var tempPath = Path.Join(System.IO.Path.GetTempPath(), "_ocm");
                        if (!System.IO.Directory.Exists(tempPath))
                        {
                            System.IO.Directory.CreateDirectory(tempPath);
                        }

                        accepted = await p.ProcessMediaItemSubmission(tempPath, context, m, user.ID);
                    }
                    catch (Exception exp)
                    {
                        msg += exp.ToString();
                    }

                    if (accepted)
                    {
                        submissionManager.PerformSubmission(m, user);
                        //OutputSubmissionReceivedMessage(context, "OK :" + m.ID, true);

                        if (filter.APIVersion >= 3)
                        {
                            await OutputSubmissionReceivedMessage(context, "OK", true);
                        }
                        else
                        {
                            await context.Response.WriteAsync("OK");
                        }
                    }
                    else
                    {
                        if (filter.APIVersion >= 3)
                        {
                            await OutputBadRequestMessage(context, "Failed");
                        }
                        else
                        {
                            await context.Response.WriteAsync("Error");
                        }
                    }
                    return(true);
                }
            }

            // submission was not handled
            return(false);
        }