Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sundowndev
GitHub Repository: sundowndev/phoneinfoga
Path: blob/master/web/client/src/components/GoogleSearch.vue
994 views
<template>
  <div v-if="loading || data.social_media.length > 0">
    <hr />
    <h3>
      {{ name }}
      <b-spinner v-if="loading" type="grow"></b-spinner>
    </h3>

    <b-button
      size="sm"
      variant="dark"
      v-b-toggle.googlesearch-collapse
      v-show="data.social_media.length > 0 && !loading"
      >Toggle results</b-button
    >

    <b-collapse id="googlesearch-collapse" class="mt-2">
      <div class="my-3">
        <h4>
          General footprints
          <small>
            <b-button
              variant="outline-primary"
              size="sm"
              v-on:click="openLinks(data.general)"
              >Open all links</b-button
            >
          </small>
        </h4>

        <b-list-group>
          <b-list-group-item
            :href="value.url"
            target="blank"
            v-for="(value, i) in data.general"
            v-bind:key="i"
            >{{ value.dork }}</b-list-group-item
          >
        </b-list-group>
      </div>

      <div class="my-3">
        <h4>
          Social networks footprints
          <small>
            <b-button
              variant="outline-primary"
              size="sm"
              v-on:click="openLinks(data.social_media)"
              >Open all links</b-button
            >
          </small>
        </h4>

        <b-list-group>
          <b-list-group-item
            :href="value.url"
            target="blank"
            v-for="(value, i) in data.social_media"
            v-bind:key="i"
            >{{ value.dork }}</b-list-group-item
          >
        </b-list-group>
      </div>

      <div class="my-3">
        <h4>
          Individual footprints
          <small>
            <b-button
              variant="outline-primary"
              size="sm"
              v-on:click="openLinks(data.individuals)"
              >Open all links</b-button
            >
          </small>
        </h4>

        <b-list-group>
          <b-list-group-item
            :href="value.url"
            target="blank"
            v-for="(value, i) in data.individuals"
            v-bind:key="i"
            >{{ value.dork }}</b-list-group-item
          >
        </b-list-group>
      </div>

      <div class="my-3">
        <h4>
          Reputation footprints
          <small>
            <b-button
              variant="outline-primary"
              size="sm"
              v-on:click="openLinks(data.reputation)"
              >Open all links</b-button
            >
          </small>
        </h4>

        <b-list-group>
          <b-list-group-item
            :href="value.url"
            target="blank"
            v-for="(value, i) in data.reputation"
            v-bind:key="i"
            >{{ value.dork }}</b-list-group-item
          >
        </b-list-group>
      </div>

      <div class="my-3">
        <h4>
          Temporary number providers footprints
          <small>
            <b-button
              variant="outline-primary"
              size="sm"
              v-on:click="openLinks(data.disposable_providers)"
              >Open all links</b-button
            >
          </small>
        </h4>

        <b-list-group>
          <b-list-group-item
            :href="value.url"
            target="blank"
            v-for="(value, i) in data.disposable_providers"
            v-bind:key="i"
            >{{ value.dork }}</b-list-group-item
          >
        </b-list-group>
      </div>
    </b-collapse>
  </div>
</template>

<script lang="ts">
import { Component, Vue, Prop } from "vue-property-decorator";
import axios from "axios";
import { mapMutations } from "vuex";
import config from "@/config";
import { ScanResponse } from "@/views/Scan.vue";

interface GoogleSearchScanResponse {
  social_media: GoogleSearchDork[];
  disposable_providers: GoogleSearchDork[];
  reputation: GoogleSearchDork[];
  individuals: GoogleSearchDork[];
  general: GoogleSearchDork[];
}

interface GoogleSearchDork {
  number: string;
  dork: string;
  url: string;
}

@Component
export default class GoogleSearch extends Vue {
  id = "googlesearch";
  name = "Google search";
  data: GoogleSearchScanResponse = {
    social_media: [],
    disposable_providers: [],
    reputation: [],
    individuals: [],
    general: [],
  };
  loading = false;
  computed = {
    ...mapMutations(["pushError"]),
  };

  @Prop() scan!: Vue;

  mounted(): void {
    this.scan.$on("scan", async () => {
      this.loading = true;

      try {
        await this.run();
      } catch (e) {
        this.$store.commit("pushError", { message: `${this.name}: ${e}` });
      }

      this.loading = false;
      this.scan.$emit("finished");
    });
    this.scan.$on("clear", this.clear);
  }

  private clear() {
    this.data = {
      social_media: [],
      disposable_providers: [],
      reputation: [],
      individuals: [],
      general: [],
    };
  }

  private async run(): Promise<void> {
    const res: ScanResponse<GoogleSearchScanResponse> = await axios.get(
      `${config.apiUrl}/numbers/${this.$store.state.number}/scan/${this.id}`,
      {
        validateStatus: () => true,
      }
    );

    if (!res.data.success && res.data.error) {
      throw res.data.error;
    }

    this.data = res.data.result;
  }

  openLinks(dork: GoogleSearchDork[]): void {
    for (const result of dork) {
      window.open(result.url, "_blank");
    }
  }
}
</script>