blob: d08b4906c030681b13db28eace9966362945f3a0 [file] [log] [blame]
<template>
<v-app>
<v-toolbar
color="#354649"
dark
app
fixed
clipped-left
>
<v-toolbar-side-icon
class="hidden-lg-and-up"
@click="drawer = !drawer"
></v-toolbar-side-icon>
<img class="logo" src="@/assets/logo.svg"/>
<v-toolbar-title class="white--text headline font-weight-light">Linux Kernel CVEs</v-toolbar-title>
<v-spacer></v-spacer>
<v-toolbar-items>
<v-autocomplete
label="Search by CVE ID"
color="white"
dense
hide-no-data
append-icon="search"
:items="cves"
v-model="cve"
@change="gotoCVE()"
>
</v-autocomplete>
</v-toolbar-items>
</v-toolbar>
<v-navigation-drawer
v-model="drawer"
clipped
absolute
app
>
<v-list>
<v-list-tile
to="/"
>
<v-list-tile-title>Home</v-list-tile-title>
</v-list-tile>
<v-list-group>
<template slot="activator">
<v-list-tile>
<v-list-tile-content>
<v-list-tile-title>Stream Reports</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
</template>
<v-list-group sub-group>
<template slot="activator">
<v-list-tile>
<v-list-tile-content>
<v-list-tile-title>Supported Streams</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
</template>
<v-list-tile
v-for="stream in supportedStreams"
:key="stream"
:to="'/streams/' + stream"
>
<v-list-tile-action>
<v-icon color="primary">$vuetify.icons.stream-icon</v-icon>
</v-list-tile-action>
<v-list-tile-content>
<v-list-tile-title>Stream {{ stream }}</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
</v-list-group>
<v-list-group sub-group>
<template slot="activator">
<v-list-tile>
<v-list-tile-content>
<v-list-tile-title>EOL Streams</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
</template>
<v-list-tile
v-for="stream in eolStreams"
:key="stream"
:to="'/streams/' + stream"
>
<v-list-tile-content>
<v-list-tile-title>Stream {{ stream }}</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
</v-list-group>
</v-list-group>
<v-list-tile
to="/cves"
>
<v-list-tile-title>All CVEs in Index</v-list-tile-title>
</v-list-tile>
<v-list-group>
<template slot="activator">
<v-list-tile>
<v-list-tile-content>
<v-list-tile-title>Linux Distro Security Pages</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
</template>
<v-list-tile><a target="_blank" href="https://security.archlinux.org">Arch Linux</a></v-list-tile>
<v-list-tile><a target="_blank" href="https://www.debian.org/security/">Debian</a></v-list-tile>
<v-list-tile><a target="_blank" href="https://www.gentoo.org/support/security/">Gentoo</a></v-list-tile>
<v-list-tile><a target="_blank" href="https://access.redhat.com/security/">Red Hat</a></v-list-tile>
<v-list-tile><a target="_blank" href="https://www.suse.com/support/security/">SUSE</a></v-list-tile>
<v-list-tile><a target="_blank" href="https://www.ubuntu.com/security/">Ubuntu</a></v-list-tile>
</v-list-group>
</v-list>
<v-divider></v-divider>
<div class="support">
<h3>Want to support this project?</h3>
<p>Infrastructure costs money. Donate to keep this page updating.</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_donations" />
<input type="hidden" name="business" value="linuxkernelcves@gmail.com" />
<input type="hidden" name="currency_code" value="USD" />
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" title="PayPal - The safer, easier way to pay online!" alt="Donate with PayPal button" />
<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1" />
</form>
<v-btn class="contact-us" dark large color="#354649" href="mailto:linuxkernelcves@gmail.com">contact us</v-btn>
</div>
</v-navigation-drawer>
<v-content>
<v-container fluid>
<router-view/>
</v-container>
</v-content>
</v-app>
</template>
<script>
import axios from 'axios'
export default {
name: 'App',
data () {
return {
stream: 'default',
cves: [],
filteredOptions: [],
cve: '',
eolStreams: [],
supportedStreams: [],
errors: [],
drawer: true
}
},
created () {
axios.get(this.$apiBaseUrl + 'kern.json')
.then(response => {
var eolStreams = response.data.eol_streams
var supportedStreams = response.data.supp_streams
this.supportedStreams = supportedStreams.map( a => a.split('.').map( n => +n+1000 ).join('.') ).sort()
.map( a => a.split('.').map( n => +n-1000 ).join('.') )
this.eolStreams = eolStreams.map( a => a.split('.').map( n => +n+1000 ).join('.') ).sort()
.map( a => a.split('.').map( n => +n-1000 ).join('.') )
})
.catch(e => {
this.errors.push(e)
})
var cvesUrl = this.$apiBaseUrl + 'data/kernel_cves.json'
axios.get(cvesUrl)
.then(response => {
// JSON responses are automatically parsed.
this.cves = Object.keys(response.data)
})
.catch(e => {
this.errors.push(e)
})
},
methods: {
gotoCVE () {
this.$router.push('/cves/' + this.cve.toUpperCase().trim(), () => {
// TODO: make this reset more reliably
this.$nextTick(() => {
this.cve = ''
})
})
},
}
}
</script>
<style>
</style>
<style scoped>
.logo {
margin-left: 10px;
width: 40px;
height: 40px;
}
.support {
margin: 10px;
margin-bottom: 25px;
}
.support h3, .support p, .support form {
padding: 5px;
}
.contact-us {
margin-top: 25px;
}
.page {
max-width: 885px;
}
</style>