def clairvoyance( wordlist: List[str], config: graphql.Config, input_schema: Dict[str, Any] = None, input_document: str = None, ) -> Dict[str, Any]: if not input_schema: root_typenames = fetch_root_typenames(config) schema = graphql.Schema( queryType=root_typenames["queryType"], mutationType=root_typenames["mutationType"], subscriptionType=root_typenames["subscriptionType"], ) else: schema = graphql.Schema(schema=input_schema) typename = probe_typename(input_document, config) logging.debug(f"__typename = {typename}") valid_mutation_fields = probe_valid_fields(wordlist, config, input_document) logging.debug(f"{typename}.fields = {valid_mutation_fields}") for field_name in valid_mutation_fields: typeref = probe_field_type(field_name, config, input_document) field = graphql.Field(field_name, typeref) if field.type.name not in ["Int", "Float", "String", "Boolean", "ID"]: arg_names = probe_args(field.name, wordlist, config, input_document) logging.debug(f"{typename}.{field_name}.args = {arg_names}") for arg_name in arg_names: arg_typeref = probe_arg_typeref(field.name, arg_name, config, input_document) if not arg_typeref: logging.warning( f'Skip argument {arg_name} because TypeRef equals {arg_typeref}' ) continue arg = graphql.InputValue(arg_name, arg_typeref) field.args.append(arg) schema.add_type(arg.type.name, "INPUT_OBJECT") else: logging.debug( f"Skip probe_args() for '{field.name}' of type '{field.type.name}'" ) schema.types[typename].fields.append(field) schema.add_type(field.type.name, "OBJECT") return schema.to_json()
def setUp(self): with open("tests/data/schema.json", "r") as f: schema_json = json.load(f) self.schema = graphql.Schema(schema=schema_json)
with args.wordlist as f: wordlist = [w.strip() for w in f.readlines() if w.strip()] input_schema = None if args.input: with args.input as f: input_schema = json.load(f) input_document = args.document if args.document else None ignore = {"Int", "Float", "String", "Boolean", "ID"} while True: schema = oracle.clairvoyance( wordlist, config, input_schema=input_schema, input_document=input_document ) if args.output: with open(args.output, "w") as f: f.write(schema) else: print(schema) input_schema = json.loads(schema) s = graphql.Schema(schema=input_schema) next = s.get_type_without_fields(ignore) ignore.add(next) if next: input_document = s.convert_path_to_document(s.get_path_from_root(next)) else: break