/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_CSP_DIRECTIVE_LIST_H_
#define COBALT_CSP_DIRECTIVE_LIST_H_

#include <string>
#include <vector>

#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "cobalt/csp/content_security_policy.h"
#include "googleurl/src/gurl.h"

namespace cobalt {
namespace csp {

class MediaListDirective;
class SourceListDirective;

class DirectiveList {
 public:
  DirectiveList(ContentSecurityPolicy* policy, const base::StringPiece& text,
                HeaderType header_type, HeaderSource header_source);
  ~DirectiveList();
  void Parse(const base::StringPiece& text);

  const std::string& header() const { return header_; }
  HeaderType header_type() const { return header_type_; }
  HeaderSource header_source() const { return header_source_; }

  bool AllowJavaScriptURLs(
      const std::string& context_url, int context_line,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowInlineEventHandlers(
      const std::string& context_url, int context_line,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowInlineScript(
      const std::string& context_url, int context_line,
      ContentSecurityPolicy::ReportingStatus reporting_status,
      const std::string& script_content) const;
  bool AllowInlineStyle(const std::string& context_url, int context_line,
                        ContentSecurityPolicy::ReportingStatus reporting_status,
                        const std::string& style_content) const;
  bool AllowEval(ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowPluginType(
      const std::string& type, const std::string& type_attribute,
      const GURL& url,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;

  bool AllowScriptFromSource(
      const GURL& url, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowObjectFromSource(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowImageFromSource(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowStyleFromSource(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowFontFromSource(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowMediaFromSource(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowManifestFromSource(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowConnectToSource(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowNavigateToSource(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowFormAction(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowBaseURI(
      const GURL&, ContentSecurityPolicy::RedirectStatus redirect_status,
      ContentSecurityPolicy::ReportingStatus reporting_status) const;
  bool AllowScriptNonce(const std::string& script) const;
  bool AllowStyleNonce(const std::string& style) const;
  bool AllowScriptHash(const HashValue& script) const;
  bool AllowStyleHash(const HashValue& script) const;

  const std::string& eval_disabled_error_message() const {
    return eval_disabled_error_message_;
  }
  ReflectedXSSDisposition reflected_xss_disposition() const {
    return reflected_xss_disposition_;
  }
  ReferrerPolicy referrer_policy() const { return referrer_policy_; }
  bool did_set_referrer_policy() const { return did_set_referrer_policy_; }
  bool report_only() const { return report_only_; }
  const std::vector<std::string>& report_endpoints() const {
    return report_endpoints_;
  }
  bool has_location_src() const { return location_src_ != NULL; }

  // Used to copy plugin-types into a plugin document in a nested
  // browsing context.
  bool has_plugin_types() const { return !!plugin_types_; }
  const std::string& PluginTypesText() const;

 private:
  bool ParseDirective(const char* begin, const char* end, std::string* name,
                      std::string* value);
  void ParseReportURI(const std::string& name, const std::string& value);
  void ParsePluginTypes(const std::string& name, const std::string& value);
  void ParseReflectedXSS(const std::string& name, const std::string& value);
  void ParseReferrer(const std::string& name, const std::string& value);
  std::string ParseSuboriginName(const std::string& policy);
  void AddDirective(const std::string& name, const std::string& value);
  void ApplySandboxPolicy(const std::string& name,
                          const std::string& sandbox_policy);
  void ApplySuboriginPolicy(const std::string& name,
                            const std::string& suborigin_policy);
  void EnforceStrictMixedContentChecking(const std::string& name,
                                         const std::string& value);
  void EnableInsecureRequestsUpgrade(const std::string& name,
                                     const std::string& value);

  void SetCSPDirective(const std::string& name, const std::string& value,
                       scoped_ptr<SourceListDirective>*);
  void SetCSPDirective(const std::string& name, const std::string& value,
                       scoped_ptr<MediaListDirective>*);

  SourceListDirective* OperativeDirective(SourceListDirective* directive) const;
  SourceListDirective* OperativeDirective(
      SourceListDirective*, SourceListDirective* directive_override) const;
  void ReportViolation(const std::string& directive_text,
                       const std::string& effective_directive,
                       const std::string& console_message,
                       const GURL& blocked_url) const;
  void ReportViolationWithLocation(const std::string& directive_text,
                                   const std::string& effective_directive,
                                   const std::string& console_message,
                                   const GURL& blocked_url,
                                   const std::string& context_url,
                                   int context_line) const;

  bool CheckEval(SourceListDirective* directive) const;
  bool CheckInline(SourceListDirective* directive) const;
  bool CheckNonce(SourceListDirective* directive,
                  const std::string& nonce) const;
  bool CheckHash(SourceListDirective* directive,
                 const HashValue& hash_value) const;
  bool CheckSource(SourceListDirective* directive, const GURL& url,
                   ContentSecurityPolicy::RedirectStatus redirect_status) const;
  bool CheckMediaType(MediaListDirective* directive, const std::string& type,
                      const std::string& type_attribute) const;

  void set_eval_disabled_error_message(const std::string& error_message) {
    eval_disabled_error_message_ = error_message;
  }

  bool CheckEvalAndReportViolation(SourceListDirective* directive,
                                   const std::string& console_message) const;
  bool CheckInlineAndReportViolation(SourceListDirective* directive,
                                     const std::string& console_message,
                                     const std::string& context_url,
                                     int context_line, bool is_script,
                                     const std::string& hash_value) const;

  bool CheckSourceAndReportViolation(
      SourceListDirective* directive, const GURL& url,
      const std::string& effective_directive,
      ContentSecurityPolicy::RedirectStatus redirect_status) const;
  bool CheckMediaTypeAndReportViolation(
      MediaListDirective* directive, const std::string& type,
      const std::string& type_attribute,
      const std::string& console_message) const;

  bool deny_if_enforcing_policy() const { return report_only_; }

  ContentSecurityPolicy* policy_;

  std::string header_;
  HeaderType header_type_;
  HeaderSource header_source_;

  bool report_only_;
  bool has_sandbox_policy_;
  bool has_suborigin_policy_;
  ReflectedXSSDisposition reflected_xss_disposition_;

  bool did_set_referrer_policy_;
  ReferrerPolicy referrer_policy_;

  bool strict_mixed_content_checking_enforced_;

  bool upgrade_insecure_requests_;

  scoped_ptr<MediaListDirective> plugin_types_;
  scoped_ptr<SourceListDirective> base_uri_;
  scoped_ptr<SourceListDirective> child_src_;
  scoped_ptr<SourceListDirective> connect_src_;
  scoped_ptr<SourceListDirective> default_src_;
  scoped_ptr<SourceListDirective> font_src_;
  scoped_ptr<SourceListDirective> form_action_;
  scoped_ptr<SourceListDirective> frame_ancestors_;
  scoped_ptr<SourceListDirective> frame_src_;
  scoped_ptr<SourceListDirective> img_src_;
  scoped_ptr<SourceListDirective> location_src_;
  scoped_ptr<SourceListDirective> media_src_;
  scoped_ptr<SourceListDirective> manifest_src_;
  scoped_ptr<SourceListDirective> object_src_;
  scoped_ptr<SourceListDirective> script_src_;
  scoped_ptr<SourceListDirective> style_src_;

  std::vector<std::string> report_endpoints_;

  std::string eval_disabled_error_message_;
};
}  // namespace csp
}  // namespace cobalt

#endif  // COBALT_CSP_DIRECTIVE_LIST_H_
